15. 2D MHD ์๋ฒ
15. 2D MHD ์๋ฒ¶
ํ์ต ๋ชฉํ¶
- ์ฐจ์ ๋ถํ (Dimensional Splitting)๊ณผ ๋น๋ถํ (Unsplit) ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ 1D MHD ๋ฐฉ๋ฒ์ 2D๋ก ํ์ฅํ๊ธฐ
- 2D Cartesian ๊ทธ๋ฆฌ๋์์ ์ ํ ์ฒด์ ๋ฒ(Finite Volume Method) ๊ตฌํํ๊ธฐ
- Constrained Transport (CT)๋ฅผ ์ ์ฉํ์ฌ $\nabla \cdot B = 0$์ ์ ํํ ๋ณด์กดํ๊ธฐ
- ์๊ธฐ์ฅ ์ฑ๋ถ์ ์ํ ์๊ฐ๋ฆฐ ๊ทธ๋ฆฌ๋(Staggered Grid, Yee Mesh) ์ฌ์ฉํ๊ธฐ
- ๊ณ ์ฐจ ์ฌ๊ตฌ์ฑ ๊ตฌํํ๊ธฐ: PLM, WENO
- ๋ฒค์น๋งํฌ ๋ฌธ์ ์๋ฎฌ๋ ์ด์ ํ๊ธฐ: Orszag-Tang ์๋ฅ, Kelvin-Helmholtz ๋ถ์์ ์ฑ
- Corner Transport Upwind (CTU) ๋ฐฉ๋ฒ ์ดํดํ๊ธฐ
1. 2D MHD ์๊ฐ¶
MHD ์๋ฎฌ๋ ์ด์ ์ 1D์์ 2D๋ก ํ์ฅํ๋ฉด ์๋ก์ด ๊ณผ์ ๋ค์ด ๋์ ๋ฉ๋๋ค: ๋ค์ฐจ์ ํ๋ ์ ํ, ๊ธฐํํ์ ์์ค ํญ, ๊ทธ๋ฆฌ๊ณ ๋ค์ค ์ฐจ์์์ $\nabla \cdot B = 0$์ ๋ณด์กดํด์ผ ํ๋ ์ค์ํ ์๊ตฌ์ฌํญ์ ๋๋ค.
1.1 2D MHD ๋ฐฉ์ ์¶
2D Cartesian ์ขํ $(x, y)$์์ ์ด์ MHD ๋ฐฉ์ ์์:
โU/โt + โF/โx + โG/โy = 0
์ฌ๊ธฐ์ ๋ณด์กด ๋ณ์๋:
U = [ฯ, ฯv_x, ฯv_y, ฯv_z, B_x, B_y, B_z, E]แต
$x$ ๋ฐฉํฅ์ ํ๋ญ์ค:
F = [ฯv_x, ฯv_xยฒ + p_T - B_xยฒ/ฮผโ, ฯv_x v_y - B_x B_y/ฮผโ, ฯv_x v_z - B_x B_z/ฮผโ,
0, v_x B_y - v_y B_x, v_x B_z - v_z B_x,
v_x(E + p_T) - B_x(vยทB)/ฮผโ]แต
๊ทธ๋ฆฌ๊ณ ์ ์ฌํ๊ฒ $G$ ($y$ ๋ฐฉํฅ์ ํ๋ญ์ค)๊ฐ ์์ผ๋ฉฐ, ์ด ์๋ ฅ์:
p_T = p + Bยฒ/(2ฮผโ)
1.2 ๋ฐ์ฐ ์ ์ฝ ์กฐ๊ฑด(Divergence Constraint)¶
์๊ธฐ์ฅ์ ๋ค์์ ๋ง์กฑํด์ผ ํฉ๋๋ค:
โ ยท B = โB_x/โx + โB_y/โy = 0
1D์์๋ ์ด๊ฒ์ด $\partial B_x / \partial x = 0$์ผ๋ก ์ถ์๋์ด, $B_x$๊ฐ ์ด๊ธฐ์ ์ผ์ ํ๋ฉด ์๋์ผ๋ก ๋ง์กฑ๋ฉ๋๋ค. 2D์์๋ $\nabla \cdot B = 0$์ ๋ณด์กดํ๊ธฐ ์ํด ํน์ํ ์์น์ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
$\nabla \cdot B = 0$ ์๋ฐ์ ๊ฒฐ๊ณผ: - ๋น๋ฌผ๋ฆฌ์ ๋จ๊ทน์ ํ - ์์น์ ๋ถ์์ ์ฑ - ๋ถ์ ํํ ํ๋ ์๋์ ์ถฉ๊ฒฉํ ๊ตฌ์กฐ
1.3 2D์์์ ๊ณผ์ ¶
- ๊ณ์ฐ ๋น์ฉ: $N_x \times N_y$ ์ , ํ์์คํ ๋น $\mathcal{O}(N^2)$ ์ฐ์ฐ
- ๋ค์ฐจ์ ํจ๊ณผ: ์ฝ๋ ๊ฒฐํฉ(Corner Coupling), ํก๋ฐฉํฅ ํ๋
- ๋ฐ์ฐ ๋ณด์กด: ํน์ํ ์ด์ฐํ ํ์ (CT, divergence cleaning ๋ฑ)
- CFL ์กฐ๊ฑด: ํ์์คํ ์ด 2D ํ๋ ์ ํ์ ์ํด ์ ํ๋จ
2. 2D ์ ํ ์ฒด์ ๋ฒ(Finite Volume Method)¶
2.1 ์ ์ค์ฌ ์ด์ฐํ(Cell-Centered Discretization)¶
์์ญ์ ์ง์ฌ๊ฐํ ์ $[x_{i-1/2}, x_{i+1/2}] \times [y_{j-1/2}, y_{j+1/2}]$๋ก ๋๋๋๋ค.
์ ํ๊ท ๋ณด์กด ๋ณ์:
U_{i,j} = (1/ฮxฮy) โซโซ U(x,y,t) dx dy
2.2 ๋ฐ์ด์ฐ(Semi-Discrete) ํ์¶
์ ํ ์ฒด์ ์ด์ฐํ:
dU_{i,j}/dt = -(F_{i+1/2,j} - F_{i-1/2,j})/ฮx - (G_{i,j+1/2} - G_{i,j-1/2})/ฮy
์ ๋ฉด์์์ ํ๋ญ์ค๋ Riemann ์๋ฒ(HLL, HLLD, Roe ๋ฑ)๋ก๋ถํฐ ๊ณ์ฐ๋ฉ๋๋ค.
2.3 ์ฐจ์ ๋ถํ (Dimensional Splitting) (Strang Splitting)¶
์์ด๋์ด: 2D ์งํ๋ฅผ ๊ต๋ํ๋ 1D ์ค์์ผ๋ก ๋ถํ .
ํ๋์ ํ์์คํ $\Delta t$์ ๋ํด:
- $x$์์ ๋ฐ ์คํ : $\Delta t / 2$ ๋์ $\partial U / \partial t + \partial F / \partial x = 0$์ ์ฌ์ฉํ์ฌ ์งํ
- $y$์์ ์์ ์คํ : $\Delta t$ ๋์ $\partial U / \partial t + \partial G / \partial y = 0$์ ์ฌ์ฉํ์ฌ ์งํ
- $x$์์ ๋ฐ ์คํ : $\Delta t / 2$ ๋์ $x$์์ ๋ค์ ์งํ
์ด๊ฒ์ด Strang splitting์ ๋๋ค (๊ฐ 1D ์คํ ์ด 2์ฐจ ์ ํ๋์ด๋ฉด ์๊ฐ์ ๋ํด 2์ฐจ ์ ํ๋).
์ฅ์ : - 1D Riemann ์๋ฒ ์ฌ์ฌ์ฉ - ๊ตฌํ ๊ฐ๋จ
๋จ์ : - ๋น๋ฑ๋ฐฉ์ฑ ์ค์ฐจ (๋ฐฉํฅ์ฑ ํธํฅ) - ์ฐจ์ ๋ถํ ์ ๊ฑธ์ณ $\nabla \cdot B = 0$์ ๋ณด์กดํ๊ธฐ ์ด๋ ค์
2.4 ๋น๋ถํ ๋ฐฉ๋ฒ(Unsplit Methods)¶
Corner Transport Upwind (CTU) ๋ฐฉ๋ฒ์ ํก๋ฐฉํฅ ํ๋ญ์ค ๋ณด์ ์ ํฌํจํ์ฌ ๋ชจ๋ ๋ฐฉํฅ์ ๋์์ ์ ๋ฐ์ดํธํฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ (๋จ์ํ๋ CTU):
- $x$์ $y$ ๋ฐฉํฅ ๋ชจ๋์์ ์ ๋ฉด์ ์ํ ์ฌ๊ตฌ์ฑ
- ๋ชจ๋ ๋ฉด์์ Riemann ๋ฌธ์ ํ๊ธฐ
- ํก๋ฐฉํฅ ํ๋ญ์ค ๋ณด์ ๊ณ์ฐ (์: ์๋ฅ ์ฝ๋ ์ํ)
- ์ฝ๋ ๊ฒฐํฉ์ ํฌํจํ์ฌ ๋ณด์กด ๋ณ์ ์ ๋ฐ์ดํธ
CTU ๋ฐฉ๋ฒ์ ์์ ํ ๋ค์ฐจ์์ ์ด๋ฉฐ ๋ฐฉํฅ์ฑ ํธํฅ์ ์ค์ ๋๋ค.
3. Constrained Transport (CT)¶
Constrained Transport๋ ์๊ธฐ์ฅ์ ์ํ ์๊ฐ๋ฆฐ ๊ทธ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๊ณ Faraday ๋ฒ์น์ ์ ๋ถ ํ์์ผ๋ก ์งํ์ํด์ผ๋ก์จ $\nabla \cdot B = 0$์ ๊ธฐ๊ณ ์ ๋ฐ๋๊น์ง ๋ณด์กดํ๋ ์์น ๋ฐฉ๋ฒ์ ๋๋ค.
3.1 Yee Mesh (์๊ฐ๋ฆฐ ๊ทธ๋ฆฌ๋)¶
์ ์ค์ฌ ์ ($(x_i, y_j)$์์): - $\rho, p, v_x, v_y, v_z, E$
๋ฉด ์ค์ฌ ์๊ธฐ์ฅ (์๊ฐ๋ฆผ): - $B_x$๋ $(x_{i-1/2}, y_j)$ (์์ง $x$์ธ ๋ฉด) - $B_y$๋ $(x_i, y_{j-1/2})$ (์์ง $y$์ธ ๋ฉด) - $B_z$๋ ์ ์ค์ฌ $(x_i, y_j)$ (๋ง์ฝ $B_z$๊ฐ ์กด์ฌํ์ง๋ง 2D์์ ๋ฐ์ฐ์ ์ํฅ์ ์ฃผ์ง ์์)
๋ชจ์๋ฆฌ ์ค์ฌ ์ ๊ธฐ์ฅ: - $E_z$๋ $(x_i, y_j)$ (2D $xy$ ํ๋ฉด์์ ์ ์ฝ๋)
3.2 ์ ๋ถ ํ์์ Faraday ๋ฒ์น¶
Faraday ๋ฒ์น:
โB/โt = -โ ร E
2D์์ ($B = (B_x, B_y, B_z)$์ด๊ณ $E_z$๊ฐ ์ ์ผํ ๊ด๋ จ ์ ๊ธฐ์ฅ ์ฑ๋ถ):
โB_x/โt = -โE_z/โy
โB_y/โt = โE_z/โx
์ ๋ฉด์ ๋ํด ์ ๋ถ:
d/dt โซ B_x dy = -[E_z(top) - E_z(bottom)]
d/dt โซ B_y dx = [E_z(right) - E_z(left)]
์ด๊ฒ์ ์ด๊ธฐ์ ์ ์ง๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ $\nabla \cdot B = 0$์ ๋ณด์กดํฉ๋๋ค.
3.3 ์ ๊ธฐ์ฅ ๊ณ์ฐ¶
์ด์ MHD์์ ์ ๊ธฐ์ฅ:
E = -v ร B
2D์์:
E_z = v_x B_y - v_y B_x
CT ์๊ณ ๋ฆฌ์ฆ:
- ์ ๋ฉด์์ ๊ธฐ๋ณธ ๋ณ์ ์ฌ๊ตฌ์ฑ
- Riemann ๋ฌธ์ ํ๊ธฐ๋ก ๋ฉด ์ค์ฌ ์๋์ ์๊ธฐ์ฅ ์ป๊ธฐ
-
์ ๋ชจ์๋ฆฌ์์ ์ ๊ธฐ์ฅ ๊ณ์ฐ ์ธ์ ํ ๋ฉด์ผ๋ก๋ถํฐ ์๋ฅ(Upwinded) $v$์ $B$ ์ฌ์ฉ:
E_z(i,j) = [v_x B_y - v_y B_x]_{i,j}ํ๊ท ํ ์ ๋ต: ์ฐ์ ํ๊ท , ์๋ฅ, Riemann ์๋ฒ ๊ธฐ๋ฐ -
์๊ธฐ์ฅ ์ ๋ฐ์ดํธ ์ด์ฐ Faraday ๋ฒ์น ์ฌ์ฉ:
B_x(i-1/2, j)^{n+1} = B_x(i-1/2, j)^n - ฮt/ฮy [E_z(i,j+1/2) - E_z(i,j-1/2)] B_y(i, j-1/2)^{n+1} = B_y(i, j-1/2)^n + ฮt/ฮx [E_z(i+1/2,j) - E_z(i-1/2,j)]
3.4 ๋ฐ์ฐ ์์(Divergence-Free) ๋ณด์ฅ¶
์ด์ฐ ์ ๋ฐ์ดํธ๊ฐ Faraday ๋ฒ์น์ ์ ๋ถ ํ์์ผ๋ก๋ถํฐ ์ ๋๋์์ผ๋ฏ๋ก, ์ด์ฐ ๋ฐ์ฐ:
(โ ยท B)_{i,j} = [B_x(i+1/2,j) - B_x(i-1/2,j)]/ฮx + [B_y(i,j+1/2) - B_y(i,j-1/2)]/ฮy
์ ๊ธฐ๊ณ ์ ๋ฐ๋๊น์ง ๋ณด์กด๋ฉ๋๋ค (์ด๊ธฐ์ 0์ด๋ฉด).
4. ๊ณ ์ฐจ ์ฌ๊ตฌ์ฑ(Higher-Order Reconstruction)¶
4.1 ๊ตฌ๊ฐ ์ ํ ๋ฐฉ๋ฒ(Piecewise Linear Method, PLM)¶
2์ฐจ ๊ณต๊ฐ ์ ํ๋๋ ๊ฐ ์ ๋ด์์ ์ ํ์ผ๋ก ํด๋ฅผ ์ฌ๊ตฌ์ฑํด์ผ ํฉ๋๋ค:
U(x) = U_i + ฯ_i (x - x_i)
์ฌ๊ธฐ์ $\sigma_i$๋ ๊ธฐ์ธ๊ธฐ๋ก, ์ด์ ์ ๋ก๋ถํฐ ์ถ์ ๋ฉ๋๋ค:
ฯ_i โ (U_{i+1} - U_{i-1}) / (2ฮx) (์ค์ฌ ์ฐจ๋ถ)
๊ธฐ์ธ๊ธฐ ์ ํ(Slope Limiting): ๋ถ์ฐ์ ๊ทผ์ฒ์์ ํ์ ์ง๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ํ์ ์ ์ฉ:
ฯ_i = minmod(ฯ_L, ฯ_C, ฯ_R)
์ฌ๊ธฐ์: - $\sigma_L = (U_i - U_{i-1}) / \Delta x$ - $\sigma_C = (U_{i+1} - U_{i-1}) / (2 \Delta x)$ - $\sigma_R = (U_{i+1} - U_i) / \Delta x$
minmod ์ ํ์:
minmod(a, b, c) =
min(|a|, |b|, |c|) * sign(a) if sign(a) = sign(b) = sign(c)
0 otherwise
๊ธฐํ ์ ํ์: MC (monotonized central), van Leer, superbee.
4.2 WENO (Weighted Essentially Non-Oscillatory)¶
WENO ๊ธฐ๋ฒ์ ์ฌ๋ฌ ์คํ ์ค์ ๊ฐ์ค ์กฐํฉ์ ์ฌ์ฉํ์ฌ ๊ณ ์ฐจ ์ ํ๋(5์ฐจ ์ด์)๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
WENO5 ์ฌ๊ตฌ์ฑ (๋จ์ํ):
5์ ์คํ ์ค $\{U_{i-2}, U_{i-1}, U_i, U_{i+1}, U_{i+2}\}$๋ฅผ ์ฌ์ฉํ์ฌ ์ธ ๊ฐ์ 3์ ํ๋ณด ๋คํญ์์ ๊ตฌ์ฑํ ๋ค์, ๋งค๋๋ฌ์ ๊ธฐ๋ฐ ๊ฐ์ค์น๋ก ๋ธ๋ ๋ฉํ์ฌ $x_{i+1/2}$์์ ์ฌ๊ตฌ์ฑ๋ ๊ฐ์ ์ป์ต๋๋ค.
์ฅ์ : - ๋งค๋๋ฌ์ด ์์ญ์์ ๊ณ ์ฐจ ์ ํ๋ - ๋ถ์ฐ์ ๊ทผ์ฒ์์ ๋น์ง๋
๋จ์ : - ๊ณ์ฐ์ ์ผ๋ก ๋น์ (ํฐ ์คํ ์ค, ๋น์ ํ ๊ฐ์ค์น) - ๋ณต์กํ ๊ตฌํ
4.3 ํน์ฑ ๋ณ์ vs ๊ธฐ๋ณธ ๋ณ์ ์ฌ๊ตฌ์ฑ(Characteristic vs. Primitive Variable Reconstruction)¶
์ฌ๊ตฌ์ฑ์ ๋ค์์์ ์ํ๋ ์ ์์ต๋๋ค: - ๊ธฐ๋ณธ ๋ณ์ $(\rho, v_x, v_y, v_z, B_x, B_y, B_z, p)$: ๋ ๊ฐ๋จํ์ง๋ง ๋น๋ฌผ๋ฆฌ์ ์ํ ์์ฑ ๊ฐ๋ฅ - ๋ณด์กด ๋ณ์ $U$: ๋ณด์กด์ ๋ณด์ฅํ์ง๋ง ์ง๋ ์์ฑ ๊ฐ๋ฅ - ํน์ฑ ๋ณ์ $W = L \cdot U$: ํ๋ ๋ถ๋ฆฌ, ๋ถ์ฐ์ ํฌ์ฐฉ์ ์ต์
MHD์ ๊ฒฝ์ฐ, ํน์ฑ ์ฌ๊ตฌ์ฑ์ด ์ ํธ๋์ง๋ง Jacobian์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ํ์ด์ผ ํ๋ฏ๋ก (2D/3D์์ ๋น์).
5. ์๊ฐ ์ ๋ถ(Time Integration)¶
5.1 2D์์์ CFL ์กฐ๊ฑด¶
ํ์์คํ ์ ๋ค์์ ์ํด ์ ํ๋ฉ๋๋ค:
ฮt โค CFL * min(ฮx, ฮy) / max(|ฮป|)
์ฌ๊ธฐ์ $\lambda$๋ ํ๋ ์๋์ ๋๋ค (๊ณ ์ ์๊ธฐ์ํ, Alfvรฉn, ์ ์ ์๊ธฐ์ํ, ์ํธ๋กํผ).
์์ ์ ์ํด ์ผ๋ฐ์ ์ผ๋ก $CFL \approx 0.4-0.8$.
5.2 ์๊ฐ ๋จ๊ณ ๊ธฐ๋ฒ(Time Stepping Schemes)¶
2์ฐจ Runge-Kutta (RK2):
U* = U^n + ฮt L(U^n)
U^{n+1} = 0.5 U^n + 0.5 U* + 0.5 ฮt L(U*)
์ฌ๊ธฐ์ $L(U) = -(โF/โx + โG/โy)$๋ ๊ณต๊ฐ ์ฐ์ฐ์์ ๋๋ค.
3์ฐจ Runge-Kutta (RK3) (TVD-RK3):
U^{(1)} = U^n + ฮt L(U^n)
U^{(2)} = 3/4 U^n + 1/4 U^{(1)} + 1/4 ฮt L(U^{(1)})
U^{n+1} = 1/3 U^n + 2/3 U^{(2)} + 2/3 ฮt L(U^{(2)})
RK3๋ WENO ๊ธฐ๋ฒ๊ณผ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
6. ๋ฒค์น๋งํฌ ๋ฌธ์ : Orszag-Tang ์๋ฅ¶
Orszag-Tang ์๋ฅ๋ ์ถฉ๊ฒฉํ, ์ ๋ฅ ์ํธ, ๋ณต์กํ ์๋ฅ ๊ตฌ์กฐ์ ํ์ฑ์ ํน์ง์ผ๋ก ํ๋ ํ์ค 2D MHD ํ ์คํธ ๋ฌธ์ ์ ๋๋ค.
6.1 ์ด๊ธฐ ์กฐ๊ฑด¶
์์ญ: ์ฃผ๊ธฐ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ๊ฐ๋ $[0, 1] \times [0, 1]$.
ฯ = ฮณยฒ
p = ฮณ
v_x = -sin(2ฯy)
v_y = sin(2ฯx)
v_z = 0
B_x = -sin(2ฯy) / sqrt(4ฯ)
B_y = sin(4ฯx) / sqrt(4ฯ)
B_z = 0
์ฌ๊ธฐ์ $\gamma = 5/3$ (๋จ์ด ์ง์).
์ด ์ค์ ์ $\beta \sim 1$ (ํ๋ผ์ฆ๋ง์ ์๊ธฐ ์๋ ฅ์ด ๋น์ทํจ)์ ๊ฐ์ง๋ฉฐ ๋๋ฅ cascade๋ฅผ ์์ฑํฉ๋๋ค.
6.2 ์งํ¶
์๋ฅ๊ฐ ์งํํ๋ฉด์: - ์ถฉ๊ฒฉํ๊ฐ ํ์ฑ๋๊ณ ์ํธ์์ฉ - ๋ฐ๋ ๋ฐฉํฅ ์ฅ ์ฌ์ด์ ๊ฒฝ๊ณ์์ ์ ๋ฅ ์ํธ ๋ฐ๋ฌ - ์๊ธฐ ์ฌ๊ฒฐํฉ ๋ฐ์ - ์๋๊ฐ ๋ ์์ ์ค์ผ์ผ๋ก cascade
์ฃผ์ ์ง๋จ: - ๋ฐ๋ ์ค๊ณฝ: ์ถฉ๊ฒฉํ ๊ตฌ์กฐ ํ์ - ์๊ธฐ์ฅ ์ : ์ฌ๊ฒฐํฉ๊ณผ ์์ ๋ณํ ์ค๋ช - ์ ๋ฅ ๋ฐ๋ $|j_z| = |\nabla \times B|_z$: ์ ๋ฅ ์ํธ ์์น
6.3 ์์ ๊ฒฐ๊ณผ¶
$t \approx 0.5$์์ ์ถฉ๊ฒฉํ์ ์๋ฅ์ ๋ณต์กํ ํจํด์ด ๋ํ๋ฉ๋๋ค. ๋ฏธ์ธ ๊ตฌ์กฐ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ณ ํด์๋ ์๋ฎฌ๋ ์ด์ (512ยฒ ์ด์)์ด ํ์ํฉ๋๋ค.
7. MHD์์ Kelvin-Helmholtz ๋ถ์์ ์ฑ¶
Kelvin-Helmholtz (KH) ๋ถ์์ ์ฑ์ ์๋์ ์ธ ์ ๋จ ์ด๋์ ์๋ ๋ ์ ์ฒด ์ฌ์ด์ ๊ฒฝ๊ณ๋ฉด์์ ๋ฐ์ํฉ๋๋ค.
7.1 ์ค์ ¶
์์ญ: $x$์์ ์ฃผ๊ธฐ, $y$์์ ๋ฐ์ฌ ๋๋ ์ฃผ๊ธฐ์ธ $[0, 1] \times [-1, 1]$.
์๋ ์ ๋จ์ธต:
v_x(y) = -Vโ tanh(y / a)
v_y = ฮดvโ sin(2ฯx) (์ญ๋)
์ฌ๊ธฐ์ $V_0$๋ ์ ๋จ ์๋, $a$๋ ์ ๋จ์ธต ๋๊ป, $\delta v_0 \ll V_0$๋ ์ญ๋ ์งํญ์ ๋๋ค.
์๊ธฐ์ฅ ($x$ ๋ฐฉํฅ์ผ๋ก ๊ท ์ผ):
B_x = Bโ
B_y = 0
7.2 ์ ํ ์์ ์ฑ ๋ถ์¶
์๊ธฐ์ฅ์ด ์๋ ๊ฒฝ์ฐ, ๋ชจ๋ $k$์ ๋ํ KH ์ฑ์ฅ๋ฅ ์:
ฮณ_KH ~ k Vโ / 2 (์์ ์ ๋จ์ธต์ ๋ํด)
์๊ธฐ์ฅ์ด ์์ผ๋ฉด, ์๊ธฐ ์ฅ๋ ฅ์ด ์งง์ ํ์ฅ์ ์์ ํํฉ๋๋ค. ๋ถ์ฐ ๊ด๊ณ:
ฮณยฒ = kยฒ Vโยฒ - kยฒ v_Aยฒ
์ฌ๊ธฐ์ $v_A = B_0 / \sqrt{\mu_0 \rho}$๋ Alfvรฉn ์๋์ ๋๋ค.
์์ ํ ์กฐ๊ฑด:
Bโ > sqrt(ฮผโ ฯ) Vโ (v_A > Vโ)
$v_A > V_0$์ด๋ฉด, KH ๋ชจ๋๊ฐ ์ต์ ๋ฉ๋๋ค.
7.3 ์์น ์๋ฎฌ๋ ์ด์ ¶
์ด๊ธฐ ์กฐ๊ฑด:
ฯ = 1
p = 1
v_x = -Vโ tanh(y / a)
v_y = ฮดvโ sin(2ฯx)
B_x = Bโ
B_y = 0
์ ํ์ ์ธ ๋งค๊ฐ๋ณ์: $V_0 = 1$, $a = 0.1$, $\delta v_0 = 0.01$, $B_0 = 0$์์ $2$.
๊ด์ฐฐ: - $B_0 = 0$: ๊ณ ์ ์ ์ธ KH ๋กค ๋ฐ๋ฌ - $B_0 = 0.5$: KH ์ฑ์ฅ ๋๋ ค์ง์ง๋ง ์ฌ์ ํ ๋ถ์์ - $B_0 = 2$: KH ์ต์ , ์๊ธฐ ์ฅ๋ ฅ์ด ์์ ํ
8. Python ๊ตฌํ: CT๋ฅผ ์ฌ์ฉํ 2D MHD ์๋ฒ¶
8.1 ๋ฐ์ดํฐ ๊ตฌ์กฐ¶
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
class MHD2D:
def __init__(self, Nx, Ny, Lx, Ly, gamma=5/3):
self.Nx, self.Ny = Nx, Ny
self.Lx, self.Ly = Lx, Ly
self.dx, self.dy = Lx / Nx, Ly / Ny
self.gamma = gamma
# Cell centers
self.x = np.linspace(0.5*self.dx, Lx - 0.5*self.dx, Nx)
self.y = np.linspace(0.5*self.dy, Ly - 0.5*self.dy, Ny)
self.X, self.Y = np.meshgrid(self.x, self.y, indexing='ij')
# Staggered grid for magnetic field (CT)
# Bx at (i-1/2, j), By at (i, j-1/2)
self.x_Bx = np.linspace(0, Lx, Nx+1)
self.y_By = np.linspace(0, Ly, Ny+1)
# Conserved variables (cell-centered)
self.rho = np.ones((Nx, Ny))
self.mx = np.zeros((Nx, Ny))
self.my = np.zeros((Nx, Ny))
self.mz = np.zeros((Nx, Ny))
self.E = np.ones((Nx, Ny))
# Magnetic field (staggered)
self.Bx = np.zeros((Nx+1, Ny)) # Face-centered in x
self.By = np.zeros((Nx, Ny+1)) # Face-centered in y
self.Bz = np.zeros((Nx, Ny)) # Cell-centered (if needed)
# Electric field (edge-centered)
self.Ez = np.zeros((Nx+1, Ny+1))
self.t = 0.0
def primitive_variables(self):
"""Compute primitive variables from conserved."""
vx = self.mx / self.rho
vy = self.my / self.rho
vz = self.mz / self.rho
# Average magnetic field to cell centers
Bx_cc = 0.5 * (self.Bx[:-1, :] + self.Bx[1:, :])
By_cc = 0.5 * (self.By[:, :-1] + self.By[:, 1:])
Bz_cc = self.Bz
B2 = Bx_cc**2 + By_cc**2 + Bz_cc**2
p = (self.gamma - 1) * (self.E - 0.5 * self.rho * (vx**2 + vy**2 + vz**2) - 0.5 * B2)
return self.rho, vx, vy, vz, p, Bx_cc, By_cc, Bz_cc
def compute_dt(self, CFL=0.4):
"""Compute timestep based on CFL condition."""
rho, vx, vy, vz, p, Bx, By, Bz = self.primitive_variables()
# Fast magnetosonic speed
cs = np.sqrt(self.gamma * p / rho)
va = np.sqrt((Bx**2 + By**2 + Bz**2) / rho)
cf = np.sqrt(cs**2 + va**2)
dt_x = self.dx / np.max(np.abs(vx) + cf)
dt_y = self.dy / np.max(np.abs(vy) + cf)
return CFL * min(dt_x, dt_y)
def check_divergence(self):
"""Check divergence of B (should be ~0)."""
div_B = (self.Bx[1:, :] - self.Bx[:-1, :]) / self.dx + \
(self.By[:, 1:] - self.By[:, :-1]) / self.dy
return np.max(np.abs(div_B))
8.2 ์๊ธฐ์ฅ์ ์ํ CT ์ ๋ฐ์ดํธ¶
def update_magnetic_field_CT(self):
"""Update magnetic field using Constrained Transport."""
# Compute electric field Ez at cell corners (edges in 2D)
# Ez = vx * By - vy * Bx
# Need velocities and B fields at corners
# Simple averaging (can be improved with Riemann solver values)
# Average vx to y-edges
vx_avg_y = 0.5 * (self.mx[:-1, :] / self.rho[:-1, :] + self.mx[1:, :] / self.rho[1:, :])
vx_avg_y = np.pad(vx_avg_y, ((1,0), (0,0)), mode='wrap') # Periodic
# Average vy to x-edges
vy_avg_x = 0.5 * (self.my[:, :-1] / self.rho[:, :-1] + self.my[:, 1:] / self.rho[:, 1:])
vy_avg_x = np.pad(vy_avg_x, ((0,0), (1,0)), mode='wrap')
# Average Bx to corners (from faces)
Bx_corner = 0.5 * (self.Bx[:, :-1] + self.Bx[:, 1:])
Bx_corner = np.pad(Bx_corner, ((0,0), (0,1)), mode='wrap')
# Average By to corners (from faces)
By_corner = 0.5 * (self.By[:-1, :] + self.By[1:, :])
By_corner = np.pad(By_corner, ((0,1), (0,0)), mode='wrap')
# Compute Ez at corners
# This is simplified; production codes use Riemann solver at faces
self.Ez = vx_avg_y * By_corner - vy_avg_x * Bx_corner
# Update Bx using Ez (discrete Faraday's law)
# โBx/โt = -โEz/โy
dt = self.compute_dt()
self.Bx[:, :] -= dt / self.dy * (self.Ez[:, 1:] - self.Ez[:, :-1])
# Update By
# โBy/โt = โEz/โx
self.By[:, :] += dt / self.dx * (self.Ez[1:, :] - self.Ez[:-1, :])
8.3 ์์ ํ 2D MHD ์๋ฒ (๋จ์ํ)¶
Riemann ์๋ฒ, CT, ๊ณ ์ฐจ ์ฌ๊ตฌ์ฑ์ ๊ฐ์ถ ์์ ํ 2D MHD ์๋ฒ์ ๋ณต์ก์ฑ ๋๋ฌธ์, ์ฌ๊ธฐ์๋ ๊ฐ๋ ์ ๊ณจ๊ฒฉ์ ์ ๊ณตํฉ๋๋ค. Athena, FLASH, Pluto์ ๊ฐ์ ์์ฐ ์ฝ๋๋ ์ด๊ฒ์ ์์ฒ ์ค๋ก ๊ตฌํํฉ๋๋ค.
๋จ์ํ๋ ์๊ณ ๋ฆฌ์ฆ:
def step(self, dt):
"""Single timestep using operator splitting."""
# Step 1: Half step in x direction
self.step_x(dt / 2)
# Step 2: Full step in y direction
self.step_y(dt)
# Step 3: Half step in x direction
self.step_x(dt / 2)
# Update magnetic field using CT
self.update_magnetic_field_CT()
self.t += dt
def step_x(self, dt):
"""1D sweep in x direction (simplified)."""
# For each j, solve 1D Riemann problems along x
for j in range(self.Ny):
# Extract 1D slice
rho_1d = self.rho[:, j]
mx_1d = self.mx[:, j]
# ... (other variables)
# Reconstruct, solve Riemann problem, update
# (Reuse 1D MHD solver)
# Update conserved variables
# self.rho[:, j] = ...
pass
def step_y(self, dt):
"""1D sweep in y direction."""
# Similar to step_x but along y
pass
์ฐธ๊ณ : ๊ฒฌ๊ณ ํ 2D MHD ์๋ฒ๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๋ค์์ด ํ์ํฉ๋๋ค: - 1D Riemann ์๋ฒ (HLL, HLLD ๋ฑ) - ์ฌ๊ตฌ์ฑ (PLM, WENO) - Riemann ์๋ฒ ๋ฉด ์ํ๋ก๋ถํฐ CT ์ ๊ธฐ์ฅ ๊ณ์ฐ - ๊ฒฝ๊ณ ์กฐ๊ฑด - ์์ค ํญ (์ค๋ ฅ ๋ฑ, ํด๋น๋๋ ๊ฒฝ์ฐ)
๊ต์ก ๋ชฉ์ ์ผ๋ก Orszag-Tang ์๋ฅ ์ค์ ๊ณผ ๊ฐ๋จํ forward-Euler ์ ๋ฐ์ดํธ๋ฅผ ์์ฐํฉ๋๋ค.
8.4 Orszag-Tang ์๋ฅ ์ค์ ¶
def init_orszag_tang(mhd, gamma=5/3):
"""Initialize Orszag-Tang vortex."""
X, Y = mhd.X, mhd.Y
# Density and pressure
mhd.rho[:, :] = gamma**2
p = gamma * np.ones_like(mhd.rho)
# Velocity
vx = -np.sin(2 * np.pi * Y)
vy = np.sin(2 * np.pi * X)
vz = np.zeros_like(vx)
mhd.mx = mhd.rho * vx
mhd.my = mhd.rho * vy
mhd.mz = mhd.rho * vz
# Magnetic field (staggered grid)
# Bx at (i-1/2, j)
X_Bx, Y_Bx = np.meshgrid(mhd.x_Bx, mhd.y, indexing='ij')
mhd.Bx[:, :] = -np.sin(2 * np.pi * Y_Bx) / np.sqrt(4 * np.pi)
# By at (i, j-1/2)
X_By, Y_By = np.meshgrid(mhd.x, mhd.y_By, indexing='ij')
mhd.By[:, :] = np.sin(4 * np.pi * X_By) / np.sqrt(4 * np.pi)
# Bz (cell-centered, zero)
mhd.Bz[:, :] = 0.0
# Total energy
Bx_cc = 0.5 * (mhd.Bx[:-1, :] + mhd.Bx[1:, :])
By_cc = 0.5 * (mhd.By[:, :-1] + mhd.By[:, 1:])
B2 = Bx_cc**2 + By_cc**2
mhd.E = p / (gamma - 1) + 0.5 * mhd.rho * (vx**2 + vy**2 + vz**2) + 0.5 * B2
# Initialize
Nx, Ny = 128, 128
mhd = MHD2D(Nx, Ny, Lx=1.0, Ly=1.0, gamma=5/3)
init_orszag_tang(mhd)
print(f"Orszag-Tang vortex initialized on {Nx}ร{Ny} grid")
print(f"Initial div(B) max: {mhd.check_divergence():.3e}")
8.5 ๊ฐ๋จํ Forward Euler ์ ๋ฐ์ดํธ (์์ฐ์ฉ)¶
def simple_update(mhd, dt):
"""
Simplified forward Euler update (NOT recommended for production).
For demonstration only.
"""
rho, vx, vy, vz, p, Bx, By, Bz = mhd.primitive_variables()
# Compute fluxes (very simplified, ignoring Riemann solver)
# This will NOT capture shocks correctly!
# Flux in x direction (at i+1/2, j)
Fx_rho = mhd.mx # rho * vx
# ... (other flux components)
# Update conserved variables (forward Euler, very crude)
# drho/dt = -(dFx/dx + dFy/dy)
# For proper implementation, use Riemann solver at each face
# This is just a placeholder
# Update magnetic field via CT
mhd.update_magnetic_field_CT()
mhd.t += dt
# Note: This is NOT a working solver, just a skeleton
# For actual simulation, use established codes or implement full Riemann solver
8.6 ์๊ฐํ¶
def plot_orszag_tang(mhd):
"""Plot density and magnetic field."""
rho, vx, vy, vz, p, Bx, By, Bz = mhd.primitive_variables()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
# Density
im1 = ax1.contourf(mhd.X, mhd.Y, rho, levels=50, cmap='viridis')
ax1.set_title(f'Density at t = {mhd.t:.3f}', fontsize=14)
ax1.set_xlabel('x', fontsize=12)
ax1.set_ylabel('y', fontsize=12)
plt.colorbar(im1, ax=ax1)
# Magnetic field lines
ax2.contourf(mhd.X, mhd.Y, np.sqrt(Bx**2 + By**2), levels=50, cmap='plasma')
ax2.streamplot(mhd.X.T, mhd.Y.T, Bx.T, By.T, color='white', linewidth=0.5, density=1.5)
ax2.set_title(f'Magnetic Field at t = {mhd.t:.3f}', fontsize=14)
ax2.set_xlabel('x', fontsize=12)
ax2.set_ylabel('y', fontsize=12)
plt.tight_layout()
plt.savefig(f'orszag_tang_t{mhd.t:.3f}.png', dpi=150)
plt.show()
plot_orszag_tang(mhd)
8.7 Kelvin-Helmholtz ๋ถ์์ ์ฑ ์ค์ ¶
def init_kelvin_helmholtz(mhd, V0=1.0, a=0.1, dv=0.01, B0=0.0):
"""Initialize Kelvin-Helmholtz instability."""
X, Y = mhd.X, mhd.Y
# Density (uniform)
mhd.rho[:, :] = 1.0
# Pressure (uniform)
p = 1.0 * np.ones_like(mhd.rho)
# Velocity shear
vx = -V0 * np.tanh(Y / a)
vy = dv * np.sin(2 * np.pi * X)
vz = np.zeros_like(vx)
mhd.mx = mhd.rho * vx
mhd.my = mhd.rho * vy
mhd.mz = mhd.rho * vz
# Magnetic field (uniform in x)
mhd.Bx[:, :] = B0
mhd.By[:, :] = 0.0
mhd.Bz[:, :] = 0.0
# Total energy
Bx_cc = 0.5 * (mhd.Bx[:-1, :] + mhd.Bx[1:, :])
By_cc = 0.5 * (mhd.By[:, :-1] + mhd.By[:, 1:])
B2 = Bx_cc**2 + By_cc**2
mhd.E = p / (mhd.gamma - 1) + 0.5 * mhd.rho * (vx**2 + vy**2) + 0.5 * B2
# Initialize KH instability
mhd_kh = MHD2D(Nx=256, Ny=256, Lx=1.0, Ly=2.0, gamma=5/3)
init_kelvin_helmholtz(mhd_kh, V0=1.0, a=0.1, dv=0.01, B0=0.5)
print(f"Kelvin-Helmholtz initialized: V0=1.0, B0=0.5")
print(f"Alfvรฉn speed: vA = {0.5 / np.sqrt(1.0):.2f} (should stabilize if vA > V0)")
8.8 ์์ฐ๊ธ ์ฝ๋¶
์ค์ ์ฐ๊ตฌ๋ฅผ ์ํด์๋ ํ๋ฆฝ๋ MHD ์ฝ๋๋ฅผ ์ฌ์ฉํ์ธ์:
Athena++: https://github.com/PrincetonUniversity/athena - C++, ํ๋์ AMR (adaptive mesh refinement) - MHD, radiation, GR ์ต์ - ๋ฐ์ฐ ์๋ B๋ฅผ ์ํ CT
PLUTO: http://plutocode.ph.unito.it/ - ๋ชจ๋ํ, ๋ค์ํ ๋ฌผ๋ฆฌ ๋ชจ๋ ์ง์ - MHD, ์๋๋ก ์ MHD, radiation - ๋ค์ค Riemann ์๋ฒ, CT
FLASH: https://flash.rochester.edu/ - ๋๊ท๋ชจ ์ฒ์ฒด๋ฌผ๋ฆฌํ ์๋ฎฌ๋ ์ด์ - AMR, MHD, ์ ์ฒด์ญํ - ์ด์ ์ฑ, ๋ณ ํ์ฑ์ ๋๋ฆฌ ์ฌ์ฉ
์์ : Orszag-Tang ์๋ฅ๋ฅผ ์ํ Athena ์คํ:
# Athena input file (athinput.orszag_tang)
<problem>
problem_id = OrszagTang
gamma = 1.666667
<mesh>
nx1 = 256
nx2 = 256
x1min = 0.0
x1max = 1.0
x2min = 0.0
x2max = 1.0
ix1_bc = periodic
ox1_bc = periodic
ix2_bc = periodic
ox2_bc = periodic
<hydro>
evolution = mhd
<time>
tlim = 0.5
์คํ:
./athena -i athinput.orszag_tang
9. ๊ณ ๊ธ ์ฃผ์ ¶
9.1 Adaptive Mesh Refinement (AMR)¶
AMR์ ๊ด์ฌ ์์ญ(์ถฉ๊ฒฉํ, ์ ๋ฅ ์ํธ)์์ ๊ทธ๋ฆฌ๋๋ฅผ ๋์ ์ผ๋ก ์ ์ ํ๊ณ ๋ค๋ฅธ ๊ณณ์์๋ ์กฐ๋ํํ์ฌ ๊ณ์ฐ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.
MHD AMR์ ๊ณผ์ : - ์ ์ ๊ฒฝ๊ณ๋ฅผ ๋์ด $\nabla \cdot B = 0$ ๋ณด์กด - ์๊ฐ๋ฆฐ ์ฅ์ ๋ํ prolongation๊ณผ restriction ์ฐ์ฐ์
ํด๊ฒฐ์ฑ : - ์กฐ๋-๋ฏธ์ธ ๊ฒฝ๊ณ์์ ํ๋ญ์ค ๋ณด์ - ๋ฐ์ฐ ๋ณด์กด prolongation (์: Balsara ๋ฐฉ๋ฒ)
9.2 ๋ฐ์ฐ ์ฒญ์(Divergence Cleaning)¶
CT์ ๋์: 0์ด ์๋ $\nabla \cdot B$๋ฅผ ํ์ฉํ๋ ๊ฐ์ ๋ฉ์ปค๋์ฆ ์ถ๊ฐ.
์๊ณก์ ๋ฐ์ฐ ์ฒญ์ (Dedner et al. 2002):
๋ณด์กฐ ์ค์นผ๋ผ ์ฅ $\psi$๋ฅผ ์ถ๊ฐํ๊ณ ์งํ:
โB/โt + โฯ = ... (usual MHD terms)
โฯ/โt + c_hยฒ โยทB = -c_hยฒ ฯ / ฯ
์ฌ๊ธฐ์ $c_h$๋ ์ฒญ์ ์๋(์ผ๋ฐ์ ์ผ๋ก $c_h \sim c_{fast}$)์ด๊ณ $\tau$๋ ๊ฐ์ ์๊ฐ ์ฒ๋์ ๋๋ค.
์ด๊ฒ์ ๋ฐ์ฐ ์ค์ฐจ๋ฅผ ํ๋์ผ๋ก ์์ญ ๋ฐ์ผ๋ก ์ ํํฉ๋๋ค.
์ฅ์ : ๋น๊ตฌ์กฐํ ๊ทธ๋ฆฌ๋์์ ์๋, CT๋ณด๋ค ๊ตฌํ ์ฌ์ ๋จ์ : $\nabla \cdot B = 0$์ ์ ํํ ๋ณด์ฅํ์ง ์์, ๋งค๊ฐ๋ณ์ ํ๋ ํ์
9.3 ์์ฑ์ฑ ๋ณด์กด ๋ฐฉ๋ฒ(Positivity-Preserving Methods)¶
๊ฐ ์ ๋ฐ์ดํธ ํ $\rho > 0$๊ณผ $p > 0$์ ๋ณด์ฅํ๋ ๊ฒ์ด ์์ ์ฑ์ ์ค์ํฉ๋๋ค.
๊ธฐ๋ฒ: - ์ฌ๊ตฌ์ฑ๋ ์ํ๋ฅผ ๋ฌผ๋ฆฌ์ ๋ฒ์๋ก ์ ํ - ์์ ๋ฐ๋/์๋ ฅ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ญ์ค ์กฐ์ - ์์ฑ์ฑ ๋ณด์กด Riemann ์๋ฒ
9.4 ๊ณ ์ฐจ ๋ฐฉ๋ฒ¶
2์ฐจ๋ฅผ ๋์ด: - WENO5: 5์ฐจ ์ฌ๊ตฌ์ฑ - Discontinuous Galerkin (DG): ์ ๋ด ๊ณ ์ฐจ, ํ๋ญ์ค๋ฅผ ํตํด ๊ฒฐํฉ - ์คํํธ๋ด ๋ฐฉ๋ฒ: ๋งค๋๋ฌ์ด ๋ฌธ์ ์ ๋ํด (์ถฉ๊ฒฉํ์ ์ด์์ ์ด์ง ์์)
์ ์ถฉ: ๊ณ ์ฐจ๋ ์์น ์์ฐ์ ์ค์ด์ง๋ง ๋น์ฉ๊ณผ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํต๋๋ค.
10. ์์ฝ¶
์ด ๋ ์จ์ 2D MHD๋ฅผ ์ํ ๊ณ ๊ธ ์์น ๊ธฐ๋ฒ์ ๋ค๋ฃจ์์ต๋๋ค:
- 2D MHD ๋ฐฉ์ ์: 1D๋ก๋ถํฐ ํ์ฅ, 2D์์ 8๊ฐ์ ๋ณด์กด ๋ณ์
- ์ ํ ์ฒด์ ๋ฒ: ์ ์ค์ฌ ์ด์ฐํ, ๋ฐ์ด์ฐ ํ์
- ์ฐจ์ ๋ถํ : Strang splitting (2์ฐจ), 1D ์๋ฒ ์ฌ์ฌ์ฉ
- ๋น๋ถํ ๋ฐฉ๋ฒ: ๋ค์ฐจ์ ๊ฒฐํฉ์ ์ํ CTU
- Constrained Transport: ์๊ฐ๋ฆฐ ๊ทธ๋ฆฌ๋ (Yee mesh), $\nabla \cdot B = 0$ ์ ํํ ๋ณด์กด
- ๊ณ ์ฐจ ์ฌ๊ตฌ์ฑ: PLM (์ ํ์), WENO (5์ฐจ)
- Orszag-Tang ์๋ฅ: ๋ฒค์น๋งํฌ ๋ฌธ์ , ๋๋ฅ MHD
- Kelvin-Helmholtz ๋ถ์์ ์ฑ: ์๊ธฐ์ฅ์ด ์ ๋จ์ธต ์์ ํ
- Python ๊ตฌํ: CT๋ฅผ ์ฌ์ฉํ 2D MHD๋ฅผ ์ํ ๊ณจ๊ฒฉ ์ฝ๋
์์ฐ ์๋ฎฌ๋ ์ด์ ์ ์ํด์๋ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธ๋๊ณ ์ต์ ํ๋ ํ๋ฆฝ๋ ์ฝ๋(Athena, PLUTO, FLASH)๋ฅผ ์ฌ์ฉํ์ธ์.
์ฐ์ต ๋ฌธ์ ¶
-
CFL ์กฐ๊ฑด: $\Delta x = \Delta y = 0.01$, ๊ณ ์ ์๊ธฐ์ํ ์๋ $c_f = 2$, ์ต๋ ์ ๋ ์๋ $|v| = 1$์ธ 2D MHD ์๋ฎฌ๋ ์ด์ ์ ๋ํด $CFL = 0.5$์ ๋ํ ์ต๋ ํ์์คํ ์ ๊ณ์ฐํ์ธ์.
-
๋ฐ์ฐ ๋ณด์กด: ์ $B$๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ํ ํ์ค ์ ํ ์ฒด์ ๋ฒ์ $\nabla \cdot B = 0$์ ๋ณด์กดํ์ง ์์ง๋ง Constrained Transport๋ ๋ณด์กดํ๋์ง ์ค๋ช ํ์ธ์. Yee mesh๋ฅผ ์ค์ผ์นํ๊ณ $B_x$, $B_y$, $E_z$๊ฐ ์ด๋์ ์์นํ๋์ง ํ์ํ์ธ์.
-
Orszag-Tang ์๋ฅ: ์ Orszag-Tang ์๋ฅ๊ฐ 2D MHD ์ฝ๋์ ๋ํ ์ข์ ํ ์คํธ ๋ฌธ์ ์ ๋๊น? ์ด๋ค ๋ฌผ๋ฆฌ์ ๊ณผ์ ์ ํ ์คํธํฉ๋๊น (์ต์ 3๊ฐ ๋์ด)?
-
Kelvin-Helmholtz ์์ ํ: $V_0 = 2$ m/s, $\rho = 1$ kg/mยณ์ธ ์ ๋จ์ธต์ ๋ํด, KH ๋ถ์์ ์ฑ์ ์ต์ ํ๊ธฐ ์ํด ํ์ํ ์ต์ ์๊ธฐ์ฅ $B_0$์ ๊ณ์ฐํ์ธ์ (์ฆ, $v_A \geq V_0$). Tesla๋ก ํํํ์ธ์ (์ง๊ณต ํฌ์์จ $\mu_0 = 4\pi \times 10^{-7}$ H/m ๊ฐ์ ).
-
PLM ์ฌ๊ตฌ์ฑ: ์ ์ค์ฌ ๊ฐ $U_{i-1} = 1.0$, $U_i = 1.5$, $U_{i+1} = 2.5$๊ฐ ์ฃผ์ด์ก์ ๋, (a) ์ค์ฌ ์ฐจ๋ถ, (b) minmod ์ ํ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์ธ๊ธฐ $\sigma_i$๋ฅผ ๊ณ์ฐํ์ธ์. ์ ๊ฒฝ๊ณ๋ฉด $i+1/2$์์ ์ข์ธก๊ณผ ์ฐ์ธก ์ํ๋ ๋ฌด์์ ๋๊น?
-
CT ์ ๊ธฐ์ฅ: Constrained Transport์์ ์ ์ฝ๋์ ์ ๊ธฐ์ฅ $E_z$๋ ์ธ์ ํ ๋ฉด์ ์๋์ ์๊ธฐ์ฅ์ผ๋ก๋ถํฐ ๊ณ์ฐ๋ฉ๋๋ค. 4๊ฐ์ ์ฃผ๋ณ ๋ฉด ์ค์ฌ์์ $v_x$, $v_y$, $B_x$, $B_y$์ ๋ํด $E_z(i, j)$์ ๊ณต์์ ์์ฑํ์ธ์. (๊ฐ๋จํ ํ๊ท ํ ๊ฐ์ .)
-
์ฐจ์ ๋ถํ ์ค์ฐจ: Strang splitting ($L_x^{1/2} L_y L_x^{1/2}$)์ ์๊ฐ์ ๋ํด 2์ฐจ ์ ํ๋์ ๋๋ค. ๊ฐ๋จํ splitting ($L_x L_y$)์ ์ฌ์ฉํ๋ฉด ์ ํ๋์ ์ฐจ์๋ ๋ฌด์์ ๋๊น? ์ Strang splitting์ด ์ ํธ๋ฉ๋๊น?
-
WENO ์ฅ์ : WENO ๊ธฐ๋ฒ์ ๋งค๋๋ฌ์ด ์์ญ์์ 5์ฐจ ์ ํํ์ง๋ง ๋ถ์ฐ์ ๊ทผ์ฒ์์ ๋ ๋ฎ์ ์ฐจ์๋ก ๊ฐ์ํฉ๋๋ค. ์ ์ด๊ฒ์ด ํญ์ 2์ฐจ PLM์ ์ฌ์ฉํ๋ ๊ฒ์ ๋นํด ์ ์ตํฉ๋๊น?
-
AMR ์ ์ ๊ธฐ์ค: MHD ์๋ฎฌ๋ ์ด์ ์์ ์ ๋ฅ ์ํธ ๊ทผ์ฒ์์ ๊ทธ๋ฆฌ๋๋ฅผ ์ ์ ํ๊ณ ์ถ์ต๋๋ค. $|\nabla \times B|$์ ๊ธฐ๋ฐํ ์ ์ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํ ๊ธฐ์ค์ ์ ์ํ์ธ์. ์กฐ๊ฑด์ ์ํ์ ์ผ๋ก ์์ฑํ์ธ์.
-
๊ณ์ฐ ๋น์ฉ: ๋์ผํ ๋ฌผ๋ฆฌ์ Riemann ์๋ฒ๋ฅผ ๊ฐ์ ํ์ฌ $256 \times 256$ ๊ทธ๋ฆฌ๋์์์ 2D MHD ์๋ฎฌ๋ ์ด์ ๊ณผ 256 ์ ์ด ์๋ 1D ์๋ฎฌ๋ ์ด์ ์ ๊ณ์ฐ ๋น์ฉ(ํ์์คํ ๋น ์ฐ์ฐ)์ ๋น๊ตํ์ธ์. ๋น์จ์ ์ถ์ ํ์ธ์ (์์ ๋ฌด์).
์ด์ : ์ฐ์ฃผ ๊ธฐ์ MHD | ๋ค์: ์๋๋ก ์ MHD