Posted at
OpenFOAMDay 15

OpenFOAMでのfoamNewなんとかのコマンド

More than 1 year has passed since last update.


はじめに

OpenFOAMではインストール,チュートリアルでのお勉強,が済んだら,自分が取り組みたい課題用にソースコードなどをカスタマイズしたい,というのが人の常である.解いている式に項を一つ付け足すぐらいならば,常套手段として標準のソルバーなどをコピーしてきてちょこっといじくればできてしまうが,OpenFOAMの標準の機能からかけ離れたことをやろうとすると,ソースをゴリゴリ自分で書き出す,といった沼に陥りがちである.そのようなとき便利なのが,OpenFOAMのコーディングスタイルでソースコードなどの雛形を生成してくれるfoamNew系のコマンドである.バージョンが新しくなるにつれてこの系統のコマンドは増えているので,今回はv1706で解説する.


foamNewなんとかの一覧

OpenFOAMがインストールされた端末上ではOpenFOAMのコマンドに関しても入力補完が聞くので,foamNewまで打ち込んでTabを押せば一覧が取得できる.

$ foamNew #ここまで打ち込んでTabキー

foamNew foamNewCase foamNewTemplate
foamNewApp foamNewFunctionObject
foamNewBC foamNewSource

あとは適当に選んで使うだけであるが,foamNewCaseは新しい解析ケースを作るコマンドなので,いつも解析をメインでやる人向けのコマンドである.各コマンドのコマンドはオプション-hをつけて実行すればすぐにわかる.以降にhelpでの出力を列記する.


foamNew

$ foamNew -h

Usage: foamNew <type> {args}

* create a new standard OpenFOAM source or template file

type:
-s | -source | source
-t | -template | template

昔からある一番ベーシックなコマンド.typeの指定がわからないので,適当に間違えてみる.

$ foamNew -s hoge

Usage: foamNewSource [OPTION] <type> <ClassName>
options:
-help print the usage

* create a new standard OpenFOAM source file

type: (C|H|I|IO|App)

A ClassName starting with '-' will simply display the template

typeとして,C(通常のソースファイル),H(ヘッダファイル),IO(入出力用ファイル),App(アプリケーション用ソース)が選べることがわかる.コマンドの最後の引数としてクラス名(ソースファイル名)を指定するが,-から始まる名前にすると,端末画面に表示されるだけでファイル出力はされない.適当な.Cファイルを作ってみる.

$ foamNew -s C myClass

foamNewSource: Creating new interface file myClass.C

myClass.Cというソースファイルが出来上がる.コマンドの引数として拡張子まで含めて,

$ foamNew -s C myClass.C

としてしまうとmyClass.C.Cができてしまうので注意.生成されたファイルの中身を見てもらうとわかるが,まあ雛形なので中はスカンスカンである.以降の実装については各自努力されたい.


foamNewApp

$ foamNewApp -h

* Create directory with source and compilation files for a new application
<applicationName> (dir)
- <applicationName>.C
- Make (dir)
- files
- options
Compiles an executable named <applicationName> in $FOAM_USER_APPBIN:
/home/yotakagi77/OpenFOAM/yotakagi77-v1706/platforms/linux64GccDPInt64Opt/bin

新しくアプリケーション(ソルバー,ユーティリティ)を作るためのコマンド.試しに使ってみる.

$ foamNewApp myApplication

$ ls -R myApplication/
myApplication/:
Make myApplication.C

myApplication/Make:
files options

アプリケーションをするための必要なメインソースコード,wmakeに必要なfilesoptionsが作られる.

myApplication.Cに継ぎ足していけば好きなアプリケーションができる.


foamNewBC

foamNewBC -h

Usage: foamNewBC [-h | -help] <base> <type> <boundaryConditionName>

* Create directory of source and compilation files for a new boundary condition
<boundaryConditionName> (dir)
- .C and .H source files
- Make (dir)
- files
- options
Compiles a library named lib<boundaryConditionName>.so in $FOAM_USER_LIBBIN:
/home/yotakagi77/OpenFOAM/yotakagi77-v1706/platforms/linux64GccDPInt64Opt/lib

<base> conditions:
-f | -fixedValue | fixedValue
-m | -mixed | mixed

<type> options:
-a | -all | all | template (creates a template class)
-s | -scalar | scalar
-v | -vector | vector
-t | -tensor | tensor
-symmTensor | symmTensor
-sphericalTensor | sphericalTensor

境界条件クラスを作るコマンド.OpenFOAMの境界条件は標準でたくさんあるので,(i)ユーザーガイドの境界条件の説明をよく読む,(ii) $FOAM_SRC/finiteVolume/fields/fvPatchFieldsにある各種境界条件のソースを眺める,をした後に,自分に必要なものがなければ新規作成or元々あるものを変更するのが吉である.<type> optionsの選択肢にあるように,テンソルのランク(スカラー,ベクトル,テンソル)ごとに雛形を作ることもできるし,汎用的なもの(all)も作ることができる.境界条件カスタマイズは難しいので上級者向け.


foamNewFunctionObject

foamNewFunctionObject -h

Usage: foamNewFunctionObject [-h | -help] <functionObjectName>

* Create directory with source and compilation files for a new function object
<functionObjectName> (dir)
- <functionObjectName>.H
- <functionObjectName>.C
- IO<functionObjectName>.H
- Make (dir)
- files
- options
Compiles a library named lib<functionObjectName>FunctionObject.so in
$FOAM_USER_LIBBIN:
/home/yotakagi77/OpenFOAM/yotakagi77-v1706/platforms/linux64GccDPInt64Opt/lib

いつ頃から現れたかはよくわからないけど,OpenFOAMの便利な機能であるfunction objectを新しく作るためのコマンド.Function objectはソルバーの実行中or実行後に機能するものであり,コンパイルしてできたfunction objectのライブラリをユーザーが指定して利用する.とりあえずこのコマンドを試してみる.

$ foamNewFunctionObject myFunctionObject

$ ls -R myFunctionObject/
myFunctionObject/:
Make myFunctionObject.C myFunctionObject.H

myFunctionObject/Make:
files options

ヘルプによればIOmyFunctionObject.Hができるはずなんだけど,できていない.Function objectの中身の概要は生成されたmyFunctionObject.Hのヘッダーコメント部分に書かれている.

myFunctionObject.Hのコメント部分

Class

Foam::functionObjects::myFunctionObject

Group

Description
This function object...

Example of function object specification:
\verbatim
myFunctionObject1
{
type myFunctionObject;
libs ("libmyFunctionObjectFunctionObject.so");
...
wordData someWord;
scalarData 1.0;
labelData 1;
}
\endverbatim

Usage
\table
Property | Description | Required | Default value
type | type name: myFunctionObject | yes |
wordData | some word option... | no | defaultWord
scalarData | some scalar value... | yes |
labelData | some label value... | yes |
\endtable

SourceFiles
myFunctionObject.C

詳しい実装のこととかはsourcefluxのブログとか読んでもらえればわかる.ちなみに,function objectをカスタマイズするハンズオン講習会に参加したことがあり,このnewFunctionObjectコマンドを使わずに一からエディタでコードを書く演習を行ったことがあるが,それはそれは貴重な経験であった.


foamNewSource

foamNewSource -h

Usage: foamNewSource [OPTION] <type> <ClassName>
options:
-help print the usage

* create a new standard OpenFOAM source file

type: (C|H|I|IO|App)

A ClassName starting with '-' will simply display the template

foamNew -sと同じコマンドである.


foamNewTemplate

foamNewTemplate -h

Usage: foamNewTemplate [OPTION] <type> <ClassName> <Template arguments...>
options:
-help print the usage

* create a new standard OpenFOAM source file for templated classes

type: (C|H|I|IO)

A ClassName starting with '-' will simply display the template

foamNew -tと同じコマンドである.


まとめ

foamNewなんとかで生成される雛形コードはOpenFOAMのプログラミングスタイルとして厳守すべきところであると思われるので,これらのコマンドをうまく活用して良いコードを効率的に書ければいいかな、と思う。