17. MHD 기초 이둠 (Magnetohydrodynamics Basics)

17. MHD 기초 이둠 (Magnetohydrodynamics Basics)

ν•™μŠ΅ λͺ©ν‘œ

  • μžκΈ°μœ μ²΄μ—­ν•™(MHD)의 κΈ°λ³Έ κ°œλ… 이해
  • MHD κ°€μ •κ³Ό 적용 λ²”μœ„ νŒŒμ•…
  • 이상 MHD 방정식 μœ λ„
  • Alfven 속도와 MHD νŒŒλ™ 이해
  • μžκΈ°μ••κ³Ό 자기μž₯λ ₯ κ°œλ… ν•™μŠ΅

1. MHD μ†Œκ°œ

1.1 μ •μ˜μ™€ μ‘μš©

μžκΈ°μœ μ²΄μ—­ν•™ (Magnetohydrodynamics, MHD):
- μ „κΈ° 전도성 μœ μ²΄μ™€ μ „μžκΈ°μž₯의 μƒν˜Έμž‘μš©
- μœ μ²΄μ—­ν•™ + μ „μžκΈ°ν•™μ˜ κ²°ν•©

μ‘μš© λΆ„μ•Ό:
1. 천체물리: νƒœμ–‘, ν•­μ„±, μ€ν•˜, μ„±κ°„ 맀질
2. ν•΅μœ΅ν•©: 토카막, μŠ€ν…”λŸ¬λ ˆμ΄ν„° ν”ŒλΌμ¦ˆλ§ˆ κ°€λ‘ 
3. 지ꡬ물리: 지ꡬ 자기μž₯ λ‹€μ΄λ‚˜λͺ¨
4. 곡학: MHD λ°œμ „, μ „μžκΈ° νŽŒν”„, κΈˆμ† μ£Όμ‘°
5. 우주물리: νƒœμ–‘ν’, 자기ꢌ, 우주 날씨

역사:
- AlfvΓ©n (1942): MHD νŒŒλ™ 발견 β†’ 1970 노벨 물리학상
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 물리 μƒμˆ˜
mu0 = 4 * np.pi * 1e-7  # 진곡 투자율 [H/m]
eps0 = 8.854e-12        # 진곡 μœ μ „μœ¨ [F/m]
c = 299792458           # 광속 [m/s]
kB = 1.381e-23          # 볼츠만 μƒμˆ˜ [J/K]
me = 9.109e-31          # μ „μž μ§ˆλŸ‰ [kg]
mp = 1.673e-27          # μ–‘μ„±μž μ§ˆλŸ‰ [kg]
e = 1.602e-19           # κΈ°λ³Έ μ „ν•˜ [C]

def mhd_introduction():
    """MHD κ°œμš”"""

    print("=" * 60)
    print("μžκΈ°μœ μ²΄μ—­ν•™ (MHD) κ°œμš”")
    print("=" * 60)

    intro = """
    MHD의 핡심 κ°œλ…:

    1. 전도성 유체:
       - ν”ŒλΌμ¦ˆλ§ˆ, 앑체 κΈˆμ†, μ—Όμˆ˜
       - 자유 μ „ν•˜κ°€ μ „μžκΈ°μž₯에 λ°˜μ‘
       - μ „κΈ° 전도도 Οƒ > 0

    2. 유체-자기μž₯ μƒν˜Έμž‘μš©:
       - 자기μž₯이 유체 μš΄λ™μ— νž˜μ„ 가함 (Lorentz 힘)
       - 유체 μš΄λ™μ΄ 자기μž₯을 λ³€ν™”μ‹œν‚΄ (μœ λ„)

    3. κ²°ν•© 방정식:
       - μœ μ²΄μ—­ν•™: 연속, μš΄λ™λŸ‰, μ—λ„ˆμ§€
       - μ „μžκΈ°ν•™: Maxwell 방정식 (일뢀)

    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                  MHD μ˜μ—­                        β”‚
    β”‚                                                  β”‚
    β”‚    [μœ μ²΄μ—­ν•™]  ←──── κ²°ν•© ────→  [μ „μžκΈ°ν•™]      β”‚
    β”‚                                                  β”‚
    β”‚    ρ, v, p         J = Οƒ(E + vΓ—B)      E, B     β”‚
    β”‚    연속/μš΄λ™λŸ‰        Ohm's law         Maxwell  β”‚
    β”‚    μ—λ„ˆμ§€                              (일뢀)    β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    """
    print(intro)

mhd_introduction()

1.2 MHD μ‹œκ°„/곡간 μŠ€μΌ€μΌ

def mhd_scales():
    """MHD κ΄€λ ¨ μ‹œκ°„/곡간 μŠ€μΌ€μΌ 비ꡐ"""

    # νƒœμ–‘ μ½”λ‘œλ‚˜ ν”ŒλΌμ¦ˆλ§ˆ μ˜ˆμ‹œ
    n = 1e15       # 밀도 [m^-3]
    T = 1e6        # μ˜¨λ„ [K]
    B = 1e-2       # 자기μž₯ [T]
    L = 1e8        # νŠΉμ„± 길이 [m]

    # ν”ŒλΌμ¦ˆλ§ˆ 주파수
    omega_pe = np.sqrt(n * e**2 / (eps0 * me))
    omega_pi = np.sqrt(n * e**2 / (eps0 * mp))

    # μ‚¬μ΄ν΄λ‘œνŠΈλ‘  주파수
    omega_ce = e * B / me
    omega_ci = e * B / mp

    # Debye 길이
    lambda_D = np.sqrt(eps0 * kB * T / (n * e**2))

    # 열속도
    v_te = np.sqrt(2 * kB * T / me)
    v_ti = np.sqrt(2 * kB * T / mp)

    # Alfven 속도
    rho = n * mp
    v_A = B / np.sqrt(mu0 * rho)

    # μŒμ†
    gamma = 5/3
    p = n * kB * T
    c_s = np.sqrt(gamma * p / rho)

    print("=" * 60)
    print("ν”ŒλΌμ¦ˆλ§ˆ μŠ€μΌ€μΌ (νƒœμ–‘ μ½”λ‘œλ‚˜ μ˜ˆμ‹œ)")
    print("=" * 60)
    print(f"\nμž…λ ₯ νŒŒλΌλ―Έν„°:")
    print(f"  밀도 n = {n:.2e} m^-3")
    print(f"  μ˜¨λ„ T = {T:.2e} K")
    print(f"  자기μž₯ B = {B*1000:.1f} mT")
    print(f"  νŠΉμ„± 길이 L = {L/1e6:.0f} Mm")

    print(f"\n주파수:")
    print(f"  μ „μž ν”ŒλΌμ¦ˆλ§ˆ 주파수 Ο‰pe = {omega_pe:.2e} rad/s")
    print(f"  이온 ν”ŒλΌμ¦ˆλ§ˆ 주파수 Ο‰pi = {omega_pi:.2e} rad/s")
    print(f"  μ „μž μ‚¬μ΄ν΄λ‘œνŠΈλ‘  Ο‰ce = {omega_ce:.2e} rad/s")
    print(f"  이온 μ‚¬μ΄ν΄λ‘œνŠΈλ‘  Ο‰ci = {omega_ci:.2e} rad/s")

    print(f"\n속도:")
    print(f"  μ „μž 열속도 vte = {v_te/1e6:.2f} Mm/s")
    print(f"  이온 열속도 vti = {v_ti/1e3:.2f} km/s")
    print(f"  Alfven 속도 vA = {v_A/1e3:.2f} km/s")
    print(f"  μŒμ† cs = {c_s/1e3:.2f} km/s")

    print(f"\n길이 μŠ€μΌ€μΌ:")
    print(f"  Debye 길이 λD = {lambda_D:.4f} m")
    print(f"  μ „μž κ΄€μ„± 길이 c/Ο‰pe = {c/omega_pe:.4f} m")
    print(f"  이온 κ΄€μ„± 길이 c/Ο‰pi = {c/omega_pi:.2f} m")

    # MHD μœ νš¨μ„± 쑰건 확인
    print(f"\nMHD μœ νš¨μ„± 쑰건:")
    print(f"  L >> Ξ»D: {L:.2e} >> {lambda_D:.4f} βœ“" if L > 1000*lambda_D else f"  L >> Ξ»D: {L} !>> {lambda_D}")
    print(f"  L >> c/Ο‰pi: {L:.2e} >> {c/omega_pi:.2f} βœ“" if L > 100*c/omega_pi else f"  L >> c/Ο‰pi 확인 ν•„μš”")

    # μ‹œκ°ν™”
    fig, ax = plt.subplots(figsize=(12, 6))

    scales = {
        'Ξ»D': lambda_D,
        'c/Ο‰pe': c/omega_pe,
        'c/Ο‰pi': c/omega_pi,
        'vA/Ο‰ci': v_A/omega_ci,
        'L (MHD)': L
    }

    y_pos = np.arange(len(scales))
    values = list(scales.values())
    labels = list(scales.keys())

    ax.barh(y_pos, np.log10(values), color=['red', 'orange', 'yellow', 'green', 'blue'])
    ax.set_yticks(y_pos)
    ax.set_yticklabels(labels)
    ax.set_xlabel('log₁₀(Length [m])')
    ax.set_title('ν”ŒλΌμ¦ˆλ§ˆ 길이 μŠ€μΌ€μΌ 비ꡐ')
    ax.axvline(x=np.log10(L), color='black', linestyle='--', label='MHD μŠ€μΌ€μΌ')
    ax.grid(True, alpha=0.3)

    for i, v in enumerate(values):
        ax.text(np.log10(v) + 0.1, i, f'{v:.2e} m', va='center')

    plt.tight_layout()
    plt.savefig('mhd_scales.png', dpi=150, bbox_inches='tight')
    plt.show()

# mhd_scales()

2. MHD κ°€μ •

2.1 κΈ°λ³Έ κ°€μ •

MHD의 핡심 κ°€μ •:

1. 쀀쀑성 (Quasi-neutrality):
   ni β‰ˆ ne = n
   - Debye 길이보닀 큰 μŠ€μΌ€μΌμ—μ„œ 성립
   - μ „ν•˜ 뢄리 λ¬΄μ‹œ

2. μ €μ£ΌνŒŒ 근사 (Low-frequency):
   Ο‰ << Ο‰ci << Ο‰ce
   - λ³€μœ„ μ „λ₯˜ λ¬΄μ‹œ: βˆ‚D/βˆ‚t β‰ˆ 0
   - μ „μž κ΄€μ„± λ¬΄μ‹œ

3. 유체 근사:
   L >> Ξ»mfp (평균 자유 경둜)
   - κ΅­μ†Œ μ—΄ν‰ν˜• κ°€μ •
   - μš΄λ™λ‘ μ  효과 λ¬΄μ‹œ

4. λΉ„μƒλŒ€λ‘ μ :
   v << c
   - μƒλŒ€λ‘ μ  보정 λΆˆν•„μš”

κ²°κ³Ό:
- Maxwell 방정식 λ‹¨μˆœν™”
- μ „κΈ°μž₯은 자기μž₯κ³Ό μ†λ„μ—μ„œ μœ λ„
- 자기 μœ λ„ 방정식 λ„μΆœ
def mhd_assumptions():
    """MHD κ°€μ •μ˜ 물리적 의미"""

    print("=" * 60)
    print("MHD κ°€μ •κ³Ό Maxwell 방정식 λ‹¨μˆœν™”")
    print("=" * 60)

    assumptions = """
    Maxwell 방정식:
    (1) βˆ‡Β·E = ρc/Ξ΅β‚€        ← MHDμ—μ„œ: 쀀쀑성, ρc β‰ˆ 0
    (2) βˆ‡Β·B = 0            ← κ·ΈλŒ€λ‘œ μœ μ§€
    (3) βˆ‡Γ—E = -βˆ‚B/βˆ‚t       ← κ·ΈλŒ€λ‘œ μœ μ§€
    (4) βˆ‡Γ—B = ΞΌβ‚€J + ΞΌβ‚€Ξ΅β‚€βˆ‚E/βˆ‚t  ← λ³€μœ„ μ „λ₯˜ λ¬΄μ‹œ

    λ‹¨μˆœν™”λœ Maxwell 방정식 (MHD):
    (1') βˆ‡Β·E β‰ˆ 0 (쀀쀑성)
    (2') βˆ‡Β·B = 0
    (3') βˆ‡Γ—E = -βˆ‚B/βˆ‚t
    (4') βˆ‡Γ—B = ΞΌβ‚€J  (AmpΓ¨re 법칙)

    μΌλ°˜ν™”λœ Ohm의 법칙:
    E + vΓ—B = Ξ·J + (JΓ—B)/ne - βˆ‡pe/ne + (me/neΒ²)βˆ‚J/βˆ‚t
                ↑      ↑        ↑           ↑
             μ €ν•­   Hall    μ „μžμ••λ ₯    μ „μžκ΄€μ„±

    이상 MHD (Ideal MHD):
    E + vΓ—B = 0  (λͺ¨λ“  μš°λ³€ ν•­ λ¬΄μ‹œ)
    β†’ 자기μž₯이 μœ μ²΄μ™€ ν•¨κ»˜ "동결" (frozen-in)

    μ €ν•­μ„± MHD (Resistive MHD):
    E + vΓ—B = Ξ·J  (μ €ν•­ 효과만 포함)
    β†’ 자기μž₯ ν™•μ‚° 및 μž¬κ²°ν•© κ°€λŠ₯
    """
    print(assumptions)

mhd_assumptions()

3. 이상 MHD 방정식

3.1 μ§€λ°° 방정식

이상 MHD 방정식 체계:

1. μ§ˆλŸ‰ 보쑴:
   βˆ‚Ο/βˆ‚t + βˆ‡Β·(ρv) = 0

2. μš΄λ™λŸ‰ 보쑴:
   ρ(βˆ‚v/βˆ‚t + (vΒ·βˆ‡)v) = -βˆ‡p + JΓ—B + ρg
                            ↑
                        Lorentz 힘

   JΓ—B = (βˆ‡Γ—B)Γ—B/ΞΌβ‚€ = (BΒ·βˆ‡)B/ΞΌβ‚€ - βˆ‡(BΒ²/2ΞΌβ‚€)
                          ↑           ↑
                      자기μž₯λ ₯     μžκΈ°μ••

3. μ—λ„ˆμ§€ 보쑴 (단열):
   βˆ‚/βˆ‚t(p/ρ^Ξ³) + vΒ·βˆ‡(p/ρ^Ξ³) = 0

   λ˜λŠ”: βˆ‚p/βˆ‚t + vΒ·βˆ‡p + Ξ³pβˆ‡Β·v = 0

4. μœ λ„ 방정식:
   βˆ‚B/βˆ‚t = βˆ‡Γ—(vΓ—B)

   (E = -vΓ—B λŒ€μž…)

5. λ°œμ‚° 쑰건:
   βˆ‡Β·B = 0 (항상 μœ μ§€)
def ideal_mhd_equations():
    """이상 MHD 방정식 μ‹œκ°ν™”"""

    print("=" * 60)
    print("이상 MHD 방정식 체계")
    print("=" * 60)

    equations = """
    보쑴 ν˜•νƒœ (Conservative Form):

    βˆ‚U/βˆ‚t + βˆ‡Β·F = S

    μ—¬κΈ°μ„œ:
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ 보쑴 λ³€μˆ˜ U:                                             β”‚
    β”‚   U = [ρ, ρv, B, E]α΅€                                    β”‚
    β”‚   E = p/(Ξ³-1) + ρvΒ²/2 + BΒ²/2ΞΌβ‚€ (총 μ—λ„ˆμ§€)              β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ ν”ŒλŸ­μŠ€ F (x λ°©ν–₯):                                       β”‚
    β”‚   F₁ = ρvx                        (μ§ˆλŸ‰)                β”‚
    β”‚   Fβ‚‚ = ρvxv - BxB/ΞΌβ‚€ + P*I       (μš΄λ™λŸ‰)               β”‚
    β”‚   F₃ = vxB - Bxv                  (자기μž₯)               β”‚
    β”‚   Fβ‚„ = (E + P*)vx - Bx(vΒ·B)/ΞΌβ‚€   (μ—λ„ˆμ§€)               β”‚
    β”‚                                                         β”‚
    β”‚   P* = p + BΒ²/2ΞΌβ‚€ (총 μ••λ ₯)                             β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ 8개 λ³€μˆ˜: ρ, vx, vy, vz, Bx, By, Bz, p                  β”‚
    β”‚ 8개 방정식: 연속(1), μš΄λ™λŸ‰(3), μœ λ„(3), μ—λ„ˆμ§€(1)       β”‚
    β”‚ + μ œμ•½μ‘°κ±΄: βˆ‡Β·B = 0                                     β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    """
    print(equations)

    # Lorentz 힘 μ‹œκ°ν™”
    fig, axes = plt.subplots(1, 2, figsize=(14, 5))

    # (1) 자기 μ••λ ₯
    ax1 = axes[0]

    # 균일 자기μž₯ μ˜μ—­κ³Ό μ™ΈλΆ€
    x = np.linspace(-2, 2, 50)
    y = np.linspace(-2, 2, 50)
    X, Y = np.meshgrid(x, y)

    # 자기μž₯ (z λ°©ν–₯, 쀑심 μ˜μ—­μ—μ„œ 강함)
    Bz = np.exp(-(X**2 + Y**2))

    # 자기 μ••λ ₯ βˆ‡(BΒ²/2ΞΌβ‚€)
    B_pressure = Bz**2 / (2 * mu0)
    grad_Bp_x, grad_Bp_y = np.gradient(B_pressure, x[1]-x[0])

    im = ax1.pcolormesh(X, Y, B_pressure * 1e6, cmap='hot', shading='auto')
    plt.colorbar(im, ax=ax1, label=r'$B^2/2\mu_0$ [ΞΌPa]')

    # μžκΈ°μ•• ꡬ배 (힘) ν‘œμ‹œ
    skip = 5
    ax1.quiver(X[::skip, ::skip], Y[::skip, ::skip],
              -grad_Bp_x[::skip, ::skip], -grad_Bp_y[::skip, ::skip],
              color='white', alpha=0.8)

    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_title(r'자기 μ••λ ₯ $-\nabla(B^2/2\mu_0)$: λ°”κΉ₯ λ°©ν–₯ 힘')
    ax1.set_aspect('equal')

    # (2) 자기 μž₯λ ₯
    ax2 = axes[1]

    # 곑선 자기μž₯μ„ 
    theta = np.linspace(0, 2*np.pi, 100)
    for r in [0.5, 1.0, 1.5]:
        x_line = r * (1 + 0.3 * np.sin(2*theta)) * np.cos(theta)
        y_line = r * (1 + 0.3 * np.sin(2*theta)) * np.sin(theta)
        ax2.plot(x_line, y_line, 'b-', linewidth=1.5)

    # μž₯λ ₯ λ°©ν–₯ ν‘œμ‹œ (곑λ₯  쀑심 λ°©ν–₯)
    for r in [1.0]:
        theta_arrows = np.linspace(0, 2*np.pi, 8, endpoint=False)
        for t in theta_arrows:
            x0 = r * (1 + 0.3 * np.sin(2*t)) * np.cos(t)
            y0 = r * (1 + 0.3 * np.sin(2*t)) * np.sin(t)

            # 곑λ₯  쀑심 λ°©ν–₯ (λŒ€λž΅μ )
            dx = -x0 * 0.3
            dy = -y0 * 0.3
            ax2.annotate('', xy=(x0+dx, y0+dy), xytext=(x0, y0),
                        arrowprops=dict(arrowstyle='->', color='red', lw=2))

    ax2.set_xlabel('x')
    ax2.set_ylabel('y')
    ax2.set_title(r'자기 μž₯λ ₯ $(B\cdot\nabla)B/\mu_0$: 곑λ₯  쀑심 λ°©ν–₯')
    ax2.set_aspect('equal')
    ax2.set_xlim(-2, 2)
    ax2.set_ylim(-2, 2)
    ax2.grid(True, alpha=0.3)

    # λ²”λ‘€
    ax2.plot([], [], 'b-', linewidth=2, label='자기λ ₯μ„ ')
    ax2.plot([], [], 'r-', linewidth=2, label='μž₯λ ₯ λ°©ν–₯')
    ax2.legend()

    plt.tight_layout()
    plt.savefig('mhd_lorentz_force.png', dpi=150, bbox_inches='tight')
    plt.show()

# ideal_mhd_equations()

4. Alfven 속도

4.1 μ •μ˜μ™€ 물리적 의미

Alfven 속도 (AlfvΓ©n velocity):

vA = B / √(μ₀ρ)

물리적 의미:
- 자기λ ₯선을 따라 μ „νŒŒν•˜λŠ” 횑파의 속도
- 자기 μ—λ„ˆμ§€μ™€ μš΄λ™ μ—λ„ˆμ§€μ˜ λ“±λΆ„λ°°
- BΒ²/2ΞΌβ‚€ ~ ρvAΒ²/2

무차원 νŒŒλΌλ―Έν„°:
- Alfven Mach 수: MA = v/vA
- ν”ŒλΌμ¦ˆλ§ˆ 베타: Ξ² = 2ΞΌβ‚€p/BΒ² = (cs/vA)Β² Γ— 2/Ξ³

  Ξ² << 1: μžκΈ°μ•• μ§€λ°° (νƒœμ–‘ μ½”λ‘œλ‚˜)
  Ξ² >> 1: μ—΄μ•• μ§€λ°° (νƒœμ–‘ λŒ€λ₯˜κΆŒ)
  Ξ² ~ 1: λ‘˜ λ‹€ μ€‘μš”
def alfven_velocity_analysis():
    """Alfven 속도 뢄석"""

    fig, axes = plt.subplots(1, 2, figsize=(14, 5))

    # (1) λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œμ˜ Alfven 속도
    ax1 = axes[0]

    # ν™˜κ²½λ³„ νŒŒλΌλ―Έν„°
    environments = {
        'νƒœμ–‘ μ½”λ‘œλ‚˜': {'n': 1e14, 'B': 0.01, 'T': 1e6},
        'νƒœμ–‘ν’ (1AU)': {'n': 5e6, 'B': 5e-9, 'T': 1e5},
        'μ„±κ°„ 맀질': {'n': 1e6, 'B': 3e-10, 'T': 1e4},
        '토카막': {'n': 1e20, 'B': 5, 'T': 1e8},
        '앑체 λ‚˜νŠΈλ₯¨': {'n': 2.5e28, 'B': 0.1, 'T': 400}  # 밀도λ₯Ό μž…μž 수둜 λ³€ν™˜
    }

    names = []
    v_A_values = []
    v_s_values = []

    for name, params in environments.items():
        n = params['n']
        B = params['B']
        T = params['T']

        # 이온 μ§ˆλŸ‰ (ν”ŒλΌμ¦ˆλ§ˆλŠ” μ–‘μ„±μž, λ‚˜νŠΈλ₯¨μ€ Na)
        if 'λ‚˜νŠΈλ₯¨' in name:
            m_ion = 23 * mp  # Na μ§ˆλŸ‰
            rho = n * m_ion
        else:
            m_ion = mp
            rho = n * m_ion

        # Alfven 속도
        v_A = B / np.sqrt(mu0 * rho)

        # μŒμ†
        gamma = 5/3
        p = n * kB * T
        c_s = np.sqrt(gamma * p / rho)

        names.append(name)
        v_A_values.append(v_A)
        v_s_values.append(c_s)

    y_pos = np.arange(len(names))

    ax1.barh(y_pos - 0.2, np.log10(v_A_values), 0.4, label=r'$v_A$', color='blue')
    ax1.barh(y_pos + 0.2, np.log10(v_s_values), 0.4, label=r'$c_s$', color='red')

    ax1.set_yticks(y_pos)
    ax1.set_yticklabels(names)
    ax1.set_xlabel('log₁₀(velocity [m/s])')
    ax1.set_title('λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œμ˜ Alfven 속도와 μŒμ†')
    ax1.legend()
    ax1.grid(True, alpha=0.3)

    # (2) ν”ŒλΌμ¦ˆλ§ˆ 베타 레짐
    ax2 = axes[1]

    B_range = np.logspace(-10, 1, 100)  # 자기μž₯ λ²”μœ„
    n_values = [1e6, 1e14, 1e20]  # 밀도
    T = 1e6  # κ³ μ • μ˜¨λ„

    colors = ['blue', 'green', 'red']
    for n, color in zip(n_values, colors):
        rho = n * mp
        p = n * kB * T

        # ν”ŒλΌμ¦ˆλ§ˆ 베타
        beta = 2 * mu0 * p / B_range**2

        ax2.loglog(B_range, beta, color=color, linewidth=2, label=f'n = {n:.0e} m⁻³')

    ax2.axhline(y=1, color='black', linestyle='--', label=r'$\beta = 1$')
    ax2.fill_between([1e-10, 1e1], 1e-6, 1, alpha=0.2, color='blue', label=r'$\beta < 1$ (μžκΈ°μ•• μ§€λ°°)')
    ax2.fill_between([1e-10, 1e1], 1, 1e6, alpha=0.2, color='red', label=r'$\beta > 1$ (μ—΄μ•• μ§€λ°°)')

    ax2.set_xlabel('B [T]')
    ax2.set_ylabel(r'$\beta = 2\mu_0 p / B^2$')
    ax2.set_title(f'ν”ŒλΌμ¦ˆλ§ˆ 베타 (T = {T:.0e} K)')
    ax2.legend(loc='upper right')
    ax2.grid(True, alpha=0.3)
    ax2.set_ylim(1e-6, 1e6)
    ax2.set_xlim(1e-10, 1e1)

    plt.tight_layout()
    plt.savefig('alfven_velocity.png', dpi=150, bbox_inches='tight')
    plt.show()

# alfven_velocity_analysis()

5. MHD νŒŒλ™

5.1 νŒŒλ™ μœ ν˜•

이상 MHD의 μ„Έ κ°€μ§€ νŒŒλ™ λͺ¨λ“œ:

1. Alfven 파 (전단 Alfven 파):
   - 속도: vA = Bβ‚€/√(μ₀ρ)
   - λ°©ν–₯: 자기μž₯ λ°©ν–₯으둜만 μ „νŒŒ
   - νŠΉμ„±: 횑파, λΉ„μ••μΆ•μ„±, 자기λ ₯μ„  진동
   - 속도 섭동: Ξ΄v βŠ₯ Bβ‚€, k

2. λΉ λ₯Έ 자기음파 (Fast Magnetosonic):
   - 속도: vf = √[(vAΒ² + csΒ²)/2 + √((vAΒ² + csΒ²)Β² - 4vAΒ²csΒ²cosΒ²ΞΈ)/2]
   - νŠΉμ„±: μžκΈ°μ•• + μ—΄μ•• 볡원λ ₯
   - 등방적 μ „νŒŒ (λͺ¨λ“  λ°©ν–₯)

3. 느린 자기음파 (Slow Magnetosonic):
   - 속도: vs = √[(vAΒ² + csΒ²)/2 - √((vAΒ² + csΒ²)Β² - 4vAΒ²csΒ²cosΒ²ΞΈ)/2]
   - νŠΉμ„±: μžκΈ°μ••κ³Ό μ—΄μ••μ˜ λ°˜λŒ€ μž‘μš©
   - 자기μž₯ λ°©ν–₯ 근처둜 μ „νŒŒ

μ—¬κΈ°μ„œ ΞΈ = ∠(k, Bβ‚€)

특수 경우:
- ΞΈ = 0 (평행): vf = max(vA, cs), vs = min(vA, cs)
- ΞΈ = Ο€/2 (수직): vf = √(vAΒ² + csΒ²), vs = 0
def mhd_wave_speeds():
    """MHD νŒŒλ™ 속도 λΆ„μ‚° 관계"""

    fig, axes = plt.subplots(1, 2, figsize=(14, 5))

    # (1) νŒŒλ™ 속도 vs μ „νŒŒ 각도
    ax1 = axes[0]

    theta = np.linspace(0, np.pi/2, 100)

    # vA/cs λΉ„μœ¨ (ν”ŒλΌμ¦ˆλ§ˆ 베타 κ΄€λ ¨)
    ratios = [0.5, 1.0, 2.0]  # vA/cs

    for ratio in ratios:
        vA = ratio
        cs = 1.0

        # λΉ λ₯Έ/느린 파
        term1 = (vA**2 + cs**2) / 2
        term2 = np.sqrt((vA**2 + cs**2)**2 - 4 * vA**2 * cs**2 * np.cos(theta)**2) / 2

        v_fast = np.sqrt(term1 + term2)
        v_slow = np.sqrt(np.maximum(term1 - term2, 0))

        # Alfven 파 (μ„±λΆ„)
        v_alfven = np.abs(vA * np.cos(theta))

        ax1.plot(np.degrees(theta), v_fast, '-', linewidth=2, label=f'Fast (vA/cs={ratio})')
        ax1.plot(np.degrees(theta), v_slow, '--', linewidth=2, label=f'Slow (vA/cs={ratio})')
        ax1.plot(np.degrees(theta), v_alfven, ':', linewidth=2, label=f'Alfven (vA/cs={ratio})')

    ax1.set_xlabel('ΞΈ [degrees]')
    ax1.set_ylabel('Phase velocity / cs')
    ax1.set_title('MHD νŒŒλ™ 속도 vs μ „νŒŒ 각도')
    ax1.legend(loc='upper right', fontsize=8)
    ax1.grid(True, alpha=0.3)
    ax1.set_xlim(0, 90)

    # (2) ν”„λ¦¬λ“œλ¦¬νžˆμŠ€ λ‹€μ΄μ–΄κ·Έλž¨ (κ·Ήμ’Œν‘œ)
    ax2 = axes[1]

    theta_full = np.linspace(0, 2*np.pi, 360)

    vA = 2.0
    cs = 1.0

    term1 = (vA**2 + cs**2) / 2
    term2 = np.sqrt((vA**2 + cs**2)**2 - 4 * vA**2 * cs**2 * np.cos(theta_full)**2) / 2

    v_fast = np.sqrt(term1 + term2)
    v_slow = np.sqrt(np.maximum(term1 - term2, 0))
    v_alfven = np.abs(vA * np.cos(theta_full))

    # κ·Ήμ’Œν‘œ -> μ§κ΅μ’Œν‘œ
    x_fast = v_fast * np.sin(theta_full)
    y_fast = v_fast * np.cos(theta_full)

    x_slow = v_slow * np.sin(theta_full)
    y_slow = v_slow * np.cos(theta_full)

    x_alf = v_alfven * np.sin(theta_full)
    y_alf = v_alfven * np.cos(theta_full)

    ax2.plot(x_fast, y_fast, 'b-', linewidth=2, label='Fast')
    ax2.plot(x_slow, y_slow, 'r-', linewidth=2, label='Slow')
    ax2.plot(x_alf, y_alf, 'g--', linewidth=2, label='Alfven')

    # Bβ‚€ λ°©ν–₯ ν‘œμ‹œ
    ax2.annotate('', xy=(0, 3), xytext=(0, 0),
                arrowprops=dict(arrowstyle='->', color='black', lw=2))
    ax2.text(0.2, 2.8, r'$B_0$', fontsize=14)

    ax2.set_xlabel(r'$v_\perp / c_s$')
    ax2.set_ylabel(r'$v_\parallel / c_s$')
    ax2.set_title(f'Friedrichs λ‹€μ΄μ–΄κ·Έλž¨ (vA/cs = {vA/cs})')
    ax2.legend()
    ax2.grid(True, alpha=0.3)
    ax2.set_aspect('equal')
    ax2.set_xlim(-3, 3)
    ax2.set_ylim(-3, 3)

    plt.tight_layout()
    plt.savefig('mhd_waves.png', dpi=150, bbox_inches='tight')
    plt.show()

# mhd_wave_speeds()

5.2 Alfven 파 μ‹œκ°ν™”

def alfven_wave_visualization():
    """Alfven 파 μ‹œκ°ν™”"""

    fig = plt.figure(figsize=(14, 10))

    # (1) Alfven 파 κ°œλ…λ„ (3D)
    ax1 = fig.add_subplot(221, projection='3d')

    z = np.linspace(0, 4*np.pi, 100)
    t = 0

    # ν‰ν˜• 자기μž₯ λ°©ν–₯ (z)
    B0 = 1.0

    # 섭동 (y λ°©ν–₯ 진동)
    k = 1
    omega = k  # vA = 1둜 μ •κ·œν™”
    By = 0.3 * np.sin(k*z - omega*t)

    # 자기λ ₯μ„  μœ„μΉ˜
    x_line = np.zeros_like(z)
    y_line = By

    ax1.plot(x_line, y_line, z, 'b-', linewidth=2, label='자기λ ₯μ„ ')
    ax1.plot([0]*len(z), [0]*len(z), z, 'k--', alpha=0.5, label='ν‰ν˜• μœ„μΉ˜')

    # 속도 섭동
    vy = -0.3 * np.sin(k*z - omega*t)  # v ∝ -B (Alfven 관계)
    skip = 10
    ax1.quiver(x_line[::skip], y_line[::skip], z[::skip],
              np.zeros(len(z[::skip])), vy[::skip], np.zeros(len(z[::skip])),
              color='red', length=0.5, arrow_length_ratio=0.3, label='속도 섭동')

    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_zlabel('z (Bβ‚€ λ°©ν–₯)')
    ax1.set_title('Alfven 파: 자기λ ₯μ„  횑방ν–₯ 진동')
    ax1.legend()

    # (2) μ‹œκ°„ μ „κ°œ
    ax2 = fig.add_subplot(222)

    z = np.linspace(0, 4*np.pi, 200)
    times = [0, 0.5, 1.0, 1.5, 2.0]
    colors = plt.cm.viridis(np.linspace(0, 1, len(times)))

    for t, color in zip(times, colors):
        By = 0.3 * np.sin(k*z - omega*t)
        ax2.plot(z, By, color=color, linewidth=1.5, label=f't = {t:.1f}')

    ax2.set_xlabel('z')
    ax2.set_ylabel(r'$\delta B_y$')
    ax2.set_title('Alfven 파 μ „νŒŒ')
    ax2.legend()
    ax2.grid(True, alpha=0.3)

    # (3) μ—λ„ˆμ§€ λΆ„λ°°
    ax3 = fig.add_subplot(223)

    # 자기 μ—λ„ˆμ§€μ™€ μš΄λ™ μ—λ„ˆμ§€
    z = np.linspace(0, 4*np.pi, 200)
    t = 0.5

    B_pert = 0.3 * np.sin(k*z - omega*t)
    v_pert = -0.3 * np.sin(k*z - omega*t)

    # μ—λ„ˆμ§€ 밀도 (λ‹¨μœ„ λ¬΄μ‹œ, λΉ„λ‘€ κ΄€κ³„λ§Œ)
    E_mag = B_pert**2 / 2  # ∝ BΒ²/2ΞΌβ‚€
    E_kin = v_pert**2 / 2  # ∝ ρv²/2

    ax3.plot(z, E_mag, 'b-', linewidth=2, label=r'$\delta B^2/2\mu_0$ (자기)')
    ax3.plot(z, E_kin, 'r--', linewidth=2, label=r'$\rho\delta v^2/2$ (μš΄λ™)')
    ax3.plot(z, E_mag + E_kin, 'k-', linewidth=2, label='Total')

    ax3.set_xlabel('z')
    ax3.set_ylabel('Energy density')
    ax3.set_title('Alfven 파 μ—λ„ˆμ§€ λ“±λΆ„λ°°')
    ax3.legend()
    ax3.grid(True, alpha=0.3)

    # (4) 섭동 관계
    ax4 = fig.add_subplot(224)

    # Ξ΄v = -Ξ΄B/√(μ₀ρ) (Alfven 관계)
    info_text = """
Alfven 파 νŠΉμ„±:

1. μ „νŒŒ λ°©ν–₯: Bβ‚€ λ°©ν–₯ (k βˆ₯ Bβ‚€)
2. νŽΈκ΄‘: 횑파 (Ξ΄v βŠ₯ Bβ‚€, Ξ΄B βŠ₯ Bβ‚€)
3. 속도: vA = Bβ‚€/√(μ₀ρ)

섭동 관계:
Ξ΄v = βˆ“ Ξ΄B/√(μ₀ρ)
(Β± for kΒ·Bβ‚€ β‰· 0)

νŠΉμ§•:
- λΉ„μ••μΆ•μ„±: βˆ‡Β·Ξ΄v = 0
- 밀도/μ••λ ₯ 섭동 μ—†μŒ
- 자기λ ₯선이 "기타 쀄"처럼 진동
- μž₯λ ₯이 볡원λ ₯ 제곡

Alfven 정리 (동결 쑰건):
이상 MHDμ—μ„œ 자기λ ₯선은
μœ μ²΄μ™€ ν•¨κ»˜ μ›€μ§μž„
("frozen-in" 쑰건)
    """
    ax4.text(0.1, 0.95, info_text, transform=ax4.transAxes,
            fontsize=10, verticalalignment='top', fontfamily='monospace',
            bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
    ax4.axis('off')

    plt.tight_layout()
    plt.savefig('alfven_wave_detail.png', dpi=150, bbox_inches='tight')
    plt.show()

# alfven_wave_visualization()

6. μžκΈ°μ••κ³Ό 자기μž₯λ ₯

6.1 힘의 λΆ„ν•΄

Lorentz 힘 λΆ„ν•΄:

JΓ—B = (1/ΞΌβ‚€)(βˆ‡Γ—B)Γ—B

벑터 항등식 μ‚¬μš©:
(βˆ‡Γ—B)Γ—B = (BΒ·βˆ‡)B - βˆ‡(BΒ²/2)

λ”°λΌμ„œ:
JΓ—B = (BΒ·βˆ‡)B/ΞΌβ‚€ - βˆ‡(BΒ²/2ΞΌβ‚€)
        ↑           ↑
     자기μž₯λ ₯    μžκΈ°μ•• ꡬ배

1. 자기 μ••λ ₯ (Magnetic Pressure):
   pm = BΒ²/2ΞΌβ‚€

   - 등방적 (λͺ¨λ“  λ°©ν–₯ 동일)
   - Bκ°€ 큰 μ˜μ—­μ—μ„œ μž‘μ€ μ˜μ—­μœΌλ‘œ 힘
   - 자기μž₯μ„  λ°€μ§‘ β†’ 높은 μ••λ ₯

2. 자기 μž₯λ ₯ (Magnetic Tension):
   T = (BΒ·βˆ‡)B/ΞΌβ‚€ = (BΒ²/ΞΌβ‚€)ΞΊ

   - 곑λ₯  κ의 쀑심 λ°©ν–₯
   - 휜 자기λ ₯선을 νŽ΄λ €λŠ” 힘
   - "기타 쀄 μž₯λ ₯"κ³Ό μœ μ‚¬
def magnetic_pressure_tension():
    """μžκΈ°μ••κ³Ό 자기μž₯λ ₯의 κ· ν˜• μ˜ˆμ‹œ"""

    fig, axes = plt.subplots(1, 3, figsize=(15, 5))

    # (1) 자기 μ••λ ₯ ν‰ν˜• (Z-pinch)
    ax1 = axes[0]

    r = np.linspace(0.1, 2, 50)
    theta = np.linspace(0, 2*np.pi, 50)
    R, Theta = np.meshgrid(r, theta)

    # 자기μž₯ (μΆ• λ°©ν–₯ μ „λ₯˜μ— μ˜ν•œ ΞΈ λ°©ν–₯ 자기μž₯)
    # B_theta ∝ 1/r (μ™ΈλΆ€), B_theta ∝ r (λ‚΄λΆ€)
    r_plasma = 1.0
    B_theta = np.where(R < r_plasma, R, 1/R)

    X = R * np.cos(Theta)
    Y = R * np.sin(Theta)

    # μžκΈ°μ••
    P_mag = B_theta**2 / 2

    im = ax1.pcolormesh(X, Y, P_mag, cmap='hot', shading='auto')
    plt.colorbar(im, ax=ax1, label=r'$B^2/2\mu_0$')

    # 자기λ ₯μ„  (동심원)
    for r_line in [0.3, 0.6, 0.9, 1.2, 1.5]:
        circle = plt.Circle((0, 0), r_line, fill=False, color='blue', linewidth=1)
        ax1.add_patch(circle)

    # μ••λ ₯ ꡬ배 λ°©ν–₯
    ax1.annotate('', xy=(0.7, 0), xytext=(0.3, 0),
                arrowprops=dict(arrowstyle='->', color='white', lw=2))
    ax1.annotate('', xy=(1.7, 0), xytext=(1.3, 0),
                arrowprops=dict(arrowstyle='<-', color='white', lw=2))

    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_title('Z-pinch: μžκΈ°μ••μ΄ ν”ŒλΌμ¦ˆλ§ˆ μ••μΆ•')
    ax1.set_aspect('equal')
    ax1.set_xlim(-2, 2)
    ax1.set_ylim(-2, 2)

    # (2) 자기 μž₯λ ₯ (휜 자기λ ₯μ„ )
    ax2 = axes[1]

    # 휜 자기λ ₯μ„ 
    x = np.linspace(-2, 2, 100)
    y_lines = [0.3 * np.sin(np.pi * x / 2),
              0.6 * np.sin(np.pi * x / 2),
              0.9 * np.sin(np.pi * x / 2)]

    for y in y_lines:
        ax2.plot(x, y, 'b-', linewidth=2)

    # μž₯λ ₯ λ°©ν–₯ (곑λ₯  쀑심 λ°©ν–₯ = μ•„λž˜)
    x_arrows = [-1, 0, 1]
    for xa in x_arrows:
        idx = np.argmin(np.abs(x - xa))
        y_arrow = 0.6 * np.sin(np.pi * xa / 2)
        # 곑λ₯ μ΄ μ–‘μˆ˜λ©΄ μž₯λ ₯은 μ•„λž˜
        tension_dir = -1 if xa == 0 else (-0.5 if xa > 0 else 0.5)
        ax2.annotate('', xy=(xa, y_arrow + tension_dir * 0.3),
                    xytext=(xa, y_arrow),
                    arrowprops=dict(arrowstyle='->', color='red', lw=2))

    ax2.set_xlabel('x')
    ax2.set_ylabel('y')
    ax2.set_title('자기 μž₯λ ₯: 휜 자기λ ₯선을 νŽ΄λŠ” 힘')
    ax2.set_aspect('equal')
    ax2.set_xlim(-2.5, 2.5)
    ax2.set_ylim(-1.5, 1.5)
    ax2.grid(True, alpha=0.3)

    # λ²”λ‘€
    ax2.plot([], [], 'b-', linewidth=2, label='자기λ ₯μ„ ')
    ax2.plot([], [], 'r-', linewidth=2, label='μž₯λ ₯ λ°©ν–₯')
    ax2.legend()

    # (3) ν‰ν˜• μ˜ˆμ‹œ
    ax3 = axes[2]

    info_text = """
MHD ν‰ν˜• 쑰건:

정적 ν‰ν˜•μ—μ„œ:
βˆ‡p = JΓ—B = (BΒ·βˆ‡)B/ΞΌβ‚€ - βˆ‡(BΒ²/2ΞΌβ‚€)

μž¬λ°°μ—΄:
βˆ‡(p + BΒ²/2ΞΌβ‚€) = (BΒ·βˆ‡)B/ΞΌβ‚€
    ↑               ↑
 총 μ••λ ₯        자기 μž₯λ ₯

μ‘μš© μ˜ˆμ‹œ:

1. ΞΈ-pinch:
   - Bz 만 쑴재 (직선)
   - μž₯λ ₯ μ—†μŒ, μ••λ ₯ ν‰ν˜•
   - βˆ‚/βˆ‚z(p + BΒ²/2ΞΌβ‚€) = 0

2. Z-pinch:
   - BΞΈ 만 쑴재 (μ›ν˜•)
   - μ••λ ₯ + μž₯λ ₯이 μ—΄μ••κ³Ό κ· ν˜•
   - (1/r)βˆ‚/βˆ‚r[r(p + BΒ²/2ΞΌβ‚€)] = BΞΈΒ²/ΞΌβ‚€r

3. 슀크λ₯˜ ν•€μΉ˜:
   - Bz + BΞΈ μ‘°ν•©
   - λ³΅μž‘ν•œ ν‰ν˜• 쑰건
   - ν† μΉ΄λ§‰μ˜ κΈ°λ³Έ ν˜•νƒœ
    """
    ax3.text(0.05, 0.95, info_text, transform=ax3.transAxes,
            fontsize=10, verticalalignment='top', fontfamily='monospace',
            bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
    ax3.axis('off')

    plt.tight_layout()
    plt.savefig('magnetic_pressure_tension.png', dpi=150, bbox_inches='tight')
    plt.show()

# magnetic_pressure_tension()

7. Frozen-in 정리

7.1 자기μž₯ 동결 쑰건

자기λ ₯μ„  동결 (Frozen-in Theorem):

이상 MHDμ—μ„œ:
E + vΓ—B = 0  (무저항)

μœ λ„ 방정식:
βˆ‚B/βˆ‚t = βˆ‡Γ—(vΓ—B)

물리적 의미:
1. 자기λ ₯선은 유체 μš”μ†Œμ™€ ν•¨κ»˜ μ›€μ§μž„
2. 자기λ ₯선에 "ν‘œμ§€"λ₯Ό ν•˜λ©΄ μœ μ²΄μ™€ ν•¨κ»˜ 이동
3. 두 유체 μš”μ†Œκ°€ 같은 자기λ ₯μ„  μœ„μ— 있으면
   μ˜μ›νžˆ 같은 자기λ ₯μ„  μœ„μ— 있음

자기 ν”ŒλŸ­μŠ€ 보쑴:
d/dt ∫∫ BΒ·dS = 0  (μ›€μ§μ΄λŠ” 면에 λŒ€ν•΄)

μœ„λ°˜ 쑰건 (μ €ν•­μ„± MHD):
E + vΓ—B = Ξ·J

μœ λ„ 방정식:
βˆ‚B/βˆ‚t = βˆ‡Γ—(vΓ—B) + Ξ·/ΞΌβ‚€ βˆ‡Β²B
                      ↑
                  자기 ν™•μ‚°

자기 Reynolds 수:
Rm = ΞΌβ‚€vL/Ξ·

Rm >> 1: 동결 쑰건 성립 (λŒ€λΆ€λΆ„μ˜ 천체 ν”ŒλΌμ¦ˆλ§ˆ)
Rm ~ 1: ν™•μ‚°κ³Ό λŒ€λ₯˜ 경쟁
Rm << 1: ν™•μ‚° μ§€λ°°
def frozen_in_theorem():
    """Frozen-in 정리 μ‹œκ°ν™”"""

    fig, axes = plt.subplots(2, 2, figsize=(12, 10))

    # (1) 이상 MHD: 자기λ ₯선이 μœ μ²΄μ™€ ν•¨κ»˜ 이동
    ax1 = axes[0, 0]

    # 초기 κ²©μžμ™€ 자기λ ₯μ„ 
    x = np.linspace(0, 2, 6)
    y = np.linspace(0, 1, 6)

    # 초기 μƒνƒœ
    for xi in x:
        ax1.plot([xi, xi], [0, 1], 'b-', linewidth=1, alpha=0.5)
    for yi in y:
        ax1.plot([0, 2], [yi, yi], 'b-', linewidth=1, alpha=0.5)

    # λ³€ν˜• ν›„ (전단 μœ λ™)
    # v = (y, 0) -> x' = x + t*y
    t = 0.5
    for yi in y:
        x_new = x + t * yi
        ax1.plot(x_new, np.full_like(x_new, yi), 'r--', linewidth=1, alpha=0.7)

    for xi in x:
        y_line = np.linspace(0, 1, 20)
        x_line = xi + t * y_line
        ax1.plot(x_line, y_line, 'r--', linewidth=1, alpha=0.7)

    ax1.plot([], [], 'b-', linewidth=2, label='초기 (자기λ ₯μ„ )')
    ax1.plot([], [], 'r--', linewidth=2, label='λ³€ν˜• ν›„')
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_title('이상 MHD: 자기λ ₯선이 μœ μ²΄μ™€ 동결')
    ax1.legend()
    ax1.set_aspect('equal')
    ax1.grid(True, alpha=0.3)

    # (2) 자기 ν”ŒλŸ­μŠ€ 보쑴
    ax2 = axes[0, 1]

    theta = np.linspace(0, 2*np.pi, 100)

    # 초기 μ›ν˜• 루프
    r0 = 1
    x0 = r0 * np.cos(theta)
    y0 = r0 * np.sin(theta)
    ax2.plot(x0, y0, 'b-', linewidth=2, label='초기 루프')
    ax2.fill(x0, y0, alpha=0.2, color='blue')

    # λ³€ν˜•λœ 루프 (μ••μΆ•)
    rx, ry = 0.5, 2.0  # μ••μΆ•/μ—°μ‹ 
    x1 = rx * np.cos(theta)
    y1 = ry * np.sin(theta)
    ax2.plot(x1, y1, 'r-', linewidth=2, label='λ³€ν˜•λœ 루프')
    ax2.fill(x1, y1, alpha=0.2, color='red')

    # 면적 비ꡐ
    A0 = np.pi * r0**2
    A1 = np.pi * rx * ry

    ax2.text(0, 0, f'Φ = ∫B·dA\n보쑴!', ha='center', va='center', fontsize=11)
    ax2.text(1.5, 0, f'Aβ‚€ = {A0:.2f}', fontsize=10)
    ax2.text(0.3, 1.5, f'A₁ = {A1:.2f}', fontsize=10)

    ax2.set_xlabel('x')
    ax2.set_ylabel('y')
    ax2.set_title('자기 ν”ŒλŸ­μŠ€ 보쑴')
    ax2.legend()
    ax2.set_aspect('equal')
    ax2.set_xlim(-2.5, 2.5)
    ax2.set_ylim(-2.5, 2.5)
    ax2.grid(True, alpha=0.3)

    # (3) 자기 Reynolds 수
    ax3 = axes[1, 0]

    # λ‹€μ–‘ν•œ ν™˜κ²½μ˜ Rm
    environments = {
        'μ‹€ν—˜μ‹€\nν”ŒλΌμ¦ˆλ§ˆ': 1e2,
        'νƒœμ–‘\n광ꡬ': 1e6,
        'νƒœμ–‘\nμ½”λ‘œλ‚˜': 1e12,
        'μ„±κ°„\n맀질': 1e18,
        '앑체\nκΈˆμ†': 1e1
    }

    names = list(environments.keys())
    Rm_values = list(environments.values())

    y_pos = np.arange(len(names))
    colors = ['red' if Rm < 100 else 'green' for Rm in Rm_values]

    ax3.barh(y_pos, np.log10(Rm_values), color=colors)
    ax3.axvline(x=np.log10(100), color='black', linestyle='--', label=r'$R_m = 100$')

    ax3.set_yticks(y_pos)
    ax3.set_yticklabels(names)
    ax3.set_xlabel(r'log₁₀($R_m$)')
    ax3.set_title('자기 Reynolds 수 비ꡐ')
    ax3.grid(True, alpha=0.3)

    # λ²”λ‘€
    ax3.plot([], [], 'g-', linewidth=10, label='동결 쑰건 성립')
    ax3.plot([], [], 'r-', linewidth=10, label='ν™•μ‚° 효과 μ€‘μš”')
    ax3.legend()

    # (4) κ°œλ… 정리
    ax4 = axes[1, 1]

    info_text = """
Frozen-in 정리 μš”μ•½:

쑰건: 이상 MHD (Ξ· = 0, E + vΓ—B = 0)

κ²°κ³Ό:
1. βˆ‚B/βˆ‚t = βˆ‡Γ—(vΓ—B)
2. d/dt ∫∫ BΒ·dS = 0 (이동 λ©΄)
3. 자기λ ₯선은 μœ μ²΄μ™€ ν•¨κ»˜ 이동

물리적 해석:
- 자기λ ₯선에 "동결"된 유체 μš”μ†Œ
- 자기μž₯ μ••μΆ• ↔ 밀도 증가
- B/ρ ∝ μƒμˆ˜ (1D μ••μΆ•)

μœ„λ°˜ μ‹œ (Ξ· β‰  0):
- 자기μž₯ ν™•μ‚°: Ο„_diff = ΞΌβ‚€LΒ²/Ξ·
- 자기 μž¬κ²°ν•© κ°€λŠ₯
- μ—λ„ˆμ§€ λ³€ν™˜ (자기 β†’ μš΄λ™/μ—΄)

μ€‘μš”μ„±:
- νƒœμ–‘ ν”Œλ ˆμ–΄: μž¬κ²°ν•©
- 토카막: 동결 쑰건 μ€‘μš”
- 자기ꢌ: μž¬κ²°ν•© ν˜„μƒ
    """
    ax4.text(0.05, 0.95, info_text, transform=ax4.transAxes,
            fontsize=10, verticalalignment='top', fontfamily='monospace',
            bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
    ax4.axis('off')

    plt.tight_layout()
    plt.savefig('frozen_in_theorem.png', dpi=150, bbox_inches='tight')
    plt.show()

# frozen_in_theorem()

8. μ—°μŠ΅ 문제

μ—°μŠ΅ 1: Alfven 속도

νƒœμ–‘ μ½”λ‘œλ‚˜μ—μ„œ B = 10 G, n = 10^8 cm^-3 일 λ•Œ Alfven 속도λ₯Ό κ³„μ‚°ν•˜μ‹œμ˜€. 이것을 μŒμ†(T = 10^6 K)κ³Ό λΉ„κ΅ν•˜κ³  ν”ŒλΌμ¦ˆλ§ˆ 베타λ₯Ό κ΅¬ν•˜μ‹œμ˜€.

μ—°μŠ΅ 2: MHD νŒŒλ™ 속도

vA = 2cs 인 경우, 자기μž₯에 μˆ˜μ§ν•œ λ°©ν–₯(ΞΈ = 90Β°)으둜 μ „νŒŒν•˜λŠ” λΉ λ₯Έ 자기음파의 μœ„μƒ 속도λ₯Ό κ΅¬ν•˜μ‹œμ˜€.

μ—°μŠ΅ 3: μžκΈ°μ•• ν‰ν˜•

κ· μΌν•œ 자기μž₯ Bz μ˜μ—­κ³Ό 무자기μž₯ μ˜μ—­ μ‚¬μ΄μ˜ κ²½κ³„μ—μ„œ μ••λ ₯ ν‰ν˜• 쑰건을 κ΅¬ν•˜μ‹œμ˜€.

μ—°μŠ΅ 4: Frozen-in

길이 L = 1 Mm, 전도도 Οƒ = 10^6 S/m인 ν”ŒλΌμ¦ˆλ§ˆμ—μ„œ 자기 ν™•μ‚° μ‹œκ°„μ„ κ³„μ‚°ν•˜μ‹œμ˜€. 속도 v = 100 km/s일 λ•Œ 자기 Reynolds μˆ˜λŠ”?


9. 참고자료

핡심 ꡐ재

  • Goedbloed & Poedts, "Principles of Magnetohydrodynamics"
  • Kulsrud, "Plasma Physics for Astrophysics"
  • Freidberg, "Ideal MHD"

λ…Όλ¬Έ/리뷰

  • AlfvΓ©n (1942) 원논문 (MHD νŒŒλ™)
  • Priest & Forbes, "Magnetic Reconnection" (μž¬κ²°ν•©)

온라인 자료

  • Thorne & Blandford, "Modern Classical Physics" (Ch. 19)
  • Chen, "Introduction to Plasma Physics" (MHD μž₯)

μš”μ•½

MHD 기초 핡심:

1. MHD κ°€μ •:
   - 쀀쀑성, μ €μ£ΌνŒŒ, 유체 근사
   - L >> Ξ»D, c/Ο‰pi
   - Maxwell λ‹¨μˆœν™”

2. 이상 MHD 방정식:
   - 연속: βˆ‚Ο/βˆ‚t + βˆ‡Β·(ρv) = 0
   - μš΄λ™λŸ‰: ρDv/Dt = -βˆ‡p + JΓ—B
   - μ—λ„ˆμ§€: D(p/ρ^Ξ³)/Dt = 0
   - μœ λ„: βˆ‚B/βˆ‚t = βˆ‡Γ—(vΓ—B)
   - μ œμ•½: βˆ‡Β·B = 0

3. μ£Όμš” 속도:
   - Alfven: vA = B/√(μ₀ρ)
   - μŒμ†: cs = √(Ξ³p/ρ)
   - ν”ŒλΌμ¦ˆλ§ˆ 베타: Ξ² = 2ΞΌβ‚€p/BΒ²

4. MHD νŒŒλ™:
   - Alfven 파: vA (자기μž₯ λ°©ν–₯)
   - λΉ λ₯Έ 자기음파: √(vAΒ² + csΒ²) (수직)
   - 느린 자기음파: min(vA, cs) (평행)

5. Lorentz 힘:
   JΓ—B = -βˆ‡(BΒ²/2ΞΌβ‚€) + (BΒ·βˆ‡)B/ΞΌβ‚€
          μžκΈ°μ••        자기μž₯λ ₯

6. Frozen-in:
   - 이상 MHD: E + vΓ—B = 0
   - 자기λ ₯선이 μœ μ²΄μ™€ 동결
   - Rm >> 1 일 λ•Œ 유효

λ‹€μŒ λ ˆμŠ¨μ—μ„œλŠ” MHD λ°©μ •μ‹μ˜ μˆ˜μΉ˜ν•΄λ²•μ„ λ‹€λ£Ήλ‹ˆλ‹€.

to navigate between lessons