先の投稿においてAllrun実行後のログデータを取得してデータベース化する際に、多くの手作業工程について取り纏めた。これにより、これらを完全自動化するという観点から、いくつか指針が見えてきて調査もしたので、ここに備忘録として記しておく。
チュートリアルケースと解析フォルダについて
現行のログ解析スクリプトでは、OpenFOAMのケースファイル毎に結果を出力しており、Allrunの実行後において、新たにケースファイルが追加されるなどあった場合に、当該のケースファイルがオリジナルのチュートリアルケースそのものなのか、別の親チュートリアルから派生したものであるかの区別をしていない(できない)。この部分は、ID番号を手作業で変更するなど、一番手間がかかっている部分である。
予めチュートリアルケースの全てのパス名がわかっているという前提に立てば、それぞれのパス名以下に含まれるOpenFOAMのケースファイルが複数あった場合にそれらの積算値を出力するようにすれば、一気に手作業の問題を解決できる。
複数のケースの積算値を算出することは何とかなりそうであるが、どうやってチューリアルケースの全パス名を取得するかは容易でなかった。
全パス名の取得方法について考えてみた
そこで、現行の仕組みの中で全パス名を取得する方法がないかと思案の結果、Allrunスクリプトそのものを改変すれば良いのでないかと思い付いた。
つまり、Allrunスクリプトを実行した時に、チュートリアルケースの実行をする代わりに、パス名を表示して終わり、とすれば良いのでないか?ということである。チュートリアルの実行は、foamRunTutorials というスクリプトで実行しているはずなので、このfoamRunTutorialsを改変すれば良い。具体的には、Allrunスクリプトの116行目に、foamRunTutorials を実行している箇所(ハイライト部分)があるので、これをコメントアウト。
if [ "$optCollect" != true ]
then
printRunHeader "Starting run" | tee log.Allrun
printRunEnviron | tee -a log.Allrun
#foamRunTutorials -self $* # Run recursively but avoid self
./foamPrintTutorials -self $* # Run recursively but avoid self
printRunHeader "Finishing run" | tee -a log.Allrun
fi
代わりに、./foamPrintTutorals としておく。./foamPrintTutorals は、foamRunTutorial をtutorialsフォルダにコピーして名前を変更。152行目あたりから、以下の3箇所(ハイライト部分)を変更した。
# Prefer -serial or -parallel when available?
if [ -n "$runType" ]
then
if [ -f ./"Allrun-${runType}" ]
then
#./"Allrun-${runType}" $passArgs $*
echo "CASE Allrun1 : $PWD"
exit "$?"
fi
fi
if [ -f ./Allrun ]
then
#./Allrun $passArgs $*
echo "CASE Allrun2 : $PWD"
exit "$?"
fi
fi
if [ -d system ]
then
# Run normal case with blockMesh and the application
#runApplication blockMesh
#runApplication $(getApplication)
echo "CASE blockMesh : $PWD"
else
AllrunもしくはblockMeshを実行する代わりに、echo “…. $PWD”として、パス名を出力するということである。
しかる後、
として実行すれば、ほんの数秒で全パス名リストが得られることがわかった。
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/DNS/dnsFoam/boxTurb16
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/IO/dictionary
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/IO/fileHandler
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/IO/systemCall
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/chtMultiRegionFoam/2DImplicitCyclic
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/laplacianFoam/flange
CASE blockMesh : /home/et/Desktop/WP/openfoam/tutorials/basic/laplacianFoam/implicitAMI
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/laplacianFoam/multiWorld1
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/laplacianFoam/multiWorld2
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/overLaplacianDyMFoam/heatTransfer
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/overPotentialFoam/cylinder
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/potentialFoam/cylinder
CASE Allrun2 : /home/et/Desktop/WP/openfoam/tutorials/basic/potentialFoam/pitzDaily
これにて解決?!かと思いきや、ケース数の総数が406(v2112の場合)となり、手作業で作成したもの比べて、わずかにケース数が少なかった(手作業:421)。この原因を調べたところ、たとえばmesh/snappyHexMesh/Allrun があり、
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
#------------------------------------------------------------------------------
( cd flange && ./Allrun $* )
( cd addLayersToFaceZone && ./Allrun )
( cd gap_detection && ./Allrun )
( cd aerofoilNACA0012_directionalRefinement && ./Allrun )
( cd iglooWithFridgesDirectionalRefinement && ./Allrun )
( cd distributedTriSurfaceMesh && ./Allrun )
( cd faceZoneRegions && ./Allrun )
( cd motorBike_leakDetection && ./Allrun )
( cd opposite_walls && ./Allrun )
( cd airfoilWithLayers && ./Allrun )
exit 0
# These cases are links to solver test cases and are run when the Allrun
# scripts of those solvers are run.
# This dummy Allrun script avoids meshing these cases twice.
#------------------------------------------------------------------------------
ひとつのAllrunスクリプトで、当該ケース以下に存在する複数のケースを起動していることが判った。他にも、mesh/foamyHexMesh, multiphase/cavitatingFoam/LES のケースも同様のAllrunスクリプトが存在した。
そこで、これらのAllrunを削除(別名変更)して、AllPrintを実行した。その結果、今度はチュートリアル総数が425となり、手作業に比べて4つ増えるという結果になった。これは、mesh/snappyHexMesh のディレクトリ下に3つ、mesh/foamyHexMesh のディレクトリ下に1つ、併せて4つのシンボリックリンクで定義したケースファイルが存在し、これらもカウントされてしまったのが原因であった。逆に言うと、これらのシンボリックリンクで定義したケースを実行しないようにする為に上述のAllrunを使っていたと見るべきだろう。multiphase/cavitatingFoam/LES のケースのAllrunについてはその存在理由が不明であるが、いずれにせよ以上見てきたように、チュートリアルケースの全リストは簡単に取得できる事が判明した。その手順を、以下取り纏めておく。
- Allrunをコピーして、Allprintとし、foamRuntutorials を実行している箇所を、foamPrintTutorials に変更
- foamRunTutorials をコピーして、foamPrintTutorials に変更し、AllrunまたはblockMesh を実行している箇所をコメントアウトし、echo “CASE: $PWD”を追加する。その際に、シンボリックリンクのケースがあれば、メモしておく。
- mesh/snappyHexMesh, foamyHexMesh, multiphase/cavitatingFoam/LES 下のAllrunを削除(別名変更)
- Allprintを実行(./Allprint | grep CASE: | tee tutorials.csv)
- tutorials.csv を編集、シンボリックリンクケースを削除
チュートリアルケース(フォルダ)単位でのログ解析
これまでは全チュートリアルを実行後のフォルダを対象として、OpenFOAMのケースファイルのログ情報を取得しており、これらをチュートリアルケース毎に取り纏め直す必要があった。
チュートリアルケースの名前が事前にわかっているという前提に立てば、チュートリアルケース(フォルダ)単位で、そこに含まれるOpenFOAMケースファイルのログ情報を全出力すれば良いとなる。つまり、これまでは、
def main():
# ディレクトリを全て表示
print("")
for d in getTutorialsList("."): print(d)
として、4行目のgetTutorialListの引数”.”はカテゴリ毎のフォルダー名を渡すことになるが、これを、以下のように変更した。
def main():
if os.path.isfile(tutList) == True:
f=open(tutList)
fw = open(tutResult,'w')
ID = 0
for line in f.readlines():
print(line)
ID += 1
getFoamCaseList(line,ID,fw)
f.close
fw.close
6行目で、チュートリアルケース毎のループ処理で、9行目の関数getFoamCaseに引数(line:チュートリアルケースのフォルダ構成)を渡している。
getFoamCase()関数は、従来のgetTutorialList()関数と、実質的な処理内容は同じものであるが、引数(ID,fw)を追加したのと、先の記事で記した様々な問題点(後工程で手作業が必要になる箇所が多く存在)を考慮し改変した。具体的な改変項目の要所を以下に記しておく。
- モデル情報の取得
- チュートリアルケース名と、OpenFOAMケース名の分離
- ClockTime代替情報の取得方法
- メッシュ作成情報の出力
- OpenFOAMのバージョン変更に応じた変更箇所のパラメタ化
- 関数名と引数の変更
モデル情報の取得
吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
ピンバック: データベースの一括追加(改訂版) – E.Mogura's OpenFOAM®