OpenFOAM v2212 リリースノート

2022年12月24日 (土) 11:16時点におけるMmer547 (トーク | 投稿記録)による版

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

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

Ubuntu Linux: Ubuntu 22.04 (LTS), 20.04 (LTS), 18.04 (LTS), 22.10 用のパッケージインストール。

openSUSE Linux: Leap15.4、Leap15.3用パッケージインストール。

Redhat Linux variants: CentOS/Rocky 8, 7 および Fedora 37, 36, 35, ...用のパッケージインストール。

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

Windows Subsystem for Linux(Ubuntu、openSUSEなどベース)を使用する。

クロスコンパイルされたネイティブな実行ファイル

dockerによるインストール

OpenFOAMのコンテナサポートは、プリ・アセンブルされたイメージではなく、記述ファイルによって提供されます。

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

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

v2212 User Upgrade Guide

行動の変化

timeActivatedFileUpdate(タイムアクティベートファイルアップデート

timeActivatedFileUpdate では、ファイルが見つからない場合、Critical エラー (FatalIOError) として扱われるようになりました。以前は単純なエラー (FatalError) として扱われ、functionObject をロードするときのみ Warning にダウングレードされ、設定エラーに気づかないことを意味しました。

Spalart-Allmaras DESモデル

SpalartAllmarasベースのDESモデルでは、以前アクティブであったft2項はデフォルトで非アクティブになりました。その活性化は、新しいオプションのft2項(デフォルトではfalse)を使って管理することができます。

Input Dictionaries

力、力係数

binModels、forceの優先順位をより一貫して取り扱うようにしました。ディクショナリーがオーバースペックな場合、CofR ショートカットよりも高い優先順位を coordinateSystem エントリーに与えるようにしました。

合理化改善

流線形の取り扱いの一部がさらに改良されました(例:補間におけるx/y/zの代わりにバリセントリック座標)。その過程で、入力要件が緩和されました。

  • デフォルトのトラッキング方向は'forward'です。
  • U(速度)フィールドはサンプリングされたフィールドに名前を付ける必要がありません。

座標系の扱いを改善

座標系定義がサブディクショナリースコープ内に組み込まれている場合、原点キーワードはオプションになりました。例えば

dict1
{
    coordinateSystem
    {
        origin (0 0 0);  // now optional here
        rotation ...;
    }
}

しかし、サブディク トなしで構築された場合は、必須であることに変わりはない。例えば

dict2
{
    origin (0 0 0);   // still mandatory
    e1  (1 0 0);
    e3  (0 0 1);
}

この変更により、transform サブディクショナリはより自然に記述できるようになりました。

formatOptions
{
   vtk
   {
       scale 1000;  // m -> mm
       transform
       {
           rotationCentre  (1 0 0);
           rotation axisAngle;
           axis    (0 0 1);
           angle   -45;
       }
   }
}

ヒストグラムの非推奨項目

setFormat と formatOptions の項目は,ヒストグラム関数オブジェクトから静かに非推奨とされました.

ユーティリティの推移

transformPointsとsurfaceTransformPointsのオプション名を更新しました。

新しいオプション -auto-centre と -centre は、それぞれ -auto-origin と -origin を置き換えます(古いオプションも互換性のあるエイリアスとしてまだ受け入れられます)。centerre に変更することで、座標系 origin() との意味の混同を避けることができます。

effectivenessHeatExchangerSource

The effectivenessHeatExchangerSource fvOption has been renamed to heatExchangerSource. Its previous behaviour can be recovered by using the heatExchangerSource with the submodel of effectivenessTable.

histogram

ヒストグラム関数オブジェクトがリファクタリングされました.以前の動作は,equalBinWidthのサブモデルでヒストグラムを使用することで回復できます.また,タイムステップごとの出力ファイルが1つの出力ファイルに置き換えられました.

v2212 Developer Upgrade Guide

潜在的な破壊的変化

ツリーデータ項目

Octree 処理への更新の一部として、様々な treeData アイテムは、データの完全または部分的なサブセットを一貫して処理するようになりました。この結果、直接アクセスメソッドである cellLabels(), faceLabels(), edgeLabel() を使用するコードは、おそらく破損します。

  • 要素をサブセットせずに treeData xxxLabels() メソッドを使用することは常に安全ではありませんでした。しかし、様々なクラス (treeDataCell, treeDataEdge, etc) が自動的に ID ルックアップを提供するため、この問題は明らかではありませんでした。
  • 元のインデックスへの参照を安全に解除するには objectIndex(label) を、元のオブジェクトへの参照を解除するには operator[](label) を使用します。treeDataEdge では、幾何学的データを取得するために line(label) 便利なヘルパーがしばしば好まれます。

オプションの辞書 readEntry

いくつかの特殊なケースでは、辞書のreadEntryをオプションにすると便利なことがある。たとえば

dict.readEntry("key", keyType::LITERAL, false);

// Same as
dict.readIfPresent("key", keyType::LITERAL);

しかし、boolean引数はしばしば管理が混乱し、その意味を思い出すためにドキュメントを参照する必要があります。時には、(true|false|maybe) という非二項対立の論理を扱いたいこともあります。これを管理するために、軽量な IOobjectOption というオプションの束が導入され、IOobject からもアクセスできるようになりました。これにより、以前の readEntry は次のように変形します。

dict.readEntry("key", keyType::LITERAL, IOobject::READ_IF_PRESENT);

デフォルト以外のオプションを持つreadEntryが稀であることから、この変更によって既存のユーザーコーディングが大きく崩れることはないと思われます。

ISstreamへのストリームリネームの制限

  • non-constアクセスは、以前はトップレベル(IOstream)で宣言されていたため、ファイルを開いた後にOFstream::name()などを変更することが可能で、開いた基礎ファイルと矛盾が生じることがありました。 名前の変更をISstream(およびITstreamのカウンターパート)に制限するようにしました。既存の有効なコードには影響を与えません。

非推奨のメソッド

PtrList::operator()(label)

PtrList::operator()(label) メソッドは対応するリストアイテムへの const ポインタを返します。これは,コーディングの意図をより明確に表現する他のアクセスメソッドでも同様に行うことができます.

  • get(label) : 一意性ptrと同じネーミング
  • set(label) : 伝統的なチェックの名前ですが、視覚的に2パラメータ版と混同されることがあります。
  • test(label) : bitSet, boolList, labelHashSet に準じた命名。

writeFile

createFile メソッドは、以下の理由で非推奨となっています。

  • newFileAtTime(const word&, scalar) : same with createFile(const word&, scalar)
  • newFileAtStartTime(const word&) : same with createFile(const word&)

ベースクラス/コンテナの改良

General

メソッド名をより親しみやすいSTLメソッド名に揃える最初の取り組みです。これにより、名前の親しみやすさが増し、異なるC++コードベース間で移植する際に役立つことがあります。

  • std::vector との類似性を調整したリストコンテナ
    • front(), back() methods
    • push_back() method for containers that already had append().
    • pop_back() method
  • LinkedList コンテナ。std::list との類似性を調整。
    • front(), back(), push_front(), push_back(), pop_front() methods

Foam::string and Foam::fileName

C++23 std::string に追加されるのと同じメソッドに相当する、新しい string::contains() コンビニエンスメソッドを追加しました。例えば

if (keyword.contains('/')) ...

if (keyword.find('/') != std::string::npos) ...

いくつかのfileNameメソッドが追加され、std::filesystem::pathとの類似性が調整されました。

  • stem(), replace_name(), replace_ext(), remove_ext() etc

PtrList

PtrList::get(label) と PtrList::set(label) メソッドは内部境界チェックを含むようになり,境界外へのアクセスに対しては nullptr を返すようになりました.この追加チェックは些細なオーバーヘッドですが、HashPtrTable や autoPtr などと対称的な get() のフェイルセーフな振る舞いを提供し、UPtrList、PtrList、PtrDynList の set(label) メソッドを整列させることができるようになりました。

HashPtrTable

HashPtrTable のセットメソッドが refPtr/tmp をサポートするようになり、さらに柔軟性が増しました。

FixedList

テンプレート化された get<unsigned>() メソッドが追加され、FixedList のコンパイル時のインデックス付けが高速になりました(インデックスが無効な場合はコンパイラエラーが発生します)。これにより、noexceptアクセスが可能になり、他の様々な用途(例えば、triFace、triPoints、...)に伝播することができるようになった。

MinMax

  • MinMax コンテナで、シングルまたはダブル・パラメータを取る reset() メソッドがサポートされるようになりました。これは、フル・リセットの後に add() を実行するよりも便利です (そして、わずかに効率的です)。
  • オーバーラップ(overlaps)と同様に動作するが、両端の排他的チェックを行うMinMax intersects()クエリを追加しました。
  • 新しい MinMax::operator&=() は、2つの最小-最大範囲の和を実行します。この演算子は、intersects()クエリと名前が似ていて紛らわしい、未使用のintersect()メソッドを置き換えるものです。

IOstreams

OFstreamのアトミックファイル作成に対応

IOstreamOption::ATOMIC 列挙は、OFstream を構築する際のディスパッチタグとして使用することができます。この形式では、書き込みのための中間ファイルが作成されます。ストリームが閉じられるときだけ、この中間ファイルは実際の出力名に移動/リネームされます。これにより、ファイルの書き込み中にシミュレーションがクラッシュした場合でも、部分的なファイル(破損したファイル)を避けることができ、安全です。名前の最後を~tmp~とすることで、OpenFOAM内でバックアップファイルとして扱われ、再起動時にはロードされないようになります。

列挙された追記・非追記オープンファイル

  • IOstreamOption::APPEND と IOstreamOption::NON_APPEND の列挙を使用すると、boolean パラメータよりも明確である。既存のユーザーコーディングに影響を与えることはないだろう。

簡略化されたストリームコンストラクタ

  • IOstreamOption の導入 (OpenFOAM-v1806 で追加) により、トップレベルストリーム (例: IFstream, OFstream) が内部 IOstream の「バージョン」 (例: version: 2.0) についての追加情報を必要とするケースがなくなったため、これらのコンストラクタ形式が削除されました。 これにより、指定したフォーマット/圧縮/付加の組み合わせでファイルを開くことができ、バージョンの指定に煩わされることがなくなります。

IOobjectOption, IOobject

IOobjectの作成は、通常、次のような内容です。

IOobject io
(
    "foo",
    runTime.timeName(),
    mesh,
    IOobject::MUST_READ,
    IOobject::NO_WRITE,
    false  // do not register
);

末尾の "do not register "コメントは、呼び出しパラメータが実際には自己文書化されていないことを示しています。典型的なオプションは IOobjectOption のセットで列挙されるようになった。register/no-register が適切に列挙されるようになったので、このような呼び出しができるようになった。

IOobject io
(
    "foo",
    runTime.timeName(),
    mesh,
    IOobject::MUST_READ,
    IOobject::NO_WRITE,
    IOobject::NO_REGISTER
);

また、様々なオプションは、明示的または暗黙的にバンドルすることができる。

IOobject io
(
    "foo",
    runTime.timeName(),
    mesh,
    { IOobject::MUST_READ, IOobject::NO_REGISTER }
);

IOobjectOption

IOobjectOption クラスは、objectRegistry などに依存しない軽量な処理のために、読み取り/書き込み、ストレージフラグをカプセル化しています。また、辞書の読み込みのための読み込み制御情報を提供するために使用することができ、さらなるサブ依存を導入することはありません。

  • isReadRequired() と isReadOptional() のために IOobjectOption (または IOobject) クエリを追加しました。これらは MUST_READ, MUST_READ_IF_MODIFIED, READ_IF_PRESENT のテストをカプセル化し、利便性と散らかりにくさを実現しています。例えば
    if (isReadRequired() || (isReadOptional() && headerOk()))
    {
        ...
    }

むしろ長く、繰り返される形。

    if
    (
        (
            readOpt() == IOobject::MUST_READ
         || readOpt() == IOobject::MUST_READ_IF_MODIFIED
        )
     || (readOpt() == IOobject::READ_IF_PRESENT && headerOk())
    )
    {
        ...
    }

きめ細かな辞書の読み込みを可能にするIObjectOption

以前は、辞書エントリーの読み取りを高度に制御するための 'mandatory' (bool) がありましたが、呼び出し側のコードでは追加のコードコメントがないと意味が不明でした。

IOobjectOption::readOption を代わりに使用することで、さらなるオプション (たとえば NO_READ) が可能になり、true/false の bool フラグよりもコード内の目的がより明確になります。

これはマイナーなブレークダウンです(使用頻度が低く、高度な使用法のみ)

ジオメトリ処理の改善・最適化

このバージョンでは、幾何学的な実体を扱う際に便利なメソッドが多数追加されています。

General

  • ヘッダ定義の統一やパススルー方式の増加により、四面体や三角形の取り扱いを簡素化しました。
  • triFace / triangle などの一貫したメンバアクセス。頂点/点に a(), b(), c() のようにアクセスできる。
  • 三角形に、よく使われる計算のための静的な center() と areaNormal() および unitNormal() メソッドが追加されました。

box()

meshShapes (cell,edge,face,triangle,...) に、Pair<point> を返す低レベルの bound box() メソッドを追加しました。これらの抽出された幾何学的限界は、boundBoxに依存することなく使用することができます。

mesh cellBb()

primitiveMesh cellBb()メソッドを追加しました。これは、最も安価な計算を使用して、指定されたメッシュセルのバウンドボックスを返します。

  • は、すでに利用可能であれば、cellPoints を使用する。これは、最小/最大比較の回数が最も少ないからである。
  • またはセル面を歩く:セルボックス()メソッドを介して、需要駆動型のセルポイントなどを作成しないようにします。

patch sphere(facei)

PrimitivePatchに、与えられたパッチ面を囲む外接球(原点+半径の2乗)を返すsphere(facei)メソッドを追加しました。

ベクター方式の追加

ジオメトリを扱う場合、点の比較は非常に頻繁に発生します。これらは Foam::vector 内の直接メソッドとしてバンドルされるようになりました。

  • mag() : ベクトルの長さ (L2-ノルム)を指定します。
  • magSqr() : ベクトルの長さ(L2-norm)の二乗。
  • dist(const vector&) : 別のベクトルからの L2 ノルムの距離
  • distSqr(const vector&) : 別のベクトルからの L2 ノルムの距離の二乗を返します。

これらの方法は、より簡潔で、中間的な変数を避けることができます。例えば

if (a.distSqr(b) < tol) ...

// vs.
if (magSqr(b - a) < tol) ...

新しい vector::less_xyz() vector::less_yzx() および vector::less_zxy() 比較メソッドは、辞書式ソートに便利です。

boundBox()、treeBoundBox()の処理。

boundBox()、treeBoundBox()クラスを若干整理し、以下のように一部拡張しました。

  • 追加の構築およびリセット・メソッド。
  • null() 静的メソッド : invertedBoxへのconst参照として(適切なキャストで)。
  • grow() メソッド : ボックスを絶対量だけ拡張します。
  • inflate(random) : treeBoundBox::extend のインプレース版。
  • boundBox::hexCorners(), boundBox::hexFaces() : hexCell に対応する点/面を明確に指定するためのものです。
  • boundBox::addは、プリミティブメッシュ形状から抽出されたエッジや「ボックス」を追加するときに、点のペアを使用します。

オクツリーの改良

ループ内でのメモリ効率を上げるため、結果を外部記憶するオクツリー findBox(), findSphere() を追加しました。単純なテストでは、octree overlaps() を使用することができます。これは、findBox(), findSphere() と同様に動作しますが、いずれかの形状が重なり合った場合、早期に終了します。

treeDataの改良

サブセットとインターフェースの全体的な整合性を向上させるための変更。

  • サブセット/非サブセットのバージョンを確実に堅牢に処理するために、統一された内部ゲッターを持つサブセット/非サブセット・コレクションの使用を拡張してください。
  • 演算子と objectIndex(label) で、サブセットの有無にかかわらず、基礎となる項目、つまり元のインデックスに標準的にアクセスできるようになります。
  • centres()とcenter(label)は、代表的な点群情報である。
  • nDim() はオブジェクトの次元数 (0: 点、1: 線、など) を返す。これらは、それぞれの形状がどの程度「太い」のか、また bounds(labelList) が何らかの有用な情報を提供するかどうかを判断するために使用される。
  • bounds(labelList) は、特定のアイテムに必要な完全なバウンドボックスを返します。例えば、様々な3Dセルに対する全体的な境界。
  • 静的ヘルパー : boxes() と bounds()


MPI(Pstream)メソッドの更新

このリリースでは、より多くのケースでネイティブMPIルーチンが使用されるようにコードの調整が行われていますが、一部のPstream(MPI)メソッドを簡素化するための変更も含まれています。

  • ルーチンの呼び出しを簡素化するために、いくつかの UPstream メソッドに内部 parRun ガードを追加しました。
  • MPIリダクションのネーミングをより一貫したものにしました。
ユニファイドネーム 旧名称
combineReduce combineAllGather
listCombineReduce listCombineAllGather
mapCombineReduce mapCombineAllGather

ダイレクトMPIおよび/またはリダクション

MPI_LAND および MPI_LOR intrinsics のダイレクトラッパーとして UPstream::reduceAnd および UPstream::reduceOr が追加されました。これらは、論理演算のための特別な目的の returnReduce で再利用されます。

MPI bool オペレーションを使用すると、ベンダー/ハードウェアによる MPI の最適化が可能になります。

returnReduceAnd(bool) と returnReduceOr(bool) をそれぞれ andOp<bool>() と orOp<bool>() 演算子を持つ returnReduce のインライン・ラッパーとして使用すると、より簡単に扱える式が得られます。また、パラメータをブール値に一義的にキャストできるという利点もあります。

これらの新しいコールの例をいくつか紹介します。

  • 任意のランクに存在するかどうかをテストする。
    if (returnReduceOr(list.size()) { ... }
    if (returnReduceOr(!list.empty()) { ... }
  • すべてのランクで非存在をテストする。
    if (returnReduceAnd(list.empty()) { ... }
    if (!returnReduceOr(list.size()) { ... }

globalIndexの修正

リーディングディスパッチタグを使用し(他のC++の規約との類似性を高める)、マスターデータを別々に書き込むことができるgather/writeに便利なgatherNonLocalタグを含めます。

  • clear()メソッドを追加し、NULL構築状態にリセットするようにした。
  • PatchTools::gatherAndMergeは、出力パラメータとしてglobalIndexの回収をサポートします。これは、後続のフィールドマージ操作での再利用を可能にします。
  • PatchTools::gatherAndMerge にオプションのパラメーターとして pointMergeMap が追加されました。この情報は常に必要というわけではありません。例えば、gatherAndMergeを使用して面を結合するだけで、ポイントフィールドを使用しない場合です。

メッシュ/パッチへのアクセス方法を改善しました。

メッシュとフィールドコンポーネントのアドレスには、細かいですが様々な便利な変更があります。

FieldFieldへのインデックス作成

FieldFieldへのタプル(ペア)インデックスをサポートします。(patchi, elemi) のペアを使用して、FieldField の要素にアクセスできるようになりました。

faPatch/fvPatch patchField, lookupPatchField の呼び出しを簡素化。

2番目の(unsed)テンプレートパラメータは完全にオプションになりました。以前は古いコンパイラ(2008年以前)では必要でした。

拡張polyBoundaryMeshパッチ/フェースクエリ

whichPatchFace() メソッドは (patchi, patchFacei) タプルを返し、 whichPatch() は whichPatchFace() の簡略化されたラッパーになりました。

新しいgroupNames()メソッドは、ゾーンと同様のパッチベースの機能を提供します。

拡張された有限領域メッシュ/面クエリ

有限面積から体積メッシュへの対応のためのブックキーピングを改善する。

  • whichPolyPatches() = areaMeshに関連するポリパッチ。 これは、パッチ固有のコンテンツを事前に計算(およびキャッシュ)する際に役立ちます。
  • whichPatchFaces() = faceLabelsのそれぞれに対応するポリパッチ/パッチフェース。 これにより、より便利な検索が可能になり、リストはエリアメッシュ上にキャッシュされるため、whichPatch() などの呼び出し回数が減ります。
  • whichFace() = 与えられたメッシュ面に対応する領域面

また、ボリュームからエリアへのマッパー機能を拡張し、より柔軟で一貫性のあるものにしました。

GeometricFieldのフィールド変更

GeometricField::internalFieldRef() は boundaryFieldRef() や primitiveFieldRef() と同じように書き込みができるようになりました。名前付けは internalField() を補完するものです。

意味は GeometricField::ref() メソッドと同じですが、より明示的な名前がついており、例えば tmp::ref() と混同される可能性は低くなっています。

座標系

座標系に対する基本的な変更はありませんが、coordinateSystem辞書検索に対する取り扱いが単純化されました。coordinateSystems::NewIfPresent()メソッドは、オプショナルな項目の取り扱いを非常に単純化しています。たとえば

coordSysPtr_ = coordinateSystem::NewIfPresent(mesh, dict);

旧来の長いフォームの代わりに

if (dict.found(coordinateSystem::typeName, keyType::LITERAL))
{
    coordSysPtr_ =
        coordinateSystem::New
        (
            mesh_,
            dict,
            coordinateSystem::typeName
        );
}
else
{
    coordSysPtr_.reset();
}

v2212: プリプロセッシングの新機能と改良点

checkMeshの改良

checkMesh ユーティリティが含まれるようになりました。

  • プロセッサの境界を越えたパッチとフェイスゾーンの多様性チェック
  • pointZone, faceZone, cellZone の重複を報告する。

パラレルコンシステントマニホールドレポート

allTopology スイッチは、パッチと faceZone のトポロジーを報告します(例:)。

Checking patch topology for multiply connected surfaces...
    Patch               Faces    Points   Surface topology
    fixedWalls          80       160      ok (non-closed singly connected)
    frontAndBack        800      882      ok (non-closed singly connected)

以前のバージョンでは、このチェックは並列に無効化されていました。v2212では、エッジの接続はプロセッサの境界を越えてチェックされます。

Checking patch topology for multiply connected surfaces...
    Patch               Faces    Points   Surface topology
    fixedWalls          80       164      ok (non-closed singly connected)
    frontAndBack        800      924      ok (non-closed singly connected)

そのことに注意してください。

  • 点接続性チェックの「多重接続(共有点)」は、「まだ」並列一貫していない。
  • ポイント数は全ポイントの合計を表し、重複を補正するものではありません。

オーバーラップゾーン

allTopology スイッチは、一部のユーティリティによってのみサポートされているため、オーバーラップするゾーンを報告するようになりました。checkMeshの出力例は次のとおりです。

Checking topology...
    Boundary definition OK.
--> FOAM Warning :
    From virtual bool Foam::zone::checkDefinition(Foam::label, bool) const
    in file meshes/polyMesh/zones/zone/zone.C at line 199
    Zone c0 contains duplicate index label 0

Source code

  • $FOAM_UTILITIES/mesh/manipulation/checkMesh

changeDictionaryユーティリティの改良

changeDictionary ユーティリティは、照合されたプロセッサ・ディレクトリに対して並列に操作できるようになりました (例)。

mpirun -np 2 changeDictionary -parallel -fileHandler collated

このため、ケースを再分解することなく、境界条件の設定をわずかに変更するなどの場合に非常に便利です。

See:

  • Issue #2533

Source code

  • $FOAM_APP/utilities/preProcessing/changeDictionary

曲率に基づく新しいSnappyHexMeshのリファインメント

TOP

現在、SnappyHexMeshのリファインメントは隣接するセル間の光線の交点に基づき行われます。フィーチャーは交点での交差角度とローカル法線を解釈することで特定されます。これはresolveFeatureAngleパラメータで決定されます。

サーフェスベースのリファインメント

曲率ベースのリファインメントは、実際の(三角形分割された)サーフェスを問い合わせるために拡張されました。下図では、典型的なサーフェスが、測定された曲率(青、白、赤のスケール)と45度の特徴角(緑)で色分けされて表示されています。

曲率は、surfaceFeatureExtractアプリケーションの入力辞書にエントリを含めることによって書き込むことができる。

// Output surface curvature
curvature true;

// Write closeness/curvature/proximity fields as VTK for postprocessing
writeVTK            yes;

これは入力ジオメトリと曲率フィールドを含む.vtpファイルを書き込みます。snappyHexMeshのアルゴリズムはサーフェス上の各三角形に必要なリファインメントレベルを事前に計算し、キャスタレーション中にリファインメントのトリガーとしてその情報を使用します。この動作はresolveFeatureAngleパラメータと新しいオプションのcurvatureLevelパラメータで制御されます。

// Additional refinement for regions of high curvature. Expressed
// (bit similar to gapLevel) as:
// - number of cells per radius of curvature. (usually a few is
//   good enough)
// - starting cell level? Not used at the moment.
// - maximum cell level. This can be smaller or larger than the
//   max 'surface' level
// - minimum curvature radius to ignore (expressed as a cell level).
//   This can be used to avoid detecting small sharp surface
//   features. Set to -1 to ignore.
//
curvatureLevel (10 0 10 -1);

手順が構成されています。

  • 曲率を計算する
  • resolveFeatureAngle よりも鋭い角度を持つエッジ上のポイントをマークしない(これらはフィーチャーエッジスナップで解決されます)。
  • 曲率と指定したセル数/半径を、必要な精細度に変換する。
  • 指定された最大絞り込みレベルまでクリップする
  • サーフェスに保存し、後続のリファインメントで使用されるようにする。

上に示したサーフェスのメッシュの例(1つの初期セルから開始)。

これは、表面の(緩やかな)湾曲がさらなるリファインを引き起こす、前面の正しい動作を示しています。しかし、表面の反対側では、鋭角(約20度)に起因する不要なリファインメントが明らかである。ここでは、「最小曲率半径」が有効であると考えられるが、適切な値を決定することは自明でない。

追加テスト

曲率精密化を特定の領域に限定することは有益な場合があります。1つの方法は、例えばsurfaceSubsetやsubTriSurfaceMeshサーフェイスを使用して、サーフェイスの一部を抽出することです。もう一つはsnappyHexMeshの中のlimitRegions機能を使うことです。

limitRegions
{
    box_limit    // geometry defining region without explicit refinement
    {
        // Don't refine at all inside 'box_limit'
        mode        inside;
        levels      ((10000 0));
    }
}

チュートリアル mesh/snappyHexMesh/block_with_curvature では、曲率細分化をボックスの外側に限定するために使用されています(黒い線で表示)。

2:1制約による絞り込みの「にじみ」に注意。

setFieldsの改良

setFields ユーティリティが拡張され、有限領域がサポートされるようになりました。入力の例です。

defaultFieldValues
(
    areaScalarFieldValue h 0.00014
);

regions
(
    clipPlaneToFace
    {
        point  (0 0 0);
        normal (1 0 0);

        fieldValues
        (
            areaScalarFieldValue h 0.00015
        );
    }
);

必要であれば、コマンドラインオプションで一時的に処理を抑制することも可能です。

setFields -no-finite-area

Tutorial

  • $FOAM_TUTORIALS/finiteArea/liquidFilmFoam/cylinder

新しいクリッププレーンのトポセット

clipPlaneトポセットclipPlaneToCell、clipPlaneToFace、clipPlaneToPointは、領域を選択するのに便利な手段です。例えば

clipPlaneToFace
{
    point  (0 0 0);
    normal (1 0 0);
}

は、半無限バウンディングボックスを定義するよりも簡単です(以前は唯一の可能性でした)。

boxToFace
{
    min  (0  -1e6 -1e6);
    max  (1e6 1e6 1e6);
}

Tutorial

  • $FOAM_TUTORIALS/finiteArea/liquidFilmFoam/cylinder

v2212:数値計算の新機能と改良

オーバーセットメッシュの改善

オーバーセットの枠組みが拡張されました。

  1. は、オーバーセットされたパッチが背景領域の外まで広がるようにします。
  2. 背景領域のホールセルから離れたフリンジ面を許容する;および
  3. 質量保存を改善するためのオプションを追加する。

ドメイン外のオーバーセットパッチ

他のすべてのメッシュの外側に存在するセルは、ドナーセル候補が見つからないため、補間を使用することができません。これらのセルは、通常の計算セルと同様に局所的にセルを解く、新しいポーラスセルタイプを使用して処理することができます。これらのセルは通常、壁のパッチに近いため、圧力-速度系の安定性を維持するために、通常は何らかのダンピングが必要です。これは、例えば、速度を減衰させるfvOptionを使用して適用することができ、新しいcellType selectionMode項目は多孔質セルを識別することができます。

limitU
{
    type            velocityDampingConstraint;
    active          true;
    selectionMode   cellType;
    UMax            0;
    C               1;
}

inverseDistance、trackingInverseDistance、volumeWeightの各セルステンシルを用いたテストでは、ダンピング定数Cが「1」でうまく機能する傾向があることが示されました。

なお、この方法は、背景メッシュの上に2つのインセットメッシュを重ねることはサポートしていません。

背景領域のホールセルから離れたフリンジ面を許可する

オーバーセット法は、流れが高い勾配を示す領域から補間されたセルが離れている場合に有効です。以前のバージョンでは、幾何学的に不明瞭なセル(穴のタイプ)は補間されたセルで囲まれていました。このリリースでは、system/fvSchemes辞書のoversetInterpolationセクションを使用して、補間セルを障害物からさらに遠ざけることができます。

oversetInterpolation
{
    method              inverseDistance;
    ..
    holeLayers          4;
    useLayer            2;
}

holeLayers の項目には、ホールセルから「歩く」セルの層数を指定し、useLayer には補間セルを配置する層数を指定します。例えば、上記の例では、4層からなる歩行を行い、層2を使用して補間を配置します。


実行時、ソルバーは各メッシュのレイヤー体積の平均比率を報告する、例.

Number of layers : 4
Average volumetric ratio : 4(0.9581398507 0.9624422346 0.966612743 0.97065     73485)
Number of holes cells : 4(202 203 204 205)
Using layer : 2

残圧について期待される改善点の代表的なものは以下の通りです。

オーバーセット質量保存を改善するためのオプション

以前の実験的キーワードは、オーバーセットベースのソルバーアプリケーション、すなわちmassFluxInterpolation、ddtCorr、およびcorrectPhiから削除されました。質量保存は、fvSolutionファイルの新しいoversetAdjustPhiキーワードによって制御されるフラックス補正を追加することで改善されました。

PIMPLE
{
    momentumPredictor   no;
    nOuterCorrectors    1;
    nCorrectors         3;
    nNonOrthogonalCorrectors 0;

    oversetAdjustPhi    true;
}

このフラグは、内側のPIMPLEループのフリンジ面を横切るフラックスを調整します。次の画像は、$FOAM_TUTORIALS/multiphase/overInterDyMFoam/simpleRotorの場合の質量保存への影響を示しており、最初のものは補正なしで、2番目は補正ありで計算されています。

フラックス/質量保存の第二のオプションは、パッチフィールド上で指定される暗黙の補正である。

free
{
    type            overset;
    value           uniform 300;
    fluxCorrection  true;
}

線形ソルバー内のフラックス制約を使用してフラックス補正を実装しています。これは、すべてのフリンジ面において、すべての行列-フィールドの乗算に対して保存制約を強制します。これは,事前調整された共役勾配系で事前調整された変数に適用されるため,効果が限定される可能性があることに注意してください.overLaplacianDyMFoamチュートリアルbasic/overLaplacianDyMFoam/1DheatTransferMassConservationでは、fluxCorrectionを有効にするとオーバーセットパッチの性能が改善されます。

Source code

  • $FOAM_SRC/overset

Tutorials

Outside cells:

  • $FOAM_TUTORIALS/multiphase/overInterDyMFoam/twoSquaresOutDomain
  • $FOAM_TUTORIALS/incompressible/overPimpleDyMFoam/rotatingSquare

Fringe faces:

  • $FOAM_TUTORIALS/incompressible/overPimpleDyMFoam/simpleRotor
  • $FOAM_TUTORIALS/multiphase/overInterDyMFoam/floatingBody
  • $FOAM_TUTORIALS/multiphase/overInterDyMFoam/rigidBodyHull

Mass conservation (explicit):

  • $FOAM_TUTORIALS/multiphase/overInterDyMFoam/simpleRotor

Mass conservation (implicit):

  • $FOAM_TUTORIALS/basic/overLaplacianDyMFoam/1DheatTransferMassConservation

新しい随伴目的関数

アドジョイントベースの最適化で使用する5つの新しい目的関数が追加され、主に内部フロー最適化問題をターゲットにしています。以下に、それぞれの簡単な説明と例を示します。これ以降の図はすべて、速度の大きさを表しています。

flowRate

与えられたパッチのセットを通過する体積流量を計算し、最小化/最大化する。ダクトの上部を通る流量を最大にする(左から右へ流れる)アプリケーションを以下に示します。

Tutorial: $FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/shapeOptimisation/fork-uneven/flowRate

Source code: $FOAM_SRC/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveFlowRate

flowRatePartition

入口流量を所定の割合で出口パッチに分配するために使用される。2つのアウトレットにインレット流量を均等に分配することを目的としたアプリケーションを以下に示す。

Tutorial: $FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/shapeOptimisation/fork-uneven/flowRatePartition

Source code: $FOAM_SRC/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveFlowRatePartition

uniformityPatch

所定の(出口)パッチ(ここでは下部の出口パッチ)で計算される速度分散を最小にすることで、流れの均一性を高めることができます。

Tutorial: $FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/shapeOptimisation/fork-uneven/uniformityPatch

Source code: $FOAM_SRC/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveUniformityPatch

uniformityCellZone

所定のセルゾーン内の流速のばらつきを抑え、流れの均一性を向上させます。

この場合、ターゲットとなるセルゾーンの境界は黒くハイライトされている。

Tutorial: $FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/laminar/opt/unconstrained/uniformityCellZone

Source code: $FOAM_SRC/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectiveUniformityCellZone

powerDissipation

与えられたcellZone内で発生する流体電力の損失を計算し、最小化する。セルゾーンがフロードメイン全体をカバーする場合、この目的は体積流量で重み付けされた総圧力損失(すなわちPtLosses目的関数)と等価である。

ターゲットセルゾーンの境界は黒くハイライトされている。

Tutorial: $FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/shapeOptimisation/sbend/turbulent/SA/opt/powerDissipation

Source code: $FOAM_SRC/optimisation/adjointOptimisation/adjoint/objectives/incompressible/objectivePowerDissipation

Attribution

  • The software was developed by PCOpt/NTUA and FOSS GP
  • Integration in collaboration with OpenCFD on MR!578

新しい並列一貫したジオメトリ方式

新しいパラレルジオメトリ計算手法は、他のジオメトリ計算手法のラッパーとして適用することが可能です。

geometry
{
    type            parallel;
    // Optional underlying geometry calculation. Default is 'basic'.
    geometry
    {
        type            highAspectRatio;
    }
}

オーナーサイドの面形状を隣接する面、つまり面中心、法線(ネゲート)に適用し、影響を受けるセルのセルベースの形状を再計算することで動作します。

これは特に単精度の場合に有効で、例えばグローバル変換を計算する際に問題となる、結合パッチが採用する異なる計算順序に起因する切り捨て誤差を除去することができます。

 --> FOAM FATAL ERROR: (openfoam-2206)
 bad size -653174757

     From void Foam::List<T>::doResize(Foam::label) [with T = Foam::vectorTensorTransform; Foam::label = int]
     in file lnInclude/List.C at line 84.


 #0  Foam::error::printStack(Foam::Ostream&)
 #1  Foam::error::simpleExit(int, bool) at ??:?
 #2  Foam::error::exiting(int, bool)
 #3  Foam::List<Foam::vectorTensorTransform>::doResize(int)
 #4  Foam::globalIndexAndTransform::determineTransformPermutations() at ??:?

なお、並列方式は点の位置を変更しないので、セルクローズなどの他の計算された形状に影響を与える可能性があります。

Source code

  • $FOAM_SRC/finiteVolume/fvMesh/fvGeometryScheme/parallel

新有限面積最小二乗法によるエッジ補間法

Finite Areaのための線形ベースのエッジ補間スキームは、表面勾配と発散の計算で高い誤差をもたらす可能性があります。新しい最小二乗法スキームは、Pesci (2019; p.29-30, 45-50) の研究に基づいています - Finite Volume フレームワークの pointLinear スキームに類似していることを示します。テストでは、新しいスキームが解析解に関して表面勾配とダイバージェンスの結果を改善できることを示した。

解析解に関してガウス線形とガウス最小二乗を比較すると(Pesci, 2019; 図4.2)、予測精度のレベルが向上していることがわかる。

Source code

  • $FOAM_SRC/finiteArea/interpolation/edgeInterpolation/schemes/leastSquares

References

  • Pesci, C. (2019). Computational analysis of fluid interfaces influenced by soluble surfactant. Darmstadt, Technische Universität. PhD thesis.

Merge request

  • MR!575

MappedFileの改善

代替のサーフェスフォーマット

外部データソースと結合する際に使用される MappedFile 関数が拡張され、別の表面読み取り形式をサポートするようになりました。これにより、例えばサンプリングしたEnSightデータをマッピングに再利用することができ、抽出データ、可視化データ、入力データを1つのソースにまとめることができる利点があります。

フィールドフィルタリング

MappedFileは、入力データにマルチスウィープメディアンフィルタリングを追加できるようになりました。これは、粗いメッシュにサンプリングする際に、高い空間周波数を除去するために使用することができます。例えば、探索半径5mmの線形、面積加重フィルタを適用する場合。

filterRadius    5e-3;
filterSweeps    40;

入力フィールド値は、指定された掃引回数で平均化されたフィルタリングが行われます。このフィルタリングにより、サンプリングされた値を汚染する高い空間周波数が取り除かれる。フィルタの効果は次のように見られる。

左はオリジナルの生入力データ、右は同じものをMappedFile内でフィルタリングし、高周波成分を除去した後の画像である。

Source code

  • $FOAM_SRC/meshTools/PatchFunction1/MappedFile

Merge request

  • MR!568

Tutorial

  • $FOAM_TUTORIALS/compressible/acousticFoam/obliqueAirJet

フィールドフィルタリングのプレビュー

新しい smoothSurfaceData ユーティリティは、MappedFile で使用する前に、さまざまなフィルター半径やスイープの効果を簡単にテストするための手段です。

改良型DEShybridスキーム

Travinら[3]の研究に基づくDEShybridスキームは、細かいメッシュの渦度支配領域ではより低い散逸スキームを、回転しない領域や粗いメッシュではよりロバストなスキームを、解に応じてブレンドすることを可能にします。このオリジナルスキームを新しいグレー領域拡張 DES モデルで使用したところ,誤動作することが判明しました.より散逸的なスキームは、重要な初期せん断層領域で作動し、モデルの改良を打ち消すものでした[1]。

DEShybridスキームのアップデートがv2212リリースに含まれており、グレーエリア領域での低散逸挙動を保証し、その他の点ではオリジナルのスキームと同様の挙動を示します。

Tutorial

Settings for the new DEShybrid scheme can be found in the new tutorial based on the 2D hump case of Greenblatt et al. [2].

  • $FOAM_TUTORIALS/incompressible/pimpleFoam/LES/wallMountedHump

Source code

  • $FOAM_SRC/TurbulenceModels/schemes/DEShybrid

Attribution

  • 更新されたDEShybridスキームは、Upstream CFD GmbHによって実装され、Volkswagen AGの資金提供によりOpenCFD Ltdと共同でOpenFOAMに統合されました。
  • Merge request MR!560

References

  1. Fuchs, M., Mockett, C., Sesterhenn, J., and Thiele, F. (2015). Assessment of novel DES approach with enhanced SGS modelling for prediction of separated flow over a delta wing. 22nd AIAA Computational Fluid Dynamics Conference, Dallas / Texas, AIAA-2015-3433.
  2. Greenblatt, D., Paschal, K. B., Yao, C.-S., Harris, J., Schaeffler, N. W., and Washburn, A. E. (2006). Experimental Investigation of Separation Control Part 1: Baseline and Steady Suction. AIAA Journal, Vol. 44, No. 12, pp. 2820-2830, 2006.
  3. Travin, A.K., Shur, M.L., Strelets, M.K., and Spalart, P.R. (2004). Physical and numerical upgrades in the detached-eddy simulation of complex turbulent flows. Advances in LES of complex flows, pp. 239–254, 2004.