from parameters import * import numpy as np from sympy import Symbol, solve, nsolve, re import scipy.optimize import multiprocessing from CN_layers_depth import ini_z_dz, z_dz_update, C_interpolate, C_interpolate_simple import timeit import matplotlib.pyplot as plt import F_BD_multipros_process_fn # nrows = 10 ncols = 10 z_matrix, dz_matrix = ini_z_dz(nrows, ncols) #z_matrix[:,1]=z_matrix[:,1]*2.0 #Cl = 40000.0*np.exp(-1.0*z_matrix) # 18000 #ClayPerct = 70.0 # #SiltPerct = 17.8# #Cv = Cl*1e-6 #def set_globvar_to_one(): #global z_matrix # Needed to modify global copy of globvar #set_globvar_to_one() start = timeit.default_timer() Cm = F_BD_multipros_process_fn.output(z_matrix, nrows * ncols)
def creating_ini_values(CCW, sin, litter_input, inputDatabase): #------------------------------------------------------------------------ # INITIAL elevation, soil layer thickness #------------------------------------------------------------------------ if CCW: X, Y, eta, mask_grid = loadDEM() # loadDEM() or ini_landscape() mask_vector = mask_grid.flatten() mask_ID = np.where(mask_vector == 0) if sin: X, Y, eta = ini_landscape() eta_vector_ini = np.array(eta).flatten() # Convert into 1D array eta_vector = eta_vector_ini * 1.0 nrows, ncols = eta.shape z_matrix_ini, dz_matrix_ini = ini_z_dz(nrows, ncols) Ch_all_ini = 43000.0 * np.exp(-2.5 * z_matrix_ini) # 45000 Cb_all_ini = 180.0 * np.exp(-2.5 * z_matrix_ini) #320 Cl_all_ini = 6900.0 * np.exp(-2.5 * z_matrix_ini) #2800 if inputDatabase: nc_f = "wd373.nc" #test_wd500_noT nc_fid = Dataset(nc_f, 'r') soil_depth_change = np.array(nc_fid.variables['d_LE']) eta_vector = eta_vector + soil_depth_change_d.flatten( ) + soil_depth_change_s.flatten() Cl_all = np.array(nc_fid.variables['Cl']) Cb_all = np.array(nc_fid.variables['Cb']) Ch_all = np.array(nc_fid.variables['Ch']) z_matrix = np.array(nc_fid.variables['soil_depth']) dz_matrix = np.zeros((z_matrix.shape)) dz_matrix[0, :] = z_matrix[0, :] * 1.0 for i in xrange(6): dz_matrix[i + 1, :] = z_matrix[i + 1, :] * 1.0 - z_matrix[i, :] * 1.0 theta = np.array(nc_fid.variables['theta']) else: z_matrix = z_matrix_ini * 1.0 dz_matrix = dz_matrix_ini * 1.0 # np.save('z_matrix_ini',z_matrix_ini) # np.save('dz_matrix_ini',dz_matrix_ini) #------------------------------------------------------------------------ # INITIAL CARBON CONCENTRATION, CL, CB, CH, NL, HB, NH, N+, N- #------------------------------------------------------------------------ Ch_all = Ch_all_ini * 1.0 Cb_all = Cb_all_ini * 1.0 Cl_all = Cl_all_ini * 1.0 # np.save('Ch_all_ini',Ch_all_ini) # np.save('Cb_all_ini',Cb_all_ini) # np.save('Cl_all_ini',Cl_all_ini) #C_matrix_ini = Ch_all_ini+Cb_all_ini+Cl_all_ini #C_matrix = C_matrix_ini*1.0 C1_vector = np.array([Cl_all[0, :], Ch_all[0, :], Cb_all[0, :] ]) * 1.0 #+Cb_all[0,:]+Ch_all[0,:] #CN_l_all = CN_l_ini*np.ones((soil_layer_num,nrows*ncols)) #same as np.ones(z_matrix.shape) #N_plus_all = 0.002*np.ones((soil_layer_num,nrows*ncols)) #0.002*np.exp(-1.0*z_matrix) #N_minus_all = 0.6*np.ones((soil_layer_num,nrows*ncols)) #0.6*np.exp(-1.0*z_matrix) #------------------------------------------------------------------------ # INITIAL water deoth (wd) and water surface elevation (we) #------------------------------------------------------------------------ wd_vector, we_vector = overland_setup( eta_vector) # vector means reorganize 2D to 1D mann_bs = manning_bs * np.ones(nrows * ncols) # load the Manning's coeff mann_vg = manning_vg * np.ones(nrows * ncols) #------------------------------------------------------------------------ # INITIAL soil mositure and soil pressure head #------------------------------------------------------------------------ Psi_ini_all = -2.0 * z_matrix - 2.0 #-1.0*np.ones((soil_layer_num,nrows*ncols)) #np.linspace(2.0,2.0,nz) Psi_n_all = Psi_ini_all * 1.0 C_ini_all, K_ini_all, theta_ini_all = vanGenuchten(Psi_ini_all, alpha, theta_S, theta_R, n, m, Ksat) theta_n_all = theta_ini_all * 1.0 # theta_mean_1col = np.array([ 0.30887538, 0.31472939, 0.31682785, 0.31680671, 0.31508827, 0.31146861, 0.30576922]) theta_mean_1col = np.array([ 0.35480344, 0.36059945, 0.36269936, 0.36273304, 0.3611157, 0.3574786, 0.35072803 ]) #theta_mean_1col = np.array([0.255932 , 0.26280422, 0.26647157, 0.26852458, 0.26961957, \ # 0.2700011 , 0.26972128, 0.26868466, 0.26671475, 0.2637314]) # 10 layers #------------------------------------------------------------------------ # INITIAL water deoth (wd) and water surface elevation (we) #------------------------------------------------------------------------ wd_vector, we_vector = overland_setup( eta_vector) # vector means reorganize 2D to 1D #------------------------------------------------------------------------ # Kl, Kh, Kd, and ADD #------------------------------------------------------------------------ Kl = np.zeros((soil_layer_num)) Kh = np.zeros((soil_layer_num)) Kd = np.zeros((soil_layer_num)) Zr = z_matrix[:, 1] dZr = dz_matrix[:, 1] Frooti = root_fr(Zr, dZr) litter_mean = np.mean(litter_input, 1) Addb = Frooti * (Add_b + litter_mean[1]) #+litter_mean[1] ADD = Addb * 1.0 ADD[0] = Addb[0] + ADD_s + litter_mean[0] #+litter_mean[0] rh_2col = np.column_stack((rh_ini * np.ones(soil_layer_num), np.ones(soil_layer_num) * CN_h_ini / CN_l_ini)) rh = np.min(rh_2col, axis=1) for ll in xrange(0, soil_layer_num): Kl[ll], Kh[ll], Kd[ll] = aveg_k(theta_mean_1col[ll] / poros, np.mean(Cl_all[ll, :]), np.mean(Ch_all[ll, :]), np.mean(Cb_all[ll, :]), ADD[ll], rh[ll]) Kl = np.ones((soil_layer_num, nrows * ncols)) * Kl[:, None] Kh = np.ones((soil_layer_num, nrows * ncols)) * Kh[:, None] Kd = np.ones((soil_layer_num, nrows * ncols)) * Kd[:, None] #------------------------------------------------------------------------ # SAVE VARIABLES #------------------------------------------------------------------------ water_depth_saved = np.zeros(nrows * ncols) # dh_STs = np.zeros(nrows*ncols) # dh_STd = np.zeros(nrows*ncols) # dh_STr = np.zeros(nrows*ncols) dh_STsave = np.zeros(nrows * ncols) # qC_save_d = np.zeros((3, nrows*ncols)) # qC_save_s = np.zeros((3, nrows*ncols)) # qC_save_r = np.zeros((3, nrows*ncols)) dC_BG = np.zeros((soil_layer_num, nrows * ncols)) qC_LE = np.zeros((nrows * ncols)) #------------------------------------------------------------------------ # SAVE DATA #------------------------------------------------------------------------ folder = 'Output_data' #os.getcwd() # if not os.path.exists(folder): os.makedirs(folder) save2D_results(dh_STsave.reshape( (nrows, ncols)), qC_LE.reshape( (nrows, ncols)), Cl_all + Ch_all + Cb_all, dC_BG, theta_n_all, z_matrix, 'd_LE', 'qC_LE', 'Clhb', 'dC_BG', 'theta', 'z_matrix', folder, "wd", 0) #"d_soildepth_s" 'qC_s' return eta_vector, eta_vector_ini, nrows, ncols, z_matrix, z_matrix_ini, dz_matrix, dz_matrix_ini, theta_n_all, Psi_n_all, wd_vector, we_vector, Cl_all, Ch_all, Cb_all, Cl_all_ini, Ch_all_ini, Cb_all_ini, C1_vector, Kl, Kh, Kd, Frooti, mann_bs, mann_vg, mask_ID
return dCl_all, dCh_all, dCb_all, Cl1d, Ch1d, Cb1d if __name__ == '__main__': #...................Rainfall rain = np.load('rainfall_100yr3_daily.npy') # mm/(day) rain = rain / 1000.0 litter_input = (np.load('litter_input.npy')) / dt time_steps = 1 rp = 0 #........initial values, Soil moisture theta_save = np.zeros((soil_layer_num, time_steps)) z_matrix, dz_matrix = ini_z_dz(1, 1) Psi_ini_all = -2.0 * z_matrix - 2.0 #-1.0*np.ones((soil_layer_num,nrows*ncols)) #np.linspace(2.0,2.0,nz) Psi_n_all = Psi_ini_all * 1.0 C_ini_all, K_ini_all, theta_ini_all = vanGenuchten(Psi_ini_all, alpha, theta_S, theta_R, n, m, Ksat) # theta_mean_1col = np.array([0.30887538, 0.31472939, 0.31682785, 0.31680671, 0.31508827, 0.31146861, 0.30576922]) #dry theta_mean_1col = np.array([ 0.35480344, 0.36059945, 0.36269936, 0.36273304, 0.3611157, 0.3574786, 0.35072803 ]) # wet # theta_mean_1col = np.array([0.39126216, 0.39281667, 0.3923617, 0.39047139, 0.38715473, 0.38192914, 0.37363064])
def creating_ini_values(CLP, sin, litter_input, litter_inputC, inputDatabase, tre, unt): #------------------------------------------------------------------------ # INITIAL elevation, soil layer thickness, manning's coeff #------------------------------------------------------------------------ if CLP: X, Y, eta, mann_vg = loadDEM(tre, unt) # loadDEM() or ini_landscape() mann_vg = mann_vg.flatten() if sin: X, Y, eta = ini_landscape() mann_vg = manning_vg * np.ones( nrows * ncols) # load the Manning's coeff ind_veg = np.where((mann_vg.flatten()) < 15)[0] eta_vector_ini = np.array(eta).flatten() # Convert into 1D array eta_vector = eta_vector_ini * 1.0 ind_dem = np.where( eta_vector > 0.0 )[0] # the ind_in is the index inside of the watershed boundary but within the big rectangula eta_vector[eta_vector < 0.0] = np.max(eta_vector) # eta_vector[eta_vector<0.0] = np.nan nrows, ncols = eta.shape z_matrix_ini, dz_matrix_ini = ini_z_dz(nrows, ncols) mann_bs = manning_bs * np.ones(nrows * ncols) if sin: Ch_all_ini = 43000.0 * np.exp(-2.5 * z_matrix_ini) # 45000 Cl_all_ini = 7000.0 * np.exp(-2.5 * z_matrix_ini) #2800 Cb_all_ini = 3260.0 * np.exp(-2.5 * z_matrix_ini) #320 ind_out = np.where(eta_vector < 0.0)[0] if CLP: current_dir = os.getcwd() os.chdir(current_dir + "/" + '/Topo_SOCini_Landcover/') if tre: Manndata = gdal.Open("landuse_tre_2m_clip.tif") Mann_vg = Manndata.ReadAsArray() ind_crop = np.where(Mann_vg.flatten() == 7)[0] Clhb_ini = np.load('a_surface_GLC.npy') Clhb_ini = np.array(Clhb_ini).flatten() * 1.0 Clhb_profiles = (Clhb_ini * np.exp(-b_f_soc * z_matrix_ini) + c_f_soc) * 1000.0 Clhb_profiles[:, ind_crop] = (Clhb_ini[ind_crop] * np.exp( -b_c_soc * z_matrix_ini[:, ind_crop]) + c_c_soc) * 1000.0 if unt: ind_crop = np.array([0, 1]) Clhb_ini = np.load('a_surface_Reference.npy') Clhb_ini = np.array(Clhb_ini).flatten() * 1.0 Clhb_profiles = (Clhb_ini * np.exp(-b_f_soc * z_matrix_ini) + c_f_soc) * 1000.0 ind_aSOC = np.where(Clhb_ini > 0.0)[0] os.chdir(current_dir) Cl_all_ini = 0.1235 * Clhb_profiles Ch_all_ini = 0.8752 * Clhb_profiles Cb_all_ini = 0.0104 * Clhb_profiles ind_in = reduce(np.intersect1d, (ind_dem, ind_veg, ind_aSOC)) if inputDatabase: nc_f = "test_wd500_noT.nc" nc_fid = Dataset(nc_f, 'r') soil_depth_change_d = np.array(nc_fid.variables['d_soildepth_d']) soil_depth_change_s = np.array(nc_fid.variables['d_soildepth_s']) eta_vector = eta_vector + soil_depth_change_d.flatten( ) + soil_depth_change_s.flatten() Cl_all = np.array(nc_fid.variables['Cl']) Cb_all = np.array(nc_fid.variables['Cb']) Ch_all = np.array(nc_fid.variables['Ch']) z_matrix = np.array(nc_fid.variables['soil_depth']) dz_matrix = np.zeros((z_matrix.shape)) dz_matrix[0, :] = z_matrix[0, :] * 1.0 for i in xrange(6): dz_matrix[i + 1, :] = z_matrix[i + 1, :] * 1.0 - z_matrix[i, :] * 1.0 theta = np.array(nc_fid.variables['theta']) else: z_matrix = z_matrix_ini * 1.0 dz_matrix = dz_matrix_ini * 1.0 np.save('z_matrix_ini', z_matrix_ini) np.save('dz_matrix_ini', dz_matrix_ini) #------------------------------------------------------------------------ # INITIAL CARBON CONCENTRATION, CL, CB, CH, NL, HB, NH, N+, N- #------------------------------------------------------------------------ Ch_all = Ch_all_ini * 1.0 Cb_all = Cb_all_ini * 1.0 Cl_all = Cl_all_ini * 1.0 # np.save('Ch_all_ini',Ch_all_ini) # np.save('Cb_all_ini',Cb_all_ini) # np.save('Cl_all_ini',Cl_all_ini) C1_vector = np.array([Cl_all[0, :], Ch_all[0, :], Cb_all[0, :] ]) * 1.0 #+Cb_all[0,:]+Ch_all[0,:] #CN_l_all = CN_l_ini*np.ones((soil_layer_num,nrows*ncols)) #same as np.ones(z_matrix.shape) #N_plus_all = 0.002*np.ones((soil_layer_num,nrows*ncols)) #0.002*np.exp(-1.0*z_matrix) #N_minus_all = 0.6*np.ones((soil_layer_num,nrows*ncols)) #0.6*np.exp(-1.0*z_matrix) #------------------------------------------------------------------------ # INITIAL water deoth (wd) and water surface elevation (we) #------------------------------------------------------------------------ wd_vector, we_vector = overland_setup( eta_vector) # vector means reorganize 2D to 1D #------------------------------------------------------------------------ # INITIAL soil mositure and soil pressure head #------------------------------------------------------------------------ Psi_ini_all = -2.0 * z_matrix - 2.0 #-1.0*np.ones((soil_layer_num,nrows*ncols)) #np.linspace(2.0,2.0,nz) Psi_n_all = Psi_ini_all * 1.0 C_ini_all, K_ini_all, theta_ini_all = vanGenuchten(Psi_ini_all, alpha, theta_S, theta_R, n, m, Ksat) theta_n_all = theta_ini_all * 1.0 theta_mean_1col = np.array([ 0.2819225, 0.28597336, 0.28728486, 0.28643568, 0.28358753, 0.27879374, 0.27252435 ]) # theta_mean_1col = np.array([0.27988195, 0.28893737, 0.29351663, 0.29522106, 0.29452995, 0.29169496, 0.28769183]) # theta_mean_1col = np.array([ 0.30887538, 0.31472939, 0.31682785, 0.31680671, 0.31508827, # 0.31146861, 0.30576922]) #------------------------------------------------------------------------ # INITIAL water deoth (wd) and water surface elevation (we) #------------------------------------------------------------------------ wd_vector, we_vector = overland_setup( eta_vector) # vector means reorganize 2D to 1D #------------------------------------------------------------------------ # Kl, Kh, Kd, and ADD #------------------------------------------------------------------------ Kl = np.zeros((soil_layer_num, nrows * ncols)) Kh = np.zeros((soil_layer_num, nrows * ncols)) Kd = np.zeros((soil_layer_num, nrows * ncols)) Zr = z_matrix[:, 1] dZr = dz_matrix[:, 1] Frooti = root_fr(Zr, dZr) rh_2col = np.column_stack((rh_ini * np.ones(soil_layer_num), np.ones(soil_layer_num) * CN_h_ini / CN_l_ini)) rh = np.min(rh_2col, axis=1) litter = np.mean(litter_input, 1)[:, None] * np.ones((2, nrows * ncols)) litterC = np.mean(litter_inputC, 1)[:, None] * np.ones((2, len(ind_crop))) litter[:, ind_crop] = litterC Addb = Frooti[:, None] * (Add_b + litter[1, :]) ADD = Addb * 1.0 ADD[0, :] = Addb[0] + ADD_s + litter[0, :] Cl_stable = Cl_all_ini * 0.865 Ch_stable = Ch_all_ini * 0.865 Cb_stable = Cb_all_ini * 0.865 # Cl_stable[:,ind_crop] = Cl_all_ini[:,ind_crop]*0.86 #0.1235*(4800.0*np.exp(-2.0*z_matrix_ini[:,ind_crop] )+ 1.5) # Ch_stable[:,ind_crop] = Ch_all_ini[:,ind_crop]*0.86 #0.8752*(4800.0*np.exp(-2.0*z_matrix_ini[:,ind_crop] )+ 1.5) # Cb_stable[:,ind_crop] = Cb_all_ini[:,ind_crop]*0.86 #0.0104*(4800.0*np.exp(-2.0*z_matrix_ini[:,ind_crop] )+ 1.5) for i in ind_in: for ll in xrange(0, soil_layer_num): Kl[ll, i], Kh[ll, i], Kd[ll, i] = aveg_k( theta_mean_1col[ll] / poros, (Cl_stable[ll, i]), (Ch_stable[ll, i]), (Cb_stable[ll, i]), ADD[ll, i], rh[ll]) # ind_crop # Kl = np.ones((soil_layer_num,nrows*ncols))*Kl[:,None] # Kh = np.ones((soil_layer_num,nrows*ncols))*Kh[:,None] # Kd = np.ones((soil_layer_num,nrows*ncols))*Kd[:,None] #------------------------------------------------------------------------ # SAVE VARIABLES #------------------------------------------------------------------------ water_depth_saved = np.zeros(nrows * ncols) # dh_STs = np.zeros(nrows*ncols) # dh_STd = np.zeros(nrows*ncols) # dh_STr = np.zeros(nrows*ncols) # qC_save_d = np.zeros((3, nrows*ncols)) # qC_save_s = np.zeros((3, nrows*ncols)) # qC_save_r = np.zeros((3, nrows*ncols)) dh_STsave = np.zeros(nrows * ncols) qC_LE = np.zeros((nrows * ncols)) dC_BG = np.zeros((soil_layer_num, nrows * ncols)) #------------------------------------------------------------------------ # SAVE DATA #------------------------------------------------------------------------ folder = 'Output_data' if not os.path.exists(folder): os.makedirs(folder) save2D_results(dh_STsave.reshape( (nrows, ncols)), qC_LE.reshape( (nrows, ncols)), Cl_all + Ch_all + Cb_all, dC_BG, theta_n_all, z_matrix, 'd_LE', 'qC_LE', 'Clhb', 'dC_BG', 'theta', 'z_matrix', folder, "wd", 0) #"d_soildepth_s" 'qC_s' , eta_vector_ini_in = -1.0 * np.ones(nrows * ncols) eta_vector_ini_in[ind_in] = eta_vector_ini[ind_in] * 1.0 eta_2d_ini = eta_vector_ini_in.reshape(nrows, ncols) eta_2d_ini[eta_2d_ini < 0.0] = np.nan np.save('eta_ini', eta_2d_ini) return eta_vector, eta_vector_ini, nrows, ncols, z_matrix, z_matrix_ini, dz_matrix, dz_matrix_ini, theta_n_all, Psi_n_all, wd_vector, we_vector, Cl_all, Ch_all, Cb_all, Cl_all_ini, Ch_all_ini, Cb_all_ini, C1_vector, Kl, Kh, Kd, Frooti, mann_bs, mann_vg, ind_in, ind_crop