0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenFOAMの境界条件の値を時間などの関数にする方法(PatchFunction1について)

Last updated at Posted at 2025-01-13

以下の内容はOpenFOAM v2212で確認しています。

PatchFunction1とは?

パッチでの値に対応したFunction1です。
基本的には時刻を引数として、パッチでの値を返す関数です。(ただし、引数とは関係のない値を出力できるtypeもあります。)

基本的にはuniformFixedValueの境界条件のuniformValueの設定値として使用しますが、例えばatmTurbulentHeatFluxTemperatureに設定する熱ソースqのようにパラメータ設定で使用できるものもあります。
(どのパラメータで使用ができるかは実装を確認しないと分かりません。)

書式

PatchFunction1の設定には、いくつかの書式があります。

typeでPatchFunction1の種類を指定する方法

PatchFunction1で設定する設定項目のサブディクショナリに、typeでFunction1の種類を指定する方法です。私は下記の書式が一番読みやすいと思います。
<entryName>はFunction1で設定できる設定項目の名前です。)

<entryName>
{
    type        sine;
    period      10.0;
    amplitude   0.1;
    scale       1.0;
    level       0.0;
}

一定値を設定する場合

一定値の値を設定する場合には、簡易的に以下のような書き方をすることができます。

<entryName>   10;
<entryName> zero;

Coeffsを使用した書き方

PatchFunction1のパラメータを<entryName>Coeffsのサブディクショナリとして記述します。

<entryName>   sine;
<entryName>Coeffs
{
    period      10.0;
    amplitude   0.1;
    scale       1.0;
    level       0.0;
}

ベタ書き

PatchFunction1のパラメータをサブディクショナリを使わずに指定する方法です。ベタ書きだと他の設定項目と混在してしまい、読み難くなると思います。

<entryName>   linearRamp;
period      10.0;
amplitude   0.1;
scale       1.0;
level       0.0;

PatchFunction1の種類

ここからは、PatchFunction1で設定できる関数のタイプを種類ごとに説明します。

一定値を返すもの

constant

一定値を返します。

<entryName>
{
    type    constant;
    value   <value>;
}

one

常に$1$を返します。


zero

常に$0$を返します。

数学関数

polynomial

多項式による値を返します。

  • 括弧の中に2つの数値を記述するTuple2形式で、係数と乗数を順に指定します。
  • 下記の例では、$f(t)=t^2+2t^3$の意味になります。
<entryName>
{
    type   polynomial;
    coeffs
    (
        (1 2)
        (2 3)
    );
}

sine

$\sin$関数による値を返します。

  • 周期(Period)で指定する場合
    $$
    a\ s \sin(2 \pi (t - t_0) / p)) + l
    $$

  • 周波数(Frequency)で指定する場合
    $$
    a\ s \sin(2 \pi f (t - t_0)) + l
    $$

<entryName>
{
    type        sine;
    frequency   10;
    amplitude   0.1;
    scale       2e-6;
    level       2e-6;
}
名前 意味 値のタイプ 設定が必要か? デフォルト値
amplitude 振幅 $a$ Function1<scalar> 1
frequency 周波数 [1/s] $f$ Function1<scalar> periodとどちらか
period 周期 [s] $p$ Function1<scalar> frequencyとどちらか
scale 係数 $s$ Function1<Type> 必要
level オフセット値 $l$ Function1<Type> 必要
t0 時間のオフセット値 $t_0$ scalar 0

cosine

$\cos$関数による値を返す.

  • 周期(Period)で指定する場合
    $$
    a\ s \cos(2 \pi (t - t_0) / p)) + l
    $$

  • 周波数(Frequency)で指定する場合
    $$
    a\s \cos(2 \pi f (t - t_0)) + l
    $$

<entryName>
{
    type        cosine;
    frequency   10;
    amplitude   0.1;
    scale       2e-6;
    level       2e-6;
}
名前 意味 値のタイプ 設定が必要か? デフォルト値
amplitude 振幅 $a$ Function1<scalar> 1
frequency 周波数 [1/s] $f$ Function1<scalar> periodとどちらか
period 周期 [s] $p$ Function1<scalar> frequencyとどちらか
scale 係数 $s$ Function1<Type> 必要
level オフセット値 $l$ Function1<Type> 必要
t0 時間のオフセット値 $t_0$ scalar 0

square

出力値が$[-1, 1]$の範囲の周期的な矩形関数 $\mathrm{rect}$ による値を返します。

  • 周期(Period)で指定する場合
    $$
    a\ s\ \mathrm{rect}((t - t0) / p)) + l
    $$

  • 周波数(Frequency)で指定する場合
    $$
    a\ s\ \mathrm{rect}(f (t - t0)) + l
    $$

値が$1$になっている時間と$0$になっている時間の割合 $r$ を指定することもできます。
$$
r= {M \over{M + S}}
$$

<entryName>
{
    type        square;
    frequency   10;
    amplitude   0.1;
    scale       2e-6;
    level       2e-6;
}
名前 意味 値のタイプ 設定が必要か? デフォルト値
amplitude 振幅 $a$ Function1<scalar> 1
frequency 周波数 [1/s] $f$ Function1<scalar> periodとどちらか
period 周期 [s] $p$ Function1<scalar> frequencyとどちらか
scale 係数 $s$ Function1<Type> 必要
level オフセット値 $l$ Function1<Type> 必要
t0 時間のオフセット値 $t_0$ scalar 0
mark $1$の時間 $M$ scalar 1
space $0$の時間 $S$ scalar 1

テーブル補間

指定したテーブルを使って、補間した値を返すことができます。

csvFile

csvファイルから補間された値を返します。

<entryName>
{
    type  csvFile;
    nHeaderLine         4;          // ヘッダー部分の行数
    refColumn           0;          // 入力値のデータがかかれたカラム番号
    componentColumns    (1 2 3);    // 補間するデータが書かれたカラム番号
    separator           ",";        // データの区切り文字 (デフォルトは ",")
    mergeSeparators     no;         // 複数の区切り文字をマージするかどうか
    file                "fileXYZ";  // csvファイルのファイル名
    outOfBounds         clamp;      // 範囲外のデータ処理方法(オプション)
    interpolationScheme linear;     // 補間方法 [linear(デフォルト)|spline](オプション)
}

table

OpenFOAM形式のテーブルから補間された値を返します。

<entryName>
{
    type table;
    values
    (
        (0.0 (1 2 3))
        (1.0 (4 5 6))
    );
    outOfBounds         clamp;      // 範囲外のデータ処理方法(オプション)
    interpolationScheme linear;     // 補間方法 [linear(デフォルト)|spline](オプション)
}

テーブルデータが書かれたファイル名を指定することもできます。

<entryName>
{
    type table;
    file "<case>/path/tableValues"; // ファイル名
}

tableFile

OpenFOAM形式のテーブルファイルから補間された値を返します。
機能としては、tableのタイプでファイル名を指定する場合と同じです。

<entryName>
{
    type table;
    file "<case>/path/tableValues";
    outOfBounds         clamp;      // 範囲外のデータ処理方法(オプション)
    interpolationScheme linear;     // 補間方法 [linear(デフォルト)|spline](オプション)
}

その他

特殊な用途で使用できるタイプがいくつかあります。

sample

他のセルでの指定したフィールドの値を参照することができます。
実装はlibsampling.soに入っているので、decomposeParなど、このライブラリがリンクされていないツールで使用するとエラーが発生します。このような場合には、system/controlDictlib (sampling);の記述が必要となります。

<entryName>
{
    type            sample;
    field           T;            // 値を参照するフィールド名
    position        (0 0 0);      // 値を参照する点
    interpolationScheme cell;     // 値の補間方法(デフォルト:cell)
}

sampled

mappedFieldの境界条件と同じように、値を与える境界を指定した方向にオフセットした箇所での解析領域内の補間された値を返します。
循環参照にならないように注意する必要があります。

<entryName>
{
    type            sampled;
    field           U;            // 値を参照するフィールド名
    sampleMode      nearestCell;  // サンプリングの手法
    offset          (0 -0.001 0); // 値を参照する点
    interpolationScheme cell;     // 値の補間方法(デフォルト:cell)
}
名前 意味 設定が必要か? デフォルト値
field フィールド名 必要
sampleMode サンプリングの手法 必要
sampleRegion サンプリング対象の領域
samplePatch サンプリング対象のパッチ名
offsetMode オフセット方法 uniform
offset オフセットベクトル (0 0 0)
interpolationScheme 補間方法 必要 cell
setAverage 平均値を指定するかどうか false
average 平均値の指定値

mappedFile

timeVaryingMappedFixedValueの境界条件と同じように、座標値を指定した定義点と物理量の離散的なデータを記述した外部ファイルからマッピングを行った値を返します。
定義点の座標値は、constant/boundaryData/<patchName>/pointsファイルにOpenFOAM形式で指定します。
定義点での物理量は、constant/boundaryData/<patchName>/<time>/<field>ファイルにOpenFOAM形式で指定します。

設定値一覧

名前 意味 値のタイプ 設定が必要か? デフォルト値
mapMethod マッピングの方法 word planar
offset 補間された値に対するオフセット値 Function1<Type> -
fieldTable フィールドデータテーブルのファイル名 word field-name
points 定義点の座標値のファイル名 word points
setAverage 平均値を指定するかどうか bool no false

mapMethodの設定値一覧

Property Description
nearest 最近傍の値を使用する
planar 二次元のデローニ法による補間

scale

valueで指定したFunction1<Type>の値に,scaleで指定したFunction1<scalar>の値を乗じて、valueの値をスケーリングすることができます。

<entryName>
{
    type      scale;

    scale
    {
        type        linearRamp;
        start       0;
        duration    10;
    }

    value
    {
        type        sine;
        frequency   10;
        amplitude   1;
        scale       (1 0.1 0);
        level       (10 1 0);
    }
}

coded

実行時にコンパイルされるソースコードで、計算された値を返します。

次のようなディレクティブを指定することができます。

   codeInclude | include files
   codeOptions | compiler line: added to EXE_INC (Make/options)
   codeLibs    | linker line: added to LIB_LIBS (Make/options)
   localCode   | c++; local static functions
   code        | c++; return the patch values at (scalar x)

下記の例は、入力値の2倍の値を返す例です。

<entryName>
{
    type  coded;
    name  myExpression;  // 名前

    code
    #{
        const polyPatch& pp = this->patch();
        Pout<< "** Patch size:" << pp.size() << endl;
        return tmp<scalarField>::New(pp.size(), 2.0*x)     // 引数はx
    #};

    //codeInclude
    //#{
    //    #include "volFields.H"
    //#};

    //codeOptions
    //#{
    //    -I$(LIB_SRC)/finiteVolume/lnInclude
    //#};
}

functionObjectValue

他のファンクションオブジェクトの値を返します。

  • 使用できる値は、時刻ディレクトリのuniform/functionObjects/functionObjectPropertiesの出力内容で確認することができます
  • 型の違いに注意
    • scalarの値を返さなければいけない箇所で,labelの値を出力する結果を指定すると、常に$0$が返ります
<entryName>
{
    type                    functionObjectValue;
    functionObject          <name>;
    functionObjectResult    <function object result field>;
    defaultValue            <value>; // 値が出力できない場合に返される値(オプション)
}

expression

expressionの機能で演算された値を返します。

複雑な設定をしようとするとバグなどの問題に直面する可能性がありそうです。よく検証してから使用したほうがよいと思います。

<entryName>
{
    type            expression;

    // optional variables for use within the expression
    variables
    (
        "start = 0.5"
        "stop  = 1"
    );

    // A step function
    expression
    #{
        mag(arg() > start && arg() < stop) * vector(1, 0, 0)
    #};
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?