👋

OpenFOAM初心者講習検討メモ

に公開

2025年11月15日(土)開催予定のオープンCAE勉強会@富山で,OpenFOAM初心者向け講習会【(仮題) OpenFOAMを使い始めた学生のための講習会:OpenFOAMの設定ファイル(dictionary)の書き方とParaViewの基本設定など】の実施を計画している。

https://opencae-toyama.connpass.com/event/375204

そこで伝える内容をメモする。

OpenFOAM設定ファイルDictについて

damBreak例題でDict操作の練習

構成

./
├── 0.orig
│   ├── alpha.water
│   ├── p_rgh
│   └── U
├── Allclean
├── Allrun
├── constant
│   ├── g
│   ├── transportProperties
│   └── turbulenceProperties
├── system
    ├── blockMeshDict
    ├── controlDict
    ├── decomposeParDict
    ├── fvSchemes
    ├── fvSolution
    ├── sampling
     └── setFieldsDict

設定ファイルと主な項目

設定ファイルと主な項目は次のようなものである。

  1. blockMeshDict
    1. 計算領域位置,サイズ
    2. メッシュ分割数
  2. setFieldsDict
    1. 初期配置領域
    2. 初期値
  3. g
    1. 重力(計算領域の姿勢)
  4. 各種変数
    1. 初期値
    2. 境界条件
  5. transportProperties
    1. 流体の種類・物性値
  6. その他

これらは,独立している場合だけでなく,相互に関係していることが多い。例えば,計算領域・モデルの大きさを変更したとき,初期配置領域なども変更することがある。

このような場合に,1つのファイルを変更したのに,別のファイルの変更を忘れることがある。あるいは,意図しない不整合な条件設定となることがある。

このようなリスクを避けるために,複数のファイルに記載する情報を1つのファイルにまとめることを考える。1つにまとめたファイルに条件を記入し,他のファイルはこの情報を読み取り,インクルードすることを目指す。

どうやって

#include指示を使ってファイルを読み込む。

一般的な設定は,#includeEtcが使えるか?

一般的な名前を付けた境界条件

https://gitlab.com/openfoam/core/openfoam/-/blob/master/etc/caseDicts/setConstraintTypes?ref_type=heads

参考になる情報

いろいろなDictのサンプル
https://gitlab.com/openfoam/core/openfoam/-/tree/master/etc/caseDicts/annotated?ref_type=heads

たとえば,blockMeshDict
https://gitlab.com/openfoam/core/openfoam/-/blob/master/etc/caseDicts/annotated/blockMeshDict?ref_type=heads

作業

手順

  1. blockMeshDictに変数を使う。
  2. blockMeshを実行してメッシュを確認する。
  3. 変数部分を別のファイルに移動する。
  4. blockMeshを実行してメッシュを確認する。
  5. setFieldsDictに変数を使う。
  6. setFieldsを実行して動作を確認する。
  7. 変数部分を,先ほどの別ファイルに移動する。
  8. setFieldsを実行して動作を確認する。
  9. blockMeshDictとsetFiledsDictで共通する部分,演算で決める部分を考える。
  10. 変数を統一したり,変数の内容を演算で求める。
  11. blockMeshとsetFieldsを実行して確認する。
  12. 初期値や境界条件も,統一ファイルから指示できないかを考える。
  13. などなど

オプション

  1. blockMeshのboundary設定で,新しめのfaces指示方法を使う。ブロック番号と面番号で。
    1. 1カ所直して,実行して確認する。
    2. 理解が進んだら,一気に変更して,実行して確認する。
  2. 共通する境界条件(leftWall, rightWall, lowerWall)を一括で指示するように書き換えてみる。正規表現を使ってみる。
  3. defaultFaces境界を,#includeEtc "caseDicts/setConstraintTypes"を使う方法に変更してみる。
    1. blockMeshDictで2次元計算境界部分をemptyという名前にする(typeもemptyにする)
    2. setFieldsを実行するとエラーが出るはず
    3. 各Field変数ファイルに#includeEtc行を追加する。
    4. エラーがなくなるか?

ParaViewの基本

狙い

初心者向け.

対象者:ゼミや卒業研究でOpenFOAMを使用し始めた大学3・4年生。言われるがままにParaViewを操作したことはあるが,意味はよくわかっていない人。

達成目標:

  • OpenFOAMのメッシュを正しく表示できる
  • セル表示とポイント表示の違いに気づく
  • 速度ベクトルをセル重心から表示できる
  • 可視化画像に時刻を表示し,その表示桁数をコントロールできる
  • 可視化しているケース・位置・条件などを,わかりやすく表示できる
  • 複数のレンダービューを使って,複数の変数を同時に可視化できる
  • 複数のレンダービューを使って,条件の異なる計算結果を比較できる
  • 計算領域と,その一部の可視化画像などを組み合わせて,わかりやすく表示できる
  • 等値線図(Contour)とベクトル図などを組み合わせて表示できる
  • 可視化画像と,その一部から作成したグラフをわかりやすく表示できる
  • バージョンの使い分け?公式バイナリ版の使い方?

環境

ParaViewのバージョンは?

  • 5.11 (やや古いが,使っている人多いかも。Ubuntuパッケージインストール)
  • 6 (最新。違いは?)
    • セルがきれいに表示される。
  • Windows or Linux
    • Win: MP4形式で動画が保存できる
    • Win: ファイル名に":"が使えないので,OpenFOAMの結果を扱えないことがマレにある
  • 5.12
  • 5.13
  • 5.10以前は無視したい。

OSは?

  • 基本はLinux (Debian 12)
  • Windowsでも確認

内容

メッシュの表示

decomposeのチェックを外す,など。

断面表示では,Crinckle表示でないと,余分な線が表示されることがある。

ParaView 6では,標準状態できれいに表示されるようだ。

セル表示とポイント表示

表示方法(あるいは,内部でのデータの保持方法)については,ParaView公式ユーザーガイドの下記部分に説明があります。「セル表示」に対して,「ポイント表示」という表現ができます。ユーザーガイドをご確認ください。

https://docs.paraview.org/en/latest/UsersGuide/understandingData.html#attributes-fields-arrays

annotation いろいろ

https://docs.paraview.org/en/latest/ReferenceManual/annotations.html

  • Annotation sources
    • Text source
    • Annotate Time source
  • Annotation filters
    • Annotate Attribute Data filter
    • Annotate Global Data filter
    • Annotate Time Filter
    • Environment Annotation filter
    • Python Annotation filter

Annotate Time source と filter

sourceでは,時間をそのまま表示する。filterでは,そのまま表示だけでなく,shiftやscaleを使える。

“Time: {time:f}” という表記の意味:{}内部のtimeは,ParaView内部の現在の時刻の値に置き換えられる。:fは浮動小数点を6桁で表示することを指示している。このような表示方法・formatの指示方法については,Pythonのフォーマットライブラリ {fmt} に説明されている。

https://fmt.dev/dev/syntax/

Python Annotation

ある点[22]での圧力の値を表示するExpression例
'Pressure: %f Pa' % (p[22].Arrays[0])

https://fmt.dev/dev/syntax/

保存する画像のFontサイズ

保存時の詳細設定に,Font scalingという設定項目がある。デフォルトではScale fonts proportionallyとなっている。

使用するマシンのディスプレイ設定において,拡大/縮小が100%の場合には,この影響はなさそう。(ParaViewのViewーPreviewで設定したサイズがディスプレイサイズ以下で,スケールが適用されていない状態で確認した。)

ParaViewのViewーPreviewで設定したサイズがディスプレイサイズ以上で,アスペクト比を維持するようにスケールされた(画面表示が小さくなっている)場合

デフォルト設定では,フォントが画面よりも大きく感じられる。画面よりも大きな画像として書き出しており,フォントも大きく拡大されるためか。(そのスケールよりも大きな文字になっているように感じるが。)

Do not scale fontsを選択した場合,ParaViewの元の画面(Previewでないとき)のフォントサイズで書き出されているようだ。

詳細設定表示:Font scalingはScale fonts proportionallyとなっている。

Discussion