ツール紹介・仕事術

pythonで簡単にロケットエンジンの性能計算:RocketCEAの使い方 (Windows編)

使い方

関数名がCEAと若干ことなるため、代表的なものを紹介します。全関数一覧は公式サイトにあります。

https://rocketcea.readthedocs.io/en/latest/functions.html

SI単位で使う

デフォルトではポンドフィート法のため、SI単位で使うためにはcea_obj_w_unitsクラスを召喚します。

from rocketcea.cea_obj_w_units import CEA_Obj

Ispの計算

試しにてget_Ispを召喚して計算をしてみます。

from rocketcea.cea_obj_w_units import CEA_Obj

#Pc:燃焼室圧、MR:酸燃比、eps:膨張比、frozen:凍結流、methaloxエンジンの記入例
ceares=CEA_Obj(oxName='LOX', fuelName='CH4', isp_units='sec', cstar_units='m/s', pressure_units='MPa', temperature_units='K', sonic_velocity_units='m/s', density_units='kg/m^3', specific_heat_units='kJ/kg-K')
ceares.get_Isp(Pc=100.0, MR=1.0, eps=40.0, frozen=0, frozenAtThroat=0)
283.9171122560276

記入条件に対するIspが得られました。

このように任意の環境条件、推進剤の組み合わせでインスタンスを作って、RocketCEAのメソッドを呼び出すことで様々な計算ができます。

便利なメソッド

とりあえずこれが使えると便利なやつをピックアップしてみました。

  • get_IvacCstrTc: 真空Isp、Cstar、Tcが得られる
  • estimate_Ambient_Isp:任意の大気圧に対するIspが得られる
  • get_MachNumber:ノズル出口マッハ数
  • get_Chamber_MolWt_gamma:燃焼室内ガスの比熱比γと分子量mwが得られる

returnされる値はtupleで出てくるので、次のように受け取ってあげるとそれぞれ独立したオブジェクトとして使用可能です。

#燃焼室、スロート、ノズル出口それぞれにおけるガスの音速
(Cc,Ct,Ce) = ceares.get_SonicVelocities(Pc=Pci, MR=MRi, eps=ERi, frozen=0, frozenAtThroat=0)

実行例

Starship一段目のRaptorエンジンの諸元を元に、おおよその推進剤流量とIspを見積もってみました。

O/Fはいろいろな推察がありますが、とりあえず3.6と仮定してみます。

古典ロケット推進方程式からスロート径と推進剤流量の関係を求めました。

推進剤流量とIspを元に公称推力が求まり、スロート径が計算可能になります。下記の諸元を仮定して計算してみます。

スロート径 At0.215m
Isp効率 Ispeff0.98
燃焼室圧 Pc33.0MPa
ノズル膨張比 ER34.0
大気圧 Pambient0.1MPa
海抜推力 Thrust SL2300kN
> python rocketthrustcalc.py
365.14431231080056 345.9433000188243 339.0244340184478 1827.5916645877057 3778.4995752114633 0.11409083051600499 686572.9115093056 686.6962376241687 2283601.9336004155

Isp効率0.98は考えがたいほどの高効率が、Ispvac 360sという公称値にかなり近い計算結果が得られました。

推進剤流量686 kg/s
推力2280kN
ノズル出口圧力0.114MPa
実在 Isp339s
理論 Isp vac365s

Isp効率98%というぶっ飛んだ値を入れてみましたが、計算結果からこれは決して非現実的な数値ではなく、公称Isp vacが正しく、c*効率99.9%であるという情報が本当だとすれば、Isp効率が97%に達している可能性を示しています。

参考の実行例は下記のコードです。是非パラメータをいじって遊んでみてください!後日正式版で機体の性能の推定 (Starship第二回)を行ってみようと思います。

import numpy as np
import sympy
from rocketcea.cea_obj_w_units import CEA_Obj
import matplotlib.pyplot as plt

#CEA Full Equilibrim combustion chamber==========================================
#Initial setting ================================================================
g0=9.809 #Gravity constant
At=0.215**2/4*np.pi #Throat dia in m2   

#Syntax: Comp Pressure, Expansion Ratio, Mixture Ratio, Ambient Pressure, Isp Efficiency, Expected Thrust (Can be any, for checking only)
def ceathrust(Pci,ERi,MRi,Pambient,Ispeff,Thrust):
    ceares=CEA_Obj(
        oxName='LOX',
        fuelName='CH4',
        isp_units='sec',
        cstar_units='m/s',
        pressure_units='MPa',
        temperature_units='K',
        sonic_velocity_units='m/s',
        density_units='kg/m^3',
        specific_heat_units='kJ/kg-K'
        )

    (Ispvac, Cstar, Tcomb) = ceares.get_IvacCstrTc(
        Pc=Pci, MR=MRi, eps=ERi,
        frozen=0, frozenAtThroat=0
        )
    (Ispamb, mode) = ceares.estimate_Ambient_Isp(
        Pc=Pci, MR=MRi, eps=ERi,
        Pamb=Pambient, frozen=0, frozenAtThroat=0
        )
    Mach = ceares.get_MachNumber(
        Pc=Pci, MR=MRi, eps=ERi,
        frozen=0, frozenAtThroat=0
        )
    (Cc,Ct,Ce) = ceares.get_SonicVelocities(
        Pc=Pci, MR=MRi, eps=ERi,
        frozen=0, frozenAtThroat=0
        )
    (mw,gam) = ceares.get_Chamber_MolWt_gamma(
        Pc=Pci, MR=MRi, eps=ERi
        )
    Pe = Pci/(ceares.get_PcOvPe(
        Pc=Pci, MR=MRi, eps=ERi,
        frozen=0, frozenAtThroat=0
        )
)
    
    Ve=Mach*Ce
    Ispact=Ispamb*Ispeff
    Veq=Ispamb*g0
    Mdot_req = Thrust*10**3/Veq/Ispeff
    Mdot_th = At*Pci*10**6/Tcomb**0.5*np.sqrt(gam/8.31*mw*10**-3)*((gam+1)/2)**(-(gam+1)/2/(gam-1)) #kg/s
    Thrust_th =Mdot_th*Veq*Ispeff
    print(Ispvac, Ispamb, Ispact, Cstar, Tcomb, Pe, Mdot_req, Mdot_th, Thrust_th)
    return(Ispact, Mdot_th, Thrust_th)



#For Debug and Initial At setting===============================================

Ispeff=0.98 #Isp efficiency
Pc=33.0 #Combustion chamber total pressure in MPa
ER=34.0 #Expansion Ratio
MR=3.6 # Mixture Ratio
Ae=At*ER
Pambient=0.1 #MPa
Thrust=2300 #kNs

#Obtain At size
Atarr = np.arange(0.2**2/4*np.pi,0.22**2/4*np.pi, 0.005**2/4*np.pi)
Mdotarr=[]
for Ats in Atarr:
    At = Ats
    (Isp, Mdot, Thrust) = ceathrust(Pc,ER,MR,Pambient,Ispeff,Thrust)
    Mdotarr=np.append(Mdotarr,Mdot)
    #print(Mdot)
plt.plot(Atarr,Mdotarr)
plt.xlabel('Throat Dia. At')
plt.ylabel('Mass flow rate Mdot')
plt.show()


#Check MR and Isp Relation
MRarr = np.arange(3.4, 3.9, 0.02)
Isparr=[]
for MRs in MRarr:
    (Isp, Mdot, Thrust) = ceathrust(Pc,ER,MRs,Pambient,Ispeff,Thrust)
    Isparr=np.append(Isparr,Isp)
plt.plot(MRarr,Isparr)
plt.plot([MR,MR],[Isp-5,Isp+5])
plt.xlabel('Mixture ratio MR')
plt.ylabel('Isp SL')
plt.show()

こちらにも同じサンプルコードを入れてあります。

https://github.com/Gertrud-Violett/SharedTools/blob/main/RocketCEA/demo.py

最後に

本日は以上です!KSP感覚で世の中の色々なロケットエンジンの性能を計算してみましょう!燃焼室圧やノズル膨張比がいかにIspに重要か実感できると思います。。。

参考・クレジット

https://www.teslarati.com/spacex-elon-musk-starship-raptor-test-stand-upgrades/

https://qiita.com/ina111/items/4e09711b9121db90dbaa

1 2
ABOUT ME
Trude (まきブロ管理人)
機械屋さん。多くの人に機械の面白さやエンジニアリングの楽しさを知ってもらうべく、解説や紹介記事を発信しています。
RELATED POST

POSTED COMMENT

  1. […] pythonで簡単にロケットエンジンの性能計算:RocketCEAの使い方 (Windows編)pythonを使ってロケットエンジンの性能計算や化学平衡計算ができるRocketCEAについて紹介。NASA CEAがpythonから呼び出し […]

  2. […] pythonで簡単にロケットエンジンの性能計算:RocketCEAの使い方 (Windows編)pythonを使ってロケットエンジンの性能計算や化学平衡計算ができるRocketCEAについて紹介。NASA CEAがpythonから呼び出し […]

  3. […] NASA CEAをPythonで使えるようにするプログラム。MinGWが必要で、それをWindows10にインストールするのに意外と引っかかったが、こちらのサイトがとても参考になりました。これと同じトラブルに悩み、これで解決。ありがとうございました。要は、MinGWのOnlineインストールを使っては駄目ということ。バイナリをダウンロードして、C:MinGWに展開。自分はCygwin派なので、MinGWにパスは通さなかったが、Anaconda環境でRocketCEAのインストールまで正常終了。 […]

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です