2004 年 3 月 18 日 地球流体電脳倶楽部
gt4_history モジュールは, 数値モデルの結果を gtool4 形式で出力するためのインターフェースです. おもに時間積分の結果を等時間間隔で出力することを念頭においてます. このモジュールを用いれば, Fortran90 で書かれたプログラムの 計算結果を gtool4 データ形式で出力することが簡単に実現できます.
以下では簡単なプログラムを例に, gt4_history モジュールの使い方を説明します.
このプログラム は 1 次元の熱伝導問題を解くものです. 出力結果は write 文で行われているだけです. これに対して gt4_history を適用したのが以下のプログラムです. 赤字(カラーがでない場合はボールド)が gt4_history に関係している箇所です.
! Sample program for gt4_history/gt4f90io
!
! Solving diffusion equation
! du/dt = d^2 u/dx^2
! for giving values of u at x=0 and 1.
!
program diffusion
use gt4_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 ! 熱拡散係数
tinit = 0.0 ! 初期時刻設定
temp = exp(-((x-0.5)/0.1)**2) ! 初期値設定
call HistoryCreate( & ! ヒストリー作成
file='diffusion.nc', title='Diffusion equation', &
source='Sample program of gt4_history/gt4f90io', &
institution='GFD_Dennou Club davis project', &
dims=(/'x','t'/), dimsizes=(/nx,0/), &
longnames=(/'X-coordinate','time '/), &
units=(/'m','s'/), &
origin=real(tinit), interval=real(ndisp*dt) )
call HistoryPut('x',x) ! 次元変数出力
call HistoryAddVariable( & ! 変数定義
varname='temp', dims=(/'x','t'/), &
longname='temperature', units='K', xtype='double')
call HistoryPut('t',real(tinit)) ! 時刻出力
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('t',real(it*dt)) ! 時刻出力
call HistoryPut('temp',temp) ! 変数出力
endif
enddo
call HistoryClose
stop
end program diffusion
このプログラムを diffusion_1.f90 という名前で保存し, 実際にコンパイルして実行してみましょう.
赤字の場所は, 自分の環境に応じて適宜変更して下さい.
$ ifc -I/usr/local/gt4f90io/include -O -Qoption,ld,-Bdynamic -Vaxlib -w diffusion_1.f90 \
-L/usr/local/gt4f90io/lib -lgt4f90io -L/usr/local/lib -lnetcdf
赤字の場所は, 自分の環境に応じて適宜変更して下さい.
$ frt -I/usr/local/gt4f90io/include -Am diffusion_1.f90 \
-L/usr/local/gt4f90io/lib -lgt4f90io -L/usr/local/lib -lnetcdf
すると, 実行ファイルを a.out が作成されます. そこで,
$ ./a.out
と実行させると, diffusion_1.nc という gtool4 データ形式のファイルが作成されます. NetCDF のコマンド ncdump を用いて中身を見てみましょう.
$ ncdump diffusion_1.nc | more
とすると, 変数の値だけでなく様々な情報が付加されている様子を見ることができます.
描画は, 電脳 Ruby プロジェクト 製品の GAVE や GPhys で行なうことができます.
利用法など詳しいことはそちらのページを参照して下さい.