OpenFOAM v2506 リリースノート
Keysight OpenCFD、OpenFOAM® v2506をリリース
5月1日より、OpenFOAM TeamはKeysight Technologiesの一員となりました。新しいKeysightのプロセスや組織構造への適応、および新しい同僚の間でOpenFOAMの認知度を高める活動など、統合作業によってTeamは多忙な日々を送っています。OpenFOAM Development Teamの構成に変更はなく、オープンソースに対する方針への取り組みも変わりません。リリースについても、これまでと同じスケジュールで継続されます。
7月にはドイツおよびインドから新しいメンバーを迎える予定で、今後数か月でDevelopment Teamをさらに拡大する計画です(求人情報も近日中に公開予定です)。
OpenFOAM Teamは、2025年6月リリースとなるOpenFOAM® v2506を発表しました。このリリースでは、OpenFOAM-v2412の機能を、コードの多くの領域にわたって拡張しています。
新しい機能は、OpenCFDの顧客による支援を受けた開発、社内資金による開発、およびOpenFOAM communityから提供された機能や変更を統合したものです。
OpenFOAMはOpenCFDによってGPL Licenseの下で配布されています。
さまざまなLinuxおよびその他のPOSIXシステムでコンパイル可能なソースコードパッケージに加え、このリリースでは複数のコンパイル済みバイナリパッケージも提供されています。
Ubuntu Linux: Ubuntu 24.04(LTS)、22.04(LTS)向けのパッケージインストール。
openSUSE Linux: Leap 15.6、15.5向けのパッケージインストール。
Redhat Linux系: epel 9、Fedora 41、42向けのパッケージインストール。
Windowsユーザーには、コンパイル済みパッケージを利用するための3つの選択肢があります(詳細情報)。
Windows Subsystem for Linuxを使用する方法(Ubuntu、openSUSEなどをベースとする)。
クロスコンパイルによるネイティブ実行ファイルを使用する方法。
Dockerを使用する方法。
OpenFOAMのApptainerサポートは、事前に構築されたイメージではなく、description fileによって提供されます。
packaging/containersを参照してください。
macOSユーザーはソースコードからコンパイルするか、コンパイル済みパッケージをDocker containerから利用できます(詳細情報)。
ニュース
今後数週間で、公開コードリポジトリをhttps://develop.openfoam.comからhttps://gitlab.com/openfoamへ移行する予定です。
この変更はコラボレーションの強化を目的としています。例えば、よりgit-flowに近い形で、ユーザーがコードをforkし、ローカルで変更を行い、その変更をOpenFOAM Teamへ取り込むためのpull request/merge requestを発行できるようになります。
残念ながら、ユーザーアカウントを移行することはできません。
issue trackerやmerge requestなどに参加するユーザーは、https://gitlab.com上で新たにアカウントを作成する必要があります。
前処理
refineMeshの改良
refineMeshユーティリティでは、ユーザー定義の座標系を使用して細分化方向を指定できるようになりました。
例えば、以下のように設定します。
coordinateSystem user;
userCoeffs
{
type cylindrical;
origin (0 0 0);
e1 (1 0 0); // tan1 direction
e3 (0 1 0); // normal direction
}
以下に、円筒ケースにおいて半径方向へ2段階の細分化を適用した例を示します。
チュートリアル
$FOAM_TUTORIALS/mesh/refineMesh/cylinder
ソースコード
$FOAM_SRC/utilities/mesh/manipulation/refineMesh
境界条件
境界constraintの改良
constraint境界のvalue fieldは、値の代入時に明示的に更新されるようになりました。
これにより、例えばbuoyantSimpleFoamで知られていた問題が解決されます。buoyantSimpleFoamでは修正圧力(p_rgh)を解き、圧力(p)を明示的に更新します。この変更はunder-relaxation(不足緩和)にも適用されます。
一例として、fanなどのjump cyclic条件を使用するケースがあります。この場合、fan jumpはconstraintであり、解析全体を通して考慮される必要があります。
この変更により、constraint境界条件が一貫して適用されていなかった以前のバージョン(v2306より前)のコード動作が復元されます。
下図はbuoyantSimpleFoamのケースから得られたものです。流れは左側から流入し(流れ方向はX軸に沿っています)、fan境界を通過することで旋回(オレンジ色のglyph)を持つようになります。
ソースコード
$FOAM_SRC/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C
Merge request
Issue
数値計算
GAMG agglomerationの改良
GAMG agglomeration tableの名前を指定できるようになりました。
これにより、デフォルト名であるGAMGAgglomerationを上書きし、変数ごとに異なるagglomerationアルゴリズムや設定を使用できます。
例えば、以下のように設定します。
h
{
solver GAMG;
// Optional name (default is GAMGAgglomeration)
name hAgglomeration;
agglomerator algebraicPair;
}
この例では、変数hに対するGAMG agglomeration tableの名前としてhAgglomerationを指定し、agglomeratorとしてalgebraicPairを使用しています。
ソースコード
$FOAM_SRC/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.H
Merge request
MR !749
後処理
新しいbladeForces Function Object
新しいbladeForces Function Objectは、単一または複数のblade(例えばプロペラやタービン翼)について、推力、抗力、トルク、および揚力/抗力/圧力係数を計算します。
主な目的は、半径方向に分割された各sectionについてblade特性を求めることです。
既存のforcesおよびpropellerInfo Function Objectとは異なり、すべての局所的な物理量は円筒座標系を基準として計算されます。
出力には以下が含まれます。
半径方向の各binに対する係数
面積加重された全体の係数
積分された力およびトルク
結果は、後処理を容易に行えるようVTK(.vtp)形式でも出力されます。
すべてのsurface結果は内部的に登録され、surfaceFieldValueなどの他のFunction Objectからも利用できます。
ソースコード
$FOAM_SRC/functionObjects/forces/bladeForces
チュートリアル
$FOAM_TUTORIALS/incompressible/pimpleFoam/RAS/propeller1
新しいfieldStatistics Function Object
新しいfieldStatistics Function Objectは、ユーザーが指定したフィールドについて各種統計量を計算します。
対象フィールドについて利用可能な統計量は以下の通りです。
min | 最小値
max | 最大値
mean | 算術平均値
variance | 標本分散(不偏分散)
出力する統計量は、例えばUx、Uy、Uzのようなフィールドの各成分について求めることができます。また、mag(U)のようにフィールドの大きさについて求めることもできます。
平均値は、算術平均または体積加重算術平均を使用して計算できます。
さらに、統計量は計算領域全体について求めることも、internal fieldのみに限定して求めることもできます。
最小構成の使用例を以下に示します。
fieldStatistics1
{
// Mandatory entries
type fieldStatistics;
libs (fieldFunctionObjects);
fields (<wordList>);
statistics (<wordList>);
// Optional entries
mode <word>;
mean <word>;
extrema <bool>;
internal <bool>;
// Inherited entries
...
}
ソースコード
$FOAM_SRC/functionObjects/field/fieldStatistics/fieldStatistics.H
チュートリアル
$FOAM_TUTORIALS/incompressible/pisoFoam/RAS/cavity
Merge request
Merge request #732
ユーザビリティ
Homebrewインストール向けの新しいmacOSサポート
macOSユーザーは、OpenFOAMでより多くのHomebrewコンポーネントを使用できるようになりました。これには、Homebrewでインストールしたgccの使用も含まれます。
Homebrew版gccを選択するには、通常、適切なWM_COMPILE_CONTROLも指定する必要があります。
例えば、
export WM_COMPILE_CONTROL="version=15"
と指定すると、Homebrewでインストールされたgcc-15、g++-15が選択されます。
その他のHomebrewコンポーネントについては、bin/tools/foamConfigurePathsヘルパースクリプトが便利です。
例えば、
bin/tools/foamConfigurePaths -scotch-brew
を実行します。
これにより、対応するconfigファイルが編集され、versionがsystemに設定されるとともに、brew --prefix PACKAGEから取得されたインストールパスが設定されます。
既知のすべてのHomebrewコンポーネントを使用したい場合には、以下の簡単なショートカットも用意されています。
bin/tools/foamConfigurePaths -with-homebrew
これらの変更により、macOSユーザーにとってOpenFOAMがより使いやすくなることが期待されます。
一般的なユーザビリティ
Patch group
patchおよびzoneの選択・除外処理が改良され、patch groupおよびzone groupの取り扱いが簡略化されました。
この動作は、foamToEnsightやfoamToVTKなどのユーティリティ、およびensightWrite、vtkWrite Function Objectに導入されています。
軽微なユーザビリティの改善
一部の入力dictionaryでは、n(rev/s)の代わりにrpmを使用できるようになりました。
例えば、propeller Function Objectで使用できます。
並列計算
並列計算基盤の変更
今回のリリースでは、OpenFOAMとMPIを接続するbridge codeに、多数の低レベルな変更が加えられました。
これらの変更の大部分は一般ユーザーからは見えない部分ですが、スケーラビリティの向上や、将来的な通信パターンの構築に役立ちます。
MPIデータ型および演算への直接マッピング
現在では、ほとんどの通信をMPIの基本データ型および事前定義された集約MPIデータ型へ直接マッピングできるようになりました。
この変更により、fieldの通信ではバイト数ではなく要素数を送信するようになりました。
通信されるデータ量そのものは変わりませんが、通信可能なデータ項目数はそれに応じて増加します。
vectorの場合、MPIの制限に達するまでに通信可能なfieldのサイズが24倍に増加します。
データ型のマッピングはコンパイル時に行われます。
MPIデータ型へのマッピングに加えて、MPIの基本演算子についてもコンパイル時にマッピングする機能が通信基盤に追加されました。
これらの変更により、例えば以下のコード
reduce(someVectors, maxOp());
は、複数のpoint-to-point通信を実行した後にbroadcastを行うのではなく、単一のMPI Allreduce呼び出しへマッピングされるようになりました。
ノードトポロジー通信のサポート
起動時には、以下のnode communicatorが常に作成されます。
UPstream::commInterNode() - ノード間のcommunicator
UPstream::commLocalNode() - ノード内のcommunicator
これらは、より高速なローカルノード内通信を活用する、トポロジーを考慮したアルゴリズムを記述する際に役立ちます。
新しいlocal AMI communicator
cyclicA(C)MI patchを使用する大規模な並列計算では、多くの場合、AMI patchのfaceを保持しているprocessorは全processorのうちのごく一部に限られます。
今回のリリースでは、ローカルなcommunicatorを割り当てることによって、A(C)MI固有の通信に実際に参加するprocessorのみにデータ転送を限定するようになりました。
複数のAMI setを含む大規模ケースでは、これによって通信量および通信の重複を大幅に削減できる場合があります。
新しい動作は、controlDictのOptimisationSwitchesセクションにあるlocalAMIComm設定によって制御されます。
localAMIComm = 0 : 従来の動作 - すべてのprocessorを通信に含める
localAMIComm = 1 : デフォルト - patch faceを持つprocessorのみ
localAMIComm = 2 : 1と同様だが、processor 0を常に含める
option 1と2の違いは、option 1の場合、例えばAMI matchingのweightのmin/maxといった統計情報が、通常のprocessor 0ではなく、patch faceを持つprocessorのうち最も番号の小さいprocessorから出力される点です。
並列実行方法によっては、その出力がログファイル内の通常とは異なる位置に現れる場合があります。他のすべてのメッセージはprocessor 0から出力されます。
processor 0を常に追加するoption 2を使用すると、出力元を一定にすることができますが、その一方で追加のbottleneckが発生します。
4096コア上で4組のAMI pairを持つ大規模ケースを使用した代表的な例では、以下の計算時間が得られました。
communicator time [s]
0 (all cores) 11514
1 (min cores) 6349
2 (min cores + master) 6370
なお、これらの結果は1回の実行から得られたものです。
コア数が少ない場合や、AMI pairの数が少ない場合には、この変更による効果は小さくなります。
ソースコード
$FOAM_SRC/meshTools/AMIInterpolation/AMIInterpolation
コード
コミュニティ
コミュニティ貢献: Turbulence Committee
Turbulence Technical Committeeのリポジトリに、新しい機能が提供されたことをお知らせします。
- HelicitySpalartAllmaras: Liuらによるhelicity correctionを組み込んだSpalart-Allmaras乱流モデル。
ソースコード
- $WM_PROJECT_DIR/plugins/turbulence-community
貢献者
University of WindsorのTurbomachinery and Unsteady Flows Research Groupによって開発されました。
OpenFOAMへの最初の実装はZhifan Yuによって行われ、その後Jeff Defoeによって、より新しいバージョンのOpenFOAM向けに更新されました。
コミュニティ貢献: HPC Committee
HPC Technical Committeeは、Ivan Spissoが主導した基礎的な取り組みを発展させ、benchmark suiteの大規模な更新と大幅な拡張を発表しました。
更新されたリポジトリには現在30のbenchmark caseが含まれており、外部空力から反応流まで、幅広いCFDアプリケーションを網羅しています。
メッシュサイズについても、数千セル規模のものから20億セルを超えるものまで含まれています。
このbenchmark suiteは、ハードウェアアーキテクチャ、ソフトウェア環境、および設定方法の違いによる性能を評価するための標準的なリファレンスとして利用できます。特に、再現性と評価指標の一貫性を重視しています。
この開発はexaFOAM projectの一環として、Henrik Rusche(Wikki GmbH)が主導するwork package内で実施されました。
リポジトリの更新はSergey Lesnik(Wikki GmbH)が担当し、Charles Mockett(Upstream CFD)およびIvan Spisso(Leonardo Finmeccanica)との協力によって行われました。
各ケースの作成者や設定に関する情報など、ケース固有の詳細については以下のリポジトリを参照してください。
コミュニティ貢献: Turbomachinery Special Interest Group
Turbomachinery Special Interest Groupは、OpenFOAM Governanceによる支援を受け、foam-extendのmixingPlaneコードをOpenFOAMへ移植しました。
このコードはAMI coupled patchと互換性があり、foam-extendから移植されたGGIにも対応しています。
このリポジトリには、軸流タービンに関する一連のチュートリアルも含まれています。
これらのチュートリアルでは、以下の機能を使用した解析の設定例が提供されています。
- SRF
- MRF
- 部分的な回転メッシュ
- cyclicAMI
- cyclicPeriodicAMI
- mixingPlane
- 回転機械向けの特殊な境界条件
謝辞
OpenFOAMへ貢献してくださった以下の皆様に、心より感謝いたします。
Issue trackingへの貢献
- PorscheGTIII (Chris Schleicher) — fixedJumpAMI does not work for Distributed Parallel GL#3292
- tkeskita (Tuomo Keskitalo) — extrude2DMesh is sensitive to face normal direction GL#3293
- cris (Cristian Catellani) — Strange behavior of velocity field when using coupled velocity solver and domain symmetries are present GL#3294
- Nathanael3 (Victor Pozzobon) — Typo in twoPhaseEulerFoam GL#3295
- wyldckat (Bruno Santos) — api.openfoam.com "Invalid SSL certificate Error code 526" GL#3296
- pkanninen (Pekka) — castellatedBufferLayer fail if buffer zone is false in other patch GL#3297
- hnoda (Hiroshi Noda) — Not convert the force unit in the "umpedPointMovement" GL#3299
- tkeskita (Tuomo Keskitalo) — snappyHexMesh type castellatedBufferLayer crashes when using addBufferLayers false and true for adjacent patches GL#3300
- raffara2 (Maria Raffaella Vuolo) — Vertical profiles of k for atmospheric empty domain GL#3301
- tkeskita (Tuomo Keskitalo) — snappyHexMesh type castellatedBufferLayer always creates buffer layer on face zone type baffle GL#3302
- shorty (Tobias Holzmann) — functionObject energyScalar misses write() behavior GL#3303
- tkeskita (Tuomo Keskitalo) — snappyHexMesh type castellatedBufferLayer with face zones crash: All edges of face seem to have same neighbour GL#3304
- Ramkumar47 (Ramkumar) — new postprocessing application contribution GL#3305
- wyldckat (Bruno Santos) — API Doxygen-based website does not point to the correct location for the original source code files GL#3306
- tttt (Yanjun Tong) — Bug of thermo:mu on windows .exe version, compiled by mingw GL#3307
- a_reinhold (Alexander Reinhold) — chtMultiRegionFoam log files fluid regions incorrect GL#3309
- spignatiello (Sonia Pignatiello) — Non-physical linear momentum with PatchInjection/PatchFlowRateInjection + particle collisions in DPMFoam/MPPICFoam GL#3311
- burgreen (Greg Burgreen) — VoF rho improperly updated GL#3312
- darioZ (Dario Zivkovic) — Adding Crank-Nicolson off-centred flux correction to multiphaseInterFoam GL#3314
- raffara2 (Maria Raffaella Vuolo) — Vertical profiles of k not conserved for the case atmDownstreamDevelopment GL#3315
- otaolafr (franco otaola) — foamToEnsight crashing when having rhoInlet from thermo:rho.air GL#3317
- openfoamUser (openfoam user) — sampleCp file in the backwardFacingStep2D tutorial doesn't work GL#3319
- tsiapkinis (Iason Tsiapkinis) — Checker board effect with pimpleFoam and interfaceTracking GL#3320
- otaolafr (franco otaola) — error in sizeDistribution.h and tutorial case GL#3321
- reverseila (Ali Bozorgzadeh) — Incorrect Parsing of -with-bear and -bear-output-dir in AllwmakeParseArguments GL#3322
- biswa (Biswaroop Mukherjee) — Compilation Issues with dsmcfoamplus-v2306 GL#3324
- daniel.jasinski (Daniel) — Incorrect Heat Flux Coefficient Calculation with Radiation GL#3325
- SamMallinson (Sam Mallinson) — Tutorial: OpenFOAM-v2412 pimpleFoam/laminar/cylinder2D crashes GL#3327
- Lionel.Gamet (Lionel GAMET) — fixedJumpAMI (cyclicAMI) no longer runs in parallel GL#3328
- e.daniele (Elia Daniele) — foamDictionary works with binary files GL#3329
- atn (Antoine Bovesse) — Link to Native-windows version is broken GL#3330
- kstrien (Koen Strien) — GAMGAgglomeration unexpected caching behavior for multiple solvers GL#3332
- cthorenz (Carsten Thorenz) — snappyHexMesh type castellatedBufferLayer crashes GL#3333
- DL (David Ludlow) — volPointInterpolation fails on a subMesh, when the baseMesh contains cyclicAMIs and the subMesh doesn't. GL#3334
- Skolo (Robert) — distributedTriSurfaceMesh breaks distance-based refinementRegion when using subTriSurfaceMesh GL#3335
- dslarm (david lecomber) — Arm Compiler for Linux 24.10+ fails to compile OpenFOAM - due to removal of -fsimdmath flag GL#3336
- vaggelisp (Vaggelis Papoutsis) — v2412 does not compile with clang in distributions with an old flex version GL#3337
- Yann (Yann) — foamReport: wrong mesh statistics when running in parallel GL#3338
- janga (Jan Gärtner) — Rosin Rammler Distribution Mean Value Calculation GL#3342
- morella (Michael Orella) — WSL Syntax Error near unexpected token curl install script GL#3344
- DL (David Ludlow) — jumpCyclic (and jumpCyclicAMI) and derived boundary conditions will probably operate incorrectly in mixed precision (SPDP) mode. GL#3345
- Skolo (Robert) — Castellation runs infinitely until out of memory if a refinementRegion is partly outside domain - only in 2412 GL#3349
- e.daniele (Elia Daniele) — reorderPatches GL#3350
- muez (muez abdalla) — after sourcing openfoam paraview can not find libhdf5.so.103 GL#3351
- cthorenz (Carsten Thorenz) — functionObject surface sampling: Ensight collated format is not collated GL#3352
- otaolafr (franco otaola) — extra constants in tutorial case GL#3353
- DS.J (Da-Sol Joo) — The buoyancy solvers do not function correctly under cyclic boundary conditions. GL#3354
- Fahner (Tom) — Using an expression for d in atmBoundaryLayerInlet results in incorrect description upon writing GL#3355
- shorty (Tobias Holzmann) — Exend output of fvOptions with respect to the status of activate keyword GL#3356
- DamianHurschler (Damian Hurschler) — missing 'triSurface' directory in tutorial - /tutorials/incompressible/pimpleFoam/RAS/rotatingFanInRoom/constant GL#3358
- otaolafr (franco otaola) — bubbleColumnIATE tutorial wrongly defined GL#3362
- DIgitalPeer1 (Ishaa Patel) — Installing on fedora 42 GL#3363
- twhihehead (Tyson Whitehead) — Missing plugins tarball in v2412 release GL#3365
- gng015 (gng) — snappyHexMesh addLayer issue with relativeSizes enabled for v2312 and above GL#3369
- muez (muez abdalla) — runing multiphase LES case with adaptive mesh refinement result in floating point exception GL#3370
- MarianFuchs (Marian Fuchs) — Wrong definition of LES constant in sigma LES model GL#3371
- johan_roenby (Johan Roenby) — BUG: Wrong behaviour of cylinderToCell when axis is long GL#3378