[OpenFOAM] 수법 변경 추가 처리 ④: 계승류에 기술처리

CAE 추가 캘린더 열기 9일째 신청이다.

개시하다


"OpenFOAM" 변경 수법 추가 처리 ③: 함수 또는 클래스로 추가 처리의 계속.OpenFOAM의 계산에서 수법을 바꾸어 추가 처리하다.
지난번에 함수와 클래스로 처리했습니다.
이번에는 그 반 방법의 발전형이다.상속류에서 기술 처리를 시도해 보세요.

방법 일람


이 기사는 다양한 기법을 소개하는 시리즈 중 하나로 전체적으로 다음과 같은 방법으로 진행될 예정이다.실행이 확인된 파일은 github.com/inabower/getScoreTutorials에 공개됩니다.
  • 예제 준비(키워드: pimpleFoam)
  • 기존 기능(키워드: functionObjects)
  • 컴퓨팅 파일에 쓰기 처리(키워드: codedFunctionObject)
  • 해결기에 처리 추가
  • 함수 또는 클래스로 추가 처리
  • 계승류에 처리 추가★지금 여기
  • 설정 항목 실행 시 읽기(키워드: IOdictionary
  • 상속 클래스를 실행할 때 상속 클래스를 선택합니다(키워드: runTimeSelectionTable
  • 추가 컴파일 클래스(키워드: wmake libso
  • 계승 클래스 중 하나로 코드드 추가(키워드: codedTemplete
  • 작업 환경

  • OS : Ubuntu 20.04 LTS (WSL2 on Windows 10)
  • OpenFOAM: ESI 버전 v2006(from source)
  • gcc : 9.3.0
  • 계승류의 구성


    실제 코드는 github.com/inabower/getScoreTutorials/004.inheritance에서 공개된다.
    지난번[OpenFOAM] 변경 수법 추가 처리 ③: 함수 또는 클래스로 추가 처리의 후반부에서 제작된scoreClassPimpleFoamGitHub과 비교한 형식으로 내용을 살펴봤다.

    디렉토리 구조


    이번 목록의 구조는 다음과 같다.
    .
    ├── 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은 상속류이다.이로써 sumInletOutletScoregetScore의 기능을 사용하거나 일부분을 덮어쓸 수 있다.
    이전 getScore 클래스에는 구성원 변수 score_ 를 계산하는 데 사용되는 calculate() 함수와 그 score_ 를 호출하는 데 사용되는 value() 함수가 있었다.이번에 우리는 그 중의'calculate() 함수가 계승류에 기술된'구조를 만들었다.

    기본 getScore


    기본 클래스로 다음과 같이 생성됩니다getScore.

    getScore/getScore.H

  • 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

  • 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

  • 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

  • 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"
    
  • 110행
  • sumInletOutletScore 이름이 myScore인 클래스 대상을 만듭니다.
      sumInletOutletScore myScore(mesh);
    
  • 174행
  • 마지막으로 집행 대상myScorecalculate().이곳은 value()반 때와 같다.여기에서 실행된 getScorecalculate() 클래스로 다시 정의된 후에 덮어씁니다.
            myScore.calculate();
            Info << nl << "score: " << runTime.value() << tab << myScore.value() << nl << endl;
    

    편역하다


    컴파일된 sumInletOutletScore 설정은 다음과 같습니다.

    Make/files

  • Make/files
  • 여기에 Make/getScore.C 둘을 컴파일합니다.
    getScore/getScore.C
    getScore/sumInletOutletScore.C
    pimpleFoam.C
    
    EXE = $(FOAM_USER_APPBIN)/scoreInheritancePimpleFoam
    

    Make/options

  • Make/files
  • 이곳은 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_INCgetScore함수를 상속류에서 제작하였다.이로써 여러 개의 진행이 다른 calculate() 클래스를 만들고 싶은 상황에서 calculate() 클래스에서 공통 부분을 미리 만들어 코드가 간단해지고 가독성도 높아졌다.
    다음에는 코드가 아닌 계산 상자에 추가로 설정된 방법을 살펴봅시다.

    좋은 웹페이지 즐겨찾기