def test_region4_2(): drop = droplet.Droplet(pressure=0.1) assert drop.region == 'Region 4' assert (drop.temperature - 0.372755919e3) <= TOL drop = droplet(pressure=1) assert drop.region == 'Region 4' assert (drop.temperature - 0.453035632e3) <= TOL drop = droplet(pressure=10) assert drop.region == 'Region 4' assert (drop.temperature - 0.584149488e3) <= TOL
def test_region4_1(): drop = droplet.Droplet(temperature=300) assert drop.region == 'Region 4' assert (drop.pressure - 0.353658941e-2) <= TOL drop = droplet(temperature=500) assert drop.region == 'Region 4' assert (drop.pressure - 0.263889776e1) <= TOL drop = droplet(temperature=600) assert drop.region == 'Region 4' assert (drop.pressure - 0.123443146e2) <= TOL
def entrainer(T, mdot): #assume everytime the kernel entrains 10 droplets, based on the fuel mass flow rate m10 = mdot * 1e-6 m = m10 / 10.0 fuel = 'A2' drop_tempo = droplet(1, fuel, T, 1) #a "useless" droplet to get fuel info #calculate r based on mass put into the the kernel, right now, no statistically distribution of r r = np.power(3.0 / 4.0 / drop_tempo.rho / np.pi * m, 1.0 / 3.0) print(r) frac = 1 num = 10 d_arr = [] #create 10 droplets of the same size that give the proper mass flow rate for i in range(0, num): d_arr.append(droplet(r, fuel, T, frac)) return d_arr
droplet.m = droplet.m - 4.0*np.pi*droplet.k*droplet.r/droplet.cp*np.log(1.0+B)*dt if droplet.m < 0: pass else: mdot += 4.0*np.pi*droplet.k*droplet.r/droplet.cp*np.log(1.0+B) qdot += mdot*droplet.hfg droplet.r = (droplet.m*3.0/4.0/np.pi/droplet.rho)**(1.0/3.0) pass return mdot, qdot d_array = [] for i in range(1,100): rad = np.random.random()*100*1e-6 d_array.append(droplet(radius=rad)) dt = 1e-6 time = [] m_dot = [] q_dot = [] for i in range(1,700): print('In iteration:' + str(i)) mdot, qdot = vaporize(1600, d_array, dt) # d_array.append(droplet(radius=i*100e-6)) time.append(i*dt) m_dot.append(mdot) q_dot.append(qdot) fig, ax1 = plt.subplots() ax2 = ax1.twinx()
pass else: droplet.r = (droplet.m * 3.0 / 4.0 / np.pi / droplet.rho)**(1.0 / 3.0) mdot += qdot / droplet.hfg pass if droplet.m < 0: d_array.remove(droplet) pass return mdot, qdot d_array = [] d_array.append(droplet(radius=50e-6)) dt = 1e-6 time = [] m_dot = [] q_dot = [] r = [] m = [] Temperature = [] for i in range(1, 600): # print('In iteration:' + str(i)) mdot, qdot = vaporize(500, d_array, dt) # d_array.append(droplet(radius=i*100e-6)) time.append(i * dt) m_dot.append(mdot)
def execute(): #============================================================================== # set up the cantera gases and reactors #============================================================================== drop = droplet(50e-6, 'A2', 300, 1) #drop is defined only to use the drop properties #environment air gas_env = ct.Solution('a2.cti') gas_env.TPX = 300, ct.one_atm, 'O2:29,N2:71' gas_fuel = ct.Solution('a2.cti') gas_fuel.TPX = drop.ABP, ct.one_atm, 'POSF10325:1' #gaseous fuel at average boiling temperature gas_kernel = ct.Solution('a2.cti') gas_kernel.TPX = 4000, ct.one_atm, 'O2:29,N2:71' gas_kernel.equilibrate('HP') res_air = ct.Reservoir(gas_env) res_fuel = ct.Reservoir(gas_fuel) kernel = ct.IdealGasConstPressureReactor(gas_kernel) kernel.volume = 2.4e-8 #m^3 mfc1 = ct.MassFlowController(res_air, kernel) #connect air reservoir to kernel mfc2 = ct.MassFlowController(res_fuel, kernel) #connect fuel reservoir to kernel mfc1.set_mass_flow_rate(6e-5) mfc2.set_mass_flow_rate(0) w = ct.Wall(kernel, res_fuel) w.set_heat_flux(0) w.expansion_rate_coeff = 1e8 net = ct.ReactorNet({kernel}) net.atol = 1e-10 #absolute tolerance net.rtol = 1e-10 #relative tolerance #============================================================================== # endtime, time steps, and data to be stored #============================================================================== dt = 1e-6 #change time step for advancing the reactor endtime = 1000e-6 mdot_fuel = 1.98e-6 #this number should be calculated based on equivalence ratio, kg/s droplets = [] T = [] time = [] m = [] m_dot = [] q_dot = [] droplet_count = [] X_fuel = [] X_O = [] X_CO2 = [] num_d = [] #============================================================================== # advance reaction #============================================================================== print("Running simulation") for i in range(1,int(endtime/dt)): print (int(endtime/dt) - i) #entrain droplets every 1 microsecond droplets.extend(entrainer(400, 5.*mdot_fuel)) mdot, qdot = vaporize(gas_kernel.T, droplets, dt) # print(gas_kernel.T, mdot, qdot, len(droplets)) # print(str(mdot) + str(qdot) + str(gas_kernel.T)+' '+str(len(droplets))) mfc2.set_mass_flow_rate(mdot) w.set_heat_flux(qdot) #heat required to heat up the droplets during that time step net.advance(i*dt) num_d.append(len(droplets)) #storing variables T.append(gas_kernel.T) time.append(net.time) m.append(kernel.mass) m_dot.append(mdot) q_dot.append(qdot) droplet_count.append(len(droplets)) if gas_kernel.X[0] < 0: gas_kernel.X[0] = 0 X_fuel.append(gas_kernel.X[gas_kernel.species_index("POSF10325")]) X_O.append(gas_kernel.X[gas_kernel.species_index("O")]) X_CO2.append(gas_kernel.X[gas_kernel.species_index("CO2")]) #============================================================================== # plotting important information #============================================================================== plt.plot([t*1e3 for t in time],T, linewidth=3) plt.xlabel('time(ms)', FontSize=15) plt.ylabel('Temperature (K)', FontSize=15) plt.show() fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.plot([t*1e3 for t in time], X_fuel, color = 'red', linewidth = 3) ax1.set_xlabel('time (ms)', FontSize=15) ax1.set_ylabel('X_fuel', color='red', FontSize=15) # ax2.plot([t*1e3 for t in time], X_O, color = 'green', linewidth = 3) ax2.set_ylabel('X_CO2', color='green', FontSize=15) ax2.plot([t*1e3 for t in time], X_CO2, color = 'blue', linewidth = 3) plt.show() fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.plot([t*1e3 for t in time], m_dot, color = 'red', linewidth = 3) ax1.set_xlabel('time (ms)', FontSize=15) ax1.set_ylabel('m_dot', color='red', FontSize=15) ax2.plot([t*1e3 for t in time], q_dot, color = 'green', linewidth = 3) ax2.set_ylabel('q_dot', color='green', FontSize=15) plt.show() fig,ax1 = plt.subplots() ax1.plot([t*1e3 for t in time], num_d, linewidth=3) ax1.set_xlabel('time(ms)', FontSize=15) ax1.set_ylabel('#droplets', FontSize=15) plt.show()
import cantera as ct import numpy as np import matplotlib.pyplot as plt from droplet import * from entrainer import * from vaporize import * ct.suppress_thermo_warnings() if __name__ == '__main__': d_vec = [] # this vector is going to store all droplets dt_vap = 1e-6 #time step to call vaporizer dt_r = 1e-8 #time step to call reactor drop = droplet(50e-6, 'A2', 300, 1) #drop is defined only to use the drop properties end_time = 300e-6 #environment air gas_env = ct.Solution('a2.cti') gas_env.TPX = 300, ct.one_atm, 'O2:29,N2:71' gas_fuel = ct.Solution('a2.cti') gas_fuel.TPX = drop.ABP, ct.one_atm, 'POSF10325:1' #gaseous fuel at average boiling temperature gas_kernel = ct.Solution('a2.cti') gas_kernel.TPX = 4000, ct.one_atm, 'O2:29,N2:71' gas_kernel.equilibrate('HP') res_air = ct.Reservoir(gas_env) res_fuel = ct.Reservoir(gas_fuel) kernel = ct.IdealGasConstPressureReactor(gas_kernel) kernel.volume = 2.4e-8 #m^3
Gr = L**3*rho**2*g*del_T*beta/nu**2 #Rayleigh # based on Grashof and Prandtl #'s Ra = Gr*Pr #Nusselt #, -- T.Yuge try: Nu = 2 + 0.43*Ra**0.25 except: print('error occured at finding nusselt number') #convective heat transfer coefficient k = 91e-3 #thermal conductivity for air at ?1600K? h = Nu*k/L #establish the ordinary differential equation A = 4.0*np.pi*droplet.r**2.0 V = 4.0/3.0*np.pi*droplet.r**3.0 dTdt = (h*A*(Tenv - droplet.T) - mdot*droplet.hfg)/(droplet.rho*V*droplet.cp) return dTdt r = float(input('droplet diameter(m):')) endtime = float(input('endtime(s):')) d = droplet(radius=r) ts = np.linspace(0,endtime,100) T = 300 Ts = odeint(dT_dt, T, ts, args=(d, 1600)) plt.plot(ts, Ts) plt.xlim([0,0.0001]) plt.show()