OpenFOAMのDebugSwitches

# OpenFOAMのDebugSwitches

[オープンCAE勉強会@関東(流体など)の忘年会2017年](https://opencae-kanto.connpass.com/event/72356/)で発表したLT用のネタです．
OpenFOAM-v1612+用です．

## OpenFOAMのDebugSwitchesとは
- DebugSwitchesはdebug用フラグを設定する辞書．
- 通常system/controlDict 内で設定する．
- $FOAM_ETC/controlDict でシステムデフォルト値が定義されているので，system/controlDict にコピーして変更するのが楽．

```C++:$FOAM_ETC/controlDict
DebugSwitches
{
    Analytical          0;
    APIdiffCoefFunc     0;
    Ar                  0;
    BirdCarreau         0;
    C10H22              0;
:
    zoneToPoint         0;
}
```
## DebugSwitchesの値
- 0：デバック表示なし
- 1：デバック表示あり
- 2以上：さらに詳細なデバッグ表示
  - SolverPerformance (デフォルト1)
  - ccm
  - faceAreaWeightAMI
  - fileName
  - layerAdditionRemoval
  - lduMatrix (デフォルト1)
  - meshToMesh
  - turbulentDFSEMInlet
  - word
  - 等々
- 1，2，4のビットの有無で細かくデバッグ表示を制御
  - cellCuts
  - edgeSurface

## DebugSwitchesの挙動

ソースをキーワードdebugで検索します．

```bash
src
emacs
M-x grep
grep -rnH -e debug
```
emacs派以外の方は慣れている方法で検索を行ってください．
以下はdebug出力を行なっているソースの例です．

```C++:$FOAM_SRC/fvMotionSolver/fvMotionSolvers/fvMotionSolverCore/fvMotionSolverCoreTemplates.C
        if (debug)
        {
            Pout<< "Patch:" << fvMesh_.boundary()[patchi].patch().name()
                << " pointType:" << pmUbf.types()[patchi]
                << " cellType:" << cmUbf[patchi] << endl;
        }
```

あとは，デバッグ出力を行いたい項目に1以上の値を入れてプログラムを走らせ，ログの違いをdiffなどで調べます．

## DebugSwitchesの例

### SolverPerformance

- デフォルトの1では，線形ソルバーの初期残差・最終残差・反復回数を出力．
- 2以上で各反復での残差も表示する．線形ソルバー内のプロット用に有用．

```C++:SolverPerformance=1
DILUPBiCGStab:  Solving for h, Initial residual = 1, Final residual = 0.0670926, No Iterations 1
```     
```C++:SolverPerformance=2
DILUPBiCGStab:  Iteration 0 residual = 1
DILUPBiCGStab:  Iteration 0 residual = 0.0670926
DILUPBiCGStab:  Solving for h, Initial residual = 1, Final residual = 0.0670926, No Iterations 1
```

### GAMGAgglomeration
- GAMGソルバでのAgglomeration(粗視化)のログを出力.

```C++:system/controlDict
DebugSwitches
{
  GAMGAgglomeration          2;
}
```
```C++:GAMGAgglomeration=2
GAMGAgglomeration : agglomerated level 0 from nCells:1460 nFaces:3858 to nCells:730 nFaces:1978
GAMGAgglomeration : agglomerated level 1 from nCells:730 nFaces:1978 to nCells:364 nFaces:1028
GAMGAgglomeration : agglomerated level 2 from nCells:364 nFaces:1028 to nCells:182 nFaces:511
GAMGAgglomeration : agglomerated level 3 from nCells:182 nFaces:511 to nCells:90 nFaces:283
GAMGAgglomeration : agglomerated level 4 from nCells:90 nFaces:283 to nCells:44 nFaces:151
GAMGAgglomeration : agglomerated level 5 from nCells:44 nFaces:151 to nCells:21 nFaces:65
GAMGAgglomeration : agglomerated level 6 from nCells:21 nFaces:65 to nCells:10 nFaces:25
GAMG:  Solving for p_rgh, Initial residual = 0.9816739, Final residual = 0.003765396, No Iterations 2
```

### turbulentTemperatureRadCoupledMixed

- 通過熱流量やパッチ面での最小・最大・平均温度を表示.
- 熱収支の確認，プロットに大変有用.
- なぜか```$FOAM_ETC/controlDict```に記載されていない.

```C++:system/controlDict
DebugSwitches
{
  compressible::turbulentTemperatureRadCoupledMixed 1;
}
```
```C++:turbulentTemperatureRadCoupledMixed=1
Solving for solid region heater

heater:heater_to_topAir:T <- topAir:topAir_to_heater:T : heat transfer rate:2.572062e-06 walltemperature  min:300 max:300 avg:300

heater:heater_to_bottomAir:T <- bottomAir:bottomAir_to_heater:T : heat transfer rate:0.0001776574 walltemperature  min:300 max:300 avg:300
```

他にも以下の熱流系の境界条件にdebugSwitchesがあり，各種熱量やパッチ温度の統計値出力が可能です．

- externalWallHeatFluxTemperature
- fixedIncidentRadiation
- lumpedMassWallTemperature
- thermalBaffle1D
- turbulentTemperatureCoupledBaffleMixed
- turbulentTemperatureRadCoupledMixed

### dimensionSet

- dimensionの一致検査を行う(デフォルト)．
- 0にすると僅かに高速化するかも?

## DebugSwitches全部張り

***張らしてもうらぜっ・・・!***
***限界を超えてっ・・・!*** 

DebugSwitchesを全部オンにして，tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation の Allrun-parallel (4並列)を実行してみる．

```C++:system/controlDict
DebugSwitches
{
    compressible::turbulentTemperatureRadCoupledMixed 7;
    Analytical          7;
    APIdiffCoefFunc     7;
    Ar                  7;
    BirdCarreau         7;
:
    zoneToPoint         7;
}
```
- 1,2,4のbit演算を行うタイプもあるので，1+2+4で全て7を張る

***ざわ・・・!***

```bash
run
cp -a $FOAM_TUTORIALS/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation .
cd multiRegionHeaterRadiation
emacs system/controlDict
./Allrun-parallel >& log.Allrun-parallel &
```

***ざわ・・・!***
***ざわ・・・!***


```bash
tail -f log.chtMultiRegionSimpleFoam
```
***ログっ・・・!***
***圧倒的ログっ・・・!***

***これはOpenFOAMerにとって・・・***

***僥倖っ・・・!***
***なんという僥倖っ・・・!・・・***

***しかし，実行時間は15 s → 355 sと23倍!***
***ログサイズは3.9MB→2.3GBと60倍!***

以下，時事ネタにつき自粛．


## まとめ

OpenFOAMのDebugSwitchesについて簡単に紹介しました．
なんでもやりすぎは駄目よ!