OpenFOAM Postprocessingによるデータ抽出方法(probes/internalProbes)

# はじめに
OpenFOAMでは様々なポスト処理が用意されています。
ここでは、指定のセル（点）における、指定の変数の抽出方法、__probes__、__internalProbes__について言及します。
なお、本記事では __OpenFOAM ver.8__ / __ver.10__ (Foundation版) について解説していきます。

# probe / internalProbes の概略
[probing dataのページ](https://cfd.direct/openfoam/user-guide/v8-graphs-monitoring/)に概略が述べられています：

- probes identify the nearest cells to the probe locations and write out the cell values; data is written into a single file in a time-value format, suitable for plotting a graph.
- boundaryProbes and internalProbes interpolate field data to the probe locations, with the locations being snapped onto boundaries for boundaryProbes; data sets are written to separate files at scheduled write times (like fields). data.

__probes__ は指定座標に近いセルの__時系列__データを抽出するのに対し、 __internalProbes__ は指定座標のデータを補間して抽出します。

また、Fundation版で実装されているscript、foamInfoを叩くと所望の関数、ソルバーの情報を得ることができます。

```c++:probes
File
    /opt/openfoam8/src/sampling/probes/probes.H

Description
    Set of locations to sample.

    Call write() to sample and write files.

Examples using "probes"
    *** Listing 10 out of 11; run with "-a" option to list all ***
    /opt/openfoam8/tutorials/compressible/rhoPimpleFoam/laminar/helmholtzResonance
    /opt/openfoam8/tutorials/incompressible/pimpleFoam/RAS/TJunction
    /opt/openfoam8/tutorials/incompressible/pimpleFoam/RAS/TJunctionFan
    /opt/openfoam8/tutorials/incompressible/pisoFoam/LES/pitzDaily
    /opt/openfoam8/tutorials/incompressible/pisoFoam/LES/pitzDailyMapped
    ...
```

```c++:internalProbes
File
    /opt/openfoam8/etc/caseDicts/postProcessing/probes/internalProbes

Description
    Writes out values of fields interpolated to a specified list of points.
```

以降ではそれぞれの使い方を、`incompressible/pimpleFoam/pitzDaily`を使って説明していきます。

# probes

## __ver.8__

`pitzDaily`において、

```bash
foamGet probes
```

を実行することにより、`system/probes`ファイルを自前のcaseDirに用意することができます。

```c++:system/probes
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  8
     \\/     M anipulation  |
-------------------------------------------------------------------------------
Description
    Writes out values of fields from cells nearest to specified locations.

\*---------------------------------------------------------------------------*/

#includeEtc "caseDicts/postProcessing/probes/probes.cfg"

fields (p U);
probeLocations
(
   (0 0 0)
);
```

`fields`に所望の変数を、`probeLocations`に座標を入力します。設定は基本これだけになります。

なお、その他の設定については、`caseDicts/postProcessing/probes/probes.cfg`というファイルで行われています。

```c++:system/probes.cfg
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  8
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/

type            probes;
libs            ("libsampling.so");

writeControl    timeStep;
writeInterval   1;

// ************************************************************************* //
```

ProbesのLibraryの読み込み、データ書き出し設定を行っています。デフォルトでは毎時間ステップにデータ出力することになっています。出力間隔を変更したい場合は、`probes.cfg`を`foamGet`で持ってきて、編集する必要があります。

`pimpleFoam`を実行後にデータ抽出を行う際は、

```bash
postProcessing -func probes
```
を実行すると、`postProcessing`ディレクトリ下に指定座標における、指定変数の時系列データが出力されます。

また、`pimpleFoam`実行時に同時に出力を行う場合は、`system/controlDict`に

```c++:controlDict
functions
{
   #includeFunc probes
}
```

を追記します。

## __ver.10__ 

__ver.10__ では少し設定ファイルの記述が変更されています。
そのため，ver.8の設定ファイルをもってきても動きません・・・（Foundation版のあるあるですね）。

```c++:/opt/openfoam9/etc/caseDicts/postProcessing/probes/probes
/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  10
     \\/     M anipulation  |
-------------------------------------------------------------------------------
Description
    Writes out values of fields from cells nearest to specified locations.

\*---------------------------------------------------------------------------*/

points  (<points>);

fields  (<fieldNames>);

#includeEtc "caseDicts/postProcessing/probes/probes.cfg"

// ************************************************************************* //
```


# internalProbes

指定の座標のデータを、補間しつつ、抽出してくれます。ただ、`probes`で行ったような`foamGet`で設定ファイルを持ってくるだけでは動かすことができません。以下のような操作が必要になります。

1. internalProbes、internalProbes.cfgの２つのファイルをfoamGetで持ってきます。
2. internalProbesに補間方法(internalProbes)、データ・フォーマット(setFormat)の設定の記述を追記します。

```c++:internalProbes
fields (p U);
points
(
         (0.0254 0.0253 0)
);

interpolationScheme     cellPoint;
setFormat       raw;
```

3. internalProbes.cfgに`ordered`を追記します。

```c++:internalProbes.cfg
type            sets;
libs            ("libsampling.so");

executeControl  writeTime;
writeControl    writeTime;

sets
(
    points
    {
        type    points;
        axis    xyz;
        points  $points;
        ordered 1;
    }
);
```

以上で設定は終了です。実行は`probes`と同様に`postProcessing`を実行する、もしくは、`controlDict`にpostProcessingを追記します。


# まとめ
本記事では、__probes__、__internalProbes__について、特にそれぞれの使用方法についてまとめました。
情報不足、誤り等ございましたら、ご指摘いただければ幸いです。