작성일 : 2009년 12월 5일
번역일 : 2016년 2월 6일
크롬 브라우저로 보시는 것을 권장해 드립니다.
------------------------------------------------------------
----- 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 > 소스코드 파해치기' 카테고리의 다른 글
[OpenFOAM 소스코드 파해치기] blockMesh (0) | 2016.02.09 |
---|---|
[OpenFOAM 소스코드 파해치기] 격자 (0) | 2016.02.09 |
[OpenFOAM 소스코드 파해치기] 인수 리스트 (0) | 2016.02.06 |
[OpenFOAM 소스코드 파해치기] 단순 프로그램 (0) | 2016.02.06 |
[OpenFOAM 소스코드 파해치기] 시리즈 목차 (0) | 2016.02.06 |