import numpy as np
import cantera as ct
import matplotlib.pyplot as plt
species_of_interest = 'NO'
def getFlame(gas,P):
flame = ct.FreeFlame(gas,width=0.05)
flame.set_refine_criteria(ratio=3, slope=0.05, curve=0.05)
flame.soret_enabled = True
flame.transport_model = 'multicomponent'
flame.solve(loglevel=0, auto=True)
state = {
'T [K]': flame.T,
'vel [m/s]': flame.velocity,
'dist [m]': flame.grid #list of distances [m]
}
for species in gas.species_names:
state[f"X_{species}"] = flame.X[gas.species_names.index(species)]
S_b = list(state['vel [m/s]'])[-1] # [m/s]
Rjoule = 8.31446261815324 # [J/K/mol]
full_time = [(distance)/S_b for distance in state['dist [m]']] # [s]
conc = np.multiply(flame.X[gas.species_names.index(species_of_interest)], np.divide(P*ct.one_atm,np.multiply(Rjoule,state['T [K]'])))
distance_index=np.argmax(conc)
tau_f = np.array(state['dist [m]'][distance_index])/S_b
state['tau [ms]']=[(ft - tau_f)*1000 for ft in full_time] # [ms]
return state
gas = ct.Solution('gri30.yaml')
fuel = 'NH3'
phi=1.1
T = 450
P = 1
oxidizer = {'O2':1,'N2':3.76}
gas.TP = T, P*ct.one_atm
gas.set_equivalence_ratio(phi,fuel,oxidizer,basis='mole')
state = getFlame(gas,P)
tau = list(state['tau [ms]'])
X_NO = list(state['X_NO'])
plt.figure()
plt.loglog(tau,X_NO)
And here is what I wrote in an attempt at making a sensitivity script before I arrived at a dead end:
def getSensitivity(gas):
f = ct.FreeFlame(gas,width=width)
f.set_refine_criteria(ratio=3, slope=0.06, curve=0.1)
f.solve(loglevel=0, auto=True)
X0_NO = f.X[gas.species_names.index("NO")]
print(X0_NO)
# Su0=f.velocity[0] # m/s
sensitivities = pd.DataFrame(index=gas.reaction_equations(), columns=["base_case"])
dk = 0.1
for r in range(gas.n_reactions):
gas.set_multiplier(1.0)
gas.set_multiplier(1+dk,r)
f.solve(loglevel=0, refine_grid=False, auto=False)
X_NO = f.X[gas.species_names.index("NO")]
# Su = f.velocity[0]
sensitivities.iloc[r,0]=(X_NO-X0_NO)/(X0_NO*dk)
# sensitivities.iloc[r,0]=(Su-Su0)/(Su0*dk)
gas.set_multiplier(1.0)
sensitivities_subset = sensitivities[sensitivities["base_case"].abs() > threshold]
return sensitivities_subset