|
| 1 | +# ### Notebook to genereate plots of binned 2D variables. |
| 2 | +# |
| 3 | +# James Ruppert |
| 4 | + |
| 5 | +# 2/22/24 |
| 6 | + |
| 7 | +# NOTE: Using copied tracking from CTL for NCRF tests |
| 8 | + |
| 9 | +import numpy as np |
| 10 | +import matplotlib.pyplot as plt |
| 11 | +from precip_class import precip_class |
| 12 | +from read_functions import * |
| 13 | +import pickle |
| 14 | + |
| 15 | +# #### Main settings |
| 16 | + |
| 17 | +storm = 'haiyan' |
| 18 | +# storm = 'maria' |
| 19 | + |
| 20 | +# main = "/ourdisk/hpc/radclouds/auto_archive_notyet/tape_2copies/wrfenkf/" |
| 21 | +main = "/ourdisk/hpc/radclouds/auto_archive_notyet/tape_2copies/tc_ens/" |
| 22 | +figdir = "/home/jamesrup/figures/tc/ens/"+storm+'/' |
| 23 | +datdir2 = 'post/d02/' |
| 24 | +save_dir = "/ourdisk/hpc/radclouds/auto_archive_notyet/tape_2copies/james/binned_2d_sav/" |
| 25 | + |
| 26 | +# Time selection |
| 27 | +# hr_tag = str(np.char.zfill(str(nt), 2)) |
| 28 | + |
| 29 | +# Tests to read and compare |
| 30 | +# tests = ['crfon','ncrf'] |
| 31 | +# if storm == 'haiyan': |
| 32 | +# tests = ['ctl','ncrf36h'] |
| 33 | +# elif storm == 'maria': |
| 34 | +# # tests = ['ctl','ncrf36h'] |
| 35 | +# tests = ['ctl','ncrf48h'] |
| 36 | +tests = ['ctl'] |
| 37 | + |
| 38 | +# Number of sample time steps |
| 39 | +nt=200 # will be chopped down to max available |
| 40 | +nt=3*24#24#6 |
| 41 | +time_neglect=12 # time steps from start to neglect |
| 42 | + |
| 43 | +# Members |
| 44 | +nmem = 10 # number of ensemble members (1-5 have NCRF) |
| 45 | +# nmem = 2 |
| 46 | +enstag = str(nmem) |
| 47 | + |
| 48 | + |
| 49 | +# Ensemble member info |
| 50 | +memb0=1 # Starting member to read |
| 51 | +memb_nums=np.arange(memb0,nmem+memb0,1) |
| 52 | +memb_nums_str=memb_nums.astype(str) |
| 53 | +nustr = np.char.zfill(memb_nums_str, 2) |
| 54 | +memb_all=np.char.add('memb_',nustr) |
| 55 | + |
| 56 | +# Get dimensions |
| 57 | +datdir = main+storm+'/'+memb_all[0]+'/'+tests[0]+'/'+datdir2 |
| 58 | +nt_data, nz, nx1, nx2, pres = get_file_dims(datdir) |
| 59 | +dp = (pres[1]-pres[0])*1e2 # Pa |
| 60 | +nt=np.min([nt,nt_data-time_neglect]) |
| 61 | +nx1-=80*2 |
| 62 | +nx2-=80*2 |
| 63 | + |
| 64 | +# Get WRF file list |
| 65 | +datdir = main+storm+'/'+memb_all[0]+'/'+tests[0]+'/' |
| 66 | +wrffiles, lat, lon = get_wrf_filelist(datdir) |
| 67 | + |
| 68 | + |
| 69 | +# Main read loops for all variables |
| 70 | + |
| 71 | +# Arrays to save variables |
| 72 | +# ntest=len(tests) |
| 73 | +dims2d = (nmem,nt,nx1,nx2) |
| 74 | +pclass_all = np.zeros(dims2d) |
| 75 | +tqi_all = np.zeros(dims2d) |
| 76 | +pw_all = np.zeros(dims2d) |
| 77 | +satfrac_all = np.zeros(dims2d) |
| 78 | +lwacre_all = np.zeros(dims2d) |
| 79 | +rain_all = np.zeros(dims2d) |
| 80 | +# vmfd_all = np.zeros(dims2d) |
| 81 | + |
| 82 | +t0=time_neglect # neglect the first 12 time steps |
| 83 | +t1=t0+nt |
| 84 | + |
| 85 | +ktest=0 |
| 86 | +test_str=tests[ktest] |
| 87 | +print('Running test: ',test_str) |
| 88 | + |
| 89 | +# Loop over ensemble members |
| 90 | + |
| 91 | +for imemb in range(nmem): |
| 92 | + |
| 93 | + print('Running imemb: ',memb_all[imemb]) |
| 94 | + |
| 95 | + datdir = main+storm+'/'+memb_all[imemb]+'/'+test_str+'/'+datdir2 |
| 96 | + print(datdir) |
| 97 | + |
| 98 | + # Precip class |
| 99 | + q_int = read_qcloud(datdir,t0,t1,drop=True) # mm |
| 100 | + pclass_all[imemb,:,:,:] = precip_class(q_int) |
| 101 | + |
| 102 | + # IWP |
| 103 | + tqi_all[imemb,:,:,:] = q_int[2] # Just cloud ice |
| 104 | + # tqi_all[imemb,:,:,:] = q_int[2] + q_int[3] + q_int[4] # Ice water path = ice + snow + graupel |
| 105 | + |
| 106 | + # LWACRE |
| 107 | + lwacre_all[imemb,:,:,:] = read_lwacre(datdir,t0,t1,drop=True) # W/m2 |
| 108 | + |
| 109 | + # Rain rate |
| 110 | + varname = 'rainrate' |
| 111 | + rain_all[imemb,:,:,:] = var_read_2d(datdir,varname,t0,t1,drop=True)/24 # mm/d --> mm/hr |
| 112 | + |
| 113 | + # PW, Sat frac |
| 114 | + # pw = var_read_2d(datdir3d,varname,t0,t1,drop=True) # mm |
| 115 | + pw = read_mse_diag(datdir,'pw',2,t0,t1,drop=True) # mm |
| 116 | + pw_sat = read_mse_diag(datdir,'pw_sat',2,t0,t1,drop=True) # mm |
| 117 | + pw_all[imemb,:,:,:] = pw |
| 118 | + satfrac_all[imemb,:,:,:] = 100*pw/pw_sat |
| 119 | + |
| 120 | + # VMFD |
| 121 | + # vmfd_all[imemb,:,:,:] = read_mse_diag(datdir,'vmfd',2,t0,t1,drop=True) # kg/m/s |
| 122 | + |
| 123 | + |
| 124 | +# Bin variable settings |
| 125 | + |
| 126 | +def binvar_settings(ivar_select, pw_all, satfrac_all, rain_all, lwacre_all): |
| 127 | + |
| 128 | + nbins=30 |
| 129 | + |
| 130 | + # PW |
| 131 | + if ivar_select == 'pw': |
| 132 | + ivar_all = pw_all |
| 133 | + fmin=35;fmax=80 # mm |
| 134 | + # step=1 |
| 135 | + bins=np.linspace(fmin,fmax,num=nbins) |
| 136 | + xlabel='Column Water Vapor [mm]' |
| 137 | + log_x='linear' |
| 138 | + # Column saturation fraction |
| 139 | + elif ivar_select == 'sf': |
| 140 | + ivar_all = satfrac_all |
| 141 | + fmin=30;fmax=102 # % |
| 142 | + # step=2 |
| 143 | + bins=np.linspace(fmin,fmax,num=nbins) |
| 144 | + xlabel='Saturation Fraction [%]' |
| 145 | + log_x='linear' |
| 146 | + # Rainfall rate |
| 147 | + elif ivar_select == 'rain': |
| 148 | + ivar_all = rain_all |
| 149 | + # bins=10.**(np.arange(1,8,0.3)-4) |
| 150 | + # bins=10.**(np.arange(0,8,0.3)-4) |
| 151 | + bins=np.logspace(-4,2.5,num=nbins) |
| 152 | + xlabel='Rainfall Rate [mm/hr]' |
| 153 | + log_x='log' |
| 154 | + # LW-ACRE |
| 155 | + elif ivar_select == 'lwacre': |
| 156 | + ivar_all = lwacre_all |
| 157 | + fmin=-50; fmax=200 # W/m2 |
| 158 | + # step=5 |
| 159 | + bins=np.linspace(fmin,fmax,num=nbins) |
| 160 | + xlabel='LW-ACRE [W/m**2]' |
| 161 | + log_x='linear' |
| 162 | + # Stratiform area fraction |
| 163 | + # elif ivar_select == 'strat_area': |
| 164 | + # fmin=0;fmax=60 # % |
| 165 | + # step=1 |
| 166 | + # bins=np.arange(fmin,fmax+step,step) |
| 167 | + # xlabel='Stratiform area fraction [%]' |
| 168 | + # log_x='linear' |
| 169 | + |
| 170 | + # Create axis of bin center-points for plotting |
| 171 | + # nbins = np.size(bins) |
| 172 | + bin_axis = (bins[np.arange(nbins-1)]+bins[np.arange(nbins-1)+1])/2 |
| 173 | + |
| 174 | + return ivar_all, bins, bin_axis, xlabel, log_x |
| 175 | + |
| 176 | + |
| 177 | +# Binning function |
| 178 | + |
| 179 | +def run_dual_binning(bins_x, bins_y, ivar_x, ivar_y, pclass_all, pw_all, satfrac_all, lwacre_all, rain_all, tqi_all): |
| 180 | + |
| 181 | + # Loop and composite variables |
| 182 | + |
| 183 | + nbins_x = np.size(bins_x) |
| 184 | + nbins_y = np.size(bins_y) |
| 185 | + |
| 186 | + nclass=6 |
| 187 | + |
| 188 | + bin_freq=np.zeros((nbins_x-1, nbins_y-1)) # Bin counts |
| 189 | + |
| 190 | + pclass_binned=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) # Bin count: 0-non-raining, 1-conv, 2-strat, 3-other/anvil |
| 191 | + pw_binned=np.full((nbins_x-1,nbins_y-1), np.nan) |
| 192 | + satfrac_binned=np.full((nbins_x-1,nbins_y-1), np.nan) |
| 193 | + lwacre_binned=np.full((nbins_x-1,nbins_y-1), np.nan) |
| 194 | + rain_binned=np.full((nbins_x-1,nbins_y-1), np.nan) |
| 195 | + tqi_binned=np.full((nbins_x-1,nbins_y-1), np.nan) |
| 196 | + # vmfd_binned=np.full((nbins-1), np.nan) |
| 197 | + |
| 198 | + pw_class=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) # Binned by precip_class: 0-non-raining, 1-deep conv, 2-congest, 3-shallow, 4-strat, 5-anvil |
| 199 | + satfrac_class=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) |
| 200 | + lwacre_class=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) |
| 201 | + rain_class=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) |
| 202 | + tqi_class=np.full((nbins_x-1,nbins_y-1,nclass), np.nan) |
| 203 | + # vmfd_class=np.full((nbins-1,nclass), np.nan) |
| 204 | + |
| 205 | + nmin = 3 |
| 206 | + |
| 207 | + # Bin the variables, averaging across member, time, x, y: (ntest,nmemb,nt,nz,nx1,nx2) --> (ntest,nbins,nz) |
| 208 | + for ibin_x in range(nbins_x-1): |
| 209 | + for ibin_y in range(nbins_y-1): |
| 210 | + |
| 211 | + indices = ((ivar_x >= bins_x[ibin_x]) & (ivar_x < bins_x[ibin_x+1]) & |
| 212 | + (ivar_y >= bins_y[ibin_y]) & (ivar_y < bins_y[ibin_y+1])).nonzero() |
| 213 | + |
| 214 | + ifreq = indices[0].shape[0] |
| 215 | + bin_freq[ibin_x,ibin_y] = ifreq |
| 216 | + |
| 217 | + if ifreq > nmin: |
| 218 | + pw_binned[ibin_x,ibin_y] = np.mean(pw_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 219 | + satfrac_binned[ibin_x,ibin_y] = np.mean(satfrac_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 220 | + lwacre_binned[ibin_x,ibin_y] = np.mean(lwacre_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 221 | + rain_binned[ibin_x,ibin_y] = np.mean(rain_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 222 | + tqi_binned[ibin_x,ibin_y] = np.mean(tqi_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 223 | + # vmfd_binned[ibin] = np.mean(vmfd_all[indices[0],indices[1],indices[2],indices[3]], axis=0) |
| 224 | + else: |
| 225 | + continue |
| 226 | + # Else will leave bins filled with NaN |
| 227 | + |
| 228 | + for kclass in range(nclass): |
| 229 | + indices_strat = ((ivar_x >= bins_x[ibin_x]) & (ivar_x < bins_x[ibin_x+1]) & |
| 230 | + (ivar_y >= bins_y[ibin_y]) & (ivar_y < bins_y[ibin_y+1]) & |
| 231 | + (pclass_all == kclass)).nonzero() |
| 232 | + |
| 233 | + ifreq = indices_strat[0].shape[0] |
| 234 | + pclass_binned[ibin_x,ibin_y,kclass] = ifreq |
| 235 | + |
| 236 | + # Bin the 2D var by rain class |
| 237 | + if ifreq > nmin: |
| 238 | + pw_class[ibin_x,ibin_y,kclass] = np.mean(pw_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 239 | + satfrac_class[ibin_x,ibin_y,kclass] = np.mean(satfrac_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 240 | + lwacre_class[ibin_x,ibin_y,kclass] = np.mean(lwacre_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 241 | + rain_class[ibin_x,ibin_y,kclass] = np.mean(rain_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 242 | + tqi_class[ibin_x,ibin_y,kclass] = np.mean(tqi_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 243 | + # vmfd_class[ibin,kclass] = np.mean(vmfd_all[indices_strat[0],indices_strat[1],indices_strat[2],indices_strat[3]], axis=0) |
| 244 | + |
| 245 | + # Calculate Area Fraction for each class |
| 246 | + pclass_area=np.ma.zeros((nbins_x-1,nbins_y-1,nclass)) |
| 247 | + total=np.nansum(pclass_binned) |
| 248 | + for kclass in range(nclass): |
| 249 | + pclass_area[:,:,kclass] = pclass_binned[:,:,kclass]/total*1e2 |
| 250 | + |
| 251 | + binned_vars = { |
| 252 | + 'bins_x':bins_x, 'bins_y':bins_y, |
| 253 | + 'bin_freq':bin_freq, 'pclass_binned':pclass_binned, 'pclass_area':pclass_area, 'pw_binned':pw_binned, 'satfrac_binned':satfrac_binned, |
| 254 | + 'lwacre_binned':lwacre_binned, 'rain_binned':rain_binned, 'tqi_binned':tqi_binned, #'vmfd_binned':vmfd_binned, |
| 255 | + 'pw_class':pw_class, 'satfrac_class':satfrac_class, 'lwacre_class':lwacre_class, 'rain_class':rain_class, 'tqi_class':tqi_class}#, |
| 256 | + # 'vmfd_class':vmfd_class, } |
| 257 | + |
| 258 | + return binned_vars |
| 259 | + |
| 260 | + |
| 261 | +# ### Run binning and plotting |
| 262 | + |
| 263 | +def write_pickle(save_file, binned_vars): |
| 264 | + with open(save_file, 'wb') as f: |
| 265 | + pickle.dump(binned_vars, f) |
| 266 | + |
| 267 | + |
| 268 | +# ivar_select_x='rain' |
| 269 | +# ivar_select_y='sf' |
| 270 | + |
| 271 | +# ivar_x, bins_x, bin_axis_x, xlabel, log_x = binvar_settings(ivar_select_x, pw_all, satfrac_all, rain_all, lwacre_all) |
| 272 | +# ivar_y, bins_y, bin_axis_y, ylabel, log_y = binvar_settings(ivar_select_y, pw_all, satfrac_all, rain_all, lwacre_all) |
| 273 | + |
| 274 | +# binned_vars = run_dual_binning(bins_x, bins_y, ivar_x, ivar_y, pclass_all, pw_all, satfrac_all, lwacre_all, rain_all, tqi_all) |
| 275 | + |
| 276 | +# save_file=save_dir+ivar_select_x+'-'+ivar_select_y+'.pkl' |
| 277 | +# write_pickle(save_file, binned_vars) |
| 278 | + |
| 279 | + |
| 280 | +# ivar_select_x='sf' |
| 281 | +# ivar_select_y='lwacre' |
| 282 | + |
| 283 | +# ivar_x, bins_x, bin_axis_x, xlabel, log_x = binvar_settings(ivar_select_x, pw_all, satfrac_all, rain_all, lwacre_all) |
| 284 | +# ivar_y, bins_y, bin_axis_y, ylabel, log_y = binvar_settings(ivar_select_y, pw_all, satfrac_all, rain_all, lwacre_all) |
| 285 | + |
| 286 | +# binned_vars = run_dual_binning(bins_x, bins_y, ivar_x, ivar_y, pclass_all, pw_all, satfrac_all, lwacre_all, rain_all, tqi_all) |
| 287 | + |
| 288 | +# save_file=save_dir+ivar_select_x+'-'+ivar_select_y+'.pkl' |
| 289 | +# write_pickle(save_file, binned_vars) |
| 290 | + |
| 291 | + |
| 292 | +ivar_select_x='rain' |
| 293 | +ivar_select_y='lwacre' |
| 294 | + |
| 295 | +ivar_x, bins_x, bin_axis_x, xlabel, log_x = binvar_settings(ivar_select_x, pw_all, satfrac_all, rain_all, lwacre_all) |
| 296 | +ivar_y, bins_y, bin_axis_y, ylabel, log_y = binvar_settings(ivar_select_y, pw_all, satfrac_all, rain_all, lwacre_all) |
| 297 | + |
| 298 | +binned_vars = run_dual_binning(bins_x, bins_y, ivar_x, ivar_y, pclass_all, pw_all, satfrac_all, lwacre_all, rain_all, tqi_all) |
| 299 | + |
| 300 | +save_file=save_dir+ivar_select_x+'-'+ivar_select_y+'.pkl' |
| 301 | +write_pickle(save_file, binned_vars) |
0 commit comments