注意: バージョンによってファイル形式が異なる可能性があります.(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のソースコード