「OpenFOAM v2006 リリースノート」の版間の差分
(→数値演算) |
|||
768行目: | 768行目: | ||
=== 改良された任意メッシュインターフェース (AMI) === | === 改良された任意メッシュインターフェース (AMI) === | ||
AMI コードは大幅なリファクタリングが行われ、オプションのトポロジカル変更を含むように拡張されました。 | |||
'''AMI コードリファクタリング''' | |||
AMIコアが更新され、ユーザーレベルの下位互換性を維持しつつ、より大きな制御と簡単なコードメンテナンスを可能にしました。AMIコントロールが公開され、constant/polyMesh/boundaryファイルで指定できるようになりました。 | |||
<syntaxhighlight> | |||
AMI1 | |||
{ | |||
type cyclicAMI; | |||
inGroups 1(cyclicAMI); | |||
nFaces 2880; | |||
startFace 276288; | |||
matchTolerance 0.0001; | |||
transform noOrdering; | |||
neighbourPatch AMI2; | |||
// Exposed entries | |||
AMIMethod faceAreaWeightAMI; | |||
restartUncoveredSourceFace yes; | |||
} | |||
</syntaxhighlight> | |||
追加の改良点。 | |||
directAMIメソッドは廃止されました。新しい nearestFaceAMIメソッドは、低コストで同等の機能を提供します。 | |||
faceAreaWeightAMIメソッドで使用されていた顔照合手順が、バッフルを「歩く」ことができるようになり、より完全なアドレッシングと重みが提供されるようになりました。 | |||
'''トポロジカル変化を伴うAMI''' | |||
注意: これはベータレベルのコードで、妥当なテストが行われ、堅牢であることが示されています。 | |||
このリリースでは、cyclicAMIとcyclicACMIパッチにトポロジカル変更機能が追加されました。これにより、AMIの多対多のアドレッシングが、Aguerreらによって記述されたアプローチを使用して、結合されたパッチの両側の面間で1対1の面のマッチングを構築するために使用されます(参考文献参照)。 | |||
トポロジカルな変更は、constant/dynamicFvMeshDictファイルで新しいモーションソルバーを選択したときに有効になります。 | |||
<syntaxhighlight> | |||
dynamicFvMesh dynamicMotionSolverFvMeshAMI; | |||
</syntaxhighlight> | |||
注意: これは将来のリリースでは、「標準」のdynamicMotionSolverFvMeshモデルに吸収される可能性があります。 | |||
この効果は、AMIパッチ全体での保存を確実にし、力とモーメントの予測を改善するために圧力の数値ノイズを除去することにあります。 | |||
既知の問題 | |||
restart は現在のところトポロジカルな変更には対応していません。 | |||
ソースコード | |||
FOAM_SRC/meshTools/AMIInterpolation | |||
チュートリアル | |||
FOAM_TUTORIALS/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/mixerVesselAMI2D-topologyChange | |||
参考文献 | |||
H.J. Aguerre, S. Marquez Damian J.M. Gimenez, N.M. Nigro, Conservative handling of arbitrary non-conformal interfaces using an efficient supermesh, Journal of Computational Physics 335(15)21-49. 2017. https://doi.org/10.1016/j.jcp.2017.01.018 | |||
謝辞 | |||
方法論を我々に注目させ、これらの開発を通して多くの有益な議論とテストを行ってくれたHoracio Aguerre氏とSantiago Marquez氏に多くの感謝の意を表します。 | |||
=== 新しいOpenQBMMコミュニティモジュール === | |||
OpenQBMMモジュールは、母集団バランスモデリングと多相流のための直交法ベースのモーメント法で構成されています。OpenQBMMは、キャリア流体中の非慣性粒子の最も単純なサイズ変化から、気液系の気泡や気粒子流中の慣性粒子を含むより複雑なケースまで、多分散多相流を記述するための手法を実装しています。これらの機能は、一連のソルバーで実装されています。 | |||
pbeFoamは、単一の制御体積で母集団バランス方程式を解きます。このソルバーは、母集団均衡方程式のカーネル関数をテストしたり、空間的に均質な問題を解くのに役立ちます。例題はOpenQBMM/validation/pbeFoamにあり、E. Madadi-Kandjani, A. Passalacqua, An extended quadrature-based moment method with log-normal kernel density functions, Chemical Engineering Science. 131 (2015) 323339. https://doi.org/10.1016/j.ces.2015.04.005。 | |||
pbeTransportFoamを使用すると、凍結した流れ場を使用して、事前に課された流れの動きを持つ母集団均衡方程式を解くことができます。検証事例はOpenQBMM/validation/pbeTransportFoam/serraTaylorCouetteにあり、A. Passalacqua, F. Laurent, E. Madadi-Kandjani, J.C. Heylmun, R.O. Fox, An open-source quadrature-based population balance solver for OpenFOAM, Chemical Engineering Scienceで議論されています。176 (2018) 306318. https://doi.org/10.1016/j.ces.2017.10.043。 | |||
buoyantPbePimpleFoamは、母集団均衡方程式を持つ過渡的な流れをモデル化することを可能にします。 | |||
polydisperseBubbleFoamは、合体と破断による気泡サイズの進化を伴う気液流に特化したソルバーです。気泡は速度分布を持つことができ、多面性も考慮され、同じ制御体積内で異なるサイズの気泡が異なる速度を持つことができます。例題はOpenQBMM/validation/polydisperseBubbleFoamにありますが、実装についてはJ.C. Heylmun, B. Kong, A. Passalacqua, R.O. Fox, A quadrature-based moment method for polydisperse bubbly flows, Computer Physics Communicationsの論文で議論されています。244 (2019) 187204. https://doi.org/10.1016/j.cpc.2019.06.005。 | |||
denseAGFoamは、密な気体粒子流のための異方性ガウスモデルを実装しています。実装の詳細は、B. Kong, R.O. Fox, A solution algorithm for fluid-particle flows across all flow regimes, Journal of Computational Physics. 344 (2017) 575594. https://doi.org/10.1016/j.jcp.2017.05.013。 | |||
velocityDistribitionTransportのソルバーは、速度分布のための直交法に基づくモーメント法を実装しています。これらの手法は、粒子や液滴のジェットが交差するような非平衡速度分布を持つ分散流を記述するのに適しています。diluteVdfTransportFoamソルバーは、担体流体に結合していない分散相のための直交法に基づく速度分布輸送アルゴリズムを実装しています。分散相とキャリア流体の間の一方向結合は、oneWayCoupledVdfTransportFoamを実装しています。両方のソルバーでは、粒子径は空間と時間で進化することができ、粒子は衝突を介して相互作用することができます。 | |||
ソースコード | |||
$WM_PROJECT_DIR/modules/OpenQBMM | |||
チュートリアル | |||
$WM_PROJECT_DIR/modules/OpenQBMM/tutorials | |||
バリデーションケース | |||
$WM_PROJECT_DIR/modules/OpenQBMM/validation | |||
帰属 | |||
Alberto PassalacquaとOpenQBMMコミュニティ | |||
=== 新しい密行列固有分解ソルバー.固有行列 === | |||
新しい EigenMatrix ソルバーは,対角化可能な密行列,非対称行列,実数正方行列の eigendecomposition を行います. | |||
EigenMatrix は行列を正規形に分解します. | |||
固有値の方程式,すなわち固有値問題は,次のように書かれます. | |||
Av = λv | |||
ここで | |||
A : m x m 次元の対角化可能な正方行列 | |||
v : 次元 m の(非ゼロではない)ベクトル(右固有ベクトル | |||
λ : v(固有値)に対応するスカラー | |||
Aが対称であれば、次の関係を満たす。 | |||
A = v * D * v^T | |||
孰れ | |||
D : 対角実固有値行列 | |||
v : 直交固有ベクトル行列 | |||
Aが対称でない場合、Dはブロック対角行列となり、実数固有値は1×1ブロック内の対角線上に存在し、複素数固有値は2×2ブロック内に存在します。 | |||
vの列は固有値に対応する固有ベクトルを表し、固有値の方程式を満たします。行列の固有値は一意であっても,行列の固有ベクトルは一意ではない.同じ固有値に対して、対応する固有ベクトルは、一意ではない項目を持つ実数または複素数であることがあります。さらに、A = v ∗ D ∗ vT の方程式の有効性は v の条件数に依存しますが、これは条件付きではない場合もあれば、無効な方程式の場合は特異値になる場合もあります。 | |||
このソルバーの最小動作例を以下に示します。 | |||
<syntaxhighlight> | |||
// A is a m-by-m SquareMatrix<scalar>. | |||
const EigenMatrix<scalar> EM(A); | |||
const DiagonalMatrix<scalar>& realEigenvalues = EM.EValsRe(); | |||
const DiagonalMatrix<doubleScalar>& imagEigenvalues = EM.EValsIm(); | |||
const SquareMatrix<scalar> eigenvectors(EM.EVecs()); | |||
const SquareMatrix<complex> complexEigenvectors(EM.complexEVecs()); | |||
</syntaxhighlight> | |||
ソースコード | |||
FOAM_SRC/OpenFOAM/matrices/EigenMatrix.C | |||
チュートリアル | |||
$FOAM_APP/test/matrix/EigenMatrix/Test-EigenMatrix.C | |||
帰属 | |||
本実装は、OpenQBMMのeigenSolverクラス(2019)の内部機構を変更せずに統合したものです。したがって、入力-プロセス-出力演算の点では、EigenMatrixクラスとeigenSolver(2019)クラスの違いは期待できないはずです。 | |||
OpenQBMMのeigenSolverクラスは、NISTとMathWorksが1998年から2012年までに開発したパブリックドメインライブラリであるTNT/JAMAの実装からほぼ完全に派生しており、http://math.nist.gov/tnt/index.html で入手可能です(Geturled June 6, 2020)。彼らの実装はEISPACKをベースにしています。 | |||
OpenCFDはOpenQBMMへの貢献者、特にAlberto Passalacqua博士(アイオワ州立大学)に感謝します。 | |||
== 見出し文 == | == 見出し文 == |
2020年6月30日 (火) 22:59時点における版
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)
AMI コードは大幅なリファクタリングが行われ、オプションのトポロジカル変更を含むように拡張されました。
AMI コードリファクタリング
AMIコアが更新され、ユーザーレベルの下位互換性を維持しつつ、より大きな制御と簡単なコードメンテナンスを可能にしました。AMIコントロールが公開され、constant/polyMesh/boundaryファイルで指定できるようになりました。
AMI1
{
type cyclicAMI;
inGroups 1(cyclicAMI);
nFaces 2880;
startFace 276288;
matchTolerance 0.0001;
transform noOrdering;
neighbourPatch AMI2;
// Exposed entries
AMIMethod faceAreaWeightAMI;
restartUncoveredSourceFace yes;
}
追加の改良点。
directAMIメソッドは廃止されました。新しい nearestFaceAMIメソッドは、低コストで同等の機能を提供します。 faceAreaWeightAMIメソッドで使用されていた顔照合手順が、バッフルを「歩く」ことができるようになり、より完全なアドレッシングと重みが提供されるようになりました。
トポロジカル変化を伴うAMI
注意: これはベータレベルのコードで、妥当なテストが行われ、堅牢であることが示されています。 このリリースでは、cyclicAMIとcyclicACMIパッチにトポロジカル変更機能が追加されました。これにより、AMIの多対多のアドレッシングが、Aguerreらによって記述されたアプローチを使用して、結合されたパッチの両側の面間で1対1の面のマッチングを構築するために使用されます(参考文献参照)。 トポロジカルな変更は、constant/dynamicFvMeshDictファイルで新しいモーションソルバーを選択したときに有効になります。
dynamicFvMesh dynamicMotionSolverFvMeshAMI;
注意: これは将来のリリースでは、「標準」のdynamicMotionSolverFvMeshモデルに吸収される可能性があります。 この効果は、AMIパッチ全体での保存を確実にし、力とモーメントの予測を改善するために圧力の数値ノイズを除去することにあります。
既知の問題
restart は現在のところトポロジカルな変更には対応していません。 ソースコード FOAM_SRC/meshTools/AMIInterpolation チュートリアル FOAM_TUTORIALS/incompressible/pimpleFoam/laminar/mixerVesselAMI2D/mixerVesselAMI2D-topologyChange 参考文献 H.J. Aguerre, S. Marquez Damian J.M. Gimenez, N.M. Nigro, Conservative handling of arbitrary non-conformal interfaces using an efficient supermesh, Journal of Computational Physics 335(15)21-49. 2017. https://doi.org/10.1016/j.jcp.2017.01.018 謝辞 方法論を我々に注目させ、これらの開発を通して多くの有益な議論とテストを行ってくれたHoracio Aguerre氏とSantiago Marquez氏に多くの感謝の意を表します。
新しいOpenQBMMコミュニティモジュール
OpenQBMMモジュールは、母集団バランスモデリングと多相流のための直交法ベースのモーメント法で構成されています。OpenQBMMは、キャリア流体中の非慣性粒子の最も単純なサイズ変化から、気液系の気泡や気粒子流中の慣性粒子を含むより複雑なケースまで、多分散多相流を記述するための手法を実装しています。これらの機能は、一連のソルバーで実装されています。
pbeFoamは、単一の制御体積で母集団バランス方程式を解きます。このソルバーは、母集団均衡方程式のカーネル関数をテストしたり、空間的に均質な問題を解くのに役立ちます。例題はOpenQBMM/validation/pbeFoamにあり、E. Madadi-Kandjani, A. Passalacqua, An extended quadrature-based moment method with log-normal kernel density functions, Chemical Engineering Science. 131 (2015) 323339. https://doi.org/10.1016/j.ces.2015.04.005。
pbeTransportFoamを使用すると、凍結した流れ場を使用して、事前に課された流れの動きを持つ母集団均衡方程式を解くことができます。検証事例はOpenQBMM/validation/pbeTransportFoam/serraTaylorCouetteにあり、A. Passalacqua, F. Laurent, E. Madadi-Kandjani, J.C. Heylmun, R.O. Fox, An open-source quadrature-based population balance solver for OpenFOAM, Chemical Engineering Scienceで議論されています。176 (2018) 306318. https://doi.org/10.1016/j.ces.2017.10.043。
buoyantPbePimpleFoamは、母集団均衡方程式を持つ過渡的な流れをモデル化することを可能にします。
polydisperseBubbleFoamは、合体と破断による気泡サイズの進化を伴う気液流に特化したソルバーです。気泡は速度分布を持つことができ、多面性も考慮され、同じ制御体積内で異なるサイズの気泡が異なる速度を持つことができます。例題はOpenQBMM/validation/polydisperseBubbleFoamにありますが、実装についてはJ.C. Heylmun, B. Kong, A. Passalacqua, R.O. Fox, A quadrature-based moment method for polydisperse bubbly flows, Computer Physics Communicationsの論文で議論されています。244 (2019) 187204. https://doi.org/10.1016/j.cpc.2019.06.005。
denseAGFoamは、密な気体粒子流のための異方性ガウスモデルを実装しています。実装の詳細は、B. Kong, R.O. Fox, A solution algorithm for fluid-particle flows across all flow regimes, Journal of Computational Physics. 344 (2017) 575594. https://doi.org/10.1016/j.jcp.2017.05.013。
velocityDistribitionTransportのソルバーは、速度分布のための直交法に基づくモーメント法を実装しています。これらの手法は、粒子や液滴のジェットが交差するような非平衡速度分布を持つ分散流を記述するのに適しています。diluteVdfTransportFoamソルバーは、担体流体に結合していない分散相のための直交法に基づく速度分布輸送アルゴリズムを実装しています。分散相とキャリア流体の間の一方向結合は、oneWayCoupledVdfTransportFoamを実装しています。両方のソルバーでは、粒子径は空間と時間で進化することができ、粒子は衝突を介して相互作用することができます。
ソースコード $WM_PROJECT_DIR/modules/OpenQBMM チュートリアル $WM_PROJECT_DIR/modules/OpenQBMM/tutorials バリデーションケース $WM_PROJECT_DIR/modules/OpenQBMM/validation 帰属 Alberto PassalacquaとOpenQBMMコミュニティ
新しい密行列固有分解ソルバー.固有行列
新しい EigenMatrix ソルバーは,対角化可能な密行列,非対称行列,実数正方行列の eigendecomposition を行います. EigenMatrix は行列を正規形に分解します. 固有値の方程式,すなわち固有値問題は,次のように書かれます.
Av = λv
ここで
A : m x m 次元の対角化可能な正方行列 v : 次元 m の(非ゼロではない)ベクトル(右固有ベクトル λ : v(固有値)に対応するスカラー Aが対称であれば、次の関係を満たす。
A = v * D * v^T
孰れ
D : 対角実固有値行列 v : 直交固有ベクトル行列 Aが対称でない場合、Dはブロック対角行列となり、実数固有値は1×1ブロック内の対角線上に存在し、複素数固有値は2×2ブロック内に存在します。 vの列は固有値に対応する固有ベクトルを表し、固有値の方程式を満たします。行列の固有値は一意であっても,行列の固有ベクトルは一意ではない.同じ固有値に対して、対応する固有ベクトルは、一意ではない項目を持つ実数または複素数であることがあります。さらに、A = v ∗ D ∗ vT の方程式の有効性は v の条件数に依存しますが、これは条件付きではない場合もあれば、無効な方程式の場合は特異値になる場合もあります。 このソルバーの最小動作例を以下に示します。
// A is a m-by-m SquareMatrix<scalar>.
const EigenMatrix<scalar> EM(A);
const DiagonalMatrix<scalar>& realEigenvalues = EM.EValsRe();
const DiagonalMatrix<doubleScalar>& imagEigenvalues = EM.EValsIm();
const SquareMatrix<scalar> eigenvectors(EM.EVecs());
const SquareMatrix<complex> complexEigenvectors(EM.complexEVecs());
ソースコード FOAM_SRC/OpenFOAM/matrices/EigenMatrix.C チュートリアル $FOAM_APP/test/matrix/EigenMatrix/Test-EigenMatrix.C 帰属 本実装は、OpenQBMMのeigenSolverクラス(2019)の内部機構を変更せずに統合したものです。したがって、入力-プロセス-出力演算の点では、EigenMatrixクラスとeigenSolver(2019)クラスの違いは期待できないはずです。 OpenQBMMのeigenSolverクラスは、NISTとMathWorksが1998年から2012年までに開発したパブリックドメインライブラリであるTNT/JAMAの実装からほぼ完全に派生しており、http://math.nist.gov/tnt/index.html で入手可能です(Geturled June 6, 2020)。彼らの実装はEISPACKをベースにしています。 OpenCFDはOpenQBMMへの貢献者、特にAlberto Passalacqua博士(アイオワ州立大学)に感謝します。