「OpenFOAM v2206 リリースノート」の版間の差分

ナビゲーションに移動 検索に移動
編集の要約なし
 
939行目: 939行目:
* MR!534
* MR!534


=== New tabulated anisotropic thermal conductivity solid transport ===
=== 新テーブル化された異方性熱伝導固体輸送 ===
この機能は、固体熱力学のための表形式異方性熱伝導特性を、オプションの座標系指定で指定することができるものです。
この機能は、固体熱力学のための表形式異方性熱伝導特性を、オプションの座標系指定で指定することができるものです。


1,005行目: 1,005行目:
* MR!546
* MR!546


=== New softWall six-degree-of-freedom restraint ===
=== 新型ソフトウォール6自由度拘束装置 ===
6自由度の剛体運動拘束に、新たにソフトウォール拘束を追加しました。
6自由度の剛体運動拘束に、新たにソフトウォール拘束を追加しました。


1,122行目: 1,122行目:
* MR!531
* MR!531


=== New specie adsorption conditions ===
=== 新種吸着条件 ===
TOP
 
流体/固体界面での収着過程をモデル化するために、 speciesSorption および enthalpySorption という 2 つの新しい境界条件が追加されまし た。これらの条件は、rhoReactingFoam のような、多成分、圧縮性、乱流の解を可能にする圧縮性多成分ソルバーで使用されるべきものです。
流体/固体界面での収着過程をモデル化するために、 speciesSorption および enthalpySorption という 2 つの新しい境界条件が追加されまし た。これらの条件は、rhoReactingFoam のような、多成分、圧縮性、乱流の解を可能にする圧縮性多成分ソルバーで使用されるべきものです。


1,200行目: 1,198行目:
= 後処理 =
= 後処理 =


=== サンプル集合の再書き込み ===
非常に古いライタークラスは、以前に更新されたサーフェスライターと同様の概念を使用する新しい coordSetWriter クラスに置き換わりました。いくつかのケースでは、rawフォーマットの出力ファイル名がわずかに異なることを除いて、変更はエンドユーザーにとってほぼ透明です。
変更点は以下の通りです。
* フィールドのサンプリング/書き込みをワンステップで行う。これにより、ライターをストリーミング操作に使用することができる。  スカラー、ベクトルなど複数のフィールドタイプを1つの出力に集めることができます。これは特にVTKやEnsightのフォーマットで顕著で、生成されるファイルの数が減ります。  raw形式をバッファなし出力として直接書き込み、サーフェスライター用のraw形式と整合性のあるファイルレイアウトを実現。  書き込みを行わずに実行間隔で値を取得するsampleOnExecuteをサポート。これにより、不要なIO操作でディスクをスラッシングすることなく、functionObjectコントロールで使用するための内部サンプリングが可能になります。  sampleSurface の変更点と同様に、辞書エントリ(リストも含む)として入力を設定し、changeDictionary を使用してコンテンツを変更できるようになりました。  sampleSet の結果 (プロパティ) がセット名で修飾されるようになり、複数のサブセットを扱うことができるようになりました。  これは、いくつかのワークフローにとって潜在的に大きな変更となりますが、前バージョンの欠点を修正したものです。例えば
<syntaxhighlight lang="c++">
sample1
{
    scalar
    {
        average(line,T) 349.96521;
        min(line,T)    349.9544281;
        max(line,T)    350;
        average(cells,T) 349.9854619;
        min(cells,T)    349.6589286;
        max(cells,T)    350.4967271;
        average(line,epsilon) 0.04947733869;
        min(line,epsilon) 0.04449639927;
        max(line,epsilon) 0.06452856475;
    }
    label
    {
        size(line,T)    79;
        size(cells,T)  1720;
        size(line,epsilon) 79;
    }
}
</syntaxhighlight>注:値はセット自体の名前でスコープされるため、例えば「line」セットの平均温度は average(line,T) となり、既存のワークフローは壊れてしまう。
非限定名は、すべてのサブセットのアンサンブル値に対応するようになりました。これは、既存のワークフローが1つのサブセットしか持っていない場合、正味の変化はないことを意味します。しかし、ワークフローを将来的に保証するために、より正確な仕様を使用することが推奨されます。<syntaxhighlight lang="c++">
average(p)    // Ensemble average of all listed sets
</syntaxhighlight>
* sampledSets は、指定されたすべてのサンプルされた位置のポイントを、生のプローブされたフォーマットで単一の集合的なアンサンブル出力に収集する特別な目的のプローブsetFormatを追加しています。  この機能は、プローブの位置を個々の点ではなく、アレイ/ラインで指定する方が便利な場合に有効です。
ソースコード
* $FOAM_SRC/meshTools/coordSet/writers/common
=== Improved probes function object ===
プローブには sampleOnExecute オプションが追加され、出力や出力ディレクトリを生成することなく、実行間隔で最小/最大/平均/サイズを取得するための値のサンプリング/プロービングをサポートします。
ソースコード
* $FOAM_SRC/sampling/probes
=== サンプリング面を改善 ===
サンプリングされた表面は、以下のような複数のアップデートが施されています。
* 内部surfMeshにサンプリングするサポートを削除しました。これは、より柔軟なポリサーフェスのサンプル/ストレージが追加される前の応急処置として、ほとんど使用されない機能でした(FEB-2019)。
* サンプリングされたサーフェスの出力を強化しました。
* ポイント マージの改善。
サーフェスライターがフィールドスケーリングと幾何学変換をサポートするようになりました。fieldLevelは、例えば、任意のfieldScaleを適用する前に、一様なシフトを追加または削除するのに便利です。
<code>fieldLevel
{
    "p.*"  1e5;        // Absolute -> gauge [Pa]
    T      273.15;    // [K] -> [C]
    U      #eval{ 10/sqrt(3) };  // Uniform mag(U)=10
}</code>
fieldLevel が削除された後、任意の fieldScale が適用される、例.
<code>fieldScale
{
    "p.*"  0.01;      // [Pa] -> [mbar]
}</code>
これは、例えば、EnSight-formatが本質的に単精度に制限されている場合に、圧力フィールドの出力精度を上げるために特に有効です。
新しいオプションのトランスフォームエントリにより、サンプリングされたサーフェスの「再配置」が可能になりました。例えば、CADにインポートするために、異なる座標系に再配置する場合などです。
<code>formatOptions
{
    vtk
    {
        scale 1000;  // m -> mm
        transform
        {
            origin  (0.05 0 0);
            rotation axisAngle;
            axis    (0 0 1);
            angle  -45;
        }
    }
}</code>
これにより、ベクトルまたはテンソルフィールドが幾何学的回転に従って変換される。
=== runTimeControlファンクションオブジェクトの改良 ===
runTimeControlファンクションオブジェクトは、トリガーを使用して、さらにファンクションオブジェクトをアクティブにします。以前は、トリガーインデックスは前進することしかできませんでしたが、この変更セットにより、ユーザーはより小さな値を設定して、例えば、ファンクションオブジェクトのリサイクルを有効にすることができるようになりました。
これをNサイクル繰り返す。
# 空間のある点での圧力の平均化
# 平均が安定したら、さらに100回繰り返し実行する。
# 新しいパッチの入口速度を設定する
# を (1) に戻す。
このリリースでは、新しいトリガー値を設定するオプションで、パススルー/ノーオプとして機能するNone条件も含まれています。
チュートリアル
* $FOAM_TUTORIALS/incompressible/simpleFoam/simpleCar
ソースコード
* $FOAM_SRC/functionObjects/utilities/runTimeControl
=== multiFieldValueファンクションオブジェクトの改善 ===
multiFieldValueファンクションオブジェクトは、結果エントリを生成するあらゆるファンクションオブジェクトで動作するようになり、fieldValueタイプのファンクションオブジェクトのみを使用するという制約がなくなりました。
例えば、以下のようにsurfaceFieldValueとvalueAverageファンクションオブジェクトの結果を平均化することができるようになった。
<code>averagePressure
{
    type    multiFieldValue;
    libs    (fieldFunctionObjects);
    operation  average;
    functions
    {
        inlet
        {
            type            surfaceFieldValue;
            operation      areaAverage;
            regionType      patch;
            name            inlet;
            fields          (p);
            writeFields    no;
            writeToFile    no;
            log            no;
        }
        outlet
        {
            type            surfaceFieldValue;
            operation      areaAverage;
            regionType      patch;
            name            outlet;
            fields          (p);
            writeFields    no;
            writeToFile    no;
            log            no;
        }
        average
        {
            type            valueAverage;
            functionObject  testSample1;
            fields          (average(p));
            writeToFile    no;
            log            no;
        }
    }
}</code>
また、出力もわかりやすく更新しています。
  <code>1 # Group0         
  2 #  - averagePressure:inlet:areaAverage(inlet,p)
  3 #  - averagePressure:outlet:areaAverage(outlet,p)
  4 #  - averagePressure:average:average(p)Mean
  5 # Operation      : add
  6 # Time              Group0           
  7 0.00120482          3.4483824485e+05
  8 0.00265769          3.0352523946e+05
  9 0.00439595          3.0338969991e+05</code>
追加のグループには、Group1、Group2 ... などのラベルが付けられます。GroupN などと表示されます。
チュートリアル
* $FOAM_TUTORIALS/lagrangian/reactingParcelFoam/filter
* $FOAM_TUTORIALS/incompressible/pisoFoam/RAS/cavity
ソースコード
* $FOAM_SRC/functionObjects/field/multiFieldValue
=== 力およびforceCoeffs関数オブジェクトの改善 ===
force および forces 関数オブジェクトは、コードの複雑さを軽減し、コードの保守性を向上させるためにリファクタリングされました。binning機能は削除され、別のbinField関数オブジェクトとして利用できるようになりました。
力の係数を要求する際、以前はすべての寄与を書き込んでいましたが、オプションの「係数」項目を使って選択できるようになりました。
<code>coefficients    (Cd Cl(f) Cl(r));</code>
係数の全リストは以下の通りです。
* Cd, Cd(f), Cd(r) : 抗力, (フロントとリア)
* Cs、Cs(f)、Cs(r) : サイドフォース、(フロントとリア)
* Cl, Cl(f), Cl(r) : 揚力、(前・後)
* CmRoll : ロールモーメント
* CmPitch : ピッチモーメント
* CmYaw : ヨーモーメント
省略した場合は、すべての係数を書き込む。
チュートリアル


* $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike/system/forceCoeffs
* $FOAM_TUTORIALS/incompressible/simpleFoam/simpleCar/system/forceCoeffs
ソースコード
* $FOAM_SRC/functionObjects/forces/forces
* $FOAM_SRC/functionObjects/forces/forceCoeffs
=== 新しいbinField関数オブジェクト ===
新機能オブジェクトのbinFieldは、指定したパッチやセルゾーンをセグメントに分割し、各セグメントごとに空間的に局所的な情報を出力するビニングデータを計算します。
2種類のビン型があります。
* singleDirectionUniformBin:指定された方向のビニングデータを計算する。
* uniformBin: 指定されたデカルト座標系または円筒座標系に従って、複数のセグメントでビニングデータを計算する。
出力変数は以下の通り。
* total: パッチと内部の合計
* patch: パッチデータ
* internal: 指定したセルゾーンのポーラスデータなど
* normalとtangential: パッチデータの直交成分
例として、forceCoeffs関数オブジェクトの以前のビニング動作を回復するために。
<code>forceCoeffs1
{
    type            forceCoeffs;
    libs            (forces);
    writeControl    writeTime;
    writeFields    true;
    patches        (body);
    p              p;
    U              U;
    rho            rhoInf;      // Indicates incompressible
    log            true;
    rhoInf          1;          // Required when rho = rhoInf
    liftDir        (0 1 0);
    dragDir        (1 0 0);
    CofR            (3.5 0 0);  // Axle midpoint on ground
    pitchAxis      (0 0 1);
    magUInf        10;
    lRef            4;          // Wheelbase length
    Aref            1;          // Estimated
    porosity        on;
}
binField1
{
    type                    binField;
    libs                    (fieldFunctionObjects);
    binModel                singleDirectionUniformBin;
    fields                  (forceCoeff);
    patches                (body);
    decomposePatchValues    yes;
    CofR                    ${..forceCoeffs1.CofR};
    cellZones              (porousZone);
    binData
    {
        nBin        20;          // output data into 20 bins
        direction  (1 0 0);    // bin direction
        cumulative  yes;
    }
    writeControl            writeTime;
}</code>
チュートリアル
* $FOAM_TUTORIALS/incompressible/simpleFoam/simpleCar/system/forceCoeffs
ソースコード
* $FOAM_SRC/functionObjects/field/binField
=== ダイナミックモードデコンポジション(DMD)ツールの改善 ===
Dynamic Mode Decomposition機能オブジェクトが拡張され、DMD計算において複数のパッチを指定できるようになりました。
<code>DMD1
{
    // Optional entries
        // Option-1
        patch              <word>;
        // Option-2
        patches            (<wordRes>);
}</code>
また、STDMDの実装の中で最もコストのかかる部分を特定し、リファクタリングすることで、実行時間の短縮を実現し、パフォーマンスも向上しました。例えば、標準的な "cylinder2D "チュートリアルのタイミング、すなわち、すべてのSTDMD関数オブジェクトがアクティブな場合、12プロセッサの並列シミュレーションの時間は、約60%短縮されました。
ソースコード
* $FOAM_SRC/functionObjects/field/DMD
チュートリアル
* $FOAM_TUTORIALS/incompressible/pimpleFoam/laminar/cylinder2D
マージ要求
* MR!547
=== 新しい particleZoneInfo クラウド機能オブジェクト ===
新しい particleZoneInfo クラウド関数オブジェクトは、cellZone を横切る粒子の統計情報を生成します。クラウドプロパティファイルのcloudFunctionsサブディクショナリで指定されます。
<code>cloudFunctions
{
    particleZoneInfo1
    {
        type            particleZoneInfo;
        cellZone        leftFluid;
        // Optional entries
        writer          vtk; // vtk, raw, none
    }
}</code>
オプションの writer エントリを指定すると、クラウドデータが指定されたフォーマットで書き込まれます。生成される統計情報には粒子が含まれます。
* インデックスとその発信元プロセッサ
* セルゾーンに最初に入ったときの時刻、直径、質量
* 現在位置、直径、質量
* セルゾーンに滞在した時間
実行中、オブジェクトはクラウドソリューションの後に書き込む、など。
<code>particleZoneInfo:
    Cell zone                      = leftFluid
    Contributions                  = 257</code>
ここで、Contributions はこの時間ステップで記録された粒子移動の増分寄与の数を意味します。書き込み時には、出力が拡張される、など。
<code>particleZoneInfo:
    Cell zone                      = leftFluid
    Contributions                  = 822
    Number of particles            = 199
    Written data to "postProcessing/lagrangian/reactingCloud1/particleZoneInfo1/0.7/particles.dat"</code>
particles.dat ファイルには、粒子の統計情報などが含まれています。
<code># cellZone        : leftFluid
# time            : 1.0000000000e+00
#
# origID            origProc    (x y z)    time0    age    d0    d    mass0    mass
2 0 (1.2403730063e+00 6.3907929681e-01 5.0000000000e-02) 5.0400000000e-01 5.0400000000e-01 1.0000000000e-03 9.9733169015e-04 5.2359877560e-07 5.1941857822e-07
3 0 (1.2294005030e+00 7.1626530229e-01 5.0000000000e-02) 5.0400000000e-01 5.0225000000e-01 1.0000000000e-03 9.9733162350e-04 5.2359877560e-07 5.1941847408e-07
4 0 (1.2265565036e+00 6.5308628366e-01 5.0000000000e-02) 5.0400000000e-01 5.0100000000e-01 1.0000000000e-03 9.9733541220e-04 5.2359877560e-07 5.1942439366e-07</code>
チュートリアル
* $FOAM_TUTORIALS/lagrangian/reactingParcelFoam/filter
ソースコード
* $FOAM_SRC/lagrangian/intermediate/submodels/CloudFunctionObjects
=== cloudInfo クラウド機能オブジェクトの改良 ===
cloudInfo は、以下のような基本的な区画情報を報告するシンプルな雲機能オブジェクトである。
* 区画数
* システム内の質量
* 最大径
* D10 直径
* D32径
このたび、解析する区画の限定的な選択をサポートするために拡張されました。選択メカニズムは vtkCloud 関数オブジェクトと同じで、例.
<code>selection
{
    all
    {
        action  all;
    }
    T
    {
        action  subset;
        source  field;
        field  T;
        accept  (greater 280) and (less 300);
    }
    Umin
    {
        action  subtract;
        source  field;
        field  U;
        accept  (less 0.1);
    }
}</code>
チュートリアル
* $FOAM_TUTORIALS/lagrangian/reactingParcelFoam/filter
ソースコード
* $FOAM_SRC/functionObjects/lagrangian/cloudInfo
* $FOAM_SRC/functionObjects/lagrangian/common/parcelSelectionDetail.H
=== パーティクルドーズクラウド機能オブジェクトを新規に追加 ===
新しい線量クラウド機能オブジェクトは、粒子の吸収線量を放射線場Gに沿った粒子軌道の時間積分[w/m2]として計算します。
関数オブジェクトを指定する。
<code>cloudFunctions
{
    ParticleDose1
    {
        type            ParticleDose;
        GName            G;
    }
}</code>
チュートリアル
* $FOAM_TUTORIALS/lagrangian/coalChemistryFoam/simplifiedSiwek
ソースコード
* $FOAM_SRC/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleDose
=== 新しいノルム関数オブジェクト ===
new norm関数オブジェクトは、入力フィールドを選択されたノルムで正規化し、新しい正規化されたフィールドを書き込む。
最小限の使用例を以下に示します。
<code>norm1
{
    // Mandatory entries
    type            norm;
    libs            (fieldFunctionObjects);
    field          <word>;
    norm            <word>;
    // Conditional entries
        // when norm == Lp
        p              <scalar>;
        // when norm == composite
        divisor        <Function1<scalar>>;
        // when norm == divisorField
        divisorField    <word>;
    // Inherited entries
    ...
}</code>
には、以下のノルム項目があります。
* L1 : L1/Taxicabノルム
* L2 : L2/Euclidean ノルム
* Lp : pノルム
* max : 最大ノルム
* composite : 関数1 divisorを構成する合成ノルム
* divisorField : 与えられたフィールドで正規化する。
ソースコード
* $FOAM_SRC/functionObjects/field/norm
チュートリアル
* $FOAM_TUTORIALS/incompressible/pisoFoam/RAS/cavity
マージ要求
* MR!539
=== foamToVTKとfoamToEnsightの有限面積のサポートが改善されました。 ===
foamToEnsightとfoamToVTKの両方で、有限面積フィールドがデフォルトで検出および変換されるようになりました。必要であれば、-no-finite-areaオプションでこれを抑制することができます。以前の-finite-areaオプションは無視されるようになりました。
foamToEnsightおよびfoamToVTKユーティリティには、変換をより正確に制御するための-exclude-fieldsおよび-no-fieldsオプションが追加されています。


= パラレル =
= パラレル =
=== singleProcessorFaceSets制約を改善しました。 ===
オプションの制約は、decomposeParDict の制約セクションを使用して、decomposePar ユーティリティに適用することができます。singleProcessorFaceSets 制約は、faceSet のすべての面を同じプロセッサーに配置するために使用できます。v2206では、ロジックが拡張され、redistributePar -parallelなどの並列で動作するようになりました。
典型的な使用方法は、cyclicAMIの面を1つのプロセッサで維持することです。例えば、暗黙的な実行やパーティクルトラッキングに必要な場合などです。
<code>method              ptscotch;
constraints
{
    keepCyclicAtOnePatch
    {
        type        singleProcessorFaceSets;
        sets
        (
            (fanLeftFaceSet -1)
            (fanRightFaceSet -1)
        );
        enabled    true;
    }
}</code>
チュートリアル
* singleProcessorFaceSets制約を持つすべてのチュートリアル
ソースコード
* $FOAM_SRC/parallel/decompose/decompositionMethods/decompositionConstraints
=== アップデートされたアルゴリズム ===
==== パラレル通信 ====
本バージョンでは、Pstreamライブラリに関連する低レベルMPI並列通信コンポーネントの一部を大幅に作り直しました。この変更には、通常のコード開発の一環としてのアップデート、exaFOAMプロジェクトの活動に関連する変更、そして富嶽の性能向上に取り組んでいるRISTの青柳哲雄、井上義明、阿左美彰の研究者への多大な感謝が含まれています。
RISTの研究者たちは、プロセッサの数が多くなると、interIsoFoamソルバーの性能が特に低下することに気づきました。これは、通信パターンが縮退していることに起因しています。
彼らのソリューションは、限定された通信ステンシルとMPIブロードキャストを組み合わせることで、多くのオール・トゥ・オール通信やポイント・トゥ・ポイント通信を回避しています。
interIsoFoamで達成した改善規模は実に印象的で、約1300秒だった通信時間を50秒以下にまで短縮しました


==== アップデートの簡単な概要 ====
Pstreamの再構築はかなり広範囲に及びますが、ここではいくつかの注目点を紹介します。


* 新しい Pstream::broadcast と Pstream::broadcasts の操作です。複数の1対多通信を1つのMPI_Bcastで置き換えることができます(RISTからの研究に基づいています)。
* ネットワークに最適化された MPI intrinsics を活用するために、ツリーベースの散布がブロードキャストに大きく置き換えられました。
* メモリの再利用を向上させるために、巻き戻し、ピークなどのPstreamアクセスメソッドを追加しました。
* PstreamBuffers通信モードの追加。すなわち、gather/scatter、neighbor/neighbourおよび特殊なトポロジカルパターン。
* float/double/(u)int32_t/(u)int64_t 型のためのネイティブ MPI min/max/sum リダクション。


= ユーザビリティ =
= ユーザビリティ =
=== コンパイラーサポートの改善 ===
* ARM64 Nvidia コンパイラ用の新しい make ルールを追加しました。
* PGI コンパイラの wmake ルールを削除 (廃止)
* clang lld と金型リンカを使用するようにオプションで制御、例:
<syntaxhighlight lang="c++">
export WM_COMPILER=Clang140
export WM_COMPILE_CONTROL="version=14.0 +lld"
</syntaxhighlight>
* ローカルデバッグビルドの柔軟性を向上させました。コードを開発するとき、FULLDEBUG と組み合わせたり、場合によっては異なる最適化レベルで組み合わせると便利なことがあります。ファイルを編集することなく、wmakeコールから直接両者を組み合わせることができるようになり、便利になりました。
<syntaxhighlight lang="c++">
wmake -debug-O1 src/OpenFOAM
</syntaxhighlight>
* FOAM_EXTRA_CXXFLAGS は、オーバーライドしやすいように、コンパイルラインの最後に追加されるようになりました。
=== 座標回転の簡単な定義 ===
インライン定義による回転タイプの指定が可能になり、可読性が向上し、タイピングも少なくなりました。
<code>transform
{
    origin  (0 0 0);
    rotation axisAngle;
    axis    (0 0 1);
    angle  45;
}</code>
長編と同様に。
<code>transform
{
    origin  (0 0 0);
    rotation
    {
        type  axisAngle;
        axis  (0 0 1);
        angle 45;
    }
}</code>
古い coordinateRotation キーワード (OpenFOAM-v1806 以前) は、冗長的に非推奨となり、rotation が優先されるようになりました。
=== ロール-ピッチ-ヨー/ヨー-ピッチ-ロールの指定に対応。 ===
アプリケーションによっては、roll-pitch-yawは自然な方位表現なので、オイラー仕様の一部として直接サポートされるようになりました(例)。
<code>rotation
{
    type    euler;
    order  rollPitchYaw;
    angles  (0 20 45);
}</code>
非常に単純な回転(-rotate-x, -rotate-y, -rotate-z)が、transformPoints と surfaceTransformPointsで直接受け付けられるようになりました。
=== プレーンの簡単な定義 ===
多くの場合、平面を指定する最も自然な方法は、参照点とその法線である。そのため、辞書エントリーのplaneTypeはオプションとなりました。指定しない場合は、点/法線の定義が想定され、pointAndNormalDict サブエントリはオプションになります。
この変更により、より自然に指定することができるようになりました。例えば、サンプリングされた切断面の場合。
<code>slice
{
    type        cuttingPlane;
    point      (0 0 0);
    normal      (0 0 1);
    interpolate true;
}</code>
代わりに
<code>slice
{
    type        cuttingPlane;
    planeType  pointAndNormal;
    pointAndNormalDict
    {
        point  (0 0 0);
        normal  (0 0 1);
    }
    interpolate true;
}</code>

案内メニュー