def pres_winds(datestr, **kwargs): #latstr, lonstr, ini_fname=kwargs.get('ini_fname', os.getenv('HOME')+'/bom_mds/bom_mds.ini') ini_dict=parse_ini.parse_ini(ini_fname) parm=kwargs.get('parm','CZ') dateobj=num2date(datestr2num(datestr)) tim_date=num2date(datestr2num(datestr)) radar1, radar2=netcdf_utis.load_cube('/data/cube_data/'+std_datestr(tim_date)+'_winds.nc') print radar1['radar_name'] print radar2['radar_name'] lvl=kwargs.get('lvl',3000.0) lvl_num=argsort(abs(radar1['levs']-lvl))[0] print "Level_num=", lvl_num Re=6371.0*1000.0 rad_at_radar=Re*sin(pi/2.0 -abs(radar1['radar_loc'][0]*pi/180.0)) lons=radar1['radar_loc'][1]+360.0*radar1['xar']/(rad_at_radar*2.0*pi) lats=radar1['radar_loc'][0] + 360.0*radar1['yar']/(Re*2.0*pi) ber_loc=[-12.457, 130.925] gp_loc=[-12.2492, 131.0444] angs=array(propigation.make_lobe_grid(radar2['radar_loc'], radar1['radar_loc'], lats,lons)) mywts=met.make_mask_bad1(radar2, radar1, angs, 1.0, 80.0) if ini_dict['cross'][0]=='max' or ini_dict['cross'][1]=='max': #maskedcz=radar1['CZ'][:,:,lvl_num]*mywts[:,:,lvl_num] #i,j=mathematics.where_closest_2d(maskedcz.max(), maskedcz) maskedw=radar1['w_array'][:,:,7]*mywts[:,:,7] i,j=mathematics.where_closest_2d(maskedw.max(), maskedw) print i,j lat=lats[j[0]] lon=lons[i[0]] print "Max w at ", lat, lon else: lon=ini_dict['cross'][1]#float(lonstr) lat=ini_dict['cross'][0]#float(latstr) f=figure() alat, alon, alvl=pres.plot_slices(lat, lon, lvl, radar1, lats, lons, radar1['levs'], radar1['u_array'], radar1['v_array'], radar1['w_array'], angs, mywts, par=parm, w_mag=1.0,box=ini_dict['pres_box'], bquiver=[0.05, 0.75], ksp=0.05,qscale=ini_dict['qscale']) t1='Gunn Point reflectivity (dBZ) and reconstructed winds (m/s)\n sliced at %(alat)2.2fS and %(alon)3.2fE and %(alvl)d Metres on %(day)02d/%(mon)02d/%(yr)04d at ' %{'day':tim_date.day, 'mon':tim_date.month, 'yr':tim_date.year,'alat':abs(alat), 'alon':alon, 'alvl':alvl} t2=" %(HH)02d%(MM)02dZ" %{'HH':tim_date.hour, 'MM':tim_date.minute} f.text( .1, .92, t1+t2) inte_part=1000*(float(int(lat))-lat) print {'alat':abs(alat), 'alon':alon, 'alvl':alvl} #ff=os.getenv('HOME')+'/bom_mds/output/recons_'+std_datestr(tim_date)[0:-5]+'/slicer3_%(alat)2.02f_%(alon)3.02f_%(alvl)05d_' %{'alat':abs(alat), 'alon':alon, 'alvl':alvl} ff=os.getenv('HOME')+'/bom_mds/output/tests/slicer_'+std_datestr(tim_date)+'_%(alat)2.02f_%(alon)3.02f_%(alvl)05d_' %{'alat':abs(alat), 'alon':alon, 'alvl':alvl} print ff savefig(ff+t2+'.png', dpi=200) close(f)
def recon(date_str, latstr, lonstr): use_guess='sonde' sonde_file='/bm/gdata/scollis/twpice/darwin.txt' #tim='1350' tim_date=num2date(datestr2num(date_str)) ber, gp=netcdf_utis.load_cube('/bm/gdata/scollis/cube_data/'+std_datestr(tim_date)+'_deal.nc') sonde_list=read_sounding.read_sounding_within_a_day(sonde_file, tim_date) #launch_dates=[sonde['date_list'][0] for sonde in sonde_list] #launch_date_offset=[date2num(sonde['date_list'][0])- date2num(tim_date) for sonde in sonde_list] #best_sonde=sonde_list[argsort(abs(array(launch_date_offset)))[0]] #print 'Time of radar: ', tim_date, ' Time of sonde_launch: ', best_sonde['date_list'][0], ' Time of sonde_termination: ', best_sonde['date_list'][-1] req=[ 'alt(m)', 'wspd(m/s)', 'tdry(degs)', 'wdir(degs)'] first_sonde, second_sonde=read_sounding.get_two_best_conc_sondes(date_str, req_vars=req) interp_sonde=read_sounding.interp_sonde_time(first_sonde, second_sonde, tim_date, gp['levs']) u_sonde=ones(gp['CZ'].shape, dtype=float) v_sonde=ones(gp['CZ'].shape, dtype=float) w_sonde=zeros(gp['CZ'].shape, dtype=float) for k in range(len(gp['levs'])): u_sonde[:,:,k]=-1.0*u_sonde[:,:,k]*interp_sonde['wspd(m/s)'][k]*sin(pi*interp_sonde['wdir(degs)'][k]/180.0) v_sonde[:,:,k]=-1.0*v_sonde[:,:,k]*interp_sonde['wspd(m/s)'][k]*cos(pi*interp_sonde['wdir(degs)'][k]/180.0) Re=6371.0*1000.0 rad_at_radar=Re*sin(pi/2.0 -abs(gp['zero_loc'][0]*pi/180.0))#ax_radius(float(lat_cpol), units='degrees') lons=gp['zero_loc'][1]+360.0*gp['xar']/(rad_at_radar*2.0*pi) lats=gp['zero_loc'][0] + 360.0*gp['yar']/(Re*2.0*pi) ber_loc=[-12.457, 130.925] gp_loc= [-12.2492, 131.0444] if use_guess=='none': igu=ones(ber['CZ'].shape, dtype=float)*0.0 igv=ones(ber['CZ'].shape, dtype=float)*0.0 igw=ones(ber['CZ'].shape, dtype=float)*0.0 elif use_guess=='sonde': igu=u_sonde igv=v_sonde igw=w_sonde else: ber_ig, gp_ig=netcdf_utis.load_cube(use_guess) print gp_ig.keys() igu=gp_ig['u_array'] igv=gp_ig['v_array'] igw=ones(ber['CZ'].shape, dtype=float)*0.0 #mywts=ones(ber['CZ'].shape, dtype=float) angs=array(propigation.make_lobe_grid(ber_loc, gp_loc, lats,lons)) #wts_ang=zeros(gp['CZ'][:,:,0].shape, dtype=float) #for i in range(angs.shape[0]): # for j in range(angs.shape[1]): # if (angs[i,j] < 150.0) and (angs[i,j] > 30.0): wts_ang[i,j]=1.0 #for lvl_num in range(len(gp['levs'])): # #create a weighting grid # mask_reflect=10.0#dBZ # mask=(gp['CZ'][:,:,lvl_num]/mask_reflect).round().clip(min=0., max=1.0) # mask_vel_ber=(ber['VR'][:,:,lvl_num]+100.).clip(min=0., max=1.) # mywts[:,:,lvl_num]=mask*mask_vel_ber*wts_ang mywts=met.make_mask(ber, gp, angs, 1.0, 80.0) print "Mean gp masked Velocity ", (gp['VE']*mywts).mean() print "min gp masked Velocity ", (gp['VE']*mywts).min() print "max gp masked Velocity ", (gp['VE']*mywts).max() print "Mean Berrimah masked Velocity ", (ber['VE']*mywts).mean() print "min Berrimah masked Velocity ", (ber['VE']*mywts).min() print "max Berrimah masked Velocity ", (ber['VE']*mywts).max() print "Mean gp masked CZ ", (gp['CZ']*mywts).mean() print "min gp masked CZ ", (gp['CZ']*mywts).min() print "max gp masked CZ ", (gp['CZ']*mywts).max() print "Mean Berrimah masked CZ ", (ber['CZ']*mywts).mean() print "min Berrimah masked CZ ", (ber['CZ']*mywts).min() print "max Berrimah masked CZ ", (ber['CZ']*mywts).max() print "Number of masked points", (mywts.shape[0]*mywts.shape[1]*mywts.shape[2])-mywts.sum() print "Number of unmasked points ", mywts.sum() print "**********************FALLSPEED INFO****************************" #def terminal_velocity(refl, temps, levs, display=False): tdry=interp_sonde['tdry(degs)'] pressure=interp_sonde['press(hPa)'] dummy=met.terminal_velocity(gp['CZ']*mywts, tdry, gp['levs'], display=True) print "**********************FALLSPEED INFO****************************" #print f=0.0 X=[igu,igv,igw] G,F,X=grad_conj_solver_3d.gracon_3d_packaged(X ,ber, gp, mywts, interp_sonde) u_array,v_array,w_array=X lvl=2500.0 lvl_num=argsort(abs(gp['levs']-lvl))[0] print "Level_num=", lvl_num if latstr=='max' or lonstr=='max': maskedcz=gp['CZ'][:,:,lvl_num]*mywts[:,:,lvl_num] i,j=mathematics.where_closest_2d(maskedcz.max(), maskedcz) print i,j lat=lats[j[0]] lon=lons[i[0]] print "Max CZ at ", lat, lon else: lon=float(lonstr) lat=float(latstr) f=figure() #(lat_sl, lon_sl, lvl, data_cube, lats, lons, levs, u, v, w, angs, mask, par='CZ', w_mag=2.0, **kwargs) alat, alon, alvl=pres.plot_slices(lat, lon, lvl, gp, lats, lons, gp['levs'], u_array, v_array, w_array, angs, mywts, par='CZ', w_mag=2.0,box=[130.5, 131.5, -12.7, -12.0], bquiver=[0.05, 0.75], ksp=0.05) t1='Gunn Point reflectivity (dBZ) and reconstructed winds (m/s, *2.0 for w)\n sliced at %(alat)2.2fS and %(alon)3.2fE and %(alvl)d Metres on 22/01/06 at ' %{'alat':abs(alat), 'alon':alon, 'alvl':alvl} t2=" %(HH)02d%(MM)02dZ" %{'HH':tim_date.hour, 'MM':tim_date.minute} f.text( .1, .92, t1+t2) inte_part=1000*(float(int(lat))-lat) print {'alat':abs(alat), 'alon':alon, 'alvl':alvl} ff=os.getenv('HOME')+'/bom_mds/output/recons_'+std_datestr(tim_date)[0:-5]+'/slicer3_%(alat)2.02f_%(alon)3.02f_%(alvl)05d_' %{'alat':abs(alat), 'alon':alon, 'alvl':alvl} print ff savefig(ff+t2+'.png', dpi=200) gp.update({'u_array':u_array, 'v_array':v_array, 'w_array':w_array}) netcdf_utis.save_data_cube(ber, gp, '/bm/gdata/scollis/cube_data/'+std_datestr(tim_date)+'_winds.nc', gp_loc) close(f)