적응 격자 세분화

편집 역사 토론
수치해석 전산유체역학 마지막 수정: 2026-07-05 04:07:22

적응 격자 세분화
Adaptive Mesh Refinement
약칭AMR
분야수치해석 × 전산유체역학 × 전산과학
목적필요한 곳에만 격자를 조밀하게
주요 방식블록구조 AMR, 셀기반(octree) AMR
관련 기법유한체적법, 유한요소법

1. 개요[편집]

격자는 무한하지 않다. 그러나 충격파는 무한히 얇다. 이 모순을 봉합하는 기술.

적응 격자 세분화(Adaptive Mesh Refinement, AMR)는 해가 급격하게 변하는 영역에만 격자를 국소적으로 조밀하게 만들고, 완만한 영역에서는 성기게 두어 계산 자원을 몰아주는 기법이다. 충격파·경계층·화염면·물방울 표면처럼 물리량이 좁은 구간에서 폭발적으로 변하는 곳은 있는데, 그런 곳 하나 때문에 도메인 전체를 조밀하게 깔면 셀 수가 천문학적으로 늘어난다. AMR은 “필요한 곳에만 갈아 넣는다”는 지극히 상식적인 발상을 자동화한 것이다.

균일 격자로 다 덮는 방식을 흔히 brute-force라 부르는데, 3차원에서 해상도를 2배 올리면 셀 수는 8배, 시간 스텝까지 고려하면 계산량이 16배로 뛴다. CFL 조건이 조밀한 셀에서 시간 스텝을 조여버리기 때문이다. AMR은 이 저주를 국소적으로만 감당해서 같은 정확도를 훨씬 싼 값에 산다.

2. 왜 필요한가[편집]

수치해석에서 오차의 대부분은 사실 도메인의 아주 좁은 구역에서 발생한다. 매끄러운 유동 한복판에서는 셀 몇 개만 있어도 해가 잘 맞지만, 충격파 한 줄이나 소용돌이 하나가 지나가는 곳에서는 격자를 아무리 촘촘히 깔아도 부족하다. 문제는 그 “좁은 구역”이 시간에 따라 움직인다는 것. 폭발 시뮬레이션에서 충격파는 밖으로 퍼져 나가고, 카르만 와열에서 소용돌이는 하류로 떠내려간다.

그래서 AMR은 두 가지 성격을 가진다.

  • 정적 AMR: 형상 근처처럼 위치가 고정된 곳(날개 앞전, 벽면)을 미리 조밀하게 깔아두는 것. 사실상 격자 생성 단계의 국소 세분화다.
  • 동적 AMR: 계산 도중 오차가 큰 곳을 찾아 격자를 붙였다 떼었다 하는 것. 진짜 AMR이라 하면 보통 이쪽을 가리킨다.

3. 오차 지표[편집]

AMR의 심장은 “어디를 세분화할지 어떻게 결정하는가”이다. 이 판단 기준을 오차 지표(error indicator) 또는 세분화 판정자(refinement criterion)라 부른다. 대표적으로 몇 가지가 있다.

  • 기울기·곡률 기반: 밀도나 압력의 구배 ρ|\nabla \rho|가 임계값을 넘으면 세분화. 구현이 쉬워서 CFD에서 국룰처럼 쓰이지만, 물리적으로 정당화된 지표는 아니다.
  • 잔차 기반: 지배방정식을 국소적으로 만족하지 못하는 정도(residual)를 재는 방식.
  • 후험 오차 추정(a posteriori error estimation): 유한요소법 진영에서 발달한 정통파. 해 자체로부터 오차의 상계를 수학적으로 추정한다. 대표적으로 Zienkiewicz-Zhu 지표가 있다.

지표가 임계값을 넘으면 세분화(refine), 충분히 낮으면 다시 성기게(coarsen) 만든다. 이 임계값을 잘못 잡으면 온 도메인이 시뻘겋게 세분화되어 brute-force보다 느려지는 참사가 벌어진다.1

4. h-, p-, r-refinement[편집]

격자를 “정교하게 만드는” 방법은 하나가 아니다. 관례적으로 세 갈래로 나눈다.

정확도 향상=h셀 쪼개기  +  p차수 올리기  +  r점 이동\text{정확도 향상} = \underbrace{h}_{\text{셀 쪼개기}} \;+\; \underbrace{p}_{\text{차수 올리기}} \;+\; \underbrace{r}_{\text{점 이동}}
  • h-refinement: 셀을 실제로 잘게 쪼갠다. 우리가 보통 AMR이라 부르는 게 이것. hh는 격자 간격을 뜻한다.
  • p-refinement: 셀 개수는 그대로 두고 각 셀 안 기저함수의 다항식 차수 pp를 올린다. 스펙트럴 방법·스펙트럴 요소법과 궁합이 좋고, 해가 매끄러운 곳에서 지수적으로 빠르게 수렴한다.
  • r-refinement: 셀 개수도 차수도 그대로, 격자점을 오차가 큰 쪽으로 재배치(relocation)만 한다. 이동 격자(moving mesh)라고도 한다.
  • hp-adaptivity: 매끄러운 곳은 p, 불연속인 곳은 h로 — 둘을 상황에 따라 섞는 궁극기. 이론상 지수 수렴을 내주지만 구현 난이도가 살벌하다.

5. 자료 구조 — 블록이냐 트리냐[편집]

동적으로 격자를 붙였다 떼려면 자료 구조가 유연해야 한다. 크게 두 학파가 있다.

방식세분화 단위오버헤드대표 코드
블록구조 AMR정렬된 셀 블록(patch)낮음PARAMESH, BoxLib/AMReX
셀기반 octree AMR셀 하나높음p4est, 상용 CFD 다수

블록구조 AMR은 Berger와 Oliger(1984)가 제안한 원조로, 세분화가 필요한 영역을 직사각형 패치로 덮고 그 안에 정렬 격자를 얹은 뒤, 그 위에 또 더 조밀한 패치를 재귀적으로 얹는다. 정렬 격자라 연산이 빠르고 벡터화가 잘 되지만, 필요 없는 영역까지 사각형에 딸려 들어가는 낭비가 있다.

octree(3차원, 2차원은 quadtree) AMR은 셀 하나를 8개(2차원은 4개)로 재귀 분할하는 트리 구조다. 딱 필요한 셀만 쪼갤 수 있어 낭비가 없지만, 이웃을 찾을 때마다 트리를 헤매야 해서 셀당 오버헤드가 크다. 이웃한 셀의 세분화 단계 차이를 1로 제한하는 2:1 균형(2:1 balancing) 규칙이 거의 국룰인데, 이걸 안 지키면 인접 셀 간 플럭스 계산이 지옥이 된다.2

6. 실무의 함정[편집]

  • 부하 불균형: 병렬 계산에서 어떤 프로세서는 세분화된 셀 폭탄을 떠안고, 어떤 프로세서는 성긴 셀만 들고 논다. 그래서 AMR 코드는 세분화가 바뀔 때마다 셀을 재분배(load balancing)하는데, 이게 계산만큼이나 골치 아프다. 힐베르트 곡선 같은 공간 채움 곡선으로 셀을 줄 세워 나눠주는 게 정석.
  • 보존성 깨짐: 조밀-성긴 셀 경계(coarse-fine interface)에서 플럭스를 양쪽이 똑같이 계산하지 않으면 질량이 슬금슬금 새어나간다. 유한체적법에서는 이걸 막으려고 refluxing이라는 보정을 넣는다.
  • 오차 지표 튜닝: 결국 어디를 세분화할지는 사람이 임계값을 찍어줘야 하고, 이 값 하나 때문에 결과가 천차만별로 갈린다. “AMR은 자동인데 왜 파라미터를 내가 잡느냐”는 항의는 이 바닥의 오래된 밈이다.

7. 어디에 쓰이나[편집]

천체물리(초신성 폭발, 은하 충돌)에서 특히 사랑받는다. 우주는 대부분 텅 비어 있고 중요한 일은 극히 좁은 곳에서만 벌어지기 때문에, AMR과 궁합이 환상적이다. FLASH, Enzo 같은 코드가 유명하다. CFD에서는 압축성 유동의 충격파 추적, 다상유동의 계면 추적에 필수적으로 쓰이며, 연소·폭발 해석에서도 표준 장비다.

8. 관련 문서[편집]

9. Footnotes[편집]

  1. 오차 지표 임계값을 너무 낮게 잡으면 세분화 판정이 온 도메인에서 참이 되어, 결국 균일 조밀 격자 + 트리 오버헤드라는 최악의 조합이 완성된다. AMR을 켜고 오히려 느려졌다는 신입의 슬픈 후기는 대개 여기서 나온다.

  2. 2:1 균형을 어기면 한 셀 면에 이웃이 4개, 그 이웃의 이웃까지 겹쳐 플럭스 스텐실이 케이스 분기 지옥이 된다. p4est 같은 라이브러리가 존재하는 이유의 절반은 이 균형을 대신 유지해주기 때문이다.