From 4955ae14b4a3900b962a807310c190e8ab6bd79f Mon Sep 17 00:00:00 2001 From: David Jean du Preez Date: Tue, 2 Aug 2022 09:53:19 +0200 Subject: [PATCH] fixed aerosol profile --- .../palm_dynamic_aerosol.cpython-38.pyc | Bin 6131 -> 6079 bytes .../palm_dynamic_output.cpython-38.pyc | Bin 12031 -> 11973 bytes .../__pycache__/palm_wrf_utils.cpython-38.pyc | Bin 16664 -> 16664 bytes dynamic/palm_dynamic.py | 14 ++++--------- dynamic/palm_dynamic_aerosol.py | 19 ++++++++---------- dynamic/palm_dynamic_output.py | 14 ++++++------- dynamic/palm_wrf_utils.py | 10 --------- 7 files changed, 19 insertions(+), 38 deletions(-) diff --git a/dynamic/__pycache__/palm_dynamic_aerosol.cpython-38.pyc b/dynamic/__pycache__/palm_dynamic_aerosol.cpython-38.pyc index f87d8dbe57672965d3356c30ea37549e5050424a..df80ee41e1e396141751b98517bd7d65e4e68c5b 100644 GIT binary patch delta 473 zcmeyYzh9p>l$V!_fq{Wx($VKhJsWu~m>BgYyD??g7q{gxF*2mE*08ZKFf(K`6g8zV zW-}Je%VS|=$dgE6tYt4@tzpe#OJS2_NMV;|XlAVC$m>X9fvew?!ja8bbOWqj396P6 zt`i10H2YuE{LC4;YI! zKjobb5^5Cq&p3T^qo5~>tMVy*+RUS YF>CS~aVuVN4n+=m4pk0S4k->c0E%I5=Kufz delta 520 zcmdn5|5=|ml$V!_fq{WR;$3Uf%Z;N?2=Hv)ED?B^gp! zr5TzTYuQs6YdP}Hq_EYnu`n<*WHS`aNny-pEZTur{hSmQxcW0G?AeS(-@xkCFwF;x z)U%~w-Ub2%!aSPP2M;wvYM zu&8RPfdY|Hf>DA=j**K=f>DT(jS)eLFv>6rG4e18F$!&tVOhw?$UXTV>vu-e&EMD_ zF)@a1zR7usiIIEq8Xjdv&dC>e9x#?}-pD%}B;+gbpK;b^UqMe0XS%QgBj@BD!qXY| zPYw`S$r{B}X&5#6pNOL1O$G*rVm7cF_!#+^iZV7Eh>C-(@eng&%$Qs)*1>pxGK+XI YW5(nPaVuUa4n+=m4pk0S4k->c0L4CaSO5S3 diff --git a/dynamic/__pycache__/palm_dynamic_output.cpython-38.pyc b/dynamic/__pycache__/palm_dynamic_output.cpython-38.pyc index 7ab73fab50a6da906a1c133da3b3a1f7400ef9bc..4f509c68d26ba279c9da06c7e29737b300b12c75 100644 GIT binary patch delta 823 zcmew#do-3el$V!_fq{V`ZvXS74I6nkbLr`FIv1rTmSpCoDAWtOEDZNAB+#Llh{(KGqKptukgHDW>mEKCnLHfM;bGcn$o zJV8Q}xuuqU@)-$rZV^d_TJ9RAEanu^$^Rt88O0`xNh*tqOET2*f<-|rz7n1+-WuM? z0pcQ)lO&Z>nTr3_FsE>2GfjZ7_~0x7IEy!%X##VR-2|q>e;{1LoFV}dDK4mCPLYJO zq~I)RI7Wo=wuWDvAw^D{p@vzUL6V_XpoTw19xVT0vYwQ_qCz&)1ePMX z8kQ8M6owRrRw&uQnxZJlkisv)Fxf#$l6yl9e~J=VWys`3Qu@-$VD==0t`61|6{z}k zQu4w!HT)^6U|ae?YC2d`)F#VG>&o|meZrW z&yqG|RGEB6T9Q#~vYfQocSdyVu8O$=7JVn-# zQE~D$*+53M$r^I{nx>KrwW?q_Gf9S8H89IulA%@|%(9SVsMP?oEGIX}fpi{{3uRQ9 zEFm9kWaU?73`ta=gqWF^S(2HUlUbZtl9``}NRP+0Bz6;so=FO_a>#Pvq*`Rg zz`#&s&cMJ>CC@q8TVdm7T}2f}MuEveN?Dr^D!pf7d@^~XsvRTqa`#+X9l$V!_fq{YHYG!Lv?I5-A{{(6?2-)P z49$#;43nQps4I&~GSqU{Fl8~Ph)FWk^3-tFa@TOx^3-rF;9SVS$WX$NB0kwbQkh#q zlA)FttWIKboTOttb1`2Ha|%Z`(*y{M56%*Rvv@(QBEJdDg?u1f!<-@s5-Dz|VNQ{P zv!vlH88}N8#475jVP3$xkfD~jhB1pdg{y{n0pCIfaRy0-T9(OjQv9-VHT>cXDe~eB zHOyd9fg1i41+dN!H7t`S$cavlmy%Fa%x0RvQlwYIlERe2kiyUkB|BJClq4Ba_$3%7 zpOcd0-cZAzq6}7|))$xy2bma~v#s8s{AEF~Fg)xj()NrqYtFw1&!mmEmv z8M#nK)yYco!Fo1+Rr=6$nwghbl9`y3Sp`bd@U*N@lCR(bNx=#(lb6dUu^MqXrld?3 zP>|I_mMY3DOD(G6_b*7zQz$P=Q%K9qNwrcaGGkz1C^BbYV5pLt?5(iTuu9)IvA9?v zC9^mwF()xEIn_#`+Q7;py;dRDSie|7Be5)9!B(N#5F(^sthxD*f(j#};ABOmEY>1r z1_p-B-AeD77+*}TR<&bh5@4LXOEsREQGju?lv+J24n{j>Hby>10VY01K4uL@J|-(h0Y(944%W%SI);<2ba*!h>LfEV&fdIL_X;E9 zvdvxk`vhKo85kIjY|gY$U=rW} z3C;ou{sj@NlV@7#dN6>D6V6F2iOlP%_&JNF5(9%KM7KK3Pf;&xQrlz z4aDUFv3NiPFNolq%x7)IC^XsA+S;6niGiV52NYzC0*q`7Z2x(fBp7uVIT*ntivXh> zvj`IxBM&1J0}}(se;#HrHYuhesmZ&oFL6tO4C?_|z(0A0O(mn!WFcE+M%m3~wpNUc z+>;CK#6SVjX{XJ|239J&d6&I3Bey*lH-`WRAD116!sG`Is=`bhjC_n-j2uiHj2w(S Jj2w(yi~wz?Uzq>^ delta 460 zcmbQy#5kjgkuQ{&my3acf#K!T)})m&8~L8AG8S$ArW(!2*s?iDJ%Ew1ck^P6KxTPX z3r0R>4n{j>Hby>10VY01K4uL@J|-(h0Y(944vxvfI);o)n_YGC85tLB-l}_rk#Y6r zF8zH>jJr2`8l^BZMonI4>dW|c@*mSwwtox^3`LBS)6LWvzfA5ko5S>G9E@O+Re({B zS%is;k%y6qfr)|RKM%7Qn-o)#0: wrfchem_variables = wrfchem_dynamic + wrfchem_spec - #wrfchem_variables.append('ALT') # inverse density # add aerosol species if included - #if aerosol_wrfchem: - # wrfchem_variables = wrfchem_variables + wrfchem_aerosols N_avr = 6.022e23 # Avargardo constant inv_den = f_wrf.variables['ALT'][0] # inverse density @@ -471,7 +466,6 @@ for wrf_file in wrf_files_proc: v_out = f_out.createVariable('aerosol'+ aero_bin, 'f4', nbn.dimensions) v_out[:] = regridder.regrid(nbn_val[...,regridder.ys,regridder.xs]) - # U and V have special treatment (unstaggering) v_out = f_out.createVariable('U', 'f4', ('Time', 'bottom_top', 'south_north', 'west_east')) v_out[:] = regridder_u.regrid(f_wrf.variables['U'][...,regridder_u.ys,regridder_u.xs]) @@ -597,4 +591,4 @@ palm_dynamic_output(wrf_files_proc, interp_files, dynamic_driver_file, times_sec z_levels, z_levels_stag, ztop, z_soil_levels, dx, dy, cent_lon, cent_lat, rad_times_proc, rad_values_proc, soil_moisture_adjust, nested_domain) -print('Creation of dynamic driver finished.') +print('\nCreation of dynamic driver finished.') diff --git a/dynamic/palm_dynamic_aerosol.py b/dynamic/palm_dynamic_aerosol.py index bcc0119..79ccf72 100644 --- a/dynamic/palm_dynamic_aerosol.py +++ b/dynamic/palm_dynamic_aerosol.py @@ -31,21 +31,18 @@ def upwind_location(zlev, u, v): wnd_dir = np.mod(180 + np.rad2deg(np.arctan2(u_wnd, v_wnd)),360) wnd_avg = np.mean(wnd_dir) - if 0 < wnd_avg <= 45: - prf_x = round(wnd_dir.shape[0]/2) - prf_y = 0 - elif 315 < wnd_avg <=0: - prf_x = round(wnd_dir.shape[0]/2) + if 0 < wnd_avg <= 45 or 315 < wnd_avg <=0: prf_y = 0 + prf_x = round(wnd_dir.shape[1]/2) elif 45 < wnd_avg <= 135: - prf_x = round(wnd_dir.shape[0]/2) - prf_y = round(wnd_dir.shape[1]/2) + prf_y = round(wnd_dir.shape[0]/2) + prf_x = round(wnd_dir.shape[1]) elif 135 < wnd_avg <= 225: - prf_x = round(wnd_dir.shape[0]/2) - prf_y = wnd_dir.shape[1] + prf_y = wnd_dir.shape[0] + prf_x = round(wnd_dir.shape[1]/2) else: - prf_x = round(wnd_dir.shape[0]/2) - prf_y = round(wnd_dir.shape[1]/2) + prf_y = round(wnd_dir.shape[0]/2) + prf_x = 0 return prf_x, prf_y diff --git a/dynamic/palm_dynamic_output.py b/dynamic/palm_dynamic_output.py index 4f97e87..fcc63bc 100644 --- a/dynamic/palm_dynamic_output.py +++ b/dynamic/palm_dynamic_output.py @@ -84,7 +84,7 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, #--------------------------------------------------------------------------- # include aerosols, add dimensions and variables if aerosol_wrfchem: - print('Adding aerosol variables') + print('\tCreating aerosol variables in dynamic driver') # create dimensions outfile.createDimension('Dmid', sum(nbin)) @@ -169,7 +169,7 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, #--------------------------------------------------------------------------- # create dynamical & chemical variables in output def add_interpDim(dynam_chem_variables): - print('Adding dynamical variables') + print('\tCreating dynamical variables in dynamic driver') # surface pressure _val_surface_forcing_surface_pressure = outfile.createVariable('surface_forcing_surface_pressure', "f4",("time")) # geostrophic wind @@ -270,7 +270,7 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, # read interpolated files and write values for dynamical & chemical variables def add_interpValues(dynam_chem_variables): - print('Adding initializing variables to Dynamic Driver') + print('\tCreating initialisation variablesin dynamic driver') infile = netCDF4.Dataset(interp_files[0], "r", format="NETCDF4") outfile = netCDF4.Dataset(dynamic_driver_file, "r+", format="NETCDF4") # initialization variables @@ -301,11 +301,11 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, # time dependent variables - dynamical & chemical variables if not nested_domain: - print('\nAdding time dependent variables to Dynamic Driver') + print('\tCreating time dependent variables in dynamic driver') outfile = netCDF4.Dataset(dynamic_driver_file, "r+", format="NETCDF4") for ts in range(0, len(interp_files)): # geostrophic wind - print('Open wrf file: '+wrf_files[ts]) + #print('Open wrf file: '+wrf_files[ts]) nc_wrf = netCDF4.Dataset(wrf_files[ts], 'r') ug, vg = palm_wrf_gw(nc_wrf, lon_center, lat_center, z_levels) _val_ls_forcing_ug = outfile.variables['ls_forcing_ug'] @@ -314,7 +314,7 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, _val_ls_forcing_vg = vg nc_wrf.close() - print("Processing interpolated file: ",interp_files[ts]) + print("\tProcessing interpolated file: ",interp_files[ts]) infile = netCDF4.Dataset(interp_files[ts], "r", format="NETCDF4") # surface pressure surface_forcing_surface_pressure = infile.variables['surface_forcing_surface_pressure'] @@ -358,7 +358,7 @@ def palm_dynamic_output(wrf_files, interp_files, dynamic_driver_file, times_sec, - (vynorth * areas_yb).sum() - (wztop * areas_zb).sum()) mass_corr_v = mass_disbalance / area_boundaries - print('Mass disbalance: {0:8g} m3/s (avg = {1:8g} m/s)'.format(mass_disbalance, mass_corr_v)) + #print('Mass disbalance: {0:8g} m3/s (avg = {1:8g} m/s)'.format(mass_disbalance, mass_corr_v)) uxleft -= mass_corr_v uxright += mass_corr_v vysouth -= mass_corr_v diff --git a/dynamic/palm_wrf_utils.py b/dynamic/palm_wrf_utils.py index 2992165..7443ca8 100644 --- a/dynamic/palm_wrf_utils.py +++ b/dynamic/palm_wrf_utils.py @@ -255,7 +255,6 @@ def palm_wrf_vertical_interp(infile, outfile, wrffile, z_levels, z_levels_stag, target_terrain = ndimage.gaussian_filter(terrain, sigma=vinterp_terrain_smoothing, order=0) print('Morphing WRF terrain ({0} ~ {1}) to PALM terrain ({2} ~ {3})'.format( wrfterr.min(), wrfterr.max(), target_terrain.min(), target_terrain.max())) - #print_dstat('terrain shift', wrfterr - target_terrain[:,:]) # Load original dry air column pressure mu = nc_infile.variables['MUB'][0,:,:] + nc_infile.variables['MU'][0,:,:] @@ -283,9 +282,6 @@ def palm_wrf_vertical_interp(infile, outfile, wrffile, z_levels, z_levels_stag, # Report gpdelta = gpf2 - gpf - #print('GP deltas by level:') - #for k in range(gpf.shape[0]): - # print_dstat(k, gpdelta[k]) # Because we require levels below the lowest level from WRF, we will always # add one layer at zero level with repeated values from the lowest level. @@ -327,7 +323,6 @@ def palm_wrf_vertical_interp(infile, outfile, wrffile, z_levels, z_levels_stag, init_atmosphere_v = interpolate_1d(z_levels, height, v_raw) vdata = nc_outfile.createVariable('init_atmosphere_v', "f4", ("Time", "z","south_north","west_east")) - #vdata.coordinates = "XLONG_V XLAT_V XTIME" vdata[0,:,:,:] = init_atmosphere_v w_raw = nc_infile.variables['W'][0] @@ -525,7 +520,6 @@ def calcgw_gfs(v, lat, lon): j = np.searchsorted(lons[0,:], lon) if abs(lons[0,i+1] - lon) < abs(lons[0,i] - lon): j = j+1 - #print('level', v.level, 'height', height[i,j], lats[i,j], lons[i,j]) # Set up some constants based on our projection, including the Coriolis # parameter and grid spacing, converting lon/lat spacing to Cartesian @@ -587,15 +581,11 @@ if __name__ == '__main__': phf, phh = calc_ph_sigma(f, mu) gp_calc = calc_gp(f, phf) delta = gp_calc - gp - #for lev in range(delta.shape[0]): - # print_dstat(lev, delta[lev]) print('\nUsing hybrid:') phf, phh = calc_ph_hybrid(f, mu) gp_calc = calc_gp(f, phf) delta = gp_calc - gp - #for lev in range(delta.shape[0]): - # print_dstat(lev, delta[lev]) f.close() if args.camx: -- GitLab