3 DEXCS ワークベンチ / ランチャー化へ向けての取り組み
まずは、残差プロットの仕組みを、 CfdOF ワークベンチを切り離して使えないものかを調べてみた。メッ
シュ作成からケースセットアップまでは、現行の DEXCS ランチャーで実施できているという前提である。
3.1 残差プロット 1
DEXCS ランチャーにおける[plotWatcher の起動 ] (残差プロット表示)は、 runPlotWatcher.py で、
PyFoam の pyFoamPlotWatcher.py を起動できるようにしたものであった (94 〜 109 行目 ) 。
94: cont = "#!/bin/bash\n"
95: cont = cont + ". " + envOpenFOAMFix + "\n"
96: cont = cont + ’echo -n "running plotWatcher"\n’
97: cont = cont + "pyFoamPlotWatcher.py " + logFile + " 1> /dev/null 2> /dev/null\n"
98: f = open("plotWatcher", "w")
99: f.write(cont)
100: f.close()
101: os.system("chmod a+x plotWatcher")
102: title = solveCaseFix
103: if len(title) > 30:
104: title = "_..." + title[-30:]
105: title = "plotWatcher:" + title
106: #comm = "gnome-terminal --name=" + title + " --geometry=80x2 --hide-menubar -x bash --rcfil
107: comm = "gnome-terminal --name=" + title + " --geometry=80x2 --hide-menubar -- bash --rcfile
108: os.system(comm)
109: 9os.chdir(saveDir)
この部分を以下のように書き換えた。
156:
#print(logFile)
157:
158: UxResiduals = []
159: UyResiduals = []
160: UzResiduals = []
161: pResiduals = []
162: rhoResiduals = []
163: EResiduals = []
164: kResiduals = []
165: omegaResiduals = []
166: niter = 0
167: itimer=1
168:
169: residualPlot = ResidualPlot()
170:
171: #Timer.setInterval(2000)
172: #Timer.timeout.connect(_plotResidual(logFile, niter))
173: #Timer.start()
174: #while itimer:
175: _plotResidual(logFile, niter)
176: #sleep(2)
177: #_plotResidual(logFile, niter)
178: #sleep(2)
179: #_plotResidual(logFile, niter)
180: #sleep(2)
169 行目で、 ResidualPlot() を呼び出しているが、この段階では CfdOF モジュールとのは考えていないので、
便宜的に CfdOF モジュール中の、 CfdResidualPlot.py と同じ内容で、 dexcsCfdResidualPlot.py を用意し
て、 12 行目
from dexcsCfdResidualPlot import ResidualPlot
で使えるようにした。また、 175 行目 plotResidual(logFile, niter) の実体は、
113: def _plotResidual(logFile, niter):
114: print("log=",logFile)
115: f=open(modelDir+"/"+logFile)
116: loglines = f.readlines()
117: #f.close()
118: process_output(loglines, niter)
119: residualPlot.updateResiduals
logFile を読み込んで、その内容を process output(loglines, niter) に渡して、 residualPlot.updateResiduals
(プロット図をアップデート)しようとするもので、 CfdRunnableFoam.py 中のそれを真似して作成したもの
である。 process output(loglines, niter) も、 CfdOF モジュールとの連携を考えていないので、
66: def process_output(text, niter):
67: itimer = 0
68: for line in text:
69: #print(line),
70: split = line.split()
71:
72: # Only store the first residual per timestep
73: if line.startswith(u"Time = "):
74: niter += 1
75:
76: # print split
77: if "Ux," in split and niter-1 > len(UxResiduals):
78: UxResiduals.append(float(split[7].split(’,’)[0]))
79: if "Uy," in split and niter-1 > len(UyResiduals):
80: ... 以下省略 ...
と、 CfdOF モジュールの CfdRunnableFoam.py 中の 102 行目 def process output(self,text) の内容をほと
んどそのまま流用した。 CfdOF オリジナルからの変更点として、引数として niter を加えてあるが、これは
イタレーション回数を見ながら自動更新処理を出来ないかと工夫の名残りである。また、 171 行目〜 180 行目
でコメントアウトした行も、同じ目的で試行錯誤したもので、現時点で自動更新処理は出来ていないので、こ
れらの部分は不要である。
以上の改変にて、残差プロットは CfdOF と同じものを表示できるようになった(見栄えは良くなった!)。
但し、上記説明の中で記したように、計算の開始直後にこれを起動して、計算の進行とともに自動更新処理を
させようと試みたが、実現できていない。
ここで一旦、自動更新の試みを断念して、次節では別のアプローチで残差グラフ表示に取り組むこととする
が、その前に本節の取り組みで判ったことを記しておく。
判明項目17
CfdOF の残差プロットは、計算実行時の標準出力をモニターしているのに対して、今回試みたのは、
実行ログファイルの内容を読み直す方法であり、これでは無理っぽい。
判明項目18
PyFoam の plotWatcher.py はログファイルを監視しつつ更新している(多分、読み直したりはしてい
ない)ので、その方法に習えば、実現できる可能性もあるので、改めて調査予定。
判明項目19
DEXCS ランチャーで、 postProcessing フォルダ中に出力されるデータをプロットするのに、 JGNPlot
を使っているが、 CfdResidualPlot.py を参考に Plot ワークベンチで代用することはできるかもしれな
いので、これも改めて調査予定。