OpenFOAMによるF1 Rear Wingの風洞解析 (1) メッシュ生成編

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

# データの準備
### Wing data
解析対象の3次元データを用意する必要があります。
今回は[ここ](https://grabcad.com/library)からF1_2019_Rear_Wing.stpというデータをダウンロードし、解析にかけることにしました。

[FreeCAD](https://www.freecadweb.org/?lang=ja)で読み込み__obj__形式で出力しておきます。


![wing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/b9f8a98f-51d5-325a-d272-bfe3c1315cb8.png)

### OpenFOAM case data
snappyHexMeshを使ったTutorial caseを以下のようにして作業ディレクトリに持ってきます。

```bash
cp $FOAM_TUTORIALS/incompressible/simpleFoam/motorBike ~/rearWing
```

ここではホームディレクトリにrearWingというディレクトリ名でコピーしています。

### objファイルのデータ変換
ダウンロードしたobjファイルをconstantディレクトリ下に置きます：

```
~/rearWing/constant/triSurface/
```

今回のobjファイルはミリメーター単位で描かれていたため、メーター単位に変換します：

```bash
surfaceConvert -scale 0.001 rearWing.obj rearWing2.obj
```

### 特徴線の抽出
次いで、形状データの特徴線の抽出を行います。
そのためには__surfaceFeatures__ユーティリティを使用しますが、その設定ファイルを作業ディレクトリに持ってくる必要があります。

```
foamGet surfaceFeaturesDict
```

これで、__surfaceFeaturesDict__ファイルがsystemフォルダ下にコピーされます。

```bash:surfaceFeaturesDict
surfaces ("rearWing2.obj");

// Identify a feature when angle between faces < includedAngle
includedAngle       150;

subsetFeatures
{
    // Keep nonManifold edges (edges with >2 connected faces)
    nonManifoldEdges       no;

    // Keep open edges (edges with 1 connected face)
    openEdges       yes;
}
```

ここで重要なパラメータは**includedAngle**になります。どの程度の値が良いのかは各形状データに依存します。

```bash
surfaceFeatures
```


なお，他ページをみると``surfaceFeatureExtract``という異なるユーティリティがありますが，これは古いユーティリティになるようで，of8以降は``surfaceFeatures``に移行していく模様です。

これで**.eMesh**ファイルが``constant/triSurface/``以下に作成されます。同ファイルはParaviewで直接開くことができないので、[ここ](https://www.cfd-online.com/Forums/openfoam/96961-how-display-emesh-files.html)を参考に

```
surfaceFeatureConvert rearWing2.eMesh features.obj
```

のようにobjファイルに変換する必要があります。

![features.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/7f5c09e9-1b86-eb7c-5f7e-ee5c9c2887ff.png "特徴線の抽出")


# Meshing

### bockMesh

![blockMesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/4e2ae3af-71ff-d10f-d466-a847ef6e7853.png)

上図のようにblockを作成し、風洞空間（解析の系）を用意する必要があります。
そこで、**surfaceCheck**ユーティリティを利用し、objファイルのサイズ（座標）を確認します。

```bash
surfaceCheck rearWing.obj -blockMesh > blockData
```

```bash:blockDataの中身
Statistics:
Triangles    : 62704
Vertices     : 31348
Bounding Box : (-0.519 -0.109139 -0.000233722) (0.519 0.693148 0.67)

// blockMeshDict info

vertices
(
    (-0.519 -0.109139 -0.000233722)
    (0.519 -0.109139 -0.000233722)
    (0.519 0.693148 -0.000233722)
    (-0.519 0.693148 -0.000233722)
    (-0.519 -0.109139 0.67)
    (0.519 -0.109139 0.67)
    (0.519 0.693148 0.67)
    (-0.519 0.693148 0.67)
);
```

この座標データを参考に**blockMeshDict**を編集します。今回は、以下のようにverticesを修正しました。


```bash:blockMeshDict
vertices
(
    (-3.519 -10.109139 -2.000233722)
    (3.519 -10.109139 -2.000233722)
    (3.519 6.693148 -2.000233722)
    (-3.519 6.693148 -2.000233722)
    (-3.519 -10.109139 2.87)
    (3.519 -10.109139 2.87)
    (3.519 6.693148 2.87)
    (-3.519 6.693148 2.87)
);
```

### snappyHexMesh
次いで、__snappyHexMesh__を実行するのですが、元あるsnappyHexMeshDictのファイル（古いバージョンの入力ファイル。v8でも問題なく動く）を使うのではなく、新たにv8の設定ファイルを持ってくることにします。書式が若干変わっています。

```bash
foamGet snappyHexMeshDict
```

設定は多岐にわたっており、全てを言及するのが（分量的に）困難なため、ここでは、修正ポイントのみを説明します。


```bash:snappyHexMeshDict/geometry
geometry
{
    rearWing
    {
        type triSurfaceMesh;
        file "rearWing.obj";
    }
};
```

```bash:snappyHexMeshDict/castellatedMeshControls
    features
    (
       { file "rearWing.eMesh"; level 6; }
    );
```

```bash:snappyHexMeshDict/castellatedMeshControls
    refinementSurfaces
    {
        rearWing
        {
            level (5 6);
            patchInfo { type wall; }
        }
    }
```

```bash:snappyHexMeshDict/castellatedMeshControls
    refinementRegions
    {
        rearWing
        {
            mode inside;
            levels ((1E15 6));
        }
    }
```

```bash:snappyHexMeshDict/addLayersControls
    layers
    {
        rearWing
        {
            nSurfaceLayers 3;
        }
    }
```

上記のサンプルではウィングモデルを__rearWing__と名付けています。修正箇所は、デフォルトで入っているモデル名を、この__rearWing__に変更すれば良いです（境界層メッシュ等の設定はここでは言及しません）。

ここまでできれば、あとは__snappyHexMesh__を実行すればよいのですが、メッシュ生成にそれなりに時間を要するため、並列処理(__decomposePar__)を行うことにします。snappyHexMeshDictの時と同様に、

```
foamGet decomposeParDict
```

で設定ファイルを持ってきます。種々の分割方法が用意されていますが、ここでは__scotch__を使用することにします。

```bash:decomposeParDict
numberOfSubdomains 4;
method scotch;
```
その後、領域分割を行い、snappyHexMeshを並列で実行します。

```bash:分割
decomposePar
```

```bash:snappyHexMeshの並列処理
foamJob -p snappyHexMesh
```

```bash:meshの再構築
reconstructParMesh
```

**heckMesh**をしてfalseがなければ、メッシュ作成はこれで完了です。
お疲れさまでした！！ (メッシュが粗い、品質が良くない、というのはご容赦ください・・・)

![mesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227359/0774a322-082f-d6b2-b59e-2da03c9d7c70.png)

# まとめ
メッシュ生成から解析までの流れを一つの記事でまとめるつもりでいましたが、記事が長くなりましたので、解析は後編というかたちでまとめたいと思います。
実際、メッシュ生成といっても、今回はほぼデフォルトのままですので、snappyHexMeshの細かな設定（レイヤーやメッシュの細かさなど）は操作できずにいます。そのあたりは改めて確認したいと思っています。

私はこれまで商用メッシャーばかりを使ってきていて、オープンソースのメッシャーがどこまで切れるのか知りませんでした。思いの外、切れるなというのが今回の感想になります。