データのサンプリング方法について

981 views
Skip to first unread message

kayu

unread,
Oct 1, 2015, 1:11:37 AM10/1/15
to OpenFOAM
こんにちは。

管内気液混相流の解析を行っている者です。お世話になっております。

現在、とても長いパイプの中の流れの解析を試みています。そこで、計算時間短縮のため、パイプを短く分割したモデルで計算を行い、計算結果の出口付近の各パラメータの値を、次のモデルの入り口付近の初期条件の値として受け渡す方法について考えています。

sampleコマンドを使って出口付近のサンプリングを行ったところ、管断面のメッシュ数が328である一方、出力されたデータ数は800個となりました。これを、各メッシュのパラメータの値を出力する328個のデータを取り出すサンプリングにする方法はございますでしょうか。

以下、現在のsampleDictの内容です。

FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      sampleDict;
}
setFormat       raw;
surfaceFormat   raw;
interpolationScheme cellPoint;
fields          ( U p );
surfaces
(
    data
    {
        type cuttingPlane;
        planeType pointAndNormal;
        pointAndNormalDict
        {
            basePoint (0 0 4);
            normalVector (0 0 1);
        }
    }
);


以上、何卒アドバイスいただけると幸いです。よろしくお願いいたします。

Hirasawa Takanori

unread,
Oct 2, 2015, 1:59:30 AM10/2/15
to OpenFOAM
hirasawaです.

以前,私が計算領域を短くしたりする解析を
行った際,周期境界条件cyclicというのを使用しました.

周期境界条件は
質問文中にもありますように
「計算結果の出口付近の各パラメータの値を、次のモデルの入り口付近の初期条件の値として受け渡す」
というものです.
この境界条件は計算ステップ毎で
その瞬時の出口のパラメーターが
入口に反映されますので
sampleDictで結果を抜き出し結果を入口条件に当てはめるよりも
自然な境界条件になるのでは?と思いました.

詳しい計算モデルは分かりませんので
的外れでしたらごめんなさい.


kayu

unread,
Oct 5, 2015, 4:30:16 AM10/5/15
to OpenFOAM
hirasawaさま

アドバイスありがとうございます。
cyclicを試してみたところ、計算が途中でエラーになってしまいました。パイプの中の流れの解析では、管内の流れに伴って本来は圧力が下がっていくはずだと思うのですが、cyclicの条件では、inletとoutletで圧力条件が共通となるために計算に矛盾が生まれてしまうのが原因かもしれないと考えました。

ほかの方法を検討してみたところ、うまくデータを受け渡す方法の目処を立てることができました。
引き続き受け渡す方法について検討してみます。
回答してくださいましてありがとうございました。


2015年10月2日金曜日 14時59分30秒 UTC+9 Hirasawa Takanori:
Message has been deleted

Masashi Imano

unread,
Oct 5, 2015, 5:09:58 AM10/5/15
to OpenFOAM
今野です.

現バージョンのsampleコマンドはパッチ以外の任意断面を面サンプリングすると,
必ず三角形補間をしてしまうので,サンプリング数と格子数が異なる結果になります.
(補間されていても流入データとして耐えられると考えて,このまま
timeVaryingMappedFixedValue 境界の入力値として使う事もあります.)

格子中心の値をそのままサンプリングするには以下の方法があります.

1. サンプリングしたい格子のゾーン(cellZone)を作成する
2. function機能を用いて,上記のcellZoneの場の値を出力する.

1. のcellZoneを作成する方法はいくつかありますが,例えば以下のような topoSetDictを作成し,
topoSetで作成する事が可能です.

system/topoSetDict
---
actions
(
    {
        name    samplingCellSet;
        type    cellSet;
        action  new;
source boxToCell;
sourceInfo
  {
    box   (0.745 -1e+10 -1e+10) (0.750 1e+10 1e+10); // サンプリング断面を通る格子のみを含む矩形領域
  }
    }

    {
        name    samplingCell;
        type    cellZoneSet;
        action  new;
source setToCellZone;
sourceInfo
  {
    set samplingCellSet;
  }
    }
);
---

2. を行うには,ソルバのcontrolDictに以下のようなfunctionの設定を追加します.

system/controlDict
---
functions

  samplingCell
  {
    type cellSource;
    functionObjectLibs ("libfieldFunctionObjects.so");
    enabled true;
    outputControl timeStep;
    outputInterval 1;
    log false;
    valueOutput true;
    source cellZone;
    sourceName samplingCell;
    operation volIntegrate; // 何でも良い.

    fields ( U p );
  }
}
---

本来,上記はソルバ実行時に機能するのですが,既に計算結果がある場合には,
execFlowFunctionObjectsを用いることで,既往の計算結果に対してfunction が動作しますので,
sample と同様に事後のサンプリングが可能です.

$ execFlowFunctionObjects
または,
$ execFlowFunctionObjects -latestTime

以上です.

2015年10月5日月曜日 17時30分16秒 UTC+9 kayu:
Reply all
Reply to author
Forward
0 new messages