Evaluation of LES against satellite and ground-based observations#
The below notebook compares selected simulations against observational targets that were collected from satellite and ground-based retrievals.
In case of questions or concerns, please notify Ann Fridlind (ann.fridlind@nasa.gov), Timothy Juliano (tjuliano@ucar.edu), and Florian Tornow (ft2544@columbia.edu).
%run functions_plotting.py
## select simulations to plot
sim_keyword = 'dx100_FixN.'
## load ERA5 fields
era5_1d, era5_2d = load_era5(PATH='../../data_files/')
## load radiosondes
rs_dat = load_rs(t_filter = 7.)
## load DOE ARM site statistics
kazrkollias_dat = load_kazrkollias(t_filter = 6.,aux_dat=rs_dat) ## here using radiosonde profiles to estimate CTT
kazrclough_dat = load_kazrclough(t_filter = 6.)
aeri_dat = load_aeri(t_filter = 0.5)
radflux_dat = load_radflux(t_filter = 6.)
srfflux_dat = load_flux(t_filter = 6.)
## load CARRA surface fluxes
carra_dat = load_carraflux()
## load MAC-LWP
maclwp_dat = load_maclwp(t_filter = 0.)
gongiwp_dat = load_iwpgong(t_filter = 0.)
## load MODIS, VIIRS, and SENTINEL retrievals
modis_dat = load_modis(t_filter = 0.,sza_filter = 65.)
viirs_dat = load_viirs(t_filter = 0.,sza_filter = 65.)
sentinel_dat = load_sentinel(t_filter = 0.,sza_filter = 65.)
## load CERES retrievals
ceres_dat = load_ceres(t_filter = 0.)
## load CALIPSO retrievals (note the increased time window)
calipso_dat = load_calipso(t_filter = 3.)
../../data_files/theta_temp_rh_sh_uvw_sst_along_trajectory_era5ml_28h_end_2020-03-13-18.nc
../../data_files/anxsondewnpnM1.b1.20200313.052700.cdf
../../data_files/anxsondewnpnM1.b1.20200313.112600.cdf
../../data_files/anxsondewnpnM1.b1.20200313.172600.cdf
../../data_files/anxsondewnpnM1.b1.20200313.232200.cdf
KAZR (Kollias): here using auxiliary field to estimate cloud-top temperature
np.sqrt(rs_dat[rs_dat['zf'] < 500].groupby('class').mean()['ua']**2 + rs_dat[rs_dat['zf'] < 500].groupby('class').mean()['va']**2) * 3600 / 1000
class
Radiosonde:112600 43.720516
Radiosonde:172600 44.006001
Radiosonde:232200 44.860786
dtype: float32
np.sqrt(rs_dat[rs_dat['zf'] < 500].mean()['ua']**2 + rs_dat[rs_dat['zf'] < 500].mean()['va']**2)
/tmp/ipykernel_1376/1032936237.py:1: FutureWarning: The default value of numeric_only in DataFrame.mean is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.
np.sqrt(rs_dat[rs_dat['zf'] < 500].mean()['ua']**2 + rs_dat[rs_dat['zf'] < 500].mean()['va']**2)
/tmp/ipykernel_1376/1032936237.py:1: FutureWarning: The default value of numeric_only in DataFrame.mean is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.
np.sqrt(rs_dat[rs_dat['zf'] < 500].mean()['ua']**2 + rs_dat[rs_dat['zf'] < 500].mean()['va']**2)
12.129359900322978
## load all simulations located in subfolders of the given directory
var_vec_1d = ['hfss','hfls','ts'] # variables with ERA5 (longer time axis)
var_vec_2d = ['theta','qv','ua','va']
df_col_1d,df_col_2d = load_sims('../../output_les/',var_vec_1d,var_vec_2d,t_shift=-2,keyword=sim_keyword,subfolder='s')
Loading variables: f(time)
../../output_les/dharma/sandbox/DHARMA_Lx125_dx100_FixN.nc
../../output_les/dharma/sandbox/DHARMA_Lx25_dx100_FixN.nc
../../output_les/icon/staged/ICON_Lx25_dx100_FixN.nc
../../output_les/sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
../../output_les/uclales-salsa/sandbox/UCLALES-SALSA_Lx25_dx100_FixN.nc
../../output_les/cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
../../output_les/wrf/sandbox/WRF_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_DM_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_SM_Lx25_dx100_FixN.nc
Loading variables: f(time,height)
../../output_les/dharma/sandbox/DHARMA_Lx125_dx100_FixN.nc
../../output_les/dharma/sandbox/DHARMA_Lx25_dx100_FixN.nc
../../output_les/icon/staged/ICON_Lx25_dx100_FixN.nc
../../output_les/sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
../../output_les/uclales-salsa/sandbox/UCLALES-SALSA_Lx25_dx100_FixN.nc
../../output_les/cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
../../output_les/wrf/sandbox/WRF_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_DM_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_SM_Lx25_dx100_FixN.nc
## plot variables that have only time dependence
plot_1d(pd.concat([df_col_1d,era5_1d,carra_dat,srfflux_dat]),var_vec_1d)
/opt/conda/lib/python3.10/site-packages/matplotlib/axes/_axes.py:1185: RuntimeWarning: All-NaN axis encountered
miny = np.nanmin(masked_verts[..., 1])
/opt/conda/lib/python3.10/site-packages/matplotlib/axes/_axes.py:1186: RuntimeWarning: All-NaN axis encountered
maxy = np.nanmax(masked_verts[..., 1])
%run functions_plotting.py
## load all simulations located in subfolders of the given directory
var_vec_1d = ['lwpr','lwpc','iwp','od'] # variables without ERA5 (shorter time axis)
var_vec_2d = ['theta','qv','qlc','qlr','ta','ua','va','qic','qis','qig','ua','va','ta','prf']
df_col_1d,df_col_2d = load_sims('../../output_les/',var_vec_1d,var_vec_2d,t_shift=-2,keyword=sim_keyword,diag_zi_ctt=True,subfolder='sand',ignore='ICON')
Loading variables: f(time)
../../output_les/dharma/sandbox/DHARMA_Lx125_dx100_FixN.nc
../../output_les/dharma/sandbox/DHARMA_Lx25_dx100_FixN.nc
../../output_les/sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
iwp not found in ../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
od not found in ../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
../../output_les/uclales-salsa/sandbox/UCLALES-SALSA_Lx25_dx100_FixN.nc
../../output_les/cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
../../output_les/wrf/sandbox/WRF_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_DM_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_SM_Lx25_dx100_FixN.nc
Loading variables: f(time,height)
../../output_les/dharma/sandbox/DHARMA_Lx125_dx100_FixN.nc
../../output_les/dharma/sandbox/DHARMA_Lx25_dx100_FixN.nc
../../output_les/sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
prf shows NAN values in ../../output_les/sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
prf not found in ../../output_les/DALES/sandbox/DALES_Lx25_dx100_FixN.nc
../../output_les/uclales-salsa/sandbox/UCLALES-SALSA_Lx25_dx100_FixN.nc
../../output_les/cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
prf not found in ../../output_les/cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
../../output_les/wrf/sandbox/WRF_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_DM_Lx25_dx100_FixN.nc
../../output_les/msu-rcc-les/sandbox/MSU_RCC_LES_SM_Lx25_dx100_FixN.nc
computing inversion height, cloud-top height, and cloud-top temperature
using liquid(-ice) potential temperature
DALES/sandbox/DALES_Lx25_dx100_FixN.nc
cm1-p3/sandbox/CM1-P3_Lx25_dx100_FixN.nc
dharma/sandbox/DHARMA_Lx125_dx100_FixN.nc
dharma/sandbox/DHARMA_Lx25_dx100_FixN.nc
msu-rcc-les/sandbox/MSU_RCC_LES_DM_Lx25_dx100_FixN.nc
msu-rcc-les/sandbox/MSU_RCC_LES_SM_Lx25_dx100_FixN.nc
sam-pnnl/sandbox/SAM_Lx25_dx100_FixN.nc
uclales-salsa/sandbox/UCLALES-SALSA_Lx25_dx100_FixN.nc
wrf/sandbox/WRF_Lx25_dx100_FixN.nc
## plot variables that have only time dependence
#plot_1d(pd.concat([df_col_1d,maclwp_dat,modis_dat,viirs_dat,sentinel_dat,kazrkollias_dat,kazrclough_dat,calipso_dat,radflux_dat]),['zi','od','lwp','iwp','ctt'])
plot_1d(pd.concat([df_col_1d,maclwp_dat,kazrkollias_dat,kazrclough_dat,calipso_dat,radflux_dat]),['cth','od','lwp','iwp','ctt'],longnames=['cloud-top height','cloud optical depth','liquid water path','ice water path','cloud-top temperature'],units=['m','','kg m^-2','kg m^-2','C'])
## plot variables that have only time dependence (for now excluding imager retrievals that are mostly SZA > 70)
#plot_1d(pd.concat([df_col_1d,maclwp_dat,kazrkollias_dat,kazrclough_dat,calipso_dat,gongiwp_dat,radflux_dat]),['od','lwp','iwp']) #'zi','od','lwp','iwp
/opt/conda/lib/python3.10/site-packages/matplotlib/axes/_axes.py:1185: RuntimeWarning: All-NaN axis encountered
miny = np.nanmin(masked_verts[..., 1])
/opt/conda/lib/python3.10/site-packages/matplotlib/axes/_axes.py:1186: RuntimeWarning: All-NaN axis encountered
maxy = np.nanmax(masked_verts[..., 1])
%run functions_plotting.py
## plot all variables that have time and height dependence
#plot_2d(df_col_2d,var_vec_2d,[0,3,6,9,12,15,18],z_max=6000)
## example where ERA5 and radiosonde are included
plot_2d(pd.concat([df_col_2d,era5_2d,rs_dat,aeri_dat]),var_vec = ['ta','theta','qv','ws','wd'],times=[-1.5,0,4,8,18],z_max=6000)
Computing wind speed
Computing wind direction
temporal averaging over 1.0 h interval
<Figure size 1000x600 with 0 Axes>
'ua' in df_col_2d.columns
True
df_col_2d.columns
Index(['class', 'time', 'zf', 'theta', 'qv', 'qlc', 'qlr', 'ta', 'ua', 'va',
'colflag'],
dtype='object')