時刻で結果を補間する

2017年9月10日

はじめに

結果時刻データの間の時刻でデータを補間する方法について。

バージョン

OpenFOAM v1706

時刻で結果を補間する

結果時刻データの間の時刻でデータを補間するには、temporalInterpolate を用いる。

$ temporalInterpolate

結果時刻データの間の中間の時刻データが作成される。0, 100, 200 とあれば、50, 150 ができる。

分割数を指定することもできる (デフォルトは 1)。

$ temporalInterpolate -divisions 2

0, 100 とあれば、33.3333, 66.6667 が作成される。

フィールドを限定するには -fields オプションを使う。

$ temporalInterpolate -fields '(U)'

補間を行う時間を指定できる。

$ temporalInterpolate -time 0,100

補間方法を line, spline から選ぶことができる。

$ temporalInterpolate  -interpolationType spline

任意の時刻で結果を補間する。

temporalInterpolate では任意の時刻では結果を補間できない。そこで、temporalInterpolate を参考にして任意の時刻で補間してみる。

    label timei = 0;
    runTime.setTime(timeDirs[timei], timei);
    IOobjectList objects(mesh, runTime.timeName());

    instant timej(interpolationTime);
    runTime.setTime(instant(timej.name()), 0);

    labelList indices;
    scalarField weights;
    interpolatorPtr().valueWeights
    (
        runTime.value(),
        indices,
        weights
    );

    const wordList selectedTimeNames
    (
        UIndirectList(timeNames, indices)()
    );

    const word& fieldClassName = volVectorField::typeName;
    IOobjectList fields = objects.lookupClass(fieldClassName);

    forAllConstIter(IOobjectList, fields, fieldIter)
    {
        if (fieldIter()->name() != "U") continue;

        ReadFields
        (
            fieldIter()->name(),
            mesh,
            selectedTimeNames
        );

        volVectorField fieldj
        (
            uniformInterpolate
            (
                IOobject
                (
                    fieldIter()->name(),
                    runTime.timeName(),
                    fieldIter()->db(),
                    IOobject::NO_READ,
                    IOobject::NO_WRITE,
                    false
                ),
                fieldIter()->name(),
                selectedTimeNames,
                weights
            )
        );

        fieldj.write();
    }

指定された時刻を間にもつ 2 つの時刻とそれについての重みを得て、それで補間する流れになっている。ここでは補間するデータを U に限定している。

simpleFoam のチュートリアルケース pitzDaily の time = 100、200 の U から time = 120 の U を補間した結果を以下に示す。

time = 100/time = 200

time = 120