プログラムの実行中にさまざまなメッセージを標準出力に出力したい場合があ ります. しかし, write 文を用いて読みやすい出力を行うためには, 書式指定 を工夫する必要があります. さらに変数値を含む文字列を出力したい場合には, 文字列の連結操作や型変換を行うなどの処理が必要となり面倒です.
gt4f90io にはメッセージ出力を行うサブルーチンを提供するモジュール dc_message が用意 されています. このモジュールに含まれる MessageNotify サブルーチンを用いると, メッセージ出力を簡単に行うことができます.
例として, Fortran 90/95 汎用モジュール: (1) 種別型パラメタの提供 で用いたサンプルプログラムにメッセージ出力 を加えたプログラムを示します (ソースコードはこちら). ここでは変数 sigma の値に応じて三種類のメッセージを出力させます. 赤字(カラーがでない場合はボールド)が dc_messege に関係している箇所です.
!= Sample program for gt4_history/gt4f90io ! ! * 2007/06/25 M.Odaka ! * 2006/10/25 Y.Morikawa ! * 2003/08/21 M.Odaka ! * 2001/02/27 S.Takehiro ! ! Solving diffusion equation ! \[ ! du/dt = \kappa d^2 u/dx^2 ! \] ! for giving values of $u$ at $x=[0,1]$. ! program diffusion_4 use gt4_history ! モジュール指定 use dc_types, only : DP ! モジュール指定 use dc_message, only : MessageNotify ! モジュール指定 integer, parameter :: nx=30 ! グリッド数 integer, parameter :: nt=200 ! 時間ステップ数 integer, parameter :: ndisp=10 ! 出力間隔 real(DP), parameter :: dx=1.0/(nx-1) ! グリッド間隔 real(DP), parameter :: dt=0.0005 ! 時間間隔 real(DP), dimension(nx):: x=(/(dx*(i-1),i=1,nx)/) ! 座標変数 real(DP), dimension(nx):: temp ! 温度 real(DP), parameter :: kappa=1.0 ! 熱拡散係数 real(DP) :: sigma ! 計算安定条件パラメタ tinit = 0.0 ! 初期時刻設定 sigma = kappa*dt/dx**2.0d0 if ( sigma >= 0.5d0 ) then call MessageNotify( "E", & ! エラーメッセージ出力 & "diffusion_4", & & "dt is too large: k*dt/(dx)^2 = %f", & & d=(/sigma/) ) else if ( sigma >= 0.4d0 ) then call MessageNotify( "W", & ! 警告メッセージ出力 & "diffusion_4", & & "dt is moderately large: k*dt/(dx)^2 = %f", & & d=(/sigma/) ) else call MessageNotify( "M", & ! メッセージ出力 & "diffusion_4", & & "dt is sufficiently small: k*dt/(dx)^2 = %f", & & d=(/sigma/) ) end if temp = exp(-((x-0.5)/0.1)**2) ! 初期値設定 call HistoryCreate( & ! ヒストリー作成 & file='diffusion_4.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 HistoryAddAttr('temp','gt_graph_tick_all',1) call HistoryAddAttr('temp','gt_graph_contour_spacing',(/0.0,1.0,0.01/)) call HistoryAddAttr('temp','+gt_user_davis_kappa',kappa) 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(it,ndisp) == 0 ) then call HistoryPut('temp',temp) ! 変数出力 endif enddo call HistoryClose stop end program diffusion_4
このプログラムを実行すると, 以下のようなメッセージが追加されるようになります.
\*** WARNING [diffusion_3] *** dt is moderately large: k*dt/(dx)^2 = 0.4205000231056476
上記のプログラムにおいて追加された dc_message モジュール サブルーチン が行っていることを大まかに説明します. より詳しい説明は リファレンスマニュアル を参照してください.