「OpenFOAM v2006 リリースノート」の版間の差分

提供:オープンCAEWiki OpenCAE Wiki
ナビゲーションに移動 検索に移動
527行目: 527行目:
volScalarField(..., dimensionedScalar(somedims, one{}))
volScalarField(..., dimensionedScalar(somedims, one{}))
</syntaxhighlight>
</syntaxhighlight>
=== patterns ===
これはOpenFOAMのコーディングパターン集の最初のスタートです。
コーディングパターンとは、頻繁に遭遇するイディオムのことで、理由がすぐには明らかではない場合や、特定のアプローチを使うことにメリットがある場合を指します。
有志の方からのコンテンツを取り入れることができるのは嬉しいですね!
今のところ、特に構成はありませんが、将来的にはコンテンツを追加していくことで改善していきたいと考えています。


== 前処理 ==
== 前処理 ==


=== blockMesh ユーティリティの改善 ===
blockMesh は、より高速なトポロジカルマージを使用するようになり、高アスペクト比メッシュでよりよく機能するようになりました。ポイントベースのマージが望ましい場合は、コマンドラインで指定された blockMeshDict または blockMesh -merge-points に mergeType points; を追加することができます。
新しいblockMesh -write-vtkオプションはblockTopology.vtuファイル(VTK、ASCII、XML)を生成し、ParaViewでロードして検査することができます。これにより、追加のプラグインを必要とせずに、どのバージョンのParaViewでもblockMesh構造を直接検査できるシンプルで堅牢な方法が提供されます。
=== blockMeshを使用した重複バッフルの生成 ===
このリリースでは、blockMesh ユーティリティを拡張し、重複バッフルを生成する機能を提供します。これらは、面領域が体積保存に従うように操作された重複した面です。例えば、cyclicACMIパッチでは、壁のビヘイビアを提供するパッチと多対多の連成ビヘイビアを提供するパッチがあります。
blockMeshDict はこれらの重複バッフルを直接指定できるようになりました。
<syntaxhighlight>
ACMI1_couple
{
    type            cyclicACMI;
    neighbourPatch  ACMI2_couple;
    nonOverlapPatch ACMI1_blockage;
    faces
    (
        (2 6 5 1)
    );
}
ACMI1_blockage
{
    type wall;
    faces
    (
        (2 6 5 1)
    );
}
ACMI2_couple
{
    type            cyclicACMI;
    neighbourPatch  ACMI1_couple;
    nonOverlapPatch ACMI2_blockage;
    faces
    (
        (8 12 15 11)
    );
}
ACMI2_blockage
{
    type wall;
    faces
    (
        (8 12 15 11)
    );
}
</syntaxhighlight>
これにより、1つは結合挙動(ACMI1_couple, ACMI2_couple)で、もう1つは壁挙動(ACMI1_blockage, ACMI2_blockage)で重複したバッフルが生成されます。メッシュ生成時に警告が出力されます。
<syntaxhighlight>
Trying to specify a boundary face on the face on cell
which already belongs to some other patch
</syntaxhighlight>
というのも、1つは16角形(6面)の形状に7面(2面は重複)を指定しているからです。
このトポロジーを生成する「古い」メソッドでは、createBafflesを別のcreateBafflesDictで使用しています。
注意。
不本意ながら blockMesh が重複した境界面を定義した場合、これは以前の致命的なエラーではなく警告となります。重複した内部面を定義すると、以前と同様に致命的なエラーが発生します。
新しい blockMesh メソッドを使用すると、パッチの順序が少し変わるかもしれません (パッチエンプティが最後になりました)。これにより、セルの中心やセルの体積などの幾何学的なプリミティブ計算では、わずかに異なる切り捨てエラーが発生し、結果にわずかに影響を与える可能性があります。これは浮動小数点値を使用するすべてのアルゴリズムの一般的な問題であり、blockMesh メソッドは実際にはより一貫したパッチの順序を使用しており、パッチエンプティが最後になるはずです。
ソースコード
FOAM_SRC/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
チュートリアル
$FOAM_UTILITIES/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D




=== 新ランプ機能1 ===
このリリースには、Function1修飾子としてシンプルなステップ関数が含まれています。これは、オフからオンへの移行にステップ変更が必要な場合に便利であり、継続時間の規定もあります。例としては、WindshieldCondensationチュートリアルで、入口速度場を制御するために使用されています。
<syntaxhighlight>
// Heater on at 60s
inlet
{
    type            uniformNormalFixedValue;
    uniformValue    constant -2;
    ramp
    {
        type        step;
        start      60;
        duration    1000;
    }
}
</syntaxhighlight>
これは、60秒でオンになる通常のインレット速度を指定します。
古いバージョンでは、これは比較的シャープな遷移を持つ表として指定することができましたが、この方法では目立ちにくく、値や時間点を調整する際に入力エラーが発生しやすくなります。
ソースコード
$FOAM_SRC/OpenFOAM/primitives/関数/Function1/step
チュートリアル
FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/windshieldCondensation
=== Function1の新表現版 ===
Function1型は、OpenFOAM-v1912で追加された式のインフラストラクチャを使用して、ユーザー定義の式を含むように拡張されました。これらの式では、評価引数は擬似関数 arg()として参照され、例えば、WindshieldCondensationチュートリアルでは入口温度を制御するために使用されます。
<syntaxhighlight>
// Heater on at 60s
inlet
{
    type            uniformFixedValue;
    uniformValue
    {
        type        expression;
        // arg() is time here
        expression  #{ (arg() < 60) ? 273 : 308 #};
    }
}
</syntaxhighlight>
これは、60秒での入口温度の単純なステップ変化を指定しています。
ソースコード
$FOAM_SRC/OpenFOAM/expressions/Function1
チュートリアル
FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/windshieldCondensation
=== PatchFunction1の新しい表現バージョン ===
PatchFunction1のランタイム入力選択には、空間的にも時間的にも変化する値に対してユーザーが定義した式を可能にする式バージョンが含まれるように拡張されました。空間的な変化には、通常、顔の中心位置のためのpos()関数が含まれます。
<syntaxhighlight>
inlet
{
    type            uniformFixedValue;
    uniformValue
    {
        type        expression;
        // arg() and time() can be used synonymous here
        expression  #{ time() <= 1 ? 1 : 0 #};
    }
}
</syntaxhighlight>
ソースコード
$FOAM_SRC/finiteVolume/expressions/PatchFunction1
チュートリアル
$FOAM_TUTORIALS/multiphase/MPPICInterFoam/twoPhasePachuka
=== 新しいコード化されたPatchFunction1 ===
PatchFunction1のランタイム入力選択は、コード化されたバージョンを含むように拡張されており、例えば、0/Uフィールド定義のicoFoamの蓋駆動チュートリアルでは、コード化されたバージョンが含まれています。
<syntaxhighlight>
type            uniformFixedValue;
uniformValue
{
    type            coded;
    // Explictly supply name of generated PatchFunction1. Only needed
    // if entryname ('uniformValue') would clash with existing
    // runtime selection tables.
    name            myExpression;
    code
    #{
        const polyPatch& pp = this->patch();
        const fvMesh& fvm = dynamic_cast<const fvMesh&>
        (
            pp.boundaryMesh().mesh()
        );
        const fvPatch& fvp = fvm.boundary()[pp.index()];
        // Get face centroids
        tmp<vectorField> tfld(tmp<vectorField>::New(fvp.Cf()));
        // Zero out y,z
        tfld.ref().replace(vector::Y, Zero);
        tfld.ref().replace(vector::Z, Zero);
        return tfld;
    #};
}
</syntaxhighlight>
これは、面の中心に応じてx成分が設定されるベロシティを提供します。
ソースコード
$FOAM_SRC/meshTools/PatchFunction1/CodedField
チュートリアル
$foam_tutorials/multiphase/icoReactingMultiPhaseInterFoam/poolEvaporationのmultiphase/icoReactingMultiPhaseInterFoam/poolEvaporation
=== snappyHexMesh: ギャップの絞り込み制御を無効にするようにしました。 ===
snappyHexMeshには、小さな隙間を自動的に絞り込むオプションがあります。このバージョンでは、同じ曲面からのギャップに対して、オプションでこのオプションを無効にすることができます。これは、例を見ていただくとわかりやすいと思います。
<syntaxhighlight>
refinementRegions
{
    refinezone
    {
        mode        inside;
        levels      ((0.0 0));  // Dummy entry
        gapLevel    (4 0 10);  // Guarantee 4 cells in all gaps
        gapMode    outside;    // If the gap is on the outside of the surface
        gapSelf    false;      // Disable any refinement from same surface
    }
}
</syntaxhighlight>
snappyHexMeshDict辞書の上記のエントリは、次のことを確実にします。
ギャップ内に少なくとも4層のセルがあること
ここで,ギャップは任意の場所にあり,法線を外側に向けた2つの反対側の面があります: gapMode outside.
であり、サーフェスが異なる場合は gapSelf false となります。
ジオメトリは球体(緑)と(不要な)ギャップ(ピンク)のある「正方形」です。self」ギャップ検出を無効にすると、メッシュは(洗練のみ、スナップなし)になります。
これは、ギャップリファインメントのためにギャップを介してブリードするデフォルトの方法と比較してください。
ソースコード
$FOAM_SRC/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C
詳細情報
1463号を参照




== 数値演算 ==
== 数値演算 ==


=== 改良された任意メッシュインターフェース (AMI) ===
== 見出し文 ==





2020年6月30日 (火) 22:52時点における版

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{}))


patterns

これはOpenFOAMのコーディングパターン集の最初のスタートです。 コーディングパターンとは、頻繁に遭遇するイディオムのことで、理由がすぐには明らかではない場合や、特定のアプローチを使うことにメリットがある場合を指します。 有志の方からのコンテンツを取り入れることができるのは嬉しいですね! 今のところ、特に構成はありませんが、将来的にはコンテンツを追加していくことで改善していきたいと考えています。


前処理

blockMesh ユーティリティの改善

blockMesh は、より高速なトポロジカルマージを使用するようになり、高アスペクト比メッシュでよりよく機能するようになりました。ポイントベースのマージが望ましい場合は、コマンドラインで指定された blockMeshDict または blockMesh -merge-points に mergeType points; を追加することができます。 新しいblockMesh -write-vtkオプションはblockTopology.vtuファイル(VTK、ASCII、XML)を生成し、ParaViewでロードして検査することができます。これにより、追加のプラグインを必要とせずに、どのバージョンのParaViewでもblockMesh構造を直接検査できるシンプルで堅牢な方法が提供されます。


blockMeshを使用した重複バッフルの生成

このリリースでは、blockMesh ユーティリティを拡張し、重複バッフルを生成する機能を提供します。これらは、面領域が体積保存に従うように操作された重複した面です。例えば、cyclicACMIパッチでは、壁のビヘイビアを提供するパッチと多対多の連成ビヘイビアを提供するパッチがあります。 blockMeshDict はこれらの重複バッフルを直接指定できるようになりました。

ACMI1_couple
{
    type            cyclicACMI;
    neighbourPatch  ACMI2_couple;
    nonOverlapPatch ACMI1_blockage;
    faces
    (
        (2 6 5 1)
    );
}
ACMI1_blockage
{
    type wall;
    faces
    (
        (2 6 5 1)
    );
}
ACMI2_couple
{
    type            cyclicACMI;
    neighbourPatch  ACMI1_couple;
    nonOverlapPatch ACMI2_blockage;
    faces
    (
        (8 12 15 11)
    );
}
ACMI2_blockage
{
    type wall;
    faces
    (
        (8 12 15 11)
    );
}

これにより、1つは結合挙動(ACMI1_couple, ACMI2_couple)で、もう1つは壁挙動(ACMI1_blockage, ACMI2_blockage)で重複したバッフルが生成されます。メッシュ生成時に警告が出力されます。

Trying to specify a boundary face on the face on cell
which already belongs to some other patch

というのも、1つは16角形(6面)の形状に7面(2面は重複)を指定しているからです。 このトポロジーを生成する「古い」メソッドでは、createBafflesを別のcreateBafflesDictで使用しています。

注意。

不本意ながら blockMesh が重複した境界面を定義した場合、これは以前の致命的なエラーではなく警告となります。重複した内部面を定義すると、以前と同様に致命的なエラーが発生します。 新しい blockMesh メソッドを使用すると、パッチの順序が少し変わるかもしれません (パッチエンプティが最後になりました)。これにより、セルの中心やセルの体積などの幾何学的なプリミティブ計算では、わずかに異なる切り捨てエラーが発生し、結果にわずかに影響を与える可能性があります。これは浮動小数点値を使用するすべてのアルゴリズムの一般的な問題であり、blockMesh メソッドは実際にはより一貫したパッチの順序を使用しており、パッチエンプティが最後になるはずです。

ソースコード FOAM_SRC/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C チュートリアル $FOAM_UTILITIES/incompressible/pimpleFoam/RAS/oscillatingInletACMI2D


新ランプ機能1

このリリースには、Function1修飾子としてシンプルなステップ関数が含まれています。これは、オフからオンへの移行にステップ変更が必要な場合に便利であり、継続時間の規定もあります。例としては、WindshieldCondensationチュートリアルで、入口速度場を制御するために使用されています。

// Heater on at 60s
inlet
{
    type            uniformNormalFixedValue;
    uniformValue    constant -2;
    ramp
    {
        type        step;
        start       60;
        duration    1000;
    }
}

これは、60秒でオンになる通常のインレット速度を指定します。 古いバージョンでは、これは比較的シャープな遷移を持つ表として指定することができましたが、この方法では目立ちにくく、値や時間点を調整する際に入力エラーが発生しやすくなります。

ソースコード $FOAM_SRC/OpenFOAM/primitives/関数/Function1/step チュートリアル FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/windshieldCondensation


Function1の新表現版

Function1型は、OpenFOAM-v1912で追加された式のインフラストラクチャを使用して、ユーザー定義の式を含むように拡張されました。これらの式では、評価引数は擬似関数 arg()として参照され、例えば、WindshieldCondensationチュートリアルでは入口温度を制御するために使用されます。

// Heater on at 60s
inlet
{
    type            uniformFixedValue;
    uniformValue
    {
        type        expression;
        // arg() is time here
        expression  #{ (arg() < 60) ? 273 : 308 #};
    }
}

これは、60秒での入口温度の単純なステップ変化を指定しています。

ソースコード $FOAM_SRC/OpenFOAM/expressions/Function1 チュートリアル FOAM_TUTORIALS/heatTransfer/chtMultiRegionFoam/windshieldCondensation


PatchFunction1の新しい表現バージョン

PatchFunction1のランタイム入力選択には、空間的にも時間的にも変化する値に対してユーザーが定義した式を可能にする式バージョンが含まれるように拡張されました。空間的な変化には、通常、顔の中心位置のためのpos()関数が含まれます。

inlet
{
    type            uniformFixedValue;
    uniformValue
    {
        type        expression;

        // arg() and time() can be used synonymous here
        expression  #{ time() <= 1 ? 1 : 0 #};
    }
}

ソースコード $FOAM_SRC/finiteVolume/expressions/PatchFunction1 チュートリアル $FOAM_TUTORIALS/multiphase/MPPICInterFoam/twoPhasePachuka


新しいコード化されたPatchFunction1

PatchFunction1のランタイム入力選択は、コード化されたバージョンを含むように拡張されており、例えば、0/Uフィールド定義のicoFoamの蓋駆動チュートリアルでは、コード化されたバージョンが含まれています。


type            uniformFixedValue;
uniformValue
{
    type            coded;
    // Explictly supply name of generated PatchFunction1. Only needed
    // if entryname ('uniformValue') would clash with existing
    // runtime selection tables.
    name            myExpression;

    code
    #{
        const polyPatch& pp = this->patch();
        const fvMesh& fvm = dynamic_cast<const fvMesh&>
        (
            pp.boundaryMesh().mesh()
        );
        const fvPatch& fvp = fvm.boundary()[pp.index()];

        // Get face centroids
        tmp<vectorField> tfld(tmp<vectorField>::New(fvp.Cf()));

        // Zero out y,z
        tfld.ref().replace(vector::Y, Zero);
        tfld.ref().replace(vector::Z, Zero);
        return tfld;
    #};
}

これは、面の中心に応じてx成分が設定されるベロシティを提供します。

ソースコード $FOAM_SRC/meshTools/PatchFunction1/CodedField チュートリアル $foam_tutorials/multiphase/icoReactingMultiPhaseInterFoam/poolEvaporationのmultiphase/icoReactingMultiPhaseInterFoam/poolEvaporation


snappyHexMesh: ギャップの絞り込み制御を無効にするようにしました。

snappyHexMeshには、小さな隙間を自動的に絞り込むオプションがあります。このバージョンでは、同じ曲面からのギャップに対して、オプションでこのオプションを無効にすることができます。これは、例を見ていただくとわかりやすいと思います。

refinementRegions
{
    refinezone
    {
        mode        inside;
        levels      ((0.0 0));  // Dummy entry
        gapLevel    (4 0 10);   // Guarantee 4 cells in all gaps
        gapMode     outside;    // If the gap is on the outside of the surface
        gapSelf     false;      // Disable any refinement from same surface
    }
}

snappyHexMeshDict辞書の上記のエントリは、次のことを確実にします。 ギャップ内に少なくとも4層のセルがあること ここで,ギャップは任意の場所にあり,法線を外側に向けた2つの反対側の面があります: gapMode outside. であり、サーフェスが異なる場合は gapSelf false となります。 ジオメトリは球体(緑)と(不要な)ギャップ(ピンク)のある「正方形」です。self」ギャップ検出を無効にすると、メッシュは(洗練のみ、スナップなし)になります。

これは、ギャップリファインメントのためにギャップを介してブリードするデフォルトの方法と比較してください。

ソースコード $FOAM_SRC/mesh/snappyHexMesh/meshRefinement/meshRefinementGapRefine.C 詳細情報 1463号を参照


数値演算

改良された任意メッシュインターフェース (AMI)

見出し文

ソルバーと物理モデル

境界条件

後処理

ビルドシステム

ドキュメント