Example 4 from RP-1311ΒΆ
Note
The python script for this example is available in the source/bind/python/cea/samples directory of the CEA repository.
Here we describe how to run example 4 from RP-1311 [1] using the Python API. This is a UV equilibrium problem, which is otherwise identical to Example 3. For that reason, the comments in this example will be limited to the minor differences.
import numpy as np
import cea
# Options
trace = 1e-15
# Species
reac_names = [b"Air", b"C7H8(L)", b"C8H18(L),n-octa"]
omit_names = [b"CCN", b"CNC", b"C2N2", b"C2O",
b"C3H4,allene", b"C3H4,propyne", b"C3H4,cyclo-", b"C3",
b"C3H5,allyl", b"C3H6,propylene", b"C3H6,cyclo-", b"C3H3,propargyl",
b"C3H6O", b"C3H7,n-propyl", b"C3H7,i-propyl", b"Jet-A(g)",
b"C3O2", b"C4", b"C4H2", b"C3H8O,2propanol",
b"C4H4,1,3-cyclo-", b"C4H6,butadiene", b"C4H6,2-butyne", b"C3H8O,1propanol",
b"C4H8,tr2-butene", b"C4H8,isobutene", b"C4H8,cyclo-", b"C4H6,cyclo-",
b"(CH3COOH)2", b"C4H9,n-butyl", b"C4H9,i-butyl", b"C4H8,1-butene",
b"C4H9,s-butyl", b"C4H9,t-butyl", b"C4H10,isobutane", b"C4H8,cis2-buten",
b"C4H10,n-butane", b"C4N2", b"C5", b"C3H8",
b"C5H6,1,3cyclo-", b"C5H8,cyclo-", b"C5H10,1-pentene", b"C10H21,n-decyl",
b"C5H10,cyclo-", b"C5H11,pentyl", b"C5H11,t-pentyl", b"C12H10,biphenyl",
b"C5H12,n-pentane", b"C5H12,i-pentane", b"CH3C(CH3)2CH3", b"C12H9,o-bipheny",
b"C6H6", b"C6H5OH,phenol", b"C6H10,cyclo-", b"C6H2",
b"C6H12,1-hexene", b"C6H12,cyclo-", b"C6H13,n-hexyl", b"C6H5,phenyl",
b"C7H7,benzyl", b"C7H8", b"C7H8O,cresol-mx", b"C6H5O,phenoxy",
b"C7H14,1-heptene", b"C7H15,n-heptyl", b"C7H16,n-heptane", b"C10H8,azulene",
b"C8H8,styrene", b"C8H10,ethylbenz", b"C8H16,1-octene", b"C10H8,napthlene",
b"C8H17,n-octyl", b"C8H18,isooctane", b"C8H18,n-octane", b"C9H19,n-nonyl",
b"Jet-A(L)", b"C6H6(L)", b"H2O(s)", b"H2O(L)"]
Here, the fixed value of \(u/R\) and \({\rho}\) (density) are pulled from the output of Example 3.
# Thermo states
u_R = -45.1343
density = 14.428 # kg/m^3
# Mixture states
fuel_weights = np.array([0.0, 0.4, 0.6])
oxidant_weights = np.array([1.0, 0.0, 0.0])
T_reac = np.array([700.0, 298.15, 298.15])
of_ratios = np.array([17.0])
# Mixtures
reac = cea.Mixture(reac_names)
prod = cea.Mixture(reac_names, products_from_reactants=True, omit=omit_names)
# Solver
solver = cea.EqSolver(prod, reactants=reac, trace=trace)
solution = cea.EqSolution(solver)
# Initialize variable arrays
n = len(of_ratios)
of_ratio_out = np.zeros(n)
T_out = np.zeros(n)
P_out = np.zeros(n)
rho = np.zeros(n)
enthalpy = np.zeros(n)
energy = np.zeros(n)
gibbs = np.zeros(n)
entropy = np.zeros(n)
molecular_weight_M = np.zeros(n)
molecular_weight_MW = np.zeros(n)
gamma_s = np.zeros(n)
cp_eq = np.zeros(n)
cp_fr = np.zeros(n)
cv_eq = np.zeros(n)
cv_fr = np.zeros(n)
mole_fractions = {}
trace_species = []
i = 0
Note that the prescribed value of \({\rho}\) (density) is converted to specific volume before calling solve().
# Equilibrium solve
for of_ratio in of_ratios:
weights = reac.of_ratio_to_weights(oxidant_weights, fuel_weights, of_ratio)
solver.solve(solution, cea.UV, u_R, 1.0/density, weights)
# Store the output
of_ratio_out[i] = of_ratio
if solution.converged:
P_out[i] = solution.P
T_out[i] = solution.T
rho[i] = solution.density
enthalpy[i] = solution.enthalpy
energy[i] = solution.energy
gibbs[i] = solution.gibbs_energy
entropy[i] = solution.entropy
molecular_weight_M[i] = solution.M
molecular_weight_MW[i] = solution.MW
gamma_s[i] = solution.gamma_s
cp_eq[i] = solution.cp_eq
cp_fr[i] = solution.cp_fr
cv_eq[i] = solution.cv_eq
cv_fr[i] = solution.cv_fr
if i == 0:
for prod in solution.mole_fractions:
mole_fractions[prod] = np.array([solution.mole_fractions[prod]])
else:
for prod in mole_fractions:
mole_fractions[prod] = np.append(mole_fractions[prod], solution.mole_fractions[prod])
i += 1
print("P, bar ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(P_out[i]), end=" ")
else:
print("{0:10.3f}".format(P_out[i]))
print("T, K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(T_out[i]), end=" ")
else:
print("{0:10.3f}".format(T_out[i]))
print("Density, kg/m^3", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3e}".format(rho[i]), end=" ")
else:
print("{0:10.3e}".format(rho[i]))
print("H, kJ/kg ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(enthalpy[i]), end=" ")
else:
print("{0:10.3f}".format(enthalpy[i]))
print("U, kJ/kg ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(energy[i]), end=" ")
else:
print("{0:10.3f}".format(energy[i]))
print("G, kJ/kg ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.1f}".format(gibbs[i]), end=" ")
else:
print("{0:10.1f}".format(gibbs[i]))
print("S, kJ/kg-K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(entropy[i]), end=" ")
else:
print("{0:10.3f}".format(entropy[i]))
print("M, (1/n) ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(molecular_weight_M[i]), end=" ")
else:
print("{0:10.3f}".format(molecular_weight_M[i]))
print("MW ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.3f}".format(molecular_weight_MW[i]), end=" ")
else:
print("{0:10.3f}".format(molecular_weight_MW[i]))
print("Gamma_s ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.4f}".format(gamma_s[i]), end=" ")
else:
print("{0:10.4f}".format(gamma_s[i]))
print("Cp_eq, kJ/kg-K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.4f}".format(cp_eq[i]), end=" ")
else:
print("{0:10.4f}".format(cp_eq[i]))
print("Cp_fr, kJ/kg-K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.4f}".format(cp_fr[i]), end=" ")
else:
print("{0:10.4f}".format(cp_fr[i]))
print("Cv_eq, kJ/kg-K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.4f}".format(cv_eq[i]), end=" ")
else:
print("{0:10.4f}".format(cv_eq[i]))
print("Cv_fr, kJ/kg-K ", end=" ")
for i in range(n):
if i < n-1:
print("{0:10.4f}".format(cv_fr[i]), end=" ")
else:
print("{0:10.4f}".format(cv_fr[i]))
print()
print("MOLE FRACTIONS")
print("")
trace_species = []
for prod in mole_fractions:
if np.any(mole_fractions[prod] > trace):
print("{0:15s}".format(prod), end=" ")
for j in range(n):
if j < n-1:
print("{0:10.5g}".format(mole_fractions[prod][j]), end=" ")
else:
print("{0:10.5g}".format(mole_fractions[prod][j]))
else:
trace_species.append(prod)
print()
print("TRACE SPECIES:")
max_cols = 8
nrows = (len(trace_species) + max_cols - 1) // max_cols
for i in range(nrows):
print(" ".join("{0:15s}".format(trace_species[j]) for j in range(i * max_cols, min((i + 1) * max_cols, len(trace_species)))))
Resulting in the output to the terminal:
P, bar 99.974
T, K 2418.538
Density, kg/m^3 1.443e+01
H, kJ/kg 317.645
U, kJ/kg -375.270
G, kJ/kg -19437.2
S, kJ/kg-K 8.168
M, (1/n) 29.021
MW 29.021
Gamma_s 1.2257
Cp_eq, kJ/kg-K 1.6093
Cp_fr, kJ/kg-K 1.4176
Cv_eq, kJ/kg-K 1.3121
Cv_fr, kJ/kg-K 1.1311
MOLE FRACTIONS
Ar 0.0088617
CN 5.84e-14
CO 0.0016763
CO2 0.11537
COOH 5.1528e-08
H 2.7535e-05
H2 0.00025052
H2O 0.10277
H2O2 9.8756e-07
HCHO,formaldehy 1.7093e-11
HCN 1.0535e-11
HCO 7.3708e-10
HCOOH 6.4546e-09
HNC 1.0139e-12
HNCO 1.2303e-09
HNO 4.2176e-07
HNO2 1.8492e-06
HNO3 1.1294e-09
HO2 7.9882e-06
N 1.1482e-08
N2 0.73547
N2H2 5.1653e-13
N2O 3.6436e-06
N2O3 2.4361e-11
N2O4 3.0948e-15
N3 1.2321e-12
N3H 3.848e-13
NCO 8.3006e-11
NH 2.9308e-09
NH2 1.7069e-09
NH2NO2 2.4338e-15
NH2OH 1.0202e-11
NH3 3.8872e-09
NO 0.0067747
NO2 2.3462e-05
NO3 1.9237e-10
O 0.00015498
O2 0.026252
O3 1.209e-08
OH 0.0023475
TRACE SPECIES:
(HCOOH)2 C C10H8,naphthale C2 C2H C2H2,acetylene C2H2,vinylidene C2H3,vinyl
C2H4 C2H4O,ethylen-o C2H5 C2H5OH C2H6 C3H3,1-propynl C3H3,2-propynl C3H6O,acetone
C3H6O,propanal C3H6O,propylox C4H2,butadiyne C4H6,1butyne C4H6,2butyne C6H14,n-hexane C7H16,2-methylh CH
CH2 CH2CO,ketene CH2OH CH3 CH3CHO,ethanal CH3CN CH3CO,acetyl CH3COOH
CH3N2CH3 CH3O CH3O2CH3 CH3OCH3 CH3OH CH3OOH CH4 CNCOCN
CNN HCCN HCCO HO(CO)2OH N2H4 N2O5 NCN O(CH)2O
OCCN OHCH2COOH C(gr) H2O(cr)