知識の箱

主に気象を研究する上で得た知識と、WEBページ作成のために得た知識を記録しています。

fortranデバッグにプリプロセッサー

プリプロセッサーを使うと、fortranプログラムのデバッグが楽になる。

デバッグの際には、通常write文などでプログラムの挙動を把握するが、このデバッグ用のコマンドは、通常デバッグが終われば必要なくなる。

この作業を簡単にするのがプリプロセッサーで、intel fortranの場合、拡張子がf90である場合にプリプロセッサーを適用される。

例えば、test.f90というプログラムが、


program test
implicite none

#ifdef debug
write(6,*) ‘test debug print’
#endif

stop
end program test

であった場合、


> ifort -fpp -Ddebug test.f90

としてコンパイルするとすると、

#ifdef debug ~ #endif の間が、コンパイラによって解釈され、そこにあるwrite文が取り込まれる。fppはFortran 言語プリプロセッサ。-cppでもよい。

一方、単に、

> ifort test.f90

とコンパイルすると、

#ifdef debug ~ #endif の間はコンパイラによって無視される。

また、fppを用いて、#ifdef~#endifの部分を消したプログラムを作成することもできる。


> fpp -P test.f90 test2.f90

とコンパイルすると、test2.f90のファイルの中身は、


program test
implicite none

stop
end program test

となる。

※-Pを取ると#ifdef~#endifの部分に行番号が入る。

一方、

> fpp -P -Ddebug test.f90 test2.f90

として、コンパイルすると、test2.f90は次のようになる。


program test
implicite none

write(6,*) ‘test debug print’

stop
end program test

またプリプロセッサに特定の値を渡すこともできる.


program test2
implicit none

#if debug==1
write(6,*) ‘debug is 1’
#endif
#if debug==2
write(6,*) ‘debug is 2’
#endif

stop
end program test2

のプログラムを、

> ifort -fpp -Ddebug=1 test2.f90

として実行すると上の#if文(debug==1)が、debugに2を指定すれば下の#if文(debug==2)がコンパイラによって解釈される。

※参考

北大海洋気候物理研究室 Fortran90 Tips
http://www.sci.hokudai.ac.jp/grp/poc/top/old/software/other/fortran_tips/#SEC34

fppマニュアルページ:
ftp://ftp.sovintel.ru/pub/software/Solaris/stuff/SunStudio-12/sparc/install-sparc-S2/packages-sparc-S2/SPJAmrftn/reloc/SUNWspro/prod/lib/locale/ja/html/mr/man1/fpp.1.html