f03gl

2007年6月30日

fortran g95 Mac OpenGL

t f B! P L


FortranからOpenGLを使って描画できると、数値計算の可視化に便利である。

f03glは、Fortran 2003の新機能であるC言語との相互運用性を使って書かれている。Fortranから使えるOpenGLのラッパとしては、f90glがある。f90glでは、コンパイラ依存部分に個別対応しているが、f03glはFortran 2003の機能を利用しているのでコンパイラ依存性はない(はず)。

f03glをMac OS Xでコンパイルするときの留意点について述べる。f03glは、Makefileを手で編集するスタイルとなっている。不親切ではあるが、それだけシンプルであるとも言える。

Mac OS Xでは、OpenGLやGLUTはframeworkとしてOSにプレインストールされている (/System/Library/Frameworks/にある)。Frameworkはヘッダとライブラリをひとまとめにしたものである。コンパイラ オプションは、

-framework OpenGL -framework GLUT -framework Foundation 
とする。ヘッダファイルを使うときは、「framework名/ヘッダ.h」とするので、「GL/gl.h」ではなく「OpenGL/gl.h」と なる。このようにしてコンパイルすると、ネイティブのAquaなアプリケーションができる。メニューもついている。コンパイルするだけで、Mac OS Xのアプリケーションできるのは素晴らしい。

ここではFortranコンパイラとして、g95を使った。g95は拡張子でFortranの規格を判別する。f03glのFortranソースコードの拡張子はf90なので、Fortran 2003を使うことを陽に指定する。

blenderはエラーになる。OpenGL_glut.f90で、GLUT_STROKE_ROMANのPROTECTED属性が指定を外すとコンパイルが通る。

! Font variables in GLUT_fonts.c
!TYPE(C_PTR), BIND(C), PUBLIC, PROTECTED :: GLUT_STROKE_ROMAN, &
TYPE(C_PTR), BIND(C), PUBLIC :: GLUT_STROKE_ROMAN, &
modview.f90とplotfunc.f90では、subroutineにbind(c)が指定されている。g95では、 bind(c,name=”")は通らないので、bind(c)に変更する。(最新のg95ではこの問題は修正されているようである。)また、 plotfuncではmenu_handlerという名前が重複している。一方を別の名前に変更すればよい。

変更したMakefileを示す。
F90GLUTLIB := -framework OpenGL -framework GLUT
X11LIB := -framework Foundation
INSTALLDIR = ${HOME}/local
FC := g95
FFLAGS := $(DEBUG) -std=f2003 -DOPENGL
CC := cc
CFLAGS := ${F90GLUTLIB}
GLUT := glut
LIBRARIES := ${OGLLIBDIR} ${X11LIBDIR} -L.
LIBS := ${F90GLUTLIB} ${X11LIB} -lf03gl
OBJS = GLUT_fonts.o OpenGL_${GLUT}.o OpenGL_glu.o OpenGL_gl.o
MODULES = opengl_gl.mod opengl_glu.mod opengl_glut.mod opengl_kinds.mod
TESTS = sphere stars blender scube modview plotfunc
TARGET = libf03gl.a
all: ${TARGET}

${TARGET}: ${OBJS}
ar cru $@ $^
ranlib $@

install: ${TARGET}
cp -f ${TARGET} ${INSTALLDIR}/lib
cp -f ${MODULES} ${INSTALLDIR}/include

test: ${TESTS}
clean:
\rm *.o *.mod ${TESTS} ${TARGET}
%.o: %.f90
${FC} ${FFLAGS} -c $< ${TESTS} : %: %.f90 ${OBJS} force ${FC} ${FFLAGS} -c $< ${FC} $@.o ${LIBRARIES} ${LIBS} -o $@ ./$@ force: OpenGL_${GLUT}.o OpenGL_glu.o: OpenGL_gl.o

f03glを使ったFortranソースをコンパイルするためのスクリプト。glg95などという名前で保存し、実行許可を与えて、コマンドのサーチパスの通っているところに置く。
#/bin/sh
f03gldir=${HOME}/local
g95 -I${f03gldir}/include -L/${f03gldir}/lib $@ -framework OpenGL -framework GLUT -framework Foundation -lf03gl

このブログを検索

ブログ アーカイブ

Translate

QooQ