{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Younglin's CFD Blog (ko)",
  "home_page_url": "https://cfdblog.cc/ko",
  "feed_url": "https://cfdblog.cc/feed.json",
  "description": "CFD 엔지니어를 위한 기술 저널 — 수식, 코드, 인터랙티브 시각화",
  "language": "ko-KR",
  "authors": [
    {
      "name": "영린",
      "url": "https://cfdblog.cc/ko/about"
    }
  ],
  "items": [
    {
      "id": "https://cfdblog.cc/ko/posts/2026-05-04-implicit-diffusion-thomas-algorithm",
      "url": "https://cfdblog.cc/ko/posts/2026-05-04-implicit-diffusion-thomas-algorithm",
      "title": "음해법과 Thomas 알고리듬 — 1D 확산을 무조건 안정하게 푸는 한 줄의 트릭",
      "summary": "양해법이 폭발하는 한계 너머, 삼대각 행렬 한 번 푸는 비용으로 안정성을 산다",
      "content_text": "import { HeatDiffusionExplicitVsImplicit1D } from '@/components/post-viz/2026-05-04-implicit-diffusion-thomas-algorithm/HeatDiffusionExplicitVsImplicit1D'\n\n밤 11시에 시뮬레이션을 돌려놓고 아침에 출근한 적이 있다. 출근해서 결과 파일을 열었더니 화면이 NaN으로 가득했다. 격자를 두 배로 촘촘하게 만든 직후였고, 시간 스텝은 그대로 두었다. CFL(Courant–Friedrichs–Lewy) 조건을 깜빡한 대가는 한 시간 분량의 클러스터 비용이었다.\n\n확산 방정식의 양해법은 격자가 절반이 되면 시간 스텝을 4분의 1로 줄여야 한다. 격자 1024개짜리 문제를 풀면, 양해법은 폭발하지 않으려는 그 이유 하나로 수십만 스텝을 밟는다. 이 글은 그 함정을 한 줄로 빠져나오는 음해법(implicit method)과, 음해법의 비용을 거의 없애주는 Thomas 알고리듬(tridiagonal solver)을 다룬다. 끝에서 직접 dt를 키워보고, 양해법이 발산하는 동안 음해법은 잠잠한 모습을 본다.\n\nCFL이 묶어버린 미세 격자\n\n확산 방정식은 다음과 같다.\n\n[equation]\n\n여기서 [math]는 농도(또는 온도), [math]는 확산 계수다. 가장 단순한 양해법(forward Euler + 중심차분)은\n\n[equation]\n\n이 식이 안정하려면 [math]여야 한다. von Neumann 분석을 한 줄로 풀면, 가장 짧은 파장(파장 = [math])의 증폭 인자가 [math]이고 이것이 [math]이려면 [math]가 강제된다.\n\n문제는 이 조건이 [math]의 제곱에 묶인다는 점이다. 격자를 [math]로 만들면 [math]는 [math]이 된다. 이건 자릿수의 횡포다.\n\n미래값을 우변에 — 음해법의 단순한 트릭\n\n해결책은 어이없을 정도로 단순하다. 우변의 [math]을 [math]로 바꿔 쓴다.\n\n[equation]\n\n미래값이 우변에 있으니 한 셀씩 차례로 풀 수가 없다. 모든 셀이 동시에 결합되어 행렬 방정식이 된다.\n\n[equation]\n\n대신 보상이 크다. 같은 von Neumann 분석으로 증폭 인자는 [math]이고, 모든 [math]에서 1보다 작다. 즉 [math]를 아무리 키워도 발산하지 않는다 — 무조건 안정(unconditionally stable).\n\n대가는 정확도다. 너무 큰 [math]는 안정하지만 정확하지 않다. 그래도 \"발산하지 않는다\"는 보장은 코드를 돌리는 사람에게 정신 건강을 준다.\n\n삼대각 행렬과 Thomas의 단번 풀이\n\n행렬 [math]를 적어보자. 1차원에서는 셀 [math]가 [math]과 [math]에만 연결되므로\n\n[equation]\n\n이 행렬은 삼대각(tridiagonal)이다. 대각선 세 줄만 0이 아니다. 일반적인 가우스 소거는 [math]이지만, 삼대각이면 [math]로 끝난다. 이 알고리듬을 Thomas algorithm이라고 부른다 — 1949년 Llewellyn Thomas가 IBM 메모로 정리했다.\n\nThomas의 핵심은 두 단계다.\n\n1. Forward elimination — 대각 아래 항을 차례로 제거하면서 새로운 대각 [math]와 우변 [math]를 계산한다.\n2. Backward substitution — 마지막 행부터 거꾸로 대입한다.\n\n각 단계가 셀당 45번의 연산이고, 메모리는 세 배열만 있으면 된다. 행렬을 통째로 저장할 필요가 없다.\n\nNumPy로 본 양해/음해 비교\n\n[code block]\n\nr=0.6에서 양해법은 60스텝 만에 [math]로 폭발한다. 같은 시간 스텝에서 음해법은 매끄럽게 퍼져나간다.\n\n직접 dt를 키워보자\n\n아래 시뮬레이션에서 직접 조작해보자. 슬라이더로 [math]을 0.05부터 5까지 바꿔본다.\n\n[math]을 0.5 아래로 두면 두 곡선이 거의 겹친다. 0.5를 넘기는 순간 주황색(양해법)이 톱니로 떨리기 시작하고, 1을 넘기면 화면 밖으로 발사된다. 시안색(음해법)은 어느 [math]에…",
      "date_published": "2026-05-04T00:00:00.000Z",
      "tags": [
        "수치해석",
        "implicit",
        "diffusion",
        "Thomas-algorithm",
        "stability"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1711
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-05-03-orlando-bonaventura-ap-imex-nonideal-gas",
      "url": "https://cfdblog.cc/ko/posts/2026-05-03-orlando-bonaventura-ap-imex-nonideal-gas",
      "title": "[논문 리뷰] 음속이 ∞로 가도 시간 스텝이 살아남는다 — Orlando–Bonaventura(2024) 비이상기체 AP-IMEX",
      "summary": "저-Mach·임의 EOS에서 시간 스텝을 음속에 묶지 않는 AP-IMEX-DG 스킴 리뷰와 NumPy 재현",
      "content_text": "import { APIMEXAcousticPulse1D } from '@/components/post-viz/2026-05-03-orlando-bonaventura-ap-imex-nonideal-gas/APIMEXAcousticPulse1D'\n\n대기 모델은 Mach가 0.001이고 우주 폭발 모사는 Mach가 100이다. 하나의 솔버로 둘 다 풀고 싶다는 욕심은 50년이 넘었다. Orlando와 Bonaventura의 2024년 논문(arXiv:2402.09252v4)은 이 욕심을 비이상기체로 끌고 간다. 핵심은 두 줄. 시간 이산화에서 압력 항만 음해로 처리하면 시간 스텝이 음속에서 풀려난다. 그리고 이 풀림이 SG-EOS와 일반 입방형 EOS(Van der Waals, Peng–Robinson)에서도 깨지지 않는다.\n\n30초 정리\n\n- 저자: Giuseppe Orlando, Luca Bonaventura\n- 소속: École polytechnique / Politecnico di Milano\n- arXiv ID: 2402.09252v4 (2025-10-22 v4)\n- 타깃: 모든 Mach·임의 EOS에서 점근 보존(AP) 시간 적분\n- 공간 이산화: Discontinuous Galerkin\n- 검증: 등엔트로피 와동·Gresho 와동·RT 불안정성·천이 충격 — SG-EOS와 cubic EOS로 확장\n\n두 곳에서 부서지는 명시적 스킴\n\n명시적 시간 적분은 두 시간 스케일이 부딪히는 곳에서 두 번 깨진다.\n\n첫째는 음속이다. 압축성 Euler에서 신호는 [math]로 전파되는데, [math]가 작아지면 [math]가 [math]를 압도한다. 명시적 CFL은 [math]로 묶이고, [math]이면 시간 스텝이 100배 작아진다. 대기·해양 시뮬레이션이 이 함정에 잘 빠진다.\n\n둘째는 EOS의 비선형이다. 이상기체에서는 [math]로 끝나지만, 입방형 EOS에서는 [math]가 [math]의 비선형 함수다. 명시적 스킴이 음속을 잘못 추정하면 셀이 음압으로 떨어지고, EOS 자체가 정의되지 않는다.\n\n이 논문은 두 문제를 한 묶음으로 본다. 명시적 음향 항을 음해로 옮기면 첫 번째 함정에서 풀려나고, 그 음해 처리를 EOS 무관 형태로 적으면 두 번째도 따라온다.\n\n점근 보존이 의미하는 것\n\nAP(asymptotic-preserving)는 한 줄로 이렇다. 연속 모델 [math]이 [math]에서 극한 모델 [math]로 수렴할 때, 이산화 [math]도 같은 극한에서 [math]로 일관되게 수렴해야 한다. 안정성 조건은 [math]에 무관해야 한다.\n\n여기서 [math]은 [math]이고 [math]는 비압축성 Euler다. 익숙한 그림으로 그리면:\n\n[equation]\n\n[math]는 0차(비압축성 극한), [math]는 1차 보정, [math]는 2차 보정이다. AP 스킴이라면 이산 해도 같은 위계를 가진다.\n\n수치적 의미는 명확하다. [math]에서 측정한 압력 변동은 [math] 스케일이어야 한다. 명시적 Roe 스킴은 이걸 못 한다. 격자 해상도와 무관하게 [math] 잡음을 만든다(Guillard–Viozat, 1999). AP-IMEX는 이 스케일을 손상 없이 보존한다.\n\n압력만 음해로 — IMEX의 분리\n\n핵심 트릭은 Cordier–Degond–Kumbaro(2012)의 분리다. 운동량 방정식의 [math]만 음해로 미루고 나머지는 명해로 둔다.\n\n[equation]\n\n[equation]\n\n[equation]\n\n[math]는 밀도, [math]는 속도, [math]는 압력, [math]는 단위 질량당 총 에너지, [math]는 시간 스텝, [math]은 기준 Mach 수다.\n\n[math]이 운동량을 결합하고 그 운동량이 다시 에너지로 들어간다. 두 식을 합치면 [math]에 대한 (선형화된) 타원 방정식이 떨어진다. 푼 다음 [math], 그 다음 [math]이 명시적으로 갱신된다. 시간 스텝은 음속에서 풀려나고 이송 CFL([math])만 남는다.\n\n논문은 이 분리를 IMEX 룽게-쿠타(IMEX-R…",
      "date_published": "2026-05-03T00:00:00.000Z",
      "tags": [
        "논문리뷰",
        "asymptotic-preserving",
        "IMEX",
        "low-mach",
        "Discontinuous-Galerkin",
        "non-ideal-gas"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2318
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-05-02-muscl-thinc-bvd-interface-reconstruction",
      "url": "https://cfdblog.cc/ko/posts/2026-05-02-muscl-thinc-bvd-interface-reconstruction",
      "title": "[논문 리뷰] 둘 중 더 작은 진폭을 골라라 — Deng(2018) MUSCL-THINC-BVD 인터페이스 재구성",
      "summary": "두 후보 재구성 함수 사이의 경계 변동을 비교해 더 적은 쪽을 고르는 BVD 원리",
      "content_text": "import { MUSCLTHINCBVDPicker } from '@/components/post-viz/2026-05-02-muscl-thinc-bvd-interface-reconstruction/MUSCLTHINCBVDPicker'\n\n도쿄공업대 Xiao 그룹은 2018년에 한 번 측정해보았다. 압축성 두 상(two-phase) 시뮬레이션을 1000 스텝 돌리고 인터페이스 두께를 재 봤더니, 처음 한 셀이었던 점프가 여덟 셀로 퍼져 있었다. WENO를 써도 마찬가지였다. 디퓨전이 충분히 작아 보이는 스킴조차, 긴 시간을 누적하면 인터페이스를 무너뜨린다. 이 글은 이 문제를 풀기 위해 그들이 들고 온 답인 MUSCL-THINC-BVD 재구성을 정리한다. 핵심은 단순하다. 셀마다 두 후보를 동시에 만들고, 경계에서의 변동(jump)이 더 작은 쪽을 고르면 된다.\n\n한 페이지 요약\n\n- 저자/저널: Deng, Inaba, Xie, Shyue, Xiao. Journal of Computational Physics 371 (2018) 945–966.\n- 타깃 문제: 5-방정식 모델(five-equation model)로 푸는 압축성 두 상 유동에서 물질 인터페이스가 시간이 갈수록 흐려지는 현상.\n- 제안: 매 셀에서 MUSCL(매끈영역용)과 THINC(점프용) 두 재구성 함수를 동시에 만들고, 셀 경계에서의 점프 크기를 비교해 더 작은 쪽을 채택하는 BVD(Boundary Variation Diminishing) 알고리즘.\n- 다른 점: 후처리 anti-diffusion이나 인공 압축이 필요 없다. 부피 분율과 다른 보존 변수 모두에 같은 BVD 룰을 적용해 일관성이 자동으로 따라온다.\n\n충돌하는 두 요구\n\n압축성 두 상 유동의 수치는 두 가지를 동시에 요구한다. 매끈한 영역에서는 정확하고 적은 소산. 점프(인터페이스, 충격)에서는 단조성과 좁은 두께. 한 함수가 두 일을 다 잘하기는 어렵다.\n\nMUSCL은 선형 재구성이라 단조성을 보장하지만 1차 미분만큼만 따라간다. 인터페이스를 만나면 매번 약간씩 깎아내고, 이게 누적되면 점프가 퍼진다. 반대로 인터페이스 전용 함수인 THINC는 tanh를 fit해 점프를 한 셀 안에 가두지만, 매끈한 영역에 그대로 쓰면 가짜 계단을 만든다.\n\n이 논문의 출발점은 \"둘을 합쳐서 하나로 만들지 말고, 그냥 셀마다 둘 중 하나를 골라쓰자\"라는 결정이다.\n\nMUSCL — 신뢰할 수 있는 디퓨저\n\n기준이 되는 후보는 minmod 슬로프 리미터를 쓴 MUSCL이다.\n\n[equation]\n\n여기서 [math]는 셀 평균, [math]는 셀 중심에서의 슬로프, minmod는 두 차분 중 부호가 같으면 작은 쪽을, 부호가 다르면 0을 돌려주는 리미터다.\n\n이 후보의 셀 경계 값:\n\n[equation]\n\n전체 영역에서 안전하게 작동한다. 진동은 없지만, 점프 영역에서 두께가 천천히 벌어진다.\n\nTHINC — 점프를 흉내내는 단조함수\n\nTHINC(Tangent of Hyperbola for INterface Capturing)는 셀 안에서 점프를 hyperbolic tangent로 fit한다.\n\n[equation]\n\n[math]는 이웃 셀 평균에서 잡은 최소·진폭, [math]는 점프 방향, [math]는 점프 두께를 조절하는 파라미터, [math]는 점프 중심으로 셀 평균이 보존되도록 풀어 결정한다.\n\n[math] 값은 1.4–2.0 사이가 안정적이다. 1.6이 표준이다. 너무 크면 단일 셀에 점프가 갇혀 좋아 보이지만, 매끈한 영역에 잘못 적용되면 톱날 모양 가짜 점프가 생긴다.\n\nBVD — 두 후보 사이의 변동 재기\n\n이제 핵심 아이디어. 두 후보가 있으면, 인접 셀의 재구성 결과와 셀 경계에서 만나서 어느 쪽이 더 작은 점프를 만드는지를 본다. 셀 [math]에서의 총 경계 변동(Total Boundary Variation, TBV) 은 다음과 같이 정의된다.\n\n[equation]\n\n[math]는 후보(MUSCL 또는 THINC). 양쪽 이웃은 일단 MUSCL로 고정하고, 가운데 셀이 두 후보 …",
      "date_published": "2026-05-02T00:00:00.000Z",
      "tags": [
        "논문리뷰",
        "compressible-multiphase",
        "MUSCL",
        "THINC",
        "BVD",
        "interface-capturing"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2492
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-05-01-burgers-characteristics-shock-formation",
      "url": "https://cfdblog.cc/ko/posts/2026-05-01-burgers-characteristics-shock-formation",
      "title": "특성선이 부딪히면 충격파가 태어난다 — 버거스 방정식과 (x,t) 평면",
      "summary": "비선형 자기전파가 어떻게 곡선을 충격으로 부수는가",
      "content_text": "import { BurgersShockBirth } from '@/components/post-viz/2026-05-01-burgers-characteristics-shock-formation/BurgersShockBirth'\n\n1948년, 네덜란드 물리학자 J. M. Burgers는 난류의 모형으로 단 한 줄짜리 방정식을 던졌다. 매끈한 곡선이 외부 힘 없이도, 유한한 시간 만에 수직으로 깎이며 충격파가 되는 — 비선형 쌍곡 PDE의 가장 짧은 드라마. 이 글은 특성선(characteristic, 정보가 흐르는 시공간 곡선)의 기하학으로 충격파의 탄생 시각을 손으로 계산하고, 약해(weak solution, 미분 가능성이 깨진 곳에서 적분형으로 정의되는 해)가 어떻게 다중값을 한 줄로 자르는지 정리한 뒤, Python 60줄로 같은 그림을 재현한다. 마지막엔 직접 직선이 부딪히는 (x,t) 평면을 만질 수 있다.\n\n직선들이 같은 점에서 만난다\n\n쌍곡 방정식의 본질은 신호 전파다. 정보가 특성선을 따라 일정한 속도로 흐르는 한 모든 게 평화롭다. 선형 advection [math]에서 [math]가 상수면 특성선은 평행한 직선이고, 초기 모양이 그대로 옆으로 이동한다. 이 그림에는 충격파가 들어설 자리가 없다.\n\n비선형성이 등장하는 순간 모든 게 달라진다. [math]가 [math] 자체에 의존하면, 큰 값은 빠르게, 작은 값은 느리게 간다. 빠른 값이 느린 값을 추월하는 순간 (x,t) 평면 한 점에 두 개의 정보가 동시에 도착한다. 함수 값이 다중값(multi-valued)이 되는 순간, 즉 물리적으로 말이 안 되는 그 순간이 바로 충격파의 탄생이다.\n\n자기 자신을 운반하는 방정식\n\n버거스 방정식의 보존형은 다음과 같다.\n\n[equation]\n\n[math]는 보존되는 스칼라, [math]는 플럭스다. 체인룰을 풀면 비보존형이 된다.\n\n[equation]\n\nadvection 속도 [math]. 자기 자신이 자기 자신을 운반하는 구조다. 이 비선형성이 모든 드라마의 출발점이다. 자코비안 [math]가 양수인 곳에선 신호가 오른쪽으로, 음수인 곳에선 왼쪽으로 간다. 부호가 자리마다 다른 초기 분포는 — 사인 곡선처럼 — 빠른 곳이 느린 곳을 따라잡게 만든다.\n\n특성선이 그리는 (x,t) 평면\n\n특성선은 [math]를 만족하는 곡선이다. 그 위에서 동행 미분 [math]가 0이므로, [math]는 특성선을 따라 출발 값으로 동결된다. 결국 특성선은 (x,t) 평면에서 기울기 [math]의 직선이다. 출발점 [math]의 초기 값 [math]가 그 직선의 속도가 된다.\n\n초기 조건이 [math]일 때:\n\n- 봉우리([math])에서 출발한 직선은 빠르게 오른쪽으로 기운다\n- 골짜기([math]에서 직진 해석은 한 점에 세 개의 [math]를 동시에 토해낸다. 물리적으로 불가능하다. 해법은 약해다. 미분형 대신 적분 보존형으로 정의를 약화시킨다.\n\n[equation]\n\n이 식은 [math]가 미분 불가능해도 — 즉 불연속이어도 — 의미가 있다. 두 평탄 상태 [math], [math]이 충격으로 연결되어 속도 [math]로 전파된다고 두면 다음이 따라온다.\n\n[equation]\n\n이것이 Rankine–Hugoniot 조건이다. 충격 속도는 두 상태의 산술 평균이다. 이 조건이 다중값 영역을 한 줄로 자르고, 자른 양쪽 면적이 같도록 — 흔히 \"equal area rule\"이라 부른다 — 만든다.\n\n추가로 entropy 조건이 필요하다. [math]일 때만 충격이 물리적이고, [math]A[math]t^[math]k[math]\\Delta t \\le \\Delta x / \\max|q|[math]q$가 국소적으로 커질 수 있으므로 더더욱 그렇다.\n\n(2) Entropy 잘못 잡기. Rankine–Hugoniot만 만족시키면 비물리적인 expansion shock도 답이 된다. Roe 같은 단순 선형화 스킴은 transonic rarefaction(부채꼴이 0을 가로지를 때) 영역에서 \"entropy glitch\"를 만든다. Go…",
      "date_published": "2026-05-01T00:00:00.000Z",
      "tags": [
        "Burgers",
        "hyperbolic",
        "shock",
        "characteristics",
        "수치해석"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2288
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-30-cavitation-number-vapor-pressure",
      "url": "https://cfdblog.cc/ko/posts/2026-04-30-cavitation-number-vapor-pressure",
      "title": "20도의 물도 끓는다 — 캐비테이션의 물리",
      "summary": "감압이 만드는 끓음, 캐비테이션 수, 거품 폭축의 충격",
      "content_text": "import { VenturiCavitationFlow } from '@/components/post-viz/2026-04-30-cavitation-number-vapor-pressure/VenturiCavitationFlow'\n\n물은 20°C에서도 끓는다. 압력만 충분히 낮추면. \"물의 비등점은 100°C\"라는 외움은 사실 1기압이라는 단서가 빠진 반쪽 진실이다. 끓음을 결정하는 건 온도가 아니라 포화 증기압과 주변 압력의 균형이다. 펌프 날개 입구나 선박 프로펠러 끝에서 물이 가속되어 정압이 떨어지면, 상온의 물도 갑자기 끓는다. 이것이 캐비테이션(cavitation, 공동현상) 이다. 이 글은 캐비테이션이 왜 시작되는지, 한 숫자로 어떻게 위험을 재는지, 거품이 사라지면서 1만 기압 충격이 어떻게 솟는지 정리한다. 마지막엔 벤투리 관에서 캐비테이션 영역을 찾는 짧은 Python 코드와 직접 만질 수 있는 시뮬레이터가 있다.\n\n끓는점은 온도가 정하지 않는다\n\n물의 포화 증기압은 온도의 함수다.\n\n| 온도 | 포화 증기압 [math] |\n|---|---|\n| 20°C | 2.34 kPa (≈ 17.5 mmHg) |\n| 60°C | 19.9 kPa |\n| 100°C | 101.3 kPa (≈ 760 mmHg) |\n| 200°C | 1554 kPa (≈ 15 atm) |\n\n100°C가 특별한 건 그 온도에서 [math]가 1기압과 같아지기 때문이다. 압력솥(약 2 atm)에서는 비등점이 120°C로 올라가고, 에베레스트 정상(0.3 atm)에서는 70°C에서 끓는다.\n\n같은 논리를 거꾸로 돌리면: 20°C 물을 끓이고 싶다면 외기압을 1/40로 낮추면 된다. 약 2.5 kPa. 진공 펌프 한 대만 있으면 부엌에서도 미지근한 물을 끓일 수 있다.\n\n문제는 흐르는 물에서는 진공 펌프가 따로 필요하지 않다는 점이다.\n\n흐름이 만드는 저압 — Bernoulli의 그늘\n\n비점성·정상 유동에서 한 유선을 따라 베르누이 방정식이 성립한다.\n\n[equation]\n\n[math]는 정압, [math]는 밀도, [math]는 속도, [math]는 높이다. 같은 높이라면 속도가 빨라지는 곳에서 정압이 떨어진다. 단면이 좁아지는 벤투리 목, 익형의 흡입면, 펌프 임펠러 입구 — 흐름이 가속되는 모든 지점에서 압력이 같이 내려간다.\n\n극단적으로, 정압이 작동 온도의 [math] 아래로 떨어지면 액체가 더 이상 액체로 머무를 수 없다. 분자 사이의 인장 결합이 끊어지고, 미세한 가스 핵(nucleus)을 씨앗 삼아 증기 거품이 폭발적으로 자란다. 이것이 캐비테이션의 출생 순간이다.\n\n핵심은 한 줄. 캐비테이션은 가열이 아니라 유체역학적 감압으로 시작된 끓음이다.\n\n캐비테이션 수 σ — 한 숫자로 위험을 잰다\n\n설계자는 \"이 펌프가 캐비테이션을 일으키는가\"라는 질문을 한 무차원수로 환원한다. 캐비테이션 수다.\n\n[equation]\n\n[math]는 기준 위치의 정압, [math]는 기준 속도, [math]는 작동 온도의 포화 증기압이다. 분자는 \"증기압 위에 남은 압력 여유분\", 분모는 \"흐름이 만들어낼 수 있는 동압의 한도\".\n\n[math]가 클수록 안전하다. 흐름이 아무리 가속돼도 동압을 다 써서는 증기압을 못 뚫기 때문이다. [math]가 임계값 [math] 아래로 내려가면 캐비테이션이 시작된다(initiation). 익형이나 임펠러 형상마다 [math]가 다르고, 보통 풍동·수동 실험으로 측정한다.\n\n실무에서는 펌프 흡입측의 NPSH(net positive suction head) 가 같은 역할을 한다. NPSH가 부족하면 곧 [math]가 작은 것이고, 펌프가 끓는다.\n\n거품의 죽음 — 1만 기압 충격\n\n캐비테이션이 거품을 만드는 데서 끝났다면 큰 문제가 아닐 것이다. 진짜 파괴는 거품이 사라질 때 일어난다.\n\n거품은 저압 구간을 지나 압력이 회복되는 영역으로 휩쓸려 내려간다. 거기서 거품 내부의 증기가 액체에 갑자기 짓눌린다. 구형 거품의 반경 [math] 진화는 Rayleigh–Plesset 방정식이 기술한다.\n\n[equation]\n…",
      "date_published": "2026-04-30T00:00:00.000Z",
      "tags": [
        "유체역학",
        "Cavitation",
        "Multiphase",
        "Bernoulli",
        "유동현상"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2297
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-29-sph-meshfree-particle-hydrodynamics",
      "url": "https://cfdblog.cc/ko/posts/2026-04-29-sph-meshfree-particle-hydrodynamics",
      "title": "SPH 입자법으로 유체 풀기 — 커널부터 인공 점성까지",
      "summary": "격자 없이 입자로 유체 방정식을 푸는 SPH의 원리, 코드, 함정",
      "content_text": "import { SPHParticleDrop2D } from '@/components/post-viz/2026-04-29-sph-meshfree-particle-hydrodynamics/SPHParticleDrop2D'\nimport { SPHKernelShapeExplorer } from '@/components/post-viz/2026-04-29-sph-meshfree-particle-hydrodynamics/SPHKernelShapeExplorer'\n\n1992년 Joe Monaghan은 천체물리 리뷰 논문에서 한 가지 도발을 던졌다. 별을 시뮬레이션할 때 격자를 깔지 말자는 제안이었다. 대신 가스 한 덩어리를 입자 수천 개로 흩뿌리고, 입자가 서로의 영역에 겹치는 만큼 압력을 주고받게 한다. 이렇게 만들어진 SPH(Smoothed Particle Hydrodynamics)는 30년이 지난 지금 천체물리, 자유 표면 유동, 충돌 시뮬레이션에서 중요한 한 자리를 차지하고 있다. 이 글은 SPH의 핵심 수식 4개와 자주 빠지는 함정을 추적하고, 브라우저에서 직접 입자가 흩어지는 모양을 만져볼 수 있도록 정리한다.\n\n격자가 없는 유체 — SPH의 출발점\n\n격자(Eulerian) 방법은 공간을 고정해 두고 그 위를 흐름이 지나가는 모습을 본다. SPH는 반대다. 좌표축을 흐름에 묶어 두고, 각 입자가 자기 위치에서 속도와 밀도를 들고 다닌다. 라그랑주 표현에서 연속 방정식과 운동량 방정식은 다음과 같다.\n\n[equation]\n\n여기서 [math]는 밀도, [math]는 속도, [math]는 압력, [math]는 중력이다. 입자를 따라가면 좌변의 시간 미분이 단순한 dt가 된다. 문제는 우변의 공간 미분이다. 격자처럼 규칙적인 이웃이 없으니 [math]를 어떻게 계산할 것인가가 SPH의 출발점이다.\n\n커널 W(r, h) — 입자가 만드는 가상의 부피\n\n해법은 합성곱이다. 입자 [math] 주변에 종(bell) 모양 함수 [math]를 두고, 어떤 장 [math]를 이웃 입자의 합으로 근사한다.\n\n[equation]\n\n[math]는 입자 질량, [math]는 밀도, [math]는 평활화 길이(smoothing length)다. [math]는 입자 [math]가 차지한 부피로 해석한다. 미분도 마찬가지다 — [math]. 격자 미분이 커널 미분으로 옮겨갔다.\n\n커널은 두 가지 조건을 만족해야 한다. 적분이 1이고, [math]이면 디락 델타로 수렴한다. 가장 자주 쓰는 형태는 [math]r  0 else (-1.0 if r = 2  h:\n                continue\n            grad = cubicsplinedW(r, h)\n            a[i] -= m  (p[i] / rho[i]  2 + p[j] / rho[j]  2)  grad\n            vij = v[i] - v[j]\n            if vij  r \n\n강성 [math]를 높이면 더 강하게 비압축성을 흉내내지만 음속이 커져 시간 스텝이 작아져야 한다. 점성 [math]를 0으로 두면 입자가 서로 뚫고 지나는 인터펜트레이션 줄무늬가 생긴다 — 인공 점성이 왜 필요한지 시각으로 와닿는 순간이다.\n\nSPH가 잘 못 푸는 영역\n\n밝은 면이 있으면 어두운 면도 있다. SPH는 강한 전단 흐름에서 수치 점성이 폭발해 물리 점성을 압도한다. 입자 분포가 클러스터링되면 등방성이 깨져 표면 텐션 같은 미세 효과를 잡기 어렵다. 균일하지 않은 평활화 길이 [math]를 도입하면 적응성은 좋아지나 운동량 보존에 추가 보정항이 필요하다(Springel & Hernquist 2002의 [math] 항). 또 자유 표면에서 밀도가 갑자기 줄어 압력이 음수가 되면 표면이 떨리는 tensile instability가 생긴다 — XSPH나 [math]-SPH 같은 처방이 이 문제를 다룬다.\n\n마지막에 남기고 싶은 것\n\n세 줄로 압축한다. 첫째, SPH는 격자 미분을 커널 미분으로 옮긴 라그랑주 합 솔버다. 둘째, 압력 항을 대칭화하지 않으면 운동…",
      "date_published": "2026-04-29T00:00:00.000Z",
      "tags": [
        "SPH",
        "Meshfree",
        "Lagrangian",
        "Multiphase",
        "Astrophysics"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2302
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-28-rankine-vortex-helmholtz",
      "url": "https://cfdblog.cc/ko/posts/2026-04-28-rankine-vortex-helmholtz",
      "title": "회오리의 두 얼굴 — 자유와동·강제와동, 그리고 헬름홀츠",
      "summary": "욕조 회오리부터 토네이도까지, 와동과 와도의 진짜 의미",
      "content_text": "import { RankineVortexExplorer } from '@/components/post-viz/2026-04-28-rankine-vortex-helmholtz/RankineVortexExplorer'\n\n욕조 마개를 뽑으면 물이 빙글빙글 돈다. 우리는 그 광경을 \"물이 회전한다\"고 부른다. 그런데 유체역학자는 그 영역 대부분에 대해 \"거기서는 회전이 일어나지 않는다(irrotational)\"라고 답한다. 모순처럼 들리는 이 진술에 와동(vortex)의 정체가 숨어 있다. 이 글은 같은 그림 안에 공존하는 자유와동(free vortex, [math] 속도)과 강제와동(forced vortex, [math] 속도)을 갈라보고, 와도(vorticity, 자전 각속도의 두 배)가 정확히 무엇을 재는지 짚은 뒤, 헬름홀츠(Helmholtz) 정리가 왜 와동을 \"불멸\"이라 부르는지까지 따라간다.\n\n욕조 회오리는 정말 '회전'인가\n\n답부터 적자. 회전이란 단어에 두 의미가 섞여 있다. 첫째는 공전 — 어떤 점을 중심으로 원운동을 한다. 둘째는 자전 — 입자 자신이 돌고 있다. 욕조 회오리에서 물 입자는 공전한다. 그러나 자전은? 마개에서 멀리 떨어진 영역에서는 거의 일어나지 않는다. 떠 있는 작은 나뭇잎은 빙글빙글 도는 길을 따라가지만, 자기 자신을 회전시키지는 않는다. 항상 같은 면이 마개를 향한다.\n\n유체역학에서 \"회전\"은 자전을 의미한다. 그래서 자유와동에서는 모든 영역이 \"회전 없음\"으로 분류된다.\n\n강제와동과 자유와동: 같은 그림, 다른 영혼\n\n회전 원통에 든 물을 오래 저으면 액체 전체가 강체처럼 함께 돈다. 이를 강제와동이라 부른다. 입자는 공전하면서 동시에 자전한다.\n\n[equation]\n\n여기서 [math]는 접선 속도, [math]는 강체 회전의 각속도, [math]은 중심으로부터의 거리다. 속도가 거리에 비례한다.\n\n반대로 점성을 무시한 이상 유체에서 자연스럽게 만들어지는 회오리는 자유와동(=포텐셜와동)이다.\n\n[equation]\n\n[math]는 순환(circulation, 닫힌 경로를 따라 적분한 속도). 속도가 [math]로 감소한다. 중심에서는 무한대로 발산한다 — 이 특이점을 점성이 길들인다.\n\n| | 강제와동 | 자유와동 |\n|---|---|---|\n| 속도 | [math] | [math] |\n| 자전 | 있음 | 없음 |\n| 에너지 공급 | 외부에서 계속 | 처음 한 번만 |\n| 일상 예 | 회전 컵의 물 | 욕조·토네이도 |\n\n같은 원운동인데 자전 여부가 다르다. 이 차이를 정량화하는 단 하나의 양이 와도다.\n\n와도가 측정하는 것\n\n와도 [math]는 속도장의 회전(curl)이다.\n\n[equation]\n\n2차원에서는 [math] 성분만 살아남아\n\n[equation]\n\n가 된다. [math]는 각각 [math] 방향 속도. 이 값은 유체 입자 자전 각속도의 두 배다.\n\n강제와동에 대입하면 [math]로 일정 — 영역 전체가 자전한다. 자유와동에 대입하면 중심 한 점을 빼고 어디서나 [math]이다. 모양은 똑같이 둥근 흐름인데, 자전 정도는 정반대다.\n\n랭킨 조합와동 — 토네이도의 청사진\n\n현실의 회오리는 한쪽만 따르지 않는다. 중심 부근에서는 점성이 강해 강체처럼 돌고, 멀리서는 점성이 무시되어 자유와동을 따른다. 이 둘을 이은 모형이 랭킨 조합와동이다.\n\n[equation]\n\n[math]은 코어 반지름, [math]는 코어 경계에서의 최대 접선 속도. 두 식은 [math]에서 매끈하게 이어진다. 토네이도의 풍속 분포, 비행기 날개 끝에서 떨어지는 wing-tip 와동, 욕조 흡입 와동이 모두 이 형태에 가깝다. 코어 안은 회전 영역, 코어 밖은 비회전 영역이다.\n\n헬름홀츠 정리 — 와동의 불멸\n\n점성을 무시하면 유체 입자에 작용하는 힘은 압력뿐이고, 압력은 입자 중심을 향하므로 자전을 만들지 못한다. 그래서 자전이 없는 입자는 영원히 자전하지 않고, 자전을 시작한 입자는 영원히 자전한다. 이것이 헬름홀츠 와동 정리의 한 줄 요약이다.\n\n좀 더 정밀하게는 켈빈(Kelvin) 정리가 …",
      "date_published": "2026-04-28T00:00:00.000Z",
      "tags": [
        "Vortex",
        "Vorticity",
        "유체역학",
        "유동현상",
        "Helmholtz"
      ],
      "_reading_time": "4 min read",
      "_word_count": 2222
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-27-amr-quadtree-cell-refinement",
      "url": "https://cfdblog.cc/ko/posts/2026-04-27-amr-quadtree-cell-refinement",
      "title": "쿼드트리 AMR — 격자가 스스로 자라게 두는 법",
      "summary": "Berger–Oliger 이래 40년의 적응 격자 자료구조와 refinement 기준 정리",
      "content_text": "import { AMRQuadtreeRefinement } from '@/components/post-viz/2026-04-27-amr-quadtree-cell-refinement/AMRQuadtreeRefinement'\n\n1984년, Stanford의 Marsha Berger와 Joseph Oliger는 충격파를 추적하는 일에 매달려 있었다. 그들의 코드는 셀 100만 개를 깔아두고도 충격파 근처 1%의 셀만 의미 있는 일을 했다. 나머지 99%는 균일한 자유류(free-stream)를 정밀하게 재계산하고 있었다. 두 사람이 그해 Journal of Computational Physics에 낸 논문이 Berger–Oliger AMR의 시작이었고, 같은 아이디어가 오늘 OpenFOAM의 dynamicRefineFvMesh, AMReX, Chombo, p4est 안에 살아 있다. 이 포스트는 그 핵심인 쿼드트리 자료구조와 refinement 기준을 따라가고, 1D 코드를 직접 돌린 뒤 브라우저에서 격자가 갈라지는 모습을 본다.\n\n균일 격자가 90% 손해를 보는 이유\n\n3D 압축성 RANS를 한 번이라도 돌려본 사람은 안다. 격자를 절반으로 줄이면 스텝당 비용은 8배 줄어들지만, 충격파·전단층(shear layer)·박리(separation)처럼 경사가 큰 영역의 해상도도 같이 무너진다. 거꾸로 그 영역에 맞춰 전체 격자를 잘게 쪼개면 자유류 셀까지 같이 작아져 메모리·시간이 함께 폭발한다.\n\n해법은 단순하다. 필요한 곳만 잘게. 정량적으로는 다음 비율을 기억하면 충분하다.\n\n[equation]\n\n여기서 [math]은 최대 refinement 레벨, [math]는 잘게 풀어야 할 영역의 부피, [math]은 전체 도메인 부피다. 충격파처럼 1차원 곡면 특이점이라면 [math] 정도로 작아지므로, 레벨 5 균일 대비 셀 수가 한 자릿수 퍼센트로 떨어진다.\n\nh-, p-, r-: 적응의 세 갈래\n\n적응 격자(adaptive mesh, 해의 분포에 따라 자체적으로 변하는 격자)는 어디를 바꾸느냐에 따라 셋으로 나뉜다.\n\n- h-adaptivity: 셀 크기 [math]를 줄인다. 가장 직관적이고 가장 흔히 쓰인다. AMR이라고 하면 보통 이 의미다.\n- p-adaptivity: 셀 크기는 그대로 두고 다항식 차수 [math]를 올린다. DGM·SEM(spectral element method) 계열에서 많이 본다.\n- r-adaptivity (relocation): 셀 개수와 차수를 그대로 두고 절점을 경사 큰 쪽으로 옮긴다. 메모리 변동이 없어 매력적이지만 격자 비틀림 관리가 까다롭다.\n\n이 글은 가장 많이 쓰이는 h-AMR, 그중에서도 2D 쿼드트리(3D면 옥트리)에 집중한다.\n\n쿼드트리: 격자가 자기 자식을 갖는 자료구조\n\n균일 격자는 1차원 배열만 있으면 된다. 적응 격자는 트리가 필요하다. 한 셀이 refine되면 네 개의 자식 셀이 생기고, 각 자식은 자기 부모를 가리킨다. 자식이 다시 refine되면 손자가 생긴다.\n\n[code block]\n\nsplit을 부를 때 자식의 초기값을 부모와 같게 두는 것은 보존성 때문이다. 부모 셀의 적분량 [math]가 네 자식의 합과 같아야 한다. 단순 복제는 정확도 1차의 보간이며, 실무에서는 부모의 미분(slope)을 함께 사용하는 MUSCL 형태 보간이 자주 쓰인다.\n\n어디를 자를지 결정하기 — refinement criterion\n\n쿼드트리 자체는 비어 있는 컨테이너다. 핵심은 어느 셀을 자를 것인가, 즉 refinement criterion이다. 실무에서 자주 쓰이는 다섯 가지를 정리한다.\n\n| 기준 | 수식 | 잡는 것 |\n|---|---|---|\n| 1차 미분 | [math] | 충격파, 전단층 |\n| 2차 미분 | [math] | 곡률 큰 영역 |\n| Hessian Frobenius | [math] | 등방성 평가 |\n| Richardson 추정 | [math] | 진짜 이산화 오차 |\n| 물리 임계 | [math] | 와류 코어 |\n\nOpenFOAM의 dynam…",
      "date_published": "2026-04-27T00:00:00.000Z",
      "tags": [
        "AMR",
        "쿼드트리",
        "메시",
        "알고리즘",
        "수치해석"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2582
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-26-casulli-walters-unstructured-shallow-water",
      "url": "https://cfdblog.cc/ko/posts/2026-04-26-casulli-walters-unstructured-shallow-water",
      "title": "[논문 리뷰] 폭풍이 오기 전에 끝내야 하는 시뮬레이션 — Casulli–Walters(2000) 비정렬 직교 격자 천수방정식",
      "summary": "큰 시간 스텝에서도 발산하지 않는 반음해 천수 알고리즘",
      "content_text": "import { ShallowWaterCasulli1D } from '@/components/post-viz/2026-04-26-casulli-walters-unstructured-shallow-water/ShallowWaterCasulli1D'\n\n함부르크의 BAW 연구소가 1990년 6월의 13일치 Jade–Weser 강어귀 조위를 재현해야 했다. 격자는 비정렬 삼각형 15만 개, 시간 스텝은 5분, 실시간 이상 빠르게 끝나야 다음 해석에 시간이 남는다. 명시적 솔버를 쓰면 자유표면파의 셀러리티 [math] 가 CFL을 좌우하는데, 깊이 28 m 영역에서 [math] m/s, 가장 작은 셀의 한 변이 [math] m이면 허용 시간 스텝은 0.2초 — 13일을 풀려면 560만 스텝이다. 이 포스트는 이 벽을 부수기 위해 Casulli와 Walters(2000)가 제시한 반음해 비정렬 직교 격자 알고리즘을 따라가고, 1D 축약판을 직접 돌려본다. 결론부터 말하면, 핵심은 \"압력 항만 음해로 풀고, 그 결과 떨어지는 시스템이 SPD라서 PCG로 풀린다\"이다.\n\n논문 메타데이터\n- 저자: Vincenzo Casulli (Univ. of Trento), Roy A. Walters (USGS)\n- 학술지: International Journal for Numerical Methods in Fluids, 32, 331–348 (2000)\n- 제목: \"An unstructured grid, three-dimensional model based on the shallow water equations\"\n- 키워드: semi-implicit, shallow water, unstructured orthogonal grid, wetting/drying\n\n명시적 솔버가 강어귀를 못 푸는 이유\n\n천수방정식의 자유표면파는 빠르다. 깊이 10 m면 [math] m/s, 깊이 100 m면 [math] m/s. 흐름 속도 [math] 자체는 보통 1 m/s 미만이라, 현상의 시간 스케일은 [math] 인데 명시적 시간 스텝은 [math] 로 묶인다. 둘의 비가 [math] 이니, 명시적 솔버는 흐름 한 번 흐르는 데 필요한 시간보다 1030배 잘게 시간을 잘라야 한다.\n\n여기에 비정렬 격자가 들어오면 상황이 더 나빠진다. 강어귀 격자에는 폭이 다른 셀이 섞이고, 셀 한 칸이 전역 시간 스텝을 결정한다. Big Lost River 격자는 1.2 km × 1 km 영역에 1.26만 개 삼각형, 가장 작은 변이 약 5 m이므로 명시적 한계는 0.5초쯤이다.\n\n해법은 \"느린 항은 명시, 빠른 항은 음해\"다. 자유표면 압력 구배만 음해로 처리하면, 자유표면파의 셀러리티가 안정성에서 사라진다.\n\n직교 비정렬 격자 — Voronoi–Delaunay의 짝\n\n비정렬 격자에 유한차분을 그대로 적용하면 두 가지 문제가 터진다. 하나는 셀 사이 거리가 셀 모양에 따라 달라지므로 구배 근사에 비대칭이 생긴다. 다른 하나는 곡선 좌표 변환이 새로운 항을 만들어 정확도와 안정성을 깨뜨린다.\n\nCasulli와 Walters는 우회로를 택했다. 직교 비정렬 격자(orthogonal unstructured grid) — 두 인접 셀의 중심점을 잇는 선분이 그들이 공유하는 변과 직교하는 격자. Voronoi 다각형과 그 쌍대인 Delaunay 삼각분할이 정확히 이 조건을 만족한다(예각 삼각형으로만 이루어진 경우).\n\n직교 조건이 주는 선물은 분명하다. 변에 수직 성분 [math] 만 정의하면, 자유표면 압력 구배 [math] 이 단순한 차분 [math] 로 떨어진다. 곡률 보정 없이도 일관된 이산화가 가능하다.\n\n반음해 분리: θ 방법으로 두 시간 스케일 떼기\n\nCasulli의 θ 방법은 시간 적분을 implicitness factor [math] 로 매개화한다. 모멘텀 식에서 자유표면 구배를 [math] 으로, 자유표면식에서 속도를 [math] 으로 둔다.\n\n이산화된 모멘텀(수직 점성과 풍응력 포함):\n\n[equation]\n\n여기서 [math] 는 변 [math] 에서의 수직 …",
      "date_published": "2026-04-26T00:00:00.000Z",
      "tags": [
        "논문리뷰",
        "shallow-water",
        "semi-implicit",
        "unstructured-grid"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2370
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-25-teno-low-dissipation-shock-capturing",
      "url": "https://cfdblog.cc/ko/posts/2026-04-25-teno-low-dissipation-shock-capturing",
      "title": "[논문 리뷰] WENO가 작은 와류를 뭉갤 때 — Fu(2019) TENO 저소산 유한체적 기법",
      "summary": "5차 WENO-JS가 스무드 영역에서도 과도하게 소산하는 이유와, TENO가 샤프 컷오프로 이를 해결하는 방법",
      "content_text": "import { TENOvsWENOAdvection1D } from '@/components/post-viz/2026-04-25-teno-low-dissipation-shock-capturing/TENOvsWENOAdvection1D'\n\nStanford Turbulence Research Center에서 Lin Fu가 난류 직접수치모사를 돌리다가 이상한 걸 발견했다. 5차 WENO-JS가 충격파를 잘 잡는 건 좋았는데, 충격파에서 멀리 떨어진 작은 와류도 시간이 지나면서 함께 흐릿해졌다. 스킴은 5차 정확도라고 광고했지만 실제로 얻는 해상도는 3차 중심 차분 수준이었다. 이 포스트는 그 원인을 짚은 Fu(2019) 논문을 리뷰하고, WENO-JS와 TENO-5를 같은 초기조건으로 직접 돌려 비교한다. 250자만 읽고 접어도 결론은 \"비선형 가중치의 연속성이 실제로는 비용이었다\"다.\n\n논문 정보\n\n- 저자: Lin Fu (Stanford Turbulence Research Center)\n- 학술지: Computer Physics Communications 235 (2019) 25–39\n- DOI: 10.1016/j.cpc.2018.10.009\n- 키워드: TENO, High-order schemes, Shock-capturing, Low-dissipation, Finite-volume method\n\nWENO-JS의 숨은 손실\n\n고전 WENO-JS(Jiang–Shu, 1996)는 세 개의 작은 스텐실 [math]마다 평활도 지표 [math]를 재고, 비선형 가중치로 섞는다.\n\n[equation]\n\n여기서 [math]는 5차 정확도를 회복하기 위한 최적 선형 가중치, [math]는 0 나눗셈 방지용 상수다. 문제는 이 가중치가 연속적이라는 점이다. 스텐실이 아주 조금 흔들리기만 해도, 이상적으로는 [math]를 유지해야 하는 스무드 영역에서 [math]가 살짝 움직이며 원래보다 낮은 차수의 스텐실에 무게가 실린다.\n\n그 결과, 매끄러운 파동이 수십 스텝 진행하면 서서히 진폭이 깎이고 위상 오차가 쌓인다. LES(대에디모사)처럼 충격파와 난류 와류가 공존하는 시뮬레이션에서는 이 소산이 치명적이다.\n\nTENO의 두 아이디어: 강한 스케일 분리와 샤프 컷오프\n\nFu는 두 가지 변화를 줬다.\n\n첫째, 스텐실 구성을 바꿨다. 세 개의 작은 3점 스텐실 [math]에 더해 하나의 큰 5점 스텐실 [math]을 별도로 둔다. [math]가 깨끗하면 그걸로 끝 — 다른 스텐실은 쓰지 않는다.\n\n둘째, 가중치를 이진화했다. 스무드 판정은 컷오프 파라미터 [math]로 한다.\n\n[equation]\n\n$[math]CT = 10^{-5}[math]CT[math]10^{-3}[math]10^{-7}[math]CT[math]CT[math]CT = 10^{-5}[math]10^{-6}[math]S3[math]\\beta3[math]\\deltak[math]CT[math]CT[math]\\beta[math]wk[math]CT[math]CT$ 하나로 안정성과 저소산성이 저울에 올라가므로, 격자 수렴과 함께 반드시 민감도 분석을 해야 한다.",
      "date_published": "2026-04-25T00:00:00.000Z",
      "tags": [
        "논문리뷰",
        "TENO",
        "WENO",
        "shock-capturing",
        "high-order"
      ],
      "_reading_time": "4 min read",
      "_word_count": 2137
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-24-flux-limiter-tvd-advection",
      "url": "https://cfdblog.cc/ko/posts/2026-04-24-flux-limiter-tvd-advection",
      "title": "Lax–Wendroff가 계단에서 떨렸다 — Flux Limiter로 2차 TVD 이류 스킴 만들기",
      "summary": "Godunov 정리를 우회해 단조 2차 이류 스킴을 만드는 법",
      "content_text": "import { LimiterAdvection1D } from '@/components/post-viz/2026-04-24-flux-limiter-tvd-advection/LimiterAdvection1D'\n\n테스트 케이스에서 계단 앞뒤로 이상한 혹이 올라왔다. 선형 이류(linear advection, 속도장이 상수인 순수 이동) 방정식을 Lax–Wendroff로 풀고 있었고, 초기 조건은 단순한 직사각 펄스였다. 2차 스킴이니 1차 업윈드보다 날카로울 거라 기대했지만, 결과는 계단 앞에서 언더슈트, 뒤에서 오버슈트. 로그를 봐도 CFL은 0.5, 안정 조건은 만족.\n\n문제는 알고리즘이 불안정한 것이 아니라 알고리즘이 단조롭지 않은 것이었다.\n\n진동의 정체 — Godunov가 걸어둔 벽\n\n1D 선형 이류 방정식은\n\n[equation]\n\n속도 [math] 가 일정할 때 해는 초기 모양이 그대로 오른쪽으로 평행이동하는 것. 수치적으로는 셀 경계에서의 플럭스 [math] 를 정의하고\n\n[equation]\n\n이 식은 flux-conserving form이라 불리고, 질량·운동량·에너지 같은 보존량을 기계 정밀도까지 지킨다. Lax–Wendroff는 여기에 2차 테일러 보정을 넣은 선형 스킴이다.\n\n그런데 1959년 Godunov가 증명한 정리는 가혹하다. 선형 상수계수 이류에 대해 단조성(monotonicity)을 유지하면서 2차 이상의 정확도를 갖는 선형 스킴은 존재하지 않는다. 둘 중 하나를 포기해야 한다. Lax–Wendroff는 2차 정확도를 택하고 단조성을 버렸다. 그래서 계단에서 진동이 터진다.\n\nTVD 조건: Harten의 부등식\n\nHarten(1983)이 제시한 탈출구는 \"총 변동이 줄어드는\" 스킴이다.\n\n[equation]\n\n좌변은 수치 해의 출렁임 총합. 매 스텝마다 이 값이 커지지 않으면 새 극값(overshoot, undershoot)이 생길 수 없다. 이 조건을 만족하는 스킴을 TVD 라 부른다.\n\nGodunov의 벽을 우회하려면 스킴을 비선형 으로 만들어야 한다. 해의 매끈함에 따라 알고리즘이 모양을 바꾸는 것. 매끈한 영역에서는 2차, 급격한 구배 근처에서는 1차 업윈드. 이 스위칭을 담당하는 함수가 flux limiter다.\n\nFlux Limiter 한 줄로 이해하기\n\nLax–Wendroff 플럭스는 1차 업윈드에 보정항이 붙은 모양이다.\n\n[equation]\n\n여기서 [math] 는 이류 속도, [math] 는 셀 폭, [math] 이 리미터, [math] 은 앞뒤 기울기 비.\n\n[equation]\n\n해가 매끈하면 [math], 극값 근처에서는 [math]L1[math]\\varphi(r)$ 는 매끈한 영역에서 2차, 극값 근처에서 1차로 자동 전환되는 한 줄짜리 함수다.\n- minmod는 안전, superbee는 날카롭게, van Leer/MC는 균형. LES와 shock capturing은 선택 기준이 다르다.",
      "date_published": "2026-04-24T00:00:00.000Z",
      "tags": [
        "알고리즘",
        "TVD",
        "flux-limiter",
        "advection",
        "수치해석"
      ],
      "_reading_time": "4 min read",
      "_word_count": 1975
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-23-plateau-rayleigh-jet-breakup",
      "url": "https://cfdblog.cc/ko/posts/2026-04-23-plateau-rayleigh-jet-breakup",
      "title": "물줄기는 왜 방울로 끊어지는가 — Plateau–Rayleigh 불안정성과 분열 레짐",
      "summary": "표면장력이 물기둥을 방울로 조각내는 원리와 분사 설계의 무차원 지도",
      "content_text": "import { PlateauRayleighJet } from '@/components/post-viz/2026-04-23-plateau-rayleigh-jet-breakup/PlateauRayleighJet'\n\n주방 수도꼭지를 반쯤만 열어보자. 처음엔 매끈한 기둥이다. 그런데 10cm쯤 떨어진 지점부터 규칙적인 방울로 끊어진다. 매일 보는 장면이지만, 왜 연속체가 스스로 끊어지는지 답하기는 어렵다. 이 포스트는 1849년 Joseph Plateau와 1879년 Lord Rayleigh가 내놓은 고전적 설명을 따라가고, 엔진 분사노즐·잉크젯 설계에서 오늘도 쓰는 Weber 수(관성력/표면장력 비)와 Ohnesorge 수(점성/관성·표면장력 비)가 어떻게 그 결과를 확장하는지 본다. 끝까지 읽으면 \"왜 어떤 제트는 굵은 방울로 끊어지고, 어떤 제트는 안개처럼 부서지는가\"를 하나의 레짐 지도로 답할 수 있다.\n\n연속체가 왜 끊어지는 길을 택하는가\n\n표면장력은 표면적을 줄이려는 힘이다. 같은 부피의 액체라면 공 모양일 때 표면적이 가장 작다. 그래서 한 덩어리 물은 무중력에서 구를 이룬다.\n\n그렇다면 같은 부피의 긴 물기둥과, 그 물을 일정 간격으로 잘라 만든 방울 사슬 중 어느 쪽이 표면적이 더 작을까. 직관과 달리 방울 사슬 쪽이 작다 — 단, 잘라내는 간격이 기둥의 둘레보다 길 때만 그렇다. 물기둥이 스스로 분열하는 이유는 여기서 나온다. 에너지가 낮은 상태로 굴러 떨어지려는 자연스러운 결과다.\n\nPlateau의 기하학적 직관\n\nPlateau는 반지름 [math]인 원기둥이 축 방향으로 파장 [math]의 약한 변형을 받았을 때 표면적 변화를 계산했다.\n\n[equation]\n\n여기서 [math] 는 무차원 파수 math다. 이 값이 1보다 작으면 [math], 섭동은 가라앉는다.\n\n조건을 다시 쓰면 간단하다.\n\n$[math]kR[math]kR[math]kR[math]U = 1\\,\\text{m/s}[math]\\lambda > 2\\pi R[math]\\lambda{\\max} \\approx 9 R[math]Oh[math]We[math]Oh[math]We$를 조절한다.",
      "date_published": "2026-04-23T00:00:00.000Z",
      "tags": [
        "유체역학",
        "유동현상",
        "Plateau-Rayleigh",
        "Weber수",
        "Ohnesorge",
        "액주분열"
      ],
      "_reading_time": "4 min read",
      "_word_count": 1902
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-22-cfd-linear-solvers-krylov",
      "url": "https://cfdblog.cc/ko/posts/2026-04-22-cfd-linear-solvers-krylov",
      "title": "CFD 선형 솔버 고르기: Jacobi부터 BiCGSTAB까지 수렴 속도 비교",
      "summary": "Krylov 부분공간 4대 솔버의 성격과 수렴 속도를 코드·시뮬레이션으로 비교한다",
      "content_text": "import { KrylovConvergence } from '@/components/post-viz/2026-04-22-cfd-linear-solvers-krylov/KrylovConvergence'\n\n1952년 Cornelius Lanczos와 Magnus Hestenes, Eduard Stiefel은 한 학회에서 우연히 같은 결과를 독립적으로 들고 나타났다. 대칭 양정부호(SPD) 행렬을 [math]번 반복만에 푸는 알고리즘이었다. 지금 우리가 켤레기울기법(Conjugate Gradient, CG) 이라 부르는 그 방법이다. 흥미로운 건 70년이 지난 오늘도 CFD 솔버의 심장에는 이 아이디어가 거의 그대로 살아 있다는 점이다 — Krylov 부분공간에서 해를 찾는다. 이 포스트는 CFD에서 가장 자주 쓰이는 네 솔버(Jacobi, Gauss-Seidel, CG, BiCGSTAB)의 수렴 속도를 Python과 인터랙티브 시뮬레이션으로 비교한다. 끝까지 읽으면 \"이 문제엔 어느 솔버가 맞는가\"를 실무에서 바로 판단할 수 있다.\n\n왜 CFD는 선형 시스템을 반복으로 풀까\n\nNavier–Stokes를 이산화하면 매 스텝마다 [math] 형태의 큰 선형 시스템이 떨어진다. 여기서 [math] 는 계수 행렬, [math] 는 셀 중심 변수 벡터, [math] 는 우변 소스다. 3D 격자 100만 셀이면 [math] 는 [math] 크기의 희소 행렬이 된다. LU 분해(행렬을 하삼각·상삼각 곱으로 쪼개는 직접법)는 이 크기에서 메모리와 CPU를 함께 태운다. OpenFOAM, SU2, Gerris 같은 오픈소스 CFD 코드가 예외 없이 반복법(iterative method) 을 쓰는 이유다.\n\n반복법의 기본 아이디어는 단순하다. 초기 추측 [math] 에서 출발해, 잔차 [math] 가 허용치 아래로 떨어질 때까지 [math] 를 조금씩 고친다. 문제는 \"조금씩\"을 어떻게 정의하느냐다. 이 정의가 솔버의 이름을 가른다.\n\nKrylov 부분공간이라는 아이디어\n\n초기 잔차 [math] 에 행렬 [math] 를 반복해서 곱한 벡터들이 만드는 공간이 있다.\n\n[equation]\n\n[math] 이 Krylov 부분공간, [math] 은 차원, [math] 은 선형결합으로 채운 공간이다. Krylov 계열 솔버는 해를 [math] 안에서 찾되, 남은 잔차 [math] 이 어떤 최적성 조건을 만족하도록 결정한다.\n\n해를 부분공간에 가두면 이점 두 가지가 있다. 첫째, 행렬-벡터 곱 외에 다른 연산이 없다 — 희소 구조를 그대로 살린다. 둘째, 이론적으로 해당 부분공간 안에서 최적인 해를 뽑을 수 있다. CG는 A-노름 오차를, GMRES는 2-노름 잔차를 Krylov 공간 안에서 정확히 최소화한다.\n\n네 솔버의 성격 차이\n\n| 솔버 | 요구 행렬 | 메모리 | 장점 | 단점 |\n|------|-----------|--------|------|------|\n| Jacobi | 대각 지배 권장 | 매우 낮음 | 병렬화 쉬움, 구현 10줄 | 느림 (스펙트럼 반경 [math]) |\n| Gauss-Seidel | 임의 | 매우 낮음 | Jacobi의 약 2배 빠름 | 본질적 순차, GPU 불리 |\n| CG | SPD 필수 | 벡터 4개 | SPD에 최적, 3항 점화로 경량 | 비대칭 불가 |\n| BiCGSTAB | 임의 | 벡터 7개 | 비대칭 OK, 전치 불필요 | 출렁이는 수렴, break-down 가능 |\n\n압력 포아송 방정식 [math] 는 SPD라 CG가 정석이다. 이류-확산이 섞인 운동량 방정식은 비대칭이라 BiCGSTAB 또는 GMRES가 선택된다. OpenFOAM의 PCG/PBiCGStab, SU2의 BCGSTAB가 정확히 이 역할 분담이다.\n\nPython으로 본 수렴 속도\n\n1D Poisson 문제를 예로 들자. [math], 경계 [math] 을 유한차분으로 이산화하면 삼대각 행렬이 떨어진다. Jacobi와 CG를 직접 비교해 보자.\n\npython\nimport numpy as np\n\ndef buildpoisson1d(n)…",
      "date_published": "2026-04-22T00:00:00.000Z",
      "tags": [
        "알고리즘",
        "Linear-Solver",
        "Krylov",
        "수치해석"
      ],
      "_reading_time": "4 min read",
      "_word_count": 2058
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-22-wall-distance-eikonal-fast-marching",
      "url": "https://cfdblog.cc/ko/posts/2026-04-22-wall-distance-eikonal-fast-marching",
      "title": "벽거리를 O(N log N)에 푸는 법: Eikonal 방정식과 Fast Marching",
      "summary": "RANS 난류 모델의 필수 입력인 벽거리를 효율적으로 계산하는 알고리즘",
      "content_text": "import { EikonalFrontPropagation } from '@/components/post-viz/2026-04-22-wall-distance-eikonal-fast-marching/EikonalFrontPropagation'\n\n1996년, UC Berkeley의 James Sethian은 의료 영상에서 혈관 경계를 추적하는 알고리즘을 다듬고 있었다. 그 결과물인 Fast Marching Method는 지금 엉뚱한 곳에서 쓰인다. 항공기 날개 주위의 RANS 해석기가 매번 돌아갈 때, 바로 이 알고리즘이 각 격자점의 벽거리(wall distance)를 만들어낸다. Spalart-Allmaras 모델과 k-ω SST 모델은 격자마다 \"가장 가까운 벽이 어디인가\"라는 값을 입력으로 요구한다. 이 글은 그 값을 순진하게 구할 때 생기는 비용, Eikonal 방정식(|∇d|=1/F 형태의 쌍곡성 PDE)으로 문제를 바꾸는 아이디어, 그리고 Dijkstra의 연속판인 Fast Marching으로 [math]에 해를 얻는 방법을 정리한다.\n\n벽거리는 왜 난류 모델에 필요한가\n\n경계층 난류의 통계량은 벽에서의 거리 [math]에 강하게 의존한다. RANS(Reynolds-Averaged Navier-Stokes) 모델은 그 의존성을 대수식으로 끼워 넣는다. Spalart-Allmaras는 destruction 항에서 math를 직접 사용한다. k-ω SST는 blending function [math], [math] 안에 [math]가 들어간다. LES와의 혼합 모델(DES, DDES, IDDES)에서도 벽거리가 스위치 역할을 한다.\n\n문제는 [math]가 메시의 기하량이라는 것이다. 메시가 움직이거나 변형되면 매 시간 스텝마다 다시 계산해야 한다. 회전 기계(컴프레서, 펌프)처럼 로터-스테이터 경계가 상대 운동을 하는 경우가 여기 해당한다.\n\n순진한 방법의 함정\n\n바로 떠오르는 방법은 \"모든 벽면과 모든 셀의 거리를 계산해 최솟값을 고른다\"이다. 실제로 교과서 예제에서는 이걸 쓴다.\n\n비용은 [math]이다. 항공기 전체를 푼다고 해보자. 10M 셀, 0.5M 벽면이면 5조 번의 거리 계산이다. 이게 매 시간 스텝마다 돈다면 해석이 끝나지 않는다. KD-tree 같은 공간 자료구조로 [math]까지 낮출 수 있지만, 복잡한 형상의 벽 근접 쿼리는 여전히 부담이다.\n\nEikonal 방정식으로 생각을 바꾼다\n\n벽거리를 PDE의 해로 보자. \"벽에서 0이고, 모든 방향으로 기울기 크기가 1\"인 함수가 바로 거리장이다.\n\n[equation]\n\n[math]는 벽까지의 \"도달 시간\", [math]는 전파 속도(기본 1), [math]는 벽 집합이다. [math]로 고정하면 [math]는 그대로 유클리드 거리다.\n\n이 방정식은 쌍곡성(hyperbolic)이다. 정보가 특성선(벽에서 바깥으로 뻗는 직선)을 따라 한 방향으로만 흐른다. 이 단방향성이 효율적 알고리즘의 열쇠다. \"이미 값이 정해진 점에서만 값이 들어온다\"는 성질을 이용하면, 모든 점을 한 번씩만 방문해도 충분하다.\n\nFast Marching: Dijkstra의 연속판\n\nSethian의 아이디어는 두 줄로 요약된다.\n\n1. 모든 격자점을 Accepted / Considered / Far 세 집합으로 나눈다.\n2. Considered 중 도달 시간이 가장 작은 점을 Accepted로 확정하고, 그 이웃을 업데이트한다.\n\n가장 작은 값을 빠르게 꺼내려면 min-heap이 자연스럽다. 그래프 최단 거리 알고리즘인 Dijkstra와 구조가 같다. 차이는 이웃 업데이트 방식이다. 그래프에서는 단순 덧셈이지만, Eikonal에서는 upwind 2차 방정식을 풀어 값을 얻는다.\n\n2D 정렬 격자에서 업데이트 식은 다음과 같다.\n\n[equation]\n\n[math], [math]는 각각 수평·수직 방향의 업윈드 이웃값(네 이웃 중 작은 쪽), [math]는 격자 간격이다. 두 근 중 [math]인 쪽만 채택한다. 이 조건을 인과성(causality)이라고 부른다. 값은 오직 \"이…",
      "date_published": "2026-04-22T00:00:00.000Z",
      "tags": [
        "알고리즘",
        "Eikonal",
        "Fast-Marching",
        "메시"
      ],
      "_reading_time": "5 min read",
      "_word_count": 2543
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-21-reynolds-number-scale-fluid-mechanics",
      "url": "https://cfdblog.cc/ko/posts/2026-04-21-reynolds-number-scale-fluid-mechanics",
      "title": "벌레는 꿀 속에서 헤엄친다 — Reynolds 수가 바꾸는 유동의 세계",
      "summary": "무차원화로 드러나는 Reynolds 수, 스케일이 만드는 유동의 차이",
      "content_text": "박테리아는 수영을 할 수 없다. 정확히 말하면, 우리가 \"수영\"이라고 부르는 관성 기반 추진은 박테리아에게 통하지 않는다. 꼬리를 저어 관성으로 앞으로 나가는 우리와 달리, 박테리아는 관성이 사라진 세계 — 마치 투명한 꿀 속 같은 곳 — 에서 살기 때문이다. 이 포스트는 같은 Navier–Stokes 방정식이 왜 스케일에 따라 완전히 다른 세상을 만드는지, 그리고 그 차이를 한 숫자로 요약하는 Reynolds 수(관성력/점성력 비) 가 어떻게 유체역학의 \"숨겨진 문법\"이 되는지 살펴본다. 끝에는 무차원화(방정식의 단위를 벗겨 구조만 남기는 작업)가 왜 유체역학의 첫 문법인지도 함께 짚는다.\n\n같은 방정식, 다른 세상\n\n대왕고래는 바다에서 헤엄친다. 물 분자는 물론 같은 물이다. 그런데 1 μm 박테리아에게 물은 전혀 다른 물질처럼 느껴진다. 같은 Navier–Stokes 방정식을 써도 스케일이 바뀌면 지배하는 항이 바뀌기 때문이다.\n\n비압축 Navier–Stokes는 이렇게 생겼다.\n\n[equation]\n\n[math]는 밀도, [math]는 속도장, [math]는 압력, [math]는 점성계수다. 좌변은 관성(질량 × 가속도), 우변의 [math]는 점성(내부 마찰) 항이다. 이 두 힘이 매 순간 싸운다. 누가 이기는가.\n\n방정식의 옷을 벗겨라: 무차원화\n\n답은 스케일이 정한다. 이를 보이려면 방정식을 무차원화해야 한다. 대표 길이 [math], 대표 속도 [math], 대표 시간 [math], 대표 압력 [math]로 모든 양을 나눈다.\n\n[equation]\n\n변수 하나하나의 의미는 \"그 물리량을 자기 자신의 자연스러운 크기로 측정한 것\"이다. 이 정의를 Navier–Stokes에 대입해 정리하면 단위가 전부 사라진 깔끔한 식이 남는다.\n\n[equation]\n\n모든 물리 단위가 사라지고 딱 하나의 숫자 [math]만 남는다. 이것이 Reynolds 수다.\n\n[equation]\n\n[math]는 동점성계수(kinematic viscosity)다. [math], [math], [math]이 클수록 관성이, [math]가 클수록 점성이 이긴다. 같은 물이라도 [math]이 작아지면 [math]는 선형으로 떨어진다. 결국 세상을 지배하는 항이 바뀐다.\n\n스케일이 Reynolds 수를 바꾼다\n\n숫자로 느껴보자. 물의 동점성계수 [math]를 기준으로 대표 생명체들의 [math]는 아래와 같다.\n\n[code block]\n\n가장 큰 값과 가장 작은 값이 무려 13자릿수 차이다. 같은 물 안에서다. Reynolds 수는 단순한 숫자가 아니라, 같은 유체 안에서도 서로 다른 \"세상\"을 라벨링하는 주소다.\n\n박테리아처럼 [math]인 영역에서는 무차원 방정식의 관성 항이 사실상 사라지고, 양변에 [math]를 곱하면 Stokes 방정식 [math]이 된다. 시간 미분이 없다. 즉 박테리아의 유동은 \"과거를 기억하지 못한다\". 힘을 빼는 순간 속도도 0이 된다.\n\n시각화로 직관 만들기\n\n아래 시뮬레이션에서 직접 Reynolds 수를 조작해보자.\n\nReynolds를 10 근처로 낮추면 벡터장이 빗처럼 정돈된다. 점성이 모든 교란을 빠르게 소멸시키기 때문이다. 반대로 1000까지 올리면 벡터가 불규칙하게 흔들리기 시작한다. 이것이 난류의 전조다.\n\n다음은 원통 뒤의 유동이다. 관찰 포인트는 카르만 와열(Von Kármán vortex street, 원통 뒤에서 주기적으로 떨어져 나가는 와) 의 형성 여부다.\n\n[math]에서는 원통 뒤가 좌우 대칭으로 붙어 있다. 40을 넘기면 위아래 와가 번갈아 박리되어 \"꼬리가 주기적으로 흔들리는\" 무늬가 보인다. 깃발이 펄럭이고, 전깃줄이 울고, 바람에 긴 다리가 진동하는 이유가 모두 같은 카르만 와열이다. 자연 현상의 주파수는 Strouhal 수 [math]로 묶여 있어, [math]와 [math]만 알면 울음의 음높이까지 추정할 수 있다.\n\n박테리아는 왜 '꿀 속'인가\n\n[math]에서는 관성이 0에 가깝다. 수영을 멈추는 순간 정지한다. 더 놀라운 결과도 있다.\n\n> 시간 가역 동작으로는 앞…",
      "date_published": "2026-04-21T00:00:00.000Z",
      "tags": [
        "유체역학",
        "유동현상",
        "Reynolds",
        "무차원화"
      ],
      "_reading_time": "4 min read",
      "_word_count": 2034
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-20-discontinuous-galerkin-method-cfd",
      "url": "https://cfdblog.cc/ko/posts/2026-04-20-discontinuous-galerkin-method-cfd",
      "title": "불연속 갈레르킨법(DGM): 비정렬 격자 압축성 유동 해석의 고정밀 이산화",
      "summary": "DGM의 약형식 유도부터 Gauss 구적법, 비정렬 격자 구현까지 단계별 정리",
      "content_text": "import { DGElementBasis } from '@/components/post-viz/2026-04-20-discontinuous-galerkin-method-cfd/DGElementBasis'\n\n불연속 갈레르킨법(Discontinuous Galerkin Method, DGM)은 유한요소법(FEM)과 유한체적법(FVM)의 장점을 결합한 수치해석 기법입니다. 셀 내부에서는 고차 다항식 기저함수를 사용하고, 셀 경계에서는 수치 플럭스로 정보를 교환합니다. 비정렬 격자에서 압축성 유동을 고정밀로 해석할 때 강력한 선택지입니다.\n\n지배방정식과 플럭스 분리\n\n압축성 유동의 보존 방정식:\n\n[equation]\n\n여기서\n- [math]: 보존 변수 벡터\n- [math]: 대류(convective) 플럭스\n- [math]: 점성(viscous) 플럭스\n- [math]: 소스항\n\n기저함수 전개와 약형식 유도\n\n셀 [math] 내부에서 해를 기저함수의 선형결합으로 근사합니다:\n\n[equation]\n\n[math]는 셀 내 자유도 수로, 근사 다항식 차수 [math]에 따라 결정됩니다 ([math] in 3D).\n\n시험함수 [math]를 곱하고 [math]에서 적분하면:\n\n[equation]\n\nGreen 공식(부분 적분)을 적용하면 체적 적분과 경계 적분으로 나뉩니다:\n\n[equation]\n\n경계면의 [math]는 인접 셀 정보를 이용한 수치 플럭스입니다 (Roe, HLLC 등).\n\n질량 행렬과 시간 적분\n\n[math] 번째 기저함수 계수에 대한 ODE로 정리하면:\n\n[equation]\n\n여기서 질량 행렬(mass matrix)은:\n\n[equation]\n\n직교 기저함수(Taylor basis 또는 Legendre 다항식 등)를 사용하면 [math]이 대각행렬이 되어 역행렬 계산 비용이 없어집니다. 잔차 벡터 [math]은 체적 적분항과 면 플럭스항의 합입니다:\n\n[equation]\n\nGauss 구적법 적용\n\n체적·면 적분은 Gauss-Legendre 구적법으로 수치 계산합니다. 차수 [math]의 다항식을 정확히 적분하려면 최소 [math] 차 이상의 적분이 필요합니다.\n\n셀 유형별 Gauss 포인트 개수 (대표 차수별):\n\n| 셀 유형     | 1차 | 2차 | 3차 |\n|------------|-----|-----|-----|\n| Tetrahedron | 1  | 4   | 10  |\n| Hexahedron  | 1  | 8   | 27  |\n| Prism       | 3  | 9   | 18  |\n| Pyramid     | 1  | 5   | 15  |\n\n면(face) 유형에 대해서는 셀 포인트의 3배(3D 투영)를 사용합니다.\n\n알고리즘 구현 순서\n\n실제 구현에서는 다음 순서로 진행합니다:\n\n1. 셀·면 분류: 테트라/헥사/프리즘/피라미드/폴리헤드론\n2. 기저함수 준비: 각 셀 유형 × 근사 차수에 맞는 [math], [math] 계산\n3. Gauss 포인트 캐시: 참조 요소(reference element) 좌표와 가중치를 메모리에 저장\n4. 변수 초기화: [math] 설정 (자유흐름 조건 등)\n5. 루프(시간 전진):\n   - 체적 적분: [math] — 각 Gauss 포인트에서 플럭스 계산 후 합산\n   - 면 플럭스: [math] — 수치 플럭스 산정\n   - RK 업데이트: SSP-RK3 등 명시적 시간 적분\n\n[code block]\n\n수치 플럭스 선택 — 실무 주의사항\n\nDGM에서 수치 플럭스는 안정성과 정확도에 직결됩니다.\n\n- Roe 플럭스: 접촉 불연속을 잘 포착하지만, 엔트로피 수정이 없으면 팽창 충격파(expansion shock)를 유발할 수 있음.\n- HLLC: Roe보다 안정적이나 희귀한 경우 과도한 소산 발생.\n- LxF(Lax-Friedrichs): 구현 단순, 소산이 크므로 고차 이득이 줄어듦.\n\n흔한 실수:\n1. Gauss 포인트 수 부족 — 비선형 플럭스에서 차수가 줄어드는 aliasing 오류 발생.\n2. 질량 행렬 비대각화 무시 — 일반 FEM 기저함수 사용 시 매 스텝마다 …",
      "date_published": "2026-04-20T00:00:00.000Z",
      "tags": [
        "FEM",
        "DGM",
        "고차 정확도",
        "압축성 유동"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1407
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-04-20-fem-rigid-body-dynamics-quaternion",
      "url": "https://cfdblog.cc/ko/posts/2026-04-20-fem-rigid-body-dynamics-quaternion",
      "title": "강체 역학을 위한 FEM: 쿼터니언 기반 회전 처리와 관성 텐서",
      "summary": "FEM 강체 시뮬레이션에서 쿼터니언으로 회전을 표현하고 관성 텐서를 다루는 방법",
      "content_text": "import { QuaternionRotationDemo } from '@/components/post-viz/2026-04-20-fem-rigid-body-dynamics-quaternion/QuaternionRotationDemo'\n\n강체 역학의 기본 방정식\n\n유체-구조 연성(FSI) 해석이나 DEM(Discrete Element Method) 시뮬레이션에서 강체의 운동을 정확히 기술하는 것은 필수적이다. 강체는 변형이 없는 물체로, 임의의 두 점 사이 거리가 항상 일정하게 유지된다.\n\n강체 내 임의의 입자 [math]의 속도는 다음과 같이 분해된다.\n\n[equation]\n\n여기서 [math]은 질량 중심의 속도, [math]는 각속도, [math]는 질량 중심으로부터 입자 [math]까지의 변위 벡터이다.\n\n선형 모멘텀과 각 모멘텀\n\n전체 선형 모멘텀은 뉴턴 제2법칙으로부터\n\n[equation]\n\n여기서 [math]는 전체 질량이다. 질량 중심의 가속도는\n\n[equation]\n\n전체 각 모멘텀은\n\n[equation]\n\n여기서 [math]는 관성 텐서(inertia tensor), [math]는 전체 토크(torque)다.\n\n관성 텐서\n\n관성 텐서는 질량 중심을 기준으로\n\n[equation]\n\n연속체로 확장하면\n\n[equation]\n\n여기서 [math]는 단위 텐서이고, [math]은 외적(outer product)이다.\n\n물체가 회전하면 관성 텐서는 방위 행렬(orientation matrix) [math]에 의해 변환된다.\n\n[equation]\n\n여기서 [math]는 물체 좌표계(body frame)에서의 초기 관성 텐서로, 시뮬레이션 시작 시 한 번만 계산하면 된다.\n\n쿼터니언을 이용한 회전 표현\n\n오일러 각(Euler angles)으로 회전을 표현하면 짐벌 락(gimbal lock) 문제가 발생한다. 이를 피하기 위해 쿼터니언(quaternion)을 사용한다.\n\n쿼터니언 [math]는 스칼라 부분과 벡터 부분으로 구성된다.\n\n[equation]\n\n단위 축 [math]에 대해 각도 [math]만큼의 회전은\n\n[equation]\n\n두 쿼터니언 [math], [math]의 합성 회전은 곱으로 표현된다.\n\n[equation]\n\n이를 이용하면 방위 행렬 [math]은 쿼터니언 성분으로 명시적으로 표현된다.\n\n[equation]\n\n쿼터니언의 시간 미분은 각속도 [math]와 연결된다.\n\n[equation]\n\nFEM 이산화와 사면체 형상 함수\n\nFEM에서 강체의 변위장을 이산화할 때, 사면체 요소의 형상 함수(shape function)는\n\n[equation]\n\n여기서 [math]는 무차원 체적 좌표(barycentric coordinates)이며 [math] 조건을 만족한다.\n\n선형 사면체 요소에서 변위 보간은\n\n[equation]\n\n강체 구속 조건을 적용하면 자유도는 6개(선형 3 + 회전 3)로 줄어든다.\n\nPython 구현 예시\n\n[code block]\n\n실무 주의사항\n\n1. 쿼터니언 정규화 망각\n수치 적분이 반복되면 [math]이 되어 회전 행렬이 비직교(non-orthogonal)가 된다. 매 타임스텝마다 q /= norm(q) 를 반드시 수행해야 한다.\n\n2. 관성 텐서의 좌표계 혼동\n[math]는 물체 고정 좌표계(body frame)에서 정의된다. 월드 좌표계(world frame)에서 토크를 계산했다면 [math]로 변환 후 적용해야 한다.\n\n3. 타임스텝 선택\n강체의 최고 고유진동수 [math]에 대해 $\\Delta t",
      "date_published": "2026-04-20T00:00:00.000Z",
      "tags": [
        "FEM",
        "강체역학",
        "쿼터니언"
      ],
      "_reading_time": "2 min read",
      "_word_count": 1074
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-28-dean-flow-analytical-solution",
      "url": "https://cfdblog.cc/ko/posts/2026-03-28-dean-flow-analytical-solution",
      "title": "Dean 유동: 나선형 관의 이차 유동 해석해와 CFD 검증",
      "summary": "곡선 관에서 원심력이 만드는 한 쌍의 Dean 와류 — 해석해 유도부터 수치 검증까지",
      "content_text": "import { DeanSecondaryFlow } from '@/components/post-viz/2026-03-28-dean-flow-analytical-solution/DeanSecondaryFlow'\n\n나선형 증기발생기(Helical Steam Generator) 설계에서 빠지지 않는 질문이 있다.\n\"직관 대비 얼마나 열전달이 좋아지는가?\"\n그 답의 핵심이 Dean 와류(Dean vortices) — 곡선 관에서 원심력이 만들어내는 한 쌍의 나선형 이차 유동이다.\n\n1928년 W. R. Dean이 처음 기술한 이 유동은 핵공학, 화학공학, 생체역학에 걸쳐 반복 등장하는 고전 문제다. 오늘은 Dean의 섭동 전개를 직접 유도하고, Python으로 시각화한 뒤, 유한차분법으로 검증해본다.\n\n---\n\n1. 문제 설정\n\n곡률 반경 [math]인 원호형 관(관 반경 [math])을 생각하자. 원통 좌표계 [math]를 관 단면에 잡고, [math]를 관 축 방향 호 좌표로 정의한다.\n\n[equation]\n\n비압축성 Navier-Stokes 방정식을 곡선 좌표계로 표현하면, 관 축방향 운동량에 원심력 항이 추가된다.\n\n[equation]\n\n원심력이 없다면 ([math]) 이것은 곧바로 포아즈이유 유동으로 환원된다.\n\n---\n\n2. 해석해 유도\n\n2-1. 무차원화\n\n특성 속도 [math] (Poiseuille 중심 속도)로 무차원화하면:\n\n[equation]\n\n0차 해(Poiseuille)는:\n\n[equation]\n\n2-2. Dean 수 정의\n\nDean은 다음 무차원수를 도입했다:\n\n[equation]\n\n현대적으로는 관 직경 [math] 기준으로 쓰기도 한다:\n\n[equation]\n\n2-3. 섭동 전개 (Dean 1928)\n\n[math] 조건에서 스트림 함수 [math]를 [math]으로 전개한다:\n\n[equation]\n\n1차 이차 유동 스트림 함수:\n\n[equation]\n\n이차 유동 속도 성분 ([math]에서 유도):\n\n[equation]\n\n축방향 속도의 1차 보정:\n\n[equation]\n\n최종 축방향 속도 (2차 근사):\n\n[equation]\n\n---\n\n3. 물리적 해석\n\n- 이차 유동: [math] 의존성 → 바깥쪽(outer wall, [math])으로 유체가 쏠리고 양측에서 되돌아오는 한 쌍의 와류\n- 축방향 속도 왜곡: 원심력으로 고속 코어가 바깥쪽으로 치우침 → 속도 프로파일 비대칭\n- 전단응력 증가: 이차 유동이 경계층을 교란 → 열전달 계수 향상 (Nusselt 수 ↑)\n\n열전달 향상 상관식 (Dittus-Boelter 대비):\n\n[equation]De = Red\\sqrt{\\frac{d}{2R}} = Red\\sqrt{\\frac{0.012}{2 \\times 2.3}} \\approx 0.051 \\cdot Red$[math]Red \\approx 10{,}000[math]De \\approx 510$.\n이 영역에서 Dean 와류가 완전 발달하여 열전달 계수가 직관 대비 3060% 향상된다.\n\n그런데 비등(boiling)이 동반되면 이야기가 달라진다 — 원심력이 기포를 관 안쪽 벽면(inner wall)으로 밀어 국소 건도(void fraction) 불균형이 생긴다. 이것이 DNB(임계열속) 예측을 어렵게 만드는 핵심 원인이다. 1D 상관식이 통하지 않는 이유가 바로 이 3차원 이차 유동 때문이다.\n\n---\n\n더 읽을거리\n\n- Dean, W. R. (1928). The stream-line motion of fluid in a curved pipe. Phil. Mag. 5, 673–695.\n- Ito, H. (1959). Friction factors for turbulent flow in curved pipes. J. Basic Eng. 81, 123–134.\n- Berger, S. A., Talbot, L., & Yao, L.-S. (1983). Flow in curved pipes. Annu. Rev. Fluid Mech. 15, 461–512.\n- Naphon, P. & Wongwises, S. (200…",
      "date_published": "2026-03-28T00:00:00.000Z",
      "tags": [
        "해석해",
        "고전유동",
        "CFD검증",
        "Dean유동",
        "이차유동",
        "나선형관"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1627
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-28-poiseuille-flow-analytical-solution",
      "url": "https://cfdblog.cc/ko/posts/2026-03-28-poiseuille-flow-analytical-solution",
      "title": "포아즈이유 유동: 해석해 유도와 유한차분 검증",
      "summary": "가장 단순한 점성 유동의 완전 해석해를 손으로 유도하고, FD 코드로 수치 정확도를 검증하는 CFD 입문 벤치마크",
      "content_text": "import { PoiseuilleProfile } from '@/components/post-viz/2026-03-28-poiseuille-flow-analytical-solution/PoiseuilleProfile'\n\n포아즈이유 유동(Poiseuille flow)은 두 평행 평판 사이 또는 원형 관 내부에서 일정한 압력 구배에 의해 구동되는 완전 발달 층류다.\n정확한 해석해가 존재하기 때문에 CFD 코드 검증의 첫 번째 테스트 케이스로 전 세계 어느 교과서에나 등장한다.\n\n오늘은 채널 유동(2D 평판 사이)을 대상으로 해석해를 단계별로 유도하고, 간단한 유한차분 코드를 작성해 수렴 차수를 확인한다.\n\n문제 설정\n\n형상 및 경계 조건\n\n두 무한 평행 평판 사이의 완전 발달 층류 유동을 고려한다.\n\n- 채널 반폭: [math] (평판은 [math]에 위치)\n- 유동 방향: [math] (무한히 길다고 가정)\n- 경계 조건: 양 벽면에서 no-slip [math] [math]\n- 구동력: 일정한 압력 구배 [math]은 상수)\n\n지배 방정식\n\n완전 발달 유동이므로 [math], [math]이다. [math]-방향 나비에–스토크스 방정식:\n\n[equation]\n\n완전 발달 조건([math], [math])을 적용하면:\n\n[equation]\n\n해석해 유도\n\n1단계: ODE로 단순화\n\n[equation]\n\n2단계: 1차 적분\n\n[equation]\n\n3단계: 2차 적분\n\n[equation]\n\n4단계: 경계 조건 적용\n\n[math]:\n\n[equation]\n\n[math]:\n\n[equation]\n\n(1) [math] (2): [math] (대칭)\n\n(1) [math] (2): [math]\n\n최종 해석해\n\n[equation]\n\n채널 중심([math])에서 최대 속도:\n\n[equation]\n\n물리적 해석\n\n속도 프로파일\n\n해석해는 포물선(parabola) 분포다. 벽면 마찰이 유동 단면 전체에 균일하게 전달되어, 중심에서 최대, 벽에서 0이 된다.\n\n무차원 속도 [math]는 채널 반폭 [math]나 점도 [math]에 무관한 보편적 프로파일이다.\n\n벽면 전단 응력\n\n[equation]\n\n(크기: [math]) 압력 구배가 클수록, 채널이 넓을수록 벽 마찰이 커진다.\n\n체적 유량\n\n[equation]\n\n이를 Hagen-Poiseuille 법칙의 2D 버전이라 부른다. 유량이 [math]에 비례하므로, 채널이 두 배 넓어지면 유량은 여덟 배 증가한다.\n\nPython으로 해석해 시각화\n\n[code block]\n\n유한차분법으로 수치 검증\n\nFD 이산화\n\n[math]를 2차 중앙차분으로 이산화한다. 균일 격자 [math]:\n\n[equation]\n\n경계 조건: [math].\n\n이를 삼대각 행렬(tridiagonal) 연립방정식으로 쓰면:\n\n[equation]\n\nPython 구현\n\n[code block]\n\n수렴 결과\n\n| [math] | [math] | [math] 오차 | 수렴 차수 |\n|----:|-----------|------------|----------|\n| 4 | 0.4000 | 2.78e-16 | — |\n| 8 | 0.2222 | 1.67e-16 | 2.0 |\n| 16 | 0.1176 | 2.22e-16 | 2.0 |\n| 32 | 0.0606 | 2.78e-16 | 2.0 |\n| 64 | 0.0308 | 2.22e-16 | 2.0 |\n\n> 참고: 포아즈이유 유동은 2차 다항식이므로 2차 중앙차분으로 기계적 정밀도(machine precision) 수준의 정확도를 얻는다. 실제 오차는 [math] 비례가 아니라 부동소수점 반올림 오차 수준에서 포화된다.\n\n이것이 포아즈이유 유동이 CFD 검증에 이상적인 이유다 — 낮은 격자 해상도에서도 거의 완벽한 답을 내놓아, 코드의 기본 정확성을 빠르게 확인할 수 있다.\n\n해석 결과 비교 플롯\n\n[code block]\n\nOpenFOAM 설정 힌트\n\n포아즈이유 유동을 OpenFOAM icoFoam으로 설정할 때 핵심 파라미터:\n\n0/U — 속도 경계 조건\n\n[code block]\n\n0/p — 압…",
      "date_published": "2026-03-28T00:00:00.000Z",
      "tags": [
        "해석해",
        "고전유동",
        "CFD검증",
        "포아즈이유",
        "유한차분"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1428
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-27-simpleFoam-pressure-divergence",
      "url": "https://cfdblog.cc/ko/posts/2026-03-27-simpleFoam-pressure-divergence",
      "title": "[CFD Q&A] simpleFoam 압력 잔차가 수렴하지 않을 때",
      "summary": "실무에서 만난 SIMPLE 알고리즘 발산 해결기 — relaxation factor 설정이 핵심이었다",
      "content_text": "import { SimpleResidualHistory } from '@/components/post-viz/2026-03-27-simpleFoam-pressure-divergence/SimpleResidualHistory'\n\n지난주에 꽤 시간을 잡아먹은 문제가 있었다. simpleFoam을 돌리다가 pressure residual이 1e-3 아래로 떨어지지 않고 오히려 올라가기 시작했다. 처음엔 메시 문제인가 싶었는데, 결론은 relaxation factor였다.\n\n문제 상황\n\n- 소프트웨어: OpenFOAM v2312\n- 형상: 2D 직사각형 채널, inlet–outlet 경계\n- 난류 모델: k-ε (standard)\n- 솔버: simpleFoam (정상 상태)\n\n처음 2030 iteration은 잘 내려가다가 갑자기 pressure residual이 튀기 시작했다.\n\n[code block]\n\nvelocity는 잘 수렴하는데 pressure만 계속 이상하다. 전형적인 압력-속도 커플링 불안정 패턴이다.\n\n원인 분석 과정\n\n1단계: 메시 품질 확인\n\n일단 checkMesh부터 돌렸다.\n\n[code block]\n\n최대 non-orthogonality 32도, max skewness 0.8 — 나쁘지 않다. 메시 문제는 아닌 것 같다.\n\n2단계: 경계 조건 점검\n\ninlet에서 pressure를 zeroGradient, outlet을 fixedValue 0으로 설정했다. 이건 표준 설정이라 문제없다.\n\n근데 초기 p 필드를 확인해보니 inlet 쪽에 이상하게 큰 값이 들어가 있었다. 처음에 funkySetFields로 뭔가 실험하다가 남은 흔적이었다.\n\n3단계: fvSolution 확인\n\n[code block]\n\nU=0.9는 꽤 공격적인 값이다. SIMPLE에서 velocity relaxation을 높이면 수렴 속도는 빠르지만 pressure 업데이트가 따라가지 못하면 발산한다.\n\n원인 두 가지가 겹쳤다:\n1. relaxation factor가 과도하게 높음\n2. 초기 p 필드에 잘못된 값이 남아 있음\n\n해결책\n\nrelaxation factor 낮추기\n\n[code block]\n\n처음 실행할 때는 보수적으로 시작하는 게 맞다. 수렴이 확인되면 조금씩 올린다.\n\n초기 p 필드 초기화\n\n[code block]\n\n아니면 직접 0/p 파일 열어서 internalField uniform 0;으로 맞춰주면 된다.\n\n[code block]\n\n검증\n\n수정 후 다시 돌리면 이렇게 나온다.\n\n[code block]\n\n200 iteration 정도에서 pressure residual이 1e-4 수준으로 안정적으로 내려왔다.\n\n일반화된 교훈\n\nsimpleFoam 수렴 체크리스트 — 이 순서로 확인하면 대부분 잡힌다:\n\n1. 초기 조건 먼저: 0/ 디렉토리의 p, U 필드가 의도한 값인지 확인. 이전 실험 잔재가 남아 있으면 반드시 초기화.\n\n2. relaxation factor 보수적으로: 첫 실행은 U=0.7, p=0.3 기본값으로 시작. 수렴 확인 후 올리는 게 안전하다. p relaxation은 특히 낮게 잡아야 SIMPLE 루프가 안정된다.\n\n3. velocity 수렴 vs. pressure 수렴 분리해서 보기: U residual은 낮은데 p만 발산하면 relaxation 문제일 가능성이 높다. 둘 다 발산하면 메시나 경계 조건을 먼저 본다.\n\n4. GAMG iteration 수 보기: 같은 iteration에서 p를 풀 때 필요한 inner iteration이 갑자기 늘어난다면 수렴 방향이 잘못된 것.\n\nSIMPLE 알고리즘은 pressure correction 루프의 특성상 relaxation에 매우 민감하다. 첫 실행은 항상 보수적으로 — 느려도 안정적으로 수렴하는 걸 확인한 뒤에 가속하는 게 결국 빠르다.\n\n---\n\n비슷한 문제를 겪고 있다면 댓글로 환경(버전, 형상, 난류 모델)을 알려주세요. 케이스별로 다를 수 있습니다.\n\nαp를 위험 영역(>0.6)으로 밀어보면 30 iter 부근에서 잔차가 다시 튀는 모습을 직접 …",
      "date_published": "2026-03-27T00:00:00.000Z",
      "tags": [
        "CFD실무",
        "QA",
        "OpenFOAM",
        "SIMPLE",
        "수렴"
      ],
      "_reading_time": "2 min read",
      "_word_count": 1157
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-26-openfoam-backward-facing-step",
      "url": "https://cfdblog.cc/ko/posts/2026-03-26-openfoam-backward-facing-step",
      "title": "[OpenFOAM 튜토리얼] 후방 계단 유동 해석 — simpleFoam으로 재순환 영역 포착하기",
      "summary": "OpenFOAM simpleFoam으로 후방 계단(Backward Facing Step) 비압축성 유동을 단계별로 해석하는 가이드",
      "content_text": "import { BFSRecirculation } from '@/components/post-viz/2026-03-26-openfoam-backward-facing-step/BFSRecirculation'\n\n이 튜토리얼에서는 후방 계단(Backward Facing Step) 형상에서 재순환 유동을 simpleFoam으로 시뮬레이션합니다.\n계단 하류에 형성되는 재순환 영역(recirculation zone)과 재부착 지점(reattachment point)을 직접 확인하는 것이 목표입니다.\n\n---\n\n선행 조건\n\n- OpenFOAM 버전: v2312 이상 (OpenFOAM.com 또는 OpenFOAM.org 모두 가능)\n- 사전 지식: 기본 터미널 명령어, OpenFOAM 케이스 구조(0/constant/system) 이해\n- 필요 소프트웨어: ParaView 5.x 이상 (결과 시각화)\n\n---\n\n1단계: 케이스 디렉토리 생성\n\n[code block]\n\n케이스 구조는 다음과 같습니다.\n\n[code block]\n\n[code block]\n\n---\n\n2단계: 격자 생성 — blockMeshDict\n\nsystem/blockMeshDict는 계단 형상을 직육면체 블록 조합으로 정의합니다.\n아래는 단순화된 2D 케이스 예시입니다 (계단 높이 H = 0.1 m).\n\n[code block]\n\n[code block]\n\n예상 출력:\n[code block]\n\n---\n\n3단계: 경계 조건 설정\n\n0/U — 속도 경계 조건\n\n[code block]\n\n0/p — 압력 경계 조건\n\n[code block]\n\n0/k — 난류 운동에너지\n\n[code block]\n\n---\n\n4단계: 물성치 및 난류 모델 설정\n\nconstant/transportProperties\n\n[code block]\n\nconstant/turbulenceProperties\n\n[code block]\n\n---\n\n5단계: 수치 기법 설정\n\nsystem/fvSchemes\n\n[code block]\n\nsystem/fvSolution\n\n[code block]\n\n---\n\n6단계: 해석 실행\n\n[code block]\n\n예상 출력 (수렴 과정):\n[code block]\n\n수렴 기준은 모든 변수의 residual이 1e-4 이하가 될 때입니다.\n\n---\n\n7단계: 결과 시각화 (ParaView)\n\n[code block]\n\nParaView에서 다음 순서로 결과를 확인합니다.\n\n1. Coloring 드롭다운 → U 선택 → Magnitude로 속도 크기 표시\n2. Glyph 필터 추가 → 벡터 방향 시각화 (재순환 영역 확인)\n3. Stream Tracer 필터 → 유선 그리기\n\nfoamToVTK로 파일 변환 후 후처리:\n\n[code block]\n\nPython으로 재부착 길이 자동 추출:\n\n[code block]\n\n---\n\n흔한 오류와 해결책\n\n오류 1: FOAM FATAL ERROR: Cannot find file \"0/epsilon\"\n\n[code block]\n\n원인: 0/epsilon 파일 누락.\n해결: k 파일과 동일한 형식으로 0/epsilon을 생성합니다.\n\n[code block]\n\n---\n\n오류 2: 해석 발산 (Floating point exception)\n\n[code block]\n\n원인: 완화계수가 너무 크거나 격자가 조밀하지 않아 발산.\n해결: fvSolution에서 완화계수를 낮춥니다.\n\n[code block]\n\n---\n\n오류 3: residual이 감소하지 않고 진동\n\n원인: nNonOrthogonalCorrectors가 0이지만 격자 비직교성이 높은 경우.\n해결: 보정 횟수를 늘립니다.\n\n[code block]\n\n---\n\n예상 결과 정리\n\n| 항목 | 값 |\n|------|-----|\n| Reynolds 수 ([math]) | 1,000 |\n| 재부착 길이 ([math]) | 6–8 |\n| 최대 역방향 속도 | [math] m/s |\n| 수렴 반복 횟수 | 300–600회 |\n\n재부착 길이는 [math]에 따라 달라지며, [math] 실험값(Armaly et al., 1983)과 …",
      "date_published": "2026-03-26T00:00:00.000Z",
      "tags": [
        "OpenFOAM",
        "튜토리얼",
        "simpleFoam",
        "후방계단",
        "난류"
      ],
      "_reading_time": "2 min read",
      "_word_count": 994
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-25-reynolds-flow-transition-visualization",
      "url": "https://cfdblog.cc/ko/posts/2026-03-25-reynolds-flow-transition-visualization",
      "title": "시각화로 이해하는 Reynolds 수와 유동 천이",
      "summary": "인터랙티브 시각화로 이해하는 Reynolds 수와 층류-난류 천이 현상",
      "content_text": "Reynolds 수란 무엇인가\n\n유체 유동을 이해할 때 가장 중요한 무차원수 중 하나가 Reynolds 수(Re)다. 이 수는 관성력과 점성력의 비를 나타낸다.\n\n[equation]\n\n여기서:\n- [math]: 유체 밀도 [math]\n- [math]: 특성 속도 [math]\n- [math]: 특성 길이 [math]\n- [math]: 동점성 계수 [math]\n- [math]: 동점도 [math]\n\n유동 체계의 구분\n\n| Reynolds 수 범위 | 유동 체계 | 특징 |\n|------------------|-----------|------|\n| [math] | 크리프 유동(Stokes flow) | 점성 지배, 완전 층류 |\n| [math] | 난류 (Turbulent) | 불규칙적 혼합, 높은 에너지 소산 |\n\n유동 천이의 물리적 메커니즘\n\n층류에서 난류로의 천이는 켈빈-헬름홀츠(Kelvin-Helmholtz) 불안정성에서 시작된다. 속도 구배가 존재하는 경계에서 작은 교란이 증폭되면서 와류(vortex)가 형성되고, 이것이 연쇄적으로 에너지 캐스케이드를 일으킨다.\n\n속도 프로파일의 변화를 수식으로 표현하면:\n\n[equation]\n\nNavier-Stokes 방정식에서 좌변의 비선형 항 [math]가 관성을 담당하고, 우변의 [math]가 점성 감쇠를 담당한다. Reynolds 수는 이 두 항의 상대적 크기를 나타낸다.\n\n속도장 시각화: Reynolds 수에 따른 유동 변화\n\n아래 시뮬레이션을 통해 Reynolds 수 변화에 따른 속도장의 변화를 직접 확인해보세요:\n\n관찰 포인트:\n- 저 Re (Re ≈ 150): 벡터가 부드럽고 규칙적으로 배열됨 — 점성이 교란을 즉시 감쇠\n- 중간 Re (Re ≈ 100500): 장애물 후류에서 비대칭성 출현 — 관성력이 점성력에 필적\n- 고 Re (Re > 1000): 벡터 방향이 불규칙해지고 와류 구조가 발달\n\n원기둥 주위 유선: 카르만 소용돌이길\n\n원기둥(cylinder)을 지나는 유동에서 Reynolds 수가 증가하면 주기적인 와류 방출 현상인 카르만 와열(Kármán vortex street)이 나타난다.\n\n방출 주파수는 Strouhal 수 [math]로 정규화된다:\n\n[equation]\n\n여기서 [math]는 와류 방출 주파수, [math]는 원기둥 직경, [math]는 자유류 속도다. 원기둥의 경우 [math] ([math]Re[math]Re[math]Re^{9/4}$로 스케일되므로, 고 Re 유동에는 난류 모델이 필수\n\n다음 주에는 유한체적법(FVM)을 이용해 이 Navier-Stokes 방정식을 어떻게 이산화하는지, 그리고 업윈드 vs 중앙차분 스킴이 정확도에 미치는 영향을 다룬다.",
      "date_published": "2026-03-25T00:00:00.000Z",
      "tags": [
        "시각화",
        "Reynolds",
        "유동천이",
        "유체역학"
      ],
      "_reading_time": "2 min read",
      "_word_count": 1183
    },
    {
      "id": "https://cfdblog.cc/ko/posts/2026-03-24-paper-review-pinn-turbulence-modeling",
      "url": "https://cfdblog.cc/ko/posts/2026-03-24-paper-review-pinn-turbulence-modeling",
      "title": "[논문 리뷰] Physics-Informed Neural Networks for Turbulence Modeling",
      "summary": "물리 법칙을 손실 함수에 직접 내장한 신경망으로 희소 데이터에서 유동장을 재구성하는 새로운 접근법",
      "content_text": "import { PINNLossLandscape } from '@/components/post-viz/2026-03-24-paper-review-pinn-turbulence-modeling/PINNLossLandscape'\n\n논문 정보\n\n- 저자: Raissi, M., Perdikaris, P., Karniadakis, G. E.\n- 학술지: Journal of Computational Physics, Vol. 378, pp. 686–707, 2019\n- DOI: 10.1016/j.jcp.2018.10.045\n- arXiv: 1711.10561\n\n---\n\n한 줄 요약\n\nNavier-Stokes 방정식을 신경망의 손실 함수에 직접 내장(Physics-Informed)하여, 압력 센서 몇 개만으로 전체 속도장을 역산하는 방법을 제안했다.\n\n---\n\n연구 배경\n\n기존 CFD는 두 가지 극단 사이 어딘가에 있다.\n\n전통적 방법 (k-ε, k-ω SST): 경험적 클로저 계수에 의존한다. Reynolds 수나 형상이 바뀌면 계수를 다시 튜닝해야 한다. 일반화 능력이 제한적이다.\n\n순수 데이터 기반 딥러닝: 대량의 라벨 데이터가 필요하고, 학습된 모델이 질량 보존이나 운동량 보존을 보장하지 않는다. 물리적으로 말이 안 되는 예측을 내놓아도 손실 함수가 모른다.\n\nPINNs는 이 간극을 메우는 시도다. 데이터가 희소해도 물리 법칙이 정규화(regularizer) 역할을 한다.\n\n---\n\n핵심 방법론\n\nPINN의 총 손실 함수는 두 항의 합이다.\n\n[equation]\n\n데이터 손실 [math]는 관측값(예: 압력 센서)과 신경망 예측의 차이다.\n\n물리 손실 [math]는 비압축성 Navier-Stokes 방정식의 잔차(residual)다.\n\n[equation]\n\n두 번째 항은 연속 방정식(질량 보존)이다. 신경망이 이 잔차를 0으로 만들도록 훈련되므로, 예측값은 항상 N-S 방정식을 근사적으로 만족한다.\n\n미분은 PyTorch/TensorFlow의 자동 미분(automatic differentiation)으로 계산한다. 별도의 수치 이산화가 필요 없다.\n\n---\n\n주요 결과\n\n| 케이스 | 조건 | 결과 |\n|--------|------|------|\n| 2D 원형 실린더 주위 유동 | Re=100, 압력 센서만 사용 | 속도장 재구성 오차  한 줄 평: \"CFD와 딥러닝의 접점을 정의한 논문. 지금 당장 OpenFOAM을 대체하진 못하지만, 역문제와 희소 데이터 재구성에서는 이미 실용적이다.\"\n\nλPDE / λBC / λdata 가중치를 흔들어 보면 PINN의 손실 균형이 얼마나 민감한지 즉시 보인다.",
      "date_published": "2026-03-24T00:00:00.000Z",
      "tags": [
        "논문리뷰",
        "PINN",
        "딥러닝",
        "난류모델"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1345
    },
    {
      "id": "https://cfdblog.cc/ko/posts/mach-architect",
      "url": "https://cfdblog.cc/ko/posts/mach-architect",
      "title": "Mach Architect: 노즐을 설계하며 배우는 압축성 유동",
      "summary": "수렴-확산 노즐의 형상과 배압을 직접 조절하며 등엔트로피 유동, 초크, 수직 충격파를 체험하는 인터랙티브 시뮬레이터입니다.",
      "content_text": "Mach Architect\n\n교과서에서 수렴-확산(C-D) 노즐 유동을 배울 때, 단면적비 [math]와 배압비 [math]에 따른 유동 레짐 변화를 그래프로만 보면 직관이 잘 잡히지 않습니다.\n\n직접 노즐을 설계하고, 배압을 돌려보세요. 4개의 레벨을 클리어하면 1D 압축성 노즐 유동의 핵심을 체득할 수 있습니다.\n\n---\n\n---\n\n조작법\n\n- 노즐 형상: SVG 위의 파란 원(control point)을 위아래로 드래그하여 단면적을 조절합니다\n- 배압: 우측 슬라이더로 [math]를 조절합니다\n- 레벨 선택: 상단 LV1LV4 버튼으로 전환합니다\n\n---\n\n레벨 해설\n\nLevel 1: Subsonic Acceleration\n\n가장 기본적인 문제입니다. 수렴 노즐에서 아음속 유동은 단면적이 줄어들수록 가속됩니다.\n등엔트로피 관계식:\n\n[equation]\n\n[math]이므로 [math]가 감소하면 [math]이 증가합니다. 목표는 출구 마하수 0.450.55입니다.\n\nLevel 2: Choking\n\n유동이 초크(choke)되면 throat에서 [math]이 됩니다. 이 상태에서는 배압을 더 낮춰도 throat 상류의 질량 유량이 변하지 않습니다.\n\n임계 압력비 ([math]):\n\n[equation]\n\n배압을 이 값 아래로 낮추거나, throat를 충분히 좁게 만드세요.\n\nLevel 3: Supersonic Nozzle Design\n\n수렴-확산 노즐에서 throat 이후 단면적이 다시 넓어지면 초음속으로 가속됩니다. [math]를 달성하려면:\n\n[equation]\n\n그리고 배압을 설계 압력(Pbdesign)까지 낮춰야 충격파 없이 완전 초음속 유동이 됩니다.\n\nLevel 4: Shock Positioning\n\n배압이 설계 압력보다 높지만 임계 압력보다 낮으면, 노즐 내부에 수직 충격파(normal shock)가 발생합니다.\n\n충격파 전후의 관계:\n\n[equation]\n\n[equation]\n\n배압을 조절하면 충격파 위치가 이동합니다. 배압이 높을수록 충격파가 throat 가까이, 낮을수록 출구 가까이 이동합니다. 목표는 [math] 구간에 배치하는 것입니다.\n\n---\n\n시뮬레이터의 물리 모델\n\n이 시뮬레이터는 다음 가정에 기반합니다:\n\n1. 1D 준1차원(quasi-1D) 유동: 단면적 변화만 고려, 점성/열전달 무시\n2. 등엔트로피 유동 (충격파 제외): [math], [math] 보존\n3. 칼로릭 완전 기체: [math] (공기)\n4. 수직 충격파: Rankine-Hugoniot 관계식 적용\n5. 노즐 형상: Hermite 보간으로 매끄러운 단면적 분포 생성\n\n충격파 위치는 출구 압력 조건을 만족시키는 위치를 이산적으로 탐색합니다. 충격파 전방은 등엔트로피 초음속, 후방은 전체 압력 손실을 반영한 등엔트로피 아음속으로 계산합니다.\n\n---\n\n더 알아보기\n\n- 압축성 다상유동 CFD 입문 - 이 시뮬레이터의 물리가 다상유동으로 확장되면 어떤 어려움이 생기는지\n- Riemann 문제부터 Godunov 기법까지 - 수직 충격파를 수치적으로 포착하는 Riemann solver\n- FDM vs FEM vs FVM - 이 1D 문제를 실제로 이산화하는 세 가지 접근법",
      "date_published": "2026-03-11T00:00:00.000Z",
      "tags": [
        "CFD",
        "Compressible-Flow",
        "Interactive",
        "Isentropic",
        "Nozzle"
      ],
      "_reading_time": "2 min read",
      "_word_count": 959
    },
    {
      "id": "https://cfdblog.cc/ko/posts/rhie-chow-multiphase",
      "url": "https://cfdblog.cc/ko/posts/rhie-chow-multiphase",
      "title": "압축성 다상유동을 위한 Rhie-Chow 보간법 총정리",
      "summary": "Collocated 격자의 체커보드 문제부터 balanced-force 다상유동까지, Rhie-Chow 보간의 수학적 본질과 OpenFOAM 구현을 체계적으로 정리합니다.",
      "content_text": "import { CheckerboardPressure } from '@/components/post-viz/rhie-chow-multiphase/CheckerboardPressure'\n\nRhie-Chow 보간: 왜 필요하고, 다상유동에서 왜 까다로운가\n\nRhie-Chow 보간(momentum-weighted interpolation, MWI)은 collocated 격자에서 체커보드 압력 진동을 억제하기 위해 face 속도를 보정하는 핵심 기법입니다. 단상 유동에서는 비교적 간단하지만, 다상유동으로 확장할 때 압력, 중력, 표면장력, 비정상 보정항의 일관된 처리가 결정적으로 중요해집니다.\n\n이 글은 Rhie & Chow(1983)의 원본부터 Bartholomew et al.(2018)의 통합 프레임워크, 그리고 OpenFOAM의 interFoam/compressibleInterFoam 구현까지를 다룹니다.\n\n---\n\n1. 반이산화 운동량 방정식에서 Face 속도 도출\n\n모든 Rhie-Chow 변형의 출발점은 셀 중심 [math]에서의 반이산화(semi-discretized) 운동량 방정식입니다:\n\n[equation]\n\n- [math]: 대각 계수 (시간 미분, 대류, 확산 기여 포함)\n- [math]: 이웃 셀 기여 + 명시적 소스\n\n셀 중심 속도를 풀면:\n\n[equation]\n\n문제: 체커보드 진동\n\n이 셀 중심 속도를 단순 선형 보간으로 face에 가져오면, 압력 구배가 [math]과 [math]만 연결하고 [math]를 건너뛰어 odd-even decoupling(체커보드)이 발생합니다.\n\nRhie-Chow의 해법\n\nFace에서 운동량 방정식 자체를 재구성하여, 넓은 스텐실의 보간된 압력 구배를 좁은(compact) face 중심 압력 구배로 대체합니다:\n\n[equation]\n\n여기서 [math]는 인접 셀 값으로 직접 계산한 face 구배이고, overbar는 셀 중심 값의 선형 보간입니다.\n\n압력 보정항 [math]는 [math]에 비례하는 저역통과 필터로 작용하여 체커보드를 억제합니다.\n\n---\n\n2. 핵심 논문별 기여\n\nRhie & Chow (1983): 원본\n\nAIAA Journal에 발표된 원본은 정상 유동 SIMPLE 알고리즘 전용이었습니다:\n\n[equation]\n\n[math]는 압력 구배를 제거한 의사속도, [math]입니다. 압력 보정항만 포함하며, 비정상항이나 이완(relaxation)항 처리가 없었습니다. 이후 Majumdar(1988)가 수렴된 해의 이완 계수 의존성을, Choi(1999)가 비정상 유동에서의 시간 간격 의존성을 지적했습니다.\n\nJasak (1996): OpenFOAM의 토대 - H/A 접근법\n\nImperial College 박사논문으로, 비정렬 다면체 격자 유한체적법을 체계화했습니다. Rhie-Chow를 명시적 보정항 없이 암묵적으로 구현한 것이 특징입니다:\n\n[equation]\n\nHbyA = H/A는 압력 영향이 제거된 속도 예측자이며, 압력 방정식은 [math]로 유도됩니다. Rhie-Chow 효과는 Laplacian 이산화(face snGrad)와 속도 보정의 구배(Gauss 정리)가 서로 다른 스텐실을 사용하는 데서 자연스럽게 발생합니다.\n\n비정상 보정은 fvc::ddtCorr로 처리하지만, 완전히 일관적이지 않아 시간 간격 의존성이 남습니다.\n\nCubero & Fueyo (2007): Compact Momentum Interpolation (CMI)\n\n시간 간격과 이완 계수 모두에 독립적인 face 속도 공식을 제안했습니다. 운동량 방정식의 각 계수를 개별적으로 일관되게 보간하는 것이 핵심입니다:\n\n[equation]\n\n- [math]: 시간 계수\n- [math]: 이완 계수\n- [math]: 공간 계수\n\n수렴 시 [math]이고 [math]이므로 비정상/이완 보정항이 자동 소멸합니다. 정상 해가 [math]와 이완 계수에 무관해지는 것이 보장됩니다.\n\nBartholomew et al. (2018): 통합 프레임워크\n\nJCP 375에서 구조/비구조 격자 모두에 적…",
      "date_published": "2026-03-10T00:00:00.000Z",
      "tags": [
        "Multiphase",
        "Rhie-Chow",
        "OpenFOAM",
        "Numerical-Methods"
      ],
      "_reading_time": "9 min read",
      "_word_count": 4468
    },
    {
      "id": "https://cfdblog.cc/ko/posts/fdm-fem-fvm",
      "url": "https://cfdblog.cc/ko/posts/fdm-fem-fvm",
      "title": "FDM vs FEM vs FVM: 세 가지 이산화 기법의 본질적 차이",
      "summary": "유한차분법(FDM), 유한요소법(FEM), 유한체적법(FVM)의 수학적 출발점, 장단점, 그리고 각각이 빛을 발하는 영역을 비교합니다.",
      "content_text": "import { StencilCompare } from '@/components/post-viz/fdm-fem-fvm/StencilCompare'\n\n같은 PDE, 세 가지 길\n\n편미분방정식(PDE)을 컴퓨터로 풀려면 연속적인 공간을 이산화(discretization)해야 합니다.\n같은 방정식이라도 어떤 철학으로 이산화하느냐에 따라 완전히 다른 수치 기법이 됩니다.\n\n간단한 1D 이류-확산 방정식을 예시로 잡겠습니다:\n\n[equation]\n\n이 하나의 방정식에 대해 FDM, FEM, FVM이 각각 어떻게 접근하는지 살펴봅시다.\n\n---\n\n1. 유한차분법 (Finite Difference Method, FDM)\n\n핵심 아이디어\n\n> 미분을 차분(difference)으로 직접 근사한다.\n\n가장 직관적인 접근입니다.\n격자점(node)에서의 함수값을 Taylor 전개하여 도함수를 근사합니다.\n\n수학적 출발: Taylor 전개\n\n점 [math]에서의 Taylor 전개:\n\n[equation]\n\n이로부터 차분 근사를 유도합니다:\n\n전방 차분 (Forward):\n[equation]\n\n중앙 차분 (Central):\n[equation]\n\n2차 도함수:\n[equation]\n\n이류-확산 방정식에 적용\n\n중앙 차분을 사용하면:\n\n[equation]\n\n격자점의 미지수 [math]에 대한 연립 ODE 시스템이 됩니다.\n\n장단점\n\n장점:\n- 개념이 단순하고 구현이 쉬움\n- 구조 격자(structured grid)에서 매우 효율적\n- 고차 정확도 달성이 용이 (compact scheme, spectral-like scheme)\n- 직교 격자에서 행렬 구조가 깔끔 (band matrix)\n\n단점:\n- 비정렬 격자(unstructured grid) 적용이 어려움 - 이것이 치명적\n- 복잡한 형상에 대한 격자 생성이 까다로움\n- 보존 법칙을 자동으로 만족시키지 않음\n\n대표 적용 분야\n\n- DNS/LES (직교 격자 기반 난류 시뮬레이션)\n- 기상/해양 모델 (구조 격자)\n- 지진파 전파 시뮬레이션\n- Compact scheme 기반 고정밀 계산\n\n---\n\n2. 유한요소법 (Finite Element Method, FEM)\n\n핵심 아이디어\n\n> 해를 기저함수(basis function)의 선형결합으로 근사하고,\n> 가중 잔차(weighted residual)를 최소화한다.\n\nFEM은 미분 방정식을 풀지 않습니다.\n대신 약형식(weak formulation)이라 불리는 적분 형태로 변환합니다.\n\n수학적 출발: 약형식 (Weak Form)\n\n원래 PDE(강형식, strong form)에 시험함수(test function) [math]를 곱하고 적분합니다:\n\n[equation]\n\n확산항에 부분 적분(integration by parts)을 적용하면:\n\n[equation]\n\n이것이 약형식입니다. 핵심 변화를 주목하세요:\n\n- 원래 2차 도함수가 필요했지만, 부분 적분 후 1차 도함수만 필요\n- 해의 연속성 요구사항이 완화됨 ([math])\n- 경계 조건이 자연스럽게 포함됨 (Neumann BC = 우변)\n\nGalerkin 근사\n\n해를 기저함수 [math]의 선형결합으로 표현합니다:\n\n[equation]\n\nGalerkin 방법에서는 시험함수와 기저함수를 같은 공간에서 택합니다 ([math]):\n\n[equation]\n\n행렬 형태로:\n\n[equation]\n\n- [math]: 질량 행렬 (mass matrix)\n- [math]: 강성 행렬 (stiffness matrix)\n- [math]: 경계/소스 벡터\n\n기저함수의 선택\n\n가장 많이 쓰이는 것은 라그랑주 다항식(Lagrange polynomial) 기반 요소입니다:\n\n| 요소 | 차수 | 절점 수 (2D 삼각형) | 특징 |\n|------|------|:---:|------|\n| P1 (Linear) | 1차 | 3 | 가장 기본, 저비용 |\n| P2 (Quadratic) | 2차 | 6 | 곡면 형상 표현 가능 |\n| P3 (Cubic) | 3차 | 10 | 고정밀, 비용 증가 |\n\n장단점\n\n장점:\n- 비정렬 격…",
      "date_published": "2026-03-09T00:00:00.000Z",
      "tags": [
        "CFD",
        "FDM",
        "FEM",
        "FVM",
        "Numerical-Methods"
      ],
      "_reading_time": "6 min read",
      "_word_count": 2868
    },
    {
      "id": "https://cfdblog.cc/ko/posts/numerical-dungeon",
      "url": "https://cfdblog.cc/ko/posts/numerical-dungeon",
      "title": "Numerical Dungeon: 게임으로 배우는 수치해석",
      "summary": "CFL 조건부터 압축성 다상유동까지, 5단계 던전을 클리어하며 수치해석의 핵심 개념을 마스터해보세요.",
      "content_text": "Numerical Dungeon\n\n수치해석을 책으로만 배우면 지루합니다.\n5개의 스테이지를 클리어하며 핵심 개념을 체득해보세요.\n\nRules\n\n- HP 3칸 - 오답 시 HP가 1 감소합니다. HP가 0이 되면 Game Over!\n- XP - 정답마다 XP를 획득합니다. 뒤로 갈수록 보상이 큽니다.\n- 난이도 - Stage 12는 기본, 34는 핵심 이론, 5는 최종 보스입니다.\n\n각 스테이지에서는 먼저 개념 설명을 읽고, 이어지는 퀴즈에 답합니다.\n틀려도 상세한 해설을 제공하니 배움의 기회로 삼으세요.\n\n---\n\n---\n\nStage별 더 알아보기\n\n위 던전을 클리어했다면, 각 주제를 더 깊이 공부해보세요:\n\nStage 1: CFL Condition\nCFL 조건은 domain of dependence 개념과 직결됩니다.\n물리적 정보의 전파 속도보다 수치적 정보의 전파 속도가 빨라야 합니다.\n암시적(implicit) 스킴은 CFL 제한이 없지만, 비선형 시스템을 풀어야 하는 대가가 있습니다.\n\nStage 2: Numerical Diffusion\n수치 확산을 줄이려면 고차 스킴을 써야 하지만,\nGodunov 정리에 의해 비선형 제한자(limiter)가 필요합니다.\n대표적인 limiter: minmod, van Leer, superbee, MC limiter.\n\nStage 3: Godunov's Theorem\n이 정리가 TVD(Total Variation Diminishing), ENO, WENO 등\n현대 수치 기법의 발전을 촉발했습니다.\n핵심은 \"비선형성(nonlinearity)이 곧 고차+안정의 열쇠\"라는 것입니다.\n\nStage 4: Riemann Problem\nSod, Lax, Shu-Osher 등의 표준 테스트 문제로 Riemann solver를 검증할 수 있습니다.\n이 블로그의 Riemann 문제부터 Godunov 기법까지 글을 참고하세요.\n\nStage 5: Multiphase Pressure Oscillation\nAbgrall의 조건은 다상유동 수치해석의 출발점입니다.\n5-Equation Model 구현 가이드에서 실제 코드로 확인해보세요.",
      "date_published": "2026-03-08T00:00:00.000Z",
      "tags": [
        "CFD",
        "Numerical-Methods",
        "Interactive",
        "Education"
      ],
      "_reading_time": "1 min read",
      "_word_count": 636
    },
    {
      "id": "https://cfdblog.cc/ko/posts/five-equation-model",
      "url": "https://cfdblog.cc/ko/posts/five-equation-model",
      "title": "5-Equation Model 구현 가이드: Python으로 만드는 다상유동 솔버",
      "summary": "5-equation diffuse interface model을 Python으로 직접 구현하며, 1D 충격파-버블 상호작용 문제를 시뮬레이션합니다.",
      "content_text": "import { VolumeFractionAdvect } from '@/components/post-viz/five-equation-model/VolumeFractionAdvect'\n\n5-Equation Model 직접 구현하기\n\n이론만으로는 감이 오지 않는 법입니다.\n이 글에서는 1D 5-equation diffuse interface model을 Python으로 직접 구현하고,\n충격파가 기체 버블을 관통하는 문제를 시뮬레이션합니다.\n\n지배 방정식 정리\n\n1D 5-equation model의 보존 변수와 플럭스:\n\n[equation]\n\n5번째 방정식 ([math])은 비보존형이므로 별도 처리합니다:\n\n[equation]\n\n상태방정식: Stiffened Gas EOS\n\n두 유체 모두 stiffened gas EOS를 사용합니다:\n\n[equation]\n\n혼합 규칙(mixture rule)으로 전체 압력을 구합니다:\n\n[equation]\n\nPython 구현\n\n초기 설정과 EOS\n\n[code block]\n\nHLLC Flux 계산\n\n[code block]\n\n시간 적분 (1st order)\n\n[code block]\n\n초기 조건: 충격파-기체 버블\n\npython\nInitial condition: shock hitting an air bubble in water\nU = np.zeros((4, N))\nalpha1 = np.zeros(N)\n\nfor i in range(N):\n    if x[i]",
      "date_published": "2026-03-07T00:00:00.000Z",
      "tags": [
        "Multiphase",
        "Diffuse-Interface",
        "Python",
        "Implementation"
      ],
      "_reading_time": "2 min read",
      "_word_count": 761
    },
    {
      "id": "https://cfdblog.cc/ko/posts/interface-capturing",
      "url": "https://cfdblog.cc/ko/posts/interface-capturing",
      "title": "계면 포착 기법 비교: VOF vs Level Set vs Diffuse Interface",
      "summary": "압축성 다상유동에서 계면을 추적하는 세 가지 대표 기법의 원리, 장단점, 그리고 적용 사례를 비교합니다.",
      "content_text": "import { VOFvsLevelSet } from '@/components/post-viz/interface-capturing/VOFvsLevelSet'\n\n계면을 어떻게 다룰 것인가\n\n압축성 다상유동 시뮬레이션에서 가장 근본적인 질문 중 하나는\n\"두 유체 사이의 계면(interface)을 수치적으로 어떻게 표현할 것인가\"입니다.\n\n크게 세 가지 계열의 방법이 존재합니다:\n\n1. Volume of Fluid (VOF)\n2. Level Set\n3. Diffuse Interface (확산 계면)\n\n1. Volume of Fluid (VOF)\n\n원리\n\n각 셀에서 특정 유체가 차지하는 체적 분율(volume fraction) [math]를 추적합니다.\n\n[equation]\n\n[math]이면 해당 셀이 유체 A로 가득 차 있고,\n[math]이면 유체 B, [math]: 유체 A\n- $\\phi",
      "date_published": "2026-03-06T00:00:00.000Z",
      "tags": [
        "Multiphase",
        "VOF",
        "Level-Set",
        "Diffuse-Interface"
      ],
      "_reading_time": "3 min read",
      "_word_count": 1503
    },
    {
      "id": "https://cfdblog.cc/ko/posts/riemann-solvers",
      "url": "https://cfdblog.cc/ko/posts/riemann-solvers",
      "title": "Riemann 문제부터 Godunov 기법까지 - 수치 플럭스의 핵심",
      "summary": "CFD의 심장부인 Riemann 문제를 파헤치고, Exact/Approximate Riemann Solver가 어떻게 수치 플럭스를 결정하는지 알아봅니다.",
      "content_text": "import { RiemannFan } from '@/components/post-viz/riemann-solvers/RiemannFan'\n\nRiemann 문제: CFD의 심장\n\n유한체적법(Finite Volume Method)에서 셀 경계의 수치 플럭스(numerical flux)를\n어떻게 계산하느냐가 해의 정확도와 안정성을 좌우합니다.\n이 수치 플럭스를 결정하는 열쇠가 바로 Riemann 문제입니다.\n\nRiemann 문제란?\n\n초기 조건이 하나의 불연속면을 사이에 두고 좌우로 다른 상수 상태를 갖는 초기값 문제입니다:\n\n[equation]\n\n1차원 Euler 방정식에 대해 이 문제의 해석해는 세 개의 파(wave)로 구성됩니다:\n\n1. 좌향 파 (rarefaction 또는 shock)\n2. 접촉 불연속 (contact discontinuity)\n3. 우향 파 (rarefaction 또는 shock)\n\nGodunov의 아이디어 (1959)\n\nGodunov의 핵심 통찰은 간단하지만 강력합니다:\n\n> 셀 경계에서의 플럭스를 구하려면, 인접한 두 셀의 평균값을 좌우 상태로 놓고\n> Riemann 문제를 풀면 된다.\n\n유한체적법의 업데이트 공식:\n\n[equation]\n\n여기서 [math]가 바로 Riemann 문제의 해로부터 결정되는 수치 플럭스입니다.\n\nExact Riemann Solver\n\n정확한 Riemann 풀이는 Newton-Raphson 반복법으로 star region의 압력 [math]를 구합니다.\n좌우 파의 종류(shock/rarefaction)에 따라 Rankine-Hugoniot 관계식 또는\n등엔트로피 관계식을 적용합니다.\n\nShock wave 관계식 ([math], [math] or [math]):\n\n[equation]\n\n여기서 [math], [math] 입니다.\n\nRarefaction wave 관계식 ([math]):\n\n[equation]\n\n[math]는 다음 조건을 만족합니다:\n\n[equation]\n\nApproximate Riemann Solver: 왜 필요한가?\n\nExact solver는 반복 계산이 필요하므로 비쌉니다.\n실제 CFD 코드에서는 대부분 근사 Riemann 풀이(approximate Riemann solver)를 사용합니다.\n\nRoe Solver (1981)\n\nRoe는 비선형 Riemann 문제를 선형화(linearization)하여\n행렬 [math]에 대한 선형 Riemann 문제로 바꿉니다:\n\n[equation]\n\nRoe 평균(Roe average)을 사용하여 [math]를 구성합니다:\n\n[equation]\n\n장점: 접촉 불연속을 정확히 포착. 단점: 엔트로피 조건 위배 가능 (entropy fix 필요).\n\nHLLC Solver (Toro, 1994)\n\nHLL 풀이를 개선하여 접촉 불연속(Contact)을 복원한 것이 HLLC입니다.\n세 개의 파속(wave speed) [math], [math], [math]을 추정합니다:\n\n$$\n\\hat{\\mathbf{F}}{i+1/2} = \\begin{cases}\n\\mathbf{F}L & \\text{if } SL > 0 \\\\\n\\mathbf{F}^L & \\text{if } SL \\leq 0",
      "date_published": "2026-03-05T00:00:00.000Z",
      "tags": [
        "Riemann-Solver",
        "Godunov",
        "Numerical-Methods"
      ],
      "_reading_time": "2 min read",
      "_word_count": 1097
    },
    {
      "id": "https://cfdblog.cc/ko/posts/compressible-multiphase-intro",
      "url": "https://cfdblog.cc/ko/posts/compressible-multiphase-intro",
      "title": "압축성 다상유동 CFD 입문: 왜 어렵고, 왜 중요한가",
      "summary": "압축성 다상유동 수치해석이 단상 유동과 근본적으로 다른 이유, 그리고 이 분야가 왜 아직도 활발한 연구 주제인지를 정리합니다.",
      "content_text": "import { SpeedOfSoundMix } from '@/components/post-viz/compressible-multiphase-intro/SpeedOfSoundMix'\n\n압축성 다상유동이란?\n\n유체역학에서 다상유동(multiphase flow)은 두 가지 이상의 상(phase)이 공존하는 흐름을 말합니다.\n물과 공기, 연료 액적과 고온 가스, 수중 폭발에서의 기체 버블 등이 대표적입니다.\n\n여기에 압축성(compressibility)이 더해지면 문제가 급격히 복잡해집니다.\n각 상이 서로 다른 상태방정식(EOS)을 가지며, 계면(interface)을 사이에 두고\n충격파(shock wave)가 발생하고 반사, 투과, 굴절됩니다.\n\n단상 압축성 유동과의 차이\n\n단상 Euler 방정식은 다음과 같습니다:\n\n[equation]\n\n여기서 보존 변수 [math]이고,\n단일 EOS (예: ideal gas [math])로 시스템이 닫힙니다.\n\n다상유동에서는 계면을 경계로 EOS가 바뀝니다.\n기체 영역에서는 [math]인 ideal gas를,\n액체 영역에서는 stiffened gas EOS를 쓴다고 하면:\n\n[equation]\n\n문제는 수치적으로 계면 근처에서 두 EOS가 혼합(mixing)될 때 발생합니다.\n보존 변수 기반으로 단순히 평균을 내면 비물리적인 압력 진동(pressure oscillation)이 생깁니다.\n\n왜 어려운가: 핵심 난제 세 가지\n\n1. 계면에서의 압력 진동\n\n가장 유명한 문제입니다. 1994년 Abgrall이 지적한 이래,\n이 문제를 해결하는 것이 다상유동 수치 기법의 출발점이 되었습니다.\n\n> \"압축성 다상유동 수치해석의 역사는 곧 압력 진동과의 싸움의 역사이다.\"\n\n단순한 보존형 유한체적법(conservative finite volume)은 계면에서\n[math]가 중간값을 갖게 되면서 spurious oscillation을 만들어냅니다.\n\n2. 상태방정식의 다양성\n\n실제 문제에서는 ideal gas만으로 부족합니다.\n물은 Tait EOS 또는 stiffened gas EOS,\n고압 상태에서는 Jones-Wilkins-Lee (JWL) EOS,\n반응성 유동에서는 화학 반응과 결합된 EOS가 필요합니다.\n\n각 EOS에 대해 Riemann solver를 일반화해야 하므로 구현 복잡도가 크게 올라갑니다.\n\n3. 계면 추적 vs 계면 포착\n\n계면을 어떻게 다룰 것인가는 크게 두 가지 접근이 있습니다:\n\n| 접근법 | 방법 | 장점 | 단점 |\n|--------|------|------|------|\n| Sharp interface | Ghost Fluid, Front Tracking | 계면이 선명 | 위상 변화 처리 어려움 |\n| Diffuse interface | 5-equation, 6-equation model | 위상 변화 자연스럽게 처리 | 계면 스미어링 |\n\n왜 중요한가\n\n압축성 다상유동 시뮬레이션은 다양한 공학 분야에서 핵심입니다:\n\n- 수중 폭발(UNDEX): 함정 생존성 평가\n- 초음속 연소: 스크램젯 엔진 내부의 연료 분사/혼합\n- 의료 분야: 충격파 쇄석술(lithotripsy)에서의 기포 거동\n- 우주 추진: 극저온 추진제의 슬로싱(sloshing)\n\n다음 글에서는\n\n이 분야의 핵심 도구인 Riemann 문제와 Godunov 기법을 다룹니다.\n단상 Euler 방정식의 Riemann 문제를 먼저 이해한 뒤,\n이것이 다상유동으로 어떻게 확장되는지 살펴보겠습니다.\n\n탐침 슬라이더로 α=0.5 부근으로 가져가면 Wood 음속이 단상의 1/100까지 떨어진다.",
      "date_published": "2026-03-04T00:00:00.000Z",
      "tags": [
        "CFD",
        "Multiphase",
        "Compressible-Flow",
        "Introduction"
      ],
      "_reading_time": "2 min read",
      "_word_count": 1036
    },
    {
      "id": "https://cfdblog.cc/ko/posts/draft-post",
      "url": "https://cfdblog.cc/ko/posts/draft-post",
      "title": "[비공개] 아직 작성 중인 포스트",
      "summary": "이 포스트는 메인 목록에 나타나지 않아야 하며, 비밀번호로만 미리 볼 수 있습니다.",
      "content_text": "비밀 포스트\n\n이 내용은 관리자 비밀번호를 입력해야만 보입니다!\n\n[equation]",
      "date_published": "2026-03-04T00:00:00.000Z",
      "tags": [
        "Draft",
        "Test"
      ],
      "_reading_time": "1 min read",
      "_word_count": 29
    },
    {
      "id": "https://cfdblog.cc/ko/posts/hello-blog",
      "url": "https://cfdblog.cc/ko/posts/hello-blog",
      "title": "Contentlayer & LaTeX 블로그 시작하기",
      "summary": "Next.js 16와 Contentlayer를 이용한 기술 블로그 구축 가이드",
      "content_text": "안녕하세요!\n\n이 블로그는 Next.js와 Contentlayer를 사용하여 만들어졌습니다.\n\n수식 테스트 (LaTeX)\n\n인라인 수식: [math]\n\n블록 수식:\n[equation]\n\n코드 테스트\n\n[code block]",
      "date_published": "2026-03-03T00:00:00.000Z",
      "tags": [
        "Next.js",
        "Contentlayer",
        "MDX",
        "LaTeX"
      ],
      "_reading_time": "1 min read",
      "_word_count": 60
    }
  ]
}