ESI OpenCFD Release OpenFOAM® v2206
OpenCFDは、2022年6月にOpenFOAM® v2206をリリースすることをお知らせします。このリリースでは、コードの多くの領域でOpenFOAM-v2112の機能を拡張しています。新機能は、OpenCFDのお客様がスポンサーとなった開発、内部資金による開発、OpenFOAMコミュニティからの機能および変更の統合を表しています。
OpenFOAMは、OpenCFDによってGPLライセンスの下で配布されています。様々なLinuxや他のPOSIXシステムでのコンパイルに適したソースコードパッケージに加えて、このリリースにはコンパイル済みのバイナリパッケージが多数含まれています。
- Ubuntu Linux: packaged installation for Ubuntu 22.04 (LTS), 20.04 (LTS), 18.04 (LTS)
- openSUSE Linux: packaged installation for Leap15.4, Leap15.3, Leap15.2
- Redhat Linux variants: packaged installation for CentOS/Rocky 9, 8, 7 and Fedora 36, 35, ...
Windowsユーザーは、プリコンパイルされたパッケージについて、3つの選択肢があります(詳細はこちら)。
- Using Windows Subsystem for Linux (based on Ubuntu, openSUSE etc.)
- Native executables with cross-compiled
- A docker installation
Mac OSXユーザーは、ソースからコンパイルするか、コンパイル済みのパッケージのDockerコンテナを使用するオプションがあります(詳しくはこちら)。
Upgrading
v2206 ユーザーアップグレードガイド
入力ディクショナリー
座標系と平面の辞書入力が、よりシンプルな構文でサポートされるようになりました。この変更は微妙なものですが、より自然に書けるようになるはずです。
座標系
transform と coordinateSystem の項目で、回転タイプのインライン指定ができるようになりました。
transform
{
origin (0 0 0);
rotation axisAngle;
axis (0 0 1);
angle 45;
}
長編と同様に。
transform
{
origin (0 0 0);
rotation
{
type axisAngle;
axis (0 0 1);
angle 45;
}
}
coordinateRotationの使用は、以前はrotationサブディクショナリへのサイレント・エイリアスでしたが、現在は冗長に非推奨となりました。同様に、古い長い名前axesRotation、EulerRotation、STARCDRotationは、それぞれ対応する短い名前axes、euler、starcdのエイリアスとして報告されるようになりました。
移動のみの場合、明示的な回転なしを使用することも可能です。
transform
{
origin (1 2 3);
rotation none;
}
または、同一軸を持つ暗黙の軸の指定。
transform
{
origin (1 2 3);
e1 (1 0 0);
e3 (0 0 1);
}
プレーン
平面は、参照点とその法線によって指定されることが非常に多いため(ほとんど必ず)、planeType辞書項目とそれに対応するサブ辞書は完全にオプションになりました。デフォルトでは、点/法線の指定が想定されています。たとえば、サンプリングされた切断面です。
slice
{
type cuttingPlane;
point (0 0 0);
normal (0 0 1);
}
の代わりに、より冗長なバージョンを使用します。
slice
{
type cuttingPlane;
planeType pointAndNormal;
pointAndNormalDict
{
point (0 0 0);
normal (0 0 1);
}
}
シリンダートポソース
- cylinderToCell、cylinderToFace、cylinderToPoint topoSetソースが更新され、シリンダー端点の好ましい名前としてpoint1およびpoint2を受け入れるようになり、検索可能なシリンダー仕様との入力の整合性が改善されました。
サンプルセット
coordSetWriter の更新は、raw フォーマットの出力ファイル名が若干異なることを除けば、エンドユーザーにはほとんど透過的です。セット入力は、辞書エントリとして指定できるようになりました(sampled-surfaceと同様)ので、changeDictionaryを使用してコンテンツを変更することができます。
サンプルセットに関連付けられた関数プロパティは、それぞれのサブセット名で修飾されるようになりました。修飾されていないプロパティ名は、以前のバージョンでは壊れていた(最後のサブセットからの値のみを返していた)アンサンブル値(すべてのサブセットの)に対応するようになりました。これは、既存のワークフローが単一のサブセットしか持っていない場合、正味の変更はないことを意味します。しかし、より正確な仕様を使用することで、ワークフローの将来性を確保することが望ましい。たとえば、以下のようになる。
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;
}
}
- サンプルセットには、指定されたすべてのサンプルロケーションのポイントを、生のプローブフォーマットで単一の集合アンサンブル出力に収集する特別な目的のプローブセットフォーマットも追加されています。場合によっては、プローブ位置を多数の個別点としてではなく、複数のアレイ/ラインのセットとして指定する方が便利なことがあります。
v2206 デベロッパーアップグレードガイド
新しいソルバーリンクの要件
多相及び熱連成ソルバーのリストラクチャリングの副作用として、新しいサーモツールライブラリが導入されました。このライブラリには、現在、様々な派生境界条件が含まれていますが、将来的には拡張されることが期待されています。
独自のソルバーで境界条件を利用できるようにするには、compressibleTurbulenceModelsライブラリが現在リンクされている場所(それぞれのMake/optionsファイル内)にthermoToolsライブラリをインクルードする必要があります。ほとんどの場合、EXE_INC エントリを調整する必要はなく、EXE_LIBS エントリを調整するだけで十分でしょう。例えば
- 旧Make/options
EXE_LIBS = ... \
...
-lcompressibleTurbulenceModels \
-lcompressibleTransportModels \
...
- 新Make/options
EXE_LIBS = ... \
...
-lcompressibleTurbulenceModels \
-lthermoTools \
-lcompressibleTransportModels \
...
- 古い/新しいOpenFOAMのバージョン用にコンパイルする特別な場合、ライブラリリンクは以下のように分離することができます。
#if (OPENFOAM >= 2206)
LIB_THERMO_TOOLS := -lthermoTools
#else
LIB_THERMO_TOOLS :=
#endif
EXE_LIBS = ... \
...
-lcompressibleTurbulenceModels \
$(LIB_THERMO_TOOLS) \
-lcompressibleTransportModels \
...
非推奨と削除
非推奨のメソッド
- OS システムメソッド domainName と完全修飾版 hostName は、現在では非推奨です。これらの関数は OpenFOAM のコードベースでは未使用で、次のような欠陥があります。
- POSIX 版では、非推奨の gethostbyname() 関数を使用します。
- Windows版では全く動作しない
削除されたメソッド
- 未使用の IOobject::isHeaderClassName(const word&) メソッドを削除しました。コンパイル時の診断をより良くするため,代わりにテンプレートで型付けされたバージョンを使用することが望ましい/推奨される.必要であれば、文字列ベースのチェックもまだ可能です。
(io.headerClassName() == "foo") //<- OLD: io.isHeaderClassName("foo")
- 場合によっては、新しい IOobject::hasHeaderClass() メソッドは、 (!headerClassName().empty()) と等価で、読み込みが成功したかどうかを確認するのに便利なテストを提供することができます。
- IOobject::isHeaderClass() メソッドが IOobject::isHeaderClassName() から短縮されました。
- 非推奨の fvMeshSubset::setLargeCellSubset() メソッドを削除しました。これはJUL-2018以降、コンパイル時に非推奨とされていましたが、現在は削除されています。
メソッドの名称変更
- lessEqOp と greaterEqOp のオペ名は、Eq が比較タイプではなく、割り当てを意味する他の形式(例えば plusEqOp)があるため、意味のあいまいさを解消するために変更されました。
old op name | new op name | meaning |
---|---|---|
lessEqOp | lessEqualOp | <=
|
greaterEqOp | greaterEqualOp | >=
|
- この名称変更は、より目的を反映し、また、std::less_equal や std::greater_equal などの C++ <関数> 名称とより整合性を持たせています。
行動の変化
- List、DynamicList、DynamicField などの整理の一環として、SortableList からの構築と SortableList からの移動の割り当てが削除されました。両方とも使われることはなく、事前に shrink() を適用して、必要であれば通常のリストのように扱うことができます。一般的に、SortList は多くの場合、より軽いソートコンテナを提供します。
- これまで self への参照を返していた append() メソッドは void になり、サブクラスの派生がより簡単に、より一貫性をもって行えるようになりました。なぜなら、連鎖的な追加処理は実際にはどこにも発生せず、派生クラスで偶発的にスライスが発生することを恐れて依存しないためです。
所在地変更
座標系
座標系と座標回転を定義するクラスは、src/meshTools から src/OpenFOAM に移行しました。これにより、surfMesh のコアクラスでそれらを使用することができます。この移行は、リンクの要件には影響しません。
Foam::sort, Foam::sortedOrder
同様に、ポインタリスト版の Foam::sort は PtrListOps.H から UPtrList.H に移行されました。
PtrListOps::less と PtrListOps::greater ラッパーはそれぞれ UPtrList::less と UPtrList::greater として見つけられるようになり、それは UList::less と UList::greater ペンダントに揃いました。
fvMeshSubset (+ fvMeshSubsetter)
fvMeshSubset クラスは、コア機能(fvMeshSubset クラス)と拡張機能(新しい fvMeshSubsetter クラス)にリファクタリングされました。
- ダイナミックメッシュのトポロジー変更を使用しない、fvMeshSubsetでのサブセットの直接処理によるコアマッピング(補間)機能。fvMeshSubset は、src/dynamicMesh の代わりに src/finiteVolume の下に配置されるようになりました。
- 特殊な2段階のサブセットは、dynamicMeshのトポロジー変更を使用するfvMeshSubsetterクラスに追いやられています。このクラスは src/dynamicMesh の下にあります。
この定義の分割は、コア(fvMeshSubset)がすでにsrc/finiteVolumeにあり、新しい特別な2ステップのサブセットはほとんど使用されない(現在はsubsetMeshアプリケーション自体によってのみ使用される)ため、ユーザーのコンパイルに変更を加える必要はないと予想されています。
fvMeshSubsetに、ゼロサイズ(ダミー)のサブメッシュのための最適化されたコンストラクトとリセットが追加されました。
コンテナの変更
CircularBuffer
新しい CircularBuffer コンテナは、リンクリストアプローチに関連する alloc/free オーバーヘッドなしで、循環バッファ (FIFO, LIFO またはその中間) としてオブジェクトの単純なリストを処理します。
コンパクトリストリスト
CompactListList は、1 つのテンプレート パラメータのみを必要とするように変更されました。古いセカンダリContainerテンプレート・パラメータは削除されました。作成には、pack() ファクトリーメソッドを使用する必要があります。unpack() メソッドは、古い operator() アクセスに取って代わり、改善されました。おなじみの values()、data()、cdata() メソッドで、コンパクトな内部リスト・データへの読み取りアクセスが可能になりました。
IndirectList
IndirectList クラスが拡張され、いくつかのファクトリーメソッドが追加されました。
- uniq() は、重複するエントリをフィルタリングした IndirectList を作成します。
- subset() は、条件述語を満たすポジションを持つ IndirectList を作成します。
- subset_if() は、与えられた述語を満たす値でIndirectListを作成します。
間接的なサブセットは、元のデータのサブセット・コピーを作成するよりも安価になり、また、修正も可能になることに注意したい。
文字列処理・述語
- wordReが少しスリム化されました。正規表現はポインタによってカプセル化されるようになり、リテラル文字列を表現する際のサイズとオーバーヘッドが削減されました。
- 統合された wordRes allow/deny フィルタリング、また wordRes::filter ファンクタとしてラップされています。これにより、stringListOpsにおけるwordRes::filterの直接サポートと、レジストリにクラウドフィールドをロードする際のallow/denyが可能になります。
- noOpが定義されていたのと似ているが、完全な転送を行うidentityOpを追加した。その動作はC++20のstd::identityの定義とほぼ同等である。
- scalarRangeのテストをミラーする単純なlabelRange述語gt0, ge0, lt0, le0を追加しました。これらは、中間体を作らず(ステートレス)、constexprとして使えるので、labelMinMax::ge(0)などを使うよりも低いオーバーヘッドを持っています。
ソートイテレーション
- HashTable, HashSet, Map, IOobjectList, objectRegistry クラスに asorted()` メソッドが追加されました。 sorted() および csorted() メソッドは、sortedToc() を作成する余分なステップを省き、一貫した順序でハッシュ化されたコンテンツを走査するための、より無駄がなく便利な手段を提供します。sorted() メソッドは、各エントリへのポインタのリストをソートすることで動作します。また、エントリの値にアクセスする際に二次的なチェックを行うこともありません。
- これを書けるようになりました。
HashTable<someType> table = ...;
for (const auto& iter : table.sorted())
{
Info<< iter.key() << " => " << iter.val() << nl;
}
- を、以前は
HashTable<someType> table = ...;
for (const word& key : table.sortedToc()) //<- Additional overhead for full copy of keys!
{
// Note: incurs a secondary lookup!
Info<< key << " => " << table[key] << nl;
}
注:HashTable の反復処理 key() の項目は、immutable であるため const として宣言されるようになりました。
フィールドハンドリング
ベクトル法
- vector::normalise メソッドは、ROOTVSMALL 以外の公差が望ましい場合のために、オプションの公差をサポートするようになりました。
- 新しい vector::removeCollinear メソッドは、共線成分を含まない法線ベクトルが頻繁に必要とされる形状を扱うときに便利です。removeCollinear メソッドは、より明確でコンパクトなコードを提供する。
vector edgeNorm = ...;
const vector edgeDirn = e.unitVec(points());
edgeNorm.removeCollinear(edgeDirn);
edgeNorm.normalise();
代わりに
vector edgeNorm = ...;
const vector edgeDirn = e.unitVec(points());
edgeNorm -= edgeDirn*(edgeDirn & edgeNorm);
edgeNorm /= mag(edgeNorm) + ROOTVSMALL;
フィールドノーマライズ
- Field コンテナ(および GeometricField などの関連クラス)には normalise() メソッドが追加されました。ほとんどのフィールドタイプでは、これは単純にno-opですが、vectorやsolveVectorのフィールドでは、これはvector::normaliseに相当しますが、各要素に適用されます。 これは、中間フィールドを作成するオーバーヘッド(または余分なコード行)なしで、ゼロ除算の保護で各要素を正規化します。
fld.normalise();
instead of
fld /= mag(fld) + VSMALL;
ラッピングされたIO出力クラス
データをコピーせずに参照で書き込むために、いくつかの派生した regIOobject ラッパーが追加されました。これらのラッパークラスは、外部コンテンツを参照するためにrefPtrを使用します。外部への読み込みは実装されていません(現在そのための要件はありません)。
base class | wrapped class |
---|---|
IOField | IOFieldRef |
IOList | IOListRef |
IOmapDistributePolyMesh | IOmapDistributePolyMeshRef |
使用例
labelList addressing = ...;
io.rename("cellProcAddressing");
IOListRef<label>(io, addressing).write();
または
primitivePatch patch = ...;
IOFieldRef<vector>(io, patch.localPoints()).write();
便利な機能
- polyMeshのフィルタリングregionName() - staticおよびnon-staticメソッドを追加した。
- メッシュリージョンを扱う場合、defaultRegion名(例えば、"region0")をフィルタリングしたり削除したりするのが一般的です。これをポリメッシュ自体から、あるいは静的関数として、簡単に行うことができるようになりました。単純に次のように使用します。
const word& regionDir = polyMesh::regionName(regionName);
// or
const word& regionDir = mesh.regionName();
の代わりに、以前の長いコードを使用します。
const word& regionDir =
(
regionName != polyMesh::defaultRegion
? regionName
: word::null
);
以下は正しく動作します(文字列 '/' 結合演算子は、空の文字列をフィルタリングします)。
(polyMesh::regionName(regionName)/polyMesh::meshSubDir)
(mesh.regionName()/polyMesh::meshSubDir)