# ideal-shock-test.py # # $ prep-gas ideal-air.inp ideal-air-gas-model.lua # $ python3 ideal-shock-test.py # # PJ, 2019-11-28 # import math from eilmer.gas import GasModel, GasState, GasFlow gmodel = GasModel('ideal-air-gas-model.lua') state1 = GasState(gmodel) state1.p = 125.0e3 # Pa state1.T = 300.0 # K state1.update_thermo_from_pT() state1.update_sound_speed() print("state1: %s" % state1) print("normal shock (in ideal gas), given shock speed") vs = 2414.0 state2 = GasState(gmodel) flow = GasFlow(gmodel) v2, vg = flow.ideal_shock(state1, vs, state2) print("v2=%g vg=%g" % (v2, vg)) print("state2: %s" % state2)
# # PJ, 2019-12-01 # import math def approxEqual(a, b): result = math.isclose(a, b, rel_tol=1.0e-2, abs_tol=1.0e-5) # print("a=",a, "b=",b, "rel=",(a-b)/b, "abs=",a-b, "result=",result) return result from eilmer.gas import GasModel, GasState, GasFlow m1 = 1.5 print("Conical-shock demo for m1=%g" % m1) gmodel = GasModel('cea-air13species-gas-model.lua') state1 = GasState(gmodel) state1.p = 100.0e3 # Pa state1.T = 300.0 # K ideal air, not high T state1.update_thermo_from_pT() state1.update_sound_speed() print("state1: %s" % state1) v1 = m1*state1.a print("v1=%g" % v1) beta = 45.0 * math.pi/180.0 print(" given beta(degrees)=%g" % (beta*180/math.pi)) state_c = GasState(gmodel) flow = GasFlow(gmodel) theta_c, v_c = flow.theta_cone(state1, v1, beta, state_c) print(" theta_c=%g degrees" % (theta_c*180/math.pi)) print(" v_c=%g" % (v_c)) print(" state_c: %s" % state_c)
# of air (as a mixture of N2 and O2) from 200 -- 20000 K. # # Author: Peter J. and Rowan J. Gollan # Date: 2019-11-21 # # To run this script: # $ prep-gas thermally-perfect-N2-O2.inp thermally-perfect-N2-O2.lua # $ python3 transport-properties-for-air.py # from eilmer.gas import GasModel, GasState gasModelFile = 'thermally-perfect-N2-O2.lua' gmodel = GasModel(gasModelFile) gs = GasState(gmodel) gs.p = 1.0e5 # Pa gs.massf = {"N2":0.78, "O2":0.22} # approximation for the composition of air outputFile = 'trans-props-air.dat' print("Opening file for writing: %s" % outputFile) f = open(outputFile, "w") f.write("# 1:T[K] 2:mu[Pa.s] 3:k[W/(m.K)]\n") lowT = 200.0 dT = 100.0 for i in range(199): gs.T = dT*i + lowT gs.update_thermo_from_pT() gs.update_trans_coeffs() f.write(" %12.6e %12.6e %12.6e\n" % (gs.T, gs.mu, gs.k))
# $ python3 poshax.py # #------------------------------------------------------------------ from eilmer.gas import GasModel, GasState, GasFlow, ThermochemicalReactor debug = False print("Initialise a gas model.") print("air 7 species Gupta-et-al reactions") gmodel = GasModel("air-7sp-gas-model.lua") nsp = gmodel.n_species nmodes = gmodel.n_modes if debug: print("nsp=", nsp, " nmodes=", nmodes, " gmodel=", gmodel) reactor = ThermochemicalReactor(gmodel, "air-7sp-chemistry.lua") # The example here matches the case discussed on page 63 of the thesis. state1 = GasState(gmodel) state1.p = 133.3 # Pa state1.T = 300.0 # degree K state1.massf = {"N2": 0.78, "O2": 0.22} print("Free stream conditions, before the shock.") state1.update_thermo_from_pT() state1.update_sound_speed() print(" state1: %s" % state1) mach1 = 12.28 v1 = mach1 * state1.a print("mach1:", mach1, "v1:", v1) print("Stationary normal shock with chemically-frozen gas.") flow = GasFlow(gmodel) state2 = GasState(gmodel) v2, vg = flow.normal_shock(state1, v1, state2) print(" v2=", v2, "vg=", vg)
# Step through a steady isentropic expansion, # from stagnation condition to sonic condition. # # $ prep-gas ideal-air.inp ideal-air-gas-model.lua # $ python3 isentropic-air-expansion.py # # Python port, PJ, 2019-11-21 # import math from eilmer.gas import GasModel, GasState gmodel = GasModel('ideal-air-gas-model.lua') gs = GasState(gmodel) gs.p = 500e3 # Pa gs.T = 300.0 # K gs.update_thermo_from_pT() # Compute enthalpy and entropy at stagnation conditions h0 = gs.enthalpy s0 = gs.entropy # Set up for stepping process dp = 1.0 # Pa, use 1 Pa as pressure step size gs.p = gs.p - dp mach_tgt = 1.0 # Begin stepping until Mach = mach_tgt while True: gs.update_thermo_from_ps(s0) h1 = gs.enthalpy v1 = math.sqrt(2*(h0 - h1)) m1 = v1/gs.a if m1 >= mach_tgt: print("Stopping at Mach=%g" % m1)
#------------------------------------------------------------------ # Start the main script... debug = False print("# Reacting pipe flow -- Bittker-Scullin test case 3.") print(sample_header) # Gas model setup gmodel = GasModel("h2-o2-n2-9sp.lua") nsp = gmodel.n_species nmodes = gmodel.n_modes if debug: print("nsp=", nsp, " nmodes=", nmodes, " gmodel=", gmodel) print("# Gas properties at the start of the pipe.") gas0 = GasState(gmodel) gas0.p = 96.87e3 # Pa x = 0.0 # m (inlet of pipe) v = 4551.73 # m/s gas0.T = 1559.0 # degree K gas0.molef = {"O2": 0.1480, "N2": 0.5562, "H2": 0.2958} gas0.update_thermo_from_pT() dt_suggest = 1.0e-8 # suggested starting time-step for chemistry updater print(sample_data(x, v, gas0, dt_suggest)) print("# Start reactions...") reactor = ThermochemicalReactor(gmodel, "h2-o2-n2-9sp-18r.lua") t = 0 # time is in seconds t_final = 22.0e-6 t_inc = 0.05e-6 nsteps = int(t_final / t_inc) for j in range(1, nsteps + 1):
# the gas-model Lua file is visible, as given by the path below. # # PJ 2019-07-24 direct use of FFI # 2019-07-25 using Pythonic wrapper # from eilmer.gas import GasModel, GasState gmodel = GasModel("ideal-air-gas-model.lua") print("gmodel=", gmodel) print("n_species=", gmodel.n_species, ", n_modes=", gmodel.n_modes) print("species_names=", gmodel.species_names) print("mol_masses=", gmodel.mol_masses) gs = GasState(gmodel) print("freshly minted gs=", gs) gs.rho=1.1; gs.p=1.0e5; gs.T=300.0; gs.u=1.44e6; gs.massf=[1.0] print("after setting some values") print(" gs.rho=%g p=%g T=%g u=%g massf=%s a=%g k=%g mu=%g" % (gs.rho, gs.p, gs.T, gs.u, gs.massf, gs.a, gs.k, gs.mu)) gmodel.update_thermo_from_pT(gs) # the way that we do the update in D gmodel.update_sound_speed(gs) # not necessary from Python but is available gmodel.update_trans_coeffs(gs) print("after update thermo from pT") print(" gs.rho=%g p=%g T=%g u=%g massf=%s a=%g k=%g mu=%g" % (gs.rho, gs.p, gs.T, gs.u, gs.massf, gs.a, gs.k, gs.mu)) gs.p=3000.0; gs.T=99.0; gs.massf={'air':1.0} gs.update_thermo_from_rhou() # update another way gs.update_trans_coeffs() print("after update thermo from rhou") print(" gs.rho=%g p=%g T=%g u=%g massf=%s a=%g k=%g mu=%g" % (gs.rho, gs.p, gs.T, gs.u, gs.massf, gs.a, gs.k, gs.mu))
#------------------------------------------------------------------ # Start the main script... debug = False print("# Reacting nozzle flow.") print(sample_header) # Gas model setup gmodel = GasModel("h2-o2-n2-5sp.lua") nsp = gmodel.n_species nmodes = gmodel.n_modes if debug: print("nsp=", nsp, " nmodes=", nmodes, " gmodel=", gmodel) print("# Gas properties at the start of the pipe.") gas0 = GasState(gmodel) gas0.p = 81.0e3 # Pa x = 0.0 # m (inlet of duct) area = duct_area(x) v = 1230.0 # m/s gas0.T = 1900.0 # degree K gas0.molef = {"O2":0.1865, "N2":0.7016, "H2":0.1119} gas0.update_thermo_from_pT() dt_suggest = 1.0e-12 # suggested starting time-step for chemistry print(sample_data(x, area, v, gas0, dt_suggest)) if debug: print("# species=", gmodel.species_names) print("# massf=", gas0.massf) print("# Start reactions...") reactor = ThermochemicalReactor(gmodel, "h2-o2-n2-5sp-2r.lua")