본문 바로가기

OpenFOAM/소스코드 파해치기

[OpenFOAM 소스코드 파해치기] 데이터읽기

일본어 원문링크


작성일 : 2009년 12월  24일
번역일 : 2016년   2월  22일


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


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

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

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

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

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

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



 

  들어가기 


데이터 불러오기에 대해 알아보자.



  사용 버전 


OpenFOAM 1.7.0

 


   파일


이번에 사용파는 파일이다.(12-input.tar.gz).


  • Make/files
  • Make/options
  • system/controlDict
  • system/fvSchemes
  • system/fvSolution
  • constant/polyMesh/boundary
  • constant/polyMesh/faces
  • constant/polyMesh/neighbour
  • constant/polyMesh/owner
  • constant/polyMesh/points
  • constant/inputData
  • constant/inputFile
  • constant/inputTable
  • input.C









  데이터 불러오기

 

OpenFOAM의 프로그램의 설정 데이터는 케이스 디렉토리의 constant 폴더에 있는 파일로부터 풀러들인다. 이번에 이  constnat 폴더의 파일을 불러와보도록 하자.

OpenFOAM의 표준솔버에서 constant 폴더 내 파일을 불러들이는 처리는  createField.H 에서 수행된댜ㅏ. 따라서, 불러오기 처리의 상세는 솔버의 소소코드 중 creafeField.H 의 에센스만을 살펴보도록 하겠다.

이번의 프로그램은 데이터로 constant 아래의 inputData, inputFile, inputTable을 불러온다. inputFile과 inputTable은 inputData 로 지정된 파일에 해당한다.



inputData

FoamFile
{
    version     2.0;
    format      binary;
    class       dictionary;
    location    "constant";
    object      inputData;
}

inputDataType inputData;

inputData inputData;

inputFile "$FOAM_CASE/constant/inputFile";

inputTable "$FOAM_CASE/constant/inputTable";

inputFile

1

two

inputTable

inputTable

(

A

B

C

);


프로그램을 살펴보면, 먼저, inputData를 불러오는 부분은 아래와 같다.

input.C

IOdictionary inputDataDict( IOobject( "inputData", mesh.time().constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE ) );


inputData를 불러오는 IOobject 오브젝트를 만들고 IOobject 오브젝트로 IOdictionary라는 딕셔너리 데이터클래스의 오브젝트를 만들고 있다. IOobject를 만들때 격자를 필요로 하므로, 격자를 미리 불러올 필요가 있다. 여기서 불러오는 파일은, inputData에 있듯이, "FoamFile"로 시작하는 헤더를 필요로 한다.

word inputDataType; inputDataDict.lookup("inputDataType") >> inputDataType; Info << "inputDataType: " << inputDataType << endl;

inputData로 만들어진 딕셔너 데이터로부터 "inputDataType"이라는 항목을 찾아, 값을 추출한다는 것을 나타내고 있다.

word inputData(inputDataDict.lookup("inputData")); Info << "inputData: " << inputData << endl;

"inputDataType" 와 같이, "inputData"라는 항목으로부터 값을 추출한다는것을 나타내고 있다.

fileName inputFile(inputDataDict.lookup("inputFile")); Info << "inputFile: " << inputFile.expand() << endl; IFstream is(inputFile.expand()); scalar one(readScalar(is)); Info << "one: " << one << endl; word two(is); Info << "two: " << two << endl;

"inputDataType", "inputData"와 같이 "inpuytFile" 이라는 항목으로부터 값을 추축하고 있으나, 이번에는 지정한 문자열을 파일의 경로로 해석하여 파일을 불러오고 있다. "inputFile.expand()"에서는, 원래의 값에 "$FOAM_CASE/constant/inputFile"이라는 변수 "$FOAM_CASE"가 사용되고 있으므로 변수의 값을 나타내고 있다. 경로로부터 IFstream 오브젝트를 만들어, 그것을 사용해 값을 불러오고 있다. inputFile은 inputData와 같은 딕셔너리 데이터가 아닌 보통의 텍스트 형태로 데이터를 하나하나씩 불러온다.

fileName inputTableFile(inputDataDict.lookup("inputTable")); Info << "inputTable: " << inputTableFile.expand() << endl; dictionary inputTableDict( IFstream( inputTableFile.expand() )() );

"inputTable"의 값으로부터 inputTable의 경로를 얻어 파일을 불러오고 있다. 여기서는 IFstream 오브젝트로부터 dictionary라는 딕셔너리 데이터클래서의 오브젝트를 만들고 있다. 이때, inputData의 경우의 "FoamFile"로 시작하는 헤더는 필요하지 않다.

wordList inputTable(inputTableDict.lookup("inputTable")); Info << "inputTable" << endl; forAll(inputTable, i){ Info << inputTable[i] << endl; }

"inputTable"라는 항목으로부터 리스트 데이터를 불러오는 것을 나타낸다.




  실행


컴파일하여 실행해 본다.

$ wmake $ ./input