「目的」
回転座標系の運動を扱うSRFPimpleFoamのチュートリアルではメッシュが円柱状になっています。
ところがこの円柱状のメッシュにsnappを効かせると以下のように板がまともな形状になりません。snappyHexMeshDictを調べ、いろいろ試したのでが改善されませんでした。
そこでアプローチを変えて通常の立方体メッシュでSRFpimplefoamが使えるものを作成してみようと思います。

「方針」
通常のblockMesh(下図)から回転運動系解析に対応出来るメッシュを作成してみます。具体的にはsanppyのaddLayer機能を用いて円周外側に規則正しい層を生成することで円柱状メッシュに近い形を目指してみます。
尚「snappyHexMeshDict」は名称が長いので以降「snappy」と記述します。
1.準備するSTLモデル
今回検討するモデルはOpenFoamを用いた遠心ポンプの流体解析にて用いた4枚インペラ遠心ポンプとしました。

blockMeshDictによって生成するベースを以下に示します。
・ベース寸法:300×300×20mm(45×45×4マス)

このベース形状に対し以下の基本形状をSTLファイルで用意し、snapしていきます
・hub.stl:中央部に半径25mmの吸入孔を設定
・impera.stl:4枚板のインペラを設定
・inspect.stl:半径75mmの検査面を設定
・freestream.stl:外周を表現する半径125mmの中抜き円柱を設定

2.snappyファイル構造
snappyは設定項目が多いため、すべてを本稿で網羅することは止めておきます。本稿ではチュートリアルのsnappyを基本構造とし、そこから修正する構文のみを示すこととします
尚基本構造に選んだsnappy構文は以下のチュートリアルを用いました(選定は適当)。
<OpenFOAM-v2306\tutorials\incompressible\pisoFoam\LES\motorBike\motorBike\system>
snappyは以下の5部から構成されています(参考文献[1]3.3項)。
第1:geometry部
使用するSTLファイルを定義する。
第2:castellatedMesh部
STLファイル形状の回りのメッシュを細かくし、立方体単位で中身を切り抜く。
第3:snap部
第2部で作成された内面が凸凹のモデルをSTL形状に従って綺麗に切り抜く。
第4:addLayers部
層状のメッシュを追加(必須行為ではなく、多くの場合使用していないようです)。
第5:meshQualityControls部
メッシュの品質設定(本稿では一切変更なしとしました)。
3.実行例
3.1 castellatedMeshのみ実施の場合
snapの様子を明確にするため、まずはcastellatedMeshの場合を行ってみます。
(以後チュートリアルsnappyの基本構文のうち、変更する箇所のみを赤字で示していきます。)
第0:実施項目定義
最初の構文で実施する作業を選びます。ここではcastellatedMesh実施と定義します。
castellatedMesh true;
snap false;
addLayers false;
第1:gemetry部
1項で用意したSTLファイルを以下のように定義します。
geometry {
impera.stl {
type triSurfaceMesh;
name impera; }
hub.stl {
type triSurfaceMesh;
name hub; }
freestream.stl {
type triSurfaceMesh;
name freestream; }
inspect.stl {
type triSurfaceMesh;
name insPect; } }
第2:castellatedMesh部
まずは細分化levels(0 0)で実施してみます。
例えばlevels(1 2)の場合、最小21、最大22で細分化という意味となります。
castellatedMeshControls {
refinementSurfaces {
impera {
level (0 0); <=impera回りの細分化レベル
patchInfo{type wall; } } <=wallは入出力なしの壁として定義
hub {
level (0 0); <=hub回りの細分化レベル
patchInfo{type patch;} } <=patchは入出力ありの境界面として定義
freestream {
level (0 0); <=外周回りの細分化レベル
patchInfo{type patch;} }
insPect { <=検査面の定義。他の面とは扱いが違う。
level (0 0);
faceType baffle;
faceZone insPectZone;
patchInfo{type patch;} } }
refinementRegions { }
locationInMesh ( 0.05 0.05 0.005 ); } <=メッシュ化する内部の代表点を定義
実施した結果のメッシュが以下となります。
用意したSTLに従った形状が出来上がっていますが、凸凹の境界となっています。
(castellated:城のような形状という意味で、凸凹を表現しているそうです。)

3.2 snapを適用した場合
snapを有効にしてみます。
第0:実施項目定義
snap部を有効にします。
castellatedMesh true;
snap true;
addLayers false;
第3:snap部 不変(チュートリアルのまま)
snapControls {
nSmoothPatch 3;
tolerance 4.0;
nSolveIter 30;
nRelaxIter 5; }
実施した結果のメッシュが以下となります。
凸凹だった境界が綺麗に整っています。
(snap:位置合わせという英語のイメージがあるそうです。)

3.3 addLayersを適用した場合
周縁部を層状にするためaddLayersを有効にしてみます。
第0:実施項目定義
addLayers部を有効にします。
castellatedMesh true;
snap true;
addLayers true;
第4:addLayers部(チュートリアルのまま)
addLayersControls {
relativeSizes true;
layers {
“freestream”
{ nSurfaceLayers 5; } }
expansionRatio 1.0;
finalLayerThickness 0.3;
minThickness 0.1;
nGrow 0;
featureAngle 60;
nRelaxIter 3;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 2;
maxFaceThicknessRatio 0.5;
maxThicknessToMedialRatio 0.3;
minMedialAxisAngle 90;
nBufferCellsNoExtrude 0;
nLayerIter 50; }
実施した結果のメッシュが以下となります。
周縁部に層状のメッシュが追加されており、目的が達成出来ました。
この層があればSRFpimplefoamの解析にて発生する螺旋状の流れをよく模擬出来ると考えます。

4.SRFpimplefoam計算例
作成したモデルを用いて遠心ポンプの計算を実施し、OpenFoamを用いた遠心ポンプの流体解析の計算結果と比較してみます。
結果を以下に示します。
ポンプ効率56%と円柱状メッシュ効率62%と若干の差が出てしまいました。主な要因は吐出量の不一致と考えられます。メッシュが複雑に入りこんでいるため総流量が保存されなくなっているようです。このような若干の違いは出てしまいますが、総じて立方メッシュでもSRFPimpleFoamでの解析が可能な状況と考えます
尚本計算ではメッシュをもう少し細かくしたものを用意し、extrudeMeshで2D化しました。snappyの内容を下記※1に示します。
〇今回の計算結果
入力Lin=277.0[W] / 出力Lout=156.0[W] / 効率η=156/277=56%
吸入量 1[㍑/s]、吐出量0.93[㍑/s]

〇OpenFoamを用いた遠心ポンプの流体解析における計算結果
入力Lin=267.7[W] / 出力Lout=165.2[W] / 効率η=165.2/267.7=62%
吸入量 1[㍑/s]、吐出量0.98[㍑/s]

※1:本計算に用いたsnappy構文(基本構文からの変更点のみ示します)
castellatedMesh true;
snap true;
addLayers true;
geometry {
impera.stl {
type triSurfaceMesh;
name impera; }
hub.stl {
type triSurfaceMesh;
name hub; }
freestream.stl {
type triSurfaceMesh;
name freestream; }
inspect.stl {
type triSurfaceMesh;
name insPect; } }
castellatedMeshControls {
refinementSurfaces {
impera {
level (0 0);
patchInfo{type wall; } }
hub {
level (0 0);
patchInfo{type patch; } }
freestream {
level (0 0);
patchInfo{type patch; } }
insPect {
level (0 0);
faceType baffle;
faceZone insPectZone;
patchInfo{type patch; } } }
resolveFeatureAngle 60;
refinementRegions {
impera {
mode distance;
levels ((0.020 1)); }
hub {
mode distance;
levels ((0.050 1)); } }
locationInMesh ( 0.05 0.05 0.005 );
allowFreeStandingZoneFaces false; }
snapControls {
nSmoothPatch 3;
tolerance 6.0;
nSolveIter 30;
nRelaxIter 5; }
addLayersControls {
relativeSizes false;
layers {
“freestream” { nSurfaceLayers 5; } }
expansionRatio 1.1;
finalLayerThickness 0.005;
minThickness 0.001;
nGrow 0;
featureAngle 60;
nRelaxIter 3;
nSmoothSurfaceNormals 1;
nSmoothNormals 3;
nSmoothThickness 2;
maxFaceThicknessRatio 1.0;
maxThicknessToMedialRatio 0.5;
minMedialAxisAngle 80;
nBufferCellsNoExtrude 0;
nLayerIter 50; }
参考文献
[1]OpenFOAMによる熱移動と流れの数値解析第2版 一般社団法人オープンCAE学会編 森北出版
