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 $@</p> <p>install: ${TARGET}
cp -f ${TARGET} ${INSTALLDIR}/lib
cp -f ${MODULES} ${INSTALLDIR}/include</p> <p>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