egs5のお遊び日記

egs5でできること( ..)φメモメモ

egs5を使う上で役立ちそうなことを紹介しています!

egs5でシミュレーション解析状況を知る方法

 

本記事の紹介

本記事は、放射線輸送計算コードegs5の公式より配布されている『ucnaicgv』のシミュレーション中において、シミュレーションの解析状況を表示するようにしたときのものです。(egs5公式はこちら

egs5シミュレーションにおいて、計算回数(ncases)を何億回にするなど、大きな数にすると、何時間もシミュレーションをし続けることになります。この間、デフォルトの『ucnaicgv』のシミュレーションでは、進捗度はわからないため、いつシミュレーションが終わるのかわかりません。

今回、その問題を解決するためにプログラムを改造し、下の図のようにテキストファイルにシミュレーションの解析状況を表示させるようにしました。

f:id:denkigakusei:20220117191744p:plain

シミュレーション解析状況

前準備と環境

・egs5が動作する環境があれば大丈夫です。

・OSはwindows10です。

・今回使用しているコンパイラはgfortranです。g77は試してないのでわかりませんが、可能だと思います。(できなかったらご指摘ください。)

 

手順1

以下のようにucnaicgvシミュレーションが動作する環境を作成してください。

『ucnaicgv.f』内のプログラムを書き換えていきます。

f:id:denkigakusei:20220107115023p:plain

コマンドプロンプトの画面

f:id:denkigakusei:20220107115145p:plain

フォルダと作成されたファイル

手順2

作成したテキストファイルに項目を表示するため、STEP8のdo文の前に

      write(0,*) 'シミュレーション解析状況'
      write(0,*) '    進捗度  ','  計算回数  ','  時,分,秒,ミリ秒' 

と入力します。

f:id:denkigakusei:20220117191900p:plain

 

手順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

f:id:denkigakusei:20220117192046p:plain

コンパイラによっては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,'秒')

と入力します。

f:id:denkigakusei:20220117192449p:plain

手順5

手順1~4で使用した変数(bin,times,value)の定義と初期化をします。

①binは整数,valueは整数配列とするため、STEP1のintegerのntypeの後に

,bin,value(8)

と入力します。

f:id:denkigakusei:20220107140649p:plain

 

②timesは文字配列とするため、STEP1のcharacter*24 medarr(MXMED)の後に

      character*10 times(3)

と入力します。

f:id:denkigakusei:20220107141255p:plain

 

③binの初期化のため、STEP7の最後に

      bin = 0

と入力します。

f:id:denkigakusei:20220107141447p:plain

 

実行結果の見方

実行最初に、ucnaicgv.fがあるフォルダに『シミュレーション解析状況.txt』というテキストファイルが作成されます。

シミュレーション実行中に、進捗度が1%上がるごとに更新されます。

更新されたときの進捗度(シミュレーションが何%完了したか)、計算回数(ncases)、時間(下の図では、19時16分45.414秒)を知ることができます。

補足ですが、1%と2%の時間から100%になる、つまりシミュレーションが完了するまで時間を計算することができます。(ここでは出力していません。)

f:id:denkigakusei:20220117192156p:plain

最後にシミュレーションにかかった時間が出力されます。

f:id:denkigakusei:20220117192302p:plain

補足

①bin = bin + 1の1の値を変更することで、更新頻度を変更できます。

例:bin = bin + 5のとき

f:id:denkigakusei:20220117192809p:plain

※少数にするときは、定義を変更する必要があります。

 

②if (ncount/(ncases/100) .gt. bin) thenをif (ncount*100/ncases .gt. bin) thenとしていないのは、ncasesが億など大きいときにncount*100がintegerの値の範囲を超えてしまうことを考慮してです。

 

③デフォルトのプログラムのシミュレーション時間はegs5job.outによると

f:id:denkigakusei:20220117193143p:plain

7.7188秒であったため、プログラム変更によるシミュレーション時間の影響は小さいかほぼないと考えられます。