UDF 내에서 Report Definition 값 가져오기
해석 진행 중에 해석 결과값을 이용하여 경계조건 또는 내부 계산식에 적용해야 할 때, Expression 기능을 이용할 수도 있지만, 데이터 획득 과정에서 종종 제한사항에 걸리기도 한다. 또, UDF에서는 Field Variable Macros 가 있지만, 변수가 다양하지 않아 사용자가 재조합 또는 새로운 수식을 만들어 가공하여야 한다. 이러한 제한없이 UDF 내에서 사용자가 원하는 대로 데이터를 획득할 수 있는 방법을 소개한다.
Introduction
1. 서론
어느 날 한 고객으로부터 기술지원 문의 전화 한 통을 받았다. 이분은 Fluent 고급교육까지 완벽히 이수하고 C++, UDF 및 PYTHON 등 처음부터 직접 코딩이 가능한 숙련자이다. 그럼에도 불구하고 문의를 한다는 것은 나에게 매우 긴장을 유발시키는 부분이다. 문의내용은 이렇다. “현재 UDF를 이용해서 내부 경계조건에 source term을 별도의 수식으로 계산해서 넣어주는데, 이 수식에 입구에서의 Total Pressure 값이 들어갑니다. Total Pressure 값을 가져오는 방법을 알려주세요.” 처음에는 입구의 Total Pressure 값을 그냥 상수로 넣어주면 되지 않을까 생각했지만, 그럴 문제가 아니었다. 이 수식을 최소 수십 개에서 수백 개의 case study에 적용해야 하기 때문에 자동화가 되어야 하는 문제이다. 그래서 Custom Field Function 부터 Expression, UDF 매뉴얼을 샅샅이 뒤져서 해결이 가능한 방법(API)을 찾았다. Report Definition 값을 정의하고 그 값을 UDF 내에 가져오는 것이다.
이를 가능하게 하는 API 이름은 Get_Report_Definition_Values이며 Report Definition에 액세스하여 데이터를 가져올 수 있게 해준다. 즉, Ansys Fluent에서 사용자 정의 함수(UDF)를 사용하여 Report Definition에서 값을 가져오는 것이다. 그리고 추가로 Get_Report_Definition_Values API의 정상 작동 여부를 확인하기 위해 ADJUST 매크로를 사용하여 계산 중에 값을 출력하여 확인하였다.
2. 형식
int Get_Report_Definition_Values(const char* name, int timeStep/iteration, int* nrOfvalues, real* values, int* ids, int* index)
Argument Type
const char* name Report Definition의 이름
int timeStep/iteration 정상상태 해석인 경우는 0, 비정상상태 해석은 1
int* nrOfvalues Report Definition에서 가져온 값의 개수를 저장하는 변수
real* values 실수형 데이터를 저장하기 위한 포인터
int* ids 정수형 데이터를 저장하기 위한 포인터
int* index iteration 횟수를 저장하는 변수
이 API를 호출하기 전에 출력 인수를 NULL로 지정하거나 적절한 메모리를 할당해야 한다. 메모리가 적절하게 할당되지 않으면 계산 실행이 중단되거나 예기치 않은 동작이 발생할 수 있기 때문이다.
여기서 return value 가 0 이 되면 성공적으로 호출된 것이며, 1 은 Report Definition 값이 없음을 의미한다.
3. 사용 예
3.1 Report Definition
먼저 report definition을 정의해야 한다.
아래 그림 1과 같이 입구 경계면에서의 total pressure를 report-def-0으로 설정한다.
따라서 나중에 호출할 report definition 이름은 “report-def-0” 이 된다.
그림 1 Report Definition 값 정의하기
3.2 Get_Report_Definition_Values (정상상태)
그림 2 Adjust Function Hooking 하기
위의 UDF를 사용하기 위해서는 그림 2와 같이 User-Defined Function Hooks을 이용하여 Adjust에 걸어줘야 한다.
그림 3 반복 해석시 출력되는 값과 Report 값 비교
그림 4 Report 값 출력
위의 그림 3과 4를 보면 Get_Report_Definition_Values를 이용하여 Report Definition 값이 출력되고 서로 일치하는 것을 확인할 수 있다.
3.3 Get_Report_Definition_Values (비정상상태)
int rv = Get_Report_Definition_Values("report-def-0", 1, &nrOfvalues, NULL, NULL,NULL);
모든 Get_Report_Definition_Values 함수에서 두번째 항을 1 로 넣어주면 된다.
맺음말
지금까지 Fluent UDF의 Get_Report_Definition_Values API에 대해 알아보았다. 다소 생소한 UDF라서 사용법이 어렵게 보일 수는 있지만, 별다른 수정없이 그대로 가져다 본인의 코드에 붙여 넣으면 되는 것이라서 어렵지 않게 사용할 수 있다. Report Definition에 액세스하여 데이터를 가져다 쓰는 기능을 알고 있으면, 차후 데이터 처리를 해야 할 상황이 왔을 때 매우 강력한 도구로 활용할 수 있을 것이다.