2003 年 8 月 21 日 地球流体電脳倶楽部
gtool_history モジュールは, 数値モデルの結果を gtool4 形式で出力するためのインターフェースです. おもに時間積分の結果を等時間間隔で出力することを念頭においてます. このモジュールを用いれば, Fortran90 で書かれたプログラムの 計算結果を gtool4 データ形式で出力することが簡単に実現できます.
以下では簡単なプログラムを例に, gtool_history モジュールの使い方を説明します.
このプログラム は 1 次元の熱伝導問題を解くものです. 出力結果は write 文で行われているだけです. これに対して gtool_history を適用したのが以下のプログラムです. 赤字(カラーがでない場合はボールド)が 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               ! 熱拡散係数
  tinit = 0.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=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 という名前で保存し, 実際にコンパイルして実行してみましょう. gtool4 が正しくインストールされている場合には
$ gt4frt diffusion_1.f90
として実行ファイルを a.out を作成することができます. そこで,
$ a.out
と実行させると, diffusion_1.nc という gtool4 データ形式のファイルが作成されます. NetCDF のコマンド ncdump を用いて中身を見てみましょう.
$ ncdump diffusion_1.nc | more
とすると, 変数の値だけでなく様々な情報が付加されている様子を見ることができます.
描画は gtview コマンドを用いて簡単に行えます.
$ gtview diffusion_1.nc
とすると, 時間--空間面上での温度の変化の様子が以下のように表示されます.

% gtview diffusion_1.nc@temp,t=0.01
とすると, 時刻 0.01 での温度分布が以下のように表示されます.

より詳しい gtview の使い方については リファレンスマニュアルを参照してください.