본문 바로가기

OpenFOAM/소스코드 파해치기

[OpenFOAM 소스코드 파해치기] 시간

일본어 원문링크


작성일 : 2009년 12월   5일
번역일 : 2016년  2월    6일


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


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

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

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

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

OpenFOAM 소스코드를 다루는 문법 기본으로 이동

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



 

  들어가기 


시간 클래스 Time을 사용해 본다.



  사용 버전 


OpenFOAM 1.6

 


  프로그램 


이전과 같이 소스디렉토리식을 작성해보자. 데릭토리를 만들고 안에 아래와 같이 준비한다.(03-time.tar.gz)


  • Make/files
  • Make/options
  • system/controlDict
  • time.C

Make/files는 다음과 같다.


Make/files

time.C

EXE = time


위의 경우, 소스디렉토리 내에 "time"이라는 프로그램을 작성하게 된다. Make/options는 전과 동일하다.


Make/options

EXE_INC = -I$(LIB_SRC)/finiteVolume/lnInclude
EXE_LIBS = -lfiniteVolume

자 그렇다면 OpenFOAM은 설정파일로 "~~Dict"라는 딕셔너리파일을 사용하나, 이번에는 Time이 controlDict 파일을 요구하므로 준비하였다. system 디렉토리를 작성하여 controlDict를 튜토리얼에서부터, 예를들면 icoFoam (tutorials/incompressible/icoFoam)의 cavity/system 내에서, system내에 복사하였다. controlDict의 설정으로 이번에 관련되는것은 아래와 같은 항목들이다.


  • startTime : 계산시작시간
  • endTime : 계산종료시간
  • deltaT : 계산타임스텝
  • writeINterval : 데이터 저장 시간폭


icoFoam 등의 일반적인 솔버에서는 startTime에서부터 계산을 시작하여 (endTime-startTime)/deltaT 회만큼 계산을 수행하고 그 중 writeInterval 회 마다 데이터를 저장한다.


time.C는 이전의 프로그램에 Time과 관련한 코드를 추가한 것이다. 추가되는 내용은 아래와 같다.


time.C(일부)

...
	Time runTime(Time::controlDictName,
		args.rootPath(), args.caseName());

	Info << "controlDict name: " << runTime.controlDictName << endl;
	Info << "root path: " << runTime.rootPath() << endl;
	Info << "case name: " << runTime.caseName() << endl;
	Info << "path: " << runTime.path() << endl;
	Info << "time path: " << runTime.timePath() << endl;
	Info << "format: " << runTime.writeFormat() << endl;
	Info << "version: " << runTime.writeVersion() << endl;
	Info << "compression: " << runTime.writeCompression() << endl;

	Info << "start time: " << runTime.startTime() << endl;
	Info << "end time: " << runTime.endTime() << endl;
	Info << "deltaT: " << runTime.deltaT() << endl;

	runTime.writeNow();

	while(runTime.loop()){
		Info << "Time: " << runTime.timeName() << endl;
		runTime.write();
	}

	runTime.writeAndEnd();

	Info << "execution time: " << runTime.elapsedCpuTime() << " s" << endl;
	Info << "clock time: " << runTime.elapsedClockTime() << " s" << endl;
	...


Time은 계산전체를 관리하는 클래스이다. 시간뿐만아니라 프로그램 경로의 정보도 가지고 있으며 데이터를 저장하는 지시도 담당한다. 정보는 argList 오브젝트와 controlDict 파일로부터 얻는다. 상세한 Time의 정의를 살펴보자. OpenFOAM 1.6에서는 src/OpenFOAM/db/Time/Time.H에 정의되어 있다.


Time 오브젝트의 정의는 createTime.H (src/OpenFOAM/include/createTime.H)를 참고하였다.


Time.H 내의 public 이하의 항목들이 유저가 접근가능한 목록을 나타낸다. 어떤 정보를 얻을 수 있고 설정할 수 있는지를 나타내고 있다. 예를들면,

public:
    ...
    //- Return current time name
    virtual word timeName() const;
    ...

이것을 사용하면 시간의 이름을 얻을 수 있다는 것이 확인가능하다.


"while(runTime.loop()){...}" 는 계산루프를 실행시 controlDict로부터 읽은 설정 정보에 대해 필요한 횟수만큼 루프를 수행한다. write()는 데이터를 출력하여 writeInterval의 설정에 따라 데이터를 저장할 필요가 있을때 저장을 수행한다.



 컴파일


소스디렉토리내에서(Make내부가 아니다!), wmake를 실행시킨다. 컴파일에 성공하면 time라는 실행파일이 생성된다. 실행해 보자.

$ wmake
$ ./time



 추가정보


본래의 프로그램을 조금 수정해보자.(03-time2.tar.gz) 수정된 부분은 아래와 같다.


time.C (일부)

...
	Info << "start time: " << runTime.startTime() << endl;
	Info << "end time: " << runTime.endTime() << endl;
	Info << "deltaT: " << runTime.deltaT() << endl;

	Info << "*set end time = 10" << endl;
	runTime.setEndTime(10);

	Info << "*set DeltaT = 2" << endl;
	runTime.setDeltaT(2);

	Info << "start time: " << runTime.startTime() << endl;
	Info << "end time: " << runTime.endTime() << endl;
	Info << "deltaT: " << runTime.deltaT() << endl;
	...

위에서 수행하는 것은 endTime이나 deltT의 설정을 프로그램내에서 변경하고 있다. 데이터를 불러오고싶다거나 변경하고 싶을 경우 클래서의 정의를 확인한다. 위와같이 그에 해당하는 멤버함수가 이미 준비되어있다는것을 발견할 수도 있다.



 추가정보 2


Time의 멤버함수 timeName()은 현재시각을 Foam::word 형으로 출력시킨다. 이것은 문자열에 해당한다. 현재시각을 숫자로 알고싶을 경우 아래와 같은 코드를 사용할 수 있다.

double currentTime = atof(runTime.timeName().c_str());

설명

  • Time 클래스의 timeName()은 현재시각을 Foam::word 형으로 출력한다.
  • Foam::word 클래스는 Foam::string 클래스를 계승한다.
  • Foam::string 클래스는 std::string을 계씅한다.
  • std::string의 멤버함수 c_str()은 C 형식의 문자열(문자배열)을 출력한다.
  • C의 유틸리티함수 atof는 문자열을 부동소수점수로 변환한다.
  • 이상, atof(runTime.timeName().c_str())로 현재시각을 숫자로 얻을 수 있다.


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