본문 바로가기

OpenFOAM/소스코드 파해치기

[OpenFOAM 소스코드 파해치기] 스칼라필드

일본어 원문링크


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


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


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

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

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

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

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

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



 

  들어가기 


스칼라필드를 만들어 보자.



  사용 버전 


OpenFOAM 1.6

 


   파일


이번에 사용파는 파일이다.(07-sfield.tar.gz).


  • Make/files
  • Make/options
  • system/controlDict
  • system/fvSchemes
  • system/fvSolution
  • constant/polyMesh/blockMeshDict
  • 0/s
  • sfield.C

격자는 이전과 같다. 이번에 만드는 스칼라필드용의 경계파일이 필요하다.


0/s

...
dimensions      [0 0 0 1 0 0 0];

internalField   uniform 0;

boundaryField
{
    left
    {
        type            fixedValue;
        value           uniform 0;
    }

    right
    {
        type            fixedValue;
        value           uniform 0;
    }

    top
    {
        type            zeroGradient;
    }

    bottom
    {
        type            zeroGradient;
    }
}
...


상세한 설명은 이전과 같다. "type zeroGradient"는, 경계의 분배가 0임을 나타내는 조건이다.









  프로그램

 

이번에 사용하는 프로그램이다.

sfield.C (일부)

volScalarField s(
		IOobject("s", runTime.timeName(), mesh,
			IOobject::MUST_READ, IOobject::AUTO_WRITE),
		mesh
	);

	runTime++;

	forAll(s, i){
		s[i] = i;
	}

	Info << "max = " << max(s).value() << endl;
	Info << "min = " << min(s).value() << endl;
	Info << "average = " << average(s).value() << endl;
	Info << "sum = " << sum(s).value() << endl;

	s.write();

volScalarField는 스칼라필드의 변수형이다. (오브젝트를 정의하는 방법은 applications/solvers/basic/laplacianFoam/createField.H를 참조). volScalarField는 volFieldFwd.H (src/finiteVolume/fields/volFields/volFieldsFwd.H)에 typedef로 정의되는 것으로, 실체는 DimensionField 이다. 따라서,  volScalarField의 정체를 알려면, GeometricFiled 그리고 그것이 계승하고 있는  DimensionField, 또한 그것이 계승하고 있는 Field에 대해 알아야 한다. Field는 List를 계승하고있으므로 volScalarField는 리스트형이다. 어떤 리스트인가에 대해 생각해보면 알 수 있다.  


volScalarField는 "s[i]"의 형태로 각 셀의 값에 접근가능하다. 프로그램의 "forAll..."의 부분에서 셀 i의 i의 값을 넣고 있다.


volScalarField는 max() 또는 min() 등의 함수가 적용가능하다 (DimensionedFieldFunctions.H를 참조). 얻어지는 데이터는 그대로는 정보량이 크므로 (dimensioned형 : dimensionedType.H 를 참조), value() 멤버함수를 통해 수치로 변환하고 있다.



  실행


컴파일하여 실행해 본다.

$ wmake $ blockMesh $ ./sfield

paraFoam에서 스칼라값을 표시해보면, 값이 셀의 순번에 따라 들어가 있는 것을 확인할 수 있다.







  추가정보

 

코드를 살짝 변형시켜 보자.(07-sfield2.tar.gz).


sfield.C


...
	runTime++;
	
	forAll(s, i){
		if(mesh.C()[i][1] < 0.5) s[i] = i;
	}
	
	Info << "max = " << max(s).value() << endl;
	...


fvMesh의 멤버함수 C()는 셀의 중심의 벡터필드를 출력한다. 즉, 셀의 중심좌표의 리스트를 얻을 수 있다. 위 프로그램에서는 셀의 중심좌표의 y축 성분이 0.5 이하인 경우에 한해 셀의 값을 넣도록 하고 있따. 모델 전체의 높이는 1 이므로, 아래반쪽만 값이 설정되는 것이다. 실행해 paraFoam으로 확인해보도록 하자.


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