본문 바로가기

OpenFOAM/소스코드 파해치기

[OpenFOAM 소스코드 파해치기]수송특성 추가

일본어 원문링크


작성일 : 2012년  3월  20일

번역일 : 2016년  3월   29일


크롬 브라우저로 보시는 것을 권장해 드립니다.


 ------ OpenFOAM 소스코드 파해치기 시리즈 ------

OpenFOAM 소스코드 파해치기 목차로 이동

 ------------------------------------------------------------

 ----- OpenFOAM 소스코드를 다루는 문법 기본 -----

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).