OpenFOAM

【OpenFOAM(円筒内の流れ)】境界条件をcodeStremでコードを埋め込む

こんにちは(@t_kun_kamakiri

今回は境界条件の設定ファイルに直接C++のコードを埋め込んで初期化設定を行う方法について解説をします。C++と言ってもOpenFOAMで用意されている関数を上手く使って書くため特別すごいアルゴリズムを組むわけではありません。

OpenFOAMのカスタマイズにはC++の知識に加えてOpenFOAMのAPIを理解する必要があり、初心者にとってはハードルが高いでしょう。
そこで、OpenFOAMのカスタマイズはしてみたいけど難しそうと感じている人は、まずは本記事のような直接コードを書きこむcodeStreamを試してみると良いです。

本記事の内容
  • 境界条件をcodeStremを使ってコードを直接埋め込む
  • 円筒内流れの流入境界条件を関数で与える

前回の記事で「円筒内流れ」をOpenFOAMでやってみました。

以下、blockMeshでメッシュを作成して円筒内流れを解析した結果です。

blockMeshでの結果

【OpenFOAM(円筒内の流れ)】blockMeshでメッシュ作成(1)

層流条件においては、流入境界での流速は1.0m/sの一定値ですが助走区間を経て徐々に2次関数で近似できるようになり、OpenFOAMの結果が2次関数と一致していることがわかります。

\begin{align*}
u=2u_{b}\bigg(1-\big(\frac{r}{R}\big)^2\bigg)\tag{1}
\end{align*}

では、はじめから境界条件を(1)で与えるようにするにはどうすれば良いのか?というのが本記事の主題です。

OpenFOAMv2012(WSL2)

モデルファイルの入手

ベースとなるモデルファイルは以下からダウンロードできます。

こちらのモデルを使って境界条件のファイル設定を書き換えます。
具体的には「0/U」の境界面の名前「inlet」の条件をcodeStreamでコードを書いて設定を行います。

境界条件の設定

codeStream

0/Uの境界条件を2次関数で与えます。

0/U

fvMeshがメッシュを扱うクラスでメッシュに関する情報である「セル、面、エッジ、頂点」などを保持しています。

具体的にはfvMeshは、

などを基底クラスに持つ多重に継承したクラスです。

fvMeshはtypedefで大文字から始まるMeshに定義されていますが、ややこしいですが同じクラスのことですね。

fvMeshが以下のようにboundary()という関数を持っています。

fvMesh.H

なので、

とするとfvBoundaryMeshクラスが返ってきて、fvBoundaryMeshクラスの中のfindPatchID()関数を呼び出すことでパッチ面のidを取得することができます。

fvBoundaryMesh.H

labelはOpenFOAMで定義された整数型のことです。
今回は境界面としてinletを探すようにしているため、findPacthID(“inlet”)としています。

あとはvecterFieldのUz_inletがリストになっているのでfor文で回して、以下の2次関数ををUz_inletに与えれば良いです。

\begin{align*}
u=2u_{b}\bigg(1-\big(\frac{r}{R}\big)^2\bigg)\tag{1}
\end{align*}

「fvMesh」のクラスを使うことでメッシュ情報はだいたい取得できます。
以下の表を参考に関数を呼び出し必要な情報を取得します。

ClassDescriptionSymbolAccess function
volScalarFieldCell volumes $V$V()
surfaceVectorFieldFace area vector$\boldsymbol{S_{f}}$Sf()
surfaceScalarFieldFace area magnitude|$\boldsymbol{S_{f}}$ |magSf()
volVectorFieldCell centres$\boldsymbol{C}$C()
surfaceVectorFieldFace centres$\boldsymbol{C_{f}}$Cf()
surfaceScalarFieldFace fluxes$\boldsymbol{\phi_{f}}$Phi()

今回のように、

とすればセル中心の座標を取得することがでいます。

以上が全体の流れです。

では、計算を実行させてみましょう。

 

結果はParaViewで確認します。流入境界条件が思った通りの速度分布になっているかを確認しましょう。

※まず、いきなりこのようなコードを書くのはしんどいのでcodeStreamが使わているチュートリアルを探します。

いくつか候補が出てきますので適当なファイルを開いて眺めてみると勉強になります。

codedFixedValue

境界条件の設定は、

で行うこともできます。

デフォルトでメッシュ (Foam::fvMesh) と時間 (Foam::Time) データベースへのアクセスなど、基本的な機能のみが提供されています。より複雑な条件では、オプションの codeInclude および codeOptions エントリを使用して、追加のクラスへのアクセスを有効にします。

0/U

今回はいきなりfvPathクラスを「boundaryPatch = patch()」と置き換えて以下のCf()関数を呼び出して、パッチ面の情報を取得しています。

あとの流れはcodeStreamと同じです。

おすすめ参考図書

☟こちらは、OpenFOAMの日本語書籍として重宝しているわかりやすい参考書だと思います。

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

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

3,520円(04/25 10:12時点)
Amazonの情報を掲載しています

☟こちらもOpenFOMの古いバージョンでの和訳になります。さすがにこちらはバージョンに対する日本語でのケアはしていないので、OpenFOAMに慣れている方は購入しても良いかと思います。僕は「日本語でまとまっている内容」なので少し重宝しています。

OpenFOAMプログラミング

OpenFOAMプログラミング

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

☟以下に、もっと初心者向けの同人誌を紹介しておきます。
初心者は「ってか、まずどうやってOpenFOAMをインストールするの?」というところからつまずきがちです。
そんな時は、以下の書籍をおすすめします。

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

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

川畑 真一
2,376円(04/25 17:49時点)
発売日: 2022/04/15
Amazonの情報を掲載しています

インストール方法とチュートリアルで流体解析を体験・・・ちょっと高度な解析まで解説があります。著者曰くOpenFOAMのバージョンの追跡を行いながら、書籍をアップデートするようなので安心ですね。

OpenFOAMコードの辞書的な扱いとしては以下の参考書が大変役に立ちます。
本記事ではESI版のOpenFOAMを使っているため本書のFoundation版で対応していない部分がありますが、その辺を考慮しても持っていて損はないでしょう。

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

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

株式会社テラバイト, 人見 大輔
16,500円(04/25 11:35時点)
Amazonの情報を掲載しています
関連記事もどうぞ

COMMENT

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