[CFD Q&A] simpleFoam 압력 잔차가 수렴하지 않을 때
실무에서 만난 SIMPLE 알고리즘 발산 해결기 — relaxation factor 설정이 핵심이었다
지난주에 꽤 시간을 잡아먹은 문제가 있었다. simpleFoam을 돌리다가 pressure residual이 1e-3 아래로 떨어지지 않고 오히려 올라가기 시작했다. 처음엔 메시 문제인가 싶었는데, 결론은 relaxation factor였다.
문제 상황#
- 소프트웨어: OpenFOAM v2312
- 형상: 2D 직사각형 채널, inlet–outlet 경계
- 난류 모델: k-ε (standard)
- 솔버: simpleFoam (정상 상태)
처음 20~30 iteration은 잘 내려가다가 갑자기 pressure residual이 튀기 시작했다.
Time = 50
smoothSolver: Solving for Ux, Initial residual = 0.0023, Final residual = 1.2e-5, No Iterations 3
smoothSolver: Solving for Uy, Initial residual = 0.0019, Final residual = 9.8e-6, No Iterations 3
GAMG: Solving for p, Initial residual = 0.412, Final residual = 0.038, No Iterations 8
time step continuity errors : sum local = 4.2e-5, global = 1.1e-5, cumulative = 3.4e-4
...
Time = 80
GAMG: Solving for p, Initial residual = 0.891, Final residual = 0.21, No Iterations 20
velocity는 잘 수렴하는데 pressure만 계속 이상하다. 전형적인 압력-속도 커플링 불안정 패턴이다.
원인 분석 과정#
1단계: 메시 품질 확인#
일단 checkMesh부터 돌렸다.
checkMesh -case .최대 non-orthogonality 32도, max skewness 0.8 — 나쁘지 않다. 메시 문제는 아닌 것 같다.
2단계: 경계 조건 점검#
inlet에서 pressure를 zeroGradient, outlet을 fixedValue 0으로 설정했다. 이건 표준 설정이라 문제없다.
근데 초기 p 필드를 확인해보니 inlet 쪽에 이상하게 큰 값이 들어가 있었다. 처음에 funkySetFields로 뭔가 실험하다가 남은 흔적이었다.
3단계: fvSolution 확인#
// fvSolution (원래 설정)
relaxationFactors
{
fields
{
p 0.7;
}
equations
{
U 0.9;
k 0.7;
epsilon 0.7;
}
}U=0.9는 꽤 공격적인 값이다. SIMPLE에서 velocity relaxation을 높이면 수렴 속도는 빠르지만 pressure 업데이트가 따라가지 못하면 발산한다.
원인 두 가지가 겹쳤다:
- relaxation factor가 과도하게 높음
- 초기 p 필드에 잘못된 값이 남아 있음
해결책#
relaxation factor 낮추기#
// fvSolution (수정 후)
relaxationFactors
{
fields
{
p 0.3;
}
equations
{
U 0.7;
k 0.5;
epsilon 0.5;
}
}처음 실행할 때는 보수적으로 시작하는 게 맞다. 수렴이 확인되면 조금씩 올린다.
초기 p 필드 초기화#
# 0 디렉토리의 p 파일을 깨끗하게 초기화
cp 0.orig/p 0/p아니면 직접 0/p 파일 열어서 internalField uniform 0;으로 맞춰주면 된다.
// 0/p
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type zeroGradient;
}
outlet
{
type fixedValue;
value uniform 0;
}
walls
{
type zeroGradient;
}
}검증#
수정 후 다시 돌리면 이렇게 나온다.
Time = 50
smoothSolver: Solving for Ux, Initial residual = 0.0018, Final residual = 8.3e-6, No Iterations 3
GAMG: Solving for p, Initial residual = 0.089, Final residual = 0.0041, No Iterations 5
time step continuity errors : sum local = 2.1e-6, global = 4.3e-7, cumulative = 8.9e-6
Time = 200
GAMG: Solving for p, Initial residual = 3.2e-4, Final residual = 1.1e-5, No Iterations 3
200 iteration 정도에서 pressure residual이 1e-4 수준으로 안정적으로 내려왔다.
일반화된 교훈#
simpleFoam 수렴 체크리스트 — 이 순서로 확인하면 대부분 잡힌다:
-
초기 조건 먼저:
0/디렉토리의 p, U 필드가 의도한 값인지 확인. 이전 실험 잔재가 남아 있으면 반드시 초기화. -
relaxation factor 보수적으로: 첫 실행은
U=0.7, p=0.3기본값으로 시작. 수렴 확인 후 올리는 게 안전하다.prelaxation은 특히 낮게 잡아야 SIMPLE 루프가 안정된다. -
velocity 수렴 vs. pressure 수렴 분리해서 보기: U residual은 낮은데 p만 발산하면 relaxation 문제일 가능성이 높다. 둘 다 발산하면 메시나 경계 조건을 먼저 본다.
-
GAMG iteration 수 보기: 같은 iteration에서 p를 풀 때 필요한 inner iteration이 갑자기 늘어난다면 수렴 방향이 잘못된 것.
SIMPLE 알고리즘은 pressure correction 루프의 특성상 relaxation에 매우 민감하다. 첫 실행은 항상 보수적으로 — 느려도 안정적으로 수렴하는 걸 확인한 뒤에 가속하는 게 결국 빠르다.
비슷한 문제를 겪고 있다면 댓글로 환경(버전, 형상, 난류 모델)을 알려주세요. 케이스별로 다를 수 있습니다.
도움이 됐다면 공유해주세요.