ゼロから始める FreeCAD (4/4) Xsim で作成したファイル群を OpenFORM等 で処理してみる
さて、いよいよ最終段階。思い通りの結果が得られるかどうかお楽しみ。
今回は、openFOAM に引き渡す形状やコントロール情報のファイル群について、FreeCAD を用いて形状を作成、さらにFreeCADを用いて境界条件の異なる境界を分割、ファイルに保存しました。これはその下流の Xsim を利用するための準備です。Xsim では、形状d-ターニ含まれる面の複数の集合について、それぞれのメッシュ生成に必要な情報や、計算用の境界条件の情報を、ここの面事に生成し、その結果を zip ファイルにしてダウンロードできました。
現時点で、ちょっと面倒な、control.dec や 時間 0 フォルダー、メッシュ作成のための meshblock.dic も生成してくれています。
control.dic
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location “system”;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application icoFoam;
tartFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
writeInterval 20;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************** //
メッシュ情報は。つぎの通り。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
vertices
(
(-11200.0 -1100.0 -2775.0)
(12200.0 -1100.0 -2775.0)
(12200.0 100.00000000000074 -2775.0)
(-11200.0 100.00000000000074 -2775.0)
(-11200.0 -1100.0 3525.0)
(12200.0 -1100.0 3525.0)
(12200.0 100.00000000000074 3525.0)
(-11200.0 100.00000000000074 3525.0)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (90 5 25) simpleGrading (1 1 1)
);
edges ();
patches ();
mergePatchPairs ();
うーん。もううまくいってるのかどうかはわかりません。
吐き出されたシェルプログラムは以下の通り。思い通りに操作するには、この記述の解明から始めればよいでしょう。
#!/bin/sh
cd ${0%/*} || exit 1
. $WM_PROJECT_DIR/bin/tools/RunFunctions
show_help() {
echo “Usage: Allrun [OPTIONS]”
echo “options:”
echo ” -m, –onlyMesh make only meshes”
echo ” -h, –help print the usage”
echo “”
exit 1
}
get_num_labels() ( set -f; set — $1; echo $# )
monitor() {
local solverPID=$1
local logFile=$2
while [ ! -f $logFile ]; do
sleep 1
done
sleep 3
# Note that the numLabels includes “#”
local labels
labels=$(grep -E ‘^#’ $logFile | tail -1)
if [ “x$labels” = “x” ]; then
labels=”# Step”
fi
local numLabels=$(get_num_labels “$labels”)
local numColumn=$(tail -1 $logFile | awk ‘{ print NF}’)
local i=0
while [ “$numLabels” -le “$numColumn” ]; do
i=$(expr $i + 1)
labels=”$labels data$i”
numLabels=$(get_num_labels “$labels”)
done
local xAxisLabel=$(echo $labels | cut -d ” ” -f2)
labels=$(echo $labels | cut -d ” ” -f3-)
local gnuplotFile=$(mktemp)
echo “set term x11 1 font \”helvetica,17\” linewidth 1.5 persist noraise” > $gnuplotFile
echo “set logscale y” >> $gnuplotFile
echo “set title \”Residuals\”” >> $gnuplotFile
echo “set xlabel \”$xAxisLabel\”” >> $gnuplotFile
echo “plot \\” >> $gnuplotFile
local field
local line
i=1
for field in $labels; do
i=$(expr $i + 1)
line=”\”$logFile\” using 1:${i} with lines title \”$field\””
if [ $i -lt $numColumn ]; then
line=”$line, \\”
fi
echo $line >> $gnuplotFile
done
echo “pause 1” >> $gnuplotFile
echo “reread” >> $gnuplotFile
touch $logFile
gnuplot $gnuplotFile &
local gnuplotPID=$!
while ps -p $solverPID > /dev/null; do
sleep 1
done
sleep 5
kill -9 $gnuplotPID
rm $gnuplotFile
}
optionOld=$OPTIND
OPTIND=1
onlyMesh=0
while getopts “hm-:” opt; do
case “$opt” in
-)
case “${OPTARG}” in
help) show_help;;
onlyMesh) onlyMesh=true;;
esac ;;
m) onlyMesh=true;;
h) show_help;;
esac
done
shift $((OPTIND-1))
OPTIND=$optionOld
runApplication blockMesh
runApplication surfaceFeatureExtract
runApplication snappyHexMesh -overwrite
if [ “$onlyMesh” = true ] ; then
exit 0
fi
residualsFile=”postProcessing/residuals(U,p,k,epsilon)/0/residuals.dat”
if [ -f $residualsFile ] ; then
rm -f $residualsFile
fi
if [ -n “$DISPLAY” ] && [ -x “$(command -v gnuplot)” ]; then
runApplication $(getApplication) &
monitor $! $residualsFile
else
runApplication $(getApplication)
fi
さて、とりあえず実行してみましょう。
老人には、過去にちょっと昔に調べて実行したくらいでは、プロ氏ジャーが忘却の彼方です。至るところにメモをはっつけておかないといけないので不便ですよね。
-
- OpenFOAM 環境内(Linux)で作業するために、linuxコンソールを開く。
- ワークディレクトリィにコツコツと移動する。(cd , ped, ls -al, などを活用)
- ワークディレクトリィ内の Allrun スクリプトを実行する。
- 同ディレクトリィ内に空の paraview 用のファイル x.foem ファイルを作成しておく。
- x.form を開く動作で paraView を起動させるか、paraView を起動した後、x.form を読み込み apply ボタンを押せばよい。
- ParaView から x.form を読み込むときは、「file」「open」でファイルタイプをすべてにして、x.form で表示して選択。その後のウインドウで、OpenFOAM 形式を選択すればよい。
ParaView でモデルが表示されれば、Xsim のモデリングがうまくいってたかどうかが確認できます。ちなみにパネル抜けなどがあった場合は、流体が漏れてるということで、たぶん、Xsim で設定された長方形領域全体で計算されてしまうようです。邪推ですが、閉じた境界条件で内部流れかどうかを判断してるあたりが、Xsim は絶妙です。
パネルに不備(パネル抜けで領域が閉じてない)があった場合。
ここでは詳細図は示しませんが、上図からうかがえるように境界壁面あたりが指定通り細かく分割されたメッシュになっています。
計算条件の善し悪しなどはありますが、最後まで計算が行われていれば、正しいかどうかは別としてそれなりの何かが得られています。これは素晴らしいことです。モデリングの不備で時間をとられるよりも、計算条件で悩む方が有意義ですから。
paraVIEW で、「Surface with Edge」を選んでやれば、パネルの様子が確認できます。
物理量(P, U, K, epsiron,…)を切り替えてやれば、それぞれの値がコンターで示されます。
圧力分布を見れば速度場はだいたい予想できますが、速度ベクトルがほしい場合は、地球儀みたいなアイコン、流線がほしい場合は、円柱周りの流れっぽいアイコン、を選択してください。ちなみに、流線の表記は、解像度(resolution)の数値を30~100位の荒いものにしておく方が、描画速度もですが、見やすさがほどよいと思います。apply のボタンが有効になってたら、クリックして反映させてください。
まぁ詳細は、ParaVIEW のほうで表示方法を説明追記しておきますが、流速をコンターで表して、それに流線(流速トレース)した図を重ねた結果が以下の通り。長方形空間に、左上の排気口から吸引したとき、その直ぐしたの開放口と、反対側の開放口とのどちらから流入して室内の流れがどうなるか、を計算した結果です。
計算方法、スキームの中の設定、いろいろ細かな問題点はあるかもしれませんが、FreeCAD から、 Xsim をつかって入力ファイルを作って、OpenFOAM で計算して、その結果を ParaVIEW で表示させるところまでは、それほど難しくない、というお話でした。
付録
- FreeCAD で複雑な形状モデルを作成するとき
通常のCAD でも、一気に複雑なスケッチから臼だしをすることはあまりよくないようです。それは、第一に、スケッチの信頼性による修正許容度が低下するためと思います。
3D CAD の使い方については、授業の際にでも担当の教員に教えてもらってください。
FreeCAD もまた、複数のオブジェクトに分けてモデリングをしていくことになります。本学の授業で使用している CAD では、オブジェクト(フィーチャー)は、拙速した時点でマージされていきます。個別のパーツは、パーツとしてまとめられて、複数のパーツでアセンブルによって機械を構成していくイメージです。
しかし、FreeCAD では、どうも生成したオブジェクトは、意図的に結合する必要があるようです。この結合(あるいは一体化)を行わないと、形状を stl にエキスポートしたときに、オブジェクトの形状の境目部分にも表面が残ってしまうようです。少なくとも、接した状態で作成すると、面が残ります。従って、ワークベンチ part の ブーリアン演算 で和集合にしておかないといけないようです。
あと、元のモデルを変更しても、サーフェイスを切り抜いた後流作業には反映されないよう?もう一度、同じ作業をしないといけないように思います。そうであれば、ちょっとモデル変更、ってなると、XSim への引き渡しは結構面倒です。CAD としてそんなはずがないように思うので、ワンタッチで反映させるボタンあるいは設定があるかもしれません。
OpenCAD で、二次元流れを計算しようとすると、それなりの大きさの領域に、極薄のモデルを作成したくなります。メッシュ分割の事情か、ザクッと何も考えなければ、薄い側壁サーフェイスがうまくメッシュ分割できないのか、blockmesh 等分割後は、pataVIEW で確認すると立方体が出てきます。しかもメッシュが切れていないようでした。
それで厚みをつけると、きちんと平板状のメッシュが切れたモデルが作成されたようで、厚さ方向には 5メッシュくらいで表示されます。しかし、円柱がありません。計算も始まりません。