OpenFOAMのソルバを作る

提供: Akionux-wiki
Share/Save/Bookmark
移動: 案内検索

概要

OpenFOAMのソルバを作成するにあたって、全体の仕組みを把握するためにメモ的に記録していく。

APIリファレンス的なもの

OpenFOAM® Programmer's C++ documentationのUML図を見ながら開発するのだと思われる。

また、PENGUINITIS(Yuu Kasuga)氏のサイト[1]は多くの情報が蓄積されていて、大変参考になる。この記事でもかなり参考にさせていただいた。

共通の変数

ctagsの活用

OpenFOAMはドキュメントが不十分で自分でソースコードを探索する場面によく出くわすので、ctagsを活用すると良いだろう。

例えば、Vimを使う場合で、OpenFOAM-2.3.xのソースコードを検索対象にするときは、

cd ~/OpenFOAM/OpenFOAM-2.3.x/
ctags -R

でtagsファイルを作って、~/.vimrcに、

" ctags
set tags=./tags,~/OpenFOAM/OpenFOAM-2.1.x/tags

という行を追加して、Vimを起動して知りたいクラスや関数の場所でCtrl+]を押すと定義箇所へジャンプできる。 詳しくはCtagsとVimでクラスや関数の定義箇所へジャンプするを参照。

補助スクリプト

OpenFOAM-3.0.xくらからfoamNewAppという新規アプリケーションの雛形を作ってくれるスクリプトが導入されていて、

foamNewApp <ソルバ名>

とするとカレントディレクトリに指定した名前のアプリケーションの雛形を作ってくれる。

同様に、foamNewBCというスクリプトは新規境界条件を作成する際の雛形を生成してくれるものである。

最小のプログラム

PENGUINITIS(Yuu Kasuga)氏の記事[2]を参考にして、最小のOpenFOAMプログラムを作ってみよう。

Makeフォルダを作る。

mkdir Make

Make/filesを次のような内容で作成する。

mini.C

EXE = mini

Make/optionsを次のような内容で作成する。

EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude
EXE_LIBS = -lfiniteVolume

mini.Cを次のような内容で作成する。

#include "fvCFD.H"

int main(int argc, char *argv[])
{
	Info << "This is minimum OpenFOAM program." << endl;

	return 0;
}

必要なファイルは以上だ。

コンパイルしてみよう。

wmake

実行してみよう。

./mini
This is minimum OpenFOAM program.

.depファイルの削除:

wclean

サンプル

"Hello, world"と出力するだけのソルバ。

wmake

インクルードするヘッダファイル

次の順序で検索する[3]

  1. the $WM_PROJECT_DIR/src/OpenFOAM/lnInclude directory;
  2. a local lnInclude directory, i.e.newApp/lnInclude;
  3. the local directory, i.e.newApp;
  4. platform dependent paths set in files in the $WM_PROJECT_DIR/wmake/rules/$WM_ARCH/ directory, e.g./usr/X11/include and $(MPICH_ARCH_PATH)/include;
  5. other directories specified explicitly in the Make/options file with the -I option.

リンクするライブラリ

次のパスの順序でライブラリを検索する[3]

  1. the $FOAM_LIBBIN directory;
  2. platform dependent paths set in files in the $WM_DIR/rules/$WM_ARCH/ directory, e.g./usr/X11/lib and $(MPICH_ARCH_PATH)/lib;
  3. other directories specified in the Make/options file.

実行ファイルの出力先

ソルバのディレクトリ下のMake/filesに書いてある。

newApp.C

EXE = $(FOAM_USER_APPBIN)/newApp

wmakeの実行

wmake <optionalArguments> <optionalDirectory>

依存ファイルリストの削除

wclean <optionalArguments> <optionalDirectory>

ソルバの内容

OpenFOAMのコードを見る限り、必要なコードをヘッダファイルとして用意し、必要な部分でincludeするようになっているようだ。

main関数より前

これは必ずインクルードする。
  • ループ処理部のコントローラ
ループ処理部の時間や収束条件などを扱う。
simpleControl.H内で定義されているsimpleControlというクラスは、ループ処理を司るクラスで、main関数内でmeshを引数としてインスタンスを生成して使用する。処理内容はsimpleControl.Cを参照。


main関数内

  • 初期化
引数リストargsを生成するのと、その際の例外処理を行う。setRootCase.Hのソースコードは次のようになっている:
//
// setRootCase.H
// ~~~~~~~~~~~~~

    Foam::argList args(argc, argv);
    if (!args.checkRootCase())
    {
        Foam::FatalError.exit();
    }
controlDictと引数を受け取って、TimeクラスのインスタンスrunTimeを作る。createTime.Hのソースコードは次のようになっている:
//
// createTime.H
// ~~~~~~~~~~~~

    Foam::Info<< "Create time\n" << Foam::endl;

    Foam::Time runTime(Foam::Time::controlDictName, args);
runTimeから次のようにしていろいろな情報を取り出すことができる[4]:
Info << "controlDict name: " << runTime.controlDictName << endl;
Info << "root path: " << runTime.rootPath() << endl;
Info << "case name: " << runTime.caseName() << endl;
Info << "path: " << runTime.path() << endl;
Info << "time path: " << runTime.timePath() << endl;
Info << "format: " << runTime.writeFormat() << endl;
Info << "version: " << runTime.writeVersion() << endl;
Info << "compression: " << runTime.writeCompression() << endl;
Info << "start time: " << runTime.startTime() << endl;
Info << "end time: " << runTime.endTime() << endl;
Info << "deltaT: " << runTime.deltaT() << endl;

runTime.writeNow();
while(runTime.loop()){
	Info << "Time: " << runTime.timeName() << endl;
	runTime.write();
}

runTime.writeAndEnd();

Info << "execution time: " << runTime.elapsedCpuTime() << " s" << endl;
Info << "clock time: " << runTime.elapsedClockTime() << " s" << endl;
  • runTimeのサンプル
runTimeの情報を出力するだけのソルバ。
Foam::fvmeshクラスのインスタンスmeshを生成する。生成時の引数にcreateTime.Hで生成されていたFoam::TimeクラスのrunTimeを使っていることから、先にcreateTime.Hをインクルードしなくてはならないのに注意。
//
// createMesh.H
// ~~~~~~~~~~~~

    Foam::Info
        << "Create mesh for time = "
        << runTime.timeName() << Foam::nl << Foam::endl;

    Foam::fvMesh mesh
    (
        Foam::IOobject
        (
            Foam::fvMesh::defaultRegion,
            runTime.timeName(),
            runTime,
            Foam::IOobject::MUST_READ
        )
    );
meshを引数としてループコントローラを生成する。例えば、
simpleControl simple(mesh);

ループ処理部

  • 各種更新式
速度や圧力の更新式の処理部分。
ここはソルバごとに特有のヘッダファイルとなるだろう。長くなる場合は更新式ごとにファイルを分ける。
  • UEqn.H : 速度更新式
  • pEqn.H : 圧力更新式

ケース用のスクリプト

Allrun

チュートリアルケースflangeのAllrunを見ると、$WM_PROJECT_DIR/bin/tools/RunFunction内の関数を用いている。

getApplication関数はカレントディレクトリのケースのsystem/controlDictを読んで使用するソルバを返す関数であり、その返り値を変数applicationに入れる。

ansysToFoamはANSYS形式の入力メッシュファイルをfoam形式へ変換する[5]

runApplicationは引数のソルバを実行しログを残すようになっているが、引数にソルバの実行ファイル名のみ渡すと環境変数PATHのディレクトリ内にあるものでないと実行できない。 そのため、カレントディレクトリにあるソルバを実行する場合は、./を付けて

runApplication ./$application

とする。

また、foamToEnsight, foamToEnsightParts, foamToVTKは結果をそれぞれの形式へ変換する。

#!/bin/sh
cd ${0%/*} || exit 1    # run from this directory

# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions

# Get application name
application=`getApplication`

runAnsysToFoam()
{
    if [ -f log.ansysToFoam ]
    then
        echo "ansysToFoam already run on $PWD: remove log file to re-run"
    else
        echo "ansysToFoam: converting mesh $1"
        ansysToFoam $1 -scale $2 > log.ansysToFoam 2>&1
    fi
}

runAnsysToFoam flange.ans 0.001
runApplication $application
runApplication foamToEnsight
runApplication foamToEnsightParts
runApplication foamToVTK

# ----------------------------------------------------------------- end-of-file

Allclean

チュートリアルケースflangeのAllcleanでは、$WM_PROJECT_DIR/bin/tools/RunFunction内の関数cleanCaseを用いて計算結果を消去している。

また、計算結果をEnSight, Ensight, Fieldview形式へ変換したものも消去している。

#!/bin/sh
cd ${0%/*} || exit 1    # run from this directory

# Source tutorial clean functions
. $WM_PROJECT_DIR/bin/tools/CleanFunctions

cleanCase
rm -rf EnSight Ensight Fieldview > /dev/null 2>&1

# ----------------------------------------------------------------- end-of-file

メッシュ

テキストで書く

テキストですべて書くのは作業量的に現実的ではないが、どのようなフォーマットで書かれているか理解しておくとよいだろう[6]

  • constant/polyMesh
  • points
点の定義。
4
(
(0.0 0.0 0.0)
(1.0 0.0 0.0)
(1.0 1.0 0.0)
(0.0 1.0 0.0)
)
  • faces
点列で面の定義。
1
(
4(0 1 2 3)
)
  • owner
面ごとに何番目の胞に所属するかを定義。
1
(
0
)
  • boundary
境界になる面を定義。
(
boundary_name
{
    type patch;
    nFaces 1;
    startFace 0;
}
)
  • neighbour
内部境界が接するセル。

blockMeshを使う

constant/polyMesh/blockMeshDictを作成。

blockMeshはconstant/polyMesh/blockMeshDictを読んで、六面体のメッシュを生成する。

例)OpenFOAM-2.3.x/tutorials/multiphase/interFoam/laminar/capillaryRise/constant/polyMesh/blockMeshDict

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2.3.0                                 |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

convertToMeters 1e-3;

vertices
(
    (0 0 0)
    (1 0 0)
    (1 20 0)
    (0 20 0)
    (0 0 1)
    (1 0 1)
    (1 20 1)
    (0 20 1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (20 400 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    inlet
    {
        type patch;
        faces
        (
            (1 5 4 0)
        );
    }
    atmosphere
    {
        type patch;
        faces
        (
            (3 7 6 2)
        );
    }
    walls
    {
        type wall;
        faces
        (
            (0 4 7 3)
            (2 6 5 1)
        );
    }
    frontAndBack
    {
        type empty;
        faces
        (
            (0 3 2 1)
            (4 5 6 7)
        );
    }
);

mergePatchPairs
(
);


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

blockMeshを実行

blockMesh

これでconstant/polyMesh以下に前述のメッシュに必要なファイルが生成される。

blockMeshDictの内容を見ていこう[7][8]

  • convertToMeters
そのblockMeshDictファイルに書かれた長さの単位をメートル単位で指定する。
例えば、
convertToMeters    0.001;
とすると、そのblockMeshDictファイルに書かれた数値はミリメートル(mm)になる。
  • vertices
頂点を記述する。書式は、
vertices
(
    (<x> <y> <z>) // of vertex number 0 
    ...
)

となっている。

  • blocks
メッシュを作る元となるブロックを指定するキーワード。
例えば次のように書ける:
blocks
(
    hex (0 1 2 3 4 5 6 7)    // 分割する六面体のブロックを頂点番号で指定(composing vertexes of a hexahedral block)
    (10 10 10)               // x,y,z各方向の分割数を指定(division numbers of cells in each direction)
    simpleGrading (1 2 3)    // simpleGradingで伸長させる(cell expansion ratios)
);
ここで、hexの頂点の並びは、0123でz軸方向を向いてxy面上に右回り、再び4567でz軸方向を向いてxy面上で右回り。
  • simpleGrading
simpleGradingではx,y,z方向にそれぞれ何倍するかを指定する。
simpleGrading (1 2 3)
  • edgeGrading
edgeGradingではhex (...)で指定したブロックの各辺ごとに何倍に伸長するかを指定する。引数は、(線分01の係数 線分12の係数 ... 線分67係数)となる。
edgeGrading (1 1 1 1 2 2 2 2 3 3 3 3)
  • edges
デフォルトでは2頂点を直線でつないで辺が作られるが、edgeの指定で次に示す方法でつないで辺を作ることができる:
arc 	Circular arc 	Single interpolation point
simpleSpline 	Spline curve 	List of interpolation points
polyLine 	Set of lines 	List of interpolation points
polySpline 	Set of splines 	List of interpolation points
line 	Straight line 	— 
edgeの指定はoptionalである。
例えば次のようにすれば、頂点1と頂点5をつなぐ辺は点(1.1 0.0 0.5)を経由した弧になる。
edges
(
    arc 1 5 (1.1 0.0 0.5)
);
  • boundary
boundaryを作るためのキーワード。{}でくくってtypeと面を指定していく。typeには私の知る限りではpatch,wall,emptyが指定できる。patchの方は境界となる面に名前をつけることができる。
例えば次のように書ける:
boundary               // keyword
(
    inlet              // patch name
    {
        type patch;    // patch type for patch 0
        faces
        (
            (0 4 7 3); // block face in this patch
        );
    }                  // end of 0th patch definition

    outlet             // patch name
    {
        type patch;    // patch type for patch 1
        faces
        (
            (1 2 6 5)
        );
    }

    walls
    {
        type wall;
        faces          // このように複数指定することもできる
        (
            (0 1 5 4)
            (0 3 2 1)
            (3 7 6 2)
            (4 5 6 7)
        );
    }
);
  • mergePatchPairs
メッシュの生成を1ブロック以上から行う場合に指定する。
この節を書こうとした人は途中で投げ出してしまいました。今後場合によっては加筆されるかもしれません。


他の形式から変換する

  • ansysToFoam
ansys形式からの変換。
ansysToFoam input.ans -scale <scale e.g.:0.001>

サンプル

timeinfoにメッシュの読み込みを行う機能を付け加えたソルバ。

初期条件の設定とsolveの実行

"0"フォルダ以下に初期条件を記述する。

境界に対するスカラー場の設定

laplacianFoamを例にすると、0/Tへ温度の初期条件を記述している。 内容は、constant/polyMesh/boundaryで定義されているboundaryのpatchに対して値を設定している。

まず冒頭で、FoamFileの書式に則った情報を記入する。classがvolScalarField、objectがTとしているところがポイント。

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2.3.x                                 |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       volScalarField;
    location    "0";
    object      T;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

次に、キーワードdimensionsでこれから入力する値の物理学的な次元を定める。 次の[]で囲まれた7個のスカラーで各次元の指数部の値を定める[9]:

[質量(kg), 長さ(m), 時間(s), 温度(K), 物質量(mol), 電流(A), 光度(Cd)]
No. 物理量 SI単位
1 質量 キログラム(kg)
2 長さ メートル(m)
3 時間 秒(s)
4 温度 ケルビン(K)
5 物理量 モル(mol)
6 電流 アンペア(A)
7 光度 カンデラ(Cd)

今回は温度のスカラー場を設定したいので、4番目の値を1にして、それ以外を0にする:

dimensions      [0 0 0 1 0 0 0];

キーワードinternalFieldで場の各点における値を定める[9]。 温度場のすべての温度を25°Cにするには、ケルビンにすると298Kなので、

internalField   uniform 298;

とする。

ここで、uniformというのはすべての点に同じ値を設定する方法になる。 uniformの他にnonuniformで指定する方法がある:

internalField nonuniform <List>;

最後に、キーワードboundaryFieldで境界における値を定める。 constant/poluMesh/boundaryで設定されたpatchごとに設定する。 hotと名付けられたpatchは573°Cで一定、atmosphereと名付けられたpatchは298°C(常温)で一定、wallsでは

boundaryField
{
    hot
    {
        type            fixedValue;
        value           uniform 573;
    }
    atmosphere
    {
        type            fixedValue;
        value           uniform 298;
    }
    walls
    {
        type            zeroGradient;
    }
}


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

ここでtypeでは次のうちから選択する[10]:

Type patchの場における状態 次の行で指定する値
fixedValue 上での値 value
fixedGradient の法線方向への勾配 gradient
zeroGradient の法線方向への勾配を0にする 無し
calculated 境界は他の場から計算で決まる 無し
mixed valueFractionの値に依存したfixedValueとfixedGradientを混合した状態 refValue,refGradient,valueFraction,value
directionMixed テンソルのvalueFractionによる混合状態 refValue,refGradient,valueFraction,value

calculated,mixed,directionMixedについてはよく理解できていない。

transportProperties

定数を定めるためのファイル。 laplacianFoamでは拡散係数DTを定めている。

createFields.H

laplacianFoamの作法に従えば、createFields.Hで初期条件などを設定している。

内容としては、

  • 先ほどの0/TからTという名前のスカラー場を生成、
  • 先ほどのconstant/transportPropertiesから定数オブジェクトtransportPropertiesを生成し、
  • 拡散係数DTという次元付きのスカラー(dimensionedScalar)を設定

というものだ。

solve

ループ処理部の中で、solve関数に解きたい微分方程式を入れる。

簡単な熱拡散方程式

を解く。

solve関数の引数へ微分方程式の形で入力する。

laplacianFoamでは、

        while (simple.correctNonOrthogonal())
        {
            solve
            (
                fvm::ddt(T) - fvm::laplacian(DT, T)
            );
        }

となる。fvm::laplacianの引数は

fvm::laplacian(<coefficient>, <scalar field>)

となっている。

"fvm"の部分に関しては、[11]から引用する:

OpenFOAM では時間微分 ddt、や勾配 grad、発散 div、ラプラシアンなどの場の演算子を表わす関数が fvm と fvc の 2 種類あります (一方しかないものもあります)。それぞれ fvm::laplacian(T) や fvc::laplacian(T) などと参照しますが、fvm が陰的、fvc が陽的な演算を表わします。fvm の演算子はその演算子が適用される変数を求めるために使い、fvc は変数に演算子を適用して値を求めるのに使います。方程式の記述で使う場合は、代数方程式に変換されるときに fvm の結果は左辺の係数行列に組み込まれ、fvc の結果は右辺ベクトルに組み込まれます。fvc は直接なんらかの値が得られるのに対し、fvm は代数方程式が得られます。

system/controlDict

system/controlDictでは、時間及び入出力に関するエッセンシャルなパラメータを設定する[12]

/*--------------------------------*- C++ -*----------------------------------*\
| =========                 |                                                 |
| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
|  \\    /   O peration     | Version:  2.3.0                                 |
|   \\  /    A nd           | Web:      www.OpenFOAM.org                      |
|    \\/     M anipulation  |                                                 |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

ソルバアプリケーションの名前

application     simpleDiffusion;
  • 時間制御

startFromでは計算の開始時刻を設定する:

startFrom       latestTime; // 

次のいずれかを選択する[13]:

  • firstTime
存在する時刻データの中でもっとも早い時刻から開始。
  • startTime
startTimeで指定する時刻から開始。
  • latestTime
存在する時刻の中でもっとも遅い時刻 (要するに最後の結果) から開始。

startTimeはstartFromでstartTimeを指定したときに指定が必要になる:

startTime       0;

stopAtは計算の終了時刻を設定する:

stopAt          endTime;

次の4種類のうちから選択する:

  • endTime
endTimeで指定する時刻で終了。
  • writeNow
現時刻の計算結果を書き出して終了。
  • noWriteNow
現時刻の計算結果を書き出さずに終了。
  • nextWrite
次の時刻の計算結果を書き出して終了。

runTimeModifiableが有効になっている場合は、ソルバが実行中にcontrolDictを変更したらソルバが次のタイムステップでcontrolDictを読込するので、その時刻での計算結果を書き出して終了させることができる[13]。 stopAtにendTimeを設定したらendTimeの値を指定:

endTime         0.03;

deltaTはタイムステップを指定する:

deltaT          0.00005;
  • データの書き出し

writeControlで計算結果を書き出すタイミングの指定する:

writeControl    runTime;

次の4種類のうちから選択する:

  • timeStep
writeIntervalで指定したステップ数ごとに書き出す。
  • runTime
writeIntervalで指定した時間(秒)ごとに書き出す。
  • adjustableRunTime
writeIntervalで指定した時間(秒)ごとに書き出すが、時間刻み幅自動調整を使用するときに設定する。
  • cpuTime
writeIntervalで指定したCPU時間ごとに書き出す。
  • clockTime
writeIntervalで指定した実時間ごとに書き出す。

非定常解析はadjustableRunTimeをonにすることでタイムステップを自動調節できる。クーラン数[14]

の最大値を指定して自動的に決定される[13]

adjustableRunTime on;
maxCo           0.9;

writeIntervalはwriteControlで指定した方法に応じた値の指定。"timeStep" ならステップ数、"runTime" なら秒数を設定する[13]

writeInterval   0.001;

purgeWriteでは最後から数えて計算結果を保存する最大のタイムステップ数を指定する。0なら制限なし。

purgeWrite      0;

writeFormatは出力データ形式を指定する:

writeFormat     ascii;

次のどちらかを選択する:

  • ascii
  • binary

writePrecisionはwriteFormatがasciiのときに出力する数値の桁数。6がデフォルト。

writePrecision  6;

writeCompressionは出力するデータを圧縮するかどうか。

writeCompression off;

次のどちらかから選ぶ。

  • uncompressed
  • compressed
gzipで圧縮する。

timeFormatは時刻ディレクトリのネーミング方法を指定する:

timeFormat      general;

次の3つから選ぶ。generalがデフォルト。

  • fixed
の形式で、の数はtimePrecisionで指定する。
  • scientific
の形式で、の数はtimePrecisionで指定する。
  • general
指数が-4未満またはtimePrecisionの値より大きくなるとscientificにする。

timePrecisionは時刻の桁数

timePrecision   6;
  • データ読み込み

runTimeModifiableはタイムステップごとに設定ファイルを読み込み直すかどうかを指定する。デフォルトはtrue。

runTimeModifiable true;

system/fvSchemes

system/fvSchemesの中で、ソルバで使う離散化スキームを指定する[15]。使用した場の演算子(laplacian, div, grad など)のそれぞれに対して離散化スキームを指定する。

...
laplacianSchemes
{
    default         none;
    laplacian(DT,T) Gauss linear corrected;
}
...

[16]

この節を書こうとした人は途中で投げ出してしまいました。今後場合によっては加筆されるかもしれません。


system/fvSolution

system/fvSolutionでは各変数に対する代数方程式解法を指定する。

...
solvers
{
    T
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0;
    }
}
...

[17]

この節を書こうとした人は途中で投げ出してしまいました。今後場合によっては加筆されるかもしれません。


サンプル

justmeshに拡散方程式
を解く部分を加えたもの。OpenFOAM公式のlaplacianFoamとほぼ同じ。

サンプルソルバ

hello

"Hello, world"と出力するだけのソルバ。

timeinfo

runTimeの情報を出力するだけのソルバ。

justmesh

timeinfoにメッシュの読み込みを行う機能を付け加えたソルバ。

diffusionFoam

justmeshに拡散方程式

を解く部分を加えたもの。 OpenFOAM公式のlaplacianFoamとほぼ同じ。

References

  1. PENGUINITIS - OpenFOAM
  2. PENGUINITIS - 最小のプログラム
  3. 3.0 3.1 Compiling applications and libraries
  4. PENGUINITIS - 時間
  5. AnsysToFoam - OpenFOAMWiki
  6. OpenFOAM, Mesh description
  7. PENGUINITIS - blockMesh によるメッシュの作成
  8. OpenFOAM User Guide 5.3 Mesh generation with the blockMesh utility http://www.openfoam.org/docs/user/blockMesh.php
  9. 9.0 9.1 OpenFOAM, Basic input-output file format
  10. OpenFOAM, Boundaries
  11. PENGUINITIS - 時間微分
  12. OpenFOAM, Time and data input-output control
  13. 13.0 13.1 13.2 13.3 PENGUINITIS - 計算の制御の設定
  14. Wikipedia, Courant–Friedrichs–Lewy condition --- Wikipedia{,} The Free Encyclopedia, , , 2014, http://en.wikipedia.org/w/index.php?title=Courant%E2%80%93Friedrichs%E2%80%93Lewy_condition&oldid=618024686 
  15. PENGUINITIS - 熱伝導
  16. OpenFOAM, Numerical schemes
  17. OpenFOAM, Solution and algorithm control