diff --git a/lib/adf_variable_defaults.yaml b/lib/adf_variable_defaults.yaml index 60743359c..8ee5de766 100644 --- a/lib/adf_variable_defaults.yaml +++ b/lib/adf_variable_defaults.yaml @@ -69,7 +69,7 @@ # Available ADF Default Plot Types #+++++++++++++ default_ptypes: ["Tables","LatLon","LatLon_Vector","Zonal","Meridional", - "NHPolar","SHPolar","TimeSeries","Special"] + "NHPolar","SHPolar","TimeSeries","Special","WACCM"] #+++++++++++++ # Constants @@ -152,8 +152,6 @@ AODDUST: scale_factor: 1 add_offset: 0 new_unit: "" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" AODVIS: category: "Aerosols" @@ -164,8 +162,6 @@ AODVIS: scale_factor: 1 add_offset: 0 new_unit: "" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" AODVISdn: category: "Aerosols" @@ -179,44 +175,29 @@ AODVISdn: obs_file: "MOD08_M3_192x288_AOD_2001-2020_climo.nc" obs_name: "MODIS" obs_var_name: "AOD_550_Dark_Target_Deep_Blue_Combined_Mean_Mean" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENBC: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENDUST: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENPOM: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENSEASALT: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENSO4: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" BURDENSOA: category: "Aerosols" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] - pct_diff_colormap: "PuOr_r" DMS: category: "Aerosols" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -225,7 +206,6 @@ SO2: category: "Aerosols" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -234,7 +214,6 @@ SOAG: category: "Aerosols" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -250,7 +229,6 @@ BC: label : '$\mu$g/m3' category: "Aerosols" derivable_from: ["bc_a1", "bc_a4"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" POM: @@ -264,7 +242,6 @@ POM: label : '$\mu$g/m3' category: "Aerosols" derivable_from: ["pom_a1", "pom_a4"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SO4: @@ -279,7 +256,6 @@ SO4: category: "Aerosols" derivable_from: ["so4_a1", "so4_a2", "so4_a3"] derivable_from_cam_chem: ["so4_a1", "so4_a2", "so4_a3", "so4_a5"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SOA: @@ -294,7 +270,6 @@ SOA: category: "Aerosols" derivable_from: ["soa_a1", "soa_a2"] derivable_from_cam_chem: ["soa1_a1", "soa2_a1", "soa3_a1", "soa4_a1", "soa5_a1", "soa1_a2", "soa2_a2", "soa3_a2", "soa4_a2", "soa5_a2"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" DUST: @@ -310,7 +285,6 @@ DUST: label : '$\mu$g/m3' category: "Aerosols" derivable_from: ["dst_a1", "dst_a2", "dst_a3"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SeaSalt: @@ -330,7 +304,6 @@ SeaSalt: ticks: [-10,8,6,4,2,0,-2,-4,-6,-8,-10] category: "Aerosols" derivable_from: ["ncl_a1", "ncl_a2", "ncl_a3"] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" bc_a1: @@ -339,7 +312,6 @@ bc_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" bc_a4: category: "Aerosols" @@ -347,7 +319,6 @@ bc_a4: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" dst_a1: category: "Aerosols" @@ -355,7 +326,6 @@ dst_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" dst_a2: category: "Aerosols" @@ -363,7 +333,6 @@ dst_a2: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" dst_a3: category: "Aerosols" @@ -371,7 +340,6 @@ dst_a3: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" ncl_a1: category: "Aerosols" @@ -379,7 +347,6 @@ ncl_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" ncl_a2: category: "Aerosols" @@ -387,7 +354,6 @@ ncl_a2: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" ncl_a3: category: "Aerosols" @@ -395,7 +361,6 @@ ncl_a3: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" num_a1: category: "Aerosols" @@ -403,7 +368,6 @@ num_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" num_a2: category: "Aerosols" @@ -411,7 +375,6 @@ num_a2: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" num_a3: category: "Aerosols" @@ -419,7 +382,6 @@ num_a3: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" num_a4: category: "Aerosols" @@ -427,7 +389,6 @@ num_a4: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" num_a5: category: "Aerosols" @@ -435,7 +396,6 @@ num_a5: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" pom_a1: category: "Aerosols" @@ -443,7 +403,6 @@ pom_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" pom_a4: category: "Aerosols" @@ -451,7 +410,6 @@ pom_a4: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" so4_a1: category: "Aerosols" @@ -459,7 +417,6 @@ so4_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" so4_a2: category: "Aerosols" @@ -467,7 +424,6 @@ so4_a2: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" so4_a3: category: "Aerosols" @@ -475,7 +431,6 @@ so4_a3: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" soa_a1: category: "Aerosols" @@ -483,7 +438,6 @@ soa_a1: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" soa_a2: category: "Aerosols" @@ -491,7 +445,6 @@ soa_a2: diff_colormap: "gist_ncar" scale_factor: 1.0e-9 new_unit: "ug/kg" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SAD_TROP: category: "Aerosols" @@ -499,7 +452,6 @@ SAD_TROP: diff_colormap: "gist_ncar" scale_factor: 1.0 new_unit: "cm2/cm3" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SAD_AERO: category: "Aerosols" @@ -507,7 +459,6 @@ SAD_AERO: diff_colormap: "gist_ncar" scale_factor: 1.0 new_unit: "cm2/cm3" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SAD_SULFC: category: "Aerosols" @@ -515,7 +466,6 @@ SAD_SULFC: diff_colormap: "gist_ncar" scale_factor: 1.0 new_unit: "cm2/cm3" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -598,7 +548,6 @@ CO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -606,7 +555,6 @@ CO01: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -614,7 +562,6 @@ CO02: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -622,7 +569,6 @@ CO03: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -630,7 +576,6 @@ CO04: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -638,7 +583,6 @@ CO05: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -646,7 +590,6 @@ CO06: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -654,7 +597,6 @@ CO07: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -662,7 +604,6 @@ CO08: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -670,7 +611,6 @@ CO09: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -678,7 +618,6 @@ CO10: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -686,7 +625,6 @@ CO11: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -694,7 +632,6 @@ CO12: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -702,7 +639,6 @@ CO13: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -710,7 +646,6 @@ O3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -718,7 +653,6 @@ N2O: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -726,7 +660,6 @@ HNO3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -734,7 +667,6 @@ NO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000000.0 new_unit: "pptv" @@ -742,7 +674,6 @@ NO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000000.0 new_unit: "pptv" @@ -750,7 +681,6 @@ NOX: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000000.0 new_unit: "pptv" @@ -758,7 +688,6 @@ NOY: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000000.0 new_unit: "pptv" @@ -766,7 +695,6 @@ OH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000000.0 new_unit: "pptv" @@ -774,7 +702,6 @@ BIGALK: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -782,7 +709,6 @@ C2H4: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -790,7 +716,6 @@ C2H5O2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -798,7 +723,6 @@ C2H5OH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -806,7 +730,6 @@ C2H5OOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -814,7 +737,6 @@ C2H6: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -822,7 +744,6 @@ C3H6: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -830,7 +751,6 @@ C3H7O2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -838,7 +758,6 @@ C3H7OOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -846,7 +765,6 @@ C3H8: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -854,7 +772,6 @@ CCL4: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -862,7 +779,6 @@ CFC11: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -870,7 +786,6 @@ CFC113: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -878,7 +793,6 @@ CFC114: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -886,7 +800,6 @@ CFC115: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -894,7 +807,6 @@ CFC12: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -902,7 +814,6 @@ CH2O: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -910,7 +821,6 @@ CH3BR: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -918,7 +828,6 @@ CH3CCL3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -926,7 +835,6 @@ CH3CHO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -934,7 +842,6 @@ CH3CL: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -942,7 +849,6 @@ CH3CO3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -950,7 +856,6 @@ CH3COCH3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -958,7 +863,6 @@ CH3COCHO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -966,7 +870,6 @@ CH3COOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -974,7 +877,6 @@ CH3COOOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -982,7 +884,6 @@ CH3O2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -990,7 +891,6 @@ CH3OH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -998,7 +898,6 @@ CH3OOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1006,7 +905,6 @@ CH4: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1014,7 +912,6 @@ CHBR3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1022,7 +919,6 @@ CLO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1030,7 +926,6 @@ CLONO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1038,7 +933,6 @@ CLOX: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1046,7 +940,6 @@ CLOY: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1055,7 +948,6 @@ CO2: #contour_levels_range: [300,450,10.0] colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000.0 new_unit: "ppmv" @@ -1063,7 +955,6 @@ E90: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1071,7 +962,6 @@ GLYALD: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1079,7 +969,6 @@ GLYOXAL: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1087,7 +976,6 @@ H2402: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1095,7 +983,6 @@ H2O2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1103,7 +990,6 @@ H2SO4: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1111,7 +997,6 @@ HCFC141B: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1119,7 +1004,6 @@ HCFC142B: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1127,7 +1011,6 @@ HCFC22: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1135,7 +1018,6 @@ HCL: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1143,7 +1025,6 @@ HCL_GAS: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1151,7 +1032,6 @@ HNO3_GAS: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1159,7 +1039,6 @@ HO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1167,7 +1046,6 @@ HO2NO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1175,7 +1053,6 @@ HOBR: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1183,7 +1060,6 @@ HYAC: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1191,7 +1067,6 @@ HYDRALD: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1199,7 +1074,6 @@ ISOP: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1207,7 +1081,6 @@ ISOPNO3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1215,7 +1088,6 @@ ISOPO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1223,7 +1095,6 @@ ISOPOOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1231,7 +1102,6 @@ MACR: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1239,7 +1109,6 @@ MACRO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1247,7 +1116,6 @@ MACROOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1255,7 +1123,6 @@ MVK: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1263,7 +1130,6 @@ N2O5: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1271,7 +1137,6 @@ NH3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1279,7 +1144,6 @@ NH4: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1287,7 +1151,6 @@ NO3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1295,7 +1158,6 @@ O3S: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1303,7 +1165,6 @@ OCLO: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1311,7 +1172,6 @@ OCS: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1319,7 +1179,6 @@ ONITR: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1327,7 +1186,6 @@ PAN: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1335,7 +1193,6 @@ POOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1343,7 +1200,6 @@ RO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1351,7 +1207,6 @@ ROOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1359,7 +1214,6 @@ SO3: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1367,7 +1221,6 @@ SOAE: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1375,7 +1228,6 @@ TERP: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1383,7 +1235,6 @@ XO2: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1391,7 +1242,6 @@ XOOH: category: "Composition" colormap: "jet" diff_colormap: "gist_ncar" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" scale_factor: 1000000000.0 new_unit: "ppbv" @@ -1406,7 +1256,6 @@ CLDICE: obs_file: "CLDICE_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "CLDICE" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLDLIQ: @@ -1414,7 +1263,6 @@ CLDLIQ: obs_file: "CLDLIQ_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "CLDLIQ" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLDTOT: @@ -1429,7 +1277,6 @@ CLDTOT: obs_name: "ERAI" obs_var_name: "CLDTOT" category: "Clouds" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLDLOW: @@ -1444,7 +1291,6 @@ CLDLOW: obs_name: "ERAI" obs_var_name: "CLDLOW" category: "Clouds" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLDHGH: @@ -1459,7 +1305,6 @@ CLDHGH: obs_name: "ERAI" obs_var_name: "CLDHGH" category: "Clouds" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLDMED: @@ -1474,7 +1319,6 @@ CLDMED: obs_name: "ERAI" obs_var_name: "CLDMED" category: "Clouds" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLOUD: @@ -1489,7 +1333,6 @@ CLOUD: colorbar: label : "Percent" category: "Clouds" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CONCLD: @@ -1512,7 +1355,6 @@ TGCLDLWP: obs_var_name: "TGCLDLWP" obs_scale_factor: 1000 obs_add_offset: 0 - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TGCLDIWP: @@ -1532,7 +1374,6 @@ TGCLDIWP: obs_var_name: "TGCLDIWP" obs_scale_factor: 1000 obs_add_offset: 0 - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CCN3: @@ -1570,7 +1411,6 @@ PRECC: colorbar: label : "mm/d" category: "Hydrologic cycle" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PRECL: @@ -1585,7 +1425,6 @@ PRECL: colorbar: label : "mm d$^{-1}$" category: "Hydrologic cycle" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PRECSC: @@ -1600,7 +1439,6 @@ PRECSC: colorbar: label : "mm d$^{-1}$" category: "Hydrologic cycle" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PRECSL: @@ -1615,7 +1453,6 @@ PRECSL: colorbar: label : "mm d$^{-1}$" category: "Hydrologic cycle" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PRECT: @@ -1634,7 +1471,6 @@ PRECT: obs_var_name: "PRECT" category: "Hydrologic cycle" derivable_from: ['PRECL','PRECC'] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" QFLX: @@ -1665,7 +1501,6 @@ PSL: obs_file: "PSL_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "PSL" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PS: @@ -1683,7 +1518,6 @@ PS: obs_file: "PS_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "PS" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TREFHT: @@ -1707,7 +1541,6 @@ TS: obs_name: "ERAI" obs_var_name: "TS" category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SST: @@ -1726,17 +1559,14 @@ SST: obs_var_name: "TS" category: "Surface variables" mask: "ocean" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" U10: category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" Surface_Wind_Stress: category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TAUX: @@ -1745,7 +1575,6 @@ TAUX: category: "Surface variables" scale_factor: -1 add_offset: 0 - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TAUY: @@ -1754,22 +1583,18 @@ TAUY: category: "Surface variables" scale_factor: -1 add_offset: 0 - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" ICEFRAC: category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" OCNFRAC: category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" LANDFRAC: category: "Surface variables" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -1788,7 +1613,6 @@ TMQ: obs_name: "ERAI" obs_var_name: "PREH2O" category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" RELHUM: @@ -1806,7 +1630,6 @@ RELHUM: obs_name: "ERAI" obs_var_name: "RELHUM" category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" U: @@ -1826,7 +1649,6 @@ U: vector_pair: "V" vector_name: "Wind" category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" V: @@ -1846,7 +1668,6 @@ V: vector_pair: "U" vector_name: "Wind" category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" Q: @@ -1854,7 +1675,6 @@ Q: obs_file: "Q_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "Q" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" T: @@ -1862,7 +1682,6 @@ T: obs_file: "T_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "T" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" OMEGA: @@ -1870,32 +1689,26 @@ OMEGA: obs_file: "OMEGA_ERA5_monthly_climo_197901-202112.nc" obs_name: "ERA5" obs_var_name: "OMEGA" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" OMEGA500: category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PINT: category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PMID: category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" Z3: category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" Wind: category: "State" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -1904,12 +1717,10 @@ Wind: QRL: category: "Radiation" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" QRS: category: "Radiation" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -1929,7 +1740,6 @@ RESTOM: label : "W m$^{-2}$" category: "TOA energy flux" derivable_from: ['FLNT','FSNT'] - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SWCF: @@ -1949,7 +1759,6 @@ SWCF: obs_scale_factor: 1 obs_add_offset: 0 category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" LWCF: @@ -1967,7 +1776,6 @@ LWCF: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "toa_cre_lw_mon" category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSUTOA: @@ -1982,7 +1790,6 @@ FSUTOA: colorbar: label : "Wm$^{-2}$" category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSNT: @@ -2000,22 +1807,18 @@ FSNT: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "fsnt" category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSNTC: category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSNTOA: category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLUT: category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLNT: @@ -2033,7 +1836,6 @@ FLNT: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "toa_lw_all_mon" category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLNTC: @@ -2051,7 +1853,6 @@ FLNTC: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "toa_lw_clr_t_mon" category: "TOA energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -2060,12 +1861,10 @@ FLNTC: FSDS: category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSDSC: category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSNS: @@ -2083,7 +1882,6 @@ FSNS: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "sfc_net_sw_all_mon" category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FSNSC: @@ -2101,7 +1899,6 @@ FSNSC: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "sfc_net_sw_clr_t_mon" category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLDS: @@ -2119,22 +1916,18 @@ FLDS: obs_name: "CERES_EBAF_Ed4.1" obs_var_name: "sfc_lw_down_all_mon" category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLNS: category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FLNSC: category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SHFLX: category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" LHFLX: @@ -2152,7 +1945,6 @@ LHFLX: obs_name: "ERAI" obs_var_name: "LHFLX" category: "Sfc energy flux" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #+++++++++++++++++ @@ -2161,107 +1953,86 @@ LHFLX: CLDTOT_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLIMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" CLWMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" FISCCP1_COSP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" ICE_ICLD_VISTAU: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" IWPMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" LIQ_ICLD_VISTAU: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" LWPMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" MEANCLDALB_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" MEANPTOP_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" MEANTAU_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" MEANTB_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" MEANTBCLR_ISCCP: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" PCTMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" REFFCLIMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" REFFCLWMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" SNOW_ICLD_VISTAU: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TAUTMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TAUWMODIS: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TOT_CLD_VISTAU: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" TOT_ICLD_VISTAU: category: "COSP" - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" @@ -2279,96 +2050,167 @@ H2O: colorbar: label: "mol mol$^{-1}$" plot_log_pressure: True - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" OMEGAT: colormap: "PuOr_r" diff_colormap: "coolwarm" plot_log_pressure: True - pct_diff_contour_levels: [-100,-75,-50,-40,-30,-20,-10,-8,-6,-4,-2,0,2,4,6,8,10,20,30,40,50,75,100] pct_diff_colormap: "PuOr_r" #++++++++++++++ # Category: TEM #++++++++++++++ - -uzm: - ylim: [1e3,1] +UZM: + colormap: "RdYlBu_r" + contour_levels_range: [-60,61,8] + diff_colormap: "bwr" + diff_contour_range: [-35,36,5] + ylim: [1e3,1e-1] units: m s-1 - long_name: Zonal-Mean zonal wind + mpl: + colorbar: + #ticks: [-5,-1,-0.2,0.2,1,5] + label : "m/s" + long_name: Zonal mean zonal wind ($\bar{u}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "uzm" -vzm: - ylim: [1e3,1] +VZM: + ylim: [1e3,1e-1] units: m s-1 - long_name: Zonal-Mean meridional wind + long_name: Zonal-Mean meridional wind ($\bar{v}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "vzm" -epfy: - ylim: [1e2,1] - units: m3 s−2 - long_name: northward component of the Eliassen–Palm flux +THZM: + colormap: "Spectral_r" + contour_levels_range: [185,300,6] + diff_colormap: "bwr" + diff_contour_range: [-7,7.1,0.5] + ylim: [1e3,1e-1] + mpl: + colorbar: + label : "K" + long_name: Zonal mean potential temperature ($\bar{\theta}$) + obs_file: "TEM_ERA5.nc" + obs_name: "ERA5" + obs_var_name: "uzm" + +EPFY: + colormap: "RdYlBu_r" + contour_adjust: 1e7 + contour_levels: [-5e7,-4e7,-3e7,-2e7,-1e7,-0.8e7,-0.6e7,-0.4e7,-0.2e7,-0.1e7,0,0.1e7,0.2e7,0.4e7,0.6e7,0.8e7,1e7,2e7,3e7,4e7,5e7] + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-2e7,2.1e7,0.2e7] + ylim: [1e3,1e-1] + mpl: + colorbar: + label : "m3/s2" + long_name: EP Flux - meridional component ($F_{y}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "epfy" -epfz: - ylim: [1e2,1] - units: m3 s−2 - long_name: upward component of the Eliassen–Palm flux +EPFZ: + colormap: "RdYlBu_r" + contour_adjust: 1e6 + contour_levels: [-5e6,-4e6,-3e6,-2e6,-1e6,-0.8e6,-0.6e6,-0.4e6,-0.2e6,-0.1e6,0,0.1e6,0.2e6,0.4e6,0.6e6,0.8e6,1e6,2e6,3e6,4e6,5e6] + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-1e5,1.1e5,0.1e5] + ylim: [1e3,1e-1] + mpl: + colorbar: + label : "m3/s2" + long_name: EP Flux - vertical component ($F_{z}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "epfz" -vtem: - ylim: [1e2,1] - units: m/s - long_name: Transformed Eulerian mean northward wind +VTEM: + colormap: "RdYlBu_r" + contour_levels: [-5,-4,-3,-2,-1,-0.8,-0.6,-0.4,-0.2,-0.1,0,0.1,0.2,0.4,0.6,0.8,1,2,3,4,5] + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-2,2.1,0.2] + ylim: [1e3,1e-1] + mpl: + colorbar: + ticks: [-5,-1,-0.2,0.2,1,5] + label : "m/s" + long_name: TEM meridional wind ($\bar{v}^{*}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "vtem" -wtem: - ylim: [1e2,1] - units: m/s - long_name: Transformed Eulerian mean upward wind +WTEM: + colormap: "RdYlBu_r" + contour_levels: [-2,-1.7,-1.4,-1.1,-0.8,-0.65,-0.5,-0.35,-0.2,-0.1,0,0.1,0.2,0.35,0.5,0.65,0.8,1.1,1.4,1.7,2] + scale_factor: 100 + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-2,2.1,0.2] + ylim: [1e3,1e-1] + mpl: + colorbar: + ticks: [-2,-0.8,-0.2,0.2,0.8,2] + label : "cm/s" + units: cm/s + long_name: TEM vertical wind ($\bar{w}^{*}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "wtem" -psitem: - ylim: [1e2,1] - units: m3 s−2 - long_name: Transformed Eulerian mean mass stream function +PSITEM: + colormap: "RdYlBu_r" + contour_levels: [-3e11,-2e11,-1e11,-0.8e11,-0.6e11,-0.4e11,-0.2e11,-0.1e11,0,0.1e11,0.2e11,0.4e11,0.6e11,0.8e11,1e11,2e11,3e11] + contour_adjust: 1e11 + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-5e9,5.1e9,.5e9] + ylim: [1e3,1e-1] + mpl: + colorbar: + label : "kg/s" + units: kg/s + long_name: TEM mass stream function ($\bar{\chi}^{*}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "psitem" -utendepfd: - ylim: [1e2,1] - units: m3 s−2 - long_name: tendency of eastward wind due to Eliassen-Palm flux divergence +UTENDEPFD: + colormap: "RdYlBu_r" + contour_levels: [-0.3,-0.2,-0.1,-0.08,-0.06,-0.04,-0.02,-0.01,0,0.01,0.02,0.04,0.06,0.08,0.1,0.2,0.3] + non_linear_levels: True + diff_colormap: "bwr" + diff_contour_range: [-0.1,0.11,.01] + ylim: [1e3,1e-1] + mpl: + colorbar: + label : "mm/s2" + long_name: EP flux divergence ($\nabla \cdot F$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "utendepfd" -utendvtem: - ylim: [1e2,1] - units: m3 s−2 - long_name: tendency of eastward wind due to TEM northward wind advection and the coriolis term +UTENDVTEM: + colormap: "RdYlBu_r" + diff_colormap: "bwr" + ylim: [1e3,1e-1] + long_name: EP flux divergence - meridional component ($F_{yy}$) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "utendvtem" -utendwtem: - ylim: [1e2,1] - units: m3 s−2 - long_name: tendency of eastward wind due to TEM upward wind advection +UTENDWTEM: + colormap: "RdYlBu_r" + diff_colormap: "bwr" + ylim: [1e3,1e-1] + long_name: EP flux divergence - vertical component ($F_{zz}) obs_file: "TEM_ERA5.nc" obs_name: "ERA5" obs_var_name: "utendwtem" @@ -2456,8 +2298,8 @@ aod_diags: range_max: 100 range_min: -100 nlevel: 21 - colormap: "PuOr_r" + colormap: "bwr" #----------- -#End of File +#End of File \ No newline at end of file diff --git a/lib/adf_web.py b/lib/adf_web.py index e39981f8f..b6eeec201 100644 --- a/lib/adf_web.py +++ b/lib/adf_web.py @@ -55,7 +55,7 @@ class _WebData: needed by the website generator. """ - def __init__(self, web_data, web_name, case_name, + def __init__(self, web_data, web_name, case_name,ext="Mean", category = None, season = None, non_season = False, @@ -73,6 +73,7 @@ def __init__(self, web_data, web_name, case_name, self.season = season self.non_season = non_season self.plot_type = plot_type + self.ext = ext self.data_frame = data_frame self.html_file = html_file self.asset_path = asset_path @@ -193,7 +194,7 @@ def create_html(self): ######### - def add_website_data(self, web_data, web_name, case_name, + def add_website_data(self, web_data, web_name, case_name,ext="Mean", category = None, season = None, non_season = False, @@ -307,6 +308,7 @@ def add_website_data(self, web_data, web_name, case_name, season = season, non_season = non_season, plot_type = plot_type, + ext = ext, data_frame = data_frame, html_file = html_file, asset_path = asset_path, @@ -552,7 +554,6 @@ def jinja_enumerate(arg): #Initialize Ordered Dictionary for season: mean_html_info[ptype][category][var][season] = web_data.html_file.name - #Initialize Ordered Dictionary for non season kwarg: if ptype not in non_seasons: non_seasons[ptype] = OrderedDict() @@ -626,7 +627,6 @@ def jinja_enumerate(arg): #Check if the mean plot type page exists for this case (or for multi-case): mean_table_file = table_pages_dir / "mean_tables.html" - #Construct mean_table.html mean_table_tmpl = jinenv.get_template('template_mean_tables.html') #Reuse the rend_kwarg_dict @@ -635,7 +635,6 @@ def jinja_enumerate(arg): with open(mean_table_file, 'w', encoding='utf-8') as ofil: ofil.write(mean_table_rndr) #End with - #End if (tables) else: #Plot image @@ -654,20 +653,21 @@ def jinja_enumerate(arg): plot_types = plot_type_html #End if - rend_kwarg_dict = {"title": main_title, - "var_title": web_data.name, - "season_title": web_data.season, - "case_name": web_data.case, - "case_yrs": case_yrs, - "base_name": data_name, - "baseline_yrs": baseline_yrs, - "plottype_title": web_data.plot_type, - "imgs": img_data, - "mydata": mean_html_info[web_data.plot_type], - "plot_types": plot_types, - "seasons": seasons, - "non_seasons": non_seasons[web_data.plot_type]} + rend_kwarg_dict = {"title": main_title, + "var_title": web_data.name, + "ext": web_data.ext, + "season_title": web_data.season, + "case_name": web_data.case, + "case_yrs": case_yrs, + "base_name": data_name, + "baseline_yrs": baseline_yrs, + "plottype_title": web_data.plot_type, + "imgs": img_data, + "mydata": mean_html_info[web_data.plot_type], + "plot_types": plot_types, + "seasons": seasons, + "non_seasons": non_seasons[web_data.plot_type]} tmpl = jinenv.get_template('template.html') #Set template rndr = tmpl.render(rend_kwarg_dict) #The template rendered @@ -700,6 +700,7 @@ def jinja_enumerate(arg): if web_data.case == 'multi-case': plot_types = multi_plot_type_html else: + case1 = web_data.case plot_types = plot_type_html plot_types = plot_type_html #End if diff --git a/lib/plotting_functions.py b/lib/plotting_functions.py index 665af413f..59d56c893 100644 --- a/lib/plotting_functions.py +++ b/lib/plotting_functions.py @@ -91,6 +91,7 @@ import xarray as xr import pandas as pd import matplotlib as mpl +import matplotlib.cm as cm import cartopy.crs as ccrs #nice formatting for tick labels from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter @@ -99,6 +100,7 @@ from mpl_toolkits.axes_grid1.inset_locator import inset_axes from matplotlib.lines import Line2D import matplotlib.cm as cm +from pathlib import Path from adf_diag import AdfDiag from adf_base import AdfError @@ -129,7 +131,6 @@ def my_formatwarning(msg, *args, **kwargs): "SON": [9, 10, 11] } - ################# #HELPER FUNCTIONS ################# @@ -151,6 +152,7 @@ def load_dataset(fils): ----- When just one entry is provided, use `open_dataset`, otherwise `open_mfdatset` """ + if len(fils) == 0: warnings.warn(f"\t WARNING: Input file list is empty.") return None @@ -174,6 +176,36 @@ def use_this_norm(): return mpl.colors.TwoSlopeNorm, mplversion[0] +def check_obs_file(adfobj, filepath): + """ + Check whether provided obs file is in ADF defaults or a user supplied location + + Usually the ADF takes care of this, but only for variables in the variable defaults yaml file. + - This is different since the object being called form variable defaults yaml file is plot related + not variable related, we need a check. + + * If only file name is provided, we assume the file exists in the ADF default obs location + * If a full path and filename are provided, then the we assume it is a user supplied obs location + + returns: full file path and name + """ + + adf_obs_loc = Path(adfobj.get_basic_info("obs_data_loc")) + obs_filepath = adf_obs_loc / filepath.parts[-1] + + #Check the file path structure + if str(filepath.parent) == ".": + if obs_filepath.exists(): + return obs_filepath + else: + print(f"'{filepath.parts[-1]}' is not in the ADF obs default location, please check the spelling") + print("Or supply your own path to this file!") + return + else: + print(f"User is providing obs file: '{filepath}'") + return filepath + + def get_difference_colors(values): """Provide a color norm and colormap assuming this is a difference field. @@ -306,6 +338,25 @@ def get_central_longitude(*args): ####### +def coslat_average(darray, lat1, lat2): + """ + Calculate the weighted average for an [:,lat] array over the region + lat1 to lat2 + """ + + # flip latitudes if they are decreasing + if (darray.lat[0] > darray.lat[darray.lat.size -1]): + print("flipping latitudes") + darray = darray.sortby('lat') + + region = darray.sel(lat=slice(lat1, lat2)) + weights=np.cos(np.deg2rad(region.lat)) + regionw = region.weighted(weights) + regionm = regionw.mean("lat") + + return regionm +####### + def global_average(fld, wgt, verbose=False): """A simple, pure numpy global average. @@ -759,8 +810,6 @@ def make_polar_plot(wks, case_nickname, base_nickname, if max(np.abs(levelsdiff)) > 10*absmaxdif: levelsdiff = np.linspace(-1*absmaxdif, absmaxdif, 12) - - #End if #------------------------------- @@ -1237,7 +1286,7 @@ def plot_map_and_save(wks, case_nickname, base_nickname, #End if # generate dictionary of contour plot settings: - cp_info = prep_contour_plot(mdlfld, obsfld, diffld, pctld, **kwargs) + cp_info = prep_contour_plot(mdlfld, obsfld, diffld, **kwargs) # specify the central longitude for the plot central_longitude = kwargs.get('central_longitude', 180) @@ -1347,7 +1396,6 @@ def plot_map_and_save(wks, case_nickname, base_nickname, borderpad=0, ) fig.colorbar(img[1], cax=cb_mean_ax, **cp_info['colorbar_opt']) - cb_pct_ax = inset_axes(ax3, width="5%", # width = 5% of parent_bbox width @@ -1376,7 +1424,6 @@ def plot_map_and_save(wks, case_nickname, base_nickname, #Close plots: plt.close() - # # -- vertical interpolation code -- # @@ -1796,7 +1843,7 @@ def meridional_plot(lon, data, ax=None, color=None, **kwargs): ax = _meridional_plot_line(ax, lon, data, color, **kwargs) return ax -def prep_contour_plot(adata, bdata, diffdata, pctdata, **kwargs): +def prep_contour_plot(adata, bdata, diffdata, **kwargs): """Preparation for making contour plots. Prepares for making contour plots of adata, bdata, diffdata, and pctdata, which is @@ -1840,30 +1887,38 @@ def prep_contour_plot(adata, bdata, diffdata, pctdata, **kwargs): if 'colormap' in kwargs: cmap1 = kwargs['colormap'] + # Check if the colormap name exists in Matplotlib + if cmap1 not in plt.colormaps(): + print(f"{cmap1} is not a matplotlib standard color map. Defaulting to 'coolwarm' for test/base plots") + cmap1 = 'coolwarm' else: cmap1 = 'coolwarm' #End if - if 'contour_levels' in kwargs: + if 'contour_levels' in kwargs: # list: Check if contours are specified as list levels1 = kwargs['contour_levels'] - if ('non_linear' in kwargs) and (kwargs['non_linear']): + # Check if any item in the list is a string + contains_string = any(isinstance(item, str) for item in levels1) + if contains_string: + levels1 = [float(item) for item in levels1] + if ('non_linear_levels' in kwargs) and (kwargs['non_linear_levels']): cmap_obj = cm.get_cmap(cmap1) norm1 = mpl.colors.BoundaryNorm(levels1, cmap_obj.N) else: norm1 = mpl.colors.Normalize(vmin=min(levels1), vmax=max(levels1)) - elif 'contour_levels_range' in kwargs: + elif 'contour_levels_range' in kwargs: # arange: Check if the user wants to generate a list from start, stop, step assert len(kwargs['contour_levels_range']) == 3, \ "contour_levels_range must have exactly three entries: min, max, step" levels1 = np.arange(*kwargs['contour_levels_range']) - if ('non_linear' in kwargs) and (kwargs['non_linear']): + if ('non_linear_levels' in kwargs) and (kwargs['non_linear_levels']): cmap_obj = cm.get_cmap(cmap1) norm1 = mpl.colors.BoundaryNorm(levels1, cmap_obj.N) else: norm1 = mpl.colors.Normalize(vmin=min(levels1), vmax=max(levels1)) - else: + else: # linspace: Check if user wants to generate a list from start, stop, num_steps levels1 = np.linspace(minval, maxval, 12) - if ('non_linear' in kwargs) and (kwargs['non_linear']): + if ('non_linear_levels' in kwargs) and (kwargs['non_linear_levels']): cmap_obj = cm.get_cmap(cmap1) norm1 = mpl.colors.BoundaryNorm(levels1, cmap_obj.N) else: @@ -1889,17 +1944,29 @@ def prep_contour_plot(adata, bdata, diffdata, pctdata, **kwargs): # Difference options -- Check in kwargs for colormap and levels if "diff_colormap" in kwargs: cmapdiff = kwargs["diff_colormap"] + # Check if the colormap name exists in Matplotlib + if cmapdiff not in plt.colormaps(): + print(f"{cmapdiff} is not a matplotlib standard color map. Defaulting to 'PuOr_r' for difference plots") + cmapdiff = 'PuOr_r' else: - cmapdiff = 'coolwarm' + cmapdiff = "PuOr_r" #End if if "diff_contour_levels" in kwargs: levelsdiff = kwargs["diff_contour_levels"] # a list of explicit contour levels + contains_string = any(isinstance(item, str) for item in levelsdiff) + if contains_string: + levelsdiff = [float(item) for item in levelsdiff] elif "diff_contour_range" in kwargs: assert len(kwargs['diff_contour_range']) == 3, \ "diff_contour_range must have exactly three entries: min, max, step" + contains_string = any(isinstance(item, str) for item in kwargs['diff_contour_range']) + if contains_string: + levelsdiff_convert = [float(item) for item in kwargs['diff_contour_range']] - levelsdiff = np.arange(*kwargs['diff_contour_range']) + levelsdiff = np.arange(*levelsdiff_convert) + else: + levelsdiff = np.arange(*kwargs['diff_contour_range']) else: # set a symmetric color bar for diff: absmaxdif = np.max(np.abs(diffdata)) @@ -1932,6 +1999,7 @@ def prep_contour_plot(adata, bdata, diffdata, pctdata, **kwargs): normdiff = normfunc(vmin=np.min(levelsdiff), vmax=np.max(levelsdiff), vcenter=0.0) else: normdiff = mpl.colors.Normalize(vmin=np.min(levelsdiff), vmax=np.max(levelsdiff)) + #End if subplots_opt = {} contourf_opt = {} @@ -2039,7 +2107,7 @@ def plot_zonal_mean_and_save(wks, case_nickname, base_nickname, pct = pct.fillna(0.0) # generate dictionary of contour plot settings: - cp_info = prep_contour_plot(azm, bzm, diff, pct, **kwargs) + cp_info = prep_contour_plot(azm, bzm, diff, **kwargs) # Generate zonal plot: fig, ax = plt.subplots(figsize=(10,10),nrows=4, constrained_layout=True, sharex=True, sharey=True,**cp_info['subplots_opt']) @@ -2273,7 +2341,7 @@ def plot_meridional_mean_and_save(wks, case_nickname, base_nickname, if has_lev: # generate dictionary of contour plot settings: - cp_info = prep_contour_plot(adata, bdata, diff, pct, **kwargs) + cp_info = prep_contour_plot(adata, bdata, diff, **kwargs) # generate plot objects: fig, ax = plt.subplots(figsize=(10,10),nrows=4, constrained_layout=True, sharex=True, sharey=True,**cp_info['subplots_opt']) @@ -2483,7 +2551,7 @@ def square_contour_difference(fld1, fld2, **kwargs): else: dnorm = mpl.colors.TwoSlopeNorm(vmin=dmin, vcenter=0, vmax=dmax) cmap = mpl.cm.RdBu_r - + img3 = ax3.contourf(xx, yy, diff.transpose(), cmap=cmap, norm=dnorm) if (coord1 == 'month') and (fld1.shape[0] ==12): ax3.set_xticks(np.arange(1,13)) diff --git a/lib/website_templates/template_mean_diag.html b/lib/website_templates/template_mean_diag.html index a62250af8..ed9c5b949 100644 --- a/lib/website_templates/template_mean_diag.html +++ b/lib/website_templates/template_mean_diag.html @@ -52,7 +52,7 @@

{{ category }}

{% for i,season in enumerate(ptype_seas.keys()) %} {% if i==0 %}
- {{var_name}}
+ {{var_name}}
{% endif %} {% endfor %} @@ -61,7 +61,7 @@

{{ category }}

{% for season in ptype_seas.keys() %} {% if season == list(ptype_seas.keys())[0] %}
- {{var_name}}
+ {{var_name}}
{% endif %} {% endfor %} diff --git a/scripts/averaging/create_TEM_files.py b/scripts/averaging/create_TEM_files.py index 61acf7f85..4cdc0bc2d 100644 --- a/scripts/averaging/create_TEM_files.py +++ b/scripts/averaging/create_TEM_files.py @@ -33,10 +33,10 @@ def create_TEM_files(adf): res = adf.variable_defaults # will be dict of variable-specific plot preferences if "qbo" in adf.plotting_scripts: - var_list = ['uzm','epfy','epfz','vtem','wtem', - 'psitem','utendepfd','utendvtem','utendwtem'] + var_list = ["UZM","THZM","EPFY","EPFZ","VTEM","WTEM", + "PSITEM","UTENDEPFD","UTENDVTEM","UTENDWTEM"] else: - var_list = ['uzm','epfy','epfz','vtem','wtem','psitem','utendepfd'] + var_list = ["UZM","THZM","EPFY","EPFZ","VTEM","WTEM","PSITEM","UTENDEPFD"] tem_locs = [] @@ -62,9 +62,9 @@ def create_TEM_files(adf): #End for #Set default to h4 - hist_nums = adf.get_cam_info("tem_hist_str") + hist_nums = adf.get_cam_info("tem_hist_str")[0] if hist_nums is None: - hist_nums = ["h4"]*len(case_names) + hist_nums = ["h4a"]*len(case_names) #Get test case(s) tem over-write boolean and force to list if not by default overwrite_tem_cases = adf.get_cam_info("overwrite_tem") @@ -154,7 +154,7 @@ def create_TEM_files(adf): #Set default to h4 hist_num = adf.get_baseline_info("tem_hist_str") if hist_num is None: - hist_num = "h4" + hist_num = "h4a" #Extract baseline years (which may be empty strings if using Obs): syear_baseline = adf.climo_yrs["syear_baseline"] @@ -200,8 +200,9 @@ def create_TEM_files(adf): #End if #Check if history files actually exist. If not then kill script: - hist_str = f"*{hist_nums[case_idx]}" - if not list(starting_location.glob(hist_str+'.*.nc')): + + hist_str = f"{hist_nums[case_idx]}" + if not list(starting_location.glob("*"+hist_str+'.*.nc')): emsg = f"No CAM history {hist_str} files found in '{starting_location}'." emsg += " Script is ending here." adf.end_diag_fail(emsg) @@ -237,7 +238,7 @@ def create_TEM_files(adf): #Grab all leading zeros for climo year just in case yr = f"{str(yr).zfill(4)}" - hist_files.append(glob(f"{starting_location}/{hist_str}.{yr}*.nc")) + hist_files.append(glob(f"{starting_location}/*{hist_str}.{yr}*.nc")) #Flatten list of lists to 1d list hist_files = sorted(list(chain.from_iterable(hist_files))) @@ -423,6 +424,9 @@ def calc_tem(ds): vzm.attrs['long_name'] = 'Zonal-Mean meridional wind' vzm.attrs['units'] = 'm/s' + thzm.attrs['long_name'] = 'Zonal-Mean potential temperature' + thzm.attrs['units'] = 'K' + epfy.attrs['long_name'] = 'northward component of E-P flux' epfy.attrs['units'] = 'm3/s2' @@ -455,19 +459,28 @@ def calc_tem(ds): utendvtem.values = np.float32(utendvtem.values) utendwtem.values = np.float32(utendwtem.values) + #Average time dimension over time bounds, if bounds exist: + if 'time_bnds' in ds: + time_bounds_name = 'time_bnds' + elif 'time_bounds' in ds: + time_bounds_name = 'time_bounds' + dstem = xr.Dataset(data_vars=dict(date = ds.date, datesec = ds.datesec, - time_bnds = ds.time_bnds, - uzm = uzm, - vzm = vzm, - epfy = epfy, - epfz = epfz, - vtem = vtem, - wtem = wtem, - psitem = psitem, - utendepfd = utendepfd, - utendvtem = utendvtem, - utendwtem = utendwtem + time_bnds = time_bounds_name, + hybm=ds.hybm, + hyam=ds.hyam, + UZM = uzm, + VZM = vzm, + THZM = thzm, + EPFY = epfy, + EPFZ = epfz, + VTEM = vtem, + WTEM = wtem, + PSITEM = psitem, + UTENDEPFD = utendepfd, + UTENDVTEM = utendvtem, + UTENDWTEM = utendwtem )) return dstem \ No newline at end of file diff --git a/scripts/plotting/global_latlon_map.py b/scripts/plotting/global_latlon_map.py index ab37eb274..725718917 100644 --- a/scripts/plotting/global_latlon_map.py +++ b/scripts/plotting/global_latlon_map.py @@ -99,7 +99,12 @@ def global_latlon_map(adfobj): # # Use ADF api to get all necessary information # + + #Variable list var_list = adfobj.diag_var_list + #Remove unneccasry vairbale from plotting + if "PMID" in var_list: + var_list.remove("PMID") #Special ADF variable which contains the output paths for #all generated plots and tables for each case: plot_locations = adfobj.plot_location diff --git a/scripts/plotting/global_latlon_vect_map.py b/scripts/plotting/global_latlon_vect_map.py index e5e3ff5ca..0b6811095 100644 --- a/scripts/plotting/global_latlon_vect_map.py +++ b/scripts/plotting/global_latlon_vect_map.py @@ -52,7 +52,12 @@ def global_latlon_vect_map(adfobj): # # Use ADF api to get all necessary information # + #Variable list var_list = adfobj.diag_var_list + #Remove unneccasry vairbale from plotting + if "PMID" in var_list: + var_list.remove("PMID") + model_rgrid_loc = adfobj.get_basic_info("cam_regrid_loc", required=True) #Special ADF variable which contains the output path for diff --git a/scripts/plotting/global_mean_timeseries.py b/scripts/plotting/global_mean_timeseries.py index 74bb3ee93..15f812369 100644 --- a/scripts/plotting/global_mean_timeseries.py +++ b/scripts/plotting/global_mean_timeseries.py @@ -318,4 +318,4 @@ def make_plot(case_ts, lens2, label=None, ref_ts_da=None): ############## -#END OF SCRIPT +#END OF SCRIPT \ No newline at end of file diff --git a/scripts/plotting/meridional_mean.py b/scripts/plotting/meridional_mean.py index 4e4933bbe..46bbadbbc 100644 --- a/scripts/plotting/meridional_mean.py +++ b/scripts/plotting/meridional_mean.py @@ -27,7 +27,12 @@ def meridional_mean(adfobj): #Extract needed quantities from ADF object: #----------------------------------------- + #Variable list var_list = adfobj.diag_var_list + #Remove unneccasry vairbale from plotting + if "PMID" in var_list: + var_list.remove("PMID") + model_rgrid_loc = adfobj.get_basic_info("cam_regrid_loc", required=True) #Special ADF variable which contains the output paths for diff --git a/scripts/plotting/polar_map.py b/scripts/plotting/polar_map.py index dbcfcff70..00f41237d 100644 --- a/scripts/plotting/polar_map.py +++ b/scripts/plotting/polar_map.py @@ -23,7 +23,12 @@ def polar_map(adfobj): # # Use ADF api to get all necessary information # + #Variable list var_list = adfobj.diag_var_list + #Remove unneccasry vairbale from plotting + if "PMID" in var_list: + var_list.remove("PMID") + model_rgrid_loc = adfobj.get_basic_info("cam_regrid_loc", required=True) #Special ADF variable which contains the output paths for diff --git a/scripts/plotting/tem.py b/scripts/plotting/tem.py index 34bcb95eb..7f6166f64 100644 --- a/scripts/plotting/tem.py +++ b/scripts/plotting/tem.py @@ -4,7 +4,11 @@ import xarray as xr import warnings # use to warn user about missing files. import matplotlib.pyplot as plt -import pandas as pd +import matplotlib as mpl +import metpy.calc.thermo as thermo +from metpy.units import units + +import plotting_functions as pf #Format warning messages: def my_formatwarning(msg, *args, **kwargs): @@ -45,6 +49,15 @@ def tem(adf): res = adf.variable_defaults # will be dict of variable-specific plot preferences + #Check if comparing against observations + if adf.compare_obs: + obs = True + base_name = "Obs" + else: + obs = False + base_name = adf.get_baseline_info("cam_case_name", required=True) + #End if + #Extract test case years syear_cases = adf.climo_yrs["syears"] eyear_cases = adf.climo_yrs["eyears"] @@ -56,7 +69,6 @@ def tem(adf): #Grab all case nickname(s) test_nicknames = adf.case_nicknames["test_nicknames"] base_nickname = adf.case_nicknames["base_nickname"] - case_nicknames = test_nicknames + [base_nickname] #Set plot file type: # -- this should be set in basic_info_dict, but is not required @@ -102,11 +114,13 @@ def tem(adf): #Suggestion from Rolando, if QBO is being produced, add utendvtem and utendwtem? if "qbo" in adf.plotting_scripts: - var_list = ['uzm','epfy','epfz','vtem','wtem', - 'psitem','utendepfd','utendvtem','utendwtem'] - #Otherwise keep it simple + var_list = ["UZM","THZM","EPFY","EPFZ","VTEM","WTEM", + "PSITEM","UTENDEPFD","UTENDVTEM","UTENDWTEM"] else: - var_list = ['uzm','epfy','epfz','vtem','wtem','psitem','utendepfd'] + var_list = ["UZM","THZM","EPFY","EPFZ","VTEM","WTEM","PSITEM","UTENDEPFD"] + + #Baseline TEM location + input_loc_idx = Path(tem_base_loc) #Check if comparing against obs if adf.compare_obs: @@ -115,372 +129,343 @@ def tem(adf): base_file_name = 'Obs.TEMdiag.nc' input_loc_idx = Path(tem_locs[0]) else: - base_name = adf.get_baseline_info("cam_case_name", required=True) - - #If path not specified, skip TEM calculation? - if tem_base_loc is None: - print(f"\t 'cam_tem_loc' not found for '{base_name}' in config file, so no TEM plots will be generated.") - return - else: - obs = False - input_loc_idx = Path(tem_base_loc) - #Set TEM file for baseline - base_file_name = f'{base_name}.TEMdiag_{syear_baseline}-{eyear_baseline}.nc' + #Set TEM file for baseline + base_file_name = f'{base_name}.TEMdiag_{syear_baseline}-{eyear_baseline}.nc' #Set full path for baseline/obs file tem_base = input_loc_idx / base_file_name - - #Check to see if baseline/obs TEM file exists + + #Check to see if baseline/obs TEM file exists if tem_base.is_file(): - ds_base = xr.open_dataset(tem_base) + ds_base = xr.open_dataset(tem_base, decode_times=False) else: print(f"\t'{base_file_name}' does not exist. TEM plots will be skipped.") return - #Setup TEM plots - nrows = len(var_list) - ncols = len(case_nicknames)+1 - fig_width = 20 - - #try and dynamically create size of fig based off number of cases - fig_height = 15+(ncols*nrows) - - #Loop over season dictionary: - for s in seasons: - #Location to save plots - plot_name = plot_location / f"{s}_TEM_Mean.png" - - # Check redo_plot. If set to True: remove old plot, if it already exists: - if (not redo_plot) and plot_name.is_file(): - #Add already-existing plot to website (if enabled): - adf.debug_log(f"'{plot_name}' exists and clobber is false.") - adf.add_website_data(plot_name, "TEM", None, season=s, multi_case=True) - - #Continue to next iteration: - continue - elif (redo_plot) and plot_name.is_file(): - plot_name.unlink() - - fig, axs = plt.subplots(nrows=nrows, ncols=ncols, figsize=(fig_width,fig_height), - facecolor='w', edgecolor='k') + """if 'time_bnds' in ds_base: + t = ds_base['time_bnds'].mean(dim='nbnd') + t.attrs = ds_base['time'].attrs + ds_base = ds_base.assign_coords({'time':t}) + elif 'time_bounds' in ds_base: + t = ds_base['time_bounds'].mean(dim='nbnd') + t.attrs = ds_base['time'].attrs + ds_base = ds_base.assign_coords({'time':t}) + else: + warnings.warn("\t INFO: Timeseries file does not have time bounds info.")""" + ds_base = xr.decode_cf(ds_base) + + input_ts_locs = adf.get_cam_info("cam_ts_loc", required=True) + + #Loop over variables: + for var in var_list: + #Notify user of variable being plotted: + print(f"\t - TEM plots for {var}") #Loop over model cases: for idx,case_name in enumerate(case_names): + tem_loc = tem_case_locs[idx] + #Extract start and end year values: start_year = syear_cases[idx] end_year = eyear_cases[idx] #Open the TEM file - output_loc_idx = tem_locs[idx] + output_loc_idx = Path(tem_loc) case_file_name = f'{case_name}.TEMdiag_{start_year}-{end_year}.nc' - tem = output_loc_idx / case_file_name + tem_case = output_loc_idx / case_file_name #Grab the data for the TEM netCDF files - if tem.is_file(): - ds = xr.open_dataset(tem) + if tem_case.is_file(): + ds = xr.open_dataset(tem_case) else: - print(f"\t'{case_file_name}' does not exist. TEM plots will be skipped.") + print(f"\t'{tem_case}' does not exist. TEM plots will be skipped.") return - - climo_yrs = {"test":[syear_cases[idx], eyear_cases[idx]], - "base":[syear_baseline, eyear_baseline]} - - #Setup and plot the sub-plots - tem_plot(ds, ds_base, case_nicknames, axs, s, var_list, res, obs, climo_yrs) - - #Set figure title - plt.suptitle(f'TEM Diagnostics: {s}', fontsize=20, y=.928) - - #Write the figure to provided workspace/file: - fig.savefig(plot_name, bbox_inches='tight', dpi=300) - - #Add plot to website (if enabled): - adf.add_website_data(plot_name, "TEM", None, season=s, multi_case=True) - + if 'time_bnds' in ds: + t = ds['time_bnds'].mean(dim='nbnd') + t.attrs = ds['time'].attrs + ds = ds.assign_coords({'time':t}) + elif 'time_bounds' in ds: + t = ds['time_bounds'].mean(dim='nbnd') + t.attrs = ds['time'].attrs + ds = ds.assign_coords({'time':t}) + else: + warnings.warn("\t INFO: Timeseries file does not have time bounds info.") + ds = xr.decode_cf(ds) + + #Loop over season dictionary: + for s in seasons: + + #Location to save plots + plot_name = plot_location / f"{var}_{s}_WACCM_SeasonalCycle_Mean.png" + + # Check redo_plot. If set to True: remove old plot, if it already exists: + if (not redo_plot) and plot_name.is_file(): + #Add already-existing plot to website (if enabled): + adf.debug_log(f"'{plot_name}' exists and clobber is false.") + adf.add_website_data(plot_name, var, None, season=s, plot_type="WACCM",ext="SeasonalCycle_Mean",category="TEM",multi_case=True) + + #plot_name = plot_loc / f"CPT_ANN_WACCM_SeasonalCycle_Mean.{plot_type}" + elif ((redo_plot) and plot_name.is_file()) or (not plot_name.is_file()): + if plot_name.is_file(): + plot_name.unlink() + + #Grab variable defaults for this variable + vres = res[var] + + #Gather data for both cases + mdata = ds[var].squeeze() + odata = ds_base[var].squeeze() + + # APPLY UNITS TRANSFORMATION IF SPECIFIED: + # NOTE: looks like our climo files don't have all their metadata + mdata = mdata * vres.get("scale_factor",1) + vres.get("add_offset", 0) + # update units + mdata.attrs['units'] = vres.get("new_unit", mdata.attrs.get('units', 'none')) + + # Do the same for the baseline case if need be: + if not obs: + odata = odata * vres.get("scale_factor",1) + vres.get("add_offset", 0) + # update units + odata.attrs['units'] = vres.get("new_unit", odata.attrs.get('units', 'none')) + # Or for observations + else: + odata = odata * vres.get("obs_scale_factor",1) + vres.get("obs_add_offset", 0) + # Note: we are going to assume that the specification ensures the conversion makes the units the same. Doesn't make sense to add a different unit. + + #Create array to avoid weighting missing values: + md_ones = xr.where(mdata.isnull(), 0.0, 1.0) + od_ones = xr.where(odata.isnull(), 0.0, 1.0) + + month_length = mdata.time.dt.days_in_month + weights = (month_length.groupby("time.season") / month_length.groupby("time.season").sum()) + + #Calculate monthly-weighted seasonal averages: + if s == 'ANN': + + #Calculate annual weights (i.e. don't group by season): + weights_ann = month_length / month_length.sum() + + mseasons = (mdata * weights_ann).sum(dim='time') + mseasons = mseasons / (md_ones*weights_ann).sum(dim='time') + + #Calculate monthly weights based on number of days: + if obs: + month_length_obs = odata.time.dt.days_in_month + weights_ann_obs = month_length_obs / month_length_obs.sum() + oseasons = (odata * weights_ann_obs).sum(dim='time') + oseasons = oseasons / (od_ones*weights_ann_obs).sum(dim='time') + else: + month_length_base = odata.time.dt.days_in_month + weights_ann_base = month_length_base / month_length_base.sum() + oseasons = (odata * weights_ann_base).sum(dim='time') + oseasons = oseasons / (od_ones*weights_ann_base).sum(dim='time') + + else: + #this is inefficient because we do same calc over and over + mseasons = (mdata * weights).groupby("time.season").sum(dim="time").sel(season=s) + wgt_denom = (md_ones*weights).groupby("time.season").sum(dim="time").sel(season=s) + mseasons = mseasons / wgt_denom + + if obs: + month_length_obs = odata.time.dt.days_in_month + weights_obs = (month_length_obs.groupby("time.season") / month_length_obs.groupby("time.season").sum()) + oseasons = (odata * weights_obs).groupby("time.season").sum(dim="time").sel(season=s) + wgt_denom = (od_ones*weights_obs).groupby("time.season").sum(dim="time").sel(season=s) + oseasons = oseasons / wgt_denom + else: + month_length_base = odata.time.dt.days_in_month + weights_base = (month_length_base.groupby("time.season") / month_length_base.groupby("time.season").sum()) + oseasons = (odata * weights_base).groupby("time.season").sum(dim="time").sel(season=s) + wgt_denom_base = (od_ones*weights_base).groupby("time.season").sum(dim="time").sel(season=s) + oseasons = oseasons / wgt_denom_base + + # Derive zonal mean temp from potential temp + if var == "thzm": + path = input_ts_locs[idx] + ds_pmid = xr.open_dataset(f"{path}{case_name}.cam.h0.PMID.{start_year}01-{end_year}12.nc") + + ds_pmid_interp = ds_pmid.interp(lat=mseasons.zalat,method="nearest") + pmid = ds_pmid_interp["PMID"] + pmid.attrs['units'] = 'Pa' + + #Create array to avoid weighting missing values: + pmid_ones = xr.where(pmid.isnull(), 0.0, 1.0) + + if s == 'ANN': + + #Calculate annual weights (i.e. don't group by season): + weights_ann = month_length / month_length.sum() + + pmid = (pmid * weights_ann).sum(dim='time') + pmid = pmid / (pmid_ones*weights_ann).sum(dim='time') + else: + #this is inefficient because we do same calc over and over + pmid = (pmid * weights).groupby("time.season").sum(dim="time").sel(season=s) + wgt_denom = (pmid_ones*weights).groupby("time.season").sum(dim="time").sel(season=s) + pmid = pmid / wgt_denom + + + mseasons.attrs['units'] = "K" + oseasons.attrs['units'] = "K" + pmid = pmid.mean(dim="lon") + + mseasons = thermo.temperature_from_potential_temperature(pmid* units.Pa,mseasons* units.kelvin) + oseasons = thermo.temperature_from_potential_temperature(pmid* units.Pa,oseasons* units.kelvin) + + if var == "utendepfd": + mseasons = mseasons*1000 + oseasons = oseasons*1000 + #difference: each entry should be (lat, lon) + dseasons = mseasons-oseasons + + #Gather contour plot options + cp_info = pf.prep_contour_plot(mseasons, oseasons, dseasons, **vres) + clevs = np.unique(np.array(cp_info['levels1'])) + norm = cp_info['norm1'] + cmap = cp_info['cmap1'] + clevs_diff = np.unique(np.array(cp_info['levelsdiff'])) + + # mesh for plots: + lat = mseasons['zalat'] + lev = mseasons['lev'] + lats, levs = np.meshgrid(lat, lev) + + # Find the next value below highest vertical level + prev_major_tick = 10 ** (np.floor(np.log10(np.min(levs)))) + prev_major_tick + + # Set padding for colorbar form axis + cmap_pad = 0.005 + + # create figure object + fig = plt.figure(figsize=(14,10)) + # LAYOUT WITH GRIDSPEC + # 4 rows, 8 columns, but each map will take up 4 columns and 2 rows + gs = mpl.gridspec.GridSpec(4, 8, wspace=0.75,hspace=0.5) + ax1 = plt.subplot(gs[0:2, :4], **cp_info['subplots_opt']) + ax2 = plt.subplot(gs[0:2, 4:], **cp_info['subplots_opt']) + ax3 = plt.subplot(gs[2:, 2:6], **cp_info['subplots_opt']) + ax = [ax1,ax2,ax3] + + #Contour fill + img0 = ax[0].contourf(lats, levs,mseasons, levels=clevs, norm=norm, cmap=cmap) + img1 = ax[1].contourf(lats, levs,oseasons, levels=clevs, norm=norm, cmap=cmap) + + #Add contours for highlighting + c0 = ax[0].contour(lats,levs,mseasons,levels=clevs[::2], norm=norm, + colors="k", linewidths=0.5) + + #Check if contour labels need to be adjusted + #ie if the values are large and/or in scientific notation, just label the + #contours with the leading numbers. + #EXAMPLE: plot values are 200000; plot the contours as 2.0 and let the colorbar + # indicate that it is e5. + fmt = {} + if 'contour_adjust' in vres: + test_strs = c0.levels/float(vres['contour_adjust']) + for l, str0 in zip(c0.levels, test_strs): + fmt[l] = str0 + + # Add contour labels + plt.clabel(c0, inline=True, fontsize=8, levels=c0.levels, fmt=fmt) + else: + # Add contour labels + plt.clabel(c0, inline=True, fontsize=8, levels=c0.levels) + + #Add contours for highlighting + c1 = ax[1].contour(lats,levs,oseasons,levels=clevs[::2], norm=norm, + colors="k", linewidths=0.5) + + #Check if contour labels need to be adjusted + #ie if the values are large and/or in scientific notation, just label the + #contours with the leading numbers. + #EXAMPLE: plot values are 200000; plot the contours as 2.0 and let the colorbar + # indicate that it is e5. + fmt = {} + if 'contour_adjust' in vres: + base_strs = c1.levels/float(vres['contour_adjust']) + for l, str0 in zip(c1.levels, base_strs): + fmt[l] = str0 + + # Add contour labels + plt.clabel(c1, inline=True, fontsize=8, levels=c1.levels, fmt=fmt) + else: + # Add contour labels + plt.clabel(c1, inline=True, fontsize=8, levels=c1.levels) + + + #Check if difference plot has contour levels, if not print notification + if len(dseasons.lev) == 0: + #Set empty message for comparison of cases with different vertical levels + #TODO: Work towards getting the vertical and horizontal interpolations!! - JR + empty_message = "These have different vertical levels\nCan't compare cases currently" + props = {'boxstyle': 'round', 'facecolor': 'wheat', 'alpha': 0.9} + prop_x = 0.18 + prop_y = 0.42 + ax[2].text(prop_x, prop_y, empty_message, + transform=ax[2].transAxes, bbox=props) + else: + img2 = ax[2].contourf(lats, levs, dseasons, + #cmap="BrBG", + cmap=cp_info['cmapdiff'], + levels=clevs_diff, + norm=cp_info['normdiff']) + ax[2].contour(lats, levs, dseasons, colors="k", linewidths=0.5, + levels=clevs_diff[::2], norm=cp_info['normdiff']) + cp_info['diff_colorbar_opt']["label"] = cp_info['colorbar_opt']["label"] + plt.colorbar(img2, ax=ax[2], location='right', pad=cmap_pad,**cp_info['diff_colorbar_opt']) + + #Format y-axis + for i,a in enumerate(ax[:]): + a.set_yscale("log") + a.set_xlabel("Latitude") + # Only plot y-axis label for test case + if i == 0: + a.set_ylabel('Pressure [hPa]', va='center', rotation='vertical') + if 'ylim' in vres: + y_lims = [float(lim) for lim in vres['ylim']] + y_lims[-1]=prev_major_tick + a.set_ylim(y_lims) + else: + a.set_ylim(a.get_ylim()[::-1]) + + # Format color bars + plt.colorbar(img1, ax=ax[1], location='right', pad=cmap_pad,**cp_info['colorbar_opt']) + # Remove the colorbar label for baseline + cp_info['colorbar_opt'].pop("label", None) + plt.colorbar(img0, ax=ax[0], location='right', pad=cmap_pad,**cp_info['colorbar_opt']) + + #Variable plot title name + longname = vres["long_name"] + plt.suptitle(f'{longname}: {s}', fontsize=20, y=.97) + + test_yrs = f"{start_year}-{end_year}" + + plot_title = "$\mathbf{Test}:$"+f"{test_nicknames[idx]}\nyears: {test_yrs}" + ax[0].set_title(plot_title, loc='left', fontsize=10) + + if obs: + obs_title = Path(vres["obs_name"]).stem + ax[1].set_title(f"{obs_title}\n",fontsize=10) + + else: + base_yrs = f"{syear_baseline}-{eyear_baseline}" + plot_title = "$\mathbf{Baseline}:$"+f"{base_nickname}\nyears: {base_yrs}" + ax[1].set_title(plot_title, loc='left', fontsize=10) + + #Set main title for difference plots column + ax[2].set_title("$\mathbf{Test} - \mathbf{Baseline}$",fontsize=10) + + #Write the figure to provided workspace/file: + fig.savefig(plot_name, bbox_inches='tight', dpi=300) + + #Add plot to website (if enabled): + adf.add_website_data(plot_name, var, case_name, season=s, plot_type="WACCM", + ext="SeasonalCycle_Mean",category="TEM") + + plt.close() print(" ...TEM plots have been generated successfully.") # Helper functions -################## - -def tem_plot(ds, ds_base, case_names, axs, s, var_list, res, obs, climo_yrs): - """ - TEM subplots - - """ - #Set empty message for comparison of cases with different vertical levels - #TODO: Work towards getting the vertical and horizontal interpolations!! - JR - empty_message = "These have different vertical levels\nCan't compare cases currently" - props = {'boxstyle': 'round', 'facecolor': 'wheat', 'alpha': 0.9} - prop_x = 0.18 - prop_y = 0.42 - - for var in var_list: - #Grab variable defaults for this variable - vres = res[var] - - #Gather data for both cases - mdata = ds[var].squeeze() - odata = ds_base[var].squeeze() - - #Create array to avoid weighting missing values: - md_ones = xr.where(mdata.isnull(), 0.0, 1.0) - od_ones = xr.where(odata.isnull(), 0.0, 1.0) - - month_length = mdata.time.dt.days_in_month - weights = (month_length.groupby("time.season") / month_length.groupby("time.season").sum()) - - #Calculate monthly-weighted seasonal averages: - if s == 'ANN': - - #Calculate annual weights (i.e. don't group by season): - weights_ann = month_length / month_length.sum() - - mseasons = (mdata * weights_ann).sum(dim='time') - mseasons = mseasons / (md_ones*weights_ann).sum(dim='time') - - #Calculate monthly weights based on number of days: - if obs: - month_length_obs = odata.time.dt.days_in_month - weights_ann_obs = month_length_obs / month_length_obs.sum() - oseasons = (odata * weights_ann_obs).sum(dim='time') - oseasons = oseasons / (od_ones*weights_ann_obs).sum(dim='time') - else: - month_length_base = odata.time.dt.days_in_month - weights_ann_base = month_length_base / month_length_base.sum() - oseasons = (odata * weights_ann_base).sum(dim='time') - oseasons = oseasons / (od_ones*weights_ann_base).sum(dim='time') - - else: - #this is inefficient because we do same calc over and over - mseasons = (mdata * weights).groupby("time.season").sum(dim="time").sel(season=s) - wgt_denom = (md_ones*weights).groupby("time.season").sum(dim="time").sel(season=s) - mseasons = mseasons / wgt_denom - - if obs: - month_length_obs = odata.time.dt.days_in_month - weights_obs = (month_length_obs.groupby("time.season") / month_length_obs.groupby("time.season").sum()) - oseasons = (odata * weights_obs).groupby("time.season").sum(dim="time").sel(season=s) - wgt_denom = (od_ones*weights_obs).groupby("time.season").sum(dim="time").sel(season=s) - oseasons = oseasons / wgt_denom - else: - month_length_base = odata.time.dt.days_in_month - weights_base = (month_length_base.groupby("time.season") / month_length_base.groupby("time.season").sum()) - oseasons = (odata * weights_base).groupby("time.season").sum(dim="time").sel(season=s) - wgt_denom_base = (od_ones*weights_base).groupby("time.season").sum(dim="time").sel(season=s) - oseasons = oseasons / wgt_denom_base - - #difference: each entry should be (lat, lon) - dseasons = mseasons-oseasons - - #Run through variables and plot each against the baseline on each row - #Each column will be a case, ie (test, base, difference) - - # uzm - #------------------------------------------------------------------------------------------ - if var == "uzm": - mseasons.plot(ax=axs[0,0], y='lev', yscale='log',ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[0,1], y='lev', yscale='log',ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[0,2].text(prop_x, prop_y, empty_message, transform=axs[0,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[0,2], y='lev', yscale='log', ylim=[1e3,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # epfy - #------------------------------------------------------------------------------------------ - if var == "epfy": - mseasons.plot(ax=axs[1,0], y='lev', yscale='log',vmax=1e6,ylim=[1e2,1], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[1,1], y='lev', yscale='log',vmax=1e6,ylim=[1e2,1], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[1,2].text(prop_x, prop_y, empty_message, transform=axs[1,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[1,2], y='lev', yscale='log', vmax=1e6, - ylim=[1e2,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # epfz - #------------------------------------------------------------------------------------------ - if var == "epfz": - mseasons.plot(ax=axs[2,0], y='lev', yscale='log',vmax=1e5,ylim=[1e2,1], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[2,1], y='lev', yscale='log',vmax=1e5,ylim=[1e2,1], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[2,2].text(prop_x, prop_y, empty_message, transform=axs[2,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[2,2], y='lev', yscale='log', vmax=1e5, - ylim=[1e2,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # vtem - #------------------------------------------------------------------------------------------ - if var == "vtem": - mseasons.plot.contourf(ax=axs[3,0], levels = 21, y='lev', yscale='log', - vmax=3,vmin=-3,ylim=[1e2,1], cmap='RdBu_r', - cbar_kwargs={'label': ds[var].units}) - mseasons.plot.contour(ax=axs[3,0], levels = 11, y='lev', yscale='log', - vmax=3,vmin=-3,ylim=[1e2,1], - colors='black', linestyles=None) - - oseasons.plot.contourf(ax=axs[3,1], levels = 21, y='lev', yscale='log', - vmax=3,vmin=-3,ylim=[1e2,1], cmap='RdBu_r', - cbar_kwargs={'label': ds[var].units}) - oseasons.plot.contour(ax=axs[3,1], levels = 11, y='lev', yscale='log', - vmax=3,vmin=-3,ylim=[1e2,1], - colors='black', linestyles=None) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[3,2].text(prop_x, prop_y, empty_message, transform=axs[3,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[3,2], y='lev', yscale='log', vmax=3,vmin=-3, - ylim=[1e2,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # wtem - #------------------------------------------------------------------------------------------ - if var == "wtem": - mseasons.plot.contourf(ax=axs[4,0], levels = 21, y='lev', yscale='log', - vmax=0.005, vmin=-0.005, ylim=[1e2,1], cmap='RdBu_r', - cbar_kwargs={'label': ds[var].units}) - mseasons.plot.contour(ax=axs[4,0], levels = 7, y='lev', yscale='log', - vmax=0.03, vmin=-0.03, ylim=[1e2,1], - colors='black', linestyles=None) - - oseasons.plot.contourf(ax=axs[4,1], levels = 21, y='lev', yscale='log', - vmax=0.005, vmin=-0.005, ylim=[1e2,1], cmap='RdBu_r', - cbar_kwargs={'label': ds[var].units}) - oseasons.plot.contour(ax=axs[4,1], levels = 7, y='lev', yscale='log', - vmax=0.03, vmin=-0.03, ylim=[1e2,1], - colors='black', linestyles=None) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[4,2].text(prop_x, prop_y, empty_message, transform=axs[4,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[4,2], y='lev', yscale='log',vmax=0.005, vmin=-0.005, - ylim=[1e2,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # psitem - #------------------------------------------------------------------------------------------ - if var == "psitem": - mseasons.plot.contourf(ax=axs[5,0], levels = 21, y='lev', yscale='log', - vmax=5e9, ylim=[1e2,2], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot.contourf(ax=axs[5,1], levels = 21, y='lev', yscale='log', - vmax=5e9, ylim=[1e2,2], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[5,2].text(prop_x, prop_y, empty_message, transform=axs[5,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[5,2], y='lev', yscale='log',vmax=5e9, - ylim=[1e2,2],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # utendepfd - #------------------------------------------------------------------------------------------ - if var == "utendepfd": - mseasons.plot(ax=axs[6,0], y='lev', yscale='log', - vmax=0.0001, vmin=-0.0001, ylim=[1e2,2], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[6,1], y='lev', yscale='log', - vmax=0.0001, vmin=-0.0001, ylim=[1e2,2], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[6,2].text(prop_x, prop_y, empty_message, transform=axs[6,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[6,2], y='lev', yscale='log',vmax=0.0001, vmin=-0.0001, - ylim=[1e2,2],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # utendvtem - #------------------------------------------------------------------------------------------ - if var == "utendvtem": - mseasons.plot(ax=axs[7,0], y='lev', yscale='log',vmax=0.001, ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[7,1], y='lev', yscale='log',vmax=0.001, ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[7,2].text(prop_x, prop_y, empty_message, transform=axs[7,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[7,2], y='lev', yscale='log', vmax=0.001, ylim=[1e3,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # utendwtem - #------------------------------------------------------------------------------------------ - if var == "utendwtem": - mseasons.plot(ax=axs[8,0], y='lev', yscale='log',vmax=0.0001, ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - oseasons.plot(ax=axs[8,1], y='lev', yscale='log',vmax=0.0001, ylim=[1e3,1], - cbar_kwargs={'label': ds[var].units}) - - #Check if difference plot has contour levels, if not print notification - if len(dseasons.lev) == 0: - axs[8,2].text(prop_x, prop_y, empty_message, transform=axs[8,2].transAxes, bbox=props) - else: - dseasons.plot(ax=axs[8,2], y='lev', yscale='log', vmax=0.0001, ylim=[1e3,1],cmap="BrBG", - cbar_kwargs={'label': ds[var].units}) - - # Set the ticks and ticklabels for all x-axes - #NOTE: This has to come after all subplots have been done, - #I am assuming this is because of the way xarray plots info automatically for labels and titles - #This is to change the default xarray labels for each instance of the xarray plot method - plt.setp(axs, xticks=np.arange(-80,81,20), xlabel='latitude', title="") - - #Set titles of subplots - #Set case names in first subplot only - uzm = ds["uzm"].long_name.replace(" ", "\ ") - - test_yrs = f"{climo_yrs['test'][0]}-{climo_yrs['test'][1]}" - axs[0,0].set_title(f"\n\n"+"$\mathbf{Test}$"+f" yrs: {test_yrs}\n"+f"{case_names[0]}\n\n\n",fontsize=14) - - if obs: - obs_title = Path(vres["obs_name"]).stem - axs[0,1].set_title(f"\n\n"+"$\mathbf{Baseline}$\n"+f"{obs_title}\n\n"+"$\mathbf{"+uzm+"}$"+"\n",fontsize=14) - - else: - base_yrs = f"{climo_yrs['base'][0]}-{climo_yrs['base'][1]}" - axs[0,1].set_title(f"\n\n"+"$\mathbf{Baseline}$"+f" yrs: {base_yrs}\n"+f"{case_names[1]}\n\n"+"$\mathbf{"+uzm+"}$"+"\n",fontsize=14) - - #Set main title for difference plots column - axs[0,2].set_title("$\mathbf{Test} - \mathbf{Baseline}$"+"\n\n\n",fontsize=14) - - #Set variable name on center plot (except first plot, see above) - for i in range(1,len(var_list)): - var_name = ds[var_list[i]].long_name.replace(" ", "\ ") - axs[i,1].set_title("$\mathbf{"+var_name+"}$"+"\n",fontsize=14) - - #Adjust subplots - #May need to adjust hspace and wspace depending on if multi-case diagnostics ever happen for TEM diags - hspace = 0.4 - plt.subplots_adjust(wspace=0.5, hspace=hspace) - - return axs - -############## -#END OF SCRIPT \ No newline at end of file +################## \ No newline at end of file diff --git a/scripts/plotting/zonal_mean.py b/scripts/plotting/zonal_mean.py index af6b7e2a8..7a9787c8b 100644 --- a/scripts/plotting/zonal_mean.py +++ b/scripts/plotting/zonal_mean.py @@ -46,7 +46,11 @@ def zonal_mean(adfobj): msg = "\n Generating zonal mean plots..." print(f"{msg}\n {'-' * (len(msg)-3)}") + #Variable list var_list = adfobj.diag_var_list + #Remove unneccasry vairbale from plotting + if "PMID" in var_list: + var_list.remove("PMID") #Special ADF variable which contains the output paths for #all generated plots and tables: