egs5でシミュレーション解析状況を知る方法
本記事の紹介
本記事は、放射線輸送計算コードegs5の公式より配布されている『ucnaicgv』のシミュレーション中において、シミュレーションの解析状況を表示するようにしたときのものです。(egs5公式はこちら)
egs5シミュレーションにおいて、計算回数(ncases)を何億回にするなど、大きな数にすると、何時間もシミュレーションをし続けることになります。この間、デフォルトの『ucnaicgv』のシミュレーションでは、進捗度はわからないため、いつシミュレーションが終わるのかわかりません。
今回、その問題を解決するためにプログラムを改造し、下の図のようにテキストファイルにシミュレーションの解析状況を表示させるようにしました。
前準備と環境
・egs5が動作する環境があれば大丈夫です。
・OSはwindows10です。
・今回使用しているコンパイラはgfortranです。g77は試してないのでわかりませんが、可能だと思います。(できなかったらご指摘ください。)
手順1
以下のようにucnaicgvシミュレーションが動作する環境を作成してください。
『ucnaicgv.f』内のプログラムを書き換えていきます。
手順2
作成したテキストファイルに項目を表示するため、STEP8のdo文の前に
write(0,*) 'シミュレーション解析状況'
write(0,*) ' 進捗度 ',' 計算回数 ',' 時,分,秒,ミリ秒'
と入力します。
手順3
手順2で作成した項目の内容を表示するためSTEP8のdo文の中のncount = ncount + 1の後に
if (ncount/(ncases/100) .gt. bin) then
call date_and_time(times(0), times(1), times(2),value)
write(0,*) ncount/(ncases/100),'%',ncount,' ',times(1)
call flush(0)
bin = bin + 1
end if
※コンパイラによってはtimesの変数でエラーが発生することがあります。このときの対処として、
call date_and_time(times(0), times(1), times(2),value)を
call date_and_time(times(1), times(2), times(3),value)に変更
また、
write(0,*) ncount/(ncases/100),'%',ncount,' ',times(1)を
write(0,*) ncount/(ncases/100),'%',ncount,' ',times(2)に変更してみてください。
手順4
シミュレーションに要した時間を出力するために、STEP8の最後付近に
write(0,299) cputime
299 format('シミュレーション時間',G15.5,'秒')
と入力します。
手順5
手順1~4で使用した変数(bin,times,value)の定義と初期化をします。
①binは整数,valueは整数配列とするため、STEP1のintegerのntypeの後に
,bin,value(8)
と入力します。
②timesは文字配列とするため、STEP1のcharacter*24 medarr(MXMED)の後に
character*10 times(3)
と入力します。
③binの初期化のため、STEP7の最後に
bin = 0
と入力します。
実行結果の見方
実行最初に、ucnaicgv.fがあるフォルダに『シミュレーション解析状況.txt』というテキストファイルが作成されます。
シミュレーション実行中に、進捗度が1%上がるごとに更新されます。
更新されたときの進捗度(シミュレーションが何%完了したか)、計算回数(ncases)、時間(下の図では、19時16分45.414秒)を知ることができます。
補足ですが、1%と2%の時間から100%になる、つまりシミュレーションが完了するまで時間を計算することができます。(ここでは出力していません。)
最後にシミュレーションにかかった時間が出力されます。
補足
①bin = bin + 1の1の値を変更することで、更新頻度を変更できます。
例:bin = bin + 5のとき
※少数にするときは、定義を変更する必要があります。
②if (ncount/(ncases/100) .gt. bin) thenをif (ncount*100/ncases .gt. bin) thenとしていないのは、ncasesが億など大きいときにncount*100がintegerの値の範囲を超えてしまうことを考慮してです。
③デフォルトのプログラムのシミュレーション時間はegs5job.outによると
7.7188秒であったため、プログラム変更によるシミュレーション時間の影響は小さいかほぼないと考えられます。