0
0

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の設定値を時間などの関数にする方法(Function1について)

Last updated at Posted at 2024-12-31

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

Function1とは?

OpenFOAMのいろいろな設定項目の中には、Function1というクラスを使って実装されていて、設定値を時間などの関数にすることができるものがあります。

例えば、流量を指定する速度の境界条件flowRateInletVelocityの設定値volumetricFlowRate(体積流量の場合)やmassFlowRate(質量流量の場合)などが、Funtion1として実装されています。

例として、このvolumetricFlowRate

volumetricFlowrate 0.2;

のように記述すれば、時間に対して一定の流量($0.2 [m^3/s]$ )を与える設定になりますが、

volumetricFlowRate
{
    type        sine;
    frequency   3.0;
    scale       0.01;
    level       0.2;
}

のように記述すると、平均$0.2[m^3/s]$、振幅$0.01[m^3/s]$、周波数$3.0 [1/s]$で時間変化をする流量を与えることができます。

Function1として実装されているほとんどの設定項目は、時間(タイムステップ)を入力とする関数として取り扱われますが、以下のように他の値を入力とするように実装されている設定項目もあります。

  • fanPressure境界条件のfanCurve(流量が入力値)
  • 液膜モデルの境界条件temperatureDependentContactAngleForcetheta(温度が入力値)

なお、どの設定項目がFunction1として実装されているか、何が入力値になっているかは、ソースコートを確認してみないと分かりません。

書式

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

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

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

<entryName>
{
    type      linearRamp;
    start     10;
    duration  20;
}

一定値を設定する場合

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

<entryName>   10;
<entryName> zero;

Coeffsを使用した書き方

Function1のパラメータを<entryName>Coeffs(例えば、volumetricFlowRateCoeffs)のサブディクショナリとして記述します。

<entryName>   linearRamp;
<entryName>Coeffs
{
    start     10;
    duration  20;
}

ベタ書き

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

<entryName>   linearRamp;
start     10;
duration  20;

Function1の種類

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

一定値を返すもの

uniform

一定値を返します。

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

次のようにも記述することができます。

<entryName>  uniform 0.2;

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

ramp系

startで指定した時刻までは値が$0$で、それからdurationの時間の間は値が変化します。指定したタイプによって値の変化のしかたが変わります。

ramp系のFunction1の名前を<rampFunction>とすると、下記のような書式になります。

<entryName>
{
    type      <rampFunction>;
    start     10;
    duration  20;
}

step

startからdurationの期間の値は$1$.それ以降では$0$を返します.


linearRamp

startからdutationまでの時間は、$0$から$1$まで、線形補間した値を返します.


quadraticRamp

$\mathrm{linearRamp}$の値を二乗した値を返します。

$$
\mathrm{quadraticRamp}(t) = \mathrm{linearRamp}(t)^2
$$


halfCosineRamp

半周期分の$\cos$関数による値を返します。

$$
\mathrm{halfCosineRamp}(t) = 0.5[1 - \cos \{ \pi \times \mathrm{linearRamp}(t) \} ]
$$


quarterSineRamp

1/4周期分の$\sin$関数による値を返します。

$$
\mathrm{quarterSineRamp}(t) = \sin \{ 0.5\pi \times \mathrm{linearRamp}(t) \}
$$


quarterCosineRamp

1/4周期分の$\cos$関数による値を返します。

$$
\mathrm{quarterCosineRamp}(t) = 1 - \cos \{ 0.5\pi*\mathrm{linearRamp}(t) \}
$$

テーブル補間

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

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](オプション)
}

その他

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

none

エラーが発生します。placeholder(仮の設定値)として使用するためにあります。


sample

positionで指定した点を含むセルの値を参照することができます。

<entryName>
{
    type            sample;
    field           <field name>;
    position        (0 0 0);
    interpolationScheme cell;    // 値の保管方法(デフォルト:cell)
}

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
    #{
        return 2.0*x;    // 引数はx
    #};

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

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

functionObjectTrigger

runTimeControlのファンクションオブジェクトで発行されたtriggerに基づいて、値を変化させることができます。

  • triggerが発行されるまでは、設定値のdefaultValuetrueならば$1$、falseならば$0$を返します
  • 何らかのtriggerが発行されたら、そのtriggerの番号が設定値のtriggersに含まれる場合は$1$、含まれない場合は$0$を返します
  • triggerの番号は、runTimeControlのファンクションオブジェクトの下記の設定で発行します。
satisfiedAction setTrigger;
trigger         1;               // 発行するtrigger番号

下記の例では「1」、「3」、「5」番のトリガーが発行されたら、$1$を返します。

<entryName>
{
    type            functionObjectTrigger;
    triggers        (1 3 5);
    defaultValue    false;  // Optional
}

functionObjectValue

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

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

inputValueMapper

入力値をmodeの設定に応じて入力値を変換(mapping)をして、valueで設定されたFunction1<Type>に渡した値を返します。

  • modeの設定は以下が使用可能です
    • none
      • 入力値をそのままvalueで設定されたFunction1<Type>に渡します
    • function
      • 入力値をfunctionで設定されたFunction1<scalar>に渡し,その返り値がvalueで設定されたFunction1<Type>に渡されます
    • minMax
      • 入力値がminmaxの設定値でトリミングされた値が、valueで設定されたFunction1<Type>に渡されます
例1

//    Here the return value will be:
//    - poly(0.4) for x <= 0.4;
//    - poly(1.4) for x >= 1.4; and
//    - poly(x) for 0.4 < x < 1.4.

<entryName>
{
    type            inputValueMapper;
    mode            minMax;
    min             0.4;
    max             1.4;

    value polynomial
    (
        (5 1)
        (-2 2)
        (-2 3)
        (1 4)
    );
}
例2
<entryName>
{
    type            inputValueMapper;
    mode            function;

    function
    {
        type            functionObjectValue;
        functionObject  surfaceFieldValue1;
        functionObjectResult sum(outlet,phi);
    }

    value
    {
        type        table;
        file        "<system>/fanCurve.txt";
    }
}

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
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?