目的
本記事では、snappyHexMesh + OpenFOAM v8 の組み合わせでの風洞数値実験を行うことを目的としています。
分量の関係から、前編(メッシュ生成)、後編(CFDの実行)に分けて解説していきます。
データの準備
Wing data
解析対象の3次元データを用意する必要があります。
今回はここからF1_2019_Rear_Wing.stpというデータをダウンロードし、解析にかけることにしました。
FreeCADで読み込み__obj__形式で出力しておきます。
OpenFOAM case data
snappyHexMeshを使ったTutorial caseを以下のようにして作業ディレクトリに持ってきます。
cp $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike ~/rearWing
ここではホームディレクトリにrearWingというディレクトリ名でコピーしています。
objファイルのデータ変換
ダウンロードしたobjファイルをconstantディレクトリ下に置きます:
~/rearWing/constant/triSurface/
今回のobjファイルはミリメーター単位で描かれていたため、メーター単位に変換します:
surfaceConvert -scale 0.001 rearWing.obj rearWing2.obj
特徴線の抽出
次いで、形状データの特徴線の抽出を行います。
そのためには__surfaceFeatures__ユーティリティを使用しますが、その設定ファイルを作業ディレクトリに持ってくる必要があります。
foamGet surfaceFeaturesDict
これで、__surfaceFeaturesDict__ファイルがsystemフォルダ下にコピーされます。
surfaces ("rearWing2.obj");
// Identify a feature when angle between faces < includedAngle
includedAngle 150;
subsetFeatures
{
// Keep nonManifold edges (edges with >2 connected faces)
nonManifoldEdges no;
// Keep open edges (edges with 1 connected face)
openEdges yes;
}
ここで重要なパラメータはincludedAngleになります。どの程度の値が良いのかは各形状データに依存します。
surfaceFeatures
なお,他ページをみるとsurfaceFeatureExtract
という異なるユーティリティがありますが,これは古いユーティリティになるようで,of8以降はsurfaceFeatures
に移行していく模様です。
これで**.eMesh**ファイルがconstant/triSurface/
以下に作成されます。同ファイルはParaviewで直接開くことができないので、ここを参考に
surfaceFeatureConvert rearWing2.eMesh features.obj
のようにobjファイルに変換する必要があります。
Meshing
bockMesh
上図のようにblockを作成し、風洞空間(解析の系)を用意する必要があります。
そこで、surfaceCheckユーティリティを利用し、objファイルのサイズ(座標)を確認します。
surfaceCheck rearWing.obj -blockMesh > blockData
Statistics:
Triangles : 62704
Vertices : 31348
Bounding Box : (-0.519 -0.109139 -0.000233722) (0.519 0.693148 0.67)
// blockMeshDict info
vertices
(
(-0.519 -0.109139 -0.000233722)
(0.519 -0.109139 -0.000233722)
(0.519 0.693148 -0.000233722)
(-0.519 0.693148 -0.000233722)
(-0.519 -0.109139 0.67)
(0.519 -0.109139 0.67)
(0.519 0.693148 0.67)
(-0.519 0.693148 0.67)
);
この座標データを参考にblockMeshDictを編集します。今回は、以下のようにverticesを修正しました。
vertices
(
(-3.519 -10.109139 -2.000233722)
(3.519 -10.109139 -2.000233722)
(3.519 6.693148 -2.000233722)
(-3.519 6.693148 -2.000233722)
(-3.519 -10.109139 2.87)
(3.519 -10.109139 2.87)
(3.519 6.693148 2.87)
(-3.519 6.693148 2.87)
);
snappyHexMesh
次いで、__snappyHexMesh__を実行するのですが、元あるsnappyHexMeshDictのファイル(古いバージョンの入力ファイル。v8でも問題なく動く)を使うのではなく、新たにv8の設定ファイルを持ってくることにします。書式が若干変わっています。
foamGet snappyHexMeshDict
設定は多岐にわたっており、全てを言及するのが(分量的に)困難なため、ここでは、修正ポイントのみを説明します。
geometry
{
rearWing
{
type triSurfaceMesh;
file "rearWing.obj";
}
};
features
(
{ file "rearWing.eMesh"; level 6; }
);
refinementSurfaces
{
rearWing
{
level (5 6);
patchInfo { type wall; }
}
}
refinementRegions
{
rearWing
{
mode inside;
levels ((1E15 6));
}
}
layers
{
rearWing
{
nSurfaceLayers 3;
}
}
上記のサンプルではウィングモデルを__rearWing__と名付けています。修正箇所は、デフォルトで入っているモデル名を、この__rearWing__に変更すれば良いです(境界層メッシュ等の設定はここでは言及しません)。
ここまでできれば、あとは__snappyHexMesh__を実行すればよいのですが、メッシュ生成にそれなりに時間を要するため、並列処理(decomposePar)を行うことにします。snappyHexMeshDictの時と同様に、
foamGet decomposeParDict
で設定ファイルを持ってきます。種々の分割方法が用意されていますが、ここでは__scotch__を使用することにします。
numberOfSubdomains 4;
method scotch;
その後、領域分割を行い、snappyHexMeshを並列で実行します。
decomposePar
foamJob -p snappyHexMesh
reconstructParMesh
heckMeshをしてfalseがなければ、メッシュ作成はこれで完了です。
お疲れさまでした!! (メッシュが粗い、品質が良くない、というのはご容赦ください・・・)
まとめ
メッシュ生成から解析までの流れを一つの記事でまとめるつもりでいましたが、記事が長くなりましたので、解析は後編というかたちでまとめたいと思います。
実際、メッシュ生成といっても、今回はほぼデフォルトのままですので、snappyHexMeshの細かな設定(レイヤーやメッシュの細かさなど)は操作できずにいます。そのあたりは改めて確認したいと思っています。
私はこれまで商用メッシャーばかりを使ってきていて、オープンソースのメッシャーがどこまで切れるのか知りませんでした。思いの外、切れるなというのが今回の感想になります。