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.f90plotfunc.f90では、subroutinebind(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