【OpenFOAM用のC++勉強(2)】メッシュ情報の取得など
こんにちは。
OpenFOAM用のC++の勉強のメモを自分のために残しています。
OpenFOAM v2112
ファイルの情報を取得
ファイル構成は以下のようにします。
.
├── Make
│ ├── files
│ └── options
└── meshOF.C
meshOF.C
argList.Hを見るとファイル情報を取得する色々な関数が用意されているので使ってみましょう。
#include "argList.H"
// #include "fvMesh.H"
// #include "volFields.H"
// #include "surfaceFields.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
Info << "argc = " << argc << endl;
Info << "argv = " << argv << endl;
argList args(argc, argv);
Info << "commandLine = " << args.commandLine() << endl;
Info << "rootPath = " << args.rootPath() << endl;
Info << "globalCaseName = " << args.globalCaseName() << endl;
Info << "path = " << args.path() << endl;
Info << "globalPath = " << args.globalPath() << endl;
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //
以下の部分でインスタンス化しています。
引数に「argc」と「argv」を入れています。
argList args(argc, argv);
Make/files
meshOF.C
EXE = $(FOAM_USER_APPBIN)/mesh001
Make/options
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude
EXE_LIBS = \
-lfiniteVolume
wmakeをすると/home/kamakiri/OpenFOAM/kamakiri-v2012/platforms/linux64Gcc63DPInt32Opt/bin/にmesh001という実行ファイルができます。
wmakeでのエラー内容が多すぎる場合は、ターミナルで確認するのが困難なので以下のようにしてlogファイルに掃き出すと良いでしょう。
wmake 2>&1 | tee log
そしてmesh001を実行します。
以下のようにしてlog.mesh001に出力結果を掃き出しておくと良いでしょう。
mesh003 > log.mesh001
log.mesh001を確認してみます。
argc = 1
argv = 1
/*---------------------------------------------------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2012 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
Build : _7bdb509494-20201222 OPENFOAM=2012
Arch : "LSB;label=32;scalar=64"
Exec : mesh001
Date : Dec 04 2022
Time : 14:38:33
Host : DESKTOP-CT961AV
PID : 9272
I/O : uncollated
Case : /mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh001
nProcs : 1
trapFpe: Floating point exception trapping enabled (FOAM_SIGFPE).
fileModificationChecking : Monitoring run-time modified files using timeStampMaster (fileModificationSkew 5, maxFileModificationPolls 20)
allowSystemOperations : Allowing user-supplied system call operations
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
commandLine = "mesh001"
rootPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork"
globalCaseName = "mesh001"
path = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh001"
globalPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh001"
End
今回出力した部分は以下の部分です。
commandLine = "mesh001"
rootPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork"
globalCaseName = "mesh001"
path = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh001"
globalPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh001"
End
メッシュ情報の取得
mainOF.C
#include "argList.H"
#include "fvMesh.H"
#include "volFields.H"
#include "surfaceFields.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
Info << "argc = " << argc << endl;
Info << "argv = " << argv << endl;
argList args(argc, argv);
Info << "commandLine = " << args.commandLine() << endl;
Info << "rootPath = " << args.rootPath() << endl;
Info << "globalCaseName = " << args.globalCaseName() << endl;
Info << "path = " << args.path() << endl;
Info << "globalPath = " << args.globalPath() << endl;
Info << "================== Create mesh ==================" << endl;
#include "createTime.H"
Info << "default region: " << fvMesh::defaultRegion << endl;
Info << "mesh sub dir: " << fvMesh::meshSubDir << endl;
fvMesh mesh
(
IOobject
(
fvMesh::defaultRegion,
runTime.timeName(),
runTime,
IOobject::MUST_READ
)
);
Info << "============= cell volumes ==============="<< endl;
const DimensionedField< scalar, volMesh > V = mesh.V();
Info << mesh.V() << endl;
Info << "============= Face area vector ===============" << endl;
surfaceVectorField Sf = mesh.Sf();
Info << Sf << endl;
Info << "============= Face area magnitude ==============="<< endl;
surfaceScalarField magSf = mesh.magSf();
Info << magSf << endl;
Info << "============= Cell centres ===============" << endl;
volVectorField C = mesh.C();
Info << C << endl;
Info << "============= Face centres ===============" << endl;
surfaceVectorField Cf = mesh.Cf();
Info << Cf << endl;
//Info << "============= Face fluxes ===============" << endl;
//surfaceScalarField phi = mesh.phi();
//Info << phi << endl;
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //
以下のでメッシュの情報を取得するためのインスタンス化を行っています。
fvMesh mesh
(
IOobject
(
fvMesh::defaultRegion,
runTime.timeName(),
runTime,
IOobject::MUST_READ
)
);
OpenFOAMのプログラマーズガイドを見ると以下のように書かれています。
Makeフォルダのfilesdで生成する実行ファイル名をmesh002に変更しておきます。
Make/files
meshOF.C
EXE = $(FOAM_USER_APPBIN)/mesh002
適当なチュートリアルをコピーしてきます。
今回はicoFoamのcavityをmycavityという名前でコピーをします。
cp -r /opt/OpenFOAM/OpenFOAM-v2012/tutorials/incompressible/icoFoam/cavity/cavity mycavity
mycavityのフォルダに移動します。
cd mycavit
メッシュを扱うためconstant内に以下のファイルが必要となります。
constant/polyMesh/boundary
constant/polyMesh/faces
constant/polyMesh/neighbour
constant/polyMesh/owner
constant/polyMesh/points
blockMeshを実行してメッシュを生成を行います。
blockMesh
そして先ほど作ったmesh002を実行するとメッシュ情報の取得ができます。
しかし、出力する内容が多いのでlog.Meshに書き込みましょう。
mesh002 > log.mesh002
log.mesh002
(省略)
commandLine = "mesh002"
rootPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh002"
globalCaseName = "mycavity"
path = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh002/mycavity"
globalPath = "/mnt/d/openfoam/20221011_wolf_benchmark/OpenFOAM_Training/OF9/101programming/myWork/mesh002/mycavity"
================== Create mesh ==================
Create time
default region: region0
mesh sub dir: polyMesh
============= cell volumes ===============
dimensions [0 3 0 0 0 0 0];
value nonuniform List<scalar>
400
(
2.5e-07
2.5e-07
(省略)
============= Face area vector ===============
dimensions [0 2 0 0 0 0 0];
oriented oriented;
internalField nonuniform List<vector>
760
(
(5e-05 0 0)
(0 5e-05 0)
(5e-05 0 0)
(省略)
============= Face area magnitude ===============
dimensions [0 2 0 0 0 0 0];
internalField nonuniform List<scalar>
760
(
5e-05
5e-05
(省略)
============= Cell centres ===============
dimensions [0 1 0 0 0 0 0];
internalField nonuniform List<vector>
400
(
(0.0025 0.0025 0.005)
(0.0075 0.0025 0.005)
(省略)
============= Face centres ===============
dimensions [0 1 0 0 0 0 0];
internalField nonuniform List<vector>
760
(
(0.005 0.0025 0.005)
(0.0025 0.005 0.005)
(0.01 0.0025 0.005)
(省略)
fvMesh.HでfvMeshクラスが持つメンバ関数を調べることができます。
今回使われている型は
surfaceScalarField
surfaceVectorField
volScalarField
volVectorField
ですがこちらは以下のように継承関係を追っていくとどこで定義されているかがわかります。
mainOF.Cのはじめにインクルードしている2つのヘッダーファイル
#include "volFields.H"
#include "surfaceFields.H"
はsurfaceFields.HはsurfaceFieldsFwd.Hを継承しており、surfaceFieldsFwd.Hの中にtypedefで
typedef GeometricField<scalar, fvsPatchField, surfaceMesh> surfaceScalarField;
typedef GeometricField<vector, fvsPatchField, surfaceMesh> surfaceVectorField;
と定義されています。
volFields.HはvolFieldsFwd.Hを継承しており、volFieldsFwd.Hの中にtypedefで
typedef GeometricField<scalar, fvPatchField, volMesh> volScalarField;
typedef GeometricField<vector, fvPatchField, volMesh> volVectorField;
と定義されています。
メッシュ関係は全体の継承関係を把握しておくと便利ですね。
引き続きC++の勉強を続けます。
Twitter➡@t_kun_kamakiri
ブログ➡宇宙に入ったカマキリ(物理ブログ)
この記事が気に入ったらサポートをしてみませんか?