Skip to content

Commit e30c3d3

Browse files
committed
updates
1 parent 0f2eaef commit e30c3d3

8 files changed

+2527
-289
lines changed

binned_dual_plots_2d.ipynb

+599
Large diffs are not rendered by default.

binned_dual_regrid.ipynb

+1,386
Large diffs are not rendered by default.

binned_dual_write.py

+301
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,301 @@
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

Comments
 (0)