[OpenFOAM] 수법 변경 추가 처리 ④: 계승류에 기술처리
개시하다
"OpenFOAM" 변경 수법 추가 처리 ③: 함수 또는 클래스로 추가 처리의 계속.OpenFOAM의 계산에서 수법을 바꾸어 추가 처리하다.
지난번에 함수와 클래스로 처리했습니다.
이번에는 그 반 방법의 발전형이다.상속류에서 기술 처리를 시도해 보세요.
방법 일람
이 기사는 다양한 기법을 소개하는 시리즈 중 하나로 전체적으로 다음과 같은 방법으로 진행될 예정이다.실행이 확인된 파일은 github.com/inabower/getScoreTutorials에 공개됩니다.
pimpleFoam
)functionObjects
)codedFunctionObject
)IOdictionary
runTimeSelectionTable
wmake libso
codedTemplete
작업 환경
계승류의 구성
실제 코드는 github.com/inabower/getScoreTutorials/004.inheritance에서 공개된다.
지난번[OpenFOAM] 변경 수법 추가 처리 ③: 함수 또는 클래스로 추가 처리의 후반부에서 제작된
scoreClassPimpleFoam
GitHub과 비교한 형식으로 내용을 살펴봤다.디렉토리 구조
이번 목록의 구조는 다음과 같다.
.
├── Make
│ ├── files
│ └── options
├── UEqn.H
├── correctPhi.H
├── cpCorrectPhi.H
├── createFields.H
├── getScore
│ ├── getScore.C
│ ├── getScore.H
│ ├── sumInletOutletScore.C #NEW!!
│ └── sumInletOutletScore.H #NEW!!
├── pEqn.H
└── pimpleFoam.C
은 지난번과 비교해 문서sumInletOutletScore.(C|H)
가 증가했다.그 중에서 작용getScore
은 기류이고, sumInletOutletScore
은 상속류이다.이로써 sumInletOutletScore
getScore
의 기능을 사용하거나 일부분을 덮어쓸 수 있다.이전
getScore
클래스에는 구성원 변수 score_
를 계산하는 데 사용되는 calculate()
함수와 그 score_
를 호출하는 데 사용되는 value()
함수가 있었다.이번에 우리는 그 중의'calculate()
함수가 계승류에 기술된'구조를 만들었다.기본 getScore
기본 클래스로 다음과 같이 생성됩니다
getScore
.getScore/getScore.H
#ifndef getScore_H
#define getScore_H
#include "fvMesh.H"
namespace Foam
{
class getScore
{
protected:
// Protected data
const fvMesh& mesh_;
scalar score_;
public:
// Constructors
getScore(const fvMesh& mesh);
//- Destructor
// - ~getScore()
virtual ~getScore()
{}
// Member Functions
// - void calculate();
virtual void calculate();
const scalar& value() const
{
return score_;
}
};
}
#endif
getScore/getScore.C
#include "getScore.H"
#include "surfaceFields.H"
Foam::getScore::getScore
(
const fvMesh& mesh
)
:
mesh_(mesh)
{
Info << "Set constructor" << endl;
}
void Foam::getScore::calculate()
{
// ここに書かれた内容は継承先で上書きされる。(ここを継承先から呼び出すこともできる)
Info << "Here will be overwritten by inheritance function" << endl;
}
지난번과 다른 점virtual
입니다.~getScore()
와 void calculate();
의 머리에virtual
가 있다.분석기와 계승자가 덮어쓰고자 하는 함수에 대해서는 함수 선언을 시작할 때 virtual
를 붙여야 한다.이렇게 기초류
getScore
로 제작한 뒤 이번에 계승류를 제작한다.상속 클래스sumInletOutletScore
상속 클래스도 기본 클래스와 마찬가지로 "*.H"파일로 선언하고 "*.C"파일로 정의합니다.각자의 내용은 다음과 같다.
또한 상속류는 대부분 각 기능에 따라 제작되기 때문에 이름은 주로 이 기능을 나타내는 명칭이다.이번에는 출입구 트래픽 합계를 요구하는 기능이라 이런 이름을 지었다.
getScore/sumInletOutletScore.H
#ifndef sumInletOutletScore_H
#define sumInletOutletScore_H
#include "getScore.H"
namespace Foam
{
class sumInletOutletScore
: public getScore
{
protected:
// Protected data
public:
// Constructors
sumInletOutletScore(const fvMesh& mesh);
//- Destructor
~sumInletOutletScore()
{}
// Member Functions
virtual void calculate();
};
}
#endif
그 중에서 sumInletOutletScore
류가 만들어졌다.그래서 나는 구조기와 분석기가 다음과 같다고 선포한다.public:
// Constructors
sumInletOutletScore(const fvMesh& mesh);
//- Destructor
~sumInletOutletScore()
{}
상속을 처리하는 데 있어서의 특징 부분을 설명한다.우선, 기본 클래스 성명을 읽으면 다음과 같다.#include "getScore.H"
다른 다음 부분은 상속을 나타낸다.: public getScore
는 상속getScore
을 의미한다.class sumInletOutletScore
: public getScore
{
덮어쓰기calculate()
함수virtual
를 동시에 성명합니다.따라서 기본 클래스 calculate()
함수를 덮어쓸 수 있습니다. // Member Functions
virtual void calculate();
다음은 정의를 살펴보자.getScore/sumInletOutletScore.C
#include "sumInletOutletScore.H"
#include "surfaceFields.H"
Foam::sumInletOutletScore::sumInletOutletScore
(
const fvMesh& mesh
)
:
getScore(mesh)
{
Info << "Set constructor" << endl;
}
void Foam::sumInletOutletScore::calculate()
{
Info << "Running inheritance function" << endl;
const surfaceScalarField& phi = mesh_.lookupObject<surfaceScalarField>("phi");
score_ = 0.0;
forAll(phi.boundaryField(), patchI)
{
const fvPatch& patch = phi.boundaryField()[patchI].patch();
const scalarField& pphi = phi.boundaryField()[patchI];
if (!(patch.name()=="inlet" || patch.name()=="outlet1" || patch.name()=="outlet2")) continue;
Info << " sum(" << patch.name() << ") of phi = " << gSum(pphi) << endl;
score_ += gSum(pphi);
}
}
에서 구조기와 calculate()
함수를 정의했다.상속반의 구조기는 다음과 같다.그중
:getScore(mesh)
부분은 기본 구조기를 호출한다.이렇게 하면 getScore(mesh)
에서 호출할 때getScore
류로 사용할 수 있는 기능을 갖추게 된다.Foam::sumInletOutletScore::sumInletOutletScore
(
const fvMesh& mesh
)
:
getScore(mesh)
{
Info << "Set constructor" << endl;
}
는 다음과 같은 방법sumInletOutletScore
을 통해 클래스로서의 calculate()
함수를 정의했다.void Foam::sumInletOutletScore::calculate()
{
// iroiro
}
main () 측면에서 계승 클래스를 호출합니다
pimpleFoam.C
85행
main()
함수는 다음과 같다.지난번#include "getScore.H"
의 곳은 이렇게 변경되었다.getScore
를 사용할 계획이 없으면 이곳에서 사용할 필요가 없다#include
.#include "sumInletOutletScore.H"
sumInletOutletScore
이름이 myScore
인 클래스 대상을 만듭니다. sumInletOutletScore myScore(mesh);
myScore
과 calculate()
.이곳은 value()
반 때와 같다.여기에서 실행된 getScore
은 calculate()
클래스로 다시 정의된 후에 덮어씁니다. myScore.calculate();
Info << nl << "score: " << runTime.value() << tab << myScore.value() << nl << endl;
편역하다
컴파일된
sumInletOutletScore
설정은 다음과 같습니다.Make/files
Make/
와 getScore.C
둘을 컴파일합니다.getScore/getScore.C
getScore/sumInletOutletScore.C
pimpleFoam.C
EXE = $(FOAM_USER_APPBIN)/scoreInheritancePimpleFoam
Make/options
sumInletOutletScore.C
때와 같다.다른 디렉터리에 계승 클래스를 만들면 getScore
에 추가해야 합니다.EXE_INC = \
-IgetScore \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/sampling/lnInclude \
-I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
-I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
-I$(LIB_SRC)/transportModels \
-I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
-I$(LIB_SRC)/dynamicMesh/lnInclude \
-I$(LIB_SRC)/dynamicFvMesh/lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lfvOptions \
-lmeshTools \
-lsampling \
-lturbulenceModels \
-lincompressibleTurbulenceModels \
-lincompressibleTransportModels \
-ldynamicMesh \
-ldynamicFvMesh \
-ltopoChangerFvMesh \
-latmosphericModels
동작 확인
상기 코드를 컴파일하여 실행하면 지난번과 같이 score를 출력합니다.
최후
이번에 우리는
EXE_INC
류getScore
함수를 상속류에서 제작하였다.이로써 여러 개의 진행이 다른 calculate()
클래스를 만들고 싶은 상황에서 calculate()
클래스에서 공통 부분을 미리 만들어 코드가 간단해지고 가독성도 높아졌다.다음에는 코드가 아닌 계산 상자에 추가로 설정된 방법을 살펴봅시다.
Reference
이 문제에 관하여([OpenFOAM] 수법 변경 추가 처리 ④: 계승류에 기술처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/inabower/articles/e321fd2c491772텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)