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

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

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

```bash
$ foamNew #ここまで打ち込んでTabキー
foamNew                foamNewCase            foamNewTemplate
foamNewApp             foamNewFunctionObject  
foamNewBC              foamNewSource
```

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

# foamNew

```bash
$ foamNew -h
Usage: foamNew <type> {args}

* create a new standard OpenFOAM source or template file

type:
    -s | -source | source
    -t | -template | template
```
昔からある一番ベーシックなコマンド．`type`の指定がわからないので，適当に間違えてみる．

```bash
$ 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`ファイルを作ってみる．

```bash
$ foamNew -s C myClass
foamNewSource: Creating new interface file myClass.C
```
`myClass.C`というソースファイルが出来上がる．コマンドの引数として拡張子まで含めて，

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

# foamNewApp

```bash
$ 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
```

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

```bash
$ foamNewApp myApplication
$ ls -R myApplication/
myApplication/:
Make  myApplication.C

myApplication/Make:
files  options
```
アプリケーションをするための必要なメインソースコード，`wmake`に必要な`files`，`options`が作られる．
`myApplication.C`に継ぎ足していけば好きなアプリケーションができる．

#foamNewBC

```bash
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

```bash
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のライブラリをユーザーが指定して利用する．とりあえずこのコマンドを試してみる．

```bash
$ foamNewFunctionObject myFunctionObject
$ ls -R myFunctionObject/
myFunctionObject/:
Make  myFunctionObject.C  myFunctionObject.H

myFunctionObject/Make:
files  options
```

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

**myFunctionObject.Hのコメント部分**

```c++
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のブログ](http://www.sourceflux.de/blog/)とか読んでもらえればわかる．ちなみに，function objectをカスタマイズするハンズオン講習会に参加したことがあり，この`newFunctionObject`コマンドを使わずに一からエディタでコードを書く演習を行ったことがあるが，それはそれは貴重な経験であった．

# foamNewSource

```bash
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

```bash
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のプログラミングスタイルとして厳守すべきところであると思われるので，これらのコマンドをうまく活用して良いコードを効率的に書ければいいかな、と思う。