OpenFOAMのデータを機械学習に用いる時のデータ形式について

146 views
Skip to first unread message

mtzn

unread,
Apr 15, 2025, 2:03:50 AMApr 15
to OpenFOAM
お世話になります.本園と申します.
OpenFOAMのデータ出力形式について質問させていただきたく,投稿いたします.

OpenFOAMで計算したデータを,機械学習の学習用データとして使用したいと考えております.
解析対象:二次元翼
解析ソルバー:interPhasechangeFoam
出力したいデータ:Ux, Uy, p
機械学習:pytorch (conv.LSTM使用予定)

上記の条件において,OpenFOAMのデータ出力形式に何が適しているのか,思案しております.もし,何かご存知の方いらっしゃいましたら,お力添えいただけますと幸いです.
データ形式としては,OpenFOAMの計算結果をそのまま使用(各タイムステップフォルダに出力されたU,pなど),vtk形式,csv形式のどれかが良いかと考えております.

素人質問となり大変恐縮ですが,何卒よろしくお願い致します.

kominami

unread,
Apr 15, 2025, 5:20:11 AMApr 15
to OpenFOAM
mtznさん

kominamiです。

こちらのスレッド(
https://groups.google.com/g/openfoam/c/PEZ_AUik66w/m/5vZlJpmAcnQJ
)には、sampleユーティリティを使って、「表面」の頂点、エッジ、サーフェスの値を出力できる旨の記載があります。

内部の場合は、plobeを使えば良いと思います。


それから、
OpenFOAMのv****系統の下記のチュートリアルは、sampleユーティリティが使われています。他にもいろいろな出力のサンプルがあります。
$FOAM_TUTORIALS/incompressible/pisoFoam/ras/cavity

以上です。

2025年4月15日火曜日 15:03:50 UTC+9 mtzn:

ishigaki

unread,
Apr 15, 2025, 8:43:50 PMApr 15
to OpenFOAM
いしがきといいます。

PythonのOfppライブラリつかうと,PythonからOpneFOAMのデータをnumpyの配列として読み出せます。

アスキーでもバイナリでもどちらにも対応してます。

2025年4月15日火曜日 18:20:11 UTC+9 kominami:

mtzn

unread,
Apr 16, 2025, 5:09:15 AMApr 16
to OpenFOAM
皆様,早急にご返信ありがとうございます.
機械学習への使用を考え,Ofppを使用することにしました.

そこで,もう一つ質問なのですが,機械学習後の出力するデータ形式は,VTK形式等が良いでしょうか.
結果の可視化は,paraviewで行おうと考えております.
データ出力後,OpenFoam用のデータへの書き換え例等ございましたら,教えていただけますと幸いです.
色々,調べ,試してはいるのですが,上手くいかず行き詰まっております.
素人質問となり大変恐縮ですが,何卒よろしくお願い致します.

2025年4月16日水曜日 9:43:50 UTC+9 ishigaki:

ishigaki

unread,
Apr 16, 2025, 8:22:52 AMApr 16
to OpenFOAM
mtznさま

機械学習じゃないですが,OpenFOAMつかってデータ同化の研究をしてるので,データ同化したあとの
結果からOpenFOAMの計算を再開させる必要があるので,OpenFOAMのデータ形式に戻すということをしています。
アスキーデータであれば,internalFieldの部分をねこそぎ書き換えるスクリプトをpythonなりで組むのはそこまで難しくないと思います。

イメージ的には

internalField   nonuniform List<scalar> 

(セル数)

(

以下のデータを書き換える感じです。

バイナリデータはアスキーほど単純じゃないですが,できなくはないです。

2025年4月16日水曜日 18:09:15 UTC+9 mtzn:

mtzn

unread,
Apr 18, 2025, 3:38:46 AMApr 18
to OpenFOAM

ishigakiさま

ありがとうございます.
度々,申し訳ございません.
PythonのOfppライブラリを用いたデータだと,空間情報が失われてしまうのではないかとも思ったのですが,
この場合は,メッシュデータとフィールドデータを結合させて使用されているのでしょうか?
それとも,別でメッシュデータを組み込まれるのでしょうか.
何度も,本当にすみません.
素人質問となり大変恐縮ですが,何卒よろしくお願い致します.

2025年4月16日水曜日 21:22:52 UTC+9 ishigaki:

ishigaki

unread,
Apr 19, 2025, 8:59:22 AMApr 19
to OpenFOAM
Ofppで読み出すと,internalFieldやboundaryFieldのデータがそのまま出力されるので,確かに空間情報(座標の情報)は
出てきません。
でも,対応するcellやfaceの順番は変わらないので,別途OpenFOAM上でセルの座標等を出力しておけば,
その座標のデータと併用することで,どのデータがどのセルのデータかはわかると思います。

自分は下記のようなコードをソルバに組み込んで,座標データをCSVで出力して使ってます。
ただ,最近,functionObjectにwriteCellCentresというのがあるのを見つけたので,簡単に座標を出力できるような気もします。

//const fileName path = "postProcessing";
const fileName path = ".";
if(!isDir(path)) mkDir(path);

const fileName fnamecelinfo = path / "cellCoord.csv";

OFstream fout(fnamecelinfo);

forAll(mesh.cells(), cid)
{
    const vector &C = mesh.C()[cid];
    fout<<C.x()<<","<<C.y()<<","<<C.z()<<endl;
}

const fileName fnamecelvinfo = path / "cellVolume.csv";

OFstream fout2(fnamecelvinfo);

forAll(mesh.cells(), cid)
{
    const scalar V = mesh.V()[cid];
    fout2<< V <<endl;
}

const fvPatchList& patches = mesh.boundary();

forAll(patches, patchi)
{

        fileName fnamecfinfo =  "Cf-"+patches[patchi].name() + ".csv";
OFstream fout3(fnamecfinfo);

Info <<   patches[patchi].name() <<endl;

        const labelUList& pFaceCells =
            mesh.boundary()[patchi].faceCells();
        forAll(pFaceCells, facei)
        {
            const vector &f = mesh.boundary()[patchi].Cf()[facei];
            fout3<<f.x()<<","<<f.y()<<","<<f.z()<<endl;
        }
                   
//}
}

2025年4月18日金曜日 16:38:46 UTC+9 mtzn:
Reply all
Reply to author
Forward
0 new messages