본문 바로가기
현장과 프로젝트/pyroCEA

NASA CEA 기반 Python 열화학 계산 프레임워크

by 도서관경비원 2026. 6. 5.
반응형

1. 프로젝트 개요

본 프로젝트는 스페인 카를로스 3세 대학교(Universidad Carlos III de Madrid)의 Alberto Cuadra, César Huete, Marcos Vera가 개발한 오픈소스 열화학 코드인 CombustionToolbox(CT)의 고체 로켓 모터(SRM) 관련 핵심 기능을 순수 Python으로 재구현하는 것을 목표로 한다. 프로젝트명은 PyroCEA로, 그리스어 πῦρ(불, 연소)와 NASA CEA를 결합한 이름이며 Python의 Py와도 연결된다. 

 

CombustionToolbox는 기체 및 응축상 화학종을 포함한 화학 평형 문제를 풀기 위해 설계된 MATLAB 기반 열화학 프레임워크로, 각각의 문제 유형을 해결하는 여러 모듈로 구성되어 있다. 원본은 MATLAB 환경에 종속되어 있어 라이선스 비용이 발생하므로, 이를 무료로 사용 가능한 Python 환경으로 이전하는 것이 본 프로젝트의 핵심 동기이다.


2. 원본 코드(CombustionToolbox) 분석

2.1 원본의 전체 구조

CombustionToolbox는 NASA의 CEA(Chemical Equilibrium with Applications) 코드의 수학적 프레임워크를 기반으로 처음부터 새로 작성된 객체지향 열화학 코드이다. 기체 화학종의 열역학 특성은 이상기체 상태방정식과 NASA 9계수 다항식(NASA9)으로 모델링되며, Third Millennium 데이터베이스와 Active Thermochemical Tables(ATcT)의 최신 데이터를 사용한다.

 

원본의 폴더 구조는 +combustiontoolbox 폴더 아래에 CT-EQUIL(+equilibrium), CT-SD(+shockdetonation), CT-ROCKET(+rocket) 등의 네임스페이스로 모듈이 구분되어 있다.

 

원본은 MATLAB의 특성상 함수 하나가 파일 하나(.m)에 대응되므로 파일 수가 수백 개에 달한다. Python은 하나의 파일에 여러 함수를 담을 수 있으므로, 본 프로젝트에서는 이를 4개의 .py 파일로 압축 구현한다.

 

2.2 원본의 모듈 구성

CT는 객체지향 아키텍처로 작성되었으며 세 가지 주요 모듈로 구성된다. CT-EQUIL은 정규 열화학 변환을 거치는 다성분 기체 혼합물의 최종 평형 조건을 추정하고, CT-SD는 다양한 유동 조건에서 충격파와 폭굉 문제를 계산하며, CT-ROCKET은 이상적 조건에서의 로켓 엔진 이론 성능을 추정한다.

 

본 프로젝트에서는 고체 로켓 모터에 필요한 CT-EQUIL과 CT-ROCKET만 구현하며, CT-SD는 제외한다.

 

2.3 원본의 수학적 핵심 알고리즘

핵심 모듈인 CT-EQUIL은 두 가지 상태 함수(예: 엔탈피와 압력)로 혼합물 특성을 정의하는 조건 하에, 라그랑주 승수법과 다차원 뉴턴-랩슨 방법을 결합하여 Gibbs/Helmholtz 자유에너지를 최소화한다.

 

온도가 외부에서 주어지지 않을 때는 Steffensen-Aitken 근 탐색 알고리즘 기반 루틴을 별도로 사용하여 평형 온도를 찾는다.

 

로켓 엔진 성능 모듈은 반복 절차에 의존하고, 모든 계산은 이상기체 근사를 기반으로 한다.

 

2.4 원본의 열역학 데이터베이스

화학 평형 최소화 문제를 풀기 위해서는 주어진 온도에서 관련된 모든 화학종의 열역학 특성을 평가해야 한다. 이를 위해 NIST-JANAF 표, NASA 다항식, 그리고 보다 최근의 Third Millennium(Burcat) 데이터베이스가 사용된다. ATcT는 개별 반응 기반의 전통적 데이터셋 대신 완전한 열화학 네트워크(TN)를 사용하여 더 정확한 결과를 제공한다.

 

본 프로젝트에서는 이 데이터를 JSON 형식으로 저장하여 사용한다. 전체 1,900여 종을 유지하는 이유는 APCP 외에도 다양한 추진제(KNSB, KNDX, KNSU 등)를 지원하기 위함이며, 추진제마다 연소 생성물의 원소 조성이 다르기 때문이다.

 

2.5 원본의 GUI 구조 및 사용 흐름

원본 GUI는 단순한 껍데기가 아니라 프로젝트의 핵심 진입점이다. 모든 모듈은 사용자 친화적인 GUI에 내장되어 있으며, GUI를 통해 수행되는 주요 계산은 순수 코드에 대한 콜백으로 처리된다. 따라서 코드에 가해지는 변경 사항이 GUI에 즉시 반영된다.

 

원본 GUI의 사용 흐름은 다음과 같다:

① 문제 유형 선택
   (HP, TP, ROCKET_IAC, ROCKET_FAC 등)
        ↓
② 반응물(Reactants) 입력
   - 화학종 선택 (드롭다운)
   - 질량분율 또는 몰분율 입력
        ↓
③ 조건 입력
   - 연소실 압력 (Pc)
   - 온도 또는 엔탈피
        ↓
④ 계산 버튼 클릭
        ↓
⑤ 결과 출력
   - 생성물 조성
   - Isp, c*, Cf, Tc 등
   - 그래프

 

원본은 Windows, macOS, Linux를 지원하는 직관적인 GUI를 포함한 로열티 프리 독립 실행형 버전도 제공한다. PyroCEA도 동일하게 세 플랫폼을 지원하는 것을 목표로 한다.


3. PyroCEA 설계

3.1 설계 원칙

GUI가 진입점이 되는 구조로 설계한다. 사용자는 코드를 전혀 몰라도 GUI만으로 모든 작업을 수행할 수 있어야 하며, 계산 모듈과 GUI는 명확히 분리되어 각각 독립적으로 수정 가능해야 한다. 또한 이후 Pyro 시리즈(PyroMotor 등)와의 연동을 고려하여 공유 가능한 함수는 범용적으로 설계한다.

GUI (gui.py)                ← 진입점, 사용자 인터페이스
    ↓ 콜백으로 호출
계산 모듈
  ├── thermo.py             ← 공유 열역학 함수
  ├── equil.py              ← Gibbs 최소화 (CT-EQUIL)
  └── rocket.py             ← 노즐 성능 계산 (CT-ROCKET)
    ↓
결과 → 다시 GUI에 표시

3.2 최종 파일 구조

PyroCEA/
├── data/
│   └── thermo.json         # NASA 전체 열역학 DB (1,900종)
|   └── parse_nasa.py
│
├── thermo.py               # 공유 열역학 함수 (h, s, g, cp)
├── equil.py                # CT-EQUIL: Gibbs 최소화
├── rocket.py               # CT-ROCKET: 노즐 성능 계산
└── gui.py                  # 진입점 + GUI (원본 참고)

 

gui.py가 진입점 역할을 겸하며, MATLAB 수백 개 파일을 Python 4개 파일로 압축한다. 공유 함수를 thermo.py에 집중시키고 각 모듈이 import하는 구조로 중복을 제거한다.

 

3.3 모듈별 역할

thermo.py — 모든 모듈이 공유하는 열역학 함수들을 담는다. NASA 9계수 다항식을 이용한 엔탈피 h(T), 엔트로피 s(T), 깁스 자유에너지 g(T), 정압비열 cp(T) 계산 함수가 여기에 위치하며, JSON 데이터베이스 로딩 기능도 포함한다. equil.py와 rocket.py 모두 이 모듈을 import하여 사용하며, 향후 PyroMotor에서도 재사용 가능하도록 범용적으로 설계한다.

 

equil.py — CT-EQUIL에 해당하는 핵심 모듈로, 라그랑주 승수법과 뉴턴-랩슨 반복법을 이용한 Gibbs 자유에너지 최소화를 구현한다. 등엔탈피-등압(HP) 조건이 고체 로켓 연소실 계산의 기본이다. GUI에서 반응물과 조건을 입력받아 평형 조성과 연소 온도를 계산하여 반환한다.

 

rocket.py — CT-ROCKET에 해당하며, 연소실 조건에서 출발해 목(throat) 및 노즐 출구까지 등엔트로피 팽창을 반복 계산하여 Isp, c*, Cf 등의 성능 파라미터를 산출한다. GUI의 계산 버튼 클릭 시 equil.py의 결과를 입력받아 최종 성능을 계산한다.

 

gui.py — 원본 MATLAB GUI를 참고하여 구현하는 진입점이자 사용자 인터페이스이다. 문제 유형 선택, 반응물 입력, 조건 입력, 결과 표시, 그래프 출력 등 모든 사용자 상호작용을 담당한다. 구체적인 GUI 라이브러리(PyQt 또는 tkinter)는 원본 분석 후 결정한다.


4. 디자인 가이드

4.1 컬러 팔레트

장시간 사용하는 과학/공학 도구의 특성상 눈의 피로도를 최소화하는 뮤트 틸/그린 계열을 채택한다. 

용도 색상명 색상코드
메인 뮤트 틸 #0F6E56
포인트 포레스트 그린 #3B6D11
다크 배경 다크 그린 #1A2A24
라이트 배경 민트 화이트 #F2F8F5



4.2 폰트

설치 없이 윈도우에서 바로 사용 가능한 기본 내장 폰트를 채택한다.

용도 폰트 적용 대상
UI 폰트 Segoe UI 버튼, 레이블, 메뉴, 본문
수치 폰트 Consolas 결과값, 숫자, 화학식

 


5. 기술 스택

항목 내용
언어 Python
수치계산 NumPy, SciPy
GUI PyQt 또는 tkinter (원본 분석 후 결정)
DB 형식 JSON
단위계 SI 고정 (Pa, K, J/mol)
라이선스 GPLv3 (원본과 동일)
플랫폼 Windows, macOS, Linux

6. 개발 단계

1단계: 원본 GUI 구조 분석 (최우선)

CombustionToolbox GitHub 저장소를 클론하여 GUI 구조를 가장 먼저 파악한다. 문제 유형 선택 방식, 반응물 입력 방식, 결과 표시 방식, 그래프 출력 방식을 상세히 분석한다. 이를 바탕으로 PyroCEA의 GUI 설계를 확정한다.

 

2단계: 원본 계산 모듈 분석

.m 파일 전체의 의존관계를 파악한다. 특히 여러 모듈에서 공유되는 함수를 식별하여 thermo.py에 통합할 대상을 결정한다. 오류 처리 방식과 수렴 조건도 이 단계에서 파악한다.

 

3단계: 데이터 준비

NASA 9계수 열역학 데이터베이스를 파싱하여 thermo.json을 생성한다. 전체 1,900여 종을 유지하되, 런타임에는 해당 추진제와 관련된 화학종만 메모리에 로드하는 방식을 채택한다.

 

4단계: 계산 모듈 구현

thermo.pyequil.pyrocket.py 순서로 구현한다. MATLAB의 1-based 인덱싱을 Python의 0-based로 전환할 때 발생하는 오류에 특히 주의한다.

 

5단계: GUI 구현 및 연결

1단계에서 확정한 GUI 설계를 바탕으로 gui.py를 구현한다. 디자인 가이드(컬러, 폰트, 다크/라이트 모드)를 적용하고, 계산 모듈을 콜백으로 연결하여 GUI에서의 입력이 즉시 계산에 반영되도록 한다.

 

6단계: 검증

APCP(AP 68%, Al 18%, HTPB 14%) 기준으로 원본 CombustionToolbox 결과와 비교하여 검증한다.


7. 주요 고려사항

  • GUI 우선: 원본 GUI 구조 분석이 개발의 출발점
  • 인덱싱 차이: MATLAB 1-based → Python 0-based 전환 시 off-by-one 오류 주의
  • 공유 함수 집중: 원본에서 여러 모듈이 공유하는 함수는 모두 thermo.py에 통합
  • 전체 DB 유지: APCP 외 다양한 추진제 지원을 위해 1,900종 전체 유지
  • 수렴 안정성: CT-EQUIL의 Newton-Raphson 초기값 설정이 가장 까다로운 부분
  • 나머지 세부 결정: 원본 코드 분석 후 결정
반응형