OpenFOAM v2112 リリースノート

ESI OpenCFD リリース OpenFOAM® v2112

OpenCFDは、2021年12月にOpenFOAM® v2112をリリースすることをお知らせします。このリリースでは、コードの多くの領域でOpenFOAM-v2106の機能を拡張しています。新機能は、OpenCFDのお客様がスポンサーとなった開発、内部資金による開発、OpenFOAMコミュニティからの機能および変更の統合を表しています。

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

  • Ubuntu Linux: Ubuntu 20.04 (LTS), 18.04 (LTS), 21.10, 21.04, 20.10 用パッケージインストール。
  • openSUSE Linux: Leap15.3、Leap15.2用のパッケージインストールです。
  • Redhat Linuxのバリエーション:CentOS/Rocky 8、7およびFedora 35、...用のパッケージインストール。

Windowsユーザーは、プリコンパイルされたパッケージの3つのオプションがあります(詳細)。

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

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

アップグレード

入力ディクショナリー

新しい#messageディレクティブ

新しい#message辞書ディレクティブは、stderrに展開された文字列の内容を報告することができます。これは、ログファイルに抽出情報を追加する場合や、より複雑な辞書をデバッグする場合に便利です。例えば

T
{
   solver          PBiCG;
   preconditioner  DILU;
   tolerance       1e-10;
   relTol          0;
   #message "Using solver: $solver"
}

新しい#wordディレクティブ

word辞書指示文は、他の辞書要素に基づいて辞書名や他の項目を作成する簡単な手段として使用することができる。内容は文字列として展開され、有効な単語として辞書に追加される。いくつかの例を挙げる。

#word "some_prefix_solverInfo_${application}"
{
    type    solverInfo;
    libs    (utilityFunctionObjects);
...
}

または、複数行の入力として(単語以外の文字を自動的に絞り込むため)。

#word {
   some_prefix_solverInfo
   /* Appended with application name (if defined) */
   ${application:+_}  // Use '_' separator
   ${application}     // The application
}
{
    type    solverInfo;
    libs    (utilityFunctionObjects);
    ...
}

正規表現用埋め込み接頭辞の拡張

マッチング時に大文字/小文字を無視する正規表現用の接頭辞 (?i) に加え、マッチングを否定する接頭辞 (?!) も用意できるようになりました。また、両者を組み合わせることも可能です。以下はその例です。

// Anything that does not contain "processor":

    "(?!).*processor.*"


// Anything that does not start with "wall" or "Wall" etc (ignoring case):

    "(?!i)wall.*"

ファンクションオブジェクト

参照関数オブジェクト

参照関数オブジェクトが拡張され、任意のFunction1入力を参照値として受け入れるようになり、refValueが必須項目となりました。以前の挙動を回復するために

  • 基準値がない場合は、単純にゼロのノーハウを指定する。
refValue zero;
  • 指定した位置に基準値がある状態で、新しいサンプル関数オブジェクトを使用します。
refValue sample;
position (x y z);

コンフィギュレーション

  • WM_COMPILE_CONTROL 環境を使用して、どのコンパイラ変種を使用するかを指示できるようになりました。いくつかの例については、ビルドチューニングを参照してください。
  • コマンドラインで指定する-opt-switchは、浮動小数点値も適切に扱えるようになりました。例えば

decomposePar -opt-switch maxThreadFileBufferSize=2e10 -fileHandler collated

環境

ライブラリパスの順序が変更されました。以前は、OpenFOAMのライブラリパスはMPI固有の要素を追加する前に設定されていました。しかし、これでは一部のライブラリがマスクされてしまうことが判明しました。

この更新された命令が特定のインストールに悪影響を及ぼす可能性があるため、異なる命令を並べたものを以下に示します。

New library order Old library order
user-lib (serial) various 3rd-party
site-lib (serial) foam-lib (mpi)
foam-lib (mpi) ext-lib (mpi)
foam-lib (serial) system mpi-libs
ext-lib (mpi) user-lib (serial)
ext-lib (serial) site-lib (serial)
various 3rd-party foam-lib (serial)
system mpi-libs ext-lib (serial)
dummy dummy

その他の変更点

ボックス選択(検索可能なボックス、boxToCell、boxToFace、boxToPoint)のmin/spanをmin/maxの代わりに扱う。

前処理

潜在的な変更点

runTime 選択機構の更新の一部として、以前の typedef は、古い typedef 名に Type を追加して、コンテンツとストレージのタイプをよりよく区別するように変更された。この一見見栄えのする変更は、シングルトン・メソッドとして使用するために古い名前を解放するため便利であった。しかし、派生コードがまだ古い typedef を使用している場合、潜在的に問題を引き起こす可能性がある。

壊れたコードの一例。

    dictionaryConstructorTable::iterator cstrIter =
        dictionaryConstructorTablePtr_->find(modelType);

些細な「アップグレード」は、単にイテレータタイプをc++11のautoキーワードに置き換えることです。例えば

    auto cstrIter = dictionaryConstructorTablePtr_->find(modelType);

注:この変更は、過去5年以上のすべてのOpenFOAMのバージョン/バリエーションで有効です。

ランタイム選択テーブルの処理の簡略化

RunTime選択(Newファクトリーメソッドなど)の処理を効率化するため、選択テーブルがシングルトンアクセサになり、互換性エイリアスの使用をサポートし、処理を大幅に簡素化しました。

新しいアクセスメソッドの例。ここでは、コンストラクタを表す接頭辞として ctor を使用しています。

    auto* ctorPtr = dictionaryConstructorTable(modelType);

    if (!ctorPtr)
    {
        ... error handling
    }

    return autoPtr<myModel>(ctorPtr(dict, ...));

これは、古いスタイルよりも雑然としていて、まだ機能しますが、互換性(エイリアス)の処理がありません。

    auto ctorIter = dictionaryConstructorTablePtr_->cfind(modelType);

    if (!ctorIter.found())
    {
        ... error handling
    }

    return autoPtr<myModel>(ctorIter()(dict, ...));

新しいリストメソッド

サブリストアクセス

SubListやSubFieldは、ListやFieldのサブセクションを表示したり操作したりするのに頻繁に使用されます。ListとFieldの新しいsliceメソッドは、substrに似た構文を使用し、SubList/SubFieldを返します。ここでは、オフセットが最初で、サイズが2番目です。例えば

auto data1 = allData.slice(0, 10);  // The first 10 elements
auto data2 = allData.slice(10);     // Remaining elements

長さの指定がない場合は、「残りのすべての要素」と同等とする。

スライスされた部分は、通常のlabelRange(開始とサイズのペアを表す)で選択することもできる。例えば

labelRange range(...);

fullList.slice(range) = identity(range.size());

// And
fullList.slice(range) = UIndirectList<T>(other, addr);

ノーコピーリサイズ

操作の前にリストのサイズを調整する必要があることがよくありますが、古い値は (もしあれば) 興味のないもので、常に新しい値で上書きされる可能性があります。このような場合、通常の resize や setSize メソッドは無駄が多いので、resize_nocopy や reserve_nocopy を使用することができます。これらは中間リストのオーバーヘッドと古い値を保持するためのコピー/移動のオーバーヘッドを避けることができます(これらはいずれにせよその後破棄されます)。

    //OLD: field.resize(newLength);

    field.resize_nocopy(newLength);

連続したデータアクセス方法

特に、外部コードとのインターフェイスやMPI通信では、連続したデータを直接扱うのが一般的です。新しい List メソッド data_bytes() と cdata_bytes() は、連続したデータのポインタとサイズを渡すための size_bytes() メソッドを補完します。例えば

UOPstream::write
(
    UPstream::commsTypes::nonBlocking,
    proci,
    sendBufs[proci].cdata_bytes(),
    sendBufs[proci].size_bytes(),
    tag,
    comm
)

パラレルギャザー・スキャッタールーチン

MPI gather/scatter ルーチン、globalIndex gather メソッドの追加。

  • UPstream::mpiGather (MPI_Gather) - Pstream::listGatherValues で使用されます。
  • UPstream::mpiScatter (MPI_Scatter) - Pstream::listScatterValues で使用されます。

これらは、固定サイズの連続したデータ型(例えば、プリミティブ、単純なペアなど)の収集/散乱のためのより単純な形式です。

gather フォームで、マスタープロセス上に収集した値のリストを作成する。サブランクはリストサイズが0である。

同様に、scatterは値のリストを各プロセス上の単一の値に分散させる。

の代わりに

    labelList sendSizes(Pstream::nProcs());
    sendSizes[Pstream::myProcNo()] = sendData.size();
    Pstream::gatherList(sendSizes);

書ける

    const labelList sendSizes
    (
        UPstream::listGatherValues<label>(sendData.size())
    );

    // Less code, lower overhead and list can be const.

個体値のみの散布の場合。代わりに

    labelList someValues;
    if (Pstream::master()) someValues = ...;

    Pstream::gatherList(sendSizes);
    const label localValue
    (
        someValues[Pstream::myProcNo()]
    );

書ける

    labelList someValues;
    if (Pstream::master()) someValues = ...;

    Pstream::gatherList(sendSizes);
    const label localValue
    (
        UPstream::listScatterValues<label>(someValues)
    );

listGatherValues を混ぜてマスターでリストを作成し、Pstream::scatterList を使って配布することもできます。

globalIndexの柔軟性を向上させました。

  • データ収集の際、ローカルサイズを正しく尊重することで、マスターエレメント0での収集に対応します。
  • ローカルサイズからの追加作成。生の値を扱う場合、一般に、サイズを組み立て、globalIndex に対応するオフセットを決定させる方が簡単で安全です。
  • アクセス範囲を反復するために globalIndex const_iterator を追加しました。これにより、List の slice() メソッドを使用して、List のサブセクションにアクセスしたり操作したりするのがよりシンプルになります。

例えば、こんな感じです。

    scalarField allValues = ...;
    globalIndex procAccess = ...;

    for (const labelRange& range : procAccess)
    {
        someOutput(allValues.slice(range));
    }

メモリーハンドリング

refPtr と tmp クラスの一貫性の改善,参照の浅いコピーのサポート,チェックの改善.浅いコピーにより,シャドウされた変数で HashTable を構築することができます(共有ポインタのセマンティクスに似た考え方です).

good()とvalid()メソッド、および直接のboolテストは、メモリクラスで同じように動作します。

refPtr と tmp のための明示的な is_const() チェック・メソッド。これらは、is_pointer() や movable() チェックと組み合わせて使用することで、ハンドリングの絞り込みやメモリの再利用が可能です。

autoPtr と std::unique_ptr との一貫性を保つために、refPtr に release() メソッドを追加しました。

精度アダプタは変更可能で、異なるコンテンツをラップする際に (refPtr コンテナと同様に) 再利用することができます。これをサポートするために、アダプタがスコープ外に出るのを待つのではなく、コンテンツがコピーバックされるときの制御が追加されています。たとえば

if (adaptor.active())
{
    adaptor.commit();
    adaptor.clear();
}

ストリームなど

現在のケースから相対的にオブジェクト/ストリーム名を返す様々なメソッドを追加し、よりコンパクトで読みやすい出力を生成します。

  • IOobject : objectRelPath()
  • IOstream : relativeName()
  • dictionary : relativeName()

Timeやその他のケース固有の参照から分離された機会関数については、argList::envRelativePath()静的メソッドが利用可能です。

数値

ソルバーと物理モデル

バウンダリーコンディション

後処理

パラレル

ユーザビリティ