Skip to content
cfd-lab:~/ko/posts/2026-03-27-simpleFoam-pr…● online
NOTE #012DAY FRI CFD기법DATE 2026.03.27UPDATED 2026.10.19READ 3 min read#CFD-Practice#QA#OpenFOAM#SIMPLE#Convergence

[CFD Q&A] simpleFoam 압력 잔차가 수렴하지 않을 때

속도 잔차만 보고 이완을 올리면, 압력 보정은 내부 반복 8번에서 20번으로 불어난다.

지난주 simpleFoam이 반나절을 먹었다. 압력 잔차가 1e-3 아래로 안 내려갔다. 올라갔다. 메시를 먼저 의심했는데, 손댄 자리는 relaxation factor였다.

αp 슬라이더를 0.6 위로 밀면 압력 잔차 곡선이 30 iter 근처에서 다시 위로 꺾인다.

αp를 0.7 이상으로 올리면 30 iter 부근에서 잔차가 다시 튀어오른다 — simpleFoam이 발산하는 전형 패턴. 0.3 / 0.7 이 안정 기본값.

0.3 근처에 두면 같은 곡선이 200 iter까지 내려앉는다. 아래 로그의 Time=80, 초기 잔차 0.891이 그 꺾임과 같은 구간이다.

문제 상황#

OpenFOAM v2312. 2D 직사각형 채널, inlet에서 outlet. 난류 모델은 standard k-ε. 솔버는 정상 상태 simpleFoam.

처음 20에서 30 iter까지는 잔차가 내려갔다. 그 다음부터 압력만 튀었다.

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

속도는 자리를 잡는데 압력만 이상하다. 압력-속도 커플링이 흔들릴 때의 얼굴이다.

원인 분석 과정#

1단계: 메시 품질 확인#

checkMesh부터 돌렸다.

checkMesh -case .

최대 non-orthogonality 32도, max skewness 0.8. 메시를 범인으로 부르기엔 조용한 숫자다.

2단계: 경계 조건 점검#

inlet 압력은 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는 빠른 설정이다. 속도 이완을 올리면 겉보기 수렴은 빨라진다. 압력 갱신이 못 따라오면 루프가 흔들린다.

겹친 원인은 두 개다. 이완이 높았다. 초기 p에 쓰레기가 남아 있었다. 압력 보정이 속도장과 어떻게 묶이는지는 격자 무늬로 압력이 흔들릴 때의 SIMPLE 쪽에 풀어 적혀 있다.

해결책#

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 iter 부근에서 압력 잔차가 1e-4 수준까지 내려왔다. 내부 반복도 한 자릿수다.

로그가 말하는 배율#

고치기 전 Time=50에서 Ux는 0.0023에서 1.2e-5로 떨어졌다. 세 번의 내부 반복으로 약 192배다. Uy는 0.0019에서 9.8e-6으로, 약 194배다. 같은 시각의 압력은 0.412에서 0.038까지, 여덟 번에 약 11배뿐이다. 속도는 약 200배 가까이 내려갔는데 압력은 약 11배에 그친다.

Time=80은 거기서 서른 스텝 뒤다. 압력의 초기 잔차는 0.412에서 0.891로 약 2.2배가 됐다. 내부 반복은 8에서 20으로 2.5배 늘었다. 그런데 감소 배율은 0.891 나누기 0.21, 약 4.2로 오히려 줄었다. 반복을 더 시키고 덜 내려간 기록이다.

고친 뒤 Time=50의 압력은 0.089에서 0.0041로, 다섯 번에 약 22배 내려간다. Time=200에서는 3.2e-4에서 1.1e-5로, 세 번에 약 29배다. 누적 continuity는 3.4e-4에서 8.9e-6으로 약 38배 작아졌다. p 이완 0.3은 예전 0.7의 약 43%다. U는 0.9에서 0.7로, k와 epsilon은 0.7에서 0.5로 내려갔다. 압력 보정을 절반 아래로 줄인 대가로, 압력 내부 반복이 20에서 한 자릿수로 줄었다.

Time=200의 최종 잔차 1.1e-5를, 고치기 전 Time=80의 최종값 0.21과 나란히 놓는다. 0.21 나누기 1.1e-5는 약 19100이다. 같은 채널이고 같은 메시인데, 압력 이완과 초기장만 바꿨다. 메시를 다시 까기 전에 볼 숫자는 이 배율이다.

속도 내부 반복은 고치기 전이나 후나 3으로 그대로다. 바뀐 것은 압력 쪽 반복 수와 감소 배율뿐이다. Ux의 최종 잔차도 1.2e-5에서 8.3e-6으로, 같은 세 번의 반복 안에서 조금 더 내려갔을 뿐이다. 로그가 가리키는 고장은 속도 솔버가 아니다. continuity의 sum local도 4.2e-5에서 2.1e-6으로 줄었다. 4.2e-5 나누기 2.1e-6은 20이다. 누적값의 38배와 같은 방향, 다른 배율이다.

메시를 열기 전에 내리는 값#

non-orthogonality 32도와 skewness 0.8은 메시 재생성부터 할 숫자가 아니다. 먼저 내릴 값은 p 이완이다. 0.7은 압력 보정이 속도 0.9를 못 따라간 설정이었다. 첫 런은 p 0.3, U 0.7에서 본다. Time=200의 잔차가 1e-4 근처에 앉은 뒤에야 올린다.

초기 p에 남은 funkySetFields 값도 같은 런을 망가뜨렸다. internalField uniform 0으로 비우지 않으면, 이완을 내려도 입구의 쓰레기 구배가 남는다. 이완을 낮춘 해가 예전과 같은 물리인지는 따로 확인해야 한다. 이완 하나가 수렴해를 바꿔 버린 Rhie–Chow를 보면, 0.7을 0.3으로 둔 선택이 잔차 곡선 밖에까지 남는지가 다음 질문이다.

도움이 됐다면 공유해주세요.