くれなゐの雑記

例を上げて 自分で手を動かして学習できる入門記事を多めに書いています

decomposeParでmanual切りをする

注意: バージョンによってファイル形式が異なる可能性があります.(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にチェックを入れて見ると良いです) f:id:kurenaif:20170326220734j:plain

使用するソースコード

ここに書いてるソースコードを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";
}


// ************************************************************************* //

f:id:kurenaif:20170326220641p:plain

ソースコードの解説

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のソースコード

PENGUINITIS - 領域分割

PENGUINITIS - OpenFOAM プログラミングメモ