요약
- ANSYS CFX CEL의 if문은 조건 분기의 핵심이지만, 양쪽 표현식이 항상 평가되는 치명적 특성이 있습니다.
- step(), min(), max() 함수로 if문을 대체하면 더 간결하고 안정적인 조건 처리가 가능합니다.
- 이 글은 CEL 기초를 다룬 이전 글의 후속편으로, if문 심화와 대안 함수에 집중합니다.
if문 기본 문법
CEL의 if문은 삼항 연산자와 유사한 구조입니다.
if(조건식, 참일 때 값, 거짓일 때 값)
if(Temperature > 350 [K], 1.5 [Pa s], 1.0 [Pa s])
온도가 350 K를 초과하면 1.5 Pa s, 아니면 1.0 Pa s를 반환합니다.
if문의 치명적 특성 — 양쪽 모두 평가
CEL의 if문은 조건의 참/거짓과 관계없이 참일 때 값과 거짓일 때 값을 모두 계산합니다. 일반 프로그래밍 언어의 if-else와 결정적으로 다른 점입니다.
위험한 예시
if(x > 0 [m], 1/x, 0 [m^-1])
의도는 x가 0보다 클 때만 1/x를 계산하는 것이지만, x = 0인 노드에서도 1/x가 평가되어 0으로 나누기 에러가 발생합니다.
안전한 대안
if(x > 0 [m], 1/(x + 1e-10 [m]), 0 [m^-1])
분모에 극소값을 더해 0 나누기를 원천 방지합니다. 조건으로 계산을 "피하는" 것은 CEL에서 불가능하다는 점을 반드시 기억해야 합니다.
중첩 if문 — 다중 조건 분기
CEL에는 elseif 구문이 없으므로, 여러 조건이 필요하면 if문을 중첩합니다.
3단계 온도 분기
if(Temperature > 400 [K], mu_high,
if(Temperature > 300 [K], mu_mid, mu_low))
4단계 시간 분기 (Transient)
if(t < 1.0 [s], 10 [m s^-1],
if(t < 2.0 [s], 20 [m s^-1],
if(t < 3.0 [s], 30 [m s^-1], 40 [m s^-1])))
중첩 시 주의사항
- 양쪽 평가 특성으로 중첩이 깊어질수록 불필요한 연산이 누적됩니다
- 모든 분기의 결과 값은 반드시 동일한 단위여야 합니다
- 3~4단계 이상이면 step 함수 조합을 고려합니다
논리 연산자로 복합 조건 구현
if문 안에서 논리 연산자를 사용하면 중첩 없이 복합 조건을 구현할 수 있습니다.
- && (AND), || (OR), ! (NOT)
if((x > 0.1 [m]) && (y < 0.5 [m]), 100 [W m^-3], 0 [W m^-3])
if((Temperature > 373 [K]) || (Pressure > 2e5 [Pa]), Q_high, Q_low)
step 함수 — if문의 강력한 대안
step(x)는 x >= 0이면 1, x < 0이면 0을 반환하는 Heaviside 함수입니다. 산술 연산으로 조건 분기를 구현할 수 있어, if문보다 간결합니다.
if문과 step의 등가 관계
if(x > threshold, a, b)
이것은 다음과 동일합니다:
a * step(x - threshold) + b * (1 - step(x - threshold))
특정 시간 이후 열원 적용
Q_source * step(t - 0.5 [s])
특정 온도 범위에서만 값 적용
50 [W m^-3] * step(Temperature - 300 [K]) * step(350 [K] - Temperature)
두 개의 step을 곱하면 AND 조건과 같은 효과입니다. 300~350 K 범위에서만 50 W/m3가 적용됩니다.
step의 한계
값이 0에서 1로 급격히 변하므로, 수치 불안정을 유발할 수 있습니다. 부드러운 전환이 필요하면 min/max 조합이나 램프 함수를 사용합니다.
min/max를 활용한 부드러운 조건 처리
램프 함수
V_final * min(t / t_ramp, 1 [])
t_ramp까지 선형 증가 후 V_final에서 고정됩니다.
값 범위 제한 (Clamp)
max(min(Temperature, 400 [K]), 300 [K])
온도를 300~400 K로 제한합니다. 물성치 테이블의 유효 범위를 벗어나지 않도록 할 때 유용합니다.
실무 활용 패턴
위치 + 시간 복합 조건
if((x > 0.1 [m]) && (t > 0.5 [s]), Q_source, 0 [W m^-3])
주기적 반복 조건 (Cyclic)
cycleno = int(t / 0.03 [s]) + 1
cycletime = if(cycleno > 1, t - 0.03 [s] * (cycleno - 1), t)
value = if(cycletime <= 0.01 [s], 100 [W m^-3],
if(cycletime <= 0.02 [s], 200 [W m^-3], 300 [W m^-3]))
0.03초 주기로 시간 카운터를 리셋하면서, 각 주기 내에서 3단계 조건을 적용합니다.
선택 가이드
- 단순 조건 (2~3개 분기) → if문
- 범위 On/Off → step 함수 조합
- 값 범위 제한 → min/max
- 순환 참조, 복잡한 로직 → 후속 글 참조
결론
CEL의 if문은 강력하지만, 양쪽 평가 특성을 이해하지 못하면 예상치 못한 에러에 부딪힙니다. 단순 분기는 if문으로, On/Off는 step으로, 부드러운 전환은 min/max로 처리하는 것이 실무적 접근입니다. CEL에서 발생하는 재귀적 참조(Circular Reference) 에러와 그 우회 방법은 후속 글에서 다룹니다.
관련 글: ANSYS CFX CEL 재귀적 참조 에러 우회 방법
관련 글: ANSYS CFX CEL 완전 정복 — 실무에서 자주 쓰는 표현식 모음
- 테스트 환경: ANSYS CFX 2023 R1 이상
- 마지막 업데이트: 2026.03
'CFD 실무 > CFX 설정 가이드' 카테고리의 다른 글
| ANSYS CFX 프로파일 데이터 경계조건 설정 (0) | 2026.04.04 |
|---|---|
| ANSYS CFX CEL 재귀적 참조 에러 우회 방법 (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 |
| ANSYS CFX Porous Domain 열전달 (0) | 2026.03.25 |