OpenFOAM

【OpenFOAM】任意の断面での流量計算(codedFunctionObject)

こんにちは(@t_kun_kamakiri

今回はOpenFOAMで以下のような配管内の水の流れを解析し、境界と任意の断面での流量を計算します。

境界の「inlet」「outlet1」「outlet2」での流量はOpenFOAMのfunction objectの機能を使うことで簡単に出力することができます。

しかし、c1~c5の断面での流量を出力するにはどうしたらいいのかなと思って自分なりに試してみた内容を書いています。

本記事の内容

OpenFOAMで任意の断面での流量を計算する。

【使用環境】
OpenFOAM-v2012(WSL2)

カマキリ

もっといい方法があったらコメントで教えてください_(._.)_

流量を出力する方針

流量を計算する方法はパッと考えると以下の方法があるでしょう。

  1. 流量計測したい断面にあらかじめ面かセル領域を用意しておく
  2. cellZoneSetを使ってfunction objectを使う
  3. codedFunctionObjectという機能で直接コードを埋め込む

①の方法はあらかじめ計算する前に用意する必要があると考えて今回は試しませんでした。
今回は解析計算が終わった後でも出力できる方法として②と③を試したのでご紹介します。

③が本記事の内容

とはいえ、任意の断面での流量を直接出力するのはわからなかったので任意の領域を通過する平均流速を求めて面積を掛けて流量$Q=vA$とする方針にしました
※任意の面を通過する流量とすると、入ってきて出ていく量の合計を計算するのことになって結局0になってしまいました。なので、いったん平均流速を求めて面積を掛けて流量を求めればいいやと思った次第です。

③codedFunctionObject機能で直接コードを埋め込む

③は直接コードを書いて出力する方法です。
②の方法のようにtopoSetとかわざわざ作ったりするのが面倒だと感じたり、既存機能だけではやりたいことができない場合に役に立ちます。

codedFunctionObjectはsystem/controlDictのfunction objectでC++コードを直接埋め込んで計算実行と同時にコンパイルしてくれる機能です。

OpenFOAM用のC++コードに慣れないと難しく感じるかもしれません。
以下に参考記事を載せておきます。

今回はc1領域の平均流速、平均圧力、平均流量を計算するコードだけを追加します。

system/controlDictのfunctionsに以下を追加します。

流れは以下のようになっています。

  • cellとvolumeを定義
  • c1領域の座標のみのcellの値を取得するif文
  • 座標を取得
  • 座標からidを取得
  • idからU.p.phiの値を取得
  • 最後に領域内の平均値を計算

計算を実行します。

計算が終わった後にcontrolDictのfunction objectだけを実行したい場合は、

とします。

lob.simpleFoamのログファイルに、

注目すべきは以下の部分です。
同じc1領域を計算したものです。

  • topoSetDictで作った領域からvolFieldValueで計算したのが上
  • codedFunctionObjectで計算したのが下

平均流速、平均圧力ともに同じ値になっていますね。
また、topoSetで作ったセルの数が1216でしたが、コードで計算したものも同じ1216です。

さらにコードの中で平均流速に面積を掛けて流量を計算して$Q=vA=0.000126284$と出しています。

結局「controlDict」は色々書き込んで以下のようになりました。

system/controlDict

 

ファイルにまとめてincludeした方がいいかもしれないですね。
このままでは少し煩雑・・・

codedFUnctionObjectを別ファイルから読み込む

controlDictに直接コードを書くとファイルが長くなって見にくいのでcodedFunctionObjectは別ファイルに保存して読み込むようにします。

チュートリアルで同じようなことをやっている例題がないか探します。
以下のコマンドで「coded」という文字を使っているファイルをチュートリアルから探します。

候補が出てきました。

おそらく最後から4番目がやりたいチュートリアルかと思いますので「codedvolField」というファイル名で「system」フォルダにコピーします。

※こちらのチュートリアルにあるAllrunを見ると実行コマンドのヒントになります。

では、先ほどのコードをコピーします。

system/codedvolField

これで計算を実行すればOKです。
計算終了後に出力したい場合は以下のコマンドでも出力できます。

出力設定をいじりたい場合には便利ですね。

codedFunctionObject機能(境界面の場を取得)

codedFunctionObjectは直接C++のコードを書くことができる機能なので任意のセル情報以外にも、名前を指定した境界面の情報も取得できます。

補足で少し解説しておきますのでご参考ください。
まず、実行すると「dynamicCode/codevolFieldValue」に以下のファイルが生成されコンパイルが開始されます。

ポイントは、

  • functionObjectTemplate.Hに変数や関数の定義
  • functionObjectTemplate.Cに計算処理内容

です。
大まかな情報を得るのには主にヘッダーファイル「functionObjectTemplate.H」を見れば良いです。
何を引数に入れて何が返ってくるのかさえ押さえておけばだいたい使えます。OpenFOAMには異なる型を引数に入れても動作するように関数をオーバーロード(上書き)して同じ名前の関数でも引数違いの関数を複数定義しています。
細かい計算内容を知りたい場合は拡張子.Cの方も見ていけば良いです。

上記のコードは特定の座標に対応するセル中心の物理量の場(流速ベクトル、圧力)を取得する方法でしたが、他にも色々な情報を取得できます。

以下、境界面の値の取得例を出しておきます。

まず注目すべきは、

functionObjectTemplate.H

ここです。

fvMeshクラスをmesh()と定義しています。fvMeshがmesh()になっていると考えて良いです。
fvMeshクラスには、
  • mesh().V():体積ボリューム
  • mesh().Sf():セル表面ベクトル
  • mesh().magSf():セル表面の大きさ
  • mesh().C():セル中心の座標情報
  • mesh().Cf():セル表面中心

など色々とセル情報の取得ができます。

さらに以下のに書けば名前が付いた境界面の値も取得できます。


fvMeshが継承しているpolyMeshクラスで用意されている関数を調べるとわかります。

mesh().boundaryMesh()はpolyMeshクラスの中のメンバ関数boundaryMeshで以下のように、polyBoundaryMeshを返します。
const polyBoundaryMesh & boundaryMesh()const

画像

まとめ

今回は流量を出力する方法をまとめました。

  • 任意の断面の流量計算(topoSetとcodedFuction)

topoSetとcodedFuctionの結果は同じになりましたので、慣れればcodedFuctionが汎用性が効きますね。

参考書

有限体積法の勉強にはこの本で間違いないです。
対流項目が中心差分で安定しないことを理論的に評価しておりとても参考になります。

数値流体力学 [第2版]

数値流体力学 [第2版]

H.K.Versteeg, W.Malalasekera
10,450円(02/29 01:32時点)
Amazonの情報を掲載しています

OpenFOAMの基本的な設定を学ぶことができる書籍として以下の参考書がお勧めです。

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

改訂新版 OpenFOAMの歩き方 (技術の泉シリーズ(NextPublishing))

川畑 真一
1,320円(02/28 07:45時点)
発売日: 2022/04/15
Amazonの情報を掲載しています
OpenFOAMによる熱移動と流れの数値解析(第2版)

OpenFOAMによる熱移動と流れの数値解析(第2版)

3,520円(02/29 00:46時点)
Amazonの情報を掲載しています

本書はESI版ではなくFoundation版でありOpenFOAMv2.xで書かれたやや古い内容です。その点に注意してESI版のお使いのversionとの違いを丁寧に調べることができる方であれば、十分参考になる書籍です。

OpenFOAMプログラミング

OpenFOAMプログラミング

Mari´c,Tomislav, H¨opken,Jens, Mooney,Kyle
8,250円(02/28 11:51時点)
Amazonの情報を掲載しています

OpenFOAM全般の設定などまとめられた書籍として以下のものがあります。
こちらもFoundation版なので、ESI版のお使いのversionとの違いを丁寧に調べることができる方であれば、十分参考になる書籍です。

OpenFOAMライブラリリファレンス

OpenFOAMライブラリリファレンス

株式会社テラバイト, 人見 大輔
16,500円(02/28 16:48時点)
Amazonの情報を掲載しています

こちらのオープンCAE学会から技術書典にOpenFOAMでメッシュ作成【PDF版】が出ています。難しい内容ではありますが、OpenFOAMのメッシュに関する内容が1000円で学べます。

関連記事もどうぞ

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です