#Fortranのデバッグ
fortranのコンパイラは、有償の製品もあればgfortranのように自由に使えるものもある。どのコンパイラも、デバッグオプションを付けてコンパイルすれば、デバッガ(時には専用のデバッガが提供されていたりする。)でバグ取りができる。
gfortranの場合、コンパイル時に-gオプションを付けると、gdbでデバッグが可能になる。私はvimを使っているので、次の画像のようなデバッグ環境で使っている。
testappというプログラムをデバッグする場合、vimでソースコードを開いた状態で:packadd termdebug としておけば、 :Termdebug testapp とすればこのような画面になる。画像の上段はgdbのコンソール入出力、中段はプログラムの標準出力、下段はソースコードとなっている。gvimを使う場合は、ポップアップウィンドウで変数の値を見ることができる。これらの機能を使うには、Ubuntuであればaptでインストールしたvimで実行可能。Windowsは良くわかりませんが、CygwinやSubsystemなんちゃらLinuxでできるのではないでしょうか?
Emac派の人は、昔からエディタ上でデバッグできたはず。
##gdbで条件付きブレークポイント
デバッガは、止める行を指定するだけではない。条件を付けて止めることができる。
例えば、「i==3の時だけ止めて!」といった指定ができる。もちろんfortranでも可能だ。例えば、
cond 1 i.eq.3
などとすると、識別番号1のブレークポイントでi==3の時に止まる。
##printデバッグ
計算時間が短いうちや、変数が少ない間は良いが、計算時間が長くなったり、配列の要素が膨大になってくると実用的では無い。そんなときは、上記の条件付ブレークポイントを設定して必要な変数を書き出すようにすれば良い。とはいえ、気軽に試せるのでprintデバッグは多用してしまう。
subroutine hoge(x,y)
double precision :: x,y
y=x*2d0
print*,x,y !変数を見たい場所でコンソールに書き出す
x=y/3d0
print*,x,y
end subroutine
#デバッグが終わったら
gitやsubversionで管理して、修正したバグの具体的な内容をメモ。こうすると、半年や一年後くらいに見直しても、バグが取れた時期を正確に管理できる。その他、autotoolsやCmakeで自作テストプログラムを登録しておけば、 make && make check などで自動的にテストプログラムを実行できる。ちなみに、fortranでもautotoolやCMake使えます。なので、好きなだけコードを書いて、それを静的または動的ライブラリにしておく事が比較的簡単にできます。
#ソースコードの説明書もソースコードに埋め込む
Doxygenを使えば、fortranのコメントをそのままPDFやhtmlの説明書に変換できる。
!>@brief Doxygenのサンプルです
subroutine doxygensample(hoge,fuga)
implicit none
real,dimension(:),intent(in) :: hoge !<インプット配列
real,dimension(:),intent(out) :: fuga !<計算結果の出力
fuga(1:size(hoge))=sin(hoge)
end subroutine
LaTeXのような形式で数式も記入できるので、仕上がりの説明書にはきれいな数式が表示されます。
快適なFortranライフを。