요약
- ANSYS CFX CEL에서 변수가 자기 자신을 직접 또는 간접적으로 참조하면 재귀적 참조(Circular Reference) 에러가 발생합니다.
- 이 에러는 물성치 정의, 경계조건 설정 등 실무에서 빈번하게 발생하며, CEL만으로는 근본적 해결이 어려운 경우가 있습니다.
- linlin 연산자, 평균 함수, Additional Variable 복사 기법 등 실무에서 검증된 우회 방법을 정리합니다.
재귀적 참조 에러란?
CEL에서 변수 정의가 자기 자신을 참조하는 순환 구조가 되면, Solver가 시작 직후 다음 에러를 출력하며 중단됩니다.
Error in subroutine GETCORE: There is a circularity in recursive calls
to GETVAR. A variable depends upon itself!
Fortran 등 일반 프로그래밍 언어에서는 A = A + 1 같은 재귀적 처리가 자연스럽지만, CEL은 선언적(Declarative) 언어이므로 자기 참조가 허용되지 않습니다.
어떤 상황에서 발생하는가?
직접 참조
A = A + 1
변수 A 정의에 A 자신이 포함된 가장 단순한 케이스입니다.
간접 참조 (순환 의존)
A = B * 2
B = A + 1
A → B → A로 순환이 형성됩니다.
물성치 정의에서의 간접 순환
실무에서 가장 흔한 케이스입니다. 온도 의존 물성치를 CEL로 정의할 때:
- 점도(Viscosity)를 Temperature의 함수로 정의
- Temperature는 에너지 방정식에서 계산됨
- 에너지 방정식 내부에서 점도가 사용됨
- 점도 → Temperature → 점도의 순환 발생
일반적인 온도 의존 물성치는 CFX Solver가 내부적으로 순환을 처리하므로 대부분 문제가 되지 않습니다. 하지만 사용자 정의 표현식이 복잡하게 얽히면 Solver가 순환을 감지하고 에러를 발생시킵니다.
경계조건에서의 순환
입구 경계조건의 압력을 밀도를 이용한 CEL 수식으로 정의하는 경우, 압축성 유동에서는 밀도가 압력과 연계되어 있으므로 압력 → 밀도 → 압력의 순환이 발생합니다.
우회 방법 1 — 변수 의존 관계 정리
가장 기본적인 접근입니다. 표현식 간의 의존 관계를 확인하고 순환이 없도록 정리합니다.
- 모든 변수 정의가 이미 정의된 변수만 참조하는지 확인
- 중간 변수를 도입하여 참조 방향을 한 방향으로 정리
- 초기 조건(Initial Conditions)에서는 x, y, z, r, theta 등 시스템 변수만 사용
우회 방법 2 — linlin 연산자
온도 의존 물성치에서 순환 참조가 발생할 때, linlin 연산자를 사용하면 우회할 수 있습니다.
linlin은 변수의 값을 적분점(Integration Point)에서 직접 계산하지 않고, 노드 값에서 보간하여 가져옵니다. 이렇게 하면 적분점에서의 순환 의존성이 끊어집니다.
실무 예시 — Turbulent Prandtl Number
TuPr = Dynamic Viscosity.linlin * Specific Heat Capacity at Constant Pressure.linlin / Thermal Conductivity.linlin
각 물성치에 .linlin을 붙여 노드 보간 값을 사용하면, 적분점에서의 온도 → 물성치 → 온도 순환이 발생하지 않습니다.
온도 의존 점도 (Arrhenius 형태)
mu = mu_ref * exp(A * (1/(Temperature.linlin) - 1/T_ref))
linlin vs Boundcon
- linlin — Conservative(보수적) 값 반환. 일반적인 순환 참조 우회에 사용
- Boundcon — Hybrid 값 반환. 벽면, CHT 인터페이스 등 경계에서 사용
우회 방법 3 — 평균 함수로 순환 끊기
변수를 CEL 수식에 직접 사용하지 않고, areaAve()나 massFlowAve() 같은 평균 함수로 감싸면 순환이 끊어지는 경우가 있습니다.
areaAve(Density)@Inlet
평균 함수는 해당 위치의 값을 먼저 집계한 후 스칼라 값으로 반환하므로, 격자점별 직접 참조에 의한 순환이 끊어집니다.
다만 이 방법은 평균값을 사용하는 것이므로, 격자점마다 원래 값을 그대로 사용해야 하는 경우에는 적용할 수 없습니다.
우회 방법 4 — Additional Variable로 변수 복사
평균 함수도 linlin 연산자도 적용할 수 없는 경우의 결정적 우회 방법입니다. Additional Variable(추가 변수)을 만들어 원본 변수의 값을 Subdomain Source로 복사한 뒤, CEL 수식에서는 복사된 변수를 참조합니다.
원리
Subdomain의 Source 항을 이용해 "(원본 - 복사본) * 큰 계수" 형태로 설정하면, 복사본이 원본 값에 수렴하도록 강제됩니다. 복사본은 Solver가 별도의 수송 방정식으로 계산하므로, 원본과의 직접적인 순환 의존이 발생하지 않습니다.
설정 절차
먼저 원본 변수와 동일한 단위의 Additional Variable을 생성합니다.
ADDITIONAL VARIABLE: CopyOfDensity
Option = Definition
Tensor Type = SCALAR
Units = [kg m^-3]
Variable Type = Specific
END
Subdomain에서 Source 항으로 원본 값을 복사합니다.
SUBDOMAIN: Subdomain 1
Coord Frame = Coord 0
Location = (전체 도메인)
SOURCES:
EQUATION SOURCE: CopyOfDensity
Option = Source
Source = (Density - CopyOfDensity) * 1000 [kg m^-3 s^-1]
Source Coefficient = 1000 [kg m^-3 s^-1]
END
END
END
이제 CEL 수식에서 Density 대신 CopyOfDensity를 참조하면 순환이 끊어집니다.
주의사항
- 결과 비교 시 Control Volume 기준의 Conservative 값으로 비교해야 합니다
- Source Coefficient가 너무 작으면 복사 정확도가 떨어지고, 너무 크면 수렴이 불안정해질 수 있습니다
- 최솟값 부근에서 미세한 차이가 발생할 수 있으나, 전체 범위와 최댓값은 거의 동일합니다
우회 방법 5 — User Fortran으로 대체
CEL로 해결이 어려운 복잡한 조건 논리는 User Fortran으로 대체할 수 있습니다.
- Fortran의 if-then-else는 조건이 거짓이면 해당 분기를 실행하지 않으므로 CEL의 양쪽 평가 문제가 없습니다
- 반복문, 배열, 파일 입출력 등 고급 기능 사용 가능
- 단, Fortran 코드 작성과 컴파일 환경 구축이 필요합니다
선택 가이드
- 변수 의존 관계가 단순 → 의존 관계 정리로 해결
- 온도 의존 물성치 순환 → linlin 연산자
- 경계조건에서 평균값이면 충분 → areaAve() 등 평균 함수
- 격자점별 원래 값이 필요 → Additional Variable 복사 기법
- 위 방법 모두 불가능 → User Fortran
결론
CEL의 재귀적 참조 에러는 원인을 이해하면 대부분 우회할 수 있습니다. linlin 연산자가 가장 간편한 해결책이고, 그래도 안 되면 Additional Variable 복사 기법이 결정적 카드입니다. CEL의 한계를 넘어서는 로직이 필요하다면 User Fortran을 고려합니다.
관련 글: ANSYS CFX CEL if문 심화 — step, min, max 활용까지
관련 글: ANSYS CFX CEL 완전 정복 — 실무에서 자주 쓰는 표현식 모음
- 테스트 환경: ANSYS CFX 2023 R1 이상
- 마지막 업데이트: 2026.03
'CFD 실무 > CFX 설정 가이드' 카테고리의 다른 글
| ANSYS CFX Immersed Solid 한계와 활용법 (0) | 2026.04.12 |
|---|---|
| ANSYS CFX 프로파일 데이터 경계조건 설정 (0) | 2026.04.04 |
| ANSYS CFX CEL if문 심화 — step, min, max 활용까지 (0) | 2026.03.31 |
| ANSYS CFX Total VS Static Pressure / Temperature (0) | 2026.03.31 |
| ANSYS CFX User Fortran PMV PPD 가이드 (0) | 2026.03.26 |