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

ナビゲーションに移動 検索に移動
編集の要約なし
 
(同じ利用者による、間の1版が非表示)
783行目: 783行目:
= ソルバーと物理モデル =
= ソルバーと物理モデル =


=== 新ソリッドボディメッシュモーション ===
v2012 では、system/fvSchemes の新しいジオメトリ エントリを使用したジオメトリ計算のランタイム選択メカニズムが追加され ました。このリリースでは、回転 AMI/ACMI ケースなどの一部の移動メッシュ ケースのコストを削減することを目的とした、新しい solidBody ジオメトリ スキームが追加されました。
<code>geometry
{
    type    solidBody;
    // Optional
    partialUpdate yes; // default = yes
    cacheMotion yes; // default = yes
}</code>
新しい制度は、次のような前提で運用されています。


* ソリッドボディ(点数、面領域、セル体積が同じ)として表現できるものであり
* トポロジーの更新はありません。


= バウンダリーコンディション =
そのため、solidBody スキームでは、完全なメッシュクリアを行う代わりに、移動するポイントに接続されたジオメトリのみを選択的に更新します。


性能向上(時間)はケースバイケースで、例えば、全セル数に対して移動セルの割合が少ないほど、メッシュ更新フェーズの利点は大きくなります。


追加エントリーの制御です。
* partialUpdate : falseに設定すると、メッシュの変更時に完全なメッシュのクリアアウトを実行します。
* cacheMotion : trueに設定すると、すべての時間ステップで移動する点、面、セルのアドレスをキャッシュする。
==== 後方互換性 ====
基本オプションはデフォルトであり、ジオメトリサブディクショナリが提供されない場合に適用される。
<code>geometry
{
    type basic;
}</code>
このオプションを選択すると、v2112(およびそれ以前のバージョン)の動作が復元されます。
チュートリアル
* $FOAM_TUTORIALS/incompressible/pimpleFoam/RAS/propeller
ソースコード
* $FOAM_SRC/finiteVolume/fvMesh/fvGeometryScheme/solidBody
=== 新しいレイノルズ応力乱流モデル。EBRSM ===
新しいElliptic Blending Reynolds Stress Model(EBRSM)は、非圧縮性および圧縮性の流れに対する(Manceau, 2015)の研究をベースにしています。
このモデルは、標準的な弱不均一レイノルズ応力モデルを壁面近傍まで拡張し、レイノルズ応力と乱流量について一般に優れた流れ予測を提供します。
この新しいモデルは、様々な正則ケースで検証されている。ReTau=180 の平滑壁平面チャネル流れの DNS 研究に基づく検証ケースの結果を以下に示す(Moser et al., 1999).
ソースコード
* $FOAM_SRC/TurbulenceModels/turbulenceModels/RAS/EBRSM/EBRSM.H
チュートリアル
* $FOAM_TUTORIALS/verificationAndValidation/turbulenceModels/planeChannel
マージ要求
* MR!544
参考文献
* Manceau, R. (2015). Recent progress in the development of the elliptic blending Reynolds-stress model. International Journal of Heat and Fluid Flow, 51, 195-220. DOI:10.1016/j.ijheatfluidflow.2014.09.002
アトリビュート
* OpenCFD は、Rémi Manceau 教授、Michael Karl Stoellinger 博士、Ardalan Javadi 博士の貢献、精巧な提案と支援、および批判的な勧告に感謝し、謝意を表したいと思います。
=== 壁面機能の向上 ===
壁関数とそのコードのドキュメントを改善しました。
従来は壁面機能
* epsilon、k、omegaなどの壁関数で必要とされる様々な共通の壁関数係数を取得するために、nutWallFunctionタイプのリファレンスが必要でした。
* Cmu, kappa, Eは、係数値の一貫性を確保するため、指定されたnutWallFunctionから取得した。
これらの選択は、特にナットベースの壁関数が期待されない場合、やや不可解な鋳造エラーが発生し、一部のセットアップでは過度に制限されるなど、しばしば混乱を招きました。例えば、壁際領域でのεの変動が通常非常に急で非単調である場合、専門ユーザーはε固有の係数を使用したいと思うかもしれません。
ソースコード
* $FOAM_SRC/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions
* $FOAM_SRC/TurbulenceModels/compressible/turbulentFluidThermoModels/derivedFvPatchFields/wallFunctions
* $FOAM_SRC/TurbulenceModels/turbulenceModels/derivedFvPatchFields/wallFunctions
* $FOAM_SRC/TurbulenceModels/incompressible/turbulentTransportModels/derivedFvPatchFields/wallFunctions
* $FOAM_SRC/regionModels/surfaceFilmModels/derivedFvPatchFields/wallFunctions
マージ要求
* MR!486
=== CHTソルバーのドライランを新たにサポート ===
chtMultiRegionFoam ソルバー群は、-dry-run コマンドラインオプションをサポートし、ケース設定に関するクイックフィードバックを提供するように拡張されました。
<code>chtMultiRegionFoam -dry-run</code>
これにより、ダミーメッシュが作成され、初期フィールドが読み込まれます。典型的な出力です。
<code>Operating in 'dry-run' mode: case will run for 1 time step.  All checks assumed OK on a clean exit
Creating simplified mesh using "openfoam/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater/constant/bottomWater/polyMesh"
Mesh bounds: (-0.1 -0.04 -0.05) (0.1 1.1564823e-18 0.05)
Creating dummy zone heater
Creating dummy zone leftSolid
Creating dummy zone rightSolid
Creating dummy zone topAir
Creating dummy zone bottomWater</code>
残念ながら、この処理は、明示的に結合されたパッチ(mapped, mappedWall)のマッチングの後半で失敗するため、完全な反復処理を終えることができません。
ソースコード
* $FOAM_SOLVERS/applications/solvers/heatTransfer/chtMultiRegionFoam
=== solidFoamの新しいタイムステップ制御 ===
solidFoamソルバーが拡張され、タイムステップの制御が可能になりました。これは、system/controlDictの設定により有効になります。
<code>//- Is time step adjustable
adjustTimeStep  yes;
//- Maximum diffusion number (default is 10)
maxDi          1;</code>
その他、時間ステップを制御する方法もサポートされています。
<code>functions
{
    timeStepping
    {
        type            setTimeStep;
        libs            (utilityFunctionObjects);
        enabled        yes;
        deltaT
        {
            type table;
            file "<system>/deltaTvalues";
        }
    }
}</code>
チュートリアル
* $FOAM_TUTORIALS/heatTransfer/solidFoam/movingCone
ソースコード
* $FOAM_SOLVERS/heatTransfer/solidFoam
=== 熱交換器のモデリングを改善 ===
effectivenessHeatExchangerSourceのfvOptionが書き込めるように拡張されました。
<code>#Time    Net mass flux [kg/s]    Total heat exchange [W]    Secondary inlet T [K]    Tref [K]    Effectiveness</code>
オプションとして、ユーザーは二次流の比熱容量である新しいオプション入力secondaryCpに基づいて、二次流出温度を計算することができます。
<code>effectivenessHeatExchangerSource1
{
    ...
    // when secondary outlet temperature is requested
    secondaryCp            <Function1<scalar>;
}</code>
ソースコード
* $FOAM_SRC/fvOptions/sources/derived/effectivenessHeatExchangerSource/effectivenessHeatExchangerSource.H
マージ要求
* MR!534
=== 新テーブル化された異方性熱伝導固体輸送 ===
この機能は、固体熱力学のための表形式異方性熱伝導特性を、オプションの座標系指定で指定することができるものです。
輸送モデルは tabulatedAnIso と呼ばれ、例として ThermophysicalProperties ファイルに以下のように指定されている。
<code>thermoType
{
    type            heSolidThermo;
    mixture        pureMixture;
    transport      tabulatedAnIso;
    thermo          hTabulated;
    equationOfState icoPolynomial;
    specie          specie;
    energy          sensibleEnthalpy;
}
mixture
{
    specie
    {
        molWeight  50;
    }
    transport
    {
        kappa      table
        (
            // T  kappa
            ( 200  (80 80 80) )
            ( 400  (80 80 80) )
        );
        // kappa    <Function1<scalar>>;
    }
    thermodynamics
    {
        Hf      0;
        Cp
        (
            ( 200 450)
            ( 400 450)
        );
        Sf      0;
    }
    equationOfState
    {
        rhoCoeffs<8>    (8000 0 0 0 0 0 0 0);
    }
}
coordinateSystem
{
    type        cylindrical;
    origin      (0 0 0);
    rotation
    {
        type    cylindrical;
        axis    (1 0 0);
    }
}</code>
ソースコード
* $FOAM_SRC/thermophysicalModels/solidSpecie/transport/tabulated/tabulatedAnIsoSolidTransport.H
マージ要求
* MR!546
=== 新型ソフトウォール6自由度拘束装置 ===
6自由度の剛体運動拘束に、新たにソフトウォール拘束を追加しました。
このモデルでは、アンカーと本体の取り付け位置refAttachmentPtの壁面法線方向の距離が負になると軟らかい壁として作用し、正になると力は作用しないダンパー線形バネ拘束を記述している。
dynamicMeshDictでの仕様は以下の通りです。
<code>restraints
{
    softWall
    {
        sixDoFRigidBodyMotionRestraint  softWall;
        anchor                          (0.5 0.5 0.7);
        refAttachmentPt                (0.5 0.5 0.58);
        wallNormal                      (0 0 -1);
        psi                            2.0;
        C                              0.01;
    }
}</code>
ソースコード
* $FOAM_SRC/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/restraints/softWall
マージ要求
* MR!536
= 境界条件 =
==== 乱流デジタルフィルター条件の改善 ====
乱流DigitalFilterInlet境界条件のリファクタリング、簡略化、改良が行われました。
* この条件を拡張して、温度や汚染物質濃度などのスカラーの合成変動を生成する。
* 新しい入力項目タイプ。
** 平均応力とレイノルズ応力がPatchFunction1型になりました。
** 平均応力、レイノルズ応力の時変入力が可能になりました。
** 入力項目が大幅に削減されました。
* インレットパッチへの揺らぎのマッピングが改良され、一般化された
** ユーザーはマッピング操作の際にAMIのマッピング方法を選択することができます
* ドメインの回転/平行移動が改善されました。
** ユーザーがローカル座標系を設定することができます。
* フォワードステップワイズ法オプションでタイムステップを調整できるようにしました。
* 並列化、スケーリングが向上します。
* リスタートを改善しました。
* Taylor の凍結乱流の仮定は、流線積分スケールの計算では削除されます。
ソースコード
* $FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/turbulentDigitalFilterInlet
チュートリアル
* $FOAM_TUTORIALS/incompressible/pimpleFoam/LES/planeChannel
* $FOAM_TUTORIALS/verificationAndValidation/turbulentInflow/oneCellThickPlaneChannel
マージ要求
* MR!532
参考文献
* Xie, Z. T., Hayden, P., & Wood, C. R. (2013). Large-eddy simulation of approaching-flow stratification on dispersion over arrays of buildings. Atmospheric Environment, 71, 64-74. DOI:10.1016/j.atmosenv.2013.01.054
* Okaze, T., & Mochida, A. (2017). Cholesky decomposition–based generation of artificial inflow turbulence including scalar fluctuation. Computers & Fluids, 159, 23-32. DOI:10.1016/j.compfluid.2017.09.005
=== 新型アウトレットマップインレットの条件 ===
outletMappedUniformInlet境界条件が、時間的に遅延する入口-出口再循環と一般化された入力に対して改善されました。
* 1つのインレットに対して、任意の数のアウトレットを接続することが可能になりました。
* 各インレットは、異なる任意の組み合わせのアウトレットに接続することができます。
* オプションの filtration-fraction と offset の項目は Function1 タイプにアップグレードされる。
* 時間遅延再循環は、Function1タイプの新しいオプションの時間遅延エントリによって有効になります。
* 各インレットは、PatchFunction1タイプとして、オプションでベースインレットフィールドを持つことができるようになりました。
* 境界条件は、スカラー、ベクトル、テンソルなど、すべてのフィールドタイプに使用可能です。
この境界条件の最小限の例を以下に示す。
<code><patchName>
{
    // Mandatory entries
    type            outletMappedUniformInlet;
    outlets
    {
        <outletName.1>
        {
            fraction    <Function1<scalar>>;
            offset      <Function1<Type>>;
            timeDelay  <Function1<scalar>>;
        }
        <outletName.2>
        {
            fraction    <Function1<scalar>>;
            offset      <Function1<Type>>;
            timeDelay  <Function1<scalar>>;
        }
        ...
    }
    // Optional entries
    uniformValue    <PatchFunction1<Type>>;
    phi            phi;
    // Inherited entries
    ...
}</code>
ソースコード
* $FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/outletMappedUniformInlet
チュートリアル
* $FOAM_TUTORIALS/lagrangian/reactingParcelFoam/airRecirculationRoom
マージ要求
* MR!531
=== 新種吸着条件 ===
流体/固体界面での収着過程をモデル化するために、 speciesSorption および enthalpySorption という 2 つの新しい境界条件が追加されまし た。これらの条件は、rhoReactingFoam のような、多成分、圧縮性、乱流の解を可能にする圧縮性多成分ソルバーで使用されるべきものです。
speciesSorption には、 吸着モデルを選択し、対応するモデルパラメータを指定するオプションがある。1つのモデルは吸着平衡モデル(Langmuir)に基づき、もう1つは動力学、すなわち一次モデルに基づくものである。
種境界条件は、表面への吸着種と脱着種の量を時間経過とともに記憶し続けるものである。
<code>base
{
    type                speciesSorption;
    equilibriumModel    Langmuir;
    kinematicModel      PseudoFirstOrder;
    kabs                10;                // [1/sec]
    kl                  0.01;              // [1/mol]
    max                0.1;                // [mol/Kg]
    thickness          uniform 1e-3;      // [m]
    rhoS                2000;              // [kg/m3]
    value              $internalField;
}</code>
どこで
* kabs: 吸収係数
* kl:ラングミュア係数
* max : ラングミュアモデルにおける壁面での平衡の比例係数
* thickness : ソリッドの厚さ
* rhoS : 固体密度
ここで重要なことは、動力学モデルは固体質量1kgあたりのソース[mol/kg/sec]を提供することである。種へのソース率[kg/m3/sec]を計算するためには、種が吸収される固体壁の質量を知る必要がある。
この条件は、壁での種のためのゼロ勾配タイプです。したがって、種のためのソースは、パッチに隣接するセルにソースを適用するfvOptionを介して追加されます。
fvOptions辞書では、次のように指定されています。
<code>patchCellsSource
{
    type            patchCellsSource;
    species        O2;
}</code>
EnthalpySorption条件は、温度フィールドに適用され、2つのモデル(推定と計算)を介して、種の吸着に関連する熱の追加または削除を説明します。
* estimated: 吸着エンタルピーは、ユーザー入力により計算されます。CとHvap
* 計算:質量負荷とエンタルピーのルックアップテーブルを必要とします。
<code>base
{
    type                enthalpySorption;
    enthalpyModel      calculated;
    enthalpyTable
    {
        type            table;
        values          ((0 0)(1 50));
    }
    C                  2;
    species            O2;
    includeHs          true;
    value              $internalField;
}</code>
のところです。
* enthalpyModel: 吸収モデル (計算値 / 推定値)
* enthalpyTable : 計算モデル用のテーブル
* C: 推定モデル定数を含む
* Hs: 種の感性エンタルピーを含む
* species: 検討中の種
チュートリアル
* $FOAM_TUTORIALS/combustion/rhoReactingFoam/groundAbsorption
ソースコード
* $FOAM_SRC/thermophysicalModels/reactionThermo/derivedFvPatchFields/speciesSorption
* $FOAM_SRC/thermophysicalModels/reactionThermo/derivedFvPatchFields/enthalpySorption


= 後処理 =
= 後処理 =


=== サンプル集合の再書き込み ===
非常に古いライタークラスは、以前に更新されたサーフェスライターと同様の概念を使用する新しい 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>

案内メニュー