OpenFOAMによるF1 Rear Wingの風洞解析 (2) simpleFoam実行編)

# 目的
本記事では、__snappyHexMesh__ + __OpenFOAM v8__ の組み合わせでの風洞数値実験を行うことを目的としています。
分量の関係から、[前編（メッシュ生成）](https://www.techradar.com/news/amd-zen-3)、後編（CFDの実行）に分けて解説していきます。
本記事はその後編になります。

### 前提

```bash
$FOAM_TUTORIALS/incompressible/simpleFoam/motorBike 
```

のcaseファイルをもとに風洞解析用のcaseを作成していきます。

```bash
cp $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike /workDir/rearWing
```
のように作業ディレクトリに__reaWing__というディレクトリ名でcaseをコピーしてあり、また、snappyHexMeshにて計算格子ができていることを前提としています。

### 初期条件 / 境界条件
![mesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/c4facb27-f9f3-9efe-c300-1e57dd663d6c.png)
先の作業によりメッシュが切れているのであれば、上図のようなPatchが各面に割り当てられているはずです。
基本はチュートリアルmotorBikeの設定のままで動きます。が、ここでは少し設定を確認しておこうと思います。

```c++:0/U
{
    //- Set patchGroups for constraint patches
    #includeEtc "caseDicts/setConstraintTypes"

    #include "include/fixedInlet"

    outlet
    {
        type            inletOutlet;
        inletValue      uniform (0 0 0);
        value           $internalField;
    }

    "(lowerWall|upperWall)"
    {
        type            slip;
    }

    rearWing
    {
        type            noSlip;
    }

    #include "include/frontBackUpperPatches"
}
```

__lowerWall__, __upperWall__, __frontAndBack__にはノイマン条件（勾配ゼロ）としています。__outlet__は出口境界ですが、その名の通り流出・流入境界条件が与えられています。ただ、``inletValue uniform (0 0 0)``としていますので、流入は認めていない（逆流が生じるような面に、仮想の壁を置いている）設定になっています。
懸案の入り口境界__inlet__は__0/include__ディレクトリ下の__fixedInlet__, __initialConditions__をインクルードして設定するようになっています。

```c++:0/include/fixedInlet
inlet
{
    type  fixedValue;
    value $internalField;
}
```

```c++:0/include/initialConditions
flowVelocity         (0 20 0);
pressure             0;
turbulentKE          0.24;
turbulentOmega       1.78;
```

### controlDict

以下に計算実行の設定ファイルである__controlDict__を示します。

```c++:/system/controlDict
application     simpleFoam;
startFrom       latestTime;
startTime       0;
stopAt          endTime;
endTime         5000;
deltaT          1;
writeControl    timeStep;
writeInterval   100;
purgeWrite      0;
writeFormat     binary;
writePrecision  6;
writeCompression off;
timeFormat      general;
timePrecision   6;
runTimeModifiable true;

functions
{
    #include "streamLines"
    #include "cuttingPlane"
    #include "forceCoeffs"
}
```

ここで、__function objects__にstreamLines, cuttingPlane, ``forceCoeffs``が読み込まれています。特に``forceCoeffs``は揚力・抗力係数を計算する際に用いるライブラリになります。
system以下に、``forceCoeffs``というファイルがあり、その中で計算の設定を行います。

```c++:system/forceCoeffs
forceCoeffs1
{
    type            forceCoeffs;

    libs            ("libforces.so");

    writeControl    timeStep;
    timeInterval    1;

    log             yes;

    patches         (rearWing);
    rho             rhoInf;      // Indicates incompressible
    rhoInf          1;           // Redundant for incompressible
    liftDir         (0 0 1);
    dragDir         (0 1 0);
    CofR            (0.72 0 0);  // Axle midpoint on ground
    pitchAxis       (0 1 0);
    magUInf         20;
    lRef            1.42;        // Wheelbase length
    Aref            0.05;        // Estimated
 }
```
patchesでどの面の効力を計算するのか、liftDir、dragDirで揚力、抗力の向きを、magUInfで周囲流速、Arefで断面積（投影）を設定します。

なお、設定ファイル等が無い場合は、fundation版のみの機能になりますが、
```bash
formGet <ほしいファイル（例えばforceCoeffs）>
```
とすれば、systemディレクトリ以下にforceCoeffsファイルがソースからコピーされます。

### 解析結果例
以下は、simpleFoamを実行して得られた速度コンターおよび流線になります。

![velocity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/6dccba5a-9a18-d151-1f3b-f9c667db84d0.png)

![stream.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/885e70ed-7806-ee33-704d-7f608cfa223b.png)

### 最後に
この手の情報はネット上にたくさん上がっていて、今更感は否めませんでしたが、ゼミの資料として使えるのでは、ということでまとめてみました。何かしらお役に立てれば幸いです。