<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Younglin's CFD Blog (es)</title>
    <description>Notas de campo de un investigador en CFD multifase compresible — ecuaciones, código, visualizaciones interactivas</description>
    <link>https://tech-blog.dev/es</link>
    <atom:link href="https://tech-blog.dev/feed-es.xml" rel="self" type="application/rss+xml"/>
    <language>es-ES</language>
    <managingEditor>noreply@tech-blog.dev (Younglin)</managingEditor>
    <lastBuildDate>Thu, 23 Apr 2026 04:36:55 GMT</lastBuildDate>
    <ttl>1440</ttl>
    <item>
      <title><![CDATA[물줄기는 왜 방울로 끊어지는가 — Plateau–Rayleigh 불안정성과 분열 레짐]]></title>
      <description><![CDATA[표면장력이 물기둥을 방울로 조각내는 원리와 분사 설계의 무차원 지도

[10 min read · 1,812 words]]]></description>
      <content:encoded><![CDATA[import { PlateauRayleighJet } from '@/components/post-viz/2026-04-23-plateau-rayleigh-jet-breakup/PlateauRayleighJet'

주방 수도꼭지를 반쯤만 열어보자. 처음엔 매끈한 기둥이다. 그런데 10cm쯤 떨어진 지점부터 규칙적인 방울로 끊어진다. 매일 보는 장면이지만, 왜 연속체가 스스로 끊어지는지 답하기는 어렵다. 이 포스트는 1849년 Joseph Plateau와 1879년 Lord Rayleigh가 내놓은 고전적 설명을 따라가고, 엔진 분사노즐·잉크젯 설계에서 오늘도 쓰는 Weber 수(관성력/표면장력 비)와 Ohnesorge 수(점성/관성·표면장력 비)가 어떻게 그 결과를 확장하는지 본다. 끝까지 읽으면 "왜 어떤 제트는 굵은 방울로 끊어지고, 어떤 제트는 안개처럼 부서지는가"를 하나의 레짐 지도로 답할 수 있다.

연속체가 왜 끊어지는 길을 택하는가

표면장력은 표면적을 줄이려는 힘이다. 같은 부피의 액체라면 공 모양일 때 표면적이 가장 작다. 그래서 한 덩어리 물은 무중력에서 구를 이룬다.

그렇다면 같은 부피의 긴 물기둥과, 그 물을 일정 간격으로 잘라 만든 방울 사슬 중 어느 쪽이 표면적이 더 작을까. 직관과 달리 방울 사슬 쪽이 작다 — 단, 잘라내는 간격이 기둥의 둘레보다 길 때만 그렇다. 물기둥이 스스로 분열하는 이유는 여기서 나온다. 에너지가 낮은 상태로 굴러 떨어지려는 자연스러운 결과다.

Plateau의 기하학적 직관

Plateau는 반지름 [math]인 원기둥이 축 방향으로 파장 [math]의 약한 변형을 받았을 때 표면적 변화를 계산했다.

[equation]

여기서 [math] 는 무차원 파수 math다. 이 값이 1보다 작으면 [math], 섭동은 가라앉는다.

조건을 다시 쓰면 간단하다.

$[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$를 조절한다.

---
Read more: https://tech-blog.dev/es/posts/2026-04-23-plateau-rayleigh-jet-breakup]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-23-plateau-rayleigh-jet-breakup</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-23-plateau-rayleigh-jet-breakup</guid>
      <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>유체역학</category>
      <category>유동현상</category>
      <category>Plateau-Rayleigh</category>
      <category>Weber수</category>
      <category>Ohnesorge</category>
      <category>액주분열</category>
    </item>
    <item>
      <title><![CDATA[CFD 선형 솔버 고르기: Jacobi부터 BiCGSTAB까지 수렴 속도 비교]]></title>
      <description><![CDATA[Krylov 부분공간 4대 솔버의 성격과 수렴 속도를 코드·시뮬레이션으로 비교한다

[10 min read · 1,842 words]]]></description>
      <content:encoded><![CDATA[1952년 Cornelius Lanczos와 Magnus Hestenes, Eduard Stiefel은 한 학회에서 우연히 같은 결과를 독립적으로 들고 나타났다. 대칭 양정부호(SPD) 행렬을 [math]번 반복만에 푸는 알고리즘이었다. 지금 우리가 켤레기울기법(Conjugate Gradient, CG) 이라 부르는 그 방법이다. 흥미로운 건 70년이 지난 오늘도 CFD 솔버의 심장에는 이 아이디어가 거의 그대로 살아 있다는 점이다 — Krylov 부분공간에서 해를 찾는다. 이 포스트는 CFD에서 가장 자주 쓰이는 네 솔버(Jacobi, Gauss-Seidel, CG, BiCGSTAB)의 수렴 속도를 Python과 인터랙티브 시뮬레이션으로 비교한다. 끝까지 읽으면 "이 문제엔 어느 솔버가 맞는가"를 실무에서 바로 판단할 수 있다.

왜 CFD는 선형 시스템을 반복으로 풀까

Navier–Stokes를 이산화하면 매 스텝마다 [math] 형태의 큰 선형 시스템이 떨어진다. 여기서 [math] 는 계수 행렬, [math] 는 셀 중심 변수 벡터, [math] 는 우변 소스다. 3D 격자 100만 셀이면 [math] 는 [math] 크기의 희소 행렬이 된다. LU 분해(행렬을 하삼각·상삼각 곱으로 쪼개는 직접법)는 이 크기에서 메모리와 CPU를 함께 태운다. OpenFOAM, SU2, Gerris 같은 오픈소스 CFD 코드가 예외 없이 반복법(iterative method) 을 쓰는 이유다.

반복법의 기본 아이디어는 단순하다. 초기 추측 [math] 에서 출발해, 잔차 [math] 가 허용치 아래로 떨어질 때까지 [math] 를 조금씩 고친다. 문제는 "조금씩"을 어떻게 정의하느냐다. 이 정의가 솔버의 이름을 가른다.

Krylov 부분공간이라는 아이디어

초기 잔차 [math] 에 행렬 [math] 를 반복해서 곱한 벡터들이 만드는 공간이 있다.

[equation]

[math] 이 Krylov 부분공간, [math] 은 차원, [math] 은 선형결합으로 채운 공간이다. Krylov 계열 솔버는 해를 [math] 안에서 찾되, 남은 잔차 [math] 이 어떤 최적성 조건을 만족하도록 결정한다.

해를 부분공간에 가두면 이점 두 가지가 있다. 첫째, 행렬-벡터 곱 외에 다른 연산이 없다 — 희소 구조를 그대로 살린다. 둘째, 이론적으로 해당 부분공간 안에서 최적인 해를 뽑을 수 있다. CG는 A-노름 오차를, GMRES는 2-노름 잔차를 Krylov 공간 안에서 정확히 최소화한다.

네 솔버의 성격 차이

| 솔버 | 요구 행렬 | 메모리 | 장점 | 단점 |
|------|-----------|--------|------|------|
| Jacobi | 대각 지배 권장 | 매우 낮음 | 병렬화 쉬움, 구현 10줄 | 느림 (스펙트럼 반경 [math]) |
| Gauss-Seidel | 임의 | 매우 낮음 | Jacobi의 약 2배 빠름 | 본질적 순차, GPU 불리 |
| CG | SPD 필수 | 벡터 4개 | SPD에 최적, 3항 …

---
Read more: https://tech-blog.dev/es/posts/2026-04-22-cfd-linear-solvers-krylov]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-22-cfd-linear-solvers-krylov</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-22-cfd-linear-solvers-krylov</guid>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>알고리즘</category>
      <category>Linear-Solver</category>
      <category>Krylov</category>
      <category>수치해석</category>
    </item>
    <item>
      <title><![CDATA[벽거리를 O(N log N)에 푸는 법: Eikonal 방정식과 Fast Marching]]></title>
      <description><![CDATA[RANS 난류 모델의 필수 입력인 벽거리를 효율적으로 계산하는 알고리즘

[13 min read · 2,480 words]]]></description>
      <content:encoded><![CDATA[import { EikonalFrontPropagation } from '@/components/post-viz/2026-04-22-wall-distance-eikonal-fast-marching/EikonalFrontPropagation'

1996년, UC Berkeley의 James Sethian은 의료 영상에서 혈관 경계를 추적하는 알고리즘을 다듬고 있었다. 그 결과물인 Fast Marching Method는 지금 엉뚱한 곳에서 쓰인다. 항공기 날개 주위의 RANS 해석기가 매번 돌아갈 때, 바로 이 알고리즘이 각 격자점의 벽거리(wall distance)를 만들어낸다. Spalart-Allmaras 모델과 k-ω SST 모델은 격자마다 "가장 가까운 벽이 어디인가"라는 값을 입력으로 요구한다. 이 글은 그 값을 순진하게 구할 때 생기는 비용, Eikonal 방정식(|∇d|=1/F 형태의 쌍곡성 PDE)으로 문제를 바꾸는 아이디어, 그리고 Dijkstra의 연속판인 Fast Marching으로 [math]에 해를 얻는 방법을 정리한다.

벽거리는 왜 난류 모델에 필요한가

경계층 난류의 통계량은 벽에서의 거리 [math]에 강하게 의존한다. RANS(Reynolds-Averaged Navier-Stokes) 모델은 그 의존성을 대수식으로 끼워 넣는다. Spalart-Allmaras는 destruction 항에서 math를 직접 사용한다. k-ω SST는 blending function [math], [math] 안에 [math]가 들어간다. LES와의 혼합 모델(DES, DDES, IDDES)에서도 벽거리가 스위치 역할을 한다.

문제는 [math]가 메시의 기하량이라는 것이다. 메시가 움직이거나 변형되면 매 시간 스텝마다 다시 계산해야 한다. 회전 기계(컴프레서, 펌프)처럼 로터-스테이터 경계가 상대 운동을 하는 경우가 여기 해당한다.

순진한 방법의 함정

바로 떠오르는 방법은 "모든 벽면과 모든 셀의 거리를 계산해 최솟값을 고른다"이다. 실제로 교과서 예제에서는 이걸 쓴다.

비용은 [math]이다. 항공기 전체를 푼다고 해보자. 10M 셀, 0.5M 벽면이면 5조 번의 거리 계산이다. 이게 매 시간 스텝마다 돈다면 해석이 끝나지 않는다. KD-tree 같은 공간 자료구조로 [math]까지 낮출 수 있지만, 복잡한 형상의 벽 근접 쿼리는 여전히 부담이다.

Eikonal 방정식으로 생각을 바꾼다

벽거리를 PDE의 해로 보자. "벽에서 0이고, 모든 방향으로 기울기 크기가 1"인 함수가 바로 거리장이다.

[equation]

[math]는 벽까지의 "도달 시간", [math]는 전파 속도(기본 1), [math]는 벽 집합이다. [math]로 고정하면 [math]는 그대로 유클리드 거리다.

이 방정식은 쌍곡성(hyperbolic)이다. 정보가 특성선(벽에서 바깥으로 뻗는 직선)을 따라 한 방향으로만 흐른다. 이 단방향성이 효율적 알고리즘의 열쇠다. "이미 값이 정해진 점에서만 값이 들어온다"는 성질을 이용하면, 모든 점을…

---
Read more: https://tech-blog.dev/es/posts/2026-04-22-wall-distance-eikonal-fast-marching]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-22-wall-distance-eikonal-fast-marching</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-22-wall-distance-eikonal-fast-marching</guid>
      <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>알고리즘</category>
      <category>Eikonal</category>
      <category>Fast-Marching</category>
      <category>메시</category>
    </item>
    <item>
      <title><![CDATA[벌레는 꿀 속에서 헤엄친다 — Reynolds 수가 바꾸는 유동의 세계]]></title>
      <description><![CDATA[무차원화로 드러나는 Reynolds 수, 스케일이 만드는 유동의 차이

[10 min read · 1,864 words]]]></description>
      <content:encoded><![CDATA[박테리아는 수영을 할 수 없다. 정확히 말하면, 우리가 "수영"이라고 부르는 관성 기반 추진은 박테리아에게 통하지 않는다. 꼬리를 저어 관성으로 앞으로 나가는 우리와 달리, 박테리아는 관성이 사라진 세계 — 마치 투명한 꿀 속 같은 곳 — 에서 살기 때문이다. 이 포스트는 같은 Navier–Stokes 방정식이 왜 스케일에 따라 완전히 다른 세상을 만드는지, 그리고 그 차이를 한 숫자로 요약하는 Reynolds 수(관성력/점성력 비) 가 어떻게 유체역학의 "숨겨진 문법"이 되는지 살펴본다. 끝에는 무차원화(방정식의 단위를 벗겨 구조만 남기는 작업)가 왜 유체역학의 첫 문법인지도 함께 짚는다.

같은 방정식, 다른 세상

대왕고래는 바다에서 헤엄친다. 물 분자는 물론 같은 물이다. 그런데 1 μm 박테리아에게 물은 전혀 다른 물질처럼 느껴진다. 같은 Navier–Stokes 방정식을 써도 스케일이 바뀌면 지배하는 항이 바뀌기 때문이다.

비압축 Navier–Stokes는 이렇게 생겼다.

[equation]

[math]는 밀도, [math]는 속도장, [math]는 압력, [math]는 점성계수다. 좌변은 관성(질량 × 가속도), 우변의 [math]는 점성(내부 마찰) 항이다. 이 두 힘이 매 순간 싸운다. 누가 이기는가.

방정식의 옷을 벗겨라: 무차원화

답은 스케일이 정한다. 이를 보이려면 방정식을 무차원화해야 한다. 대표 길이 [math], 대표 속도 [math], 대표 시간 [math], 대표 압력 [math]로 모든 양을 나눈다.

[equation]

변수 하나하나의 의미는 "그 물리량을 자기 자신의 자연스러운 크기로 측정한 것"이다. 이 정의를 Navier–Stokes에 대입해 정리하면 단위가 전부 사라진 깔끔한 식이 남는다.

[equation]

모든 물리 단위가 사라지고 딱 하나의 숫자 [math]만 남는다. 이것이 Reynolds 수다.

[equation]

[math]는 동점성계수(kinematic viscosity)다. [math], [math], [math]이 클수록 관성이, [math]가 클수록 점성이 이긴다. 같은 물이라도 [math]이 작아지면 [math]는 선형으로 떨어진다. 결국 세상을 지배하는 항이 바뀐다.

스케일이 Reynolds 수를 바꾼다

숫자로 느껴보자. 물의 동점성계수 [math]를 기준으로 대표 생명체들의 [math]는 아래와 같다.

[code block]

가장 큰 값과 가장 작은 값이 무려 13자릿수 차이다. 같은 물 안에서다. Reynolds 수는 단순한 숫자가 아니라, 같은 유체 안에서도 서로 다른 "세상"을 라벨링하는 주소다.

박테리아처럼 [math]인 영역에서는 무차원 방정식의 관성 항이 사실상 사라지고, 양변에 [math]를 곱하면 Stokes 방정식 [math]이 된다. 시간 미분이 없다. 즉 박테리아의 유동은 "과거를 기억하지 못한다". 힘을 빼는 순간 속도도 0이 된다.

시각화로 직관 만들기

아래 시뮬레이션에서 직접 Reynolds 수를 조작해보자.

Reyn…

---
Read more: https://tech-blog.dev/es/posts/2026-04-21-reynolds-number-scale-fluid-mechanics]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-21-reynolds-number-scale-fluid-mechanics</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-21-reynolds-number-scale-fluid-mechanics</guid>
      <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>유체역학</category>
      <category>유동현상</category>
      <category>Reynolds</category>
      <category>무차원화</category>
    </item>
    <item>
      <title><![CDATA[불연속 갈레르킨법(DGM): 비정렬 격자 압축성 유동 해석의 고정밀 이산화]]></title>
      <description><![CDATA[DGM의 약형식 유도부터 Gauss 구적법, 비정렬 격자 구현까지 단계별 정리

[7 min read · 1,286 words]]]></description>
      <content:encoded><![CDATA[불연속 갈레르킨법(Discontinuous Galerkin Method, DGM)은 유한요소법(FEM)과 유한체적법(FVM)의 장점을 결합한 수치해석 기법입니다. 셀 내부에서는 고차 다항식 기저함수를 사용하고, 셀 경계에서는 수치 플럭스로 정보를 교환합니다. 비정렬 격자에서 압축성 유동을 고정밀로 해석할 때 강력한 선택지입니다.

지배방정식과 플럭스 분리

압축성 유동의 보존 방정식:

[equation]

여기서
- [math]: 보존 변수 벡터
- [math]: 대류(convective) 플럭스
- [math]: 점성(viscous) 플럭스
- [math]: 소스항

기저함수 전개와 약형식 유도

셀 [math] 내부에서 해를 기저함수의 선형결합으로 근사합니다:

[equation]

[math]는 셀 내 자유도 수로, 근사 다항식 차수 [math]에 따라 결정됩니다 ([math] in 3D).

시험함수 [math]를 곱하고 [math]에서 적분하면:

[equation]

Green 공식(부분 적분)을 적용하면 체적 적분과 경계 적분으로 나뉩니다:

[equation]

경계면의 [math]는 인접 셀 정보를 이용한 수치 플럭스입니다 (Roe, HLLC 등).

질량 행렬과 시간 적분

[math] 번째 기저함수 계수에 대한 ODE로 정리하면:

[equation]

여기서 질량 행렬(mass matrix)은:

[equation]

직교 기저함수(Taylor basis 또는 Legendre 다항식 등)를 사용하면 [math]이 대각행렬이 되어 역행렬 계산 비용이 없어집니다. 잔차 벡터 [math]은 체적 적분항과 면 플럭스항의 합입니다:

[equation]

Gauss 구적법 적용

체적·면 적분은 Gauss-Legendre 구적법으로 수치 계산합니다. 차수 [math]의 다항식을 정확히 적분하려면 최소 [math] 차 이상의 적분이 필요합니다.

셀 유형별 Gauss 포인트 개수 (대표 차수별):

| 셀 유형     | 1차 | 2차 | 3차 |
|------------|-----|-----|-----|
| Tetrahedron | 1  | 4   | 10  |
| Hexahedron  | 1  | 8   | 27  |
| Prism       | 3  | 9   | 18  |
| Pyramid     | 1  | 5   | 15  |

면(face) 유형에 대해서는 셀 포인트의 3배(3D 투영)를 사용합니다.

알고리즘 구현 순서

실제 구현에서는 다음 순서로 진행합니다:

1. 셀·면 분류: 테트라/헥사/프리즘/피라미드/폴리헤드론
2. 기저함수 준비: 각 셀 유형 × 근사 차수에 맞는 [math], [math] 계산
3. Gauss 포인트 캐시: 참조 요소(reference element) 좌표와 가중치를 메모리에 저장
4. 변수 초기화: [math] 설정 (자유흐름 조건 등)
5. 루프(시간 전진):
   - 체적 적분: [math] — 각 Gauss 포인트에서 플럭스 계산 후 합산
   - 면 플럭스: [math] …

---
Read more: https://tech-blog.dev/es/posts/2026-04-20-discontinuous-galerkin-method-cfd]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-20-discontinuous-galerkin-method-cfd</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-20-discontinuous-galerkin-method-cfd</guid>
      <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>FEM</category>
      <category>DGM</category>
      <category>고차 정확도</category>
      <category>압축성 유동</category>
    </item>
    <item>
      <title><![CDATA[강체 역학을 위한 FEM: 쿼터니언 기반 회전 처리와 관성 텐서]]></title>
      <description><![CDATA[FEM 강체 시뮬레이션에서 쿼터니언으로 회전을 표현하고 관성 텐서를 다루는 방법

[7 min read · 1,346 words]]]></description>
      <content:encoded><![CDATA[강체 역학의 기본 방정식

유체-구조 연성(FSI) 해석이나 DEM(Discrete Element Method) 시뮬레이션에서 강체의 운동을 정확히 기술하는 것은 필수적이다. 강체는 변형이 없는 물체로, 임의의 두 점 사이 거리가 항상 일정하게 유지된다.

강체 내 임의의 입자 [math]의 속도는 다음과 같이 분해된다.

[equation]

여기서 [math]은 질량 중심의 속도, [math]는 각속도, [math]는 질량 중심으로부터 입자 [math]까지의 변위 벡터이다.

선형 모멘텀과 각 모멘텀

전체 선형 모멘텀은 뉴턴 제2법칙으로부터

[equation]

여기서 [math]는 전체 질량이다. 질량 중심의 가속도는

[equation]

전체 각 모멘텀은

[equation]

여기서 [math]는 관성 텐서(inertia tensor), [math]는 전체 토크(torque)다.

관성 텐서

관성 텐서는 질량 중심을 기준으로

[equation]

연속체로 확장하면

[equation]

여기서 [math]는 단위 텐서이고, [math]은 외적(outer product)이다.

물체가 회전하면 관성 텐서는 방위 행렬(orientation matrix) [math]에 의해 변환된다.

[equation]

여기서 [math]는 물체 좌표계(body frame)에서의 초기 관성 텐서로, 시뮬레이션 시작 시 한 번만 계산하면 된다.

쿼터니언을 이용한 회전 표현

오일러 각(Euler angles)으로 회전을 표현하면 짐벌 락(gimbal lock) 문제가 발생한다. 이를 피하기 위해 쿼터니언(quaternion)을 사용한다.

쿼터니언 [math]는 스칼라 부분과 벡터 부분으로 구성된다.

[equation]

단위 축 [math]에 대해 각도 [math]만큼의 회전은

[equation]

두 쿼터니언 [math], [math]의 합성 회전은 곱으로 표현된다.

[equation]

이를 이용하면 방위 행렬 [math]은 쿼터니언 성분으로 명시적으로 표현된다.

[equation]

쿼터니언의 시간 미분은 각속도 [math]와 연결된다.

[equation]

FEM 이산화와 사면체 형상 함수

FEM에서 강체의 변위장을 이산화할 때, 사면체 요소의 형상 함수(shape function)는

[equation]

여기서 [math]는 무차원 체적 좌표(barycentric coordinates)이며 [math] 조건을 만족한다.

선형 사면체 요소에서 변위 보간은

[equation]

강체 구속 조건을 적용하면 자유도는 6개(선형 3 + 회전 3)로 줄어든다.

Python 구현 예시

[code block]

실무 주의사항

1. 쿼터니언 정규화 망각
수치 적분이 반복되면 [math]이 되어 회전 행렬이 비직교(non-orthogonal)가 된다. 매 타임스텝마다 q /= norm(q) 를 반드시 수행해야 한다.

2. 관성 텐서의 좌표계 혼동
[math]는 물체 고정 좌표계(body frame)에서 정의된다. 월드 좌…

---
Read more: https://tech-blog.dev/es/posts/2026-04-20-fem-rigid-body-dynamics-quaternion]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-04-20-fem-rigid-body-dynamics-quaternion</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-04-20-fem-rigid-body-dynamics-quaternion</guid>
      <pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>FEM</category>
      <category>강체역학</category>
      <category>쿼터니언</category>
      <category>CFD</category>
    </item>
    <item>
      <title><![CDATA[Dean 유동: 나선형 관의 이차 유동 해석해와 CFD 검증]]></title>
      <description><![CDATA[곡선 관에서 원심력이 만드는 한 쌍의 Dean 와류 — 해석해 유도부터 수치 검증까지

[11 min read · 2,135 words]]]></description>
      <content:encoded><![CDATA[나선형 증기발생기(Helical Steam Generator) 설계에서 빠지지 않는 질문이 있다.
"직관 대비 얼마나 열전달이 좋아지는가?"
그 답의 핵심이 Dean 와류(Dean vortices) — 곡선 관에서 원심력이 만들어내는 한 쌍의 나선형 이차 유동이다.

1928년 W. R. Dean이 처음 기술한 이 유동은 핵공학, 화학공학, 생체역학에 걸쳐 반복 등장하는 고전 문제다. 오늘은 Dean의 섭동 전개를 직접 유도하고, Python으로 시각화한 뒤, 유한차분법으로 검증해본다.

---

1. 문제 설정

곡률 반경 [math]인 원호형 관(관 반경 [math])을 생각하자. 원통 좌표계 [math]를 관 단면에 잡고, [math]를 관 축 방향 호 좌표로 정의한다.

[equation]

비압축성 Navier-Stokes 방정식을 곡선 좌표계로 표현하면, 관 축방향 운동량에 원심력 항이 추가된다.

[equation]

원심력이 없다면 ([math]) 이것은 곧바로 포아즈이유 유동으로 환원된다.

---

2. 해석해 유도

2-1. 무차원화

특성 속도 [math] (Poiseuille 중심 속도)로 무차원화하면:

[equation]

0차 해(Poiseuille)는:

[equation]

2-2. Dean 수 정의

Dean은 다음 무차원수를 도입했다:

[equation]

현대적으로는 관 직경 [math] 기준으로 쓰기도 한다:

[equation]

2-3. 섭동 전개 (Dean 1928)

[math] 조건에서 스트림 함수 [math]를 [math]으로 전개한다:

[equation]

1차 이차 유동 스트림 함수:

[equation]

이차 유동 속도 성분 ([math]에서 유도):

[equation]

축방향 속도의 1차 보정:

[equation]

최종 축방향 속도 (2차 근사):

[equation]

---

3. 물리적 해석

- 이차 유동: [math] 의존성 → 바깥쪽(outer wall, [math])으로 유체가 쏠리고 양측에서 되돌아오는 한 쌍의 와류
- 축방향 속도 왜곡: 원심력으로 고속 코어가 바깥쪽으로 치우침 → 속도 프로파일 비대칭
- 전단응력 증가: 이차 유동이 경계층을 교란 → 열전달 계수 향상 (Nusselt 수 ↑)

열전달 향상 상관식 (Dittus-Boelter 대비):

[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$.
이 영역에서 Dean 와류가 완전 발달하여 열전달 계수가 직관 대비 3060% 향상된다.

그런데 비등(boiling)이 동반되면 이야기가 달라진다 — 원심력이 기포를 관 안쪽 벽면(inner wall)으로 밀어 국소 건도(void fraction) 불균형이 생긴다. 이것이 DNB(임계열속) 예측을 어렵게 만드는 핵심 원인이다. 1D 상관식…

---
Read more: https://tech-blog.dev/es/posts/2026-03-28-dean-flow-analytical-solution]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-28-dean-flow-analytical-solution</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-28-dean-flow-analytical-solution</guid>
      <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>해석해</category>
      <category>고전유동</category>
      <category>CFD검증</category>
      <category>Dean유동</category>
      <category>이차유동</category>
      <category>나선형관</category>
    </item>
    <item>
      <title><![CDATA[포아즈이유 유동: 해석해 유도와 유한차분 검증]]></title>
      <description><![CDATA[가장 단순한 점성 유동의 완전 해석해를 손으로 유도하고, FD 코드로 수치 정확도를 검증하는 CFD 입문 벤치마크

[10 min read · 1,875 words]]]></description>
      <content:encoded><![CDATA[포아즈이유 유동(Poiseuille flow)은 두 평행 평판 사이 또는 원형 관 내부에서 일정한 압력 구배에 의해 구동되는 완전 발달 층류다.
정확한 해석해가 존재하기 때문에 CFD 코드 검증의 첫 번째 테스트 케이스로 전 세계 어느 교과서에나 등장한다.

오늘은 채널 유동(2D 평판 사이)을 대상으로 해석해를 단계별로 유도하고, 간단한 유한차분 코드를 작성해 수렴 차수를 확인한다.

문제 설정

형상 및 경계 조건

두 무한 평행 평판 사이의 완전 발달 층류 유동을 고려한다.

- 채널 반폭: [math] (평판은 [math]에 위치)
- 유동 방향: [math] (무한히 길다고 가정)
- 경계 조건: 양 벽면에서 no-slip [math] [math]
- 구동력: 일정한 압력 구배 [math]은 상수)

지배 방정식

완전 발달 유동이므로 [math], [math]이다. [math]-방향 나비에–스토크스 방정식:

[equation]

완전 발달 조건([math], [math])을 적용하면:

[equation]

해석해 유도

1단계: ODE로 단순화

[equation]

2단계: 1차 적분

[equation]

3단계: 2차 적분

[equation]

4단계: 경계 조건 적용

[math]:

[equation]

[math]:

[equation]

(1) [math] (2): [math] (대칭)

(1) [math] (2): [math]

최종 해석해

[equation]

채널 중심([math])에서 최대 속도:

[equation]

물리적 해석

속도 프로파일

해석해는 포물선(parabola) 분포다. 벽면 마찰이 유동 단면 전체에 균일하게 전달되어, 중심에서 최대, 벽에서 0이 된다.

무차원 속도 [math]는 채널 반폭 [math]나 점도 [math]에 무관한 보편적 프로파일이다.

벽면 전단 응력

[equation]

(크기: [math]) 압력 구배가 클수록, 채널이 넓을수록 벽 마찰이 커진다.

체적 유량

[equation]

이를 Hagen-Poiseuille 법칙의 2D 버전이라 부른다. 유량이 [math]에 비례하므로, 채널이 두 배 넓어지면 유량은 여덟 배 증가한다.

Python으로 해석해 시각화

[code block]

유한차분법으로 수치 검증

FD 이산화

[math]를 2차 중앙차분으로 이산화한다. 균일 격자 [math]:

[equation]

경계 조건: [math].

이를 삼대각 행렬(tridiagonal) 연립방정식으로 쓰면:

[equation]

Python 구현

[code block]

수렴 결과

| [math] | [math] | [math] 오차 | 수렴 차수 |
|----:|-----------|------------|----------|
| 4 | 0.4000 | 2.78e-16 | — |
| 8 | 0.2222 | 1.67e-16 | 2.0 |
| 16 | 0.1176 | 2.22e-16 | 2.0 |
| 32 | 0.0606 | 2.78e-16 | 2…

---
Read more: https://tech-blog.dev/es/posts/2026-03-28-poiseuille-flow-analytical-solution]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-28-poiseuille-flow-analytical-solution</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-28-poiseuille-flow-analytical-solution</guid>
      <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>해석해</category>
      <category>고전유동</category>
      <category>CFD검증</category>
      <category>포아즈이유</category>
      <category>유한차분</category>
    </item>
    <item>
      <title><![CDATA[[CFD Q&A] simpleFoam 압력 잔차가 수렴하지 않을 때]]></title>
      <description><![CDATA[실무에서 만난 SIMPLE 알고리즘 발산 해결기 — relaxation factor 설정이 핵심이었다

[6 min read · 1,081 words]]]></description>
      <content:encoded><![CDATA[지난주에 꽤 시간을 잡아먹은 문제가 있었다. simpleFoam을 돌리다가 pressure residual이 1e-3 아래로 떨어지지 않고 오히려 올라가기 시작했다. 처음엔 메시 문제인가 싶었는데, 결론은 relaxation factor였다.

문제 상황

- 소프트웨어: OpenFOAM v2312
- 형상: 2D 직사각형 채널, inlet–outlet 경계
- 난류 모델: k-ε (standard)
- 솔버: simpleFoam (정상 상태)

처음 2030 iteration은 잘 내려가다가 갑자기 pressure residual이 튀기 시작했다.

[code block]

velocity는 잘 수렴하는데 pressure만 계속 이상하다. 전형적인 압력-속도 커플링 불안정 패턴이다.

원인 분석 과정

1단계: 메시 품질 확인

일단 checkMesh부터 돌렸다.

[code block]

최대 non-orthogonality 32도, max skewness 0.8 — 나쁘지 않다. 메시 문제는 아닌 것 같다.

2단계: 경계 조건 점검

inlet에서 pressure를 zeroGradient, outlet을 fixedValue 0으로 설정했다. 이건 표준 설정이라 문제없다.

근데 초기 p 필드를 확인해보니 inlet 쪽에 이상하게 큰 값이 들어가 있었다. 처음에 funkySetFields로 뭔가 실험하다가 남은 흔적이었다.

3단계: fvSolution 확인

[code block]

U=0.9는 꽤 공격적인 값이다. SIMPLE에서 velocity relaxation을 높이면 수렴 속도는 빠르지만 pressure 업데이트가 따라가지 못하면 발산한다.

원인 두 가지가 겹쳤다:
1. relaxation factor가 과도하게 높음
2. 초기 p 필드에 잘못된 값이 남아 있음

해결책

relaxation factor 낮추기

[code block]

처음 실행할 때는 보수적으로 시작하는 게 맞다. 수렴이 확인되면 조금씩 올린다.

초기 p 필드 초기화

[code block]

아니면 직접 0/p 파일 열어서 internalField uniform 0;으로 맞춰주면 된다.

[code block]

검증

수정 후 다시 돌리면 이렇게 나온다.

[code block]

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 …

---
Read more: https://tech-blog.dev/es/posts/2026-03-27-simpleFoam-pressure-divergence]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-27-simpleFoam-pressure-divergence</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-27-simpleFoam-pressure-divergence</guid>
      <pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD실무</category>
      <category>QA</category>
      <category>OpenFOAM</category>
      <category>SIMPLE</category>
      <category>수렴</category>
    </item>
    <item>
      <title><![CDATA[[OpenFOAM 튜토리얼] 후방 계단 유동 해석 — simpleFoam으로 재순환 영역 포착하기]]></title>
      <description><![CDATA[OpenFOAM simpleFoam으로 후방 계단(Backward Facing Step) 비압축성 유동을 단계별로 해석하는 가이드

[11 min read · 2,109 words]]]></description>
      <content:encoded><![CDATA[이 튜토리얼에서는 후방 계단(Backward Facing Step) 형상에서 재순환 유동을 simpleFoam으로 시뮬레이션합니다.
계단 하류에 형성되는 재순환 영역(recirculation zone)과 재부착 지점(reattachment point)을 직접 확인하는 것이 목표입니다.

---

선행 조건

- OpenFOAM 버전: v2312 이상 (OpenFOAM.com 또는 OpenFOAM.org 모두 가능)
- 사전 지식: 기본 터미널 명령어, OpenFOAM 케이스 구조(0/constant/system) 이해
- 필요 소프트웨어: ParaView 5.x 이상 (결과 시각화)

---

1단계: 케이스 디렉토리 생성

[code block]

케이스 구조는 다음과 같습니다.

[code block]

[code block]

---

2단계: 격자 생성 — blockMeshDict

system/blockMeshDict는 계단 형상을 직육면체 블록 조합으로 정의합니다.
아래는 단순화된 2D 케이스 예시입니다 (계단 높이 H = 0.1 m).

[code block]

[code block]

예상 출력:
[code block]

---

3단계: 경계 조건 설정

0/U — 속도 경계 조건

[code block]

0/p — 압력 경계 조건

[code block]

0/k — 난류 운동에너지

[code block]

---

4단계: 물성치 및 난류 모델 설정

constant/transportProperties

[code block]

constant/turbulenceProperties

[code block]

---

5단계: 수치 기법 설정

system/fvSchemes

[code block]

system/fvSolution

[code block]

---

6단계: 해석 실행

[code block]

예상 출력 (수렴 과정):
[code block]

수렴 기준은 모든 변수의 residual이 1e-4 이하가 될 때입니다.

---

7단계: 결과 시각화 (ParaView)

[code block]

ParaView에서 다음 순서로 결과를 확인합니다.

1. Coloring 드롭다운 → U 선택 → Magnitude로 속도 크기 표시
2. Glyph 필터 추가 → 벡터 방향 시각화 (재순환 영역 확인)
3. Stream Tracer 필터 → 유선 그리기

foamToVTK로 파일 변환 후 후처리:

[code block]

Python으로 재부착 길이 자동 추출:

[code block]

---

흔한 오류와 해결책

오류 1: FOAM FATAL ERROR: Cannot find file "0/epsilon"

[code block]

원인: 0/epsilon 파일 누락.
해결: k 파일과 동일한 형식으로 0/epsilon을 생성합니다.

[code block]

---

오류 2: 해석 발산 (Floating point exception)

[code block]

원인: 완화계수가 너무 크거나 격…

---
Read more: https://tech-blog.dev/es/posts/2026-03-26-openfoam-backward-facing-step]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-26-openfoam-backward-facing-step</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-26-openfoam-backward-facing-step</guid>
      <pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>OpenFOAM</category>
      <category>튜토리얼</category>
      <category>simpleFoam</category>
      <category>후방계단</category>
      <category>난류</category>
    </item>
    <item>
      <title><![CDATA[Número de Reynolds y transición del flujo, mediante visualización]]></title>
      <description><![CDATA[Comprende el número de Reynolds y la transición laminar–turbulenta con visualizaciones interactivas

[4 min read · 602 words]]]></description>
      <content:encoded><![CDATA[¿Qué es el número de Reynolds?

Uno de los números adimensionales más importantes en mecánica de fluidos es el número de Reynolds (Re). Expresa la razón entre fuerzas de inercia y fuerzas viscosas.

[equation]

Donde:
- [math]: densidad del fluido [math]
- [math]: velocidad característica [math]
- [math]: longitud característica [math]
- [math]: viscosidad dinámica [math]
- [math]: viscosidad cinemática [math]

Regímenes de flujo

| Rango de Re | Régimen | Características |
|------------------|-----------|------|
| [math] | Flujo de Stokes | Dominio viscoso, plenamente laminar |
| [math] | Turbulento | Mezcla irregular, alta disipación |

Mecanismo físico de la transición

La transición de laminar a turbulento comienza con la inestabilidad de Kelvin–Helmholtz. En una frontera con gradiente de velocidad, pequeñas perturbaciones se amplifican formando vórtices, que cascada de energía en cadena.

La ecuación rectora:

[equation]

En las ecuaciones de Navier–Stokes, el término no lineal de la izquierda [math] aporta inercia, y [math] a la derecha aporta amortiguamiento viscoso. Re mide el tamaño relativo de ambos.

Visualización del campo de velocidades: cambios con Re

Prueba la simulación abajo para ver cómo cambia el campo de velocidades al variar Re:

Qué observar:
- Re bajo (Re ≈ 1–50): vectores suaves y ordenados — la viscosidad amortigua perturbaciones de inmediato
- Re medio (Re ≈ 100–500): asimetría en estelas de obstáculos — la inercia rivaliza con la viscosidad
- Re al…

---
Read more: https://tech-blog.dev/es/posts/2026-03-25-reynolds-flow-transition-visualization]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-25-reynolds-flow-transition-visualization</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-25-reynolds-flow-transition-visualization</guid>
      <pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>시각화</category>
      <category>Reynolds</category>
      <category>유동천이</category>
      <category>유체역학</category>
    </item>
    <item>
      <title><![CDATA[[논문 리뷰] Physics-Informed Neural Networks for Turbulence Modeling]]></title>
      <description><![CDATA[물리 법칙을 손실 함수에 직접 내장한 신경망으로 희소 데이터에서 유동장을 재구성하는 새로운 접근법

[6 min read · 1,151 words]]]></description>
      <content:encoded><![CDATA[논문 정보

- 저자: Raissi, M., Perdikaris, P., Karniadakis, G. E.
- 학술지: Journal of Computational Physics, Vol. 378, pp. 686–707, 2019
- DOI: 10.1016/j.jcp.2018.10.045
- arXiv: 1711.10561

---

한 줄 요약

Navier-Stokes 방정식을 신경망의 손실 함수에 직접 내장(Physics-Informed)하여, 압력 센서 몇 개만으로 전체 속도장을 역산하는 방법을 제안했다.

---

연구 배경

기존 CFD는 두 가지 극단 사이 어딘가에 있다.

전통적 방법 (k-ε, k-ω SST): 경험적 클로저 계수에 의존한다. Reynolds 수나 형상이 바뀌면 계수를 다시 튜닝해야 한다. 일반화 능력이 제한적이다.

순수 데이터 기반 딥러닝: 대량의 라벨 데이터가 필요하고, 학습된 모델이 질량 보존이나 운동량 보존을 보장하지 않는다. 물리적으로 말이 안 되는 예측을 내놓아도 손실 함수가 모른다.

PINNs는 이 간극을 메우는 시도다. 데이터가 희소해도 물리 법칙이 정규화(regularizer) 역할을 한다.

---

핵심 방법론

PINN의 총 손실 함수는 두 항의 합이다.

[equation]

데이터 손실 [math]는 관측값(예: 압력 센서)과 신경망 예측의 차이다.

물리 손실 [math]는 비압축성 Navier-Stokes 방정식의 잔차(residual)다.

[equation]

두 번째 항은 연속 방정식(질량 보존)이다. 신경망이 이 잔차를 0으로 만들도록 훈련되므로, 예측값은 항상 N-S 방정식을 근사적으로 만족한다.

미분은 PyTorch/TensorFlow의 자동 미분(automatic differentiation)으로 계산한다. 별도의 수치 이산화가 필요 없다.

---

주요 결과

| 케이스 | 조건 | 결과 |
|--------|------|------|
| 2D 원형 실린더 주위 유동 | Re=100, 압력 센서만 사용 | 속도장 재구성 오차  한 줄 평: "CFD와 딥러닝의 접점을 정의한 논문. 지금 당장 OpenFOAM을 대체하진 못하지만, 역문제와 희소 데이터 재구성에서는 이미 실용적이다."

---
Read more: https://tech-blog.dev/es/posts/2026-03-24-paper-review-pinn-turbulence-modeling]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/2026-03-24-paper-review-pinn-turbulence-modeling</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/2026-03-24-paper-review-pinn-turbulence-modeling</guid>
      <pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>논문리뷰</category>
      <category>CFD</category>
      <category>PINN</category>
      <category>딥러닝</category>
      <category>난류모델</category>
    </item>
    <item>
      <title><![CDATA[Mach Architect: aprende flujo compresible diseñando toberas]]></title>
      <description><![CDATA[Simulador interactivo para experimentar flujo isentrópico, choke y ondas de choque normales ajustando directamente la geometría y la contrapresión de una tobera convergente-divergente.

[3 min read · 490 words]]]></description>
      <content:encoded><![CDATA[Mach Architect

Estudiar el flujo en una tobera convergente-divergente (C-D) solo desde libros dificulta entender intuitivamente cómo el cociente de áreas [math] y el cociente de contrapresión [math] cambian el régimen de flujo.

Diseña tú la tobera y mueve el dial de la contrapresión. Al superar 4 niveles, asimilas lo esencial del flujo compresible 1D en toberas.

---

---

Controles

- Geometría de la tobera: arrastra los puntos de control azules en el SVG arriba o abajo para ajustar la sección
- Contrapresión: el deslizador derecho fija [math]
- Selección de nivel: cambia con los botones LV1–LV4 arriba

---

Guía por niveles

Nivel 1: aceleración subsónica

El caso más básico. En una tobera convergente, el flujo subsónico se acelera al reducirse la sección.
Relación isentrópica:

[equation]

Como [math], al disminuir [math] aumenta [math]. La meta es Mach de salida 0.45–0.55.

Nivel 2: choke

Cuando el flujo se bloquea (choke), [math] en la garganta. En este estado, bajar más la contrapresión no cambia el flujo másico aguas arriba.

Cociente de presión crítica ([math]):

[equation]

Baja la contrapresión bajo este valor, o estrecha lo suficiente la garganta.

Nivel 3: diseño de tobera supersónica

En una tobera C-D, al ensancharse el área tras la garganta el flujo se acelera a supersónico. Para alcanzar [math]:

[equation]

Y la contrapresión debe bajar a la presión de diseño (Pbdesign) para flujo plenamente supersónico sin choques.

Nivel 4: posicionamiento del choque

Si…

---
Read more: https://tech-blog.dev/es/posts/mach-architect]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/mach-architect</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/mach-architect</guid>
      <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Compressible-Flow</category>
      <category>Interactive</category>
      <category>Isentropic</category>
      <category>Nozzle</category>
    </item>
    <item>
      <title><![CDATA[압축성 다상유동을 위한 Rhie-Chow 보간법 총정리]]></title>
      <description><![CDATA[Collocated 격자의 체커보드 문제부터 balanced-force 다상유동까지, Rhie-Chow 보간의 수학적 본질과 OpenFOAM 구현을 체계적으로 정리합니다.

[19 min read · 3,775 words]]]></description>
      <content:encoded><![CDATA[Rhie-Chow 보간: 왜 필요하고, 다상유동에서 왜 까다로운가

Rhie-Chow 보간(momentum-weighted interpolation, MWI)은 collocated 격자에서 체커보드 압력 진동을 억제하기 위해 face 속도를 보정하는 핵심 기법입니다. 단상 유동에서는 비교적 간단하지만, 다상유동으로 확장할 때 압력, 중력, 표면장력, 비정상 보정항의 일관된 처리가 결정적으로 중요해집니다.

이 글은 Rhie & Chow(1983)의 원본부터 Bartholomew et al.(2018)의 통합 프레임워크, 그리고 OpenFOAM의 interFoam/compressibleInterFoam 구현까지를 다룹니다.

---

1. 반이산화 운동량 방정식에서 Face 속도 도출

모든 Rhie-Chow 변형의 출발점은 셀 중심 [math]에서의 반이산화(semi-discretized) 운동량 방정식입니다:

[equation]

- [math]: 대각 계수 (시간 미분, 대류, 확산 기여 포함)
- [math]: 이웃 셀 기여 + 명시적 소스

셀 중심 속도를 풀면:

[equation]

문제: 체커보드 진동

이 셀 중심 속도를 단순 선형 보간으로 face에 가져오면, 압력 구배가 [math]과 [math]만 연결하고 [math]를 건너뛰어 odd-even decoupling(체커보드)이 발생합니다.

Rhie-Chow의 해법

Face에서 운동량 방정식 자체를 재구성하여, 넓은 스텐실의 보간된 압력 구배를 좁은(compact) face 중심 압력 구배로 대체합니다:

[equation]

여기서 [math]는 인접 셀 값으로 직접 계산한 face 구배이고, overbar는 셀 중심 값의 선형 보간입니다.

압력 보정항 [math]는 [math]에 비례하는 저역통과 필터로 작용하여 체커보드를 억제합니다.

---

2. 핵심 논문별 기여

Rhie & Chow (1983): 원본

AIAA Journal에 발표된 원본은 정상 유동 SIMPLE 알고리즘 전용이었습니다:

[equation]

[math]는 압력 구배를 제거한 의사속도, [math]입니다. 압력 보정항만 포함하며, 비정상항이나 이완(relaxation)항 처리가 없었습니다. 이후 Majumdar(1988)가 수렴된 해의 이완 계수 의존성을, Choi(1999)가 비정상 유동에서의 시간 간격 의존성을 지적했습니다.

Jasak (1996): OpenFOAM의 토대 - H/A 접근법

Imperial College 박사논문으로, 비정렬 다면체 격자 유한체적법을 체계화했습니다. Rhie-Chow를 명시적 보정항 없이 암묵적으로 구현한 것이 특징입니다:

[equation]

HbyA = H/A는 압력 영향이 제거된 속도 예측자이며, 압력 방정식은 [math]로 유도됩니다. Rhie-Chow 효과는 Laplacian 이산화(face snGrad)와 속도 보정의 구배(Gauss 정리)가 서로 다른 스텐실을 사용하는 데서 자연스럽게 발생합니다.

비정상 보정은 fvc::ddt…

---
Read more: https://tech-blog.dev/es/posts/rhie-chow-multiphase]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/rhie-chow-multiphase</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/rhie-chow-multiphase</guid>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Multiphase</category>
      <category>Rhie-Chow</category>
      <category>OpenFOAM</category>
      <category>Numerical-Methods</category>
    </item>
    <item>
      <title><![CDATA[FDM vs FEM vs FVM: 세 가지 이산화 기법의 본질적 차이]]></title>
      <description><![CDATA[유한차분법(FDM), 유한요소법(FEM), 유한체적법(FVM)의 수학적 출발점, 장단점, 그리고 각각이 빛을 발하는 영역을 비교합니다.

[13 min read · 2,474 words]]]></description>
      <content:encoded><![CDATA[같은 PDE, 세 가지 길

편미분방정식(PDE)을 컴퓨터로 풀려면 연속적인 공간을 이산화(discretization)해야 합니다.
같은 방정식이라도 어떤 철학으로 이산화하느냐에 따라 완전히 다른 수치 기법이 됩니다.

간단한 1D 이류-확산 방정식을 예시로 잡겠습니다:

[equation]

이 하나의 방정식에 대해 FDM, FEM, FVM이 각각 어떻게 접근하는지 살펴봅시다.

---

1. 유한차분법 (Finite Difference Method, FDM)

핵심 아이디어

> 미분을 차분(difference)으로 직접 근사한다.

가장 직관적인 접근입니다.
격자점(node)에서의 함수값을 Taylor 전개하여 도함수를 근사합니다.

수학적 출발: Taylor 전개

점 [math]에서의 Taylor 전개:

[equation]

이로부터 차분 근사를 유도합니다:

전방 차분 (Forward):
[equation]

중앙 차분 (Central):
[equation]

2차 도함수:
[equation]

이류-확산 방정식에 적용

중앙 차분을 사용하면:

[equation]

격자점의 미지수 [math]에 대한 연립 ODE 시스템이 됩니다.

장단점

장점:
- 개념이 단순하고 구현이 쉬움
- 구조 격자(structured grid)에서 매우 효율적
- 고차 정확도 달성이 용이 (compact scheme, spectral-like scheme)
- 직교 격자에서 행렬 구조가 깔끔 (band matrix)

단점:
- 비정렬 격자(unstructured grid) 적용이 어려움 - 이것이 치명적
- 복잡한 형상에 대한 격자 생성이 까다로움
- 보존 법칙을 자동으로 만족시키지 않음

대표 적용 분야

- DNS/LES (직교 격자 기반 난류 시뮬레이션)
- 기상/해양 모델 (구조 격자)
- 지진파 전파 시뮬레이션
- Compact scheme 기반 고정밀 계산

---

2. 유한요소법 (Finite Element Method, FEM)

핵심 아이디어

> 해를 기저함수(basis function)의 선형결합으로 근사하고,
> 가중 잔차(weighted residual)를 최소화한다.

FEM은 미분 방정식을 풀지 않습니다.
대신 약형식(weak formulation)이라 불리는 적분 형태로 변환합니다.

수학적 출발: 약형식 (Weak Form)

원래 PDE(강형식, strong form)에 시험함수(test function) [math]를 곱하고 적분합니다:

[equation]

확산항에 부분 적분(integration by parts)을 적용하면:

[equation]

이것이 약형식입니다. 핵심 변화를 주목하세요:

- 원래 2차 도함수가 필요했지만, 부분 적분 후 1차 도함수만 필요
- 해의 연속성 요구사항이 완화됨 ([math])
- 경계 조건이 자연스럽게 포함됨 (Neumann BC = 우변)

Galerkin 근사

해를 기저함수 [math]의 선형결합으로 표현합니다:

[equation]

Galerkin 방법에서…

---
Read more: https://tech-blog.dev/es/posts/fdm-fem-fvm]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/fdm-fem-fvm</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/fdm-fem-fvm</guid>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>FDM</category>
      <category>FEM</category>
      <category>FVM</category>
      <category>Numerical-Methods</category>
    </item>
    <item>
      <title><![CDATA[Numerical Dungeon: aprender métodos numéricos jugando]]></title>
      <description><![CDATA[Desde la condición CFL hasta flujo multifase compresible: domina los conceptos clave superando 5 niveles de mazmorra.

[2 min read · 271 words]]]></description>
      <content:encoded><![CDATA[Numerical Dungeon

Aprender métodos numéricos solo desde libros resulta tedioso.
Supera 5 niveles y absorbe los conceptos clave de forma práctica.

Reglas

- 3 HP — cada respuesta incorrecta resta 1 HP. ¡Game over con 0!
- XP — cada acierto otorga XP. Los niveles avanzados dan más recompensa.
- Dificultad — Niveles 1–2 son básicos, 3–4 cubren teoría central, 5 es el jefe final.

Cada nivel comienza con una explicación conceptual, seguida de un cuestionario.
Las respuestas erróneas vienen con explicaciones detalladas: aprovéchalas como oportunidad de aprendizaje.

---

---

Profundizando por nivel

Tras completar la mazmorra, profundiza en cada tema:

Nivel 1: Condición CFL
La condición CFL se relaciona directamente con el concepto de domain of dependence (dominio de dependencia).
La velocidad de propagación numérica debe superar a la física.
Los esquemas implícitos no tienen límite CFL, pero exigen resolver sistemas no lineales.

Nivel 2: Difusión numérica
Reducir la difusión numérica requiere esquemas de alto orden, pero
el teorema de Godunov exige limitadores no lineales.
Limitadores comunes: minmod, van Leer, superbee, MC limiter.

Nivel 3: Teorema de Godunov
Este teorema impulsó esquemas modernos como TVD, ENO y WENO.
Su esencia: "la no linealidad es la llave del alto orden + estabilidad".

Nivel 4: Problema de Riemann
Pruebas estándar como Sod, Lax y Shu–Osher validan los Riemann solvers.
Consulta Del problema de Riemann a los esquemas Godunov-type en este blog.

Nivel 5…

---
Read more: https://tech-blog.dev/es/posts/numerical-dungeon]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/numerical-dungeon</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/numerical-dungeon</guid>
      <pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Numerical-Methods</category>
      <category>Interactive</category>
      <category>Education</category>
    </item>
    <item>
      <title><![CDATA[5-Equation Model 구현 가이드: Python으로 만드는 다상유동 솔버]]></title>
      <description><![CDATA[5-equation diffuse interface model을 Python으로 직접 구현하며, 1D 충격파-버블 상호작용 문제를 시뮬레이션합니다.

[7 min read · 1,346 words]]]></description>
      <content:encoded><![CDATA[5-Equation Model 직접 구현하기

이론만으로는 감이 오지 않는 법입니다.
이 글에서는 1D 5-equation diffuse interface model을 Python으로 직접 구현하고,
충격파가 기체 버블을 관통하는 문제를 시뮬레이션합니다.

지배 방정식 정리

1D 5-equation model의 보존 변수와 플럭스:

[equation]

5번째 방정식 ([math])은 비보존형이므로 별도 처리합니다:

[equation]

상태방정식: Stiffened Gas EOS

두 유체 모두 stiffened gas EOS를 사용합니다:

[equation]

혼합 규칙(mixture rule)으로 전체 압력을 구합니다:

[equation]

Python 구현

초기 설정과 EOS

[code block]

HLLC Flux 계산

[code block]

시간 적분 (1st order)

[code block]

초기 조건: 충격파-기체 버블

[code block]

주의사항

1. [math]의 범위 제한

[math]이 정확히 0이나 1이 되면 EOS 계산에서 division by zero가 발생합니다.
항상 [math] ([math])으로 clipping합니다.

2. 혼합 음속: Wood의 공식

혼합 영역에서의 음속은 직관과 다르게 매우 낮아질 수 있습니다.
이는 물리적으로 올바른 현상이며, CFL 조건에 영향을 줍니다.

[equation]

[math] 근처에서 [math]는 두 유체의 음속보다 훨씬 작아집니다.

3. 고차 정확도로의 확장

위 코드는 1차 정확도입니다. 실제 연구에서는:

- MUSCL 재구성 + slope limiter로 2차
- WENO 재구성으로 5차 이상
- Runge-Kutta 시간 적분으로 시간 정확도 향상

결과 해석

시뮬레이션을 실행하면 충격파가 기체 버블을 압축하면서:

1. 투과 충격파(transmitted shock)가 버블 뒤쪽으로 진행
2. 반사 팽창파(reflected rarefaction)가 좌측으로 이동
3. 버블이 급격히 압축되며 내부 압력 상승
4. 후방 벽에서 제트(jet) 형성 (2D/3D에서)

이 현상은 수중 폭발, 충격파 쇄석술 등에서 핵심적인 물리입니다.

다음 단계

다음 글에서는 수치해석의 기본 개념들을 게임처럼 배워보는
인터랙티브 콘텐츠를 준비했습니다. 수치 안정성, CFL 조건 등을
직접 체험해볼 수 있습니다.

---
Read more: https://tech-blog.dev/es/posts/five-equation-model]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/five-equation-model</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/five-equation-model</guid>
      <pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Multiphase</category>
      <category>Diffuse-Interface</category>
      <category>Python</category>
      <category>Implementation</category>
    </item>
    <item>
      <title><![CDATA[계면 포착 기법 비교: VOF vs Level Set vs Diffuse Interface]]></title>
      <description><![CDATA[압축성 다상유동에서 계면을 추적하는 세 가지 대표 기법의 원리, 장단점, 그리고 적용 사례를 비교합니다.

[7 min read · 1,294 words]]]></description>
      <content:encoded><![CDATA[계면을 어떻게 다룰 것인가

압축성 다상유동 시뮬레이션에서 가장 근본적인 질문 중 하나는
"두 유체 사이의 계면(interface)을 수치적으로 어떻게 표현할 것인가"입니다.

크게 세 가지 계열의 방법이 존재합니다:

1. Volume of Fluid (VOF)
2. Level Set
3. Diffuse Interface (확산 계면)

1. Volume of Fluid (VOF)

원리

각 셀에서 특정 유체가 차지하는 체적 분율(volume fraction) [math]를 추적합니다.

[equation]

[math]이면 해당 셀이 유체 A로 가득 차 있고,
[math]이면 유체 B, [math]: 유체 A
- [math]: 유체 B
- [math]: 계면

Re-initialization

이류(advection) 과정에서 [math]는 부호 거리 함수의 성질([math])을 잃어갑니다.
이를 복원하기 위해 re-initialization 방정식을 풉니다:

[equation]

여기서 [math]는 가상 시간(pseudo-time)입니다.

곡률과 표면장력

Level Set의 큰 장점은 기하학적 양의 계산이 자연스럽다는 것입니다:

[equation]

표면장력은 CSF(Continuum Surface Force) 모델로 체적력으로 변환됩니다:

[equation]

장단점

- 장점: 곡률/법선 계산 용이. 위상 변화(topology change) 자연스럽게 처리
- 단점: 질량 보존 실패. Re-initialization 과정에서 계면 위치가 이동 가능

CLSVOF: 두 방법의 결합

VOF의 질량 보존 + Level Set의 기하학적 장점을 합친 Coupled Level Set and VOF (CLSVOF)
방법이 많이 사용됩니다.

3. Diffuse Interface Method (확산 계면)

철학의 전환

앞의 두 방법이 계면을 날카로운(sharp) 것으로 보는 반면,
확산 계면법은 계면이 본질적으로 유한한 두께를 갖는다고 봅니다.

이 접근에서는 별도의 계면 추적 방정식이 필요 없고,
체적 분율이 보존 법칙 시스템의 일부로 포함됩니다.

5-equation Model (Allaire et al., 2002; Kapila et al., 2001)

가장 널리 사용되는 reduced model입니다:

[equation]

[equation]

[equation]

[equation]

[equation]

마지막 방정식이 핵심입니다. [math]의 이류 방정식이 비보존형(non-conservative)이라는 점.
이것이 바로 계면에서의 압력 진동을 방지하는 열쇠입니다.

왜 비보존형이 필요한가?

[math]을 보존형으로 풀면:

[equation]

우변의 [math] 항이 이산화 과정에서 적절히 처리되지 않으면
EOS mixing에 의한 비물리적 압력 진동이 발생합니다.

비보존형 이류는 [math]이 계면에서 sharp하게 유지되면서도
압력/속도 평형을 만족시킵니다.

7-equation Model (Ba…

---
Read more: https://tech-blog.dev/es/posts/interface-capturing]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/interface-capturing</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/interface-capturing</guid>
      <pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Multiphase</category>
      <category>VOF</category>
      <category>Level-Set</category>
      <category>Diffuse-Interface</category>
    </item>
    <item>
      <title><![CDATA[Riemann 문제부터 Godunov 기법까지 - 수치 플럭스의 핵심]]></title>
      <description><![CDATA[CFD의 심장부인 Riemann 문제를 파헤치고, Exact/Approximate Riemann Solver가 어떻게 수치 플럭스를 결정하는지 알아봅니다.

[5 min read · 938 words]]]></description>
      <content:encoded><![CDATA[Riemann 문제: CFD의 심장

유한체적법(Finite Volume Method)에서 셀 경계의 수치 플럭스(numerical flux)를
어떻게 계산하느냐가 해의 정확도와 안정성을 좌우합니다.
이 수치 플럭스를 결정하는 열쇠가 바로 Riemann 문제입니다.

Riemann 문제란?

초기 조건이 하나의 불연속면을 사이에 두고 좌우로 다른 상수 상태를 갖는 초기값 문제입니다:

[equation]

1차원 Euler 방정식에 대해 이 문제의 해석해는 세 개의 파(wave)로 구성됩니다:

1. 좌향 파 (rarefaction 또는 shock)
2. 접촉 불연속 (contact discontinuity)
3. 우향 파 (rarefaction 또는 shock)

Godunov의 아이디어 (1959)

Godunov의 핵심 통찰은 간단하지만 강력합니다:

> 셀 경계에서의 플럭스를 구하려면, 인접한 두 셀의 평균값을 좌우 상태로 놓고
> Riemann 문제를 풀면 된다.

유한체적법의 업데이트 공식:

[equation]

여기서 [math]가 바로 Riemann 문제의 해로부터 결정되는 수치 플럭스입니다.

Exact Riemann Solver

정확한 Riemann 풀이는 Newton-Raphson 반복법으로 star region의 압력 [math]를 구합니다.
좌우 파의 종류(shock/rarefaction)에 따라 Rankine-Hugoniot 관계식 또는
등엔트로피 관계식을 적용합니다.

Shock wave 관계식 ([math], [math] or [math]):

[equation]

여기서 [math], [math] 입니다.

Rarefaction wave 관계식 ([math]):

[equation]

[math]는 다음 조건을 만족합니다:

[equation]

Approximate Riemann Solver: 왜 필요한가?

Exact solver는 반복 계산이 필요하므로 비쌉니다.
실제 CFD 코드에서는 대부분 근사 Riemann 풀이(approximate Riemann solver)를 사용합니다.

Roe Solver (1981)

Roe는 비선형 Riemann 문제를 선형화(linearization)하여
행렬 [math]에 대한 선형 Riemann 문제로 바꿉니다:

[equation]

Roe 평균(Roe average)을 사용하여 [math]를 구성합니다:

[equation]

장점: 접촉 불연속을 정확히 포착. 단점: 엔트로피 조건 위배 가능 (entropy fix 필요).

HLLC Solver (Toro, 1994)

HLL 풀이를 개선하여 접촉 불연속(Contact)을 복원한 것이 HLLC입니다.
세 개의 파속(wave speed) [math], [math], [math]을 추정합니다:

[equation]

star region 플럭스:

[equation]

HLLC는 구현이 간단하면서도 robust하여 압축성 다상유동 코드에서 가장 널리 사용됩니다.

AUSM+ (Liou, 1996)

AUSM…

---
Read more: https://tech-blog.dev/es/posts/riemann-solvers]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/riemann-solvers</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/riemann-solvers</guid>
      <pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Riemann-Solver</category>
      <category>Godunov</category>
      <category>Numerical-Methods</category>
    </item>
    <item>
      <title><![CDATA[CFD multifase compresible: por qué es difícil y por qué importa]]></title>
      <description><![CDATA[Por qué la numérica multifase compresible difiere fundamentalmente del flujo monofásico, y por qué este campo sigue siendo un tema de investigación activo.

[3 min read · 500 words]]]></description>
      <content:encoded><![CDATA[¿Qué es el flujo multifase compresible?

En mecánica de fluidos, flujo multifase (multiphase flow) se refiere a flujos donde coexisten dos o más fases.
Agua y aire, gotas de combustible en gas caliente o burbujas de gas en explosiones submarinas son ejemplos típicos.

Al añadir compresibilidad (compressibility), el problema se complica drásticamente.
Cada fase tiene su propia ecuación de estado (EOS), y a través de la interfaz (interface)
se generan ondas de choque (shock waves) que se reflejan, transmiten y refractan.

Diferencia con el flujo compresible monofásico

Las ecuaciones de Euler monofásicas son:

[equation]

Donde las variables conservadas son [math],
y el sistema se cierra con una sola EOS (p. ej., gas ideal [math]).

En flujo multifase la EOS cambia a través de la interfaz.
Si la región gaseosa usa gas ideal con [math]
y la líquida usa stiffened gas EOS:

[equation]

El problema numérico aparece cerca de la interfaz cuando ambas EOS se mezclan (mixing).
Promediar variables conservadas ingenuamente produce oscilaciones de presión no físicas.

Por qué es difícil: tres dificultades clave

1. Oscilaciones de presión en la interfaz

El problema más famoso. Desde que Abgrall lo señaló en 1994,
resolverlo se convirtió en el punto de partida de los métodos numéricos multifase.

> "La historia de la numérica multifase compresible es la historia de la lucha contra las oscilaciones de presión."

Los esquemas de volumen finito conservativos simples generan oscilaciones espu…

---
Read more: https://tech-blog.dev/es/posts/compressible-multiphase-intro]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/compressible-multiphase-intro</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/compressible-multiphase-intro</guid>
      <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>CFD</category>
      <category>Multiphase</category>
      <category>Compressible-Flow</category>
      <category>Introduction</category>
    </item>
    <item>
      <title><![CDATA[[Privado] Borrador en progreso]]></title>
      <description><![CDATA[Este artículo no debe aparecer en el listado principal y solo se puede previsualizar con contraseña.

[1 min read · 19 words]]]></description>
      <content:encoded><![CDATA[Artículo secreto

Este contenido solo es visible tras introducir la contraseña de administrador.

[equation]

---
Read more: https://tech-blog.dev/es/posts/draft-post]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/draft-post</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/draft-post</guid>
      <pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>Draft</category>
      <category>Test</category>
    </item>
    <item>
      <title><![CDATA[Empezar un blog con Contentlayer y LaTeX]]></title>
      <description><![CDATA[Guía para construir un blog técnico con Next.js 16 y Contentlayer

[1 min read · 50 words]]]></description>
      <content:encoded><![CDATA[¡Hola!

Este blog está construido con Next.js y Contentlayer.

Prueba de fórmulas (LaTeX)

Fórmula en línea: [math]

Fórmula en bloque:
[equation]

Prueba de código

[code block]

---
Read more: https://tech-blog.dev/es/posts/hello-blog]]></content:encoded>
      <link>https://tech-blog.dev/es/posts/hello-blog</link>
      <guid isPermaLink="true">https://tech-blog.dev/es/posts/hello-blog</guid>
      <pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
      <author>noreply@tech-blog.dev (Younglin)</author>
      <category>Next.js</category>
      <category>Contentlayer</category>
      <category>MDX</category>
      <category>LaTeX</category>
    </item>
  </channel>
</rss>