Skip to content
cfd-lab:~/posts/2026-03-27-simpleFoam-pr…● online
NOTE #014DAY FRI CFD기법DATE 2026.03.27READ 6 min readWORDS 1,081#CFD실무#QA#OpenFOAM#SIMPLE#수렴

[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 업데이트가 따라가지 못하면 발산한다.

원인 두 가지가 겹쳤다:

  1. relaxation factor가 과도하게 높음
  2. 초기 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 수렴 체크리스트 — 이 순서로 확인하면 대부분 잡힌다:

  1. 초기 조건 먼저: 0/ 디렉토리의 p, U 필드가 의도한 값인지 확인. 이전 실험 잔재가 남아 있으면 반드시 초기화.

  2. relaxation factor 보수적으로: 첫 실행은 U=0.7, p=0.3 기본값으로 시작. 수렴 확인 후 올리는 게 안전하다. p relaxation은 특히 낮게 잡아야 SIMPLE 루프가 안정된다.

  3. velocity 수렴 vs. pressure 수렴 분리해서 보기: U residual은 낮은데 p만 발산하면 relaxation 문제일 가능성이 높다. 둘 다 발산하면 메시나 경계 조건을 먼저 본다.

  4. GAMG iteration 수 보기: 같은 iteration에서 p를 풀 때 필요한 inner iteration이 갑자기 늘어난다면 수렴 방향이 잘못된 것.

SIMPLE 알고리즘은 pressure correction 루프의 특성상 relaxation에 매우 민감하다. 첫 실행은 항상 보수적으로 — 느려도 안정적으로 수렴하는 걸 확인한 뒤에 가속하는 게 결국 빠르다.


비슷한 문제를 겪고 있다면 댓글로 환경(버전, 형상, 난류 모델)을 알려주세요. 케이스별로 다를 수 있습니다.

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