마하 5 이상의 극초음속으로 비행하는 스크램제트(Supersonic Combustion Ramjet) 엔진은 회전하는 기계적 압축기 터빈 없이 다단 경사 충격파(Oblique Shock Wave)를 통해 유입 공기를 급격히 감속·압축합니다. 초음속 유동이 연소실을 통과하는 밀리초($\sim 1\text{ms}$) 미만의 극히 짧은 체류 시간 동안 충격파 뒤의 압력, 정체 엔탈피 및 수소 연료 혼합을 정밀 제어하고, 치명적인 흡입구 불시 시동(Inlet Unstart)을 방지하는 1,000Hz 0-Alloc C# 기체역학 제어 엔진을 공개합니다.

1. 2022 개정 교육과정 교과 연계 분석

  • 물리학 (압축성 유체역학, 충격파 점프 조건 및 에너지 보존 법칙): 랭킨-위고니오(Rankine-Hugoniot) 충격파 관계식, 유향각($\theta$)-충격파각($\beta$)-마하수($M$) 비선형 방정식, 충격파 전후 전압력(Total Pressure) 손실 및 엔트로피 증가.
  • 화학 (초음속 난류 수소-공기 반응 동역학 및 아레니우스 점화 지연): 마하 2 이상의 초음속 기류 내 수소($H_2$) 분사 제트 침투, 분자 혼합 및 연소실 체류 시간($\tau_{res} \approx 1\text{ms}$) 대비 아레니우스 점화 지연 시간($\tau_{ign}$) 화학평형 분석.
  • 수학 (비선형 초월방정식 근사 해석 및 삼각함수 근치 해석): $\theta$-$\beta$-$M$ 관계식 $\tan\theta = 2 \cot\beta \frac{M_1^2 \sin^2\beta - 1}{M_1^2 (\gamma + \cos 2\beta) + 2}$에 대한 뉴턴-랩슨(Newton-Raphson) 0-Alloc 실시간 수치 역산.
  • 정보 (초저지연 1,000Hz 0-Alloc 충격파 안정성 및 흡입구 능동 블리드 제어 코어): 흡입구 압력 센서 데이터를 1ms 내에 스택 메모리(`ref struct`)로 실시간 처리하여 언스타트 임계 마하수를 회피하고 가변 지오메트리 램프를 서보 제어하는 아키텍처.

2. 다단 경사 충격파 및 초음속 연소실 수학적 모델

유입 마하수 $M_1$의 기류가 쐐기각 $\theta$를 만났을 때 형성되는 경사 충격파 각도 $\beta$는 다음 관계식을 만족합니다:

$$\tan\theta = 2 \cot\beta \left[ \frac{M_1^2 \sin^2\beta - 1}{M_1^2 (\gamma + \cos 2\beta) + 2} \right]$$

경사 충격파를 통과한 후의 마하수 수직 성분 $M_{n2}$ 및 충격파 후류 마하수 $M_2$는 다음과 같습니다:

$$M_{n1} = M_1 \sin\beta, \quad M_{n2}^2 = \frac{2 + (\gamma - 1) M_{n1}^2}{2\gamma M_{n1}^2 - (\gamma - 1)}, \quad M_2 = \frac{M_{n2}}{\sin(\beta - \theta)}$$

충격파 전후 정압비 $\frac{P_2}{P_1}$ 및 전압력비 $\frac{P_{02}}{P_{01}}$ (압력 회복률)는 다음과 같이 정량화됩니다:

$$\frac{P_2}{P_1} = 1 + \frac{2\gamma}{\gamma + 1} (M_{n1}^2 - 1), \quad \frac{P_{02}}{P_{01}} = \left( \frac{\gamma + 1}{2\gamma M_{n1}^2 - (\gamma - 1)} \right)^{\frac{1}{\gamma - 1}} \left( \frac{(\gamma + 1) M_{n1}^2}{(\gamma - 1) M_{n1}^2 + 2} \right)^{\frac{\gamma}{\gamma - 1}}$$

다단 램프에서 압축된 공기가 연소실에 진입할 때 $M_{comb} \approx 2.5 \sim 3.0$을 유지해야 열 질식(Thermal Choking) 없이 안정한 초음속 연소가 지속됩니다.

3. 1,000Hz 0-Alloc C# 스크램제트 충격파 수치해석 엔진

아래는 1ms 주기 비행 제어 컴퓨터에서 힙 메모리 할당 없이 $\theta$-$\beta$-$M$ 관계식을 뉴턴-랩슨으로 풀고, 압력 회복률과 언스타트 마진을 계산하는 C# 엔진입니다.

ScramjetInletEngine.cs (Zero-Allocation C# Shock Core)
using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.Hypersonics;

public readonly ref struct ScramjetInletState
{
    public readonly double ShockAngleBetaRad;
    public readonly double DownstreamMach;
    public readonly double StaticPressureRatio;
    public readonly double TotalPressureRecovery;
    public readonly bool IsUnstartRisk;

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ScramjetInletState(double beta, double m2, double pRatio, double ptRecovery, bool unstart)
    {
        ShockAngleBetaRad = beta;
        DownstreamMach = m2;
        StaticPressureRatio = pRatio;
        TotalPressureRecovery = ptRecovery;
        IsUnstartRisk = unstart;
    }
}

public ref struct ScramjetInletController
{
    private const double Gamma = 1.4;
    private double _currentRampAngleRad;

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ScramjetInletController(double initialRampDeg = 12.0)
    {
        _currentRampAngleRad = initialRampDeg * (Math.PI / 180.0);
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public ScramjetInletState Evaluate(double flightMach, double ambientPressurePa)
    {
        if (flightMach < 1.5)
            throw new ArgumentException("Flight Mach must be supersonic (M > 1.5).");

        double theta = _currentRampAngleRad;
        double beta = SolveBetaNewtonRaphson(flightMach, theta);

        double sinBeta = Math.Sin(beta);
        double mn1 = flightMach * sinBeta;
        double mn1Sq = mn1 * mn1;

        // 랭킨-위고니오 정압비
        double pRatio = 1.0 + (2.0 * Gamma / (Gamma + 1.0)) * (mn1Sq - 1.0);

        // 하류 수직 마하수 및 하류 마하수
        double mn2Sq = (2.0 + (Gamma - 1.0) * mn1Sq) / (2.0 * Gamma * mn1Sq - (Gamma - 1.0));
        double mn2 = Math.Sqrt(Math.Max(0.01, mn2Sq));
        double m2 = mn2 / Math.Sin(beta - theta);

        // 전압력 회복률 (Pt2 / Pt1)
        double term1 = Math.Pow((Gamma + 1.0) / (2.0 * Gamma * mn1Sq - (Gamma - 1.0)), 1.0 / (Gamma - 1.0));
        double term2 = Math.Pow(((Gamma + 1.0) * mn1Sq) / ((Gamma - 1.0) * mn1Sq + 2.0), Gamma / (Gamma - 1.0));
        double ptRecovery = term1 * term2;

        // 언스타트(Unstart) 위험성 판정: 연소실 유입 마하수가 아음속으로 떨어지거나 압력비가 지나치게 급증할 때
        bool unstart = m2 < 1.3 || ptRecovery < 0.45;

        // 가변 지오메트리 램프 능동 적응
        if (unstart && _currentRampAngleRad > 8.0 * (Math.PI / 180.0))
        {
            _currentRampAngleRad -= 0.001; // 램프 각도 감소 (충격파 완화)
        }
        else if (!unstart && m2 > 3.0 && _currentRampAngleRad < 18.0 * (Math.PI / 180.0))
        {
            _currentRampAngleRad += 0.0005; // 램프 각도 증대 (압축비 증강)
        }

        return new ScramjetInletState(beta, m2, pRatio, ptRecovery, unstart);
    }

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    private static double SolveBetaNewtonRaphson(double m, double theta)
    {
        // 초기 추정값 (약충격파 해)
        double beta = Math.Asin(1.0 / m) + theta * 1.1;
        double tanTheta = Math.Tan(theta);
        double mSq = m * m;

        for (int iter = 0; iter < 12; iter++)
        {
            double sinB = Math.Sin(beta);
            double cosB = Math.Cos(beta);
            double cotB = cosB / sinB;
            double cos2B = Math.Cos(2.0 * beta);

            double num = mSq * sinB * sinB - 1.0;
            double den = mSq * (Gamma + cos2B) + 2.0;

            double f = 2.0 * cotB * (num / den) - tanTheta;
            if (Math.Abs(f) < 1e-7) break;

            // 수치 미분 df/dbeta
            double dBeta = 1e-5;
            double sinB2 = Math.Sin(beta + dBeta);
            double cosB2 = Math.Cos(beta + dBeta);
            double cotB2 = cosB2 / sinB2;
            double cos2B2 = Math.Cos(2.0 * (beta + dBeta));
            double num2 = mSq * sinB2 * sinB2 - 1.0;
            double den2 = mSq * (Gamma + cos2B2) + 2.0;
            double f2 = 2.0 * cotB2 * (num2 / den2) - tanTheta;
            double df = (f2 - f) / dBeta;

            if (Math.Abs(df) > 1e-9)
            {
                beta -= f / df;
            }
        }
        return beta;
    }
}

4. 교육 및 국방 유무인복합(MUM-T) 응용 가이드

  • 국방부 AI 교과서 & 극초음속 무기체계 연구단: 마하 5~7급 극초음속 활공비행체(HGV) 및 순항미사일(HCM)의 흡입구 경사 충격파 거동과 열 질식(Thermal Choke) 예방 알고리즘 교육 교구.
  • 방통대 우호성 교수 랩실: 2022 개정 물리학Ⅱ 유체역학 단원 및 수학 미적분 비선형 뉴턴-랩슨 역산 단원을 융합한 항공우주 특화 교육 시뮬레이션.
  • 한국항공우주연구원(KARI) 및 방산 실무진: 풍동 시험 데이터와 실시간 연계 가능한 1,000Hz 0-Alloc 스택 온디바이스 압력 회복 모니터링 엔진 활용.