【OpenFOAM】 수법 변경 추가 처리 ②: 구해기에서 추가 처리

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

개시하다


OpenFOAM 변경 수법 추가 처리 ①: codedFunction Object의 계속.
OpenFOAM의 계산에서 수법을 바꾸어 추가 처리하다.마지막으로 컴파일되지 않은 계산 파일 system/controlDict 에서 C++로 처리했습니다.
이번에 소개한 것은 Solver를 복제하고 처리를 덧붙여 컴파일하는 방법이다.

방법 일람


구체적인 계획은 다음과 같은 방법으로 진행한다.실행이 확인된 파일은 GitHub에 공개됩니다.
  • 예제 준비(키워드: 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
  • 2. 해결자에 처리 추가


    먼저 설명하는 방법은 구해기에 직접 쓰기 처리하는 것이다.
    main() 함수에서 각 면의 유량 총화를 요구하는 코드를 직접 기술하는 방법.절차를 구체적으로 살펴보다.

    pimpleFom 복사


    기능 추가 지침으로 이번에는'솔버를 복사해 이름을 변경해 다른 편집으로 활용한다'는 방법을 사용했다.내가 이 절차를 설명할게.
    먼저 다음과 같이 pimpleFoam을 복사합니다.
    $ mkdir -p $FOAM_RUN/002.inSolver
    $ cp -r $FOAM_SOLVERS/incompressible/pimpleFoam $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ sed -i -e "s/APPBIN)\/pimpleFoam/USER\_APPBIN)\/scorePimpleFoam/g" Make/files
    
    # 下2行はWSLの場合に必要 (windowsはファイル名の大文字小文字を区別できないのでCorrectPhi.HをcorrectPhi.Hと間違えてしまう)
    $ cp $FOAM_SRC/finiteVolume/cfdTools/general/CorrectPhi/CorrectPhi.H cpCorrectPhi.H
    $ sed -i -e "s/CorrectPhi.H/cpCorrectPhi.H/" pimpleFoam.C
    
    현재 디렉터리 구조에서 중요한 것은 다음과 같은 파일이다.
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ tree
    scorePimpleFoam
    ├── Make
    │   ├── files
    │   └── options
    ├── UEqn.H
    ├── correctPhi.H
    ├── cpCorrectPhi.H
    ├── createFields.H
    ├── pEqn.H
    └── pimpleFoam.C
    
    그 중에서 main() 함수는 pimpleFoam.C에서 다른 *.H에 상세하게 처리되었다.이 명령은 OpenFOAM에서 해결자를 컴파일할 때 사용됩니다wmake.매번Makefile 등을 만들지 않고 OpenFOAM이 많은 프로그램 라이브러리에 자동으로 연결되어 실행 파일을 만드는 스크립트입니다.
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ wmake
    Making dependency list for source file pimpleFoam.C
    g++ -std=c++11 -m64 -pthread -DOPENFOAM=2006 -DWM_DP -DWM_LABEL_SIZE=32 -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-attributes -Wno-unknown-pragmas  -O3  -DNoRepository -ftemplate-depth-100 -I/installDir/OpenFOAM-v2006/src/finiteVolume/lnInclude -I/installDir/OpenFOAM-v2006/src/meshTools/lnInclude -I/installDir/OpenFOAM-v2006/src/sampling/lnInclude -I/installDir/OpenFOAM-v2006/src/TurbulenceModels/turbulenceModels/lnInclude -I/installDir/OpenFOAM-v2006/src/TurbulenceModels/incompressible/lnInclude -I/installDir/OpenFOAM-v2006/src/transportModels -I/installDir/OpenFOAM-v2006/src/transportModels/incompressible/singlePhaseTransportModel -I/installDir/OpenFOAM-v2006/src/dynamicMesh/lnInclude -I/installDir/OpenFOAM-v2006/src/dynamicFvMesh/lnInclude -iquote. -IlnInclude -I/installDir/OpenFOAM-v2006/src/OpenFOAM/lnInclude -I/installDir/OpenFOAM-v2006/src/OSspecific/POSIX/lnInclude   -fPIC -c pimpleFoam.C -o Make/linux64GccDPInt32Opt/pimpleFoam.o
    g++ -std=c++11 -m64 -pthread -DOPENFOAM=2006 -DWM_DP -DWM_LABEL_SIZE=32 -Wall -Wextra -Wold-style-cast -Wnon-virtual-dtor -Wno-unused-parameter -Wno-invalid-offsetof -Wno-attributes -Wno-unknown-pragmas  -O3  -DNoRepository -ftemplate-depth-100 -I/installDir/OpenFOAM-v2006/src/finiteVolume/lnInclude -I/installDir/OpenFOAM-v2006/src/meshTools/lnInclude -I/installDir/OpenFOAM-v2006/src/sampling/lnInclude -I/installDir/OpenFOAM-v2006/src/TurbulenceModels/turbulenceModels/lnInclude -I/installDir/OpenFOAM-v2006/src/TurbulenceModels/incompressible/lnInclude -I/installDir/OpenFOAM-v2006/src/transportModels -I/installDir/OpenFOAM-v2006/src/transportModels/incompressible/singlePhaseTransportModel -I/installDir/OpenFOAM-v2006/src/dynamicMesh/lnInclude -I/installDir/OpenFOAM-v2006/src/dynamicFvMesh/lnInclude -iquote. -IlnInclude -I/installDir/OpenFOAM-v2006/src/OpenFOAM/lnInclude -I/installDir/OpenFOAM-v2006/src/OSspecific/POSIX/lnInclude   -fPIC -Xlinker --add-needed -Xlinker --no-as-needed  Make/linux64GccDPInt32Opt/pimpleFoam.o -L/installDir/OpenFOAM-v2006/platforms/linux64GccDPInt32Opt/lib \
        -lfiniteVolume -lfvOptions -lmeshTools -lsampling -lturbulenceModels -lincompressibleTurbulenceModels -lincompressibleTransportModels -ldynamicMesh -ldynamicFvMesh -ltopoChangerFvMesh -latmosphericModels -lOpenFOAM -ldl  \
         -lm -o /installDir/inabower-v2006/platforms/linux64GccDPInt32Opt/bin/scorePimpleFoam
    
    이런 정보가 나오면 컴파일이 완료됩니다.컴파일되었는지 확인하십시오.

    동작 확인용 상황 준비


    우선, 이렇게 하면 pimpleFoam와 같은 기능을 가진 scorePimpleFoam를 실행할 수 있다.동작을 확인하기 위해 다음과 같은 복제 강좌를 준비하고 구해기를 테스트합니다.
    $ cp -r $FOAM_TUTORIALS/incompressible/pimpleFoam/RAS/TJunction $FOAM_RUN/002.inSolver/plainCase
    $ cd $FOAM_RUN/002.inSolver/plainCase
    

    system/controlDict

    system/controlDictapplication 항목은 다음과 같이 편집됩니다.
    ※ 이 부분은 구해기 자체는 읽지 않지만, OpenFOAM에서 준비한 스크립트나 조개 함수에 사용됩니다.$FOAM_RUN/002.inSolver/plainCase/system/controlDict
    /*--------------------------------*- C++ -*----------------------------------*\
    | =========                 |                                                 |
    | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
    |  \\    /   O peration     | Version:  v2006                                 |
    |   \\  /    A nd           | Website:  www.openfoam.com                      |
    |    \\/     M anipulation  |                                                 |
    \*---------------------------------------------------------------------------*/
    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        location    "system";
        object      controlDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    // application    pimpleFoam; // before
    application     scorePimpleFoam; // after
    
    startFrom       startTime;
    
    startTime       0;
    (以下略)
    

    foamRunTutorials


    이로써 다음과 같은foamRunTutorials 실행을 하면 격자 생성과 계산을 할 수 있다.
    $ cd $FOAM_RUN/002.inSolver/plainCase
    $ foamRunTutorials
    

    foamCleanTutorials


    참고로 실행 결과를 삭제하기 위해 다음과 같이 실행한다foamCleanTutorials.
    $ cd $FOAM_RUN/002.inSolver/plainCase
    $ foamCleanTutorials
    
    는 위에서 말한 바와 같이 foamRunTutorials와 진행foamCleanTutorials을 통해 구해기의 행위를 확인할 수 있다.앞으로는 컴파일러를 컴파일할 때마다 이를 통해 동작을 확인합니다.

    구해기에서 처리 설명


    그럼 드디어 목적의 처리를 기술해야겠군.
    이번에 추가된 것은 pimpleFoam.C에 기재된 main() 함수 중 하나다.
    각 교체는 속도와 압력을 계산한 후에 각 유량을 구한다.
    $FOAM_RUN/002.inSolver/scorePimpleFoam/pimpleFoam.C(발췌문)
    #include "~~"
    
    int main(int argc, char *argv[])
    {
        while (runTime.run())
        {
            // PIMPLE ループ
            while (pimple.loop())
            {
                // 速度と圧力の計算
            }
    
            // ここでスコアを計算する
    
            runTime.write();
        }
    }
    

    main () 에 처리 직접 기술하기


    구체적으로 다음과 같다main()는 함수에 적힌 pimpleFoam.C에서 기술처리를 통해 추가 처리를 할 수 있다.
    $FOAM_RUN/002.inSolver/scorePimpleFoam/pimpleFoam.C(발췌문)
                while (pimple.correct())
                {
                    #include "pEqn.H"
                }
    
                if (pimple.turbCorr())
                {
                    laminarTransport.correct();
                    turbulence->correct();
                }
            }
    
            // 170行目:ここから追加
    	{
    	    Info << "Calculating score sum of phi" << endl;
    
    	    scalar 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);
    	    }
    	    Info << nl << "score: " << runTime.value() << tab << score << nl << endl;
    	}
    
            runTime.write();
    
            runTime.printExecutionTime(Info);
    
    는 다음과 같이 번역한다.
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ wmake
    
    는 다음과 같이 집행한다.
    $ cd $FOAM_RUN/002.inSolver/plainCase
    $ foamCleanTutorials
    $ foamRunTutorials
    
    출력 확인log.scorePimpleFoam은 지난번codedFunctionObject과 같다.

    처리 부분을 다른 파일에 쓰기


    이렇게 하면 pimpleFoam.C에 처리를 직접 기재할 수도 있지만 OpenFOAM에서는 관례로 상세한 처리를 다른 *.H 파일에 기술하고 그것#include을 기술하는 스타일을 많이 사용한다.인코딩 규칙가 결정한 것이 아니라 이 수법을 피하는 사람이 많지만, 다음은 이 관례에 따라 만들어 보자.
    즉, 아래와 같이 pimpleFoam.C에 기재#include "getScore.H"とだけ하고 상세하게 처리한 내용getScore.H을 다시 제작한 것이다.
    $FOAM_RUN/002.inSolver/scorePimpleFoam/pimpleFoam.C(발췌문)
                while (pimple.correct())
                {
                    #include "pEqn.H"
                }
    
                if (pimple.turbCorr())
                {
                    laminarTransport.correct();
                    turbulence->correct();
                }
            }
    
            #include "getScore.H" // 170行目に挿入
    
            runTime.write();
    
            runTime.printExecutionTime(Info);
    
    $FOAM_RUN/002.inSolver/scorePimpleFoam/getScore.H(새로 만들기)
    {
        Info << "Calculating score sum of phi" << endl;
    
        scalar 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);
        }
        Info << nl << "score: " << runTime.value() << tab << score << nl << endl;
    }
    
    그래서 현재의 문서는 다음과 같다.
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ tree
    scorePimpleFoam
    ├── Make
    │   ├── files
    │   └── options
    ├── UEqn.H
    ├── correctPhi.H
    ├── cpCorrectPhi.H
    ├── createFields.H
    ├── getScore.H  ## NEW!!
    ├── pEqn.H
    └── pimpleFoam.C
    
    그럼 컴파일해서 동작을 확인할게요.
    $ cd $FOAM_RUN/002.inSolver/scorePimpleFoam
    $ wmake
    
    $ cd $FOAM_RUN/002.inSolver/plainCase
    $ foamCleanTutorials
    $ foamRunTutorials
    
    동일한 것이 생성되었는지 확인log.scorePimpleFoam.

    최후


    이번에는 구해기main() 함수에 직접 기술하는 방법을 소개했다.

    이 추가 방법은 가장 간단한 방법이기 때문에 코드 제작에 시간을 들이고 싶지 않은 상황에서 매우 효과적이다.나는 일회용 맞춤형 제작 등에 많이 쓰고 싶다.
    다른 한편, 처리 내용을 변경하려면 매번 컴파일해야 하기 때문에 처리가 복잡해지면 파일 구조가 복잡해지고 관리도 어려워진다는 단점이 있다.
    다음부터는 여러 기능을 선택하거나 계산할 때마다 처리 내용을 변경할 수 있도록'처리를 클래스나 함수로 실시'하는 방법을 살펴본다.

    좋은 웹페이지 즐겨찾기