OpenFOAM v2006 リリースノート

2020年6月30日 (火) 22:42時点におけるMmer547 (トーク | 投稿記録)による版 (→‎v2006 Developer Upgrade Guide)

OpenFOAM v2006 リリースノート

アップグレード

v2006 User Upgrade Guide

非推奨と削除

RANSのクロージャモデルを削除しました: v2f

v2f RANS乱流閉鎖モデルは、OpenFOAMコミュニティのメンバーとの長い議論の結果、kEpsilonPhitFモデルを支持して削除されました。v2fモデルは、(Lien and Kalitzin, 2001)の研究に基づいており、(Durbin, 1995)のオリジナルのv2-f手法を再構築したもので、特に壁境界でのv2とf場の連成定式化に起因する分離解アルゴリズムに固有の数値剛性を低減しています。しかし、このモデルについては、モデルの忠実性の点で様々な欠点が文献で報告されている。v2-f法の欠点を克服するために、(Laurence et al., 2005)は、数値剛性を低減するために、v2スケールを等価な無次元形式、すなわちphitに変換することにより、v2-f法を再評価した。このバリアント、すなわちkEpsilonPhitFは、元のv2-fモデルの理論モデルの忠実度を維持しつつ、数値的なロバスト性とグリッド異常に対する鈍感性を提供すると考えられている。

削除された壁関数:v2WallFunctionとfWallFunction

v2f RANSモデルの削除に続いて、対応する壁関数、すなわち、kEpsilonPhitFモデルで必要とされないfWallFunctionとv2WallFunctionが削除されました。

foamToEnsightPartsを削除しました。

foamToEnsightParts ユーティリティ(シリアルのみ)は、foamToEnsight ユーティリティの改良により冗長になり、削除されました。

名前の変更

nutkAtmRoughWallFunctionの境界条件がatmNutkWallFunctionに改名され、大気モデルの残りの機能名と一貫性を持たせるために、セットアップの下位互換性を提供しませんでした。

Horace Lambの遺産を適切に認識するため、関数オブジェクトlambVectorの名前をLambVectorに変更しました。

設定・環境

ParaViewプラグイン

PV_PLUGIN_PATH は、実際にディレクトリが存在する場合のみ設定してください。 これは最初のコンパイル時に2回のパスが必要になることを意味しますが、その後の信頼性を向上させます。

通常のOpenFOAMインストール以外でビルドされたプラグインのサポートを容易にするために、任意のPV_PLUGIN_PATHをparaFoam用に扱います。paraFoam -help-fullで明らかになるように。

-plugin-path=DIR  Define plugin directory (default: $PV_PLUGIN_PATH)

paraviewプラグインが(可視化モジュールの一部として)ビルドされている場合、それらのプラグインの前にはParaFoamが付けられるようになりました(ParaFoamBlockReaderやParaFoamReaderなど)。

設定ディレクトリの取り扱い

FOAM_CONFIG_MODE環境変数は、シェルソーシング中にどのディレクトリが検索されるかを制限するために、(ugo, o etc)のような値を与えることができます。これは制御性を向上させますが、必要に応じてユーザが誤って設定してしまうことを防ぐために、OpenFOAM prefs.sh ファイル内で独自の値を定義することも可能にします。

FOAM_CONFIG_ETC環境は、プロジェクトなどのファイルを見つけるときに、追加の検索層を注入することを可能にします。

foamCreateModuleInclude のシェル構文

etc/bashrc 自体を調達する代わりに、後から調達するためのシェル環境を事前に生成することができます。

Wmake調整

その他の wmake サブコマンド

これにより、トップレベルのスクリプトを追加することなく、自然に追加機能にアクセスできるようになり、また、スクリプトの再利用が容易になりました。

例えば

wmake -check-dir は 1 つまたは 2 つのディレクトリ名を取り、スタンドアロンスクリプトの wmakeCheckPwd (シンボリックリンクとして利用可能) を置き換えます。

wmake -build-info は、あまり使われていない wmakeBuildInfo を置き換えます。

wclean -build と wclean -platform は、あまり使われていない wcleanBuild と wcleanPlatform をそれぞれ置き換えるためのものです。

統合と改善は次のバージョンに向けて継続します。

追加のコンパイルパラメータ

wmakeシステムは、以下の環境パラメータを通過するようになりました。

FOAM_EXTRA_CFLAGS FOAM_EXTRA_CXXFLAGS FOAM_EXTRA_LDFLAGS

OpenFOAMコードを統合する際に追加のコンパイルパラメータが必要な状況やコンパイルパラメータのカスタムチューニングをサポートします。

Allwmake は 優先的に Allwmake.override スクリプトを扱い、パッケージングツールが代替の Allwmake スクリプトを定義できるようにします。

より多くのポータブルパス wmakeツールチェーンのバイナリ(wmkdepend, lemon, ....)は、platforms/toolsの下に配置されました(以前はwmake/platformsの下にインストールされていました)。これは、ソースのみのパッケージやバイナリのみのパッケージを作成する際に役立ちます。

コンパイラの派生物をより簡単に扱えるようになりました。

これで、コンパイラのバリアントを作成するために[-+.~]で分割することが可能になりました。以下のようなものです。

WM_COMPILER=クラングベンダーのような単純な可読名

異なる情報を組み合わせた将来の定義 例えば

WM_COMPILER=Clang~openmp
WM_COMPILER=Clang+cuda~openmp

spackが使っているのと同じように、+ (足し算) と ~ (引き算) の記法を使います。

オプションで wmake ルールをオーバーライド

オプションの wmake ルールのオーバーライドをサポートします。存在する場合、コンパイラー・ファミリーのオーバーライド・ルールは、コンパイラー・ファミリーの一般的なルールが含まれた後に含まれます。これにより、動的に生成されたコンテンツにいくつかの値をオーバーライドするための中心的な手段を含めることができます。 例えば、異なるバージョンの gcc (システムコンパイラ) を扱うために wmake/rules/linux64Gcc/override には以下のようなものが含まれています。

ifneq (,$(findstring 9, $(WM_COMPILER)))
    cc  := gcc-9
    CC  := g++-9 -std=c++11
endif

MPI-rebuilds の粒度とカプセル化の改善

MPI のみのビルドセグメントを扱うための追加の Allwmake-mpi スクリプトが提供されています。関連するセクションでは、FOAM_MPI_LIBBIN ターゲットの場所 (通常は FOAM_LIBBIN/FOAM_MPI がデフォルト) を使用して、ツリー外ターゲットでのビルドを可能にしました。 例えば、トップレベルの Allwmake を使ってデフォルトの MPI 設定 (例: system openmpi) で OpenFOAM をビルドした後、異なる MPI で MPI レイヤーをリビルドすることができます。 任意の既知の型

othermpi()
{
    export WM_MPLIB=OPENMPI
    export FOAM_MPI=openmpi-3.1.3

    export OPAL_PREFIX=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$FOAM_MPI
    export MPI_ARCH_PATH="$OPAL_PREFIX"
}

そして、これを使ってThirdPartyのptscotchを再構築してください。

(
    othermpi
    $WM_THIRD_PARTY_DIR/makeSCOTCH
)

を作成し、OpenFOAM の mpi 依存部分を再構築することができます。 例えば、既存の docker/signularity イメージを使って新しい MPI コンポーネントをリビルドする場合など、ソース外のインストール場所を提供することも可能です。

for script in $(find src -name Allwmake-mpi)
do
(
    other_mpi
    export FOAM_MPI_LIBBIN="$HOME/tmp/install-prefix/lib/$FOAM_MPI"
)
done

ビルディングモジュールの任意の設置場所 追加モジュールやユーザコードをコンパイルするとき、通常のFOAM_USER_LIBBIN, FOAM_SITE_LIBBIN, FOAM_LIBBINを超えたインストール場所の制御が必要であり、これらの値には これは、標準のデフォルトを扱うためのwmakeルールを提供することで処理されるようになりました。


GENERAL_RULES/module-path-user


GENERAL_RULES/module-path-group


GENERAL_RULES/module-path-project


を以下のように組み入れています。

Make/options

include $(GENERAL_RULES)/module-path-user

Make/files

LIB = $(FOAM_MODULE_LIBBIN)/libMyLibrary


デフォルトでは、これらはFOAM_USER_{APPBIN,LIBBIN}にコンパイルされますが、コンパイル時に調整することができます。例えば

wmake -module-prefix=/path/my-install-location


または

./Allwmake -module-prefix=/path/my-install-location
./Allwmake -prefix=/path/my-install-location

または

FOAM_MODULE_PREFIX=/path/my-install-location ./Allwmake


入力辞書

大気モデル

FOAM_SRC/atmosphericModels/で提供されているモデルは、以下のように$FOAM_CASE/system/controlDictファイルに明示的にAtmosphericModelsライブラリ名を追加することでのみ使用できるようになりました。

// Make sure all utilities know specialised models
libs            (atmosphericModels);

例として、$FOAM_TUTORIALS/verificationAndValidation/atmosphericModels/HargreavesWright_2007/system/controlDictを参照してください。

境界条件: turbulentDigitalFilterInlet

turbulentDigitalFilterInletの境界条件設定を、設定(出力ではなく)の下位互換性を提供しないまま、かなりの範囲で修正しました。 新しい設定の例は $FOAM_TUTORIALS/verificationAndValidation/turbulentInflow/PCF/0.orig/inlet.DFM/U を参照してください。

blockMesh

blockMesh のデフォルトとして、以前のものではなくトポロジカルマージを使用します。点の位置を使ってマージします。トポロジカルマージの方が高速で、以下のように動作します。は、高アスペクト比のメッシュに適しています。時折 ポイントベースのマージが望ましい、mergeType ポイント; を追加することができます。で指定された blockMeshDict または blockMesh -merge-points に変更します。コマンドラインで使用できるようになりました。

blockTopology.vtuを生成する新しいblockMesh -write-vtkオプションが追加されました。ファイル (VTK ASCII, XML) を使用して、 paraview で読み込んで検査することができます。

このファイルには、同等の obj ファイル (-write-obj オプションで生成されます。以前は -blockTopology) 接続性、セル形状、セルIDを含むので(同等の をブロック番号に変換します)。


v2006 Developer Upgrade Guide

一般的な

stdFoam.H (および autoPtr.H) 内の Foam 名前空間に std::unique_ptr を使用することを追加し、Foam::unique_ptr または std::unique_ptr として一般的に利用できるようにした。特に低レベルコンテナでは、需要駆動型のデータや autoPtr を使用した旧式の処理を変更して unique_ptr を使用するようにしました。

非推奨と削除

Deprecated Methods

は、長さが 0 以外の環境が存在するかどうかをテストするための hasEnv() 関数の代わりに env() 関数を静かに廃止します。

この命名は目的をより明確にし、 getEnv(), setEnv() の命名に似たものになります。

以前 (2018-10) には、それぞれ findObject() と getObjectPtr() の代わりに使われていた objectRegistry メソッド lookupObjectPtr() と lookupObjectRefPtr() が、コンパイル時に非推奨となるという警告が出ていました。


削除された方法

Switch::asText()

で置き換えられた Switch asText() メソッドを削除します。 c_str() と str() はいくつかのバージョンがありました。

invariantIII()

関数テンプレートSymmTensor2D.invariantIII()とTensor2D.invariantIII()は、2×2行列には3番目の不変量が存在しないので削除されました(66b02ca5参照)。

削除された項目

サーフメッシュのサンプラーは撤去されました。 これらは内部的にサーフェス値をサンプリングして保持する手段を提供していましたが、OpenFOAM-v1906で導入されたサーフェスサンプリングの変更に伴い、冗長なものとなりました。


定義の変更

PrimitivePatchのテンプレートパラメータが4つのパラメータから2つのパラメータに簡略化されました。 通常のユーザーコーディングには影響しないようです。

行動の変化

分析的電子分解

OpenFOAMでは、与えられたテンソル/テンソル2Dの固有値や固有ベクトルは、明示的な代数式によって計算されてきました。しかし、v2006以前には以下の3つの問題がありました。

テンソル/テンソル2Dから複素型の固有値や固有ベクトルを計算することはできませんでした。 テンソル/テンソル2Dの等値分解アルゴリズムは数値的にかなり脆弱であった。 symmTensor/symmTensor2Dでは、共分散アルゴリズムは利用できませんでした。

v2006では

symmTensor/symmTensor2Dのための新しい等値分解アルゴリズムが提供されました。 解析的な等分割アルゴリズムの戻り値の型が数学的に一貫していることが保証されました(55e7da67参照)。


tensorとtensor2Dは複素固有値と固有ベクトルのみを返すようになりました。

symmTensorとsymmTensor2Dがスカラー固有値と固有ベクトルのみを返すようになりました。


特に多項式根探索アルゴリズムの数値的安定性を向上させることにより、電子分解アルゴリズムの脆弱性が大幅に減少しました(8ca724ff, 55e7da67を参照)。 ヘッダーの文書化、および外部ソフトウェアとのビット単位の比較を行うテストアプリケーションは、入出力の動作における予期せぬ変更を防ぐために大幅に改善されました(55e7da67, 6a53794e, 66b02ca5, 8ca724ffを参照してください)。

invariantII()

関数テンプレートTensor2D.invariantII()とSymmTensor2D.invariantII()の第2不変量を計算するアルゴリズムは、正しい出力を生成するように修正されました(66b02ca5を参照)。

辞書

辞書メソッド名の使用を統一しました。 以前のリリースでは、辞書 "取得 "メソッドの様々なタイプを導入し、getOrDefaultが含まれています。今では移行を完了し、以前はlookupOrDefaultを持っていたどこでもgetOrDefaultを使用します。これにより、動作が同じである2つのメソッドの混在使用を避け、名前を短くし、"lookup "アクセス(すなわち、トークンを返す)の区別を促進します。 ストリーム、エントリを探して返す) と "get" アクセス (つまり、上記のようにスカラやラベルなどの具体的な型に変換して) があります。

シングルパラメータの辞書writeEntry()メソッドを追加しました。 辞書は自分の名前(dictName)を知っているので、コンテンツを書くときに使うことができます。

argList

argListの処理を拡張し、述語チェックを含むようにしました。 argListメソッドの名前をさらに辞書メソッド名と整合させました。 2 パラメータの get() メソッドを静かに廃止。 より馴染みのある getOrDefault メソッドを使用しています。 opt() メソッドを静かに廃止し、 get() メソッドを使用するようにしました。

Strings

ホワイトリスト/ブラックリストにマッチするstringListOps stringOps の inplaceRemoveSpace() メソッドと string replaceAny() メソッドを使用します。 replaceAny() メソッドは、検索文字列と置換用の 文字に置き換えられます。置換文字は、nul char ('\0')にすることもできます。 これは単に文字を削除するだけです。いくつかの使用方法があります。

予約文字の置換

str.replaceAny("<>:", '_');

シェルのメタ文字やファイルシステムの予約文字を削除する


str.replaceAny("*?<>{}[]:", '\0');

Streams 追加の ISstream::getLine() で nullptr を受け付けるようになりました。 これは std::istream::ignore に渡され、行の内容をバッファリングせずに読み込んだり破棄したりすることをサポートします。

IOstreamOption

format/compress enum ルックアップのデフォルト値をサポートします。 好ましいデフォルトフォーマットがASCIIではない状況を回避します。 例えば、辞書入力で

format binar;

この入力ミスにより、以前はformatEnumのデフォルトがASCIIになっていました。これで、デフォルトの動作を適切に制御できるようになりました。

IOstream::formatEnum(dict.get<word>("format"), IOstream::BINARY);

IOstreamOption for constructing streams

ストリームのコンストラクタが IOstreamOption を受け入れるようになり、IO オプションを単一のパラメータとして便利に束ねることができるようになりました。

writeObject() の呼び出しに IOstreamOption を使用します。

これらの変更はどちらも、渡されるパラメータの数を減らし、最小限の労力でIOstreamOptionに将来的に追加できるようにします。


regIOobject

store() メソッドは、オブジェクトも登録するようになりました。 以前の store() メソッドは、検索可能であることを確認せずに ownedByRegistry フラグを設定するだけでした。 これで、実際に登録されていることを確認してください。

tmp<T>項目のレジスタ/ストアをサポートしました。 tmpパラメータはクリアされず、さらに使用できるようにPTRからCREFに変更されました。

暗黙的に登録することでコードの簡素化が可能になります。GeometricField::New ファクトリーメソッドを使用して、例えば

Old Code

volScalarField* ptr = new volScalarField
(
    IOobject
    (
        fieldName,
        mesh.time().timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::NO_WRITE,
        true  // Register
    ),
    mesh,
    dimless,
    zeroGradientFvPatchField<scalar>::typeName
);
ptr->store();

New Code

auto tptr = volScalarField::New
(
    fieldName,
    mesh,
    dimless,
    zeroGradientFvPatchField<scalar>::typeName
);
regIOobject::store(tptr);

或いは

regIOobject::store
(
    volScalarField::New
    (
        fieldName,
        mesh,
        dimless,
        zeroGradientFvPatchField<scalar>::typeName
    )
);


リストタイプ

added IndirectSubList to provide indirect access to a sub-section of a list. This is somewhat less efficient than a Foam::SubList, but supports the following:

adjustment of its addressing range after construction recovery of the original, underlying list at any time

This can be more convenient for some coding cases. For example,

template<class Addr>
void renumberFaces(IndirectListBase<face, Addr>& faces, ...);

呼べる

特定のフェイス。 UIndirectList<face>(mesh.faces(), facesToChange)

フェイスのサブレンジ。 IndirectSubList<face>(mesh.faces(), pp.range()

すべてのフェイスを表示します。 IndirectSubList<face>(mesh.faces()

スイッチ

Alignment Switch メソッドに Enum を追加し、find()、found() スタティックメソッド、およびフェイルセーフオプション付きのコンストラクタを含めるようにしました。 find() メソッドはコーディングをより明確にします。

古い

Switch sw(some_string, true); // NB: true = allowBad
if (sw.valid()) ...

Switch sw = Switch::find(some_string);

if (sw.good()) ...

或いは

if (Switch::found(some_string)) ...

すべての有効なトークン型を扱うように辞書からのコンストラクトを改善します。 以前は単語で読むだけでした。

clockTime, clockValue

インラインで clockValue, clockTime を拡張します。


ほとんどが std::chrono をラップしているので、その多くをインライン化することができます。内側のタイミングに使用する場合に便利です。


double へのダイレクトキャスト用に elapsedTime() メソッドを追加しました。壁掛け時計方式とのネーミングの類似性


ブレーキングの可能性のある変更(マイナー)。

bool パラメータを持つ clockValue コンストラクトは、単に ディスパッチ(値は無視されます)を行い、常に現在のクロックを問い合わせます。の値を設定します。これにより、不要な分岐を避けることができます。 このコンストラクタ形式は主に内部で使用されているので (例えば clockTime)を使用している場合は、ユーザーコードの破損は想定されません。

dimensionedType - 追加の dimensionedType コンストラクタ

次元/値から構築し、デフォルトでは値から名前を指定することで、このような操作に便利です。

max(.., dimensionedScalar(somedims, 0.5))

dimension/oneから構築され,pTraits<T>::oneに転送されます. これはコンストラクタに便利です。

volScalarField(..., dimensionedScalar(somedims, one{}))

前処理

数値演算

ソルバーと物理モデル

境界条件

後処理

ビルドシステム

ドキュメント