注意: バージョンによってファイル形式が異なる可能性があります.(OpenFOAM-2.4.0)
Motivation
需要は少ないですが,manualでdecomposeParをする必要がありました. その手法について資料がないので解説します
ケースファイル
tutorials/incompressible/icoFoam/cavity
メッシュ作成
blockMesh
decomposePar(自動領域分割)
tutorials/incompressible/pisoFoam/les/motorBike/motorBike/system
を少しいじったものです
以下を使用します
system
以下に入れておくと良いです.
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.4.0 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object decomposeParDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // numberOfSubdomains 4; // numberOfSubdomains 3; method simple; simpleCoeffs { n ( 2 2 1 ); delta 0.001; } manualCoeffs { dataFile "cellDecomposition"; } // ************************************************************************* //
領域分割を実行します cellDist
を指定すると後でどういうふうに領域分割したのかを見れます.
decomposePar -cellDist
OpenFOAMで領域分割結果を確認します.(cellDistにチェックを入れて見ると良いです)
使用するソースコード
ここに書いてるソースコードをwmakeしてcavityのディレクトリで実行したら動きます.
https://github.com/kurenaif/manualDecomposeTutorial
これを実行すると,constant/cellDecomposition
が生まれます.
その中にどのセルがどのprocessorに該当するのかが一セルずつ記述されています.
また,manualでdecomposeをするためには,system/decomopsePar
を弄る必要があります.
具体的には,
- 今回は3分割のため,numberOfSubdomainsを3に
- methodをmanual
に変更します.変更したら以下のようになります
/*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: 2.4.0 | | \\ / A nd | Web: www.OpenFOAM.org | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ FoamFile { version 2.0; format ascii; class dictionary; location "system"; object decomposeParDict; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // numberOfSubdomains 3; method manual; simpleCoeffs { n ( 2 2 1 ); delta 0.001; } manualCoeffs { dataFile "cellDecomposition"; } // ************************************************************************* //
ソースコードの解説
argsの準備
コマンドライン引数をOpenFOAMのものに変換する.
Foam::argList args(argc,argv); if(not args.checkRootCase()) Foam::FatalError.exit();
runTimeの準備
meshを用意するために必要. argsはここで必要
Foam::Time runTime(Foam::Time::controlDictName, args);
meshの準備
Foam::fvMesh mesh ( Foam::IOobject ( Foam::fvMesh::defaultRegion, runTime.timeName(), runTime, Foam::IOobject::MUST_READ ) );
各セルがどのprocessorに該当するのかを記述するための変数の用意
OpenFOAMのListはconstructorで渡してやるとそのサイズを用意してくれる.
mesh.cells().size()
はメッシュのセルのサイズを返してくれるので,この容量があればそれぞれのセルがどのprocessorに該当するのかを収容できる.
labelList procIds(mesh.cells().size());
各セルをループで回しそれぞれのセルにprocessorIDを振り分ける
回すだけ 斜めと円形に切ってます
forAll(mesh.cells(), cid){ const vector &C = mesh.C()[cid]; if(C[0]*C[0]+C[1]*C[1] < 0.01){ procIds[cid] = 1; } else{ procIds[cid] = 0; } if(C[0] + C[1] < 0.1){ ++procIds[cid]; } }
出力
IOobjectを使います. ちょっと詳細はよくわかりませんがprocIdsを渡してやるとどうやら出力してくれるらしいです.
labelIOList cellDecomposition ( IOobject ( "cellDecomposition", mesh.facesInstance(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), procIds ); cellDecomposition.write();
References
decomopseParのソースコード