티스토리 뷰

일본어 원문링크


작성일 : 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




댓글
  • 프로필사진 룡화이 안녕하세요 좋은 포스팅 덕분에 오픈폼 공부가 많이 되고 있습니다. 정말 감사합니다.

    혹시 여유가 있으시다면 목차에 나온 이후의 것도 포스팅이 가능할까요??? 바쁘시다면 어쩔 수 없지만요 ㅠㅠ

    다시한번 좋은 포스팅 감사드립니다.
    2016.03.28 01:51 신고
  • 프로필사진 BlogIcon 하루생각 하루생각 안녕하세요, 한양대 분이신가보군요! 혹시 어떤연구실에서 어떤 목적으로 오픈폼에 접하시게되었는지 여쭈어도 될까요?? :)

    나름대로 번역을 한다고 해도 일어직역이라 이해가 쉽지 않으실텐데 도움이 되신다니 다행입니다. 연구일정이 좀 생겼어서 휴재였습니다. 오늘부터 한주간 밀렸던 분량을 채우려 합니다. 필요하신 내용이 있으시면 우선순위로 포스팅하겠습니다 :D
    2016.03.28 10:32 신고
  • 프로필사진 비밀댓글입니다 2016.03.28 15:52
  • 프로필사진 BlogIcon 하루생각 하루생각 kickflipin@snu.ac.kr 입니다만...

    버전의 차이에 따른 문제는 항상 제일 먼저 부딪하는 문제입니다. 인터넷의 어떠한 자료를 찾아서 참고하시더라도, 항상 그 자료와 동일한 버전으로 테스트 해보시지 않으면 더 복잡한 문제에 부딪힙니다.

    정확히 맞추기 힘들때는 적어도 2.0.x 처럼 뒤쪽에 x 가 붙어있는 source를 컴파일해 사용할때마다 2.0.x, 2.1.x, 2.3.x등으로 바꾸어 가면서 컴파일 테스트를 해보시는게 좋습니다.

    저는 개인적으로 2.3.x를 많이 사용합니다.
    2016.03.28 17:46 신고