OpenFOAM v2306リリースノート

OpenCFDは、OpenFOAM® v2306の2023年6月リリースを発表します。このリリースは、コードの多くの領域にわたってOpenFOAM-v2212の機能を拡張しています。この新機能は、OpenCFDの顧客からのスポンサーによる開発、内部資金による開発、OpenFOAMコミュニティからの機能や変更の統合を表しています。

OpenFOAMはOpenCFDによってGPLライセンスの下で配布されています。様々なLinuxや他のPOSIXシステムでのコンパイルに適したソースコードパッケージに加え、このリリースにはコンパイル済みのバイナリパッケージも多数あります。

  • Ubuntu Linux: Ubuntu 22.04(LTS)、20.04(LTS)、18.04(LTS)、23.04、22.10 用パッケージインストール
  • openSUSE Linux: Leap15.5用パッケージインストール
  • Redhat Linux: epel-9 用パッケージ・インストール; Fedora 37

Windowsユーザーには、コンパイル済みパッケージについて3つの選択肢があります(詳細):

  • Windows Subsystem for Linux(Ubuntu、openSUSEなどベース)を使用する。
  • クロスコンパイルされたネイティブ実行ファイル
  • docker インストール

OpenFOAMのapptainerサポートは、事前にアセンブルされたイメージではなく、記述ファイルによって提供されます。

  • パッケージング/コンテナ参照

Mac OSXユーザーは、ソースからコンパイルするか、Dockerコンテナを使ってコンパイル済みのパッケージを使用するオプションがあります(詳細)。

アップグレード

省略と削除

境界条件

exprFixed境界条件とexprMixed境界条件に、ランタイム非推奨の警告が表示されるようになりました。同じ機能(およびそれ以上)は、それぞれuniformFixedValue境界条件とuniformMixed境界条件で利用できます。

名前変更

ファンクションオブジェクト:patchPostProcessingとpatchParticleHistogram

ラグランジュ関数オブジェクトpatchPostProcessingとpatchParticleHistogramは、わかりやすさと理解を深めるために、それぞれparticlePostProcessingとparticleHistogramに名称が変更されました。

入力辞書

不必要な丸め誤差や精度低下を避けるため、#calcと#evalの固定フォーマットと精度制限が削除された。式が評価される際の文字列展開がより一貫したものになるはずです。

表現

  • パッチ式で、face()/area()と書く代わりに、normal()を使って単位法線を求めることができるようになりました。

関数オブジェクト: electricPotential

電場(E)の計算と出力は、以前のキーワード writeDerivedFields に代わって、オプションのキーワード electricField を使用することで有効または無効にすることができます。また、電場(E)の名前は、新しいキーワード E で指定できるようになりました。

関数オブジェクト: yPlus, wallShearStress

yPlusとwallShearStressの両方で、オプションのwriteFieldsフラグが追加され、ボリュームフィールドの出力を無効にできるようになりました。これは、ログに記録された情報のみに関心がある場合に、ディスク容量を節約し、速度を向上させるのに便利です。

パラレル

FOAM_IORANKSの柔軟な取り扱い

  • は、従来のOpenFOAMのリストと同様に、プレーンなリスト(スペースまたはカンマ区切り)も受け付けます。これにより、ジョブスクリプトでの引数の取り扱いが簡単になります。例えば
simpleFoam -ioRanks 0,4,8 ...

simpleFoam -ioRanks '(0 4 8)'  ...

ホストごとにIOランクを選択することも可能である:

simpleFoam -ioRanks host  ...

MPIスレッドのコマンドライン指定

  • MPI_THREAD_MULTIPLE を持つことは、通常、パフォーマンス上好ましくないが、リンクされたライブラリがMPI_THREAD_MULTIPLE を期待する場合には必要な場合もある。mpi-threads コマンドラインオプションを使用すると、MPI_THREAD_MULTIPLE を明示的に指定することができます。

parProfilingの詳細

parProfilingは、より詳細な情報を得るために、異なるMPIオペレーションをより分離するようになった:

  • ブロードキャスト・タイムとリデュース/ギャザー/スキャッター・タイムを分離
  • 一般的な待ち時間とすべての待ち時間の比較
  • リクエストの時間/カウントを他のカウントと分離して、呼び出しカウントをサポートする(他のカウントがマスクされないようにするため)。

有限面積の改善

最小エッジ長のチェックがより一貫性を持ち、小さなエッジの存在下でもロバスターとなった。2次元テンソルの逆変換の取り扱いが改善され,有限面積における最小二乗法がロバスターになった.

メッシュ生成

makeFaMesh

スター "接続の中心や、パッチ面が実際にはバッフルであるために発生する、多重接続された有限面積のエッジを処理するためのヒューリスティックが追加された。

直列の場合、これらの内部エッジはモデル化という点ではかなり疑わしいが、プロセッサーのドメインにまたがって分割されると、かなりの問題を引き起こす。接続性を一意に決定するのに十分な情報があるとは限らないが、エッジを結合するための何らかの救済措置はしばしば可能である。余分な "ぶら下がった "エッジは無視パッチに追いやられ、別々に扱われるようになります。

これらのヒューリスティックは、遭遇したいくつかの問題を解決するものではあるが、さらなる研究が必要である。

メッシュチェック/後処理

checkMesh

  • checkMeshとmakeFaMeshにグローバルトポロジーチェックを追加し、境界パッチがエッジ間で多重接続されている場合にそれを検出するようにした。
  • checkMeshの新しい-write-edgesオプション:トポロジー的に問題のあるエッジをディスクに書き出すことができます。この新機能は有用な診断補助となります(特に、不正なエッジがあっても壊れにくい有限面積メッシュの場合)。

foamToVTK

foamToVTKを-no-internalおよび-no-boundaryオプションで実行すると、フィールドの読み込みと報告がすべて抑制され、速度が大幅に向上する。

フィールドを用いた通常の変換では、ロードされたボリュームフィールドは点補間で再利用するために一時的にキャッシュされる。これにより、入力IOが削減され、実行時間が改善される。

前処理

snappyHexMesh:過剰なバランシングの回避

snappyHexMeshはセルを並列に精錬する際に自動的にメッシュのバランスを取ります。snappyHexMeshDict入力ファイルのcastellatedMeshControlsセクションの新しいコントロールはこの処理を調整するために使用することができます:

  • maxCellUnbalance : [オプション] 絶対的なアンバランス開始トリガー。セル数が少ない場合に、最初の洗練反復でバランシングを回避するために使用される。トリガー値はバランシングをスキップするために使用される:
    • どのプロセッサでも、新しく追加されたセルの数 <= maxCellUnbalance の場合
    • いずれかのプロセッサの場合:(プロセッサの新しいセル数 - 理想的なセル数) <= maxCellUnbalance
  • balanceAtEnd : [オプション] maxCellUnbalanceエントリーがメッシュのアンバランスを引き起こす可能性があるため、メッシュが完全にリファインされた後に強制的にバランシングを行う。
  • (existing) maxLoadUnbalance : ある程度のアンバランスを許容する。

これらの追加制御を用いることで、コア数が多い場合、キャステレーション段階で大幅なスピードアップが実現した。なお、スナッピングとレイヤー追加フェーズは影響を受けない。

Source code

  • $FOAM_SRC/mesh/snappyHexMesh/snappyHexMeshDriver

Merge request

  • MR!607

checkMeshの改良

checkMeshは自動的にプロセッサ・パッチのレポートをフィルタリングしますが、そのプロパティは有用です。このリリースでは、プロセッサ・パッチのフィルタリングは並列実行のみに制限されています。 例として、シリアルで走る:

checkMesh -case processor0 -allTopology -allGeometry

報告:

Checking patch topology for multiply connected surfaces...
    Patch               Faces    Points     Surface topology  Bounding box
    front               2275     2399     ok (non-closed singly connected)   (-0.572 -1 0.007621454194) (-0.17456 1 0.02497405934)
    ..
    procBoundary0to1    101      204      ok (non-closed singly connected)   (-0.19184 -1 -0.008375915288) (-0.17456 1 0.008375915288)
    ".*"                4796     4798     ok (closed singly connected)       (-0.572 -1 -0.02497405934) (-0.17456 1 0.02497405934)

個々のプロセッサ境界のレポートに注意してください。これは、全体の境界面のエントリ(".*")にも含まれます。並列実行の場合、v2212と同様に、プロセッサパッチはリストと全体の境界面から除外されます。

Source code

  • $FOAM_UTILITIES/mesh/manipulation/checkMesh

Issue tracker

  • !698

数値

finiteAreaの新しいキャッシュグラデーションメカニズム

もともと有限体積フレームワークで利用可能だった)勾配キャッシング・メカニズムが、有限面積フレームワークにも適用された。 有効にすると、従属フィールドが変更されたときにのみ勾配フィールドが計算され、後で再利用できるようにメッシュデータベースのメモリに保存されるため、追加コストのかかる再評価を省くことができます。

system/faSolutionファイルでの使用例を以下に示す:

cache
{
    grad(h);
    grad(Us);
}

Source code

  • $FOAM_SRC/finiteArea/finiteArea/gradSchemes/faGradScheme/faGradScheme.H

Merge request

  • MR!611

新しい並列プリコンディショナ

新しいプリコンディショナdistributedDILU, distributedDICは、DILU, DICプリコンディショナにRed-Black型の並列動作のバリエーションを追加したものである。これらの新しいプリコンディショナは、GAMGソルバーの最も粗いレベルを解くのに特に有用である:

p
{
    solver          GAMG;
    // Explicit specify solver for coarse-level correction to override
    // preconditioner
    coarsestLevelCorr
    {
        solver          PCG;
        preconditioner  distributedDIC;
    }
} 

コア数が非常に大きい場合、スケーリングのボトルネックは、最も粗いレベルの解における大域的な削減となる可能性があり、分散プリコンディショナーは、(追加のハロースワップを犠牲にして)掃引量と削減量を減らすことができる。4096コアの大規模な場合:

この性能上の利点は、タイミングに表れている:

preconditioner Execution time
DIC 8687s
distributedDIC 6326s

分散型プリコンディショナの使用は、一般に、計算が大域的なリダクションに束縛される場合にのみ意味を持つことに注意してください。非分散型と比較すると、ハロースイープを追加する代償として、CGスイープ回数(および削減回数)を減らすことができます。少ないコア数では、これは有益ではないかもしれない。CG掃引の回数がとにかく少ない場合、例えば相対公差で解く場合も同様です。

同じ戦略は、他の結合境界条件、例えばサイクリック、サイクリックAMIにも適用できる。前方ループでは、'owner'パッチに対する'neighbor'の効果が含まれ、後方ループではその逆の効果が含まれます。これはcoupledスイッチで切り替えます(デフォルトはon):

solver          PCG;
preconditioner  distributedDIC;
coupled         false;  // do not precondition across non-processor coupled

cyclicAMIの場合、2つのサイドが異なるプロセッサー上に排他的に存在するか、まったく分散されていない必要があるという制限がある。

新しいプリコンディショナーは構築するのにかなりコストがかかるため、線形ソルバー内部にキャッシュされる。これは、GAMG内部の最も粗いレベルの補正ソルバーにのみ影響する。

Source code

  • $FOAM_SRC/meshTools/matrices/lduMatrix/preconditioners/distributedDILUPreconditioner/distributedDILUPreconditioner.H
  • $FOAM_SRC/meshTools/matrices/lduMatrix/preconditioners/distributedDILUPreconditioner/distributedDICPreconditioner.H

References

  • Yousef Saad, Iterative Methods for Sparse Linear Systems (2nd edition)

Merge request

  • MR!608

新しいFPCG線形ソルバー

PCG線形ソルバーの新しいドロップイン代替であるFPCGは、1掃引あたりの削減回数を3回から2回に削減します。これにより、特にGAMG線形ソルバーで最も粗いレベルを解くときに、並列削減がボトルネックになる可能性のあるコア数が大きい場合に、並列スケーリングが改善されるはずです。 このソルバーは、リダクションの数と追加ストレージ/パイプライン量のトレードオフを提供します。これは、ハロースワップとリダクションをオーバーラップさせるPPCGソルバーと比較することができます(しかし、追加のストレージが必要です)。

FPCGは、1つの余分なプリコンディショニングステップを必要とするため、より複雑なプリコンディショナー(例えばGAMG)にとってはあまり有益でない可能性があることに注意されたい。

Attribution

  • OpenCFD would like to acknowledge and thank Alon Zameret of Toga Networks for providing the code and elaborate discussions.

Source code

  • $FOAM_SRC/matrices/lduMatrix/solvers/FPCG/FPCG.C

Merge request

  • MR!601

テンソル反転の処理の改善

テンソルの逆変換は、例えば最小二乗法計算に必要であり、テンソルの値が面内、例えば本質的に2Dである場合には特に厄介です。このような場合は、「安全な」逆変換アプローチによって処理されるようになり、擬似逆変換のようなコストのかかるオーバーヘッドなしにロバスト性が追加されます。この変更は、主にいくつかの有限面積スキームのロバスト性に影響します。

メッシュセル/ポイント計算の改善(高速化)

セルからポイント、またはポイントからセルへのアドレッシングの情報は、異なるアルゴリズ ムに必要とされる。このタイプのアドレッシングは計算するのに比較的コストがかかるので、可能な限りキャッシュされ、不足するアドレッシングを導き出すために再利用される。 これは通常1回限りのコストであるが、キャッシュされた値を無効にするようなトポロジーの変更を伴うメッシュでは、より大きな要因になる可能性がある。アドレッシングを再構築するための更新されたアプローチは、速度を1.4倍から2.4倍に向上させる。

Attribution

  • OpenCFD would like to acknowledge and thank Toga Networks for providing the code and elaborate discussions.
  • issue 2715
  • MR!596

ソルバーと物理モデル

改良されたvanDriest LESデルタモデル

vanDriest LESデルタモデルでは、最も近い壁の特性(y*)が局所的な長さスケールを計算するために使用されます。以前のリリースでは、これらの壁のプロパティは、壁の距離(meshWave)を計算するために同じメカニズムを使用して輸送されていました。このリリースでは、アドレッシングは一度計算され、最も近い壁の情報を直接取得できるようにキャッシュされます。これにより、(余分なストレージを必要としますが)大きなメッシュで非常に大きなスピードアップが得られます。さらに、同じアドレッシングは、fvSchemesの新しいmeshWaveAddressing wallDistメソッドを使用して、壁の距離自体にも使用できます:

wallDist
{
    method meshWaveAddressing;

    // Fetch the nearest wall normal
    nRequired       true;

    // Optional entry delaying wall distance update to every n steps
    // Default is 1 (update every step)
    updateInterval 5;
} 

次の画像は、ExaFoamプロジェクトの一環として実証された、これらの改善による強力なスケーリング性能を示している:

Source code

  • $FOAM_SRC/TurbulenceModels/turbulenceModels/LES/LESdeltas/vanDriestDelta

Resolved bugs

  • !2648

新しいラグランジュ粒子力 クーロン

新しいクーロン有限体積オプション(fvOption)は、電場を評価するためのelectricPotential関数オブジェクトの本質的な基礎的な変更とともに、直径に基づいて粒子に作用する静電気力のモデルを提供します。カップリングは現在一方通行です。 最低限の使用例を以下に示す:

subModels
{
    solution
    {
        interpolationSchemes
        {
            <Ename>      <interpolationScheme>;  // Electric field name
        }
    }

    particleForces
    {
        Coulomb
        {
            q       <Function1<scalar>>;  // Electric charge of particles
            E       <word>;               // Electric field
        }
    }
}

Source code

  • $FOAM_SRC/lagrangian/intermediate/submodels/Kinematic/ParticleForces/Coulomb

Merge request

  • MR!602

新しいfvOption:fanMomentumSource

新しいfanMomentumSource有限体積オプション(fvOption)は、流れに対するファンの作用を表現する運動量ソースを追加します。 まず、セルゾーンを囲む上流側の面を通過する流量が計算される。上流側の面は流れ方向と周囲の面ゾーンを用いて自動的に決定される。続いて、流量の関数としてのファン圧力曲線とファン(測定部)の厚さから圧力勾配を求める。

最小限の使用例は以下の通り:

fan
{
    // Mandatory entries
    type                fanMomentumSource;
    fanCurve            <Function1<scalar>>;
    flowDir             <vector>;
    thickness           <scalar>;
    cellZone            <word>;
    faceZone            <word>;

    // Optional entries
    gradient            <scalar>;
    rho                 <scalar>;
    U                   <word>;

    // Inherited entries
    selectionMode       <word>;
    ...
}

Source code

  • $FOAM_SRC/fvOptions/sources/derived/fanMomentumSource

Merge request

  • MR!604

Attribution

  • OpenCFD would like to acknowledge and thank Vuko Vukcevic of SimScale GmbH for providing the code and elaborate discussions.

新しい fvOption: limitTurbulenceViscosity。

新しいlimitTurbulenceViscosity有限体積オプション(fvOption)は、計算の安定性を高める乱流粘度nutを制限するメカニズムを提供します。 乱流粘性場は、層流粘性に係数を乗じた上限値を適用することで、指定された領域内で補正される:

最小限の使用例は以下の通り:

limitTurbulenceViscosity1
{
    // Mandatory entries
    type            limitTurbulenceViscosity;

    // Optional entries
    nut             nut;
    c               1e5;

    // Inherited entries
    ...
}

Source code

  • $FOAM_SRC/fvOptions/corrections/limitTurbulenceViscosity

改良された剛体運動拘束:軸

軸拘束は、ボディが固定軸の周りにしか回転できないような方向制限を課します。これは、例えばバタフライバルブをモデル化するために、最小回転角度と最大回転角度を追加することで強化されました。 さらに、すべての剛体運動制約がランタイムで調整可能になった。

最小限の使用例は以下の通り:

constraints
{
    constrainRotation1
    {
        sixDoFRigidBodyMotionConstraint     axis;
        axis                                <vector>;

        // Optional entries
        maxClockwiseTheta                   <Function1<scalar>>;
        maxCounterclockwiseTheta            <Function1<scalar>>;
        thetaUnits                          <word>;
        referenceOrientation                <tensor>;
    }
}

Source code

  • $FOAM_SRC/sixDoFRigidBodyMotion/sixDoFRigidBodyMotion/constraints/axis

Merge request

  • MR!613

境界条件

新しい境界条件:鏡面放射

fvDOM放射モデルは、新しいspecularRadiation境界条件を使用して、軸対称および対称面セットアップに適用できるようになりました。 この境界条件の最小限の例を以下に示す:

{
    // Mandatory entries
    type                specularRadiation;

    // Optional entries
    interpolate         <bool>;

    // Inherited entries
    patchType           <word>;
    ...
} 

下図は、4つの異なる形状の内部無次元入射放射の観点から条件を検証したものである:

Source code

  • $FOAM_SRC/thermophysicalModels/radiation/derivedFvPatchFields/specularRadiation

References

  • Standard model:
    • Kumar, P., & Eswaran, V. (2013). A methodology to solve 2D and axisymmetric radiative transfer problems using a general 3D solver. Journal of heat transfer, 135(12). DOI:10.1115/1.4024674

Merge request

  • MR!610

Attribution

  • OpenCFD would like to acknowledge and thank Hitachi Energy for sponsoring the development, and Bernardo Galletti and Marcelo Buffoni for elaborate discussions.

新ユニフォーム混合コンディション

新しいuniformMixed境界条件は、既存のuniformFixedValue境界条件とuniformFixedGradient境界条件を補完するものです。 この条件は混合境界条件を定義するために使用され、値を定義するために関数を使用する。

{
    type            uniformMixed;
    uniformValue    constant 0.2;
    uniformGradient constant 0.2;
    uniformValueFraction
    {
        type  sine;
        ...
    }
}

しかし、境界条件は遅延定義を許可しているため、uniformValueまたはuniformGradientの一方だけを定義し、他のエントリーを暗黙的に定義することも可能である。

uniformMixedで使用される関数には式も含まれるため、この新しい境界条件は、将来非推奨となり削除される既存のexprMixed境界条件のより柔軟な形として使用することができる。

Source code

  • $FOAM_SRC/finiteArea/fields/faPatchFields/derived/uniformMixed

Tutorial

  • $FOAM_TUTORIALS/compressible/rhoPimpleFoam/RAS/TJunctionAverage/0/U

新しい有限領域境界条件

有限面積計算でuniformFixedValue、uniformFixedGradient、uniformMixed境界条件が使用できるようになりました。 これらの境界条件はFinite Areaに関数と式のサポートを追加します。timeVaryingUniformFixedValue境界条件は非推奨となり、将来削除される予定です。

Source code

  • $FOAM_SRC/finiteArea/fields/faPatchFields/derived/uniformFixedValue
  • $FOAM_SRC/finiteArea/fields/faPatchFields/derived/uniformFixedGradient
  • $FOAM_SRC/finiteArea/fields/faPatchFields/derived/uniformMixed

後処理

ラグランジュ関数オブジェクトの改良

ラグランジアン・クラウド・ファンクション・オブジェクトは複数のアップデートを受けた:

  • patchPostProcessingとpatchParticleHistogramは、それぞれの機能をよりよく反映させるために、それぞれparticlePostProcessingとparticleHistogramという名前に変更されました;
  • writeFileサポートが追加され、ファイル出力の制御が改善された。
  • faceZoneのサポートが追加され、パーティクル収集のコントロールが向上しました。

最低限の使用例を以下に示す:

ParticlePostProcessing1
{
    // Mandatory entries
    type                 particlePostProcessing;
    maxStoredParcels     <scalar>;

    // Optional entries
    fields               (<wordRes>);

    // Conditional entries

        // Option-1
        patches          (<wordRes>);

        // Option-2
        faceZones        (<wordRes>);

    // Inherited entries
    // writeFile entries
    ...
}

particleHistogram1
{
    // Mandatory entries
    type                 particleHistogram;
    nBins                <label>;
    min                  <scalar>;
    max                  <scalar>;
    maxStoredParcels     <scalar>;

    // Conditional entries

        // Option-1
        patches          (<wordRes>);

        // Option-2
        faceZones        (<wordRes>);

    // Inherited entries
    // writeFile entries
    ...
}

Source code

  • $FOAM_SRC/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleHistogram
  • $FOAM_SRC/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticlePostProcessing

Merge request

  • MR!595

改良されたファンクション・オブジェクト:力とforceCoeffs

力とforceCoeffs関数オブジェクトは、実行時間を短縮するために最適化されました。 テストによると、以前は複数の力とforceCoeffs関数オブジェクトを使用すると、主に速度勾配の計算とさまざまな内部フィールドに対して実行される冗長な計算が原因で、総実行時間が2~10%の範囲でスローダウンしていた。

例えば、simpleCarチュートリアルのテストでは、速度勾配をキャッシュすることで補完した場合、力関数オブジェクトの実行時間が約3分の1に短縮されることが実証された。

Source code

  • $FOAM_SRC/functionObjects/forces/forces
  • $FOAM_SRC/functionObjects/forces/forceCoeffs

Merge request

  • MR!598

パラレル

parProfiling 関数オブジェクトの改良

並列プロファイリング関数オブジェクト parProfiling の拡張により、プロファイリングを線形ソルバーに制限することができます。この関数オブジェクトは,controlDictで次のように指定します.

functions
{
    // Run parProfiling
    profiling
    {
        libs    (utilityFunctionObjects);
        #includeEtc "caseDicts/profiling/parallel.cfg"
        detail  2;
    }
}

これは、fvSolutionファイル内の新しいparProfilingラッパー・ソルバーの形をとります:

solvers
{
    p
    {
        solver          parProfiling;
        baseSolver      PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0.05;
    }
}

上記の例では、PCG線形ソルバーに対してのみparProfiling関数オブジェクトを有効にしています。この拡張は、GAMGソルバー内の最も粗いレベルの線形ソルバーの効果を見るときに特に便利です。

典型的な出力だ:

parProfiling:
    reduce    : avg = 72.7133s
                min = 2.37s (processor 0)
                max = 88.29s (processor 4)
    all-all   : avg = 14.9633s
                min = 11.04s (processor 5)
                max = 17.18s (processor 4)

例えば、20台のプロセッサーを使ったキャビティ・リッド・ドライブ・チュートリアルのように、異なる線形ソルバーの効果を調べるには、両方を組み合わせることが非常に有効です:

PCG の parProfiling 出力:

reduce    : ..
    ..
    counts  20(14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875 14875)

FPCG の parProfiling 出力:

reduce    : ..
    ..
    counts  20(11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914 11914)

Source code

  • $FOAM_SRC/functionObjects/utilities/parProfiling/parProfilingSolver.H

Tutorial

  • $FOAM_TUTORIALS/IO/cavity_parProfiling

Merge request

  • MR!603

スコッチ - マルチレベル分解をサポート

multiLevel分解法は、ノード内(より高速な通信を使用)よりもノード間カット(低速な通信を使用)の量を優先的に制限するために使用することができる。この機能は、重みのセットを指定することで、スコッチ(ptscotchではない)分解法にネイティブに存在するようになった:

method              scotch;
numberOfSubdomains  2048;
coeffs
{
    // Divide into 64 nodes, each of 32 cores
    domains (64 32);
    // Inside a nodes the communication weight is 1% of that inbetween nodes
    domainWeights (1 0.01);
}

あるいは、そのレベルの重みを1として、第1レベルの分解を省略することもできる:

method              scotch;
numberOfSubdomains  2048;
coeffs
{
    // Divide into 2048/32=64 nodes
    domains (32);
    // Inside a node the communication weight is 1% of that inbetween nodes
    domainWeights (0.01);
} 

下の画像は、20x20の単純なメッシュを32分割したものである:

マルチレベル・メソッドと比較すると、次のようになる。

  • multiLevelサブセットは、各第1レベルの分解を第2レベルに分解する。セル数が多くなると、これがボトルネックになる。
  • multiLevelメソッドで時々起こるような、過剰な数のプロセッサ・パッチを作成することを避けることができる。

残念なことに、この機能は外部のptscotchライブラリには実装されていない。いったん利用できるようになれば、ptscotch分解メソッドに追加するのは簡単だ。

Source code

  • $FOAM_SRC/parallel/decompose/scotchDecomp/scotchDecomp.C

Merge request

  • MR!599

ノンブロッキング線形ソルバー

並列で実行する場合、線形ソルバーは、受信したデータを使用して境界条件('インターフェース')を更新する前に、すべての通信が終了するのを待ちます。このため、通信の1つが他の通信より遅い場合、ボトルネックになることがあります。例えば、接続が遅い、インターフェイスの面が多いなどです。 これを避けるために、インターフェイスのポーリングを有効にし、インターフェイスが 「ready」になったときにインターフェイスの更新を実行するnPollProcInterfaces最適化スイッチが導入された。このスイッチは、一定の反復回数(その後にブロッキング待ちが続く)か、ポーリングのみの場合は「-1」(新機能)である:

etc/controlDictまたはローカルシステム/controlDictで、nPollProcInterfacesを-1に設定する:

OptimisationSwitches
{
    // Fixed or infinite (-1) number of polling iterations
    nPollProcInterfaces -1;
}

一般論として:

  • 十分なローカルワークがある場合、つまりプロセッサインターフェースの解を追加する場合、通信とオーバーラップさせることに意味がある場合に使用する。GAMGの最も粗いレベルでは、これは当てはまらない。
  • プロセッサ・インターフェースの最小サイズと最大サイズ、つまり面の数に大きな差がある場合に使用する。これは、幾何学的分解法などではあり得るが、スコッチなどの位相分解法では一般的ではない。

大きな欠点は、解の追加順序が非決定的になり、例えば、pitzDaily非圧縮チュートリアルを(悪い)ソルバーの組み合わせで実行すると、切り捨て誤差に影響することです:

p
{
    solver          PCG;
    preconditioner  diagonal;

    tolerance       1e-06;
    relTol          0.1;
}

は、100回の繰り返しで顕著な解の違いを生み出す:

  • ポーリングなし:
    diagonalPCG:  Solving for p, Initial residual = 0.012452, Final residual = 0.0012432, No Iterations 162
  • ポーリング:
    diagonalPCG:  Solving for p, Initial residual = 0.012544, Final residual = 0.0012536, No Iterations 301

マスターコースター凝集の改善

多くのコアでGAMGを実行する場合、PCGなどの最も粗いレベルのソルバーがスケーリングのボトルネックになる可能性があります。これを回避する1つの方法は、粗いレベルの行列をより少ない、あるいは1つのプロセッサに集約することです。これは、プロセッサの行列を集めて、プロセッサ間の境界をすべて内部の面に置き換えた、単一の大きな行列を作成するものです。これにより、通信は回避されるが、この凝集行列を解くプロセッサの計算コストが増加する。例えば、元の凝集が10000個のプロセッサで1セルまでだった場合、凝集した行列は少なくとも10000個のセルを持つことになり、これを解くことがボトルネックになる可能性がある。 この開発では、masterCoarsestプロセッサーのアグロメレーションは、ローカルアグロメレーションを再スタートして、10000セルをより少ないセルに戻すことができる。この新しい動作はfvSolutionの新しいパラメータnCellsInMasterLevelによってトリガーされる。

p
{
    solver          GAMG;
    ..
    smoother        GaussSeidel;

    //- Local agglomeration parameters
    nCellsInCoarsestLevel   1;

    //- Processor-agglomeration parameters
    processorAgglomerator   masterCoarsest;
    //- Optionally agglomerate after processor-agglomeration
    nCellsInMasterLevel     1;
}

結果

単純なテストケースとして、pitzDailyチュートリアルを15プロセッサで並列実行するように修正しました(分解方法としてscotchを使用)。masterCoarsestを使用し、凝集の再起動を行わない場合、最初の反復は次のようになります。

DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 0.0788583, No Iterations 6
DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 0.0150588, No Iterations 6
..
DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 0.0105486, No Iterations 6
GAMG:  Solving for p, Initial residual = 1, Final residual = 0.0759038, No Iterations 24

nCellsInMasterLevel 1:

DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 0, No Iterations 1
DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 1.11661e-16, No Iterations 1
..
DICPCG:  Solving for coarsestLevelCorr, Initial residual = 1, Final residual = 0, No Iterations 1
GAMG:  Solving for p, Initial residual = 1, Final residual = 0.0799836, No Iterations 24

Source code

  • $FOAM_SRC/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGProcAgglomerations/masterCoarsestGAMGProcAgglomeration/masterCoarsestGAMGProcAgglomeration.H

Merge request

  • MR!600

並列(MPI)処理の全般的な変更

最近のexaFOAMの活動から得られた知見により、OpenFOAMのPstreamライブラリ(MPIインターフェース)の低レベルの改良と、コードベース全体の通信ボトルネックを低減するためのアルゴリズムとコードの変更が多数行われました。しかし、これらの変更のほとんどは、大規模シミュレーションにおいてのみ効果が現れます。アルゴリズムの変更の一部は*プレビュー*の変更とみなされるため、デフォルトでは有効ではなく、設定スイッチによって有効になります。 コード開発者向けに、MPIリクエストとコミュニケータの取り扱いが拡張され、独自の並列アルゴリズムを書く際に、より柔軟に対応できるようになりました。ノンブロッキングコンセンサス交換(NBX)を使ったサイズ交換の取り扱いが、 全対全交換のドロップイン置き換えとして提供されます。

ユーザビリティ

新しい文書システム

以前の拡張コードガイドはDoxygenベースのシステムからnanocベースのシステム(Gitlab.comで使われているのと同じシステム)に移行され、コミュニティ貢献のために公開されました。新しいコンテンツはhttps://doc.openfoam.com:

  • v2306: https://doc.openfoam.com/2306/
  • v2212: https://doc.openfoam.com/2212/ (old release)

このサイトは新しいルック&フィールで、クイックスタート、多くの新しい境界条件、熱物理モデル、ノイズを含むツールなど、大幅なコンテンツ更新が行われた!

コンテンツはhttps://gitlab.com/openfoam/documentation。継続的に進化しており、さらなるアップデートが予定されている。

プルリクエストも喜んでお受けします!

表現の変更

式の評価関数にnormal()が追加されました。これはメッシュ面の単位法線を返すもので、face()/area()より少ない操作でよりロバストなものとなります。