def steady(constants, init): o3 = np.zeros(constants["nlevs"]) o3_sum = np.zeros(constants["nlevs"]) o2 = np.zeros(constants["nlevs"]) o2_sum = np.zeros(constants["nlevs"]) o = np.zeros(constants["nlevs"]) J_o2 = np.zeros(constants["nlevs"]) J_o3 = np.zeros(constants["nlevs"]) k3M = np.zeros(constants["nlevs"]) k4 = np.zeros(constants["nlevs"]) q = np.zeros(constants["nlevs"]) o2_running = 0 o3_running = 0 for i in range(constants["nlevs"]): o2[i] = constants["ratio"] * constants["M"][i] optical_depth = constants["o2_c"] * o2_running + constants["o3_c"] * o3_running I_factor = np.exp(-optical_depth) I = np.array(constants["sol"] * I_factor) J_o2[i] = j(I, "JO2", constants) J_o3[i] = j(I, "JO3", constants) k3M[i] = k("k3M", constants, i) k4[i] = k("k4", constants, i) o3[i], q[i] = ozone(J_o2[i], J_o3[i], k3M[i], k4[i], o2[i], constants["M"][i]) o[i] = otp(o3[i], J_o3[i], k3M[i], o2[i]) o2_running = o2_running + o2[i] * constants["box_h"][i] o2_sum[i] = o2_running o3_running = o3_running + o3[i] * constants["box_h"][i] o3_sum[i] = o3_running if init == True: file = Dataset("netcdf/initial.nc", "w") file.createDimension("height", constants["nlevs"]) spec_in_init = ["O3", "O", "O2", "M", "CH4", "N2O", "H2O"] val_in_init = [ o3, o, o2, constants["M"], 1.7e-6 * constants["M"], 3.2e-7 * constants["M"], 4.0e-6 * constants["M"], ] for i in range(len(spec_in_init)): file.createVariable(spec_in_init[i], np.float64, "height") file.variables[spec_in_init[i]][:] = val_in_init[i] # file.variables['O3'][:]=o3 # file.variables['O'][:]=o # file.variables['O2'][:]=o2 # file.variables['M'][:]=constants['M'] # file.variables['CH4'][:]=1.7E-6*constants['M'] # file.variables['N2O'][:]=3.2E-7*constants['M'] # file.variables['H2O'][:]=4.E-6*constants['M'] # plt.plot(constants['heights'],o3) # plt.savefig('ozone.png') return o3, o2, o, J_o2, J_o3, o3_running
def solve(constants): o2_running=0 o3_running=0 constants['M_surf']=2.5E19*(constants['ratio']+0.79) constants['M']=constants['M_surf']*np.exp(-constants['heights']/constants['H']) d1defs=np.genfromtxt("species.dat",dtype='str',skiprows=2) bimol=np.genfromtxt("bimol.dat",dtype='str',skiprows=2) photo=np.genfromtxt("photol.dat",dtype='str',skiprows=2) nspec=len(d1defs[:,0]) d1=np.zeros([len(d1defs[:,0]),constants['nlevs']]) file=Dataset('netcdf/initial.nc') ## ## # This Section Initialises Arrays To Your Input File. # # Any Species With No Value In Input Are Set To Zero # ## ## for i in range(len(d1defs[:,0])): #if os.path.isfile('netcdf/'+d1defs[i,0]+'.nc')==True: #file=Dataset('netcdf/initial.nc') try: species=file.variables[d1defs[i,0]][:] except: species=np.zeros(constants['nlevs']) d1[i,:]=species for i in range(len(bimol[:,0])): for a in [0,1,3,4,5,6]: if bimol[i,a] in d1defs[:,0] or bimol[i,a]=='X': pass else: sys.exit("SPECIES "+bimol[i,a]+" IN BIMOL RXN BUT NOT IN SPECIES.DAT") for i in range(len(photo[:,0])): for a in [0,2,3,4,5]: if photo[i,a] in d1defs[:,0] or photo[i,a]=='X': pass else: sys.exit("SPECIES "+photo[i,a]+" IN PHOTOL RXN BUT NOT IN SPECIES.DAT") #M=d1[np.where(d1defs=='M')[0][0],:] d3=np.zeros([nspec,constants['nlevs']]) for i in range(constants['nlevs']): # Create dictionary of rates rates={} for a in range(len(bimol)): rates[bimol[a,2]]=k(bimol[a,2],constants,i) optical_depth=constants['o2_c']*o2_running+constants['o3_c']*o3_running I_factor=np.exp(-optical_depth) I=np.array(I_factor*constants['sol']) #I=od_chems(o2_running,o3_running,constants) for a in range(len(photo)): rates[photo[a,1]]=j(I,photo[a,1],constants) # Define function for chemical tendencies def f(y,t): g=np.empty(nspec) # Loop through chemical species for spec in range(nspec): # Set to zero if species constant, e.g. M, O2 if d1defs[spec,1]=='n': g[spec]=0.0 else: g[spec]=0.0 # Add chemical tendency for a bimolecular rxn # np.where(bimol==d1defs[spec,0])[:][0].shape[0] is the number of times spec appears in bimol for bi in range(np.where(bimol==d1defs[spec,0])[:][0].shape[0]): rxno=np.where(bimol==d1defs[spec,0])[0][bi] if np.where(bimol==d1defs[spec,0])[1][bi]<2: # If appears on LHS of eqn, results in loss g[spec]-=y[np.where(d1defs==bimol[rxno,0])[0][0]]\ *y[np.where(d1defs==bimol[rxno,1])[0][0]]\ *rates[bimol[rxno,2]] else: # If appears on RHS of eqn, results in production g[spec]+=y[np.where(d1defs==bimol[rxno,0])[0][0]]\ *y[np.where(d1defs==bimol[rxno,1])[0][0]]\ *rates[bimol[rxno,2]] for pho in range(np.where(photo==d1defs[spec,0])[:][0].shape[0]): rxno=np.where(photo==d1defs[spec,0])[0][pho] if np.where(photo==d1defs[spec,0])[1][pho]<1: g[spec]-=y[np.where(d1defs==photo[rxno,0])[0][0]]\ *rates[photo[rxno,1]] else: g[spec]+=y[np.where(d1defs==photo[rxno,0])[0][0]]\ *rates[photo[rxno,1]] return g # Set up times # t=np.linspace(0,5.174E8/60.,5.174E8/3600.) #t=np.arange(60*60*24*360*10,step=60*60) #solution provides a time series, take the final value t_start=0. t_step1=60. t_step2=60.*60.*6. t_end=t_step2*24.*360.*5. t1=np.arange(t_start, t_end/100., t_step1) t2=np.arange(t_start+t_end/100., t_end, t_step2) t_interval=np.concatenate((t1,t2),axis=0) soln,hi=spi.odeint(f,d1[:,i],t_interval,full_output=1) soln=soln[len(t_interval)-1,:] d3[:,i]=soln o3_running=o3_running+d3[np.where(d1defs=='O3')[0][0],i]*constants['box_h'][i] o2_running=o2_running+d1[np.where(d1defs=='O2')[0][0],i]*constants['box_h'][i] return d1defs,d1,d3