gtool_history の使い方ガイド

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               ! 熱拡散係数

  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 の使い方については こちらのドキュメントを参照してください.


使われているサブルーチンの説明

例題のプログラムにおいて追加された gtool_history モジュール サブルーチンが行っていることを大まかに説明します. より詳しい説明は レファレンスマニュアルを参照してください(まだない).

use gtool_history

モジュールの使用を宣言します. Fortran90 メインプログラムの先頭にいれましょう.

CALL HistoryCreate(...)

gtool4 データ出力の初期設定を行います. 各引数の意味は次のとおりです.

CALL HistoryAddVariable(...)

出力する変数を定義します. 各引数の意味は次のとおりです.

CALL HistoryPut('temp',temp)

定義した変数を出力します. 第一引数(varname)が出力する変数名です. あらかじめ HistoryAddVariable で定義されているか, HistoryCreate により次元変数として定義されている必要があります. 第二引数(array)が出力する値が格納されている配列です.

CALL HistoryClose

終了処理を行います. プログラムの最後にいれましょう.


次のステップ--属性(attribute)をつける

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 つのファイルに全て値と属性の出力を行いました. しかしながら複数のファイルへ出力することもできます. こちらのサンプルプログラムを 参照してみてください.


Fortran77 から使うには

上で示した例は Fortran90 で書かれたものです. しかしながら Fortran77 で書かれたプログラムに対しては これまで示したようなやり方では gtool_history モジュールを使うことが できません.

このために, Fortran77 用のインターフェースが別途用意してあります. Fortan90 用のインターフェースと比較して次のような制限があります.

使う際には, 対応する Fortran90 サブルーチンとは 引数が異なっていることに注意してください. こちらのサンプルプログラムを 参考にしてください. 各サブルーチンの詳しいドキュメントは こちらを参照してください.


gtool_history サンプルプログラムへ.
gtool4 ドキュメントへ.
gtool4 Top pageへ.
地球流体電脳倶楽部 davis プロジェクト
davis-ml(at)gfd-dennou.org

2001/02/28 更新 (by 竹広真一)