gtool_history モジュールは, 数値モデルの結果を gtool4 形式で 出力するためのインターフェースです. おもに時間積分の結果を等時間間隔で出力することを念頭においてます. このモジュールを用いれば, Fortran90 で書かれたプログラムの 計算結果を gtool4 データ形式で出力することが 簡単に実現できます. 以下では簡単なプログラムを例に, gtool_history モジュールの使い方を 説明します.
! Sample program for gtool_history/gtool4
!
! Solving diffusion equation
! du/dt = d^2 u/dx^2
! for giving values of u at x=0 and 1.
!
program diffusion
use gtool_history ! モジュール指定
integer, parameter :: nx=30 ! グリッド数
integer, parameter :: nt=200 ! 時間ステップ数
integer, parameter :: ndisp=10 ! 出力間隔
double precision, parameter :: dx=1.0/(nx-1) ! グリッド間隔
double precision, parameter :: dt=0.0005 ! 時間間隔
double precision, dimension(nx) :: x=(/(dx*(i-1),i=1,nx)/) ! 座標変数
double precision, dimension(nx) :: temp ! 温度
double precision, parameter :: kappa=1.0 ! 熱拡散係数
temp = exp(-((x-0.5)/0.1)**2) ! 初期値設定
call HistoryCreate( & ! ヒストリー作成
file='diffusion.nc', title='Diffusion equation', &
source='Sample program of gtool_history/gtool4', &
institution='GFD_Dennou Club davis project', &
dims=(/'x','t'/), dimsizes=(/nx,0/), &
longnames=(/'X-coordinate','time '/), &
units=(/'m','s'/), &
origin=0.0, interval=real(ndisp*dt) )
call HistoryPut('x',x) ! 次元変数出力
call HistoryAddVariable( & ! 変数定義
varname='temp', dims=(/'x','t'/), &
longname='temperature', units='K', xtype='double')
call HistoryPut('temp',temp) ! 変数出力
do it=1,nt
temp(2:nx-1) = temp(2:nx-1) & ! 時間積分
+kappa*(temp(3:nx)-2*temp(2:nx-1)+temp(1:nx-2))/dx**2*dt
if ( mod(nt,ndisp) .eq. 0 ) then
call HistoryPut('temp',temp) ! 変数出力
endif
enddo
call HistoryClose
stop
end program diffusion
このプログラムを diffusion.f90 という名前で保存し,
実際にコンパイルして実行してみましょう.
コンパイルの仕方は環境によって異なります. 例えば Linux 上の Futjitsu
Fortran95 コンパイラの場合には
% frt -Am -I/usr/local/lib/modules -L/usr/local/lib -lgtool4 diffusion.f90といった具合です . a.out という実行ファイルができますので
% a.outと実行させると, diffusion.nc という gtool4 データ形式のファイルが作成されます. NetCDF のコマンド ncdump を用いて中身を見てみましょう.
% ncdump diffusion.nc | moreとすると, 変数の値だけでなく様々な情報が付加されている様子を見ることが できます.
描画は gtview コマンドを用いて簡単に行えます.
% gtview diffusion.ncとすると, 時間--空間面上での温度の変化の様子が表示されます.
% gtview diffusion.nc@temp,t=1とすると, 時刻 1 での温度分布が表示されます.
より詳しい gtview の使い方については こちらのドキュメントを参照してください.
gtool4 では変数に属性をつけて情報を記録することができます. 記録するには
call HistoryAddAttr(varname, attrname, value)
を呼ぶだけでできます. 第 1 引数が, 属性をつける変数名,
第 2 引数が属性名, 第 3 引数が属性の値です.
属性の型と次元は任意です. 文字型, 整数, 実数, 倍精度あるいは
それらの配列でも属性として記録することができます.
内部で自動的に判定されて出力されます.
例えば温度の等値線間隔のデフォルト値を与えるには
call HistoryAddAttr('temp','gt_graph_contour_spacing',(/0.0,1.0,0.01/))
とすれば良いです.
出力ファイル全体に対する属性
(NetCDF でいうところの大域属性, global attribute)を
指定するには, 属性名の先頭に'+' をつけて, 適当な変数に対して
出力することになります.
call HistoryAddAttr('temp','+gt_user_davis_kappa',kappa)
属性をつける変数として 'temp' としているにもかかわらず
属性名に '+' がついてますので,
ファイルには大域属性として出力されることになります.
そのような処理を施したプログラム例を こちらに示します.
ここで示した例では 1 つのファイルに全て値と属性の出力を行いました. しかしながら複数のファイルへ出力することもできます. こちらのサンプルプログラムを 参照してみてください.
上で示した例は Fortran90 で書かれたものです. しかしながら Fortran77 で書かれたプログラムに対しては これまで示したようなやり方では gtool_history モジュールを使うことが できません.
このために, Fortran77 用のインターフェースが別途用意してあります. Fortan90 用のインターフェースと比較して次のような制限があります.
使う際には, 対応する Fortran90 サブルーチンとは 引数が異なっていることに注意してください. こちらのサンプルプログラムを 参考にしてください. 各サブルーチンの詳しいドキュメントは こちらを参照してください.