↑ページトップへ

snappyHexMeshDict の書式の解説

OpenFOAM 13

OpenFOAMのレポジトリからsnappyHexMeshDictの書式のコメントをまとめて、日本語に翻訳したものです。


/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  13
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/

FoamFile
{
    format      ascii;
    class       dictionary;
    object      snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

// 実行する処理
castellatedMesh true;
snap            true;
addLayers       false;

//オプション:単一領域のサーフェスはサーフェス名のみに基づいてパッチ名が付けられ、
//          複数領域のサーフェスは「サーフェス名_領域名」という形式のパッチ名が付けられる。
//          デフォルトは true。
//singleRegionName false;

//オプション:生成されたすべてのパッチを保持する。
//          デフォルトでは、サイズがゼロのパッチは削除される。
//keepPatches true;

// ジオメトリー。全サーフェスの定義。全サーフェスは surface クラスに属します。
// サーフェスは以下の用途で使用されます。
// - サーフェスと交差するメッシュセルの細分化の指定
// - サーフェスの内部、外部、または近傍にあるメッシュセルの細分化の指定
// - メッシュ境界をサーフェスに「スナップ」させる
geometry
{
    box1x1x1
    {
        type box;
        min (1.5 1 -0.5);
        max (3.5 2 0.5);
    }

    sphere
    {
        type triSurface;
        file "sphere.stl"

        // オプション:交差判定における許容誤差の指定
        // tolerance 1e-5;

        // オプション:八分木の深さ。メモリーの制約がある場合には値を下げる。
        // maxTreeDepth 10;

        // オプション:スケーリング係数(例:単位変換)
        // scale 1;

        // オプション:法線取得時に品質の低い三角形を除外
        // minQuality -1;

        // 各領域(region)に対するパッチ名。指定しない場合、_ となる。
        // 注: この名前は、本辞書ファイルの他の箇所で領域を特定するためには使用できない。
        //     これはあくまでサーフェス(surface)と領域(region)の組み合わせに対する名称であり、
        //     パッチ作成時にのみ使用される。
        regions
        {
            secondSolid
            {
                name mySecondPatch;
            }
        }
    }

    sphere2
    {
        type sphere;
        centre  (1.5 1.5 1.5);
        radius  1.03;
    }
};

// castellatedMesh 処理の設定
castellatedMeshControls
{

    // 細分化パラメーター
    // ~~~~~~~~~~~~~~~~~~~~~

    // いずれかのプロセッサにおいてローカルのセル数が maxLocalCells 以上である場合、
    // 「細分化の後に均等化を行う」手法(現在の方法)から、
    // 「細分化の前に(重み付き)均等化を行う」手法へと切り替える。
    maxLocalCells 100000;

    // 全セル数の上限(概算値)。この数に達すると細分化は直ちに停止するため、
    // 指定レベルでの細分化が完了しない可能性がある。
    // なお、これは keepPoint から「可視」でない部分を除去する前のセル数であることに
    // 注意:実際の最終的なセル数はこれより大幅に少なくなる可能性がある。
    maxGlobalCells 2000000;

    // 表面細分化処理では、ごくわずかなセルを細分化するために多数の反復処理が行われる場合がある。
    // この設定により、細分化対象として選択されたセル数が minRefinementCells 以下である場合、
    // 細分化処理が停止するようになる。ただし、少なくとも1回の反復処理は実行される
    // (細分化対象のセル数が0である場合を除く)。
    minRefinementCells 0;

    // 細分化中のある程度の不均衡を許容する
    // (均等化には多大なコストがかかるため)
    // 完全な均衡状態(全セル数 / プロセス数)に対する割合として指定する。
    // 0の場合は常に均等化を行う。
    maxLoadUnbalance 0.10;

    // 異なる細分化レベル間のバッファ層の数。 
    // 1は通常の2:1の細分化制約を意味し、値が大きいほど細分化が緩やかになります。
    nCellsBetweenLevels 1;


    // 明示的な特徴エッジの細分化
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    // 明示的に指定されたエッジと交差するセルに対して、細分化レベルを指定する。
    // これは featureEdgeMes​​h であり、現在のところ constant/geometry から読み込まれる。
    // refinementRegions 設定の「distance」モードと同様に「levels」を指定する(下記参照)。
    // 従来の指定方法である
    //      level   2;
    // は、以下と同等。 
    //      levels  ((0 2));

    features
    (
        //{
        //    file "someLine.eMesh";
        //    // level 2;
        //    levels ((0.0 2) (1.0 3));
        //}
    );


    // サーフェスに基づく細分化
    // ~~~~~~~~~~~~~~~~~~~~~~~~

    // 各サーフェスに対して2つのレベルを指定する。1つ目は最小レベルであり、
    // サーフェスと交差する全セルがこの最小レベルまで細分化される。
    // 2つ目は最大レベルで、セルが複数の交差を「認識」し、かつそれらの交差が
    // resolveFeatureAngle を超える角度を形成する場合、そのセルは
    // 最大レベルまで細分化される。

    refinementSurfaces
    {
        sphere
        {
            // サーフェスごとの最小、最大の細分化レベル
            level (2 2);

            // 領域ごとのレベル指定(オプション)
            regions
            {
                secondSolid
                {
                    level (3 3);
                }
            }

            // パッチタイプの指定(オプション、デフォルトは wall)。
            // 制約タイプ(cyclic、symmetry など)は指定不可。
            patchInfo
            {
                type patch;
                inGroups (meshedPatches);
            }


            //- オプション:(最大レベルに加える)小さな隙間での増分
            // gapLevelIncrement 2;

            //- オプション:表面に対して垂直な方向から、大小のセルが混在する状況を検出するための角度。
            //  (ローカルな)サーフェス法線に対する面の角度。
            //  平坦(またはそれに近い)な表面でのみ使用すること。
            //  それ以外の場合は指定しないか、負の値を設定すること。
            // perpendicularAngle 10;

            // - オプション:faceZone および(閉じた曲面の場合)cellZone の指定
            // cellZone に含まれるセルの選択方法:
            // (inside / outside / insidePoint)
            // faceZone の向き:
            //  - cellZone がある場合:(最も大きい) cellZone の外側を向く
            //  - 独立してある場合:サーフェスに沿った向き

            // faceZone sphere;
            // cellZone sphere;
            // mode        inside;  // outside/insidePoint

            //- オプション:faceZoneの面に対する処理:
            //      internal : 内部面として維持(デフォルト)
            //      baffle   : バッフルを作成。
            //                 これにより、メッシュの動きに対する自由度が高まる
            //      boundary : 独立した境界を作成する
            //                 (バッフルと同様だが、節点の共有は行わない)
            // faceType baffle;
        }
    }

    // 特徴角度:
    // - サーフェスの最小・最大の細分化レベルが異なる場合に使用される
    // - 特徴スナップ (後述の snapControls を参照) が使用される場合に使用される
    resolveFeatureAngle 30;

    //- オプション:(最大レベルに加える)小さな隙間での増分
    // gapLevelIncrement 2;


    // 平面角度:
    // - 面法線が概ね同じ向きか、あるいは反対向きかを判定するために使用される。
    //   用途:
    //      - 近接領域の細分化
    //      - 独立したバッフルを統合するタイミングの決定
    //        (例: surfaceSimplify モードで実行している場合、これを 180 に設定すると
    //         すべてのバッフルが統合されます)
    //      - スナップ処理において、狭い隙間の「誤った」側の
    //        最近位置へスナップしてしまうのを防ぐため
    //
    // 指定がない場合、resolveFeatureAngle と同じ値が使用されます。
    planarAngle 30;


    // 領域ごとの細分化
    // ~~~~~~~~~~~~~~~~~~~~~~

    // サーフェスに関連するセルの細分化レベルを指定。以下の3つのモードのいずれかを使用。
    // - distance: 「levels」には、サーフェスからの距離に応じた目標とする細分化レベルを指定。
    //              距離は昇順で指定する必要がある。
    // - inside: 「levels」は単一の値を持ち、そのレベルのみが使用される。
    //            サーフェス内部の全セルが、指定されたレベルまで細分化される。
    //            この処理を行うには、サーフェスが閉じている必要がある。
    // - outside: 「inside」と同様だが、サーフェス外部のセルが対象となる。
    refinementRegions
    {
        box1x1x1
        {
            mode inside;
            levels ((1.0 4));
        }
        // sphere
        //{
        //    mode distance;
        //    levels ((1.0 5) (2.0 3));
        //}
    }

    // メッシュ選択
    // ~~~~~~~~~~~~~~

    // refinementSurfaces で定義したすべてのサーフェスに対して細分化パッチが追加され、
    // それらのサーフェスと交差するすべてのセルがこれらのパッチに割り当てられた後、
    // insidePoint から到達可能な領域が保持される。
    // 注意:この点は、細分化後でも決して面の上に乗らず、常にセルの内部にある必要がある。
    insidePoint (5 0.28 0.43);

    // (refinementSurfacesで指定された)faceZoneについて、
    // 対応するcellZoneの境界上にのみ存在するか、
    // (cellZoneに属さない)独立したゾーン面も許容するか。
    // faceZoneが存在しない場合は使用されない。
    allowFreeStandingZoneFaces true;


    // オプション:スナップ時に問題を引き起こす可能性のあるセルを削除しない
    // handleSnapProblems false;

    // オプション:潰されるセルに対するトポロジー的判定を無効にし、
    //             代わりに幾何学的判定を使用
    // useTopologicalSnapDetection false;

    // 細分化領域を、サーフェスのファセット(三角形)の範囲まで拡張
    extendedRefinementSpan true;
}

// スナッピング処理の設定
snapControls
{
    // サーフェスとの対応関係を決める前に行うパッチ平滑化の反復回数
    nSmoothPatch 3;

    // 点がサーフェスに引き寄せられる最大相対距離。
    // 実際の距離は、この係数とローカルな最大エッジ長を掛け合わせた値となる。
    // 注意:バージョン1.7.xで変更(修正)!(1.7.x版では許容値の2倍が使用されていた)
    tolerance 2.0;

    // メッシュ移動の緩和の反復回数。
    nSolveIter 30;

    // スナッピングの緩和の最大反復回数。
    // 正しいメッシュに到達した時点で停止するはず。
    nRelaxIter 5;

    // 特徴スナッピング

        // 特徴エッジへのスナップの反復回数。
        // 無効にする場合は、この設定を省略。
        nFeatureSnapIter 10;

        // サーフェスをサンプリングして(幾何学的な)特徴を検出(デフォルト=false)
        implicitFeatureSnap false;

        // castellatedMeshControls::features 設定を使用 (デフォルト = true)
        explicitFeatureSnap true;

        // 複数のサーフェス間の形状の特特徴(フィーチャー)を検出する
        // (explicitFeatureSnap でのみ使用、デフォルト = false)
        multiRegionFeatureSnap false;


    // 作業中:反対側の近接面へのスナップを無効化(2.2.xの挙動に戻す)
    // detectNearSurfacesSnap false;
}

// レイヤー追加処理の設定
addLayersControls
{
    // 以降の厚さパラメーターが、レイヤー外側の細分化セルの変形前のサイズに対する相対値(true)か、
    // 実際のサイズ(false)かどうか
    relativeSizes true;

    // 層の厚さの指定。以下のいずれかの方法で指定可能:
    // - 拡大比(expansionRatio)と最終層の厚さ(finalLayerThickness)(内部メッシュに最も近いセル)
    // - 拡大比(expansionRatio)と最初の層の厚さ(firstLayerThickness)(サーフェス上のセル)
    // - 全体の厚さ(overall thickness)と最初の層の厚さ(firstLayerThickness)
    // - 全体の厚さ(overall thickness)と最終層の厚さ(finalLayerThickness)
    // - 全体の厚さ(overall thickness)と拡大比(expansionRatio)
    //
    // 注意:ここで選択されたモードはグローバルな設定となる。
    //       つまりパッチごとにモードを上書きすることはできない(上書き可能なのは値のみ)。

        // レイヤーの拡大係数
        expansionRatio 1.0;

        // 壁から最も離れたレイヤーの目標厚さ。
        // relativeSizesが指定されている場合、これはレイヤー外側の
        // セルの変形前のサイズに対する相対値となる。
        finalLayerThickness 0.3;

        // 壁に接するレイヤーの目標厚さ。
        // relativeSizesが指定されている場合、これはレイヤー外側の
        // セルの変形前のサイズに対する相対値となる。
        // firstLayerThickness 0.3;

        // 各レイヤーを合わせた全体の目標厚さ。
        // relativeSizesが指定されている場合、これはレイヤー外側の
        // セルの変形前のサイズに対する相対値となる。
        // thickness 0.5


    // 全レイヤーの合計厚さの最小値。何らかの理由でレイヤーの厚さが
    // minThickness を下回る場合は、そのレイヤーを追加しない。
    // relativeSizesが指定されている場合、これはレイヤー外側の
    // セルの変形前のサイズに対する相対値となる。
    minThickness 0.25;


    // 最終的なパッチ(ジオメトリーではないことに注意!)ごとのレイヤー情報
    // 注意:この処理の挙動は 21x 以降に変更された。
    //       現在は、明示的に指定されていないパッチは以下の場合を除き、移動(スライド)する。
    //          - nSurfaceLayers が明示的に 0 と指定されている場合。
    //          - 最も近いサーフェスとのなす角が slipFeatureAngle 未満の場合(下記参照)。
    layers
    {
        sphere_firstSolid
        {
            nSurfaceLayers 1;

        }
        maxY
        {
            nSurfaceLayers 1;
            // パッチごとのレイヤー情報
            expansionRatio      1.3;
            finalLayerThickness 0.3;
            minThickness        0.1;
        }

        // nSurfaceLayersを0に設定することで、パッチ上の任意の点における
        // メッシュの収縮やレイヤーの追加を無効にする
        frozenPatches
        {
            nSurfaceLayers 0;
        }
    }

    // 点が押し出されない場合、同様に拡張されない接続面から nGrow 層のレイヤーを作成。
    // これにより、形状の特徴(フィーチャー)付近におけるレイヤー追加処理の収束が促進される。
    // 注意:バージョン1.7.xで変更(修正)!(1.7.xではこの処理は行われていなかった)
    nGrow 0;

    // 高度な設定


    // 初期メッシュの静的解析

        // サーフェスを押し出さない条件。0は平坦な面、90は2つの面が垂直な場合
        featureAngle 100;

        // 大きく歪んだセルでのレイヤーの成長を停止させる
        maxFaceThicknessRatio 0.5;


    // パッチ移動

        // サーフェス法線の平滑化の反復回数
        nSmoothSurfaceNormals 1;

        // サーフェスのパッチ間でレイヤーの厚さを平滑化
        nSmoothThickness 10;


    // 中間軸の解析

        // 中間軸の点を抽出するために使用される角度
        // 注意:バージョン1.7.xで変更(修正)! 90度は1.7.xにおける130に相当する。
        minMedialAxisAngle 90;

        // 中間距離に対する厚さの比率が大きい箇所ではレイヤーの成長を抑制
        maxThicknessToMedialRatio 0.3;

        // 内部メッシュ移動方向の平滑化の反復回数
        nSmoothNormals 3;

        // オプション:サーフェスから離れるステップ数を制限。
        // デフォルトは無制限。
        // nMedialAxisIter 10;

        // オプション:中間軸決定後の変位の平滑化。
        // デフォルトは 0。
        // nSmoothDisplacement 90;

        // (作業中) オプション:周囲の点がいずれも押し出されていない場合、その点を押し出さないようにする。
        // デフォルトは false。 
        // detectExtrusionIsland true;


    // メッシュの収縮

        // オプション:パッチ化されていない面において、
        // 押し出し方向が slipFeatureAngle よりも大きな角度を形成する場合、メッシュの移動(スリップ)を許可。
        // デフォルト値は 0.5 * featureAngle。
        slipFeatureAngle 30;

        // スナッピングの緩和の最大反復回数。
        // 正しいメッシュに到達した時点で停止するはず。
        nRelaxIter 5;

        // 新しいレイヤーの終端用にバッファ領域を作成
        nBufferCellsNoExtrude 0;

        // レイヤー追加の反復回数の全体上限。
        // メッシャーはこの反復回数に達すると終了する
        // (その際、問題のあるメッシュが残っている可能性はある)。
        nLayerIter 50;

        // 緩和されたmeshQuality設定が適用されるまでの最大反復回数。
        // 反復回数が nRelaxedIter に達するまでは meshQualityControls の設定が使用され、
        // nRelaxedIter を超えると meshQualityControls::relaxed の値が使用される。
        nRelaxedIter 20;

        // 追加レポート設定:(レイヤー追加後に)メッシュエラーのある面が少数ある場合は、それらの面の中心座標を出力。
        // これにより、問題のあるメッシュ領域を特定しやすくなる。
        // additionalReporting true;
}

// 全体的なメッシュ品質設定。
// 復元可能な段階で、これら設定は復元の先を決める。
meshQualityControls
{
    //- 許容される非直交性の最大値。180に設定すると無効化。
    maxNonOrtho 65;

    //- 許容される歪み(skewness)の最大値。0未満に設定すると無効化。
    maxBoundarySkewness 20;
    maxInternalSkewness 4;

    //- 許容される凹み(concaveness)の最大値。凹みが許容される角度(度単位)の上限。
    //  0は平坦な面、0未満は凸面を意味する。
    //  180に設定すると無効化。
    maxConcave 80;

    //- バウンディングボックスの最小辺の長さの3乗に対する、セルのピラミッド体積の最小値。
    //  想定される最小セル体積の割合に設定する。
    //  非常に小さな負の数(例: -1e30)に設定すると無効化。
    minVol -1e30;

    //- 面中心、可変基準点(最小分解三角形の頂点)、およびセル中心によって
    //  形作られる四面体の品質の最小値。
    //  非常に小さな負の数(例: -1e30)に設定すると無効化。
    //     <0 = 反転した四面体
    //      0 = 平坦な四面体
    //      1 = 正四面体
    minTetQuality 1e-15;

    //- 面のねじれ(twist)の最小値。-1未満に設定すると無効化。
    //  面の法線ベクトルと、面中心三角形の法線ベクトルとの内積。
    minTwist 0.02;

    //- 正規化セル行列式の最小値。これは内部面の全面積の行列式。
    //  セルの外部面積のうち、他のセルに接している面積の割合を示す指標となる。
    //  セルのすべての外部面が「浮いている」(zeroGradient条件)場合、
    //  セルの「固定度(fixedness)」は内部面の面積によって決まるという考えに基づく。
    //  1 = 六面体、<= 0 = 折り畳まれている、または平坦化された不正なセル
    minDeterminant 0.001;

    //- セル中心に対する面の相対位置(直交メッシュでは0.5)(範囲: 0 -> 0.5)
    minFaceWeight 0.05;

    //- 隣接セル間の体積比(範囲: 0 -> 1)
    minVolRatio 0.01;

    //- Number of error distribution iterations
    // 誤差分配の反復回数
    nSmoothScale 4;

    //- エラー点での変位の縮小量
    errorReduction 0.75;

    // オプション:メッシュ生成の特定段階では、緩和された規則を適用できる。
    // 例:addLayersControls::nRelaxedIter を参照。
    relaxed
    {
        //- 許容される非直交性の最大値。180に設定すると無効化。
        maxNonOrtho 75;
    }
}

// 高度な設定

//// デバッグフラグ
//debugFlags
//(
//    mesh            // 中間メッシュを出力
//    intersections   // 現在のメッシュの交差箇所を .obj ファイルとして出力
//    featureSeeds    // 明示的な特徴エッジの細分化に関する情報を出力
//    attraction      // 吸引(attraction)を .obj ファイルとして出力
//    layerInfo       // レイヤーに関する情報を出力
//);
//
//// 書き出しフラグ
//writeFlags
//(
//    scalarLevels    // 後処理用に cellLevel を含む volScalarField を出力
//    layerSets       // レイヤー内のセルおよび面の cellSets と faceSets を出力
//    layerFields     // レイヤーの被覆率を示す volScalarField を出力
//);

// マージ許容値。初期メッシュの全体バウンディングボックスに対する割合で指定。
// 注意:書き出し時の許容値は、この値よりも大きく設定する必要があります。
mergeTolerance 1e-6;

// ************************************************************************* //

参照