diff --git a/auxiliary_tools/cdat_regression_testing/909-prov-log/qa.py b/auxiliary_tools/cdat_regression_testing/909-prov-log/qa.py new file mode 100644 index 000000000..1e4920e7f --- /dev/null +++ b/auxiliary_tools/cdat_regression_testing/909-prov-log/qa.py @@ -0,0 +1,41 @@ +import os +from e3sm_diags.parameter.core_parameter import CoreParameter +from e3sm_diags.parameter.tc_analysis_parameter import TCAnalysisParameter +from e3sm_diags.run import Run, runner + +simulations = [ + "tc-v1.HR.0026_0035", + "tc-v2.LR.2000_2014", + "tc-v3.HR.0006_0025", + "tc-v3.LR.2000_2014", +] +sim_names = [ + "theta.20180906.branch_noCNT.A_WCYCL1950S_CMIP6_HR.ne120_oRRS18v3_ICG", + "v2.LR.historical_0101", + "20240609.piCtl.ne120pg2_r025_RRSwISC6to18E3r5.chrysalis.test1", + "extendedOutput.v3.LR.historical_0101", +] + +data_path = "/global/homes/c/chengzhu/tests/tc_analysis/" + +for idx, sim in enumerate(simulations): + print(sim) + # runner = Run() + + param = CoreParameter() + param.multiprocessing = True + param.test_data_path = data_path + sim + param.test_name = sim_names[idx] + param.test_start_yr = sim.split(".")[-1][0:4] + param.test_end_yr = sim.split(".")[-1][5:9] + + param.reference_data_path = ( + "/global/cfs/cdirs/e3sm/diagnostics/observations/Atm/tc-analysis" + ) + param.ref_start_yr = "1979" + param.ref_end_yr = "2018" + + prefix = "/global/cfs/cdirs/e3sm/www/vo13/tc_analysis_test/" + param.results_dir = os.path.join(prefix, sim) + runner.sets_to_run = ["tc_analysis"] + runner.run_diags([param]) diff --git a/auxiliary_tools/cdat_regression_testing/909-prov-log/run.cfg b/auxiliary_tools/cdat_regression_testing/909-prov-log/run.cfg new file mode 100644 index 000000000..208c443ab --- /dev/null +++ b/auxiliary_tools/cdat_regression_testing/909-prov-log/run.cfg @@ -0,0 +1,1055 @@ +[#] +sets = ["polar"] +case_id = "GPCP_v3.2" +variables = ["PRECT"] +ref_name = "GPCP_v3.2" +reference_name = "GPCP v2.2" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S"] +test_colormap = "WhiteBlueGreenYellowRed.rgb" +reference_colormap = "WhiteBlueGreenYellowRed.rgb" +diff_colormap = "BrBG" +contour_levels = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] +diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +[#] +sets = ["polar"] +case_id = "GPCP_v3.2" +variables = ["PRECT"] +ref_name = "GPCP_v3.2" +reference_name = "GPCP v2.2" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_N"] +test_colormap = "WhiteBlueGreenYellowRed.rgb" +reference_colormap = "WhiteBlueGreenYellowRed.rgb" +diff_colormap = "BrBG" +contour_levels = [0.5, 1, 1.5, 2, 3, 4, 5, 7.5, 10] +diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +[#] +sets = ["polar"] +case_id = "GPCP_v2.3" +variables = ["PRECT"] +ref_name = "GPCP_v2.3" +reference_name = "GPCP v2.3" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S"] +test_colormap = "WhiteBlueGreenYellowRed.rgb" +reference_colormap = "WhiteBlueGreenYellowRed.rgb" +diff_colormap = "BrBG" +contour_levels = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] +diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +[#] +sets = ["polar"] +case_id = "GPCP_v2.3" +variables = ["PRECT"] +ref_name = "GPCP_v2.3" +reference_name = "GPCP v2.3" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_N"] +test_colormap = "WhiteBlueGreenYellowRed.rgb" +reference_colormap = "WhiteBlueGreenYellowRed.rgb" +diff_colormap = "BrBG" +contour_levels = [0.5, 1, 1.5, 2, 3, 4, 5, 7.5, 10] +diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +[#] +sets = ["polar"] +case_id = "CRU_IPCC" +variables = ["TREFHT"] +regions = ["polar_N"] +ref_name = "CRU" +reference_name = "CRU Global Monthly Mean T" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +contour_levels = [-35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40] +diff_levels = [-15, -10, -5, -2, -1, -0.5, -0.2, 0, 0.2, 0.5, 1, 2, 5, 10, 15] + + +[#] +sets = ["polar"] +case_id = "SST_HadISST" +variables = ["SST"] +ref_name = "HadISST" +reference_name = "HadISST" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S", "polar_N"] +contour_levels = [-1, 0, 1, 3, 5, 7, 9, 11, 13, 15] +diff_levels = [-5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5] + + +[#] +sets = ["polar"] +case_id = "SST_CL_HadISST" +variables = ["SST"] +ref_name = "HadISST_CL" +reference_name = "HadISST (Climatology)" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S", "polar_N"] +contour_levels = [-1, 0, 1, 3, 5, 7, 9, 11, 13, 15] +diff_levels = [-5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5] + + +[#] +sets = ["polar"] +case_id = "SST_PI_HadISST" +variables = ["SST"] +ref_name = "HadISST_PI" +reference_name = "HadISST (Pre-Indust)" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S", "polar_N"] +contour_levels = [-1, 0, 1, 3, 5, 7, 9, 11, 13, 15] +diff_levels = [-5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5] + + +[#] +sets = ["polar"] +case_id = "SST_PD_HadISST" +variables = ["SST"] +ref_name = "HadISST_PD" +reference_name = "HadISST (Present Day)" +seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +regions = ["polar_S", "polar_N"] +contour_levels = [-1, 0, 1, 3, 5, 7, 9, 11, 13, 15] +diff_levels = [-5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5] + + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["ALBEDO_SRF"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.6, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95] +# diff_levels = [-0.25, -0.2, -0.15, -0.1, -0.07, -0.05, -0.02, 0.02, 0.05, 0.07, 0.1, 0.15, 0.2, 0.25] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["SWCFSRF"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [-170, -150, -135, -120, -105, -90, -75, -60, -45, -30, -15, 0, 15, 30, 45] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["LWCFSRF"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 10, 20, 30, 40, 50, 60, 70, 80] +# diff_levels = [-35, -30, -25, -20, -15, -10, -5, -2, 2, 5, 10, 15, 20, 25, 30, 35] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FLDS"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FLDSC"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FLNS"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 10, 20, 30, 40, 50, 60, 70, 80] +# diff_levels = [-50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FLNSC"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 20, 40, 60, 80, 100, 120, 140, 160] +# diff_levels = [-50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FSDS"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FSDSC"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400, 450] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FSNS"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + + +# [#] +# sets = ["polar"] +# case_id = "CERES-EBAF-surface-v4.1" +# variables = ["FSNSC"] +# ref_name = "ceres_ebaf_surface_v4.1" +# reference_name = "CERES-EBAF v4.1" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0, 50, 100, 150, 200, 250, 300, 350, 400] +# diff_levels = [-75, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 75] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["LHFLX"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [-15, 0, 15, 30, 45, 60, 75, 90, 105, 120] +# diff_levels = [-65, -55, -45, -35, -25, -15, -5, 5, 15, 25, 35, 45, 55, 65] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["TAUXY"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0., 0.01, 0.02,0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.2, 0.5, 1.0] +# diff_levels = [-0.1, -0.08, -0.06, -0.05, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1] + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["TREFHT"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# regions = ["polar_N", "polar_S"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [-35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40] +# diff_levels = [-15, -10, -5, -2, -1, -0.5, -0.2, 0, 0.2, 0.5, 1, 2, 5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["PSL"] +# ref_name = "ERA5" +# regions = ["polar_S", "polar_N"] +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [955, 965, 975,980, 985, 990, 995, 1000, 1005, 1010, 1015, 1020, 1025, 1035] +# diff_levels = [ -16, -12, -8, -4, -2, -1, -0.5, 0.5, 1, 2, 4, 8, 12, 16] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["PRECT"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# test_colormap = "WhiteBlueGreenYellowRed.rgb" +# reference_colormap = "WhiteBlueGreenYellowRed.rgb" +# diff_colormap = "BrBG" +# contour_levels = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] +# diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["PRECT"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# test_colormap = "WhiteBlueGreenYellowRed.rgb" +# reference_colormap = "WhiteBlueGreenYellowRed.rgb" +# diff_colormap = "BrBG" +# contour_levels = [0.5, 1, 1.5, 2, 3, 4, 5, 7.5, 10] +# diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["TMQ"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [0, 1, 2, 4, 6, 8, 12, 14, 16, 18, 20, 22] +# diff_levels = [-5, -4, -3, -2, -1, 1, 2, 3, 4, 5] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["U"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [850.0] +# test_colormap = "PiYG_r" +# reference_colormap = "PiYG_r" +# contour_levels = [-20, -15, -10, -8, -5, -3, -1, 1, 3, 5, 8, 10, 15, 20] +# diff_levels = [-8, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 8] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["U"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [200.0] +# test_colormap = "PiYG_r" +# reference_colormap = "PiYG_r" +# contour_levels = [-50, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 50] +# diff_levels = [-8, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 8] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["Z3"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [500.0] +# contour_levels = [48, 49, 50, 51, 52, 53, 54, 55, 56] +# diff_levels = [-1.8, -1.4, -1.0, -0.6, -0.2, 0.2, 0.6, 1.0, 1.4, 1.8] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_S"] +# plevs = [850.0] +# contour_levels = [240, 244, 248, 252, 256, 260, 264, 268, 272] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_N"] +# plevs = [850.0] +# contour_levels = [256, 258, 260, 262, 264, 268, 270, 272, 274, 276] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [850.0] +# contour_levels = [230, 240, 250, 260, 270, 280, 290, 300, 310] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_S"] +# plevs = [200.0] +# contour_levels = [210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_N"] +# plevs = [200.0] +# contour_levels = [215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "ERA5" +# variables = ["T"] +# ref_name = "ERA5" +# reference_name = "ERA5 Reanalysis" +# seasons = ["DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [200.0] +# contour_levels = [200, 205, 210, 215, 220, 225, 230, 235, 240] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["LHFLX"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [-15, 0, 15, 30, 45, 60, 75, 90, 105, 120] +# diff_levels = [-65, -55, -45, -35, -25, -15, -5, 5, 15, 25, 35, 45, 55, 65] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["PRECT"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# test_colormap = "WhiteBlueGreenYellowRed.rgb" +# reference_colormap = "WhiteBlueGreenYellowRed.rgb" +# diff_colormap = "BrBG" +# contour_levels = [0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5] +# diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["PRECT"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# test_colormap = "WhiteBlueGreenYellowRed.rgb" +# reference_colormap = "WhiteBlueGreenYellowRed.rgb" +# diff_colormap = "BrBG" +# contour_levels = [0.5, 1, 1.5, 2, 3, 4, 5, 7.5, 10] +# diff_levels = [-2, -1.5, -1, -0.75, -0.5, -0.25, 0.25, 0.5, 0.75, 1, 1.5, 2] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["TMQ"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [0, 1, 2, 4, 6, 8, 12, 14, 16, 18, 20, 22] +# diff_levels = [-5, -4, -3, -2, -1, 1, 2, 3, 4, 5] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["U"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [850.0] +# test_colormap = "PiYG_r" +# reference_colormap = "PiYG_r" +# contour_levels = [-20, -15, -10, -8, -5, -3, -1, 1, 3, 5, 8, 10, 15, 20] +# diff_levels = [-8, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 8] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["U"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [200.0] +# test_colormap = "PiYG_r" +# reference_colormap = "PiYG_r" +# contour_levels = [-50, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 50] +# diff_levels = [-8, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 8] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["Z3"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [500.0] +# contour_levels = [48, 49, 50, 51, 52, 53, 54, 55, 56] +# diff_levels = [-1.8, -1.4, -1.0, -0.6, -0.2, 0.2, 0.6, 1.0, 1.4, 1.8] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_S"] +# plevs = [850.0] +# contour_levels = [240, 244, 248, 252, 256, 260, 264, 268, 272] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_N"] +# plevs = [850.0] +# contour_levels = [256, 258, 260, 262, 264, 268, 270, 272, 274, 276] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [850.0] +# contour_levels = [230, 240, 250, 260, 270, 280, 290, 300, 310] +# diff_levels = [-15, -10, -7.5, -5, -2.5, -1, 1, 2.5, 5, 7.5, 10, 15] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_S"] +# plevs = [200.0] +# contour_levels = [210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["ANN"] +# regions = ["polar_N"] +# plevs = [200.0] +# contour_levels = [215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["T"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# seasons = ["DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# plevs = [200.0] +# contour_levels = [200, 205, 210, 215, 220, 225, 230, 235, 240] +# diff_levels = [-10, -7.5, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 7.5, 10] + + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["TAUXY"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [0., 0.01, 0.02,0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.2, 0.5, 1.0] +# diff_levels = [-0.1, -0.08, -0.06, -0.05, -0.04, -0.03, -0.02, -0.01, 0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.08, 0.1] + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["TREFHT"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# regions = ["polar_N", "polar_S"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [-35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40] +# diff_levels = [-15, -10, -5, -2, -1, -0.5, -0.2, 0, 0.2, 0.5, 1, 2, 5, 10, 15] + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["TREFMNAV"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# regions = ["polar_N", "polar_S"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [-35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40] +# diff_levels = [-15, -10, -5, -2, -1, -0.5, -0.2, 0, 0.2, 0.5, 1, 2, 5, 10, 15] + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["TREFMXAV"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# regions = ["polar_N", "polar_S"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [-35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40] +# diff_levels = [-15, -10, -5, -2, -1, -0.5, -0.2, 0, 0.2, 0.5, 1, 2, 5, 10, 15] + +# [#] +# sets = ["polar"] +# case_id = "MERRA2" +# variables = ["PSL"] +# ref_name = "MERRA2" +# reference_name = "MERRA2 Reanalysis" +# regions = ["polar_S", "polar_N"] +# seasons = ["ANN", "DJF", "MAM", "JJA", "SON"] +# contour_levels = [955, 965, 975,980, 985, 990, 995, 1000, 1005, 1010, 1015, 1020, 1025, 1035] +# diff_levels = [ -16, -12, -8, -4, -2, -1, -0.5, 0.5, 1, 2, 4, 8, 12, 16] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 300, 400, 500, 600, 700] +# diff_levels = [-700, -600, -500, -400, -300, -200, -100, -50, -25, -10, 10, 25, 50, 100, 200, 300, 400, 500, 600, 700] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.5, 1, 2, 3, 4, 5] +# diff_levels = [-5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_ncl_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N", "polar_S"] +# contour_levels = [0, 100, 500, 1000, 2000, 5000, 10000, 15000, 20000] +# diff_levels = [-800, -600, -500, -400, -300, -200, -100, -50, -25, -10, 10, 25, 50, 100, 200, 300, 400, 500, 600, 800] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 400, 600, 800, 1000, 1200, 1400, 1600] +# diff_levels = [-1200, -1000, -800, -600, -400, -200, -100, -50, -25, -10, 10, 25, 50, 100, 200, 400, 600, 800, 1000, 1200] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 10, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200] +# diff_levels = [-20, -10, -5, -2, -1, 1, 2, 5, 10, 20] + + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_dst_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N", "polar_S"] +# contour_levels = [0, 100, 500, 1000, 2000, 5000, 10000, 15000, 20000, 30000] +# diff_levels = [-6000, -5000, -4000, -3000, -2000, -1000, -500, -100, -50, -25, -10, 10, 25, 50, 100, 500, 1000, 2000, 3000, 4000, 5000, 6000] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2400] +# diff_levels = [-1500, -1200, -1000, -800, -600, -400, -200, -100, -50, -25, -10, 10, 25, 50, 100, 200, 400, 600, 800, 1000, 1200, 1500] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +# diff_levels = [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 1, 2, 4, 6, 8, 10, 12, 14, 20, 30, 40, 50] +# diff_levels = [-25, -20, -15, -10, -5, -2, -1, 1, 2, 5, 10, 15, 20, 25] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_srf"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 25, 50, 100, 150, 200, 300, 400, 500] +# diff_levels = [-40, -30, -20, -10, -5, -2, -1, 1, 2, 5, 10, 20, 30, 40] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.1, 0.2, 0.5, 1, 2, 3, 3.5] +# diff_levels = [-3, -2, -1, -0.5, -0.2, -0.1, -0.05, -0.02, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 3] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_ncl_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 100, 200, 500, 1000, 2000, 3000, 4000, 5000, 7000] +# diff_levels = [-250, -200, -150, -100, -50, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 50, 100, 150, 200, 250] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 1, 2, 5, 10, 20, 30, 40, 50, 100, 150] +# diff_levels = [-25, -20, -15, -10, -5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5, 10, 15, 20, 25] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_dst_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 10, 20, 50, 100, 200, 300, 400, 500, 700, 1000] +# diff_levels = [-100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.5, 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] +# diff_levels = [-10, -7, -5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5, 7, 10] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_soa_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 1, 2, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100] +# diff_levels = [-40, -30, -20, -10, -5, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 5, 10, 20, 30, 40] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.5, 1, 2, 4, 6, 8, 10, 20, 40, 60, 80] +# diff_levels = [-8, -6, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 6, 8] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.1, 0.2, 0.5, 1, 2, 4, 6, 8, 10, 12, 15] +# diff_levels = [-10, -8, -6, -4, -3, -2, -1, -0.5, -0.2, 0.2, 0.5, 1, 2, 3, 4, 6, 8, 10] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_ncl_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 5, 10, 20, 40, 60, 80, 100, 150, 200, 250, 300, 350] +# diff_levels = [-30, -25, -20, -15, -10, -8, -6, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 6, 8, 10, 15, 20, 25, 30] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 10, 20, 40, 60, 80, 100, 150, 200, 250, 300] +# diff_levels = [-150, -100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100, 150] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_dst_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 10, 20, 40, 60, 80, 100, 150, 200, 300, 400, 500, 600, 800, 1000, 1200] +# diff_levels = [-200, -150, -100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 2, 4, 6, 8, 10, 20, 30, 40, 50, 60, 80, 100] +# diff_levels = [-50, -40, -30, -20, -10, -5, -2, -1, -0.5, 0.5, 1, 2, 5, 10, 20, 30, 40, 50] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_soa_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 10, 20, 40, 60, 80, 100, 150, 200, 250, 300, 350] +# diff_levels = [-150, -100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100, 150] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S"] +# contour_levels = [0, 0.1, 0.2, 0.5, 1, 2, 4, 6, 8, 10] +# diff_levels = [-0.5, -0.4, -0.3, -0.2, -0.1, -0.05, -0.02, -0.01, -0.005, -0.002, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 10, 20, 40, 60, 80, 100, 150] +# diff_levels = [-100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_ncl_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 100, 200, 400, 600, 800, 1000, 1500, 2000, 2500, 3000, 4000, 5000] +# diff_levels = [-250, -200, -150, -100, -80, -60, -40, -30, -20, -10, -5, -2, 2, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 250] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 20, 40, 60, 80, 100, 150, 200, 300, 400, 500, 600, 700, 800, 1000] +# diff_levels = [-900, -700, -500, -400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400, 500, 700, 800, 900] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_dst_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 1000, 2000, 4000, 6000, 8000, 10000, 15000, 20000] +# diff_levels = [-2000, -1500, -1000, -800, -600, -400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400, 600, 800, 1000, 1500, 2000] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 300, 400, 600, 800, 1000, 1200] +# diff_levels = [-300, -200, -150, -100, -80, -60, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_soa_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 100, 200, 400, 600, 800, 1000, 1500, 2000, 2500, 3000, 3600] +# diff_levels = [-700, -500, -400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400, 500, 700] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_850"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 2, 4, 6, 8, 10, 20, 30, 40, 50, 60, 80, 100] +# diff_levels = [-10, -8, -6, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 6, 8, 10] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_bc_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 1, 2, 4, 6, 8, 10, 20, 30, 40, 50] +# diff_levels = [-50, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 50] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_ncl_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 5, 10, 20, 30, 40, 50, 60, 80, 100, 120, 150] +# diff_levels = [-30, -20, -15, -10, -8, -6, -4, -3, -2, -1, -0.5, 0.5, 1, 2, 3, 4, 6, 8, 10, 15, 20, 30] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_so4_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 300, 400, 500, 600, 700] +# diff_levels = [-600, -500, -400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400, 500, 600] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_dst_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 500, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 9000] +# diff_levels = [-1000, -700, -500, -400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400, 500, 700, 1000] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_pom_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 10, 20, 30, 40, 50, 60, 80, 100, 120, 150, 200] +# diff_levels = [-120, -100, -80, -60, -40, -30, -20, -10, -5, 5, 10, 20, 30, 40, 60, 80, 100, 120] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_soa_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 50, 100, 200, 300, 400, 500, 600, 700, 1000] +# diff_levels = [-400, -300, -200, -150, -100, -80, -60, -40, -30, -20, -10, 10, 20, 30, 40, 60, 80, 100, 150, 200, 300, 400] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["Mass_mom_330"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_N"] +# contour_levels = [0, 0.1, 0.2, 0.4, 0.6, 0.8, 1, 2, 3, 4] +# diff_levels = [-0.5, -0.4, -0.3, -0.2, -0.1, -0.05, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["AODDUST", "AODBC", "AODSS", "AODPOM", "AODMOM", "AODSOA", "AODSO4", "AODSO4_STR", "AODSO4_TRO"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [0, 0.02, 0.04, 0.06, 0.08, 0.10, 0.12] +# diff_levels = [-0.02, -0.01, -0.005, -0.0025, -0.0010, -0.0005, 0.0005, 0.0010, 0.0025, 0.005, 0.01, 0.02] + +# [#] +# sets = ["polar"] +# case_id = "aero-no-ref-data" +# variables = ["AODVIS"] +# seasons = ["ANN","DJF", "MAM", "JJA", "SON"] +# regions = ["polar_S", "polar_N"] +# contour_levels = [0, 0.03, 0.06, 0.09, 0.12, 0.15, 0.18] +# diff_levels = [-0.05, -0.04, -0.03, -0.02, -0.01, -0.005, -0.0025, 0.0025, 0.005, 0.01, 0.02, 0.03, 0.04, 0.05] diff --git a/auxiliary_tools/cdat_regression_testing/909-prov-log/run_script.py b/auxiliary_tools/cdat_regression_testing/909-prov-log/run_script.py new file mode 100644 index 000000000..46223a19b --- /dev/null +++ b/auxiliary_tools/cdat_regression_testing/909-prov-log/run_script.py @@ -0,0 +1,11 @@ +from auxiliary_tools.cdat_regression_testing.base_run_script import run_set + +SET_NAME = "polar" +SET_DIR = "909-prov-log" + +# CFG_PATH: str | None = "/global/u2/v/vo13/E3SM-Project/e3sm_diags/auxiliary_tools/cdat_regression_testing/909-prov-log/run.cfg" +CFG_PATH = "auxiliary_tools/cdat_regression_testing/909-prov-log/run.cfg" +MULTIPROCESSING = True + +# %% +run_set(SET_NAME, SET_DIR, CFG_PATH, MULTIPROCESSING) diff --git a/auxiliary_tools/cdat_regression_testing/base_run_script.py b/auxiliary_tools/cdat_regression_testing/base_run_script.py index 6fff17557..45bc502ac 100644 --- a/auxiliary_tools/cdat_regression_testing/base_run_script.py +++ b/auxiliary_tools/cdat_regression_testing/base_run_script.py @@ -27,8 +27,25 @@ ) from e3sm_diags.run import runner +# Get the current machine's configuration info. +MACHINE_INFO = MachineInfo() +MACHINE = MACHINE_INFO.machine + +if MACHINE not in [ + "anvil", + "chrysalis", + "compy", + "pm-cpu", + "cori-haswell", + "cori-knl", +]: + raise ValueError(f"e3sm_diags is not supported on this machine ({MACHINE}).") + # The location where results will be stored based on your branch changes. -BASE_RESULTS_DIR = "/global/cfs/cdirs/e3sm/www/cdat-migration-fy24/" +if MACHINE in ["chrysalis", "anvil"]: + BASE_RESULTS_DIR = "/lcrc/group/e3sm/public_html/cdat-migration-fy24/" +elif MACHINE in ["cori-haswell", "cori-knl", "pm-cpu"]: + BASE_RESULTS_DIR = "/global/cfs/cdirs/e3sm/www/cdat-migration-fy24/" class MachinePaths(TypedDict): @@ -200,30 +217,16 @@ def _get_machine_paths() -> MachinePaths: A dictionary of paths on the machine, with the key being the path type and the value being the absolute path string. """ - # Get the current machine's configuration info. - machine_info = MachineInfo() - machine = machine_info.machine - - if machine not in [ - "anvil", - "chrysalis", - "compy", - "pm-cpu", - "cori-haswell", - "cori-knl", - ]: - raise ValueError(f"e3sm_diags is not supported on this machine ({machine}).") - # Path to the HTML outputs for the current user. - web_portal_base_path = machine_info.config.get("web_portal", "base_path") - html_path = f"{web_portal_base_path}/{machine_info.username}/" + web_portal_base_path = MACHINE_INFO.config.get("web_portal", "base_path") + html_path = f"{web_portal_base_path}/{MACHINE_INFO.username}/" # Path to the reference data directory. - diags_base_path = machine_info.diagnostics_base + diags_base_path = MACHINE_INFO.diagnostics_base ref_data_dir = f"{diags_base_path}/observations/Atm" # Paths to the test data directories. - test_data_dir, test_data_dir2 = _get_test_data_dirs(machine) + test_data_dir, test_data_dir2 = _get_test_data_dirs(MACHINE) # Construct the paths required by e3sm_diags using the base paths above. machine_paths: MachinePaths = { diff --git a/e3sm_diags/driver/utils/dataset_xr.py b/e3sm_diags/driver/utils/dataset_xr.py index aa9aad5b8..562de776a 100644 --- a/e3sm_diags/driver/utils/dataset_xr.py +++ b/e3sm_diags/driver/utils/dataset_xr.py @@ -422,7 +422,7 @@ def _get_climo_dataset(self, season: str) -> xr.Dataset: using other datasets. """ filepath = self._get_climo_filepath(season) - logger.info(f"Opening climatology file: {filepath}") + logger.debug(f"Opening climatology file: {filepath}") ds = self._open_climo_dataset(filepath) @@ -711,7 +711,8 @@ def _get_dataset_with_derived_climo_var(self, ds: xr.Dataset) -> xr.Dataset: src_var_keys = list(matching_target_var_map.keys())[0] logger.info( - f"Deriving the climatology variable using the source variables: {src_var_keys}" + f"Deriving the {self.data_type} climatology variable using the source " + f"variables: {src_var_keys}" ) ds_sub = squeeze_time_dim(ds) ds_sub = self._subset_vars_and_load(ds_sub, list(src_var_keys)) @@ -1032,7 +1033,7 @@ def _get_time_series_dataset_obj(self, var) -> xr.Dataset: The dataset for the variable. """ filepaths = self._get_time_series_filepaths(self.root_path, var) - logger.info(f"Opening time series files: {filepaths}") + logger.debug(f"Opening time series files: {filepaths}") if filepaths is None: raise IOError( diff --git a/e3sm_diags/logger.py b/e3sm_diags/logger.py index 947b0508d..ae131baf1 100644 --- a/e3sm_diags/logger.py +++ b/e3sm_diags/logger.py @@ -6,17 +6,43 @@ import shutil LOG_FILENAME = "e3sm_diags_run.log" +LOG_FORMAT = ( + "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" +) +LOG_FILEMODE = "w" +LOG_LEVEL = logging.INFO + + +# Setup the root logger with a default log file. +# `force` is set to `True` to automatically remove root handlers whenever +# `basicConfig` called. This is required for cases where multiple e3sm_diags +# runs are executed. Otherwise, the logger objects attempt to share the same +# root file reference (which gets deleted between runs), resulting in +# `FileNotFoundError: [Errno 2] No such file or directory: 'e3sm_diags_run.log'`. +# More info here: https://stackoverflow.com/a/49202811 +logging.basicConfig( + format=LOG_FORMAT, + filename=LOG_FILENAME, + filemode=LOG_FILEMODE, + level=LOG_LEVEL, + force=True, +) +logging.captureWarnings(True) + +# Add a console handler to display warnings in the console. This is useful +# for when other package loggers raise warnings (e.g, NumPy, Xarray). +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.INFO) +console_handler.setFormatter(logging.Formatter(LOG_FORMAT)) +logging.getLogger().addHandler(console_handler) def custom_logger(name: str, propagate: bool = True) -> logging.Logger: - """Sets up a custom logger. + """Sets up a custom logger that is a child of the root logger. + + This custom logger inherits the root logger's handlers. + - `force` is set to `True` to automatically remove root handlers whenever - `basicConfig` called. This is required for cases where multiple e3sm_diags - runs are executed. Otherwise, the logger objects attempt to share the same - root file reference (which gets deleted between runs), resulting in - `FileNotFoundError: [Errno 2] No such file or directory: 'e3sm_diags_run.log'`. - More info here: https://stackoverflow.com/a/49202811 Parameters ---------- @@ -59,35 +85,41 @@ def custom_logger(name: str, propagate: bool = True) -> logging.Logger: >>> logger.critical("") """ - log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" - log_filemode = "w" - - # Setup - logging.basicConfig( - format=log_format, - filename=LOG_FILENAME, - filemode=log_filemode, - level=logging.INFO, - force=True, - ) - logging.captureWarnings(True) - logger = logging.getLogger(name) logger.propagate = propagate - # Console output - console_handler = logging.StreamHandler() - console_handler.setLevel(logging.INFO) - console_handler.setFormatter(logging.Formatter(log_format)) - logger.addHandler(console_handler) - return logger -logger = custom_logger(__name__) +def _update_root_logger_filepath_to_prov_dir(log_path: str): + """Updates the log file path to the provenance directory. + + This method changes the log file path to a subdirectory named 'prov' + within the given results directory. It updates the filename of the + existing file handler to the new path. + + Parameters + ---------- + log_path : str + The path to the log file, which is stored in the `results_dir` + sub-directory called "prov". + + Notes + ----- + - The method assumes that a logging file handler is already configured. + - The log file is closed and reopened at the new location. + - The log file mode is determined by the constant `LOG_FILEMODE`. + - The log file name is determined by the constant `LOG_FILENAME`. + """ + for handler in logging.root.handlers: + if isinstance(handler, logging.FileHandler): + handler.baseFilename = log_path + handler.stream.close() + handler.stream = open(log_path, LOG_FILEMODE) # type: ignore + break -def move_log_to_prov_dir(results_dir: str): +def move_log_to_prov_dir(results_dir: str, logger: logging.Logger): """Moves the e3sm diags log file to the provenance directory. This function should be called at the end of the diagnostic run to capture diff --git a/e3sm_diags/run.py b/e3sm_diags/run.py index 5589795d6..b9585f214 100644 --- a/e3sm_diags/run.py +++ b/e3sm_diags/run.py @@ -1,14 +1,24 @@ import copy +import os +import pathlib +import subprocess +from datetime import datetime from itertools import chain from typing import List, Union import e3sm_diags # noqa: F401 from e3sm_diags.e3sm_diags_driver import get_default_diags_path, main -from e3sm_diags.logger import custom_logger, move_log_to_prov_dir +from e3sm_diags.logger import ( + LOG_FILENAME, + _update_root_logger_filepath_to_prov_dir, + custom_logger, +) from e3sm_diags.parameter import SET_TO_PARAMETERS from e3sm_diags.parameter.core_parameter import DEFAULT_SETS, CoreParameter from e3sm_diags.parser.core_parser import CoreParser +# Set up a module level logger object. This logger object is a child of the +# root logger. logger = custom_logger(__name__) @@ -79,6 +89,14 @@ def run_diags( params = self.get_run_parameters(parameters, use_cfg) params_results = None + # Make the provenance directory to store the log file. + prov_dir = os.path.join(params[0].results_dir, "prov") + pathlib.Path(prov_dir).mkdir(parents=True, exist_ok=True) + + log_dir = os.path.join(prov_dir, LOG_FILENAME) + _update_root_logger_filepath_to_prov_dir(log_dir) + self._log_diagnostic_run_info(log_dir) + if params is None or len(params) == 0: raise RuntimeError( "No parameters we able to be extracted. Please " @@ -90,12 +108,62 @@ def run_diags( except Exception: logger.exception("Error traceback:", exc_info=True) - # param_results might be None because the run(s) failed, so move - # the log using the `params[0].results_dir` instead. - move_log_to_prov_dir(params[0].results_dir) - return params_results + def _log_diagnostic_run_info(self, log_path: str): + """Logs information about the diagnostic run. + + This method is useful for tracking the provenance of the diagnostic run + and understanding the context of the diagnostic results. + + It logs the following information: + - Timestamp of the run + - Version information (Git branch and commit hash or module version) + + Parameters + ---------- + log_path : str + The path to the log file, which is stored in the `results_dir` + sub-directory called "prov". + + Notes + ----- + The version information is retrieved from the current Git branch and + commit hash. If the Git information is not available, it falls back + to the version defined in the `e3sm_diags` module. + """ + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + try: + branch_name = ( + subprocess.check_output( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], + cwd=os.path.dirname(__file__), + ) + .strip() + .decode("utf-8") + ) + commit_hash = ( + subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=os.path.dirname(__file__) + ) + .strip() + .decode("utf-8") + ) + version_info = f"branch {branch_name} with commit {commit_hash}" + except subprocess.CalledProcessError: + version_info = f"version {e3sm_diags.__version__}" + + logger.info( + f"\n{'=' * 80}\n" + f"E3SM Diagnostics Run\n" + f"{'-' * 20}\n" + f"Timestamp: {timestamp}\n" + f"Version Info: {version_info}\n" + f"Log Filepath: {log_path}\n" + f"{'=' * 80}\n" + ) + def get_run_parameters( self, parameters: List[CoreParameter], use_cfg: bool = True ) -> List[CoreParameter]: @@ -369,9 +437,6 @@ def get_parent(param): attr_value = getattr(parent, attr) setattr(parameters[i], attr, attr_value) - logger.info( - list(set(nondefault_param_parent) - set(nondefault_param_child)) - ) for attr in list( set(nondefault_param_parent) - set(nondefault_param_child) ):