見出し画像

【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のプログラマーズガイドを見ると以下のように書かれています。

有限体積法による離散化には,polyMesh に保存されているメッシュ形状に由来する固有の データが使われます.そのため OpenFOAM では,polyMesh クラスを拡張した fvMesh に,有 限体積法による離散化に必要な追加のデータが保存されます.fvMesh は polyMesh から構成さ れ,表 2.1 に示すようなデータが保存されます.これらのデータは,メッシュが動いたり細分 化されたりする場合には,実行時に更新することができます.

https://www.opencae.or.jp/wp-content/uploads/2015/06/ProgrammersGuideJa-2.3.0_beta.pdf


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クラスが持つメンバ関数を調べることができます。

https://www.openfoam.com/documentation/guides/latest/api/classFoam_1_1fvMesh.html

今回使われている型は

  • 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
ブログ➡宇宙に入ったカマキリ(物理ブログ)


この記事が気に入ったらサポートをしてみませんか?