【OpenFOAM】 수법 변경 추가 처리 ②: 구해기에서 추가 처리
개시하다
OpenFOAM 변경 수법 추가 처리 ①: codedFunction Object의 계속.
OpenFOAM의 계산에서 수법을 바꾸어 추가 처리하다.마지막으로 컴파일되지 않은 계산 파일
system/controlDict
에서 C++로 처리했습니다.이번에 소개한 것은 Solver를 복제하고 처리를 덧붙여 컴파일하는 방법이다.
방법 일람
구체적인 계획은 다음과 같은 방법으로 진행한다.실행이 확인된 파일은 GitHub에 공개됩니다.
pimpleFoam
)functionObjects
)codedFunctionObject
)IOdictionary
runTimeSelectionTable
wmake libso
codedTemplete
작업 환경
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/controlDict
의 application
항목은 다음과 같이 편집됩니다.※ 이 부분은 구해기 자체는 읽지 않지만, 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()
함수에 직접 기술하는 방법을 소개했다.이 추가 방법은 가장 간단한 방법이기 때문에 코드 제작에 시간을 들이고 싶지 않은 상황에서 매우 효과적이다.나는 일회용 맞춤형 제작 등에 많이 쓰고 싶다.
다른 한편, 처리 내용을 변경하려면 매번 컴파일해야 하기 때문에 처리가 복잡해지면 파일 구조가 복잡해지고 관리도 어려워진다는 단점이 있다.
다음부터는 여러 기능을 선택하거나 계산할 때마다 처리 내용을 변경할 수 있도록'처리를 클래스나 함수로 실시'하는 방법을 살펴본다.
Reference
이 문제에 관하여(【OpenFOAM】 수법 변경 추가 처리 ②: 구해기에서 추가 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/inabower/articles/bd0406a50919e6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)