diff --git a/docs/source/dev_guide/testing.rst b/docs/source/dev_guide/testing.rst index a6b0dace..14e2320c 100644 --- a/docs/source/dev_guide/testing.rst +++ b/docs/source/dev_guide/testing.rst @@ -40,7 +40,7 @@ Before running ``tests/integration/test_complete_run.py`` run the following: Commands to run to replace outdated expected files -------------------------------------------------- -To replace the expected bash files for ``test_bash_generation.py`` run the following: +To replace the expected files for ``test_bash_generation.py`` run the following: .. code:: @@ -59,6 +59,16 @@ To replace the expected files for ``test_campaign.py`` run the following: cd ./tests/integration/update_campaign_expected_files.sh +To replace the expected files for ``test_defaults.py`` run the following: + + .. code:: + + rm -rf /lcrc/group/e3sm/public_html/zppy_test_resources/test_defaults_expected_files + mkdir -p /lcrc/group/e3sm/public_html/zppy_test_resources/test_defaults_expected_files + # Your output will now become the new expectation. + # You can just move (i.e., not copy) the output since re-running this test will re-generate the output. + mv test_defaults_output/post/scripts/*.settings /lcrc/group/e3sm/public_html/zppy_test_resources/test_defaults_expected_files + To replace the expected images for ``test_complete_run.py`` run the following: .. code:: diff --git a/docs/source/parameters.rst b/docs/source/parameters.rst index f3be1503..b1c543c5 100644 --- a/docs/source/parameters.rst +++ b/docs/source/parameters.rst @@ -8,244 +8,11 @@ Parameters make use of inheritance. Parameters set in ``[default]`` can be overridden by parameters set in a ``[section]``, which can themselves be overridden by parameters set in a ``[[subsection]``. - - .. warning:: - The following code block lists the types and default values for parameters. - It is not the correct syntax for a configuration file. - Copying and pasting the code block into a configuration file will not work! + Note that some parameters will be overriden by defaults if you define them too high up in the inheritance hierarchy. .. warning:: The ``amwg`` section is user-contributed and is not officially supported/documented! -The following is adapted from ``zppy/zppy/templates/default.ini`` and explains the -types and default values for the parameters. :: - - [default] - # The directory to be post-processed - input = string - # The specific subdirectory with the atmospheric data - input_subdir = string(default="archive/atm/hist") - # Where the post-processing results (`post` directory) should go - output = string - # The case name of the simulation - case = string - # Where the post-processing visuals should go (to be viewed online) - www = string - # Set to True to keep temporary directories/files after zppy completes - debug = boolean(default=False) - # The partition of the machine to run on - partition = string(default="") - # This should be set to True if you don't want the batch jobs to be submitted - dry_run = boolean(default=False) - # Specify which campaign you are running. - campaign = string(default="none") - # Set up the environment -- this is where you can tell zppy to use a custom conda environment. - # To use a custom conda environment, you can set `environment_commands="source ; conda activate "`. - environment_commands = string - - [climo] - # Set to True to run this section - active = boolean(default=True) - # Quality of service - qos = string(default="regular") - # The number of nodes to use - nodes = integer(default=4) - # The maximum time to run - walltime = string(default="02:00:00") - # Which files to use as input - input_files = string(default="eam.h0") - # The frequency of the data. Options include "monthly", "diurnal_8xdaily" - frequency = string(default="monthly") - # The mapping file to use - mapping_file = string(default="") - # The grid to use - grid = string(default="") - # The years to run; "1:100:20" would mean process years 1-100 in 20-year increments - years = string_list(default=list("")) - exclude = boolean(default=False) - # The variables to process - vars = string(default="") - - [ts] - # Set to True to run this section - active = boolean(default=True) - # Quality of service - qos = string(default="regular") - # The number of nodes to use - nodes = integer(default=1) - # The maximum time to run - walltime = string(default="02:00:00") - # Which files to use as input - input_files = string(default="eam.h0") - # The frequency of the data. Options include "monthly", "diurnal_8xdaily" - frequency = string(default="monthly") - # The mapping file to use - mapping_file = string(default="") - # The grid to use - grid = string(default="") - area_nm = string(default="area") - # The variables to process - vars = string(default="FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U") - # The years to run; "1:100:10" would mean process years 1-100 in 10-year increments - years = string_list(default=list("")) - # Days per file - dpf = integer(default=30) - # Time-steps per day - tpd = integer(default=1) - - [tc_analysis] - # Set to True to run this section - active = boolean(default=True) - # Quality of service - qos = string(default="regular") - # The number of nodes to use - nodes = integer(default=1) - # The maximum time to run - walltime = string(default="02:00:00") - # The years to run; "1:100:10" would mean process years 1-100 in 10-year increments - years = string_list(default=list("")) - # Which files to use as input - input_files = string(default="eam.h2") - # The following parameter isn't defined in `default.ini` - # The scratch directory - scratch = string - - [e3sm_diags] - # Set to True to run this section - active = boolean(default=True) - # The grid to use - grid = string(default="") - # Quality of service - qos = string(default="regular") - # The number of nodes to use - nodes = integer(default=1) - # The maximum time to run - walltime = string(default="02:00:00") - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - reference_data_path = string(default="") - # Used for `test_name` and `short_test_name` in https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - short_name = string(default="") - cfg = string(default="") - # The sets to run - # Note that "enso_diags","qbo","area_mean_time_series" require time-series data. - # They also require `obs_ts` and `ref_start_yr` to be set. - # "qbo" requires `ref_final_yr` to be set as well. - # "diurnal_cycle" requires `climo_diurnal_subsection`, `climo_diurnal_frequency`, and `ds_obs_climo` to be set. - sets = string_list(default=list("lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d","enso_diags","qbo","diurnal_cycle","annual_cycle_zonal_mean","streamflow","zonal_mean_2d_stratosphere")) - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - backend = string(default="mpl") - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - diff_title = string(default="Model - Observations") - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - run_type = string(default="model_vs_obs") - # Used to label the results directory - tag = string(default="model_vs_obs") - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - output_format = string_list(default=list("png")) - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - output_format_subplot = string_list(default=list()) - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - multiprocessing = boolean(default=True) - # See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html - num_workers = integer(default=24) - # Variables to process - vars = string(default="FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U") - # Name of the subsection of `[climo]` to use for "diurnal_cycle" runs - climo_diurnal_subsection = string(default="") - # Name of the frequency from `[climo]` to use for "diurnal_cycle" runs - climo_diurnal_frequency = string(default="") - # The following parameters aren't defined in `default.ini` - # Path to observation data for diurnal cycle runs - dc_obs_climo = string - # Path to observation data for most time-series-required ("enso_diags","qbo","area_mean_time_series") runs - obs_ts = string - # Path to observation data for streamflow diagnostics - streamflow_obs_ts = string - # Path to observation data for tropical cyclone diagnostics - tc_obs = string - # Start year for the reference data - ref_start_yr = string - # End year (i.e., the last year to use) for the reference data - ref_end_yr = string - # Final year (i.e., the last available year) for the reference data - ref_final_yr = string - - [e3sm_diags_vs_model] - # Set to True to run this section - active = boolean(default=True) - grid = string(default="") - # Quality of service - qos = string(default="regular") - nodes = integer(default=1) - walltime = string(default="02:00:00") - reference_data_path = string(default="") - ref_name = string(default="") - short_ref_name = string(default="") - short_name = string(default="") - swap_test_ref = boolean(default=False) - sets = string_list(default=list("lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d")) - backend = string(default="mpl") - diff_title = string(default="Difference") - run_type = string(default="model_vs_model") - tag = string(default="model_vs_model") - output_format = string_list(default=list("png")) - output_format_subplot = string_list(default=list("")) - multiprocessing = boolean(default=True) - num_workers = integer(default=24) - - years = string_list(default=list("")) - ref_years = string_list(default=list("")) - - [amwg] - # Set to True to run this section - active = boolean(default=True) - - [mpas_analysis] - # Set to True to run this section - active = boolean(default=True) - shortTermArchive = boolean(default=True) - # Quality of service - qos = string(default="regular") - # The number of nodes to use - nodes = integer(default=1) - # The maximum time to run - walltime = string(default="06:00:00") - parallelTaskCount = integer(default=12) - ncclimoParallelMode = string(default="bck") - ncclimoThreads = integer(default=12) - mapMpiTasks = integer(default=6) - cache = boolean(default=True) - purge = boolean(default=False) - PostMOC = boolean(default=False) - mpaso_nml = string(default="mpaso_in") - mpassi_nml = string(default="mpassi_in") - stream_ocn = string(default="streams.ocean") - stream_ice = string(default="streams.seaice") - generate = string_list(default=list('all', 'no_landIceCavities', 'no_BGC', 'no_icebergs', 'no_min', 'no_max', 'no_sose', 'no_climatologyMapAntarcticMelt', 'no_regionalTSDiagrams', 'no_timeSeriesAntarcticMelt', 'no_timeSeriesOceanRegions', 'no_climatologyMapSose', 'no_woceTransects', 'no_soseTransects', 'no_geojsonTransects', 'no_oceanRegionalProfiles', 'no_hovmollerOceanRegions')) - # Note that `environment_commands` needs to be the same for all related runs of `mpas_analysis`. - # For example, if years 1-50 are run using one environment and years 51-100 are run using another, MPAS-Analysis may fail. - - [global_time_series] - # Set to True to run this section - active = boolean(default=True) - # The specific subdirectory with the ocean data - input_subdir = string(default="archive/ocn/hist") - # The number of nodes to use - nodes = integer(default=1) - # The maximum time to run - walltime = string(default="02:00:00") - # The color to be used for the graphs. - color = string(default="Blue") - # "1-100" would plot years 1 to 100 on the graphs. - years = string_list(default=list("")) - # The number of years in a time-series file. - ts_num_years = integer(default=10) - # What the plot files should be named - figstr = string(default="") - moc_file = string(default="") - experiment_name = string(default="") - ts_years = string_list(default=list("")) - climo_years = string_list(default=list("")) - # Set to True to skip figures requiring ocean data. - atmosphere_only = boolean(default=False) +See `parameter defaults `_ +on GitHub for a complete list of parameters and their default values. diff --git a/tests/integration/test_bash_generation.cfg b/tests/integration/test_bash_generation.cfg index 80e7b5c9..2978054b 100644 --- a/tests/integration/test_bash_generation.cfg +++ b/tests/integration/test_bash_generation.cfg @@ -1,14 +1,13 @@ [default] +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_bash_generation_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" +www = www/path [climo] active = True @@ -16,93 +15,85 @@ years = "1:100:20", "1:100:50", # Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" + frequency = "diurnal_8xdaily" input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc vars = "PRECT" - frequency = "diurnal_8xdaily" + [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars + input_files = "eam.h0" [[ atm_daily_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h1" frequency = "daily" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc + input_files = "eam.h1" vars = "PRECT" [[ atm_monthly_glb ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" + input_files = "eam.h0" mapping_file = "glb" # Use default vars [[ land_monthly ]] - input_subdir = "archive/lnd/hist" - input_files = "elm.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc + input_files = "elm.h0" + input_subdir = "archive/lnd/hist" vars = "FSH,RH2M" [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" + extra_vars = 'areatotal2' frequency = "monthly" + input_files = "mosart.h0" + input_subdir = "archive/rof/hist" mapping_file = "" vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' [tc_analysis] active = True -years = "1:100:20", "1:100:50", scratch = "/lcrc/globalscratch/ac.forsyth2" +years = "1:100:20", "1:100:50", [e3sm_diags] active = True -years = "1:100:20", "1:100:50", +climo_diurnal_frequency = "diurnal_8xdaily" +climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 +short_name = case_name ts_num_years = 10 -# Use default `sets` +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' - obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" - climo_diurnal_frequency = "diurnal_8xdaily" + obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' tc_obs = '/lcrc/group/e3sm/public_html/diagnostics/observations/Atm/tc-analysis/' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" [global_time_series] active = True -years = "1-100", -ts_num_years = 10 +climo_years ="21-50", "51-100", +experiment_name=case_name figstr=global_ts moc_file=mocTimeSeries_0001-0100.nc -experiment_name=case_name +ts_num_years = 10 ts_years = "1-50", "1-100", -climo_years ="21-50", "51-100", +years = "1-100", diff --git a/tests/integration/test_campaign_cryosphere.cfg b/tests/integration/test_campaign_cryosphere.cfg index e27453a2..81b4ff99 100644 --- a/tests/integration/test_campaign_cryosphere.cfg +++ b/tests/integration/test_campaign_cryosphere.cfg @@ -1,78 +1,72 @@ [default] +campaign = "cryosphere" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_campaign_cryosphere_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "cryosphere" +www = www/path [climo] active = True years = "1:100:20", "1:100:50", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" + frequency = "diurnal_8xdaily" input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc vars = "PRECT" - frequency = "diurnal_8xdaily" [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" + extra_vars = 'areatotal2' frequency = "monthly" + input_files = "mosart.h0" + input_subdir = "archive/rof/hist" mapping_file = "" vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' [tc_analysis] active = True -years = "1:100:20", "1:100:50", scratch = "/lcrc/globalscratch/ac.forsyth2" +years = "1:100:20", "1:100:50", [e3sm_diags] active = True -years = "1:100:20", "1:100:50", +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 +short_name = case_name ts_num_years = 10 -# Use default `sets` +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' - reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' - obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" climo_diurnal_frequency = "diurnal_8xdaily" + climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" + dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' + obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' + reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' tc_obs = '/lcrc/group/e3sm/public_html/diagnostics/observations/Atm/tc-analysis/' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_campaign_cryosphere_override.cfg b/tests/integration/test_campaign_cryosphere_override.cfg index eaca3694..ae4ce2f3 100644 --- a/tests/integration/test_campaign_cryosphere_override.cfg +++ b/tests/integration/test_campaign_cryosphere_override.cfg @@ -1,72 +1,50 @@ [default] +campaign = "cryosphere" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_campaign_cryosphere_override_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "cryosphere" +www = www/path [climo] active = True years = "1:100:20", "1:100:50", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" - [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - vars = "PRECT" - frequency = "diurnal_8xdaily" - [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" - frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars - - [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" frequency = "monthly" - mapping_file = "" - vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [e3sm_diags] active = True -years = "1:100:20", "1:100:50", -ts_num_years = 10 +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 sets = "qbo", # Override `sets` from `campaign = "cryosphere"` +short_name = case_name +ts_num_years = 10 +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' - reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" - climo_diurnal_frequency = "diurnal_8xdaily" - streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' + reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_campaign_high_res_v1.cfg b/tests/integration/test_campaign_high_res_v1.cfg index 2fce5628..782bddd6 100644 --- a/tests/integration/test_campaign_high_res_v1.cfg +++ b/tests/integration/test_campaign_high_res_v1.cfg @@ -1,21 +1,19 @@ [default] +campaign = "high_res_v1" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist output = test_campaign_high_res_v1_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "high_res_v1" +www = www/path [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_campaign_none.cfg b/tests/integration/test_campaign_none.cfg index 56355283..82ec8469 100644 --- a/tests/integration/test_campaign_none.cfg +++ b/tests/integration/test_campaign_none.cfg @@ -1,78 +1,72 @@ [default] +campaign = "none" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_campaign_none_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "none" +www = www/path [climo] active = True years = "1:100:20", "1:100:50", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" + frequency = "diurnal_8xdaily" input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc vars = "PRECT" - frequency = "diurnal_8xdaily" [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" + extra_vars = 'areatotal2' frequency = "monthly" + input_files = "mosart.h0" + input_subdir = "archive/rof/hist" mapping_file = "" vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' [tc_analysis] active = True -years = "1:100:20", "1:100:50", scratch = "/lcrc/globalscratch/ac.forsyth2" +years = "1:100:20", "1:100:50", [e3sm_diags] active = True -years = "1:100:20", "1:100:50", +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 +short_name = case_name ts_num_years = 10 -# Use default `sets` +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' - reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' - obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" climo_diurnal_frequency = "diurnal_8xdaily" + climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" + dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' + obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' + reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' tc_obs = '/lcrc/group/e3sm/public_html/diagnostics/observations/Atm/tc-analysis/' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_campaign_water_cycle.cfg b/tests/integration/test_campaign_water_cycle.cfg index 836f912f..a961b18b 100644 --- a/tests/integration/test_campaign_water_cycle.cfg +++ b/tests/integration/test_campaign_water_cycle.cfg @@ -1,78 +1,72 @@ [default] +campaign = "water_cycle" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_campaign_water_cycle_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "water_cycle" +www = www/path [climo] active = True years = "1:100:20", "1:100:50", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" + frequency = "diurnal_8xdaily" input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc vars = "PRECT" - frequency = "diurnal_8xdaily" [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" + extra_vars = 'areatotal2' frequency = "monthly" + input_files = "mosart.h0" + input_subdir = "archive/rof/hist" mapping_file = "" vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' [tc_analysis] active = True -years = "1:100:20", "1:100:50", scratch = "/lcrc/globalscratch/ac.forsyth2" +years = "1:100:20", "1:100:50", [e3sm_diags] active = True -years = "1:100:20", "1:100:50", +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 +short_name = case_name ts_num_years = 10 -# Use default `sets` +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' - reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' - obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" climo_diurnal_frequency = "diurnal_8xdaily" + climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" + dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' + obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' + reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' tc_obs = '/lcrc/group/e3sm/public_html/diagnostics/observations/Atm/tc-analysis/' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_campaign_water_cycle_override.cfg b/tests/integration/test_campaign_water_cycle_override.cfg index 0bf96605..5de5cf0b 100644 --- a/tests/integration/test_campaign_water_cycle_override.cfg +++ b/tests/integration/test_campaign_water_cycle_override.cfg @@ -1,72 +1,50 @@ [default] +campaign = "water_cycle" +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = . input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc output = test_campaign_water_cycle_override_output -case = case_name -www = www/path partition = compute -ref_start_yr = 1979 -ref_final_yr = 2016 -dry_run = True -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" -campaign = "water_cycle" +www = www/path [climo] active = True years = "1:100:20", "1:100:50", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" - [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - vars = "PRECT" - frequency = "diurnal_8xdaily" - [ts] active = True years = "1:100:10", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" - frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars - - [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" frequency = "monthly" - mapping_file = "" - vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [e3sm_diags] active = True -years = "1:100:20", "1:100:50", -ts_num_years = 10 +grid = '180x360_aave' +ref_final_yr = 2016 +ref_start_yr = 1979 sets = "qbo", # Override `sets` from `campaign = "water_cycle"` +short_name = case_name +ts_num_years = 10 +years = "1:100:20", "1:100:50", [[ atm_monthly_180x360_aave ]] - short_name = case_name - grid = '180x360_aave' - reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" - climo_diurnal_frequency = "diurnal_8xdaily" - streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' + reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' [mpas_analysis] active = True -walltime = "24:00:00" -parallelTaskCount = 6 -ts_years = "1-50", "1-100", -enso_years = "11-50", "11-100", climo_years ="21-50", "51-100", +enso_years = "11-50", "11-100", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-50", "1-100", +walltime = "24:00:00" diff --git a/tests/integration/test_complete_run.cfg b/tests/integration/test_complete_run.cfg index 33d5b73a..da433c85 100644 --- a/tests/integration/test_complete_run.cfg +++ b/tests/integration/test_complete_run.cfg @@ -1,31 +1,27 @@ [default] +case = v2.LR.historical_0201 +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" input = /lcrc/group/e3sm/ac.forsyth2/E3SMv2/v2.LR.historical_0201 input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc # To run this test, edit `output` and `www` in this file, along with `actual_images_dir` in test_complete_run.py output = /lcrc/group/e3sm/ac.forsyth2/zppy_test_complete_run_output/v2.LR.historical_0201 -case = v2.LR.historical_0201 -www = /lcrc/group/e3sm/public_html/diagnostic_output/ac.forsyth2/zppy_test_complete_run_www partition = debug -ref_start_yr = 1985 -ref_final_yr = 2014 -environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" +www = /lcrc/group/e3sm/public_html/diagnostic_output/ac.forsyth2/zppy_test_complete_run_www [climo] active = True walltime = "00:30:00" years = "1850:1854:2", "1850:1854:4", -# Use default vars [[ atm_monthly_180x360_aave ]] - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc frequency = "monthly" [[ atm_monthly_diurnal_8xdaily_180x360_aave ]] - input_subdir = "archive/atm/hist" + frequency = "diurnal_8xdaily" input_files = "eam.h4" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc + input_subdir = "archive/atm/hist" vars = "PRECT" - frequency = "diurnal_8xdaily" [ts] active = True @@ -33,97 +29,94 @@ walltime = "00:30:00" years = "1850:1854:2", [[ atm_monthly_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc - # Use default vars + input_files = "eam.h0" + input_subdir = "archive/atm/hist" [[ atm_daily_180x360_aave ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h1" frequency = "daily" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc + input_files = "eam.h1" + input_subdir = "archive/atm/hist" vars = "PRECT" [[ atm_monthly_glb ]] - input_subdir = "archive/atm/hist" - input_files = "eam.h0" frequency = "monthly" + input_files = "eam.h0" + input_subdir = "archive/atm/hist" mapping_file = "glb" years = "1850:1860:5", - # Use default vars [[ land_monthly ]] - input_subdir = "archive/lnd/hist" - input_files = "elm.h0" frequency = "monthly" - mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc + input_files = "elm.h0" + input_subdir = "archive/lnd/hist" vars = "FSH,RH2M" [[ rof_monthly ]] - input_subdir = "archive/rof/hist" - input_files = "mosart.h0" + extra_vars = 'areatotal2' frequency = "monthly" + input_files = "mosart.h0" + input_subdir = "archive/rof/hist" mapping_file = "" vars = "RIVER_DISCHARGE_OVER_LAND_LIQ" - extra_vars = 'areatotal2' [tc_analysis] active = True +scratch = "/lcrc/globalscratch/ac.forsyth2" walltime = "00:30:00" years = "1850:1852:2", -scratch = "/lcrc/globalscratch/ac.forsyth2" [e3sm_diags] active = True -walltime = "00:30:00" -years = "1850:1854:2", "1850:1854:4", -ts_num_years = 2 -short_name = 'v2.LR.historical_0201' grid = '180x360_aave' -reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' obs_ts = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/time-series' +ref_final_yr = 2014 +ref_start_yr = 1985 +reference_data_path = '/lcrc/soft/climate/e3sm_diags_data/obs_for_e3sm_diags/climatology' +short_name = 'v2.LR.historical_0201' +ts_num_years = 2 +walltime = "00:30:00" +years = "1850:1854:2", "1850:1854:4", [[ atm_monthly_180x360_aave ]] - sets = "lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d","enso_diags","qbo","diurnal_cycle","annual_cycle_zonal_mean","streamflow", "zonal_mean_2d_stratosphere", - dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' - climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" climo_diurnal_frequency = "diurnal_8xdaily" + climo_diurnal_subsection = "atm_monthly_diurnal_8xdaily_180x360_aave" + dc_obs_climo = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/climatology' + sets = "lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d","enso_diags","qbo","diurnal_cycle","annual_cycle_zonal_mean","streamflow", "zonal_mean_2d_stratosphere", streamflow_obs_ts = '/lcrc/group/e3sm/public_html/e3sm_diags_test_data/unit_test_complete_run/obs/time-series/' [[ atm_monthly_180x360_aave_environment_commands ]] - sets = "qbo", - environment_commands="source /home/ac.forsyth2/miniconda3/etc/profile.d/conda.sh; conda activate e3sm_diags_dev_20220228" climo_subsection = "atm_monthly_180x360_aave" + environment_commands="source /home/ac.forsyth2/miniconda3/etc/profile.d/conda.sh; conda activate e3sm_diags_dev_20220228" + sets = "qbo", ts_subsection = "atm_monthly_180x360_aave" [[ atm_monthly_180x360_aave_tc_analysis ]] # Running as its own subtask because tc_analysis requires jobs to run sequentially, which slows down testing - sets = "tc_analysis", - years = "1850:1852:2", climo_subsection = "atm_monthly_180x360_aave" - ts_subsection = "atm_monthly_180x360_aave" + sets = "tc_analysis", tc_obs = '/lcrc/group/e3sm/public_html/diagnostics/observations/Atm/tc-analysis/' + ts_subsection = "atm_monthly_180x360_aave" + years = "1850:1852:2", [mpas_analysis] active = True -walltime = "00:30:00" -partition = compute -parallelTaskCount = 6 anomalyRefYear = 1850 -ts_years = "1850-1854", "1850-1860", -enso_years = "1850-1854", "1855-1860", climo_years ="1850-1854", "1855-1860", +enso_years = "1850-1854", "1855-1860", mesh = "EC30to60E2r2" +parallelTaskCount = 6 +partition = compute +ts_years = "1850-1854", "1850-1860", +walltime = "00:30:00" [global_time_series] active = True -walltime = "00:30:00" -years = "1850-1860", -ts_num_years = 5 +climo_years ="1850-1854", "1855-1860", +experiment_name = "v2.LR.historical_0201" figstr = "v2_historical_0201" moc_file=mocTimeSeries_1850-1860.nc -experiment_name = "v2.LR.historical_0201" +ts_num_years = 5 ts_years = "1850-1854", "1850-1860", -climo_years ="1850-1854", "1855-1860", +walltime = "00:30:00" +years = "1850-1860", diff --git a/tests/integration/test_defaults.cfg b/tests/integration/test_defaults.cfg new file mode 100644 index 00000000..8534cdc7 --- /dev/null +++ b/tests/integration/test_defaults.cfg @@ -0,0 +1,58 @@ +[default] +case = case_name +dry_run = True +environment_commands = "source /lcrc/soft/climate/e3sm-unified/load_latest_e3sm_unified_chrysalis.sh" +input = . +# tc_analysis will override this value because it has a lower-level default +input_files = "eam.h0" +# global_time_series will override this value because it has a lower-level default +input_subdir = archive/atm/hist +mapping_file = /home/ac.zender/data/maps/map_ne30pg2_to_cmip6_180x360_aave.20200201.nc +# climo will override this value because it has a lower-level default +nodes = 1 +output = test_defaults_output +partition = compute +# climo will override this value because it has a lower-level default +vars = "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U" +# mpas_analysis will override this value because it has a lower-level default +walltime = "02:00:00" +www = www/path + +[climo] +active = True +years= "1:20:20", + [[ atm_monthly_180x360_aave ]] + frequency = "monthly" + +[ts] +active = True +years = "1:20:10", + + [[ atm_monthly_glb ]] + frequency = "monthly" + input_files = "eam.h0" + mapping_file = "glb" + +[tc_analysis] +active = True +scratch = "/lcrc/globalscratch/ac.forsyth2" +years= "1:20:20", + +[mpas_analysis] +active = True +climo_years ="1-20", +enso_years = "1-20", +mesh = "EC30to60E2r2" +parallelTaskCount = 6 +ts_years = "1-10", +walltime = "24:00:00" + +[global_time_series] +active = True +climo_years ="1-20", +experiment_name=case_name +figstr=global_ts +moc_file=mocTimeSeries_0001-020.nc +ts_num_years = 10 +ts_years = "1-20", +years = "1-20", diff --git a/tests/integration/test_defaults.py b/tests/integration/test_defaults.py new file mode 100644 index 00000000..c4cb1ebf --- /dev/null +++ b/tests/integration/test_defaults.py @@ -0,0 +1,20 @@ +import os +import unittest + + +class TestDefaults(unittest.TestCase): + def test_defaults(self): + self.assertEqual(os.system("zppy -c tests/integration/test_defaults.cfg"), 0) + self.assertEqual(os.system("rm test_defaults_output/post/scripts/*.bash"), 0) + self.assertEqual( + os.system( + "diff -bur -I 'templateDir' test_defaults_output/post/scripts /lcrc/group/e3sm/public_html/zppy_test_resources/test_defaults_expected_files" + ), + 0, + ) + self.assertEqual(os.system("rm -r test_defaults_output"), 0) + + +if __name__ == "__main__": + # Run from top level of repo + unittest.main() diff --git a/tests/test_sections.py b/tests/test_sections.py index 25b8e0a7..3b5169d8 100644 --- a/tests/test_sections.py +++ b/tests/test_sections.py @@ -2,12 +2,36 @@ import pprint import unittest -from configobj import ConfigObj +from configobj import ConfigObj, Section from validate import Validator from zppy.utils import getTasks +def compare(tester, actual, expected): + if actual != expected: + actual_keys = set(actual.keys()) + expected_keys = set(expected.keys()) + if actual_keys != expected_keys: + only_in_actual = actual_keys - expected_keys + print("only_in_actual={}".format(only_in_actual)) + tester.assertEqual(only_in_actual, set()) + only_in_expected = expected_keys - actual_keys + print("only_in_expected={}".format(only_in_expected)) + tester.assertEqual(only_in_expected, set()) + incorrect_values = [] + for key in actual_keys: + if type(actual[key]) == Section: + print("Calling `compare` again on {}".format(key)) + compare(tester, actual[key], expected[key]) + elif actual[key] != expected[key]: + incorrect_values.append((key, actual[key], expected[key])) + print("incorrect_values=") + for v in incorrect_values: + print(v) + tester.assertEqual(incorrect_values, []) + + def get_config(test_case, config_file): # Subdirectory where templates are located templateDir = os.path.join("zppy", "templates") @@ -41,40 +65,42 @@ def test_sections(self): expected_default = { "active": False, "campaign": "none", - "input": "INPUT", - "input_subdir": "INPUT_SUBDIR", - "output": "OUTPUT", "case": "CASE", - "www": "WWWW", - "partition": "SHORT", "debug": False, "dry_run": False, - "campaign": "none", "environment_commands": "", + "frequency": "monthly", + "grid": "", + "input": "INPUT", + "input_files": "eam.h0", + "input_subdir": "INPUT_SUBDIR", + "mapping_file": "", + "output": "OUTPUT", + "nodes": 1, + "partition": "SHORT", + "qos": "regular", "templateDir": "zppy/templates", + "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U", + "walltime": "02:00:00", + "www": "WWWW", + "years": [""], } - self.assertEqual(actual_default, expected_default) + compare(self, actual_default, expected_default) # ts section_name = "ts" actual_section = config[section_name] expected_section = { "active": "True", - "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", - "extra_vars": "", - "mapping_file": "MAPPING_FILE_TS", - "years": ["0001:0020:5"], - "qos": "regular", - "nodes": 1, - "walltime": "02:00:00", - "input_files": "eam.h0", - "frequency": "monthly", - "grid": "", "area_nm": "area", "dpf": 30, + "extra_vars": "", + "mapping_file": "MAPPING_FILE_TS", "tpd": 1, + "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", + "years": ["0001:0020:5"], } - self.assertEqual(actual_section, expected_section) + compare(self, actual_section, expected_section) actual_tasks = getTasks(config, section_name) self.assertEqual(len(actual_tasks), 1) actual_task = actual_tasks[0] @@ -87,6 +113,7 @@ def test_sections(self): "dpf": 30, "dry_run": False, "environment_commands": "", + "extra_vars": "", "frequency": "monthly", "grid": "", "input": "INPUT", @@ -101,32 +128,26 @@ def test_sections(self): "templateDir": "zppy/templates", "tpd": 1, "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", - "extra_vars": "", "walltime": "02:00:00", "www": "WWWW", "years": ["0001:0020:5"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) # climo section_name = "climo" actual_section = config[section_name] expected_section = { "active": "True", - "years": ["0001:0050:50"], + "exclude": False, "mapping_file": "MAPPING_FILE_CLIMO", - "qos": "regular", "nodes": 4, - "walltime": "02:00:00", - "input_files": "eam.h0", - "frequency": "monthly", - "grid": "", - "exclude": False, "vars": "", + "years": ["0001:0050:50"], } - self.assertEqual(actual_section, expected_section) + compare(self, actual_section, expected_section) actual_tasks = getTasks(config, section_name) - self.assertEqual(len(actual_tasks), 1) + compare(self, len(actual_tasks), 1) actual_task = actual_tasks[0] expected_task = { "active": "True", @@ -153,7 +174,7 @@ def test_sections(self): "www": "WWWW", "years": ["0001:0050:50"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) # tc_analysis: test an inactive task section_name = "tc_analysis" @@ -176,70 +197,57 @@ def test_subsections(self): actual_default = config["default"] expected_default = { "active": False, - "input": "INPUT", - "input_subdir": "INPUT_SUBDIR", - "output": "OUTPUT", + "campaign": "none", "case": "CASE", - "www": "WWWW", - "partition": "SHORT", "debug": False, "dry_run": False, - "campaign": "none", "environment_commands": "", + "frequency": "monthly", + "grid": "", + "input": "INPUT", + "input_files": "eam.h0", + "input_subdir": "INPUT_SUBDIR", + "mapping_file": "", + "nodes": 1, + "output": "OUTPUT", + "partition": "SHORT", + "qos": "regular", "templateDir": "zppy/templates", + "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U", + "walltime": "02:00:00", + "www": "WWWW", + "years": [""], } - self.assertEqual(actual_default, expected_default) + compare(self, actual_default, expected_default) # ts section_name = "ts" actual_section = config[section_name] expected_section = { "active": "True", - "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", - "extra_vars": "", - "qos": "regular", - "nodes": 1, - "walltime": "02:00:00", - "input_files": "eam.h0", - "frequency": "monthly", - "mapping_file": "", - "grid": "", "area_nm": "area", - "years": [""], "dpf": 30, + "extra_vars": "", "tpd": 1, "ts_grid1": { - "mapping_file": "MAPPING_FILE_TS_GRID1", - "years": ["0001:0020:5"], - "qos": None, - "nodes": None, - "walltime": None, - "input_files": None, - "frequency": None, - "grid": None, "area_nm": None, - "vars": None, - "extra_vars": None, "dpf": None, + "extra_vars": None, + "mapping_file": "MAPPING_FILE_TS_GRID1", "tpd": None, + "years": ["0001:0020:5"], }, "ts_grid2": { - "mapping_file": "MAPPING_FILE_TS_GRID2", - "years": ["0001:0020:10"], - "qos": None, - "nodes": None, - "walltime": None, - "input_files": None, - "frequency": None, - "grid": None, "area_nm": None, - "vars": None, - "extra_vars": None, "dpf": None, + "extra_vars": None, + "mapping_file": "MAPPING_FILE_TS_GRID2", "tpd": None, + "years": ["0001:0020:10"], }, + "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", } - self.assertEqual(actual_section, expected_section) + compare(self, actual_section, expected_section) actual_tasks = getTasks(config, section_name) self.assertEqual(len(actual_tasks), 2) actual_task = actual_tasks[0] @@ -252,6 +260,7 @@ def test_subsections(self): "dpf": 30, "dry_run": False, "environment_commands": "", + "extra_vars": "", "frequency": "monthly", "grid": "", "input": "INPUT", @@ -266,12 +275,11 @@ def test_subsections(self): "templateDir": "zppy/templates", "tpd": 1, "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", - "extra_vars": "", "walltime": "02:00:00", "www": "WWWW", "years": ["0001:0020:5"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) actual_task = actual_tasks[1] expected_task = { "active": "True", @@ -282,6 +290,7 @@ def test_subsections(self): "dpf": 30, "dry_run": False, "environment_commands": "", + "extra_vars": "", "frequency": "monthly", "grid": "", "input": "INPUT", @@ -296,37 +305,20 @@ def test_subsections(self): "templateDir": "zppy/templates", "tpd": 1, "vars": "FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT", - "extra_vars": "", "walltime": "02:00:00", "www": "WWWW", "years": ["0001:0020:10"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) # climo section_name = "climo" actual_section = config[section_name] expected_section = { "active": "True", - "years": ["0001:0050:50"], - "mapping_file": "MAPPING_FILE_CLIMO", - "qos": "regular", - "nodes": 4, - "walltime": "02:00:00", - "input_files": "eam.h0", - "frequency": "monthly", - "grid": "", - "exclude": False, - "vars": "", "climo_grid1": { "mapping_file": "MAPPING_FILE_CLIMO_GRID1", - "qos": None, "nodes": None, - "walltime": None, - "input_files": None, - "frequency": None, - "grid": None, - "years": None, "exclude": None, "vars": None, }, @@ -334,17 +326,17 @@ def test_subsections(self): "mapping_file": "MAPPING_FILE_CLIMO_GRID2", "years": ["0001:0100:50"], "partition": "LONG", - "qos": None, "nodes": None, - "walltime": None, - "input_files": None, - "frequency": None, - "grid": None, "exclude": None, "vars": None, }, + "exclude": False, + "mapping_file": "MAPPING_FILE_CLIMO", + "nodes": 4, + "vars": "", + "years": ["0001:0050:50"], } - self.assertEqual(actual_section, expected_section) + compare(self, actual_section, expected_section) actual_tasks = getTasks(config, section_name) self.assertEqual(len(actual_tasks), 2) actual_task = actual_tasks[0] @@ -373,7 +365,7 @@ def test_subsections(self): "www": "WWWW", "years": ["0001:0050:50"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) actual_task = actual_tasks[1] expected_task = { "active": "True", @@ -400,7 +392,7 @@ def test_subsections(self): "www": "WWWW", "years": ["0001:0100:50"], } - self.assertEqual(actual_task, expected_task) + compare(self, actual_task, expected_task) if __name__ == "__main__": diff --git a/zppy/templates/default.ini b/zppy/templates/default.ini index d2bea82b..b9c9948d 100644 --- a/zppy/templates/default.ini +++ b/zppy/templates/default.ini @@ -1,124 +1,155 @@ [default] active = boolean(default=False) -input = string -input_subdir = string(default="archive/atm/hist") -output = string +# Specify which campaign you are running. +campaign = string(default="none") +# The case name of the simulation +# NOTE: no default, must be provided by user case = string -www = string +# Set to True to keep temporary directories/files after zppy completes debug = boolean(default=False) -partition = string(default="") +# This should be set to True if you don't want the batch jobs to be submitted dry_run = boolean(default=False) -campaign = string(default="none") +# Set up the environment -- this is where you can tell zppy to use a custom conda environment. +# To use a custom conda environment, you can set `environment_commands="source ; conda activate "`. environment_commands = string(default="") - -[climo] -qos = string(default="regular") -nodes = integer(default=4) -walltime = string(default="02:00:00") -input_files = string(default="eam.h0") +# The frequency of the data. Options include "monthly", "diurnal_8xdaily" frequency = string(default="monthly") -mapping_file = string(default="") +# The grid to use grid = string(default="") +# The directory to be post-processed +# NOTE: no default, must be provided by user +input = string +# Which files to use as input +input_files = string(default="eam.h0") +# The specific subdirectory with the atmospheric data +input_subdir = string(default="archive/atm/hist") +# The mapping file to use +mapping_file = string(default="") +# The number of nodes to use +nodes = integer(default=1) +# Where the post-processing results (`post` directory) should go +# NOTE: no default, must be provided by user +output = string +# The partition of the machine to run on +partition = string(default="") +# Quality of service +qos = string(default="regular") +# The variables to process +vars = string(default="FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U") +# The maximum time to run +walltime = string(default="02:00:00") +# Where the post-processing visuals should go (to be viewed online) +# NOTE: no default, must be provided by user +www = string +# The years to run; "1:100:20" would mean process years 1-100 in 20-year increments years = string_list(default=list("")) + + +[climo] exclude = boolean(default=False) +# NOTE: always overrides value in [default] +nodes = integer(default=4) +# NOTE: always overrides value in [default] vars = string(default="") [[__many__]] - qos = string(default=None) - nodes = integer(default=None) - walltime = string(default=None) - input_files = string(default=None) - frequency = string(default=None) - mapping_file = string(default=None) - grid = string(default=None) - years = string_list(default=None) exclude = boolean(default=None) + nodes = integer(default=None) vars = string(default=None) [ts] -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") -input_files = string(default="eam.h0") -frequency = string(default="monthly") -mapping_file = string(default="") -grid = string(default="") area_nm = string(default="area") -vars = string(default="FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U") -extra_vars = string(default="") -years = string_list(default=list("")) +# Days per file dpf = integer(default=30) +extra_vars = string(default="") +# Time-steps per day tpd = integer(default=1) [[__many__]] - qos = string(default=None) - nodes = integer(default=None) - walltime = string(default=None) - input_files = string(default=None) - frequency = string(default=None) - mapping_file = string(default=None) - grid = string(default=None) area_nm = string(default=None) - vars = string(default=None) - extra_vars = string(default=None) - years = string_list(default=None) dpf = integer(default=None) + extra_vars = string(default=None) tpd = integer(default=None) [tc_analysis] -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") -years = string_list(default=list("")) +# NOTE: always overrides value in [default] input_files = string(default="eam.h2") +# The scratch directory +scratch = string(default="") [e3sm_diags] -grid = string(default="") -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") -reference_data_path = string(default="") -short_name = string(default="") -cfg = string(default="") -sets = string_list(default=list("lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d","enso_diags","qbo","diurnal_cycle","annual_cycle_zonal_mean","streamflow", "zonal_mean_2d_stratosphere", "tc_analysis")) +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html backend = string(default="mpl") +cfg = string(default="") +# Name of the subsection of [climo] to use for "diurnal_cycle" runs +climo_diurnal_frequency = string(default="") +# Name of the frequency from [climo] to use for "diurnal_cycle" runs +climo_diurnal_subsection = string(default="") +# Path to observation data for "diurnal_cycle" runs +dc_obs_climo = string(default="") +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html diff_title = string(default="Model - Observations") -run_type = string(default="model_vs_obs") -tag = string(default="model_vs_obs") -output_format = string_list(default=list("png")) -output_format_subplot = string_list(default=list()) +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html multiprocessing = boolean(default=True) +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html num_workers = integer(default=24) -vars = string(default="FSNTOA,FLUT,FSNT,FLNT,FSNS,FLNS,SHFLX,QFLX,TAUX,TAUY,PRECC,PRECL,PRECSC,PRECSL,TS,TREFHT,CLDTOT,CLDHGH,CLDMED,CLDLOW,U") -climo_diurnal_subsection = string(default="") -climo_diurnal_frequency = string(default="") +# Path to observation data for most time-series-required ("enso_diags","qbo","area_mean_time_series") runs +obs_ts = string(default="") +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html +output_format = string_list(default=list("png")) +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html +output_format_subplot = string_list(default=list()) +# End year (i.e., the last year to use) for the reference data +ref_end_yr = string(default="") +# Final year (i.e., the last available year) for the reference data +ref_final_yr = string(default="") +# Start year for the reference data +ref_start_yr = string(default="") +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html +reference_data_path = string(default="") +# See https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html +run_type = string(default="model_vs_obs") +# The sets to run +# Note that "enso_diags","qbo","area_mean_time_series" require time-series data. +# They also require `obs_ts` and `ref_start_yr` to be set. +# "qbo" requires `ref_final_yr` to be set as well. +# "diurnal_cycle" requires `climo_diurnal_subsection`, `climo_diurnal_frequency`, and `dc_obs_climo` to be set. +# "streamflow" requires `streamflow_obs_ts` to be set. +# "tc_analysis" requires `tc_obs` to be set. +sets = string_list(default=list("lat_lon","zonal_mean_xy","zonal_mean_2d","polar","cosp_histogram","meridional_mean_2d","enso_diags","qbo","diurnal_cycle","annual_cycle_zonal_mean","streamflow", "zonal_mean_2d_stratosphere", "tc_analysis")) +# Used for `test_name` and `short_test_name` in https://e3sm-project.github.io/e3sm_diags/_build/html/master/available-parameters.html +short_name = string(default="") +# Path to observation data for "streamflow" runs +streamflow_obs_ts = string(default="") +# Used to label the results directory +tag = string(default="model_vs_obs") +# Path to observation data for "tc_analysis" runs +tc_obs = string(default="") [[__many__]] - grid = string(default=None) - qos = string(default=None) - nodes = integer(default=None) - walltime = string(default=None) - reference_data_path = string(default=None) - short_name = string(default=None) - cfg = string(default=None) - sets = string_list(default=None) backend = string(default=None) + cfg = string(default=None) + climo_diurnal_frequency = string(default=None) + climo_diurnal_subsection = string(default=None) + dc_obs_climo = string(default=None) diff_title = string(default=None) - run_type = string(default=None) - tag = string(default=None) - output_format = string_list(default=None) - output_format_subplot = string_list(default=None) multiprocessing = boolean(default=None) num_workers = integer(default=None) - vars = string(default=None) - climo_diurnal_subsection = string(default=None) - climo_diurnal_frequency = string(default=None) + obs_ts = string(default=None) + output_format = string_list(default=None) + output_format_subplot = string_list(default=None) + ref_end_yr = string(default=None) + ref_final_yr = string(default=None) + ref_start_yr = string(default=None) + reference_data_path = string(default=None) + run_type = string(default=None) + sets = string_list(default=None) + short_name = string(default=None) + streamflow_obs_ts = string(default=None) + tag = string(default=None) + tc_obs = string(default=None) [e3sm_diags_vs_model] -grid = string(default="") -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") reference_data_path = string(default="") ref_name = string(default="") short_ref_name = string(default="") @@ -133,48 +164,47 @@ output_format = string_list(default=list("png")) output_format_subplot = string_list(default=list("")) multiprocessing = boolean(default=True) num_workers = integer(default=24) - years = string_list(default=list("")) ref_years = string_list(default=list("")) [amwg] years = string_list(default=list("")) -grid = string(default="") -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") tag = string(default="model_vs_obs") [mpas_analysis] -shortTermArchive = boolean(default=True) -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="06:00:00") -parallelTaskCount = integer(default=12) -ncclimoParallelMode = string(default="bck") -ncclimoThreads = integer(default=12) -mapMpiTasks = integer(default=6) +anomalyRefYear = integer(default=1) cache = boolean(default=True) -purge = boolean(default=False) -PostMOC = boolean(default=False) +# Note that environment_commands needs to be the same for all related runs of [mpas_analysis]. +# For example, if years 1-50 are run using one environment and years 51-100 are run using another, MPAS-Analysis may fail. +generate = string_list(default=list('all', 'no_landIceCavities', 'no_BGC', 'no_icebergs', 'no_min', 'no_max', 'no_sose', 'no_climatologyMapAntarcticMelt', 'no_regionalTSDiagrams', 'no_timeSeriesAntarcticMelt', 'no_timeSeriesOceanRegions', 'no_climatologyMapSose', 'no_woceTransects', 'no_soseTransects', 'no_geojsonTransects', 'no_oceanRegionalProfiles', 'no_hovmollerOceanRegions')) +mapMpiTasks = integer(default=6) mpaso_nml = string(default="mpaso_in") mpassi_nml = string(default="mpassi_in") -stream_ocn = string(default="streams.ocean") +ncclimoThreads = integer(default=12) +ncclimoParallelMode = string(default="bck") +parallelTaskCount = integer(default=12) +PostMOC = boolean(default=False) +purge = boolean(default=False) +shortTermArchive = boolean(default=True) stream_ice = string(default="streams.seaice") -anomalyRefYear = integer(default=1) -generate = string_list(default=list('all', 'no_landIceCavities', 'no_BGC', 'no_icebergs', 'no_min', 'no_max', 'no_sose', 'no_climatologyMapAntarcticMelt', 'no_regionalTSDiagrams', 'no_timeSeriesAntarcticMelt', 'no_timeSeriesOceanRegions', 'no_climatologyMapSose', 'no_woceTransects', 'no_soseTransects', 'no_geojsonTransects', 'no_oceanRegionalProfiles', 'no_hovmollerOceanRegions')) +stream_ocn = string(default="streams.ocean") +# NOTE: always overrides value in [default] +walltime = string(default="06:00:00") [global_time_series] -input_subdir = string(default="archive/ocn/hist") -qos = string(default="regular") -nodes = integer(default=1) -walltime = string(default="02:00:00") +# Set to True to skip figures requiring ocean data +atmosphere_only = boolean(default=False) +climo_years = string_list(default=list("")) +# The color to be used for the graphs. color = string(default="Blue") -years = string_list(default=list("")) -ts_num_years = integer(default=10) +experiment_name = string(default="") +# What the plot files should be named figstr = string(default="") +# The specific subdirectory with the ocean data +# NOTE: always overrides value in [default] +input_subdir = string(default="archive/ocn/hist") moc_file = string(default="") -experiment_name = string(default="") +# The number of years in a time-series file +ts_num_years = integer(default=10) ts_years = string_list(default=list("")) -climo_years = string_list(default=list("")) -atmosphere_only = boolean(default=False) +# `years = "1-100",` would plot years 1 to 100 on the graphs.