使い方
関数名が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を元に公称推力が求まり、スロート径が計算可能になります。下記の諸元を仮定して計算してみます。
スロート径 At | 0.215m |
Isp効率 Ispeff | 0.98 |
燃焼室圧 Pc | 33.0MPa |
ノズル膨張比 ER | 34.0 |
大気圧 Pambient | 0.1MPa |
海抜推力 Thrust SL | 2300kN |
> 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 |
実在 Isp | 339s |
理論 Isp vac | 365s |
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://qiita.com/ina111/items/4e09711b9121db90dbaa
[…] pythonで簡単にロケットエンジンの性能計算:RocketCEAの使い方 (Windows編)pythonを使ってロケットエンジンの性能計算や化学平衡計算ができるRocketCEAについて紹介。NASA CEAがpythonから呼び出し […]
[…] pythonで簡単にロケットエンジンの性能計算:RocketCEAの使い方 (Windows編)pythonを使ってロケットエンジンの性能計算や化学平衡計算ができるRocketCEAについて紹介。NASA CEAがpythonから呼び出し […]
[…] NASA CEAをPythonで使えるようにするプログラム。MinGWが必要で、それをWindows10にインストールするのに意外と引っかかったが、こちらのサイトがとても参考になりました。これと同じトラブルに悩み、これで解決。ありがとうございました。要は、MinGWのOnlineインストールを使っては駄目ということ。バイナリをダウンロードして、C:MinGWに展開。自分はCygwin派なので、MinGWにパスは通さなかったが、Anaconda環境でRocketCEAのインストールまで正常終了。 […]