작성일 : 2012년 3월 20일
번역일 : 2016년 3월 29일
크롬 브라우저로 보시는 것을 권장해 드립니다.
------------------------------------------------------------
----- OpenFOAM 소스코드를 다루는 문법 기본 -----
------------------------------------------------------------
들어가기 |
열물성의 수송특성 모델을 추가해 보자.
사용 버전 |
OpenFOAM 2.1.0
파일 |
17-kineticTransport.tar.gz (reactingFoam 대응 버전)
목표 |
OpenFOAM의 열물리모델의 수송특성(점성 등)에는 정수, Sutherland의 식 등이 있으나, 여기에 기체분자운동론모델을 추가해보자 여기서는 buoyantSimpleFoam을 사용한다.
준비 |
buoyangSimpleFoam의 코드를 준비한다.
$ cp -r $FOAM_SOLVERS/heatTransfer/buoyantSimpleFoam .
$ cd buoyantSimpleFoam
Make/file을 수정한다.
EXE = buoyantSimpleFoam
컴파일한다.
$ wmake
폴더내의 buoyantSimpleFoam가 만들어진것을 확인한다.
$FOAM_SRC/thermophysicalModels/specie를 그대로 복사한다.
$ cp -r $FOAM_SRC/thermophysicalModels/specie .
$ cd specie
specie의 Make/file을 수정한다.
LIB = $(FOAM_USER_LIBBIN)/libspecie
컴파일한다.
$ wmake libso
다음으로 $FOAM_SRC/thermophysicalModels/basis를 복사하여, specie와 같이 컴파일한다. 여기서 Make/options은 로컬의 specie를 사용하도록 수정한다.
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I../specie/lnInclude
LIB_LIBS = \
-lfiniteVolume
수송특성의 추가 |
specie의 transport로 이동하여, sutherland에서부터 kinetic을 만든다.
$ cd specie/transport
$ cp -r sutherland kinetic
kinetic 내부의 파일(sutherland파일)에서부터, 파일명과 이름을 치환해 kinetic용의 파일을 만든다. 다음과같은 스크립트(run)을 만든다.
#!/bin/sh
sed -e "s/sutherlandTransport/kineticTransport/g" sutherlandTransport.C > kineticTransport.C
sed -e "s/sutherlandTransport/kineticTransport/g" sutherlandTransport.H > kineticTransport.H
sed -e "s/sutherlandTransport/kineticTransport/g" sutherlandTransportI.H
kineticTransportI.Hd
실행시킨다.
$ sh run
kinetic 내부의 sutherland 파일과 run 스크립트는 더이상 필요없으므로 삭제한다.
$ rm sutherland* run
specie를 재컴파일한다(lnInclude를 갱신하기 위해).
$ wclean
$ wmake libso
basic/mixture/basicMixture/basicMixtures.C에 kineticTransport를 추가합니다.
#include "kineticTransport.H" ... makeBasicMixture ( pureMixture, kineticTransport, hConstThermo, perfectGas ); makeBasicMixture ( pureMixture, kineticTransport, janafThermo, perfectGas );
basic/psiThermo/hPsiThermo/hPsiThermos.C에 kineticTransport를 추가합니다.
#include "kineticTransport.H" ... makeBasicPsiThermo ( hPsiThermo, pureMixture, kineticTransport, hConstThermo, perfectGas ); makeBasicPsiThermo ( hPsiThermo, pureMixture, kineticTransport, janafThermo, perfectGas );
점성계수를 수정 |
점성계수를 수정하기위해서는, kineticTransportI.H의 mu 함수를 수정한다.
template<class Thermo>
inline Foam::scalar Foam::kineticTransport<Thermo> ::mu(const scalar T) const { scalar T_star = T/epsilonk_; const scalar A = 1.16145, B = 0.14874, C = 0.52487, D = 0.7732, E = 2.16178, F = 2.43787; scalar omega = A*pow(T_star, -B) + C*exp(-D*T_star) + E*exp(-F*T_star); scalar M = this->W(); return 26.69*sqrt(M*T)/(sigma_*sigma_*omega)*1e-7; }
여기서는 기체분자운동론에 의한 식(Champman-Enskog식)을 사용하고 있다. sigma_ 와 epsilonk_ 는 σ (시그마)와 ε/k 로, constnat/thermophysicalProperties로부터 읽어들인다.
수송특성으로 열전도율(kappa)도 있으나, sutherlandTransport에서는 modified Eucken correlation가 사용되므로 그대로 둔다.
수정하면 basic을(specie가아닌) 재검파일 한다.
$ wmake libso
점성계수 출력 |
확인을 위해 점성계수를 출력하도록 해놓자. buoyantSimpleFoam의 createFields.H에 아래와 같이 추가해놓는다.(rho를 벅사해 수정하면 된다)
volScalarField mul ( IOobject ( "mul", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::AUTO_WRITE ), thermo.mu() );
"NO_WRITE"가 아닌 "AUTO_WRITE"를 지정합니다. "mu"가 아닌 "mul"로 되어있는 이유는 thermo가 이미 "mu" 라는 필드를 가지고 있으므로, 출력설정이 제대로 안되기 때문이다.
mul을 갱신하기위해, hEqn.H의 "thermo.correct()"의 뒤에 다음과 같이 추가합니다.
thermo.correct();
mul = thermo.mu();
열물성을 수정하는것이 "thermo.correct()"에 의해 이루어지므로, mul 의 갱신은 그 이후에 수행되어야 한다.
컴파일한다.
$ wmake
실행 |
튜토리얼케이스 hotRoom을 실행한다.
$ cp -r $FOAM_TUTORIALS/heatTransfer/buoyantSimpleFoam/hotRoom .
열물성모델을 변경하였으므로, constant/thermophysicalProperties를 수정할 필요가 있다.
thermoType
hPsiThermo<pureMixture<kineticTransport<specieThermo<hConstThermo<perfectGas
>>>>; pRef 100000; mixture { ... transport { sigma 3.621; epsilonk 97.53; } }
실행.
$ blockMesh
$ setFields
$ ../buoyantSimpleFoam/buoyantSimpleFoam > log &
주의 |
여기서는 buoyantSimpleFoam의 소스를 사용하고 있으나, 점성계수의 출력을 추가하므로 라이브러리의 수정과는 관계가 없다. 라이브러리를 기존의 라이브러리명으로 $FOAM_USER_LIBBIN 에 컴파일하면 모든 솔버들의 라이브러리가 치환되어버린다 ($FOAM_LIBBIN 보다 $FOAM_USER_LIBBIN 이 우선되는것을 의미한다). 따라서, 원래의 buoyantSimpleFoam 에도 위의 수정이 적용된다. 다음과 같이 하면 라이브러리 libspecie의 경로가 유저라이브러리로 되어있음을 알 수 있습니다.
$ ldd 'which buoyantSimpleFoam' | grep specie
다른 솔버에 영향을 주지 않으려면, 라이브러리 이름을 변경해야한다. 또한, 직접 제작한 라이브러리에 의해 솔버가 작동하지 않게 되었다면, $FOAM_USER_LIBBIN에 해당하는 라이브러리를 삭제한다(이번의 경우에는 libspecie.so, libbasicThermophysicalModels.so).
추가정보 |
reactingFoam 에서도 kineticTransport를 사용하도록 해보자. 귀찮으므로 sutherlandTransport를 kineticTransport로 치환하는 방법을 이용한다.
specie/include/thermophysicsTypes.H 를 다음과 같이 편집한다.
#include "kineticTransport.H" ... namespace Foam { //typedef sutherlandTransport<specieThermo<janafThermo<perfectGas>
> > // gasThermoPhysics; typedef kineticTransport<specieThermo<janafThermo<perfectGas> > > gasThermoPhysics;
$FOAM_SRC/thermophysicalModels 에서 reactionThermo, chemistryModel 를 복사해 로컬의 specie, basic 을 사용하도록 Make/options 를 치환, 유저라이브러리 경로에 컴파일되도록 Make/files 를 치환하고 각각을 수행한다.
이렇게 해서 reactingFoam (더불어 gasThermoPhysics를 사용하는 모든) 에서 sutherlandTransport 를 대신해 kineticTransport가 사용하게 된다 (sutherlandTransport는 사용하지 않게 된다). 튜토리얼케이스 counterFlowFlame2D 에서는 constant/thermo.compressibleGas의 transport를 치환해야한다(17-counterFlowFlame2D.tar.gz).
'OpenFOAM > 소스코드 파해치기' 카테고리의 다른 글
[OpenFOAM 소스코드 파해치기] autoPtr과 tmp (0) | 2016.03.30 |
---|---|
[OpenFOAM 소스코드 파해치기] 다공질체 (porous media) (0) | 2016.03.29 |
[OpenFOAM 소스코드 파해치기]입출력오브젝트 (0) | 2016.03.29 |
[OpenFOAM 소스코드 파해치기] 열물성 다루기 (0) | 2016.03.28 |
[OpenFOAM 소스코드 파해치기] simpleFoam (2) | 2016.03.28 |