From 63a2115908d1e6f266300de2ade828531e5897e1 Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Tue, 21 Nov 2023 09:08:33 -0600 Subject: [PATCH 001/310] Point cime to new SystemTest directory for MPAS-O --- cime_config/config_files.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cime_config/config_files.xml b/cime_config/config_files.xml index addb83883ca..42a51b5bfa1 100644 --- a/cime_config/config_files.xml +++ b/cime_config/config_files.xml @@ -98,6 +98,7 @@ char $CIMEROOT/CIME/data/config/config_tests.xml + $COMP_ROOT_DIR_OCN/cime_config/config_tests.xml test env_test.xml @@ -320,6 +321,7 @@ char $CIMEROOT/CIME/SystemTests + $COMP_ROOT_DIR_OCN/cime_config/SystemTests test env_test.xml From a13864945bb08ab89e74ee13a74f106c889986a0 Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Tue, 21 Nov 2023 09:09:23 -0600 Subject: [PATCH 002/310] Add layout for ocean non-bfb tests on chrysalis --- .../testmods_dirs/config_pes_tests.xml | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/cime_config/testmods_dirs/config_pes_tests.xml b/cime_config/testmods_dirs/config_pes_tests.xml index 3301617b9bb..0413347f758 100644 --- a/cime_config/testmods_dirs/config_pes_tests.xml +++ b/cime_config/testmods_dirs/config_pes_tests.xml @@ -284,4 +284,34 @@ + + + + + tests+chrysalis: any compset on oQU240 grid, 1x32x2 NODESxMPIxOMP + 32 + 64 + + 32 + 32 + 32 + 32 + 32 + 32 + 32 + 32 + + + 2 + 2 + 2 + 2 + 2 + 2 + 2 + 2 + + + + From a6b5b997b9a9956d26b41c0eb3950daf213b1b8f Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Tue, 21 Nov 2023 09:12:59 -0600 Subject: [PATCH 003/310] Add MVK-Ocean non-bfb test Python script --- .../cime_config/SystemTests/mvko.py | 394 ++++++++++++++++++ 1 file changed, 394 insertions(+) create mode 100644 components/mpas-ocean/cime_config/SystemTests/mvko.py diff --git a/components/mpas-ocean/cime_config/SystemTests/mvko.py b/components/mpas-ocean/cime_config/SystemTests/mvko.py new file mode 100644 index 00000000000..1505fd7d9e3 --- /dev/null +++ b/components/mpas-ocean/cime_config/SystemTests/mvko.py @@ -0,0 +1,394 @@ +""" +Multivariate test for climate reproducibility using the Kolmogrov-Smirnov (K-S) +test and based on The CESM/E3SM model's multi-instance capability is used to +conduct an ensemble of simulations starting from different initial conditions. + +This class inherits from SystemTestsCommon. +""" + +import os +import json +import logging +import shutil +import xml.etree.ElementTree as ET + +from distutils import dir_util + +import numpy as np +import netCDF4 as nc + +import CIME.test_status +import CIME.utils +from CIME.SystemTests.system_tests_common import SystemTestsCommon +from CIME.case.case_setup import case_setup +from CIME.XML.machines import Machines + +import evv4esm # pylint: disable=import-error +from evv4esm.__main__ import main as evv # pylint: disable=import-error + +evv_lib_dir = os.path.abspath(os.path.dirname(evv4esm.__file__)) +logger = logging.getLogger(__name__) +NINST = 30 + +PERT_FILE_TEMPLATE = "mpaso_oQ240_perturbed_inic_{ens:04d}.nc" + +# No output is on by default for mpas-ocean +OCN_TEST_VARS = [ + "daysSinceStartOfSim", + "ssh", + "velocityZonal", + "velocityMeridional", + "activeTracers", +] + +# daysSinceStartOfSim, icePresent, iceAreaCell, and iceVolumeCell are on by default +ICE_TEST_VARS = ["uVelocityGeo", "vVelocityGeo", "icePressure", "divergence", "shear"] + + +def perturb_init(infile, field_name, outfile, seed=None): + """ + Create perturbed initial conditions file from another netCDF using random uniform. + + Parameters + ---------- + infile : string + Path to initial conditions input file which will be perturbed + field_name : string + Variable name in netCDF file to perturb + outfile : string + Path to output file + seed : int + Integer seed for the random number generator (optional) + + """ + + init_f = nc.Dataset(infile, "r") + field_temp = init_f.variables[field_name] + + # Initialize numpy random generator with a seed + rng = np.random.default_rng(seed) + + # Perturbation between -1e-14 -- +1e-14, same size as the input field + perturbation = rng.uniform(-1e-14, 1e-14, field_temp[:].shape) + field = field_temp[:] + perturbation + + shutil.copy(infile, outfile) + with nc.Dataset(outfile, "a") as out_f: + + field_out = out_f.variables[field_name] + field_out[:] = field + + init_f.close() + + +def modify_stream( + stream_file, + input_file=None, + var_names=None, + output_stream_name="timeSeriesStatsClimatologyOutput", +): + """Add variables to XML streams to specify output.""" + streams = ET.parse(stream_file) + + # Modify the input stream + if input_file is not None: + input_stream = list( + filter( + lambda x: x.get("name") == "input", + streams.getroot().findall("immutable_stream"), + ) + ) + input_stream[0].set("filename_template", input_file) + + # Add variables to a particular stream (Climatology output by default) + clim_stream = list( + filter( + lambda x: x.get("name") == output_stream_name, + streams.getroot().findall("stream"), + ) + ) + clim_stream = clim_stream[0] + if var_names is not None: + # Convert the variable name into xml elements + var_elements = [ET.Element("var", {"name": _var}) for _var in var_names] + + for clim_element in var_elements: + clim_stream.append(clim_element) + + # Only output climatology files yearly + clim_stream.set("output_interval", "01-00-00_00:00:00") + + if input_file is not None or var_elements is not None: + # Only re-write the stream if changes were made + streams.write(stream_file) + + +class MVKO(SystemTestsCommon): + def __init__(self, case): + """ + initialize an object interface to the MVKO test + """ + SystemTestsCommon.__init__(self, case) + + if self._case.get_value("MODEL") == "e3sm": + self.ocn_component = "mpaso" + self.ice_component = "mpassi" + else: + self.ocn_component = "pop" + self.ice_component = "cice" + + if ( + self._case.get_value("RESUBMIT") == 0 + and self._case.get_value("GENERATE_BASELINE") is False + ): + self._case.set_value("COMPARE_BASELINE", True) + else: + self._case.set_value("COMPARE_BASELINE", False) + + def build_phase(self, sharedlib_only=False, model_only=False): + # Only want this to happen once. It will impact the sharedlib build + # so it has to happen there. + caseroot = self._case.get_value("CASEROOT") + if not model_only: + logging.warning("Starting to build multi-instance exe") + for comp in self._case.get_values("COMP_CLASSES"): + self._case.set_value("NTHRDS_{}".format(comp), 1) + + ntasks = self._case.get_value("NTASKS_{}".format(comp)) + + self._case.set_value("NTASKS_{}".format(comp), ntasks * NINST) + if comp != "CPL": + self._case.set_value("NINST_{}".format(comp), NINST) + + self._case.flush() + + case_setup(self._case, test_mode=False, reset=True) + rundir = self._case.get_value("RUNDIR") + + in_data_root = self._case.get_value("DIN_LOC_ROOT") + init_file_path = os.path.join( + in_data_root, + "ocn/mpas-o/oQU240/inic/gmpas-nyf", + "20220404.GMPAS-NYF.T62_oQU240.inic.mpaso.rst.0050-01-01_00000.nc", + ) + for iinst in range(1, NINST + 1): + pert_file_name = PERT_FILE_TEMPLATE.format(ens=iinst) + pert_file = os.path.join(rundir, pert_file_name) + if not os.path.exists(rundir): + logging.warning(f"CREATE {rundir}") + os.mkdir(rundir) + perturb_init(init_file_path, field_name="temperature", outfile=pert_file) + + # Write yearly averages to custom output file + tss_climatology_config = [ + "config_am_timeseriesstatsclimatology_enable = .true.\n", + "config_am_timeseriesstatsclimatology_backward_output_offset = '00-03-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_compute_interval = '00-00-00_01:00:00'\n", + "config_am_timeseriesstatsclimatology_compute_on_startup = .false.\n", + "config_am_timeseriesstatsclimatology_duration_intervals = '01-00-00_00:00'\n", + "config_am_timeseriesstatsclimatology_operation = 'avg'\n", + "config_am_timeseriesstatsclimatology_output_stream = 'timeSeriesStatsClimatologyOutput'\n", + "config_am_timeseriesstatsclimatology_reference_times = '00-01-01_00:00:00'\n", + "config_am_timeseriesstatsclimatology_repeat_intervals = '01-00-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_reset_intervals = '0001-00-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_restart_stream = 'timeSeriesStatsClimatologyRestart'\n", + "config_am_timeseriesstatsclimatology_write_on_startup = .false.\n", + ] + + # Set up ocean namelist to specify climatology output and reduce other output + with open( + "user_nl_{}_{:04d}".format(self.ocn_component, iinst), "w" + ) as nl_ocn_file: + + for _config in tss_climatology_config: + nl_ocn_file.write(_config) + + # Disable ocean output we don't use for this test + nl_ocn_file.write("config_am_highfrequencyoutput_enable = .false.\n") + nl_ocn_file.write( + "config_am_timeseriesstatsmonthlymax_enable = .false.\n" + ) + nl_ocn_file.write( + "config_am_timeseriesstatsmonthlymin_enable = .false.\n" + ) + nl_ocn_file.write("config_am_timeseriesstatsmonthly_enable = .false.\n") + nl_ocn_file.write("config_am_eddyproductvariables_enable = .false.\n") + nl_ocn_file.write( + "config_am_meridionalheattransport_enable = .false.\n" + ) + nl_ocn_file.write("config_am_oceanheatcontent_enable = .false.\n") + # But we want to make sure globalStats output is on + nl_ocn_file.write("config_am_globalstats_enable = .true.\n") + + # Set up sea ice namelist to reduce output + with open( + "user_nl_{}_{:04d}".format(self.ice_component, iinst), "w" + ) as nl_ice_file: + for _config in tss_climatology_config: + nl_ice_file.write(_config) + nl_ice_file.write("config_am_timeseriesstatsdaily_enable = .false.\n") + nl_ice_file.write("config_am_timeseriesstatsmonthly_enable = .false.\n") + nl_ice_file.write("config_am_regionalstatistics_enable = .false.\n") + + if self.ocn_component == "mpaso": + # Set up streams file to get perturbed init file and do yearly climatology + ocn_stream_file = os.path.join( + caseroot, + "SourceMods", + "src.mpaso", + "streams.ocean_{:04d}".format(iinst), + ) + ice_stream_file = os.path.join( + caseroot, + "SourceMods", + "src.mpassi", + "streams.seaice_{:04d}".format(iinst), + ) + # buildnamelist creates the streams file for each instance, copy this to the + # SourceMods directory to make changes to the correct version + shutil.copy(f"{rundir}/streams.ocean_{iinst:04d}", ocn_stream_file) + shutil.copy(f"{rundir}/streams.seaice_{iinst:04d}", ice_stream_file) + + modify_stream( + ocn_stream_file, input_file=pert_file, var_names=OCN_TEST_VARS + ) + modify_stream(ice_stream_file, var_names=ICE_TEST_VARS) + + self.build_indv(sharedlib_only=sharedlib_only, model_only=model_only) + + def run_phase(self): + self.run_indv() + + def _generate_baseline(self): + """ + generate a new baseline case based on the current test + """ + super(MVKO, self)._generate_baseline() + + with CIME.utils.SharedArea(): + basegen_dir = os.path.join( + self._case.get_value("BASELINE_ROOT"), + self._case.get_value("BASEGEN_CASE"), + ) + + rundir = self._case.get_value("RUNDIR") + ref_case = self._case.get_value("RUN_REFCASE") + + env_archive = self._case.get_env("archive") + hists = env_archive.get_all_hist_files( + self._case.get_value("CASE"), + self.ocn_component, + rundir, + ref_case=ref_case, + ) + logger.debug("MVKO additional baseline files: {}".format(hists)) + hists = [os.path.join(rundir, hist) for hist in hists] + for hist in hists: + basename = hist[hist.rfind(self.ocn_component) :] + baseline = os.path.join(basegen_dir, basename) + if os.path.exists(baseline): + os.remove(baseline) + + CIME.utils.safe_copy(hist, baseline, preserve_meta=False) + + def _compare_baseline(self): + with self._test_status: + if int(self._case.get_value("RESUBMIT")) > 0: + # This is here because the comparison is run for each submission + # and we only want to compare once the whole run is finished. We + # need to return a pass here to continue the submission process. + self._test_status.set_status( + CIME.test_status.BASELINE_PHASE, CIME.test_status.TEST_PEND_STATUS + ) + return + + self._test_status.set_status( + CIME.test_status.BASELINE_PHASE, CIME.test_status.TEST_FAIL_STATUS + ) + + run_dir = self._case.get_value("RUNDIR") + case_name = self._case.get_value("CASE") + base_dir = os.path.join( + self._case.get_value("BASELINE_ROOT"), + self._case.get_value("BASECMP_CASE"), + ) + + test_name = "{}".format(case_name.split(".")[-1]) + evv_config = { + test_name: { + "module": os.path.join(evv_lib_dir, "extensions", "kso.py"), + "test-case": "Test", + "test-dir": run_dir, + "ref-case": "Baseline", + "ref-dir": base_dir, + "var-set": "default", + "ninst": NINST, + "critical": 0, + "component": self.ocn_component, + "alpha": 0.05, + "hist-name": "hist.am.timeSeriesStatsClimatology", + } + } + + json_file = os.path.join(run_dir, ".".join([case_name, "json"])) + with open(json_file, "w") as config_file: + json.dump(evv_config, config_file, indent=4) + + evv_out_dir = os.path.join(run_dir, ".".join([case_name, "evv"])) + evv(["-e", json_file, "-o", evv_out_dir]) + + with open(os.path.join(evv_out_dir, "index.json")) as evv_f: + evv_status = json.load(evv_f) + + comments = "" + for evv_ele in evv_status["Page"]["elements"]: + if "Table" in evv_ele: + comments = "; ".join( + "{}: {}".format(key, val[0]) + for key, val in evv_ele["Table"]["data"].items() + ) + if evv_ele["Table"]["data"]["Test status"][0].lower() == "pass": + self._test_status.set_status( + CIME.test_status.BASELINE_PHASE, + CIME.test_status.TEST_PASS_STATUS, + ) + break + + status = self._test_status.get_status(CIME.test_status.BASELINE_PHASE) + mach_name = self._case.get_value("MACH") + mach_obj = Machines(machine=mach_name) + htmlroot = CIME.utils.get_htmlroot(mach_obj) + urlroot = CIME.utils.get_urlroot(mach_obj) + if htmlroot is not None: + with CIME.utils.SharedArea(): + dir_util.copy_tree( + evv_out_dir, + os.path.join(htmlroot, "evv", case_name), + preserve_mode=False, + ) + if urlroot is None: + urlroot = "[{}_URL]".format(mach_name.capitalize()) + viewing = "{}/evv/{}/index.html".format(urlroot, case_name) + else: + viewing = ( + "{}\n" + " EVV viewing instructions can be found at: " + " https://github.com/E3SM-Project/E3SM/blob/master/cime/scripts/" + "climate_reproducibility/README.md#test-passfail-and-extended-output" + "".format(evv_out_dir) + ) + + comments = ( + "{} {} for test '{}'.\n" + " {}\n" + " EVV results can be viewed at:\n" + " {}".format( + CIME.test_status.BASELINE_PHASE, + status, + test_name, + comments, + viewing, + ) + ) + + CIME.utils.append_testlog(comments, self._orig_caseroot) From 058454660985393edbf87a73c965ee36f24d1d22 Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Tue, 21 Nov 2023 09:14:52 -0600 Subject: [PATCH 004/310] Add test configuration file for MPAS-O CIME tests --- .../mpas-ocean/cime_config/config_tests.xml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 components/mpas-ocean/cime_config/config_tests.xml diff --git a/components/mpas-ocean/cime_config/config_tests.xml b/components/mpas-ocean/cime_config/config_tests.xml new file mode 100644 index 00000000000..a89986257e8 --- /dev/null +++ b/components/mpas-ocean/cime_config/config_tests.xml @@ -0,0 +1,23 @@ + + + + + + + + climate reproducibility test using the multivariate K-S test + 1 + FALSE + FALSE + nmonths + 24 + $STOP_OPTION + $STOP_N + $STOP_OPTION + $STOP_N + 0 + + + From 0a82e3d1b7b423bae3ced6e74fd91b76cdb89ad1 Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Mon, 5 Feb 2024 09:31:15 -0600 Subject: [PATCH 005/310] Update intial conditions, fix formatting --- .../cime_config/SystemTests/mvko.py | 99 ++++++++++--------- 1 file changed, 51 insertions(+), 48 deletions(-) diff --git a/components/mpas-ocean/cime_config/SystemTests/mvko.py b/components/mpas-ocean/cime_config/SystemTests/mvko.py index 1505fd7d9e3..de6e6edb30e 100644 --- a/components/mpas-ocean/cime_config/SystemTests/mvko.py +++ b/components/mpas-ocean/cime_config/SystemTests/mvko.py @@ -32,6 +32,8 @@ PERT_FILE_TEMPLATE = "mpaso_oQ240_perturbed_inic_{ens:04d}.nc" +INIT_FILE_NAME = "20231204.GMPAS-NYF.T62_oQU240.v3beta.mpaso.rst.0401-01-01_00000.nc" + # No output is on by default for mpas-ocean OCN_TEST_VARS = [ "daysSinceStartOfSim", @@ -124,6 +126,8 @@ def modify_stream( class MVKO(SystemTestsCommon): + """MVK-Ocean SystemTest class.""" + def __init__(self, case): """ initialize an object interface to the MVKO test @@ -146,58 +150,60 @@ def __init__(self, case): self._case.set_value("COMPARE_BASELINE", False) def build_phase(self, sharedlib_only=False, model_only=False): + """ + Create instance namelists, stream files, and initial conditions. + """ # Only want this to happen once. It will impact the sharedlib build # so it has to happen there. caseroot = self._case.get_value("CASEROOT") if not model_only: logging.warning("Starting to build multi-instance exe") for comp in self._case.get_values("COMP_CLASSES"): - self._case.set_value("NTHRDS_{}".format(comp), 1) + self._case.set_value(f"NTHRDS_{comp}", 1) - ntasks = self._case.get_value("NTASKS_{}".format(comp)) + ntasks = self._case.get_value(f"NTASKS_{comp}") - self._case.set_value("NTASKS_{}".format(comp), ntasks * NINST) + self._case.set_value(f"NTASKS_{comp}", ntasks * NINST) if comp != "CPL": - self._case.set_value("NINST_{}".format(comp), NINST) + self._case.set_value(f"NINST_{comp}", NINST) self._case.flush() case_setup(self._case, test_mode=False, reset=True) rundir = self._case.get_value("RUNDIR") - in_data_root = self._case.get_value("DIN_LOC_ROOT") init_file_path = os.path.join( - in_data_root, + self._case.get_value("DIN_LOC_ROOT"), "ocn/mpas-o/oQU240/inic/gmpas-nyf", - "20220404.GMPAS-NYF.T62_oQU240.inic.mpaso.rst.0050-01-01_00000.nc", + INIT_FILE_NAME, ) + # Write yearly averages to custom output file + tss_climatology_config = [ + "config_am_timeseriesstatsclimatology_enable = .true.\n", + "config_am_timeseriesstatsclimatology_backward_output_offset = '00-03-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_compute_interval = '00-00-00_01:00:00'\n", + "config_am_timeseriesstatsclimatology_compute_on_startup = .false.\n", + "config_am_timeseriesstatsclimatology_duration_intervals = '01-00-00_00:00'\n", + "config_am_timeseriesstatsclimatology_operation = 'avg'\n", + "config_am_timeseriesstatsclimatology_output_stream = 'timeSeriesStatsClimatologyOutput'\n", + "config_am_timeseriesstatsclimatology_reference_times = '00-01-01_00:00:00'\n", + "config_am_timeseriesstatsclimatology_repeat_intervals = '01-00-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_reset_intervals = '0001-00-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_restart_stream = 'timeSeriesStatsClimatologyRestart'\n", + "config_am_timeseriesstatsclimatology_write_on_startup = .false.\n", + ] + for iinst in range(1, NINST + 1): pert_file_name = PERT_FILE_TEMPLATE.format(ens=iinst) pert_file = os.path.join(rundir, pert_file_name) if not os.path.exists(rundir): - logging.warning(f"CREATE {rundir}") + logging.warning("CREATE %s", rundir) os.mkdir(rundir) perturb_init(init_file_path, field_name="temperature", outfile=pert_file) - # Write yearly averages to custom output file - tss_climatology_config = [ - "config_am_timeseriesstatsclimatology_enable = .true.\n", - "config_am_timeseriesstatsclimatology_backward_output_offset = '00-03-00_00:00:00'\n", - "config_am_timeseriesstatsclimatology_compute_interval = '00-00-00_01:00:00'\n", - "config_am_timeseriesstatsclimatology_compute_on_startup = .false.\n", - "config_am_timeseriesstatsclimatology_duration_intervals = '01-00-00_00:00'\n", - "config_am_timeseriesstatsclimatology_operation = 'avg'\n", - "config_am_timeseriesstatsclimatology_output_stream = 'timeSeriesStatsClimatologyOutput'\n", - "config_am_timeseriesstatsclimatology_reference_times = '00-01-01_00:00:00'\n", - "config_am_timeseriesstatsclimatology_repeat_intervals = '01-00-00_00:00:00'\n", - "config_am_timeseriesstatsclimatology_reset_intervals = '0001-00-00_00:00:00'\n", - "config_am_timeseriesstatsclimatology_restart_stream = 'timeSeriesStatsClimatologyRestart'\n", - "config_am_timeseriesstatsclimatology_write_on_startup = .false.\n", - ] - # Set up ocean namelist to specify climatology output and reduce other output with open( - "user_nl_{}_{:04d}".format(self.ocn_component, iinst), "w" + f"user_nl_{self.ocn_component}_{iinst:04d}", "w", encoding="utf-8" ) as nl_ocn_file: for _config in tss_climatology_config: @@ -222,7 +228,9 @@ def build_phase(self, sharedlib_only=False, model_only=False): # Set up sea ice namelist to reduce output with open( - "user_nl_{}_{:04d}".format(self.ice_component, iinst), "w" + f"user_nl_{self.ice_component}_{iinst:04d}", + "w", + encoding="utf-8", ) as nl_ice_file: for _config in tss_climatology_config: nl_ice_file.write(_config) @@ -236,13 +244,13 @@ def build_phase(self, sharedlib_only=False, model_only=False): caseroot, "SourceMods", "src.mpaso", - "streams.ocean_{:04d}".format(iinst), + f"streams.ocean_{iinst:04d}", ) ice_stream_file = os.path.join( caseroot, "SourceMods", "src.mpassi", - "streams.seaice_{:04d}".format(iinst), + f"streams.seaice_{iinst:04d}", ) # buildnamelist creates the streams file for each instance, copy this to the # SourceMods directory to make changes to the correct version @@ -257,13 +265,14 @@ def build_phase(self, sharedlib_only=False, model_only=False): self.build_indv(sharedlib_only=sharedlib_only, model_only=model_only) def run_phase(self): + """Run the model.""" self.run_indv() def _generate_baseline(self): """ generate a new baseline case based on the current test """ - super(MVKO, self)._generate_baseline() + super()._generate_baseline() with CIME.utils.SharedArea(): basegen_dir = os.path.join( @@ -281,7 +290,7 @@ def _generate_baseline(self): rundir, ref_case=ref_case, ) - logger.debug("MVKO additional baseline files: {}".format(hists)) + logger.debug("MVKO additional baseline files: %s", hists) hists = [os.path.join(rundir, hist) for hist in hists] for hist in hists: basename = hist[hist.rfind(self.ocn_component) :] @@ -313,7 +322,7 @@ def _compare_baseline(self): self._case.get_value("BASECMP_CASE"), ) - test_name = "{}".format(case_name.split(".")[-1]) + test_name = str(case_name.split(".")[-1]) evv_config = { test_name: { "module": os.path.join(evv_lib_dir, "extensions", "kso.py"), @@ -331,20 +340,22 @@ def _compare_baseline(self): } json_file = os.path.join(run_dir, ".".join([case_name, "json"])) - with open(json_file, "w") as config_file: + with open(json_file, "w", encoding="utf-8") as config_file: json.dump(evv_config, config_file, indent=4) evv_out_dir = os.path.join(run_dir, ".".join([case_name, "evv"])) evv(["-e", json_file, "-o", evv_out_dir]) - with open(os.path.join(evv_out_dir, "index.json")) as evv_f: + with open( + os.path.join(evv_out_dir, "index.json"), encoding="utf-8" + ) as evv_f: evv_status = json.load(evv_f) comments = "" for evv_ele in evv_status["Page"]["elements"]: if "Table" in evv_ele: comments = "; ".join( - "{}: {}".format(key, val[0]) + f"{key}: {val[0]}" for key, val in evv_ele["Table"]["data"].items() ) if evv_ele["Table"]["data"]["Test status"][0].lower() == "pass": @@ -367,28 +378,20 @@ def _compare_baseline(self): preserve_mode=False, ) if urlroot is None: - urlroot = "[{}_URL]".format(mach_name.capitalize()) - viewing = "{}/evv/{}/index.html".format(urlroot, case_name) + urlroot = f"[{mach_name.capitalize()}_URL]" + viewing = f"{urlroot}/evv/{case_name}/index.html" else: viewing = ( - "{}\n" + f"{evv_out_dir}\n" " EVV viewing instructions can be found at: " " https://github.com/E3SM-Project/E3SM/blob/master/cime/scripts/" "climate_reproducibility/README.md#test-passfail-and-extended-output" - "".format(evv_out_dir) ) - comments = ( - "{} {} for test '{}'.\n" - " {}\n" + f"{CIME.test_status.BASELINE_PHASE} {status} for test '{test_name}'.\n" + f" {comments}\n" " EVV results can be viewed at:\n" - " {}".format( - CIME.test_status.BASELINE_PHASE, - status, - test_name, - comments, - viewing, - ) + f" {viewing}" ) CIME.utils.append_testlog(comments, self._orig_caseroot) From 3df4a4ea8c4be534f000f71e0db3e61925c58819 Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Mon, 5 Feb 2024 16:48:13 -0800 Subject: [PATCH 006/310] change the compset that scam generic uses --- components/eam/bld/namelist_files/use_cases/scam_generic.xml | 1 - components/eam/cime_config/config_component.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/components/eam/bld/namelist_files/use_cases/scam_generic.xml b/components/eam/bld/namelist_files/use_cases/scam_generic.xml index 395d9a6ec86..2b77e3b630a 100644 --- a/components/eam/bld/namelist_files/use_cases/scam_generic.xml +++ b/components/eam/bld/namelist_files/use_cases/scam_generic.xml @@ -3,7 +3,6 @@ -atm/cam/inic/homme/cami_mam3_Linoz_ne4np4_L72_c160909.nc atm/cam/chem/trop_mozart_aero/emis/aces4bgc_nvsoa_soag_elev_2000_c160427.nc diff --git a/components/eam/cime_config/config_component.xml b/components/eam/cime_config/config_component.xml index c7585072ac9..103f296eb69 100755 --- a/components/eam/cime_config/config_component.xml +++ b/components/eam/cime_config/config_component.xml @@ -136,7 +136,7 @@ 20TR_eam_chemUCI-Linoz-mam5 scam_arm95 scm_arm97_chemUCI-Linoz-mam5-vbs - scm_generic_chemUCI-Linoz-mam5-vbs + scam_generic 1850-PD_cam5 aquaplanet_EAMv1 RCEMIP_EAMv1 From 4d27f1c3dff03e8674ac50602ec5597237a87f9f Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 6 Feb 2024 10:46:00 -0600 Subject: [PATCH 007/310] Adds a compset for 1850+BGC+TOP --- components/elm/cime_config/config_compsets.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/elm/cime_config/config_compsets.xml b/components/elm/cime_config/config_compsets.xml index 01366aa71dd..a473f2b4fed 100644 --- a/components/elm/cime_config/config_compsets.xml +++ b/components/elm/cime_config/config_compsets.xml @@ -129,6 +129,11 @@ 1850_DATM%QIA_ELM%CNPRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV + + I1850CNPRDCTCBCTOP + 1850_DATM%QIA_ELM%CNPRDCTCBCTOP_SICE_SOCN_MOSART_SGLC_SWAV + + ICB1850CRDCTCBC 1850_SATM_ELM%CRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV From 9d7d65a72a824616003b0a247beb1b1be99f5426 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 6 Feb 2024 10:46:51 -0600 Subject: [PATCH 008/310] Adds r025_IcoswISC30E3r5 as a supported res ELM is on r025, MOSART if off, land/ocean mask is IcoswISC30E3r5 --- cime_config/config_grids.xml | 10 ++++++++++ .../elm/bld/namelist_files/namelist_defaults.xml | 2 ++ .../elm/bld/namelist_files/namelist_definition.xml | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 1894ef66fa5..afd77209b16 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -711,6 +711,16 @@ oRRS18to6v3 + + r025 + r025 + IcoswISC30E3r5 + null + null + null + IcoswISC30E3r5 + + diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 4f02fc9df8a..64725294823 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -434,6 +434,8 @@ lnd/clm2/surfdata_map/surfdata_0.5x0.5_simyr1850_c211019.nc lnd/clm2/surfdata_map/surfdata_0.125x0.125_simyr1850_c190730.nc lnd/clm2/surfdata_map/surfdata_0.125x0.125_simyr1950_c210924.nc + +lnd/clm2/surfdata_map/surfdata_0.25x0.25_simyr1850_c240125_TOP.nc lnd/clm2/surfdata_map/surfdata_conusx4v1_simyr1850_c160503.nc diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index 1353f8b84b6..efbab3f9f35 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -1390,7 +1390,7 @@ CLM run type. +"512x1024,360x720cru,128x256,64x128,48x96,32x64,8x16,94x192,0.23x0.31,0.9x1.25,1.9x2.5,2.5x3.33,4x5,10x15,5x5_amazon,1x1_tropicAtl,1x1_camdenNJ,1x1_vancouverCAN,1x1_mexicocityMEX,1x1_asphaltjungleNJ,1x1_brazil,1x1_urbanc_alpha,1x1_numaIA,1x1_smallvilleIA,0.1x0.1,0.5x0.5,3x3min,5x5min,10x10min,0.33x0.33,ne4np4,ne4np4.pg2,ne11np4,ne16np4,ne30np4,ne30np4.pg2,ne60np4,ne120np4,ne120np4.pg2,ne240np4,ne256np4,ne256np4.pg2,ne1024np4,ne1024np4.pg2,1km-merge-10min,ne0np4_arm_x8v3_lowcon,ne0np4_conus_x4v1_lowcon,ne0np4_enax4v1,ne0np4_twpx4v1,r2,r05,r0125,NLDAS,ne0np4_northamericax4v1.pg2,ne0np4_arcticx4v1.pg2,r025"> Horizontal resolutions Note: 0.1x0.1, 0.5x0.5, 5x5min, 10x10min, 3x3min and 0.33x0.33 are only used for CLM tools From 5151ecfc8787f99e336a1d777859af8800402a56 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 6 Feb 2024 11:00:00 -0600 Subject: [PATCH 009/310] Adds maps to create ELM surface dataset for r0125 --- .../bld/namelist_files/namelist_defaults.xml | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 64725294823..7cc4b933aed 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -2063,6 +2063,39 @@ this mask will have smb calculated over the entire global land surface +lnd/clm2/mappingdata/maps/0.25x0.25/map_0.5x0.5_AVHRR_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_0.5x0.5_MODIS_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_0.9x1.25_GRDC_to_0.25x0.25_nomask_aave_da_c240124.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_10x10min_IGBPmergeICESatGIS_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_10x10min_nomask_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_1km-merge-10min_HYDRO1K-merge-nomask_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_360x720cru_cruncep_to_0.25x0.25_nomask_aave_da_c240124.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_3x3min_GLOBE-Gardner-mergeGIS_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_3x3min_GLOBE-Gardner_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_3x3min_LandScan2004_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_3x3min_MODIS_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_3x3min_USGS_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_5x5min_IGBP-GSDP_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_5x5min_ISRIC-WISE_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_5x5min_nomask_to_0.25x0.25_nomask_aave_da_c240123.nc +lnd/clm2/mappingdata/maps/0.25x0.25/map_0.5x0.5_GSDTG2000_to_0.25x0.25_nomask_aave_da_c240123.nc + lnd/clm2/mappingdata/maps/antarcticax4v1/map_0.5x0.5_AVHRR_to_antarcticax4v1_nomask_aave_da_c210130.nc Date: Tue, 6 Feb 2024 11:11:36 -0600 Subject: [PATCH 010/310] Adds domain file for r025_IcoswISC30E3r5 --- cime_config/config_grids.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index afd77209b16..fc9f28f2e39 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -2862,6 +2862,12 @@ r0125 is 1/8 degree river routing grid: + + 1440 + 720 + $DIN_LOC_ROOT/share/domains/domain.lnd.r025_IcoswISC30E3r5.240129.nc + + 28993 1 From 87ae057e1499f4ed92fa5de4b8cbb70ff90ed071 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 6 Feb 2024 17:22:41 -0600 Subject: [PATCH 011/310] Adds support for ne120pg2_r025_IcoswISC30E3r5 --- cime_config/config_grids.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index fc9f28f2e39..9fe8abae330 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1386,6 +1386,16 @@ oRRS18to6v3 + + ne120np4.pg2 + r025 + IcoswISC30E3r5 + null + null + null + IcoswISC30E3r5 + + ne60np4 ne60np4 @@ -3474,6 +3484,14 @@ cpl/gridmaps/ne120pg2/map_ne120pg2_to_r0125_mono.200707.nc + + cpl/gridmaps/ne120pg2/map_ne120pg2_to_r025_traave.20240206.nc + cpl/gridmaps/ne120pg2/map_ne120pg2_to_r025_trfv2.20240206.nc + cpl/gridmaps/ne120pg2/map_ne120pg2_to_r025_esmfbilin.20240206.nc + cpl/gridmaps/ne120pg2/map_r025_to_ne120pg2_traave.20240206.nc + cpl/gridmaps/ne120pg2/map_r025_to_ne120pg2_traave.20240206.nc + + cpl/gridmaps/ne120np4/map_ne120np4_to_oRRS18to6v3_mono.20200702.nc cpl/gridmaps/ne120np4/map_ne120np4_to_oRRS18to6v3_mono.20200702.nc From 1d3480a762e4a0362e883a468138b0bc165df62e Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Tue, 6 Feb 2024 16:38:42 -0800 Subject: [PATCH 012/310] add idealization flags for P3 microphysics, relating to turning off generation of liquid precipitation and prescribing the droplet concentration --- .../namelist_files/namelist_defaults_eam.xml | 1 + .../namelist_files/namelist_definition.xml | 4 +- .../eam/src/physics/p3/eam/micro_p3.F90 | 39 ++++++++++++------- .../src/physics/p3/eam/micro_p3_interface.F90 | 10 +++-- .../eam/src/physics/p3/eam/micro_p3_utils.F90 | 3 -- 5 files changed, 35 insertions(+), 22 deletions(-) diff --git a/components/eam/bld/namelist_files/namelist_defaults_eam.xml b/components/eam/bld/namelist_files/namelist_defaults_eam.xml index 56c816b1753..cfd9bf682c8 100755 --- a/components/eam/bld/namelist_files/namelist_defaults_eam.xml +++ b/components/eam/bld/namelist_files/namelist_defaults_eam.xml @@ -917,6 +917,7 @@ 1.0D0 .false. 100.D6 + 200.D6 0.1D6 -999. -999. diff --git a/components/eam/bld/namelist_files/namelist_definition.xml b/components/eam/bld/namelist_files/namelist_definition.xml index bc9977f67b5..384d8f29b39 100644 --- a/components/eam/bld/namelist_files/namelist_definition.xml +++ b/components/eam/bld/namelist_files/namelist_definition.xml @@ -4706,7 +4706,9 @@ Default: FALSE -Turn off microphysics computation. +Turn off microphysics computation for MG2. For P3 this disables the generation of +liquid precipitation via autoconversion only, to be used for idealized simulations of +warm phase boundary layer clouds. Default: FALSE | | diff --git a/components/eam/src/physics/p3/eam/micro_p3.F90 b/components/eam/src/physics/p3/eam/micro_p3.F90 index 730736a2dbf..e668cbaa494 100644 --- a/components/eam/src/physics/p3/eam/micro_p3.F90 +++ b/components/eam/src/physics/p3/eam/micro_p3.F90 @@ -56,7 +56,7 @@ module micro_p3 use phys_control, only: use_hetfrz_classnuc ! physical and mathematical constants - use micro_p3_utils, only: rho_1000mb,rho_600mb,ar,br,f1r,f2r,rho_h2o,kr,kc,aimm,mi0,nccnst, & + use micro_p3_utils, only: rho_1000mb,rho_600mb,ar,br,f1r,f2r,rho_h2o,kr,kc,aimm,mi0, & eci,eri,bcn,cpw,cons1,cons3,cons4,cons5,cons6,cons7, & inv_rho_h2o,inv_dropmass,qsmall,nsmall,cp,g,rd,rv,ep_2,inv_cp, & thrd,sxth,piov6,rho_rimeMin, & @@ -441,7 +441,7 @@ SUBROUTINE p3_main_part1(kts, kte, kbot, ktop, kdir, do_predict_nc, do_prescribe t_atm, rho, inv_rho, qv_sat_l, qv_sat_i, qv_supersat_i, rhofacr, rhofaci, acn, qv, th_atm, & qc, nc, qr, nr, & qi, ni, qm, bm, qc_incld, qr_incld, qi_incld, qm_incld, & - nc_incld, nr_incld, ni_incld, bm_incld, is_nucleat_possible, is_hydromet_present) + nc_incld, nr_incld, ni_incld, bm_incld, is_nucleat_possible, is_hydromet_present, nccnst) implicit none @@ -449,7 +449,7 @@ SUBROUTINE p3_main_part1(kts, kte, kbot, ktop, kdir, do_predict_nc, do_prescribe integer, intent(in) :: kts, kte, kbot, ktop, kdir logical(btype), intent(in) :: do_predict_nc - real(rtype), intent(in) :: dt + real(rtype), intent(in) :: dt, nccnst real(rtype), intent(in), dimension(kts:kte) :: pres, dpres, dz, nc_nuceat_tend, exner, inv_exner, & inv_cld_frac_l, inv_cld_frac_i, inv_cld_frac_r, latent_heat_vapor, latent_heat_sublim, latent_heat_fusion, nccn_prescribed @@ -561,15 +561,15 @@ SUBROUTINE p3_main_part2(kts, kte, kbot, ktop, kdir, do_predict_nc, do_prescribe qm, bm, latent_heat_vapor, latent_heat_sublim, latent_heat_fusion, qc_incld, qr_incld, qi_incld, qm_incld, nc_incld, nr_incld, & ni_incld, bm_incld, mu_c, nu, lamc, cdist, cdist1, cdistr, mu_r, lamr, logn0r, qv2qi_depos_tend, precip_total_tend, & nevapr, qr_evap_tend, vap_liq_exchange, vap_ice_exchange, liq_ice_exchange, pratot, & - prctot, frzimm, frzcnt, frzdep, p3_tend_out, is_hydromet_present) + prctot, frzimm, frzcnt, frzdep, p3_tend_out, is_hydromet_present, do_precip_off, nccnst) implicit none ! args integer, intent(in) :: kts, kte, kbot, ktop, kdir - logical(btype), intent(in) :: do_predict_nc, do_prescribed_CCN - real(rtype), intent(in) :: dt, inv_dt + logical(btype), intent(in) :: do_predict_nc, do_prescribed_CCN, do_precip_off + real(rtype), intent(in) :: dt, inv_dt, nccnst real(rtype), intent(in) :: p3_autocon_coeff, p3_accret_coeff, p3_qc_autocon_expon, p3_nc_autocon_expon, p3_qc_accret_expon, & p3_wbf_coeff, p3_embryonic_rain_size, p3_max_mean_rain_size @@ -875,7 +875,7 @@ SUBROUTINE p3_main_part2(kts, kte, kbot, ktop, kdir, do_predict_nc, do_prescribe ! NOTE: cloud_water_autoconversion must be called before droplet_self_collection call cloud_water_autoconversion(rho(k),qc_incld(k),nc_incld(k),inv_qc_relvar(k),& p3_autocon_coeff,p3_qc_autocon_expon,p3_nc_autocon_expon,p3_embryonic_rain_size,& - qc2qr_autoconv_tend,nc2nr_autoconv_tend,ncautr) + do_precip_off,qc2qr_autoconv_tend,nc2nr_autoconv_tend,ncautr) !............................ ! self-collection of droplets @@ -978,7 +978,7 @@ SUBROUTINE p3_main_part2(kts, kte, kbot, ktop, kdir, do_predict_nc, do_prescribe !-- warm-phase only processes: call update_prognostic_liquid(qc2qr_accret_tend, nc_accret_tend, qc2qr_autoconv_tend, nc2nr_autoconv_tend, ncautr, & nc_selfcollect_tend, qr2qv_evap_tend, nr_evap_tend, nr_selfcollect_tend, & - do_predict_nc, do_prescribed_CCN, inv_rho(k), exner(k), latent_heat_vapor(k), dt, & + do_predict_nc, nccnst, do_prescribed_CCN, inv_rho(k), exner(k), latent_heat_vapor(k), dt, & th_atm(k), qv(k), qc(k), nc(k), qr(k), nr(k)) !== @@ -1259,7 +1259,7 @@ SUBROUTINE p3_main(qc,nc,qr,nr,th_atm,qv,dt,qi,qm,ni,bm, p3_wbf_coeff,p3_mincdnc,p3_max_mean_rain_size,p3_embryonic_rain_size, & dpres,exner,qv2qi_depos_tend,precip_total_tend,nevapr,qr_evap_tend,precip_liq_flux,precip_ice_flux,rflx,sflx,cflx,cld_frac_r,cld_frac_l,cld_frac_i, & p3_tend_out,mu_c,lamc,liq_ice_exchange,vap_liq_exchange, & - vap_ice_exchange,qv_prev,t_prev,col_location,diag_equiv_reflectivity,diag_ze_rain,diag_ze_ice & + vap_ice_exchange,qv_prev,t_prev,col_location,do_precip_off,nccnst,diag_equiv_reflectivity,diag_ze_rain,diag_ze_ice & #ifdef SCREAM_CONFIG_IS_CMAKE ,elapsed_s & #endif @@ -1337,6 +1337,10 @@ SUBROUTINE p3_main(qc,nc,qr,nr,th_atm,qv,dt,qi,qm,ni,bm, ! INPUT for prescribed CCN option logical(btype), intent(in) :: do_prescribed_CCN + ! INPUT for idealization options + logical(btype), intent(in) :: do_precip_off + real(rtype), intent(in) :: nccnst + ! INPUT for p3 tuning parameters real(rtype), intent(in) :: p3_autocon_coeff ! autconversion coefficient real(rtype), intent(in) :: p3_accret_coeff ! accretion coefficient @@ -1517,7 +1521,7 @@ SUBROUTINE p3_main(qc,nc,qr,nr,th_atm,qv,dt,qi,qm,ni,bm, rhofaci(i,:), acn(i,:), qv(i,:), th_atm(i,:), qc(i,:), nc(i,:), qr(i,:), nr(i,:), & qi(i,:), ni(i,:), qm(i,:), bm(i,:), qc_incld(i,:), qr_incld(i,:), & qi_incld(i,:), qm_incld(i,:), nc_incld(i,:), nr_incld(i,:), & - ni_incld(i,:), bm_incld(i,:), is_nucleat_possible, is_hydromet_present) + ni_incld(i,:), bm_incld(i,:), is_nucleat_possible, is_hydromet_present, nccnst) if (debug_ON) then tmparr1(i,:) = th_atm(i,:)*inv_exner(i,:)!(pres(i,:)*1.e-5)**(rd*inv_cp) @@ -1541,7 +1545,8 @@ SUBROUTINE p3_main(qc,nc,qr,nr,th_atm,qv,dt,qi,qm,ni,bm, bm_incld(i,:), mu_c(i,:), nu(i,:), lamc(i,:), cdist(i,:), cdist1(i,:), & cdistr(i,:), mu_r(i,:), lamr(i,:), logn0r(i,:), qv2qi_depos_tend(i,:), precip_total_tend(i,:), & nevapr(i,:), qr_evap_tend(i,:), vap_liq_exchange(i,:), vap_ice_exchange(i,:), & - liq_ice_exchange(i,:), pratot(i,:), prctot(i,:), frzimm(i,:), frzcnt(i,:), frzdep(i,:), p3_tend_out(i,:,:), is_hydromet_present) + liq_ice_exchange(i,:), pratot(i,:), prctot(i,:), frzimm(i,:), frzcnt(i,:), frzdep(i,:), p3_tend_out(i,:,:), is_hydromet_present, & + do_precip_off, nccnst) ! measure microphysics processes tendency output @@ -2950,7 +2955,7 @@ end subroutine rain_self_collection subroutine cloud_water_autoconversion(rho,qc_incld,nc_incld,inv_qc_relvar, & p3_autocon_coeff,p3_qc_autocon_expon,p3_nc_autocon_expon,p3_embryonic_rain_size, & - qc2qr_autoconv_tend,nc2nr_autoconv_tend,ncautr) + do_precip_off,qc2qr_autoconv_tend,nc2nr_autoconv_tend,ncautr) implicit none @@ -2963,6 +2968,8 @@ subroutine cloud_water_autoconversion(rho,qc_incld,nc_incld,inv_qc_relvar, real(rtype), intent(in) :: p3_nc_autocon_expon real(rtype), intent(in) :: p3_embryonic_rain_size + logical(btype), intent(in) :: do_precip_off + real(rtype), intent(out) :: qc2qr_autoconv_tend real(rtype), intent(out) :: nc2nr_autoconv_tend real(rtype), intent(out) :: ncautr @@ -2981,8 +2988,9 @@ subroutine cloud_water_autoconversion(rho,qc_incld,nc_incld,inv_qc_relvar, ncautr = qc2qr_autoconv_tend*cons3*(1._rtype/bfb_pow(p3_embryonic_rain_size,3._rtype)) nc2nr_autoconv_tend = qc2qr_autoconv_tend*nc_incld/qc_incld - if (qc2qr_autoconv_tend .eq.0._rtype) nc2nr_autoconv_tend = 0._rtype - if (nc2nr_autoconv_tend.eq.0._rtype) qc2qr_autoconv_tend = 0._rtype + if (qc2qr_autoconv_tend .eq.0._rtype .or. do_precip_off) nc2nr_autoconv_tend = 0._rtype + if (nc2nr_autoconv_tend.eq.0._rtype .or. do_precip_off) qc2qr_autoconv_tend = 0._rtype + if (do_precip_off) ncautr = 0._rtype endif qc_not_small @@ -3502,7 +3510,7 @@ end subroutine update_prognostic_ice subroutine update_prognostic_liquid(qc2qr_accret_tend,nc_accret_tend,qc2qr_autoconv_tend,nc2nr_autoconv_tend, & ncautr,nc_selfcollect_tend, qr2qv_evap_tend,nr_evap_tend,nr_selfcollect_tend, & - do_predict_nc, do_prescribed_CCN, inv_rho,exner,latent_heat_vapor,dt, & + do_predict_nc, nccnst, do_prescribed_CCN, inv_rho,exner,latent_heat_vapor,dt, & th_atm,qv,qc,nc,qr,nr) !-- warm-phase only processes: @@ -3520,6 +3528,7 @@ subroutine update_prognostic_liquid(qc2qr_accret_tend,nc_accret_tend,qc2qr_autoc logical(btype), intent(in) :: do_predict_nc, do_prescribed_CCN + real(rtype), intent(in) :: nccnst real(rtype), intent(in) :: inv_rho real(rtype), intent(in) :: exner real(rtype), intent(in) :: latent_heat_vapor diff --git a/components/eam/src/physics/p3/eam/micro_p3_interface.F90 b/components/eam/src/physics/p3/eam/micro_p3_interface.F90 index 9d53e95fc17..bb6e164b4a1 100644 --- a/components/eam/src/physics/p3/eam/micro_p3_interface.F90 +++ b/components/eam/src/physics/p3/eam/micro_p3_interface.F90 @@ -42,6 +42,7 @@ module micro_p3_interface use ncdio_atm, only: infld use ppgrid, only: begchunk, endchunk, pcols, pver, pverp,psubcols use cam_history_support, only: add_hist_coord + use iop_data_mod, only: precip_off implicit none save @@ -131,8 +132,8 @@ module micro_p3_interface p3_wbf_coeff = huge(1.0_rtype), & p3_mincdnc = huge(1.0_rtype), & p3_max_mean_rain_size = huge(1.0_rtype), & - p3_embryonic_rain_size = huge(1.0_rtype) - + p3_embryonic_rain_size = huge(1.0_rtype), & + micro_nccons = huge(1.0_rtype) integer :: ncnst @@ -165,7 +166,7 @@ subroutine micro_p3_readnl(nlfile) micro_p3_tableversion, micro_p3_lookup_dir, micro_aerosolactivation, micro_subgrid_cloud, & micro_tend_output, p3_autocon_coeff, p3_qc_autocon_expon, p3_nc_autocon_expon, p3_accret_coeff, & p3_qc_accret_expon, p3_wbf_coeff, p3_max_mean_rain_size, p3_embryonic_rain_size, & - do_prescribed_CCN, do_Cooper_inP3, p3_mincdnc + do_prescribed_CCN, do_Cooper_inP3, p3_mincdnc, micro_nccons !----------------------------------------------------------------------------- @@ -220,6 +221,7 @@ subroutine micro_p3_readnl(nlfile) call mpibcast(p3_embryonic_rain_size, 1 , mpir8, 0, mpicom) call mpibcast(do_prescribed_CCN, 1, mpilog, 0, mpicom) call mpibcast(do_Cooper_inP3, 1, mpilog, 0, mpicom) + call mpibcast(micro_nccons, 1, mpir8, 0, mpicom) #endif @@ -1363,6 +1365,8 @@ subroutine micro_p3_tend(state, ptend, dtime, pbuf) qv_prev(its:ite,kts:kte), & ! IN qv at end of prev p3_main call kg kg-1 t_prev(its:ite,kts:kte), & ! IN t at end of prev p3_main call K col_location(its:ite,:3), & ! IN column locations + precip_off, & ! IN Option to turn precip (liquid) off + micro_nccons, & ! IN Option for constant droplet concentration diag_equiv_reflectivity(its:ite,kts:kte), & !OUT equivalent reflectivity (rain + ice) [dBz] diag_ze_rain(its:ite,kts:kte),diag_ze_ice(its:ite,kts:kte)) !OUT equivalent reflectivity for rain and ice [dBz] diff --git a/components/eam/src/physics/p3/eam/micro_p3_utils.F90 b/components/eam/src/physics/p3/eam/micro_p3_utils.F90 index dab1c475132..c2182a14206 100644 --- a/components/eam/src/physics/p3/eam/micro_p3_utils.F90 +++ b/components/eam/src/physics/p3/eam/micro_p3_utils.F90 @@ -33,9 +33,6 @@ module micro_p3_utils ! maximum total ice concentration (sum of all categories) real(rtype), public, parameter :: max_total_ni = 500.e+3_rtype ! (m) - ! droplet concentration (m-3) - real(rtype), public, parameter :: nccnst = 200.e+6_rtype - ! parameters for Seifert and Beheng (2001) autoconversion/accretion real(rtype), public, parameter :: kc = 9.44e+9_rtype real(rtype), public, parameter :: kr = 5.78e+3_rtype From 10c23f3967a7f2412b775fd9aaf173983ea91042 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 7 Feb 2024 07:11:11 -0800 Subject: [PATCH 013/310] added ERA5 hourly & 6 hourly datm options --- .../datm/cime_config/config_component.xml | 10 +- .../cime_config/namelist_definition_datm.xml | 169 +++++++++++++++++- 2 files changed, 175 insertions(+), 4 deletions(-) diff --git a/components/data_comps/datm/cime_config/config_component.xml b/components/data_comps/datm/cime_config/config_component.xml index 779b930662c..de306375e83 100644 --- a/components/data_comps/datm/cime_config/config_component.xml +++ b/components/data_comps/datm/cime_config/config_component.xml @@ -10,12 +10,14 @@ This file may have atm desc entries. --> - Data driven ATM + Data driven ATM QIAN data set QIAN with water isotopes CRUNCEP data set CLM CRU NCEP v7 data set GSWP3v1 data set + Fifth generation ECMWF reanalysis + Fifth generation ECMWF reanalysis,6 hourly data MOSART test data set using older NLDAS data NLDAS2 regional 0.125 degree data set over the U.S. (25-53N, 235-293E). WARNING: Garbage data will be produced for runs extending beyond this regional domain. Coupler hist data set (in this mode, it is strongly recommended that the model domain and the coupler history forcing are on the same domain) @@ -43,13 +45,13 @@ char - CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR + CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR CORE2_NYF run_component_datm env_run.xml Mode for data atmosphere component. CORE2_NYF (CORE2 normal year forcing) are modes used in forcing prognostic ocean/sea-ice components. - CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. + CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, ERA5,ERA5_6HR, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. WARNING for CLMNLDAS2: This is a regional forcing dataset over the U.S. (25-53N, 235-293E). Garbage data will be produced for runs extending beyond this regional domain. WARNING for CLMGSWP3v1: Humidity is identically zero for last time step in Dec/2013 and all of 2014 so you should NOT use 2014 data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). @@ -68,6 +70,8 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). CLMCRUNCEP CLMCRUNCEPv7 CLMGSWP3v1 + ERA5 + ERA5_6HR CLMMOSARTTEST CLMNLDAS2 CLM1PT diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index e033e949464..219f069a8e0 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -36,6 +36,8 @@ CLMCRUNCEP = Run with the CLM CRU NCEP V4 ( default ) forcing valid from 1900 to 2010 (force CLM) CLMCRUNCEPv7 = Run with the CLM CRU NCEP V7 forcing valid from 1900 to 2010 (force CLM) CLMGSWP3v1 = Run with the CLM GSWP3 V1 forcing (force CLM) + ERA5 = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present + ERA5_6HR = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present CLMMOSARTTEST = Run with the CLM NLDAS data (force CLM) for testing MOSART CLMNLDAS2 = Run with the CLM NLDAS2 regional forcing valid from 1980 to 2018 (force CLM) CLM1PT = Run with supplied single point data (force CLM) @@ -103,6 +105,26 @@ CLMGSWP3v1.Solar CLMGSWP3v1.Precip CLMGSWP3v1.TPQW + + ERA5.msdrswrf # mean surface direct shortwave radiation flux + ERA5.msdfswrf # mean surface diffuse shortwave radiation flux + ERA5.mcpr # mean convective precipitation rate + ERA5.mlspr # mean large-scale precipitation rate + ERA5.t2m # temperature at 2 m + ERA5.sp # surface pressure + ERA5.d2m # dew point temperature at 2 m + ERA5.w10 # wind speed at 10 m + ERA5.msdwlwrf # mean surface downward longwave radiation flux + + ERA5_6HR.msdrswrf # mean surface direct shortwave radiation flux + ERA5_6HR.msdfswrf # mean surface diffuse shortwave radiation flux + ERA5_6HR.mcpr # mean convective precipitation rate + ERA5_6HR.mlspr # mean large-scale precipitation rate + ERA5_6HR.t2m # temperature at 2 m + ERA5_6HR.sp # surface pressure + ERA5_6HR.d2m # dew point temperature at 2 m + ERA5_6HR.w10 # wind speed at 10 m + ERA5_6HR.msdwlwrf # mean surface downward longwave radiation flux CLMMOSARTTEST @@ -202,6 +224,8 @@ CLMCRUNCEP.Solar,CLMCRUNCEP.Precip,CLMCRUNCEP.TPQW CLMCRUNCEPv7.Solar,CLMCRUNCEPv7.Precip,CLMCRUNCEPv7.TPQW CLMGSWP3v1.Solar,CLMGSWP3v1.Precip,CLMGSWP3v1.TPQW + ERA5.msdrswrf,ERA5.msdfswrf,ERA5.mcpr,ERA5.mlspr, ERA5.t2m,ERA5.sp,ERA5.d2m,ERA5.w10,ERA5.msdwlwrf + ERA5_6HR.msdrswrf,ERA5_6HR.msdfswrf,ERA5_6HR.mcpr,ERA5_6HR.mlspr,ERA5_6HR.t2m,ERA5_6HR.sp,ERA5_6HR.d2m,ERA5_6HR.w10,ERA5_6HR.msdwlwrf CLMMOSARTTEST CLMNLDAS2.Solar,CLMNLDAS2.Precip,CLMNLDAS2.TPQW CORE2_NYF.GISS,CORE2_NYF.GXGXS,CORE2_NYF.NCEP @@ -234,6 +258,8 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715 $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.V5.c140715 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 @@ -302,6 +328,8 @@ domain.lnd.360x720.130305.nc domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.360x720_gswp3.0v1.c170606.nc + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc domain.lnd.nldas2_0224x0464_c110415.nc domain.lnd.0.125nldas2_0.125nldas2.190410.nc nyf.giss.T62.051007.nc @@ -478,6 +506,24 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Solar3Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Precip3Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/TPHWL3Hrly + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn $DIN_LOC_ROOT/atm/datm7/NLDAS $DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.NLDAS2.0.125d.v1/Solar $DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.NLDAS2.0.125d.v1/Precip @@ -553,6 +599,24 @@ clmforc.GSWP3.c2011.0.5x0.5.Solr.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Prec.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.TPQWL.%ym.nc + elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc + elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc + elmforc.ERA5.c2018.0.25d.t2m.%ym.nc + elmforc.ERA5.c2018.0.25d.sp.%ym.nc + elmforc.ERA5.c2018.0.25d.d2m.%ym.nc + elmforc.ERA5.c2018.0.25d.w10.%ym.nc + elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc + elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc + elmforc.ERA5.c2018.0.25d.t2m.%ym.nc + elmforc.ERA5.c2018.0.25d.sp.%ym.nc + elmforc.ERA5.c2018.0.25d.d2m.%ym.nc + elmforc.ERA5.c2018.0.25d.w10.%ym.nc + elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc clmforc.nldas.%ym.nc ctsmforc.NLDAS2.0.125d.v1.Solr.%ym.nc ctsmforc.NLDAS2.0.125d.v1.Prec.%ym.nc @@ -1523,6 +1587,60 @@ PSRF pbot FLDS lwdn + + msdrswrf swdndr + + + msdfswrf swdndf + + + mcpr precc + + + mlspr precl + + + t2m tbot + + + sp pbot + + + d2m tdew + + + w10 wind + + + msdwlwrf lwdn + + + msdrswrf swdndr + + + msdfswrf swdndf + + + mcpr precc + + + mlspr precl + + + t2m tbot + + + sp pbot + + + d2m tdew + + + w10 wind + + + msdwlwrf lwdn + TBOT tbot WIND wind @@ -1793,6 +1911,8 @@ $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN + $DATM_CLMNCEP_YR_ALIGN + $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN 1 @@ -1843,6 +1963,8 @@ $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START 1 @@ -1914,6 +2036,8 @@ $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END + $DATM_CLMNCEP_YR_END + $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END 1 @@ -1988,6 +2112,16 @@ 900 0 0 + -3600 + -3600 + -60 + -60 + -60 + -21600 + -21600 + -60 + -60 + -60 @@ -2054,6 +2188,8 @@ NULL CLMNCEP + CLMNCEP + CLMNCEP CORE2_NYF CORE2_IAF CORE_IAF_JRA @@ -2093,7 +2229,9 @@ valid values: 'copy','spval','nn','nnoni','nnonj' - nn + nn + copy + copy @@ -2248,6 +2386,16 @@ nearest coszen nearest + coszen + coszen + upper + linear + linear + coszen + coszen + upper + upper + upper coszen nearest nearest @@ -2340,6 +2488,25 @@ 3.0 3.0 3.0 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + From ef3511b58bce61c277e15058198f4210b1d94c3b Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 13 Jul 2023 12:28:21 -0700 Subject: [PATCH 014/310] Add support for 20 km Greenland tri-grid confg Add configuration and mapping file support for MALI, 20 km res Greenland ice sheet, tri-grid configuration. --- cime_config/config_grids.xml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 1894ef66fa5..505044de36c 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1658,6 +1658,16 @@ oEC60to30v3 + + ne30np4.pg2 + r05 + EC30to60E2r2 + r05 + mpas.gis20km + null + EC30to60E2r2 + + ne30np4.pg2 r05 @@ -4823,6 +4833,31 @@ cpl/gridmaps/mpas.gis20km/map_mpas.gis20km_to_oEC60to30v3_aave.181115.nc + + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_mono.230510.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_bilin.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_mono.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_mono.230510.nc + + + + cpl/gridmaps/r05/map_r05_to_gis20km_mono.230510.nc + cpl/gridmaps/r05/map_r05_to_gis20km_bilin.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_mono.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_mono.230510.nc + + + + cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis20km_aave.230510.nc + cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis20km_bilin.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + + From 30f2dd42276c7c3ec7cebd143e1cf5978f39770b Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 13 Jul 2023 12:38:13 -0700 Subject: [PATCH 015/310] Make MALI higher-order default for IG cases. --- components/elm/cime_config/config_compsets.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/cime_config/config_compsets.xml b/components/elm/cime_config/config_compsets.xml index 01366aa71dd..5614eecc652 100644 --- a/components/elm/cime_config/config_compsets.xml +++ b/components/elm/cime_config/config_compsets.xml @@ -773,7 +773,7 @@ IGELM_MLI - 2000_DATM%QIA_ELM%SP_SICE_SOCN_MOSART_MALI%SIA_SWAV + 2000_DATM%QIA_ELM%SP_SICE_SOCN_MOSART_MALI_SWAV From 6d9af83b3332012422e4232a763953edd07dbfbb Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 13 Jul 2023 12:40:07 -0700 Subject: [PATCH 016/310] Update path in 'help' description. --- components/mpas-albany-landice/cime_config/config_compsets.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mpas-albany-landice/cime_config/config_compsets.xml b/components/mpas-albany-landice/cime_config/config_compsets.xml index 8aa3687893c..f3124b78494 100644 --- a/components/mpas-albany-landice/cime_config/config_compsets.xml +++ b/components/mpas-albany-landice/cime_config/config_compsets.xml @@ -3,7 +3,7 @@ - Compset format is explained in cime/config/e3sm/allactive/config_compsets.xml + Compset format is explained in cime_config/allactive/config_compsets.xml or in the CIME documenation From 0b6899ce26ffc5318e02f90de56c3adddbfec4c8 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Mon, 17 Jul 2023 09:40:03 -0700 Subject: [PATCH 017/310] Add Albany path for perlmutter build. Add explicit path to Albany lib to support perlmutter builds. --- cime_config/machines/cmake_macros/gnu_pm-cpu.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake b/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake index 226d07350a7..de50cd83e03 100644 --- a/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake +++ b/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake @@ -10,3 +10,4 @@ set(MPIFC "ftn") set(SCC "gcc") set(SCXX "g++") set(SFC "gfortran") +set(ALBANY_PATH "/global/common/software/fanssie/albany-e3sm-serial-release-gcc") From 31a4bf26e45d4e6817f863be0c00c39a0b171ba5 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 10 Aug 2023 12:48:10 -0700 Subject: [PATCH 018/310] Add / update support for GIS grids Add and correct support for GIS 20km and 1-to-10km configs with r05, ne30pg2, and EC30to60E2r2 grids. --- cime_config/config_grids.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 505044de36c..6b506387702 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1658,7 +1658,7 @@ oEC60to30v3 - + ne30np4.pg2 r05 EC30to60E2r2 @@ -1688,6 +1688,16 @@ oEC60to30v3 + + ne30np4.pg2 + r05 + EC30to60E2r2 + r05 + mpas.gis1to10km + null + EC30to60E2r2 + + ne30np4.pg2 r0125 From 77e453fbb043b1f2e4b3c65e6a10c5ec0215e9d1 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 10 Aug 2023 15:16:44 -0700 Subject: [PATCH 019/310] Add CIME support for new GIS 1-to-10 (r02) Add CIME support for new GIS 1-to-10 (r02). Confirmed that BG compset calling for related grids builds successfully. --- cime_config/config_grids.xml | 45 +++++++++++++++++++ .../mpas-albany-landice/cime_config/buildnml | 5 +++ driver-mct/cime_config/config_component.xml | 2 +- 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 6b506387702..0e3a7cf2960 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1708,6 +1708,16 @@ EC30to60E2r2 + + ne30np4.pg2 + r05 + EC30to60E2r2 + r05 + mpas.gis1to10kmR2 + null + EC30to60E2r2 + + ne120np4.pg2 r0125 @@ -2905,6 +2915,12 @@ mpas.gis1to10km is a variable-resolution, from 1- to 10-km, MALI grid of the Greenland Ice Sheet. + + 427386 + 1 + mpas.gis1to10km is a variable-resolution, from 1- to 10-km, MALI grid of the Greenland Ice Sheet. + + 45675 1 @@ -4915,6 +4931,35 @@ cpl/gridmaps/mpas.gis1to10km/map_gis1to10km_to_EC30to60E2r2_aave.210304.nc + + + + + + cpl/gridmaps/r05/map_r05_to_gis1to10r02_mono.230725.nc + cpl/gridmaps/r05/map_r05_to_gis1to10r02_bilin.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_r05_mono.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_r05_mono.230725.nc + + + + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10r02_mono.230725.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10r02_bilin.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_ne30pg2_mono.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_ne30pg2_mono.230725.nc + + + + cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis1to10r02_aave.230725.nc + cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis1to10r02_bilin.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + + diff --git a/components/mpas-albany-landice/cime_config/buildnml b/components/mpas-albany-landice/cime_config/buildnml index edc88f09ffc..4b8088ceb42 100755 --- a/components/mpas-albany-landice/cime_config/buildnml +++ b/components/mpas-albany-landice/cime_config/buildnml @@ -77,6 +77,11 @@ def buildnml(case, caseroot, compname): grid_prefix += 'gis_1to10km_r01' decomp_date += '051920' decomp_prefix += 'mpasli.graph.info.' + elif glc_grid == 'mpas.gis1to10kmR2': + grid_date += '20230202' + grid_prefix += 'gis_1to10km_r02' + decomp_date += '020223' + decomp_prefix += 'mpasli.graph.info.' else: expect(False, "ERROR: mali buildnml encountered unknown GLC_GRID: " + glc_grid) diff --git a/driver-mct/cime_config/config_component.xml b/driver-mct/cime_config/config_component.xml index 9ebfb78234b..737ed23cd0e 100644 --- a/driver-mct/cime_config/config_component.xml +++ b/driver-mct/cime_config/config_component.xml @@ -1085,7 +1085,7 @@ char - gland20,gland10,gland5,gland5UM,gland4,mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,null + gland20,gland10,gland5,gland5UM,gland4,mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,mpas.gis1to10kmR2,null gland5UM build_grid env_build.xml From 9df499b090bef32d6a993c49499837d5ca904f1f Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 3 Jan 2024 13:57:50 -0800 Subject: [PATCH 020/310] Addition of various support for Greenland ice sheet configurations. Updated root paths for kokkos, albany, and trilinos in pm-cpu machine file. Removed no longer needed info from gnu_pum-cpu cmake file. Added support for e3sm + mali (Greenland) configurations for IG and BG cases, including: updated default output freq for mali hist files; add default PE layout for Greenland 20km IG case; add support for Greenland 20km IG test case to various testing infrastructure files. --- cime_config/config_archive.xml | 8 ++-- .../machines/cmake_macros/gnu_pm-cpu.cmake | 1 - cime_config/machines/config_machines.xml | 7 ++-- cime_config/tests.py | 8 +++- components/elm/cime_config/config_pes.xml | 38 +++++++++++++++++++ .../elm/gis20kmSMS/shell_commands | 11 ++++++ .../testmods_dirs/elm/gis20kmSMS/user_nl_elm | 1 + .../testmods_dirs/elm/gis20kmSMS/user_nl_mali | 8 ++++ .../mpas-albany-landice/cime_config/buildnml | 2 +- 9 files changed, 73 insertions(+), 11 deletions(-) create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali diff --git a/cime_config/config_archive.xml b/cime_config/config_archive.xml index 028a11e8439..b3283e6f3be 100644 --- a/cime_config/config_archive.xml +++ b/cime_config/config_archive.xml @@ -117,9 +117,8 @@ - + rst - rst.am.timeSeriesStatsMonthly hist unset @@ -129,9 +128,8 @@ rpointer.glc casename.mali.rst.1976-01-01_00000.nc - casename.mali.rst.am.timeSeriesStatsMonthly.1976-01-01_00000.nc - casename.mali.hist.am.globalStats.1976-01-01.nc - casename.mali.hist.am.highFrequencyOutput.1976-01-01_00.00.00.nc + casename.mali.hist.1976-01-01_00000.nc + casename.mali.hist.am.1976-01-01.nc diff --git a/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake b/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake index de50cd83e03..226d07350a7 100644 --- a/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake +++ b/cime_config/machines/cmake_macros/gnu_pm-cpu.cmake @@ -10,4 +10,3 @@ set(MPIFC "ftn") set(SCC "gcc") set(SCXX "g++") set(SFC "gfortran") -set(ALBANY_PATH "/global/common/software/fanssie/albany-e3sm-serial-release-gcc") diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index d6928bf5a8f..e600f35455f 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -263,8 +263,10 @@ /global/cfs/cdirs/e3sm/perl/lib/perl5-only-switch software MPI_Bcast - $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc; else echo "$Albany_ROOT"; fi} + $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc-cmake-fix; else echo "$Albany_ROOT"; fi} $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Trilinos_ROOT"; fi} + $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo Kokkos_ROOT=/global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} + $ENV{CRAY_NETCDF_HDF5PARALLEL_PREFIX} $ENV{CRAY_PARALLEL_NETCDF_PREFIX} 4000MB @@ -291,8 +293,7 @@ $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /global/cfs/cdirs/e3sm/3rdparty/adios2/2.9.1/cray-mpich-8.1.25/aocc-4.0.0; else echo "$ADIOS2_ROOT"; fi} - -1 - + -1 diff --git a/cime_config/tests.py b/cime_config/tests.py index 5e94f9c3007..773c265e216 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -120,6 +120,12 @@ ) }, + "e3sm_landice_developer" : { + "tests" : ( + "SMS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmSMS", + ) + }, + "eam_condidiag" : { "tests" : ( "SMS_D_Ln5.ne4pg2_oQU480.F2010", @@ -256,7 +262,7 @@ }, "e3sm_developer" : { - "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer"), + "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer", "e3sm_landice_developer"), "time" : "0:45:00", "tests" : ( "ERS.f19_g16_rx1.A", diff --git a/components/elm/cime_config/config_pes.xml b/components/elm/cime_config/config_pes.xml index 86acd12be93..0a986ae1900 100644 --- a/components/elm/cime_config/config_pes.xml +++ b/components/elm/cime_config/config_pes.xml @@ -523,4 +523,42 @@ + + + + GIS 20km (low-res) testing config + 128 + 128 + + 128 + 128 + 128 + 128 + 128 + 128 + 128 + 128 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/shell_commands new file mode 100644 index 00000000000..adec2de2665 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/shell_commands @@ -0,0 +1,11 @@ +./xmlchange STOP_OPTION=ndays +./xmlchange STOP_N=2 +./xmlchange REST_OPTION=ndays +./xmlchange REST_N=2 +./xmlchange NCPL_BASE_PERIOD=year +./xmlchange ATM_NCPL=17520 +./xmlchange LND_NCPL=17520 +./xmlchange OCN_NCPL=8760 +./xmlchange GLC_NCPL=365 +./xmlchange ROF_NCPL=17520 + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm new file mode 100644 index 00000000000..87da4e58ebf --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm @@ -0,0 +1 @@ +fglcmask = '/global/cfs/cdirs/e3sm/sprice/e3sm_cases/glcmaskdata_0.5x0.5_GIS_AIS-test.nc' diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali new file mode 100644 index 00000000000..2b3fdea5d15 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali @@ -0,0 +1,8 @@ +config_velocity_solver = 'FO' +config_thickness_advection = 'fo' +config_thermal_solver = 'none' +config_pio_num_iotasks = 47 +config_pio_stride = 64 +config_calving = 'none' +config_restore_calving_front = .true. +config_dt = '0000-00-01_00:00:00' diff --git a/components/mpas-albany-landice/cime_config/buildnml b/components/mpas-albany-landice/cime_config/buildnml index 4b8088ceb42..0a3b35df93e 100755 --- a/components/mpas-albany-landice/cime_config/buildnml +++ b/components/mpas-albany-landice/cime_config/buildnml @@ -210,7 +210,7 @@ def buildnml(case, caseroot, compname): lines.append(' filename_template="{}.mali.hist.$Y-$M-$D_$S.nc"'.format(casename)) lines.append(' filename_interval="0001-00-00_00:00:00"') lines.append(' clobber_mode="truncate"') - lines.append(' output_interval="0001-00-00_00:00:00">') + lines.append(' output_interval="0000-00-01_00:00:00">') # Note: if output_interval is less than dt, then multiples of that interval will be checked. # There is some performance hit for making this too small. For now making it 1 day. lines.append('') From f38128ba8a98c3391f9e5fcdf9ab26c0927bed3b Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 3 Jan 2024 15:44:58 -0800 Subject: [PATCH 021/310] Clean up stray comment in config machines file. --- cime_config/machines/config_machines.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index e600f35455f..3c4c4ef377e 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -266,7 +266,6 @@ $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc-cmake-fix; else echo "$Albany_ROOT"; fi} $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Trilinos_ROOT"; fi} $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo Kokkos_ROOT=/global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} - $ENV{CRAY_NETCDF_HDF5PARALLEL_PREFIX} $ENV{CRAY_PARALLEL_NETCDF_PREFIX} 4000MB From c5a39d1668682d2de47bfca694f57de8e43c5a5a Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 4 Jan 2024 10:23:48 -0800 Subject: [PATCH 022/310] Update default settings for mali's (Albany) velocity solver. --- .../bld/namelist_files/albany_input.yaml | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml index 89df18322ef..1fd5e577c63 100644 --- a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml +++ b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml @@ -1,11 +1,29 @@ %YAML 1.1 --- ANONYMOUS: +# In order to use ML, change Tpetra to Epetra in the following line, +# and "Preconditioner Type: MueLu" to " Preconditioner Type: ML" several lines below Build Type: Tpetra + Problem: + LandIce Field Norm: + sliding_velocity_basalside: + Regularization Type: Given Value + Regularization Value: 1.0e-4 + LandIce BCs: + BC 0: + Cubature Degree: 4 + Basal Friction Coefficient: + Type: Power Law + Power Exponent: 1.0 #left blank to cause an error if not filled + Mu Type: Field + Effective Pressure Type: Hydrostatic Computed At Nodes + Zero Effective Pressure On Floating Ice At Nodes: true + Zero Beta On Floating Ice: false + Use Pressurized Bed Above Sea Level: false # Discretization Description Discretization: -# Exodus Output File Name: albany_output.exo + #Exodus Output File Name: albany_output.exo Piro: # Nonlinear Solver Information @@ -22,13 +40,21 @@ ANONYMOUS: Combo Type: OR Number of Tests: 2 Test 0: - Test Type: NormF - Norm Type: Two Norm - Scale Type: Scaled - Tolerance: 1.0e-05 + Test Type: Combo + Combo Type: AND + Number of Tests: 2 + Test 0: + Test Type: NormF + Norm Type: Two Norm + Scale Type: Unscaled + Tolerance: 1.0e-03 + Test 1: + Test Type: RelativeNormF + Norm Type: Two Norm + Tolerance: 0.9999 Test 1: Test Type: MaxIters - Maximum Iterations: 50 + Maximum Iterations: 100 Printing: Output Precision: 3 Output Processor: 0 @@ -46,7 +72,7 @@ ANONYMOUS: Direction: Method: Newton Newton: - Forcing Term Method: Constant + Forcing Term Method: Type 2 Rescue Bad Newton Solve: true Linear Solver: Write Linear System: false @@ -230,4 +256,3 @@ ANONYMOUS: Coordinates: myRebalanceProlongatorFact Importer: myRepartitionFact - From ed14c216b852c1a55aa136840810f1c0ee00ddc5 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 4 Jan 2024 12:28:46 -0800 Subject: [PATCH 023/310] Simplify glcmask specs used for 20 km Greenland test case Explicitly specify which glcmask to use for Greenland 20km test case, which allows elm namelist changes for test to be removed. --- components/elm/bld/namelist_files/namelist_defaults.xml | 1 + .../testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 4f02fc9df8a..8597e21773a 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -592,6 +592,7 @@ this mask will have smb calculated over the entire global land surface glc/cism/griddata/glcmaskdata_0.9x1.25_Gland5km.nc lnd/clm2/griddata/glcmaskdata_0.9x1.25_60S.nc +lnd/clm2/griddata/glcmaskdata_0.5x0.5_everywhere.nc lnd/clm2/griddata/glcmaskdata_0.5x0.5_GIS_AIS.nc lnd/clm2/griddata/glcmaskdata_r0125_GIS_AIS.210407.nc lnd/clm2/griddata/glcmaskdata_ne30pg2_GIS_AIS.210407.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm deleted file mode 100644 index 87da4e58ebf..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_elm +++ /dev/null @@ -1 +0,0 @@ -fglcmask = '/global/cfs/cdirs/e3sm/sprice/e3sm_cases/glcmaskdata_0.5x0.5_GIS_AIS-test.nc' From 18965ab3fb4907671fcc55d04cdddfe0c5925126 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 7 Feb 2024 13:03:32 -0600 Subject: [PATCH 024/310] Resolve merge conflict for chrysalis --- cime_config/machines/config_machines.xml | 5 +++++ components/elm/cime_config/config_pes.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 3c4c4ef377e..fdd4db63661 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2641,6 +2641,11 @@ $SHELL{if [ -z "$MOAB_ROOT" ]; then echo /lcrc/soft/climate/moab/chrysalis/gnu; else echo "$MOAB_ROOT"; fi} + + $SHELL{if [ -z "$Albany_ROOT" ]; then echo /lcrc/group/e3sm/ac.jwatkins/LandIce/AlbanyBuilds/build-gcc-sfad12-e3sm/install; else echo "$Albany_ROOT"; fi} + $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /lcrc/group/e3sm/ac.jwatkins/LandIce/TrilinosBuilds/build-gcc-e3sm/install; else echo "$Trilinos_ROOT"; fi} + $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo /lcrc/group/e3sm/ac.jwatkins/LandIce/TrilinosBuilds/build-gcc-e3sm/install; else echo "$Kokkos_ROOT"; fi} + diff --git a/components/elm/cime_config/config_pes.xml b/components/elm/cime_config/config_pes.xml index 0a986ae1900..5a6a5131ded 100644 --- a/components/elm/cime_config/config_pes.xml +++ b/components/elm/cime_config/config_pes.xml @@ -524,7 +524,7 @@ - + GIS 20km (low-res) testing config 128 From 7f2e5a65340d4b2671423ac846d83e7ac691d1f8 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 4 Jan 2024 13:32:48 -0800 Subject: [PATCH 025/310] Correct Kokkos path in pm-cpu machine file (for mali support) --- cime_config/machines/config_machines.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index fdd4db63661..43afc5f8091 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -265,7 +265,7 @@ MPI_Bcast $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc-cmake-fix; else echo "$Albany_ROOT"; fi} $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Trilinos_ROOT"; fi} - $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo Kokkos_ROOT=/global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} + $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} $ENV{CRAY_NETCDF_HDF5PARALLEL_PREFIX} $ENV{CRAY_PARALLEL_NETCDF_PREFIX} 4000MB From 71ff4fb569c33f79942cc075ef20596adf5fda79 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Fri, 5 Jan 2024 13:50:34 -0800 Subject: [PATCH 026/310] Add support for ERS and ERP tests for 20km Greenland IG config. --- cime_config/tests.py | 2 ++ .../testmods_dirs/elm/gis20kmERP/shell_commands | 10 ++++++++++ .../testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali | 8 ++++++++ .../testmods_dirs/elm/gis20kmERS/shell_commands | 10 ++++++++++ .../testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali | 8 ++++++++ 5 files changed, 38 insertions(+) create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali diff --git a/cime_config/tests.py b/cime_config/tests.py index 773c265e216..144924485b6 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -123,6 +123,8 @@ "e3sm_landice_developer" : { "tests" : ( "SMS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmSMS", + "ERS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmERS", + "ERP.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmERP", ) }, diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands new file mode 100644 index 00000000000..4547393d872 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands @@ -0,0 +1,10 @@ +./xmlchange STOP_OPTION=ndays +./xmlchange STOP_N=1 +./xmlchange REST_OPTION=ndays +./xmlchange REST_N=1 +./xmlchange NCPL_BASE_PERIOD=year +./xmlchange ATM_NCPL=17520 +./xmlchange LND_NCPL=17520 +./xmlchange OCN_NCPL=8760 +./xmlchange GLC_NCPL=365 +./xmlchange ROF_NCPL=17520 diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali new file mode 100644 index 00000000000..2b3fdea5d15 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali @@ -0,0 +1,8 @@ +config_velocity_solver = 'FO' +config_thickness_advection = 'fo' +config_thermal_solver = 'none' +config_pio_num_iotasks = 47 +config_pio_stride = 64 +config_calving = 'none' +config_restore_calving_front = .true. +config_dt = '0000-00-01_00:00:00' diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/shell_commands new file mode 100644 index 00000000000..4547393d872 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/shell_commands @@ -0,0 +1,10 @@ +./xmlchange STOP_OPTION=ndays +./xmlchange STOP_N=1 +./xmlchange REST_OPTION=ndays +./xmlchange REST_N=1 +./xmlchange NCPL_BASE_PERIOD=year +./xmlchange ATM_NCPL=17520 +./xmlchange LND_NCPL=17520 +./xmlchange OCN_NCPL=8760 +./xmlchange GLC_NCPL=365 +./xmlchange ROF_NCPL=17520 diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali new file mode 100644 index 00000000000..2b3fdea5d15 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali @@ -0,0 +1,8 @@ +config_velocity_solver = 'FO' +config_thickness_advection = 'fo' +config_thermal_solver = 'none' +config_pio_num_iotasks = 47 +config_pio_stride = 64 +config_calving = 'none' +config_restore_calving_front = .true. +config_dt = '0000-00-01_00:00:00' From dd43257d3ad52966e80b58caf7cf3366129627a6 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Mon, 8 Jan 2024 13:25:31 -0800 Subject: [PATCH 027/310] Add default pe layout for BG case w/ high-res Greenland ice sheet. --- cime_config/allactive/config_pesall.xml | 39 +++++++++++++++++++++++ components/elm/cime_config/config_pes.xml | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index 67a74a3f60c..e49ec64a8d2 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -2451,4 +2451,43 @@ + + + + GIS 1-to-10km (high-res) baseline config + 128 + 128 + + 1350 + 960 + 960 + 1350 + 320 + 960 + 2310 + 2310 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 1350 + 1350 + 0 + 2310 + 1350 + 0 + 0 + + + + diff --git a/components/elm/cime_config/config_pes.xml b/components/elm/cime_config/config_pes.xml index 5a6a5131ded..2535e89c243 100644 --- a/components/elm/cime_config/config_pes.xml +++ b/components/elm/cime_config/config_pes.xml @@ -525,7 +525,7 @@ - + GIS 20km (low-res) testing config 128 128 From 7e0da048fec8e574cdcfab6be94e36ac5bb286bf Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Mon, 8 Jan 2024 13:38:51 -0800 Subject: [PATCH 028/310] Minor updates in support of coupled configs. with active Greenland ice sheet. Archive settings switched back to mpas component defaults; change days run for ERP test. --- cime_config/config_archive.xml | 2 +- .../testdefs/testmods_dirs/elm/gis20kmERP/shell_commands | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cime_config/config_archive.xml b/cime_config/config_archive.xml index b3283e6f3be..84de6e0f171 100644 --- a/cime_config/config_archive.xml +++ b/cime_config/config_archive.xml @@ -117,7 +117,7 @@ - + rst hist unset diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands index 4547393d872..732ccb23523 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands @@ -1,7 +1,7 @@ ./xmlchange STOP_OPTION=ndays -./xmlchange STOP_N=1 +./xmlchange STOP_N=3 ./xmlchange REST_OPTION=ndays -./xmlchange REST_N=1 +./xmlchange REST_N=3 ./xmlchange NCPL_BASE_PERIOD=year ./xmlchange ATM_NCPL=17520 ./xmlchange LND_NCPL=17520 From 423b9a36434f9fd39161a4df21169a1b999b1392 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Mon, 8 Jan 2024 14:11:06 -0800 Subject: [PATCH 029/310] Fix specs for default PE layout for Greenland 20 km config Fix default layout to work on pm-cpu, alvarez, and chrysalis. --- components/elm/cime_config/config_pes.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/cime_config/config_pes.xml b/components/elm/cime_config/config_pes.xml index 2535e89c243..14384649a1c 100644 --- a/components/elm/cime_config/config_pes.xml +++ b/components/elm/cime_config/config_pes.xml @@ -524,7 +524,7 @@ - + GIS 20km (low-res) testing config 128 From 01797800d1eb9c61e407edcdc2b2ec8ff25be5a1 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Mon, 8 Jan 2024 15:46:34 -0800 Subject: [PATCH 030/310] Mods towards default PE layout for Greenland 1-to-10 km working on multiple machines --- cime_config/allactive/config_compsets.xml | 2 +- cime_config/allactive/config_pesall.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cime_config/allactive/config_compsets.xml b/cime_config/allactive/config_compsets.xml index b0587d3f7ae..f2d96ee8274 100755 --- a/cime_config/allactive/config_compsets.xml +++ b/cime_config/allactive/config_compsets.xml @@ -393,7 +393,7 @@ BGWCYCL1850 - 1850_EAM%CMIP6_ELM%SPBC_MPASSI_MPASO_MOSART_MALI%STATIC_SWAV + 1850_EAM%CMIP6_ELM%SPBC_MPASSI_MPASO_MOSART_MALI_SWAV diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index e49ec64a8d2..7c266de6854 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -2452,8 +2452,8 @@ - - + + GIS 1-to-10km (high-res) baseline config 128 128 From 202f394fded8d3ce500c0a4aa4ae2607bc2cd3c2 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 7 Feb 2024 13:06:53 -0600 Subject: [PATCH 031/310] Resolve merge conflict in pesall file --- cime_config/allactive/config_pesall.xml | 134 +++++++++++++----------- 1 file changed, 72 insertions(+), 62 deletions(-) diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index 7c266de6854..f68213b2488 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -325,7 +325,7 @@ - + "anvil, GPMPAS-JRA compset, 6 nodes" -6 @@ -338,7 +338,7 @@ - + "crusher, GPMPAS-JRA compset, 2 nodes" -4 @@ -351,7 +351,7 @@ - + summit|ascent: GPMPAS-JRA compset on ne30np4 grid -4 @@ -468,7 +468,7 @@ - + -compset A_WCYCL* -res ne30_oEC* on 27 nodes pure-MPI 900 @@ -487,7 +487,7 @@ 0 - + -compset A_WCYCL* -res ne30_oEC* on 40 nodes pure-MPI 1350 @@ -506,7 +506,7 @@ 0 - + -compset A_WCYCL* -res ne30_oEC* on 80 nodes pure-MPI 2700 @@ -525,7 +525,7 @@ 0 - + -compset A_WCYCL* -res ne30_oEC* on 160 nodes pure-MPI 5400 @@ -548,7 +548,7 @@ - + ne120-wcycl on 42 nodes 128x1 ~0.7 sypd 128 @@ -584,7 +584,7 @@ - + ne120-wcycl on 145 nodes, MPI-only 64 64 @@ -609,7 +609,7 @@ 0 - + ne120-wcycl on 145 nodes, threaded 256 64 @@ -644,7 +644,7 @@ 0 - + ne120 coupled-compset on 466 nodes 64 64 @@ -669,7 +669,7 @@ 0 - + ne120-wcycl on 863 nodes, MPI-only 64 64 @@ -694,7 +694,7 @@ 0 - + ne120-wcycl on 863 nodes, threaded 128 64 @@ -729,7 +729,7 @@ 0 - + ne120-wcycl on 825 nodes, threaded, 32 tasks/node 128 32 @@ -764,7 +764,7 @@ 0 - + ne120-wcycl on 800 nodes, threaded, 32 tasks/node 128 32 @@ -801,7 +801,7 @@ - + compy ne120 W-cycle on 310 nodes, 40x1, sypd=1.2 9600 @@ -824,7 +824,7 @@ - + --compset WCYCL* --res ne30pg2_EC30to60E2r2 on 25 nodes pure-MPI, ~5.4 sypd 675 @@ -843,7 +843,7 @@ 0 - + --compset WCYCL* --res ne30pg2_EC30to60E2r2 on 48 nodes pure-MPI, ~9.4 sypd 1350 @@ -862,7 +862,7 @@ 0 - + --compset WCYCL* --res ne30pg2_EC30to60E2r2 on 90 nodes pure-MPI, ~12 sypd 2700 @@ -917,7 +917,7 @@ - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 27 nodes pure-MPI, ~15.5 sypd 2700 @@ -936,7 +936,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 54 nodes pure-MPI, ~25.5 sypd 5400 @@ -957,7 +957,7 @@ - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 11 nodes pure-MPI, ~2.8 sypd 320 @@ -976,7 +976,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 21 nodes pure-MPI, ~5.5 sypd 600 @@ -995,7 +995,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 46 nodes pure-MPI, ~11 sypd 1350 @@ -1014,7 +1014,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_EC30to60* on 90 nodes pure-MPI, ~18 sypd 2700 @@ -1037,7 +1037,7 @@ - + -compset WCYCL*/CRYO* -res SOwISC12to60E2r4* on 75 nodes pure-MPI, ~5 sypd 900 @@ -1058,7 +1058,7 @@ - + -compset WCYCL*/CRYO* -res ne30pg*SOwISC12to60E2r4* on 105 nodes pure-MPI, ~18.5 sypd 64 @@ -1078,7 +1078,7 @@ 0 - + -compset WCYCL*/CRYO* -res ne30pg*SOwISC12to60E2r4* on 54 nodes pure-MPI, ~11 sypd 64 @@ -1102,7 +1102,7 @@ - + -compset WCYCL*/CRYO* -res ECwISC30to60E2r1* on 48 nodes pure-MPI, ~8.5 sypd 1350 @@ -1123,7 +1123,7 @@ - + -compset WCYCL*/CRYO* -res ne30pg*ECwISC30to60E2r1* on 105 nodes pure-MPI, ~40 sypd 64 @@ -1143,7 +1143,7 @@ 0 - + -compset WCYCL*/CRYO* -res ne30pg*ECwISC30to60E2r1* on 55 nodes pure-MPI, ~25 sypd 64 @@ -1163,7 +1163,7 @@ 0 - + -compset WCYCL*/CRYO* -res ne30pg*ECwISC30to60E2r1* on 28 nodes pure-MPI, ~15 sypd 64 @@ -1187,7 +1187,7 @@ - + gcp12 -compset A_WCYCL* -res ne30pg2_oECv3 with MPASO on 7 nodes 280 @@ -1216,7 +1216,7 @@ - + gcp10 -compset A_WCYCL* -res ne30pg2_oECv3 with MPASO on 11 nodes 240 @@ -1244,8 +1244,13 @@ +<<<<<<< HEAD +======= + + +>>>>>>> d12e918a46 (Add stub glc to compset lines in config pes file) -compset A_WCYCL* -res ne30pg2_oECv3 with MPASO on 7 nodes, 128x1 128 @@ -1273,7 +1278,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_oECv3 with MPASO on 58 nodes, 128x1, ~20 sypd 128 @@ -1382,7 +1387,7 @@ - + -compset A_WCYCL* -res ne30pg2_oECv3 on 11 nodes pure-MPI, ~2.8 sypd 320 @@ -1401,7 +1406,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_oECv3 on 21 nodes pure-MPI, ~5.5 sypd 600 @@ -1420,7 +1425,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_oECv3 on 46 nodes pure-MPI, ~11 sypd 1350 @@ -1439,7 +1444,7 @@ 0 - + -compset A_WCYCL* -res ne30pg2_oECv3 on 90 nodes pure-MPI, ~18 sypd 2700 @@ -1534,7 +1539,7 @@ - + -compset WCYCL* -res ne30pg2_EC30to60E2r2 on 14 nodes pure-MPI, ~6 sypd 704 @@ -1553,7 +1558,7 @@ 0 - + -compset WCYCL* -res ne30pg2_EC30to60E2r2 on 27 nodes pure-MPI, ~12 sypd 1408 @@ -1572,7 +1577,7 @@ 0 - + -compset WCYCL* -res ne30pg2_EC30to60E2r2 on 53 nodes pure-MPI, ~21 sypd 2752 @@ -1591,7 +1596,7 @@ 0 - + -compset WCYCL* -res ne30pg2_EC30to60E2r2 on 70 nodes pure-MPI, ~24 sypd 3648 @@ -1610,7 +1615,7 @@ 0 - + -compset WCYCL* -res ne30pg2EC30to60E2r2 on 100 nodes pure-MPI, ~30 sypd 5440 @@ -1631,7 +1636,7 @@ - + -compset A_WCYCL* -res ne30pg*EC30to60* on 8 debug Q nodes threaded, 0.8 sypd 384 @@ -1658,7 +1663,7 @@ 0 - + -compset A_WCYCL* -res ne30pg*EC30to60* on 128 default Q nodes pure-MPI, 3.8 sypd 5400 @@ -1681,7 +1686,7 @@ - + -compset WCYCL* -res ne30pg*WCAtl* on 80 nodes pure-MPI, ~8.5 sypd 2700 @@ -1879,7 +1884,7 @@ - + rmod025a 40 40 @@ -1900,7 +1905,7 @@ 0 - + rmod077a 40 40 @@ -1921,7 +1926,7 @@ 0 - + rmod111a 40 40 @@ -1942,7 +1947,7 @@ 0 - + rmod037a 20 40 @@ -1963,7 +1968,7 @@ 2 - + rmod074a 20 40 @@ -1992,7 +1997,7 @@ 0 - + rmod115b 20 40 @@ -2023,7 +2028,7 @@ - + RRM-WCYCL: 64 nodes 2.133 sypd 1800 @@ -2044,7 +2049,7 @@ - + cmod016b64x1 s=2.4 64 128 @@ -2065,7 +2070,7 @@ 0 - + cmod040c64x1 s=5.6 64 128 @@ -2086,7 +2091,7 @@ 0 - + cmod060d64x1 s=8.0 64 128 @@ -2107,7 +2112,7 @@ 0 - + cmod080c64x1 s=10.1 64 128 @@ -2128,7 +2133,7 @@ 0 - + cmod100b64x1 s=12.3 64 128 @@ -2150,8 +2155,13 @@ +<<<<<<< HEAD +======= + + +>>>>>>> d12e918a46 (Add stub glc to compset lines in config pes file) 8 nodes, 128x1 640 @@ -2204,7 +2214,7 @@ - + --compset WCYCL* --res ne30pg2_EC30to60E2r2_wQU225EC30to60E2r2 on 48 nodes pure-MPI, ~8.8 sypd 1350 @@ -2238,7 +2248,7 @@ - + none 924 @@ -2275,7 +2285,7 @@ - + none 2768 From e6d689d3c8c2d9b588a2804fa297055b3319bf85 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Fri, 19 Jan 2024 10:39:32 -0800 Subject: [PATCH 032/310] Update defualt PE layouts for GIS 1-to-10km for pm-cpu and chrysalis --- cime_config/allactive/config_pesall.xml | 39 ++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index f68213b2488..f6de2f6dd06 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -2462,7 +2462,7 @@ - + GIS 1-to-10km (high-res) baseline config 128 @@ -2499,5 +2499,42 @@ + + + GIS 1-to-10km (high-res) baseline config + 64 + 64 + + 1350 + 960 + 960 + 1408 + 384 + 960 + 1 + 2368 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 1408 + 1408 + 0 + 2368 + 1408 + 0 + 0 + + + From 88d2dc19f7f7944a495ef1cf75c9f82e7ef90367 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 7 Feb 2024 14:10:40 -0600 Subject: [PATCH 033/310] Fix a few more merge conflicts in pesall file --- cime_config/allactive/config_pesall.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index f6de2f6dd06..b149d9aceb2 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -1244,13 +1244,8 @@ -<<<<<<< HEAD - -======= - ->>>>>>> d12e918a46 (Add stub glc to compset lines in config pes file) -compset A_WCYCL* -res ne30pg2_oECv3 with MPASO on 7 nodes, 128x1 128 @@ -2155,13 +2150,8 @@ -<<<<<<< HEAD - -======= - ->>>>>>> d12e918a46 (Add stub glc to compset lines in config pes file) 8 nodes, 128x1 640 From ab94e4f7b9a9c8d2deba2f4b6b8352c76fa449af Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Wed, 7 Feb 2024 12:12:30 -0800 Subject: [PATCH 034/310] update replay option so that it will produce output when run with theta-l dycore --- components/eam/src/dynamics/se/stepon.F90 | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/components/eam/src/dynamics/se/stepon.F90 b/components/eam/src/dynamics/se/stepon.F90 index 831fd6d8760..c9c28ad1eb7 100644 --- a/components/eam/src/dynamics/se/stepon.F90 +++ b/components/eam/src/dynamics/se/stepon.F90 @@ -526,9 +526,10 @@ subroutine stepon_run3(dtime, cam_out, phys_state, dyn_in, dyn_out) use hycoef, only: hyam, hybm use dimensions_mod, only: nlev, nelemd, np, npsq use se_iop_intr_mod, only: iop_setfield, iop_setinitial - use dyn_comp, only: TimeLevel + use dyn_comp, only: TimeLevel, hvcoord use cam_history, only: outfld use cam_logfile, only: iulog + use element_ops, only: get_temperature use mpishorthand real(r8), intent(in) :: dtime ! Time-step real(r8) :: ftmp_temp(np,np,nlev,nelemd), ftmp_q(np,np,nlev,pcnst,nelemd) @@ -542,6 +543,7 @@ subroutine stepon_run3(dtime, cam_out, phys_state, dyn_in, dyn_out) type (dyn_export_t), intent(inout) :: dyn_out ! Dynamics export container type (element_t), pointer :: elem(:) integer :: rc, i, j, k, p, ie, tl_f + real(r8) :: temperature(np,np,nlev) ! Temperature from dynamics #if defined (E3SM_SCM_REPLAY) real(r8) :: forcing_temp(npsq,nlev), forcing_q(npsq,nlev,pcnst) #endif @@ -554,7 +556,10 @@ subroutine stepon_run3(dtime, cam_out, phys_state, dyn_in, dyn_out) ! Save ftmp stuff to get state before dynamics is called do ie=1,nelemd - ftmp_temp(:,:,:,ie) = dyn_in%elem(ie)%state%T(:,:,:,tl_f) + + call get_temperature(dyn_in%elem(ie),temperature,hvcoord,tl_f) + + ftmp_temp(:,:,:,ie) = temperature(:,:,:) ftmp_q(:,:,:,:,ie) = dyn_in%elem(ie)%state%Q(:,:,:,:) enddo @@ -599,6 +604,10 @@ subroutine stepon_run3(dtime, cam_out, phys_state, dyn_in, dyn_out) tl_f = TimeLevel%n0 do ie=1,nelemd + + ! Get temperature from dynamics state + call get_temperature(dyn_in%elem(ie),temperature,hvcoord,tl_f) + do k=1,nlev do j=1,np do i=1,np @@ -606,9 +615,9 @@ subroutine stepon_run3(dtime, cam_out, phys_state, dyn_in, dyn_out) ! Note that this calculation will not provide b4b results with ! an E3SM because the dynamics tendency is not computed in the exact ! same way as an E3SM run, introducing error with roundoff - forcing_temp(i+(j-1)*np,k) = (dyn_in%elem(ie)%state%T(i,j,k,tl_f) - & + forcing_temp(i+(j-1)*np,k) = (temperature(i,j,k) - & ftmp_temp(i,j,k,ie))/dtime - dyn_in%elem(ie)%derived%FT(i,j,k) - out_temp(i+(j-1)*np,k) = dyn_in%elem(ie)%state%T(i,j,k,tl_f) + out_temp(i+(j-1)*np,k) = temperature(i,j,k) out_u(i+(j-1)*np,k) = dyn_in%elem(ie)%state%v(i,j,1,k,tl_f) out_v(i+(j-1)*np,k) = dyn_in%elem(ie)%state%v(i,j,2,k,tl_f) out_q(i+(j-1)*np,k) = dyn_in%elem(ie)%state%Q(i,j,k,1) From 0ac6084eb601169bfd748914d0700d3558eadb04 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 7 Feb 2024 12:24:20 -0800 Subject: [PATCH 035/310] added ERA5 datm, not functional due to land ice error --- .../datm/cime_config/config_component.xml | 6 +- .../cime_config/namelist_definition_datm.xml | 130 +++++++++--------- 2 files changed, 68 insertions(+), 68 deletions(-) diff --git a/components/data_comps/datm/cime_config/config_component.xml b/components/data_comps/datm/cime_config/config_component.xml index de306375e83..c9102773b29 100644 --- a/components/data_comps/datm/cime_config/config_component.xml +++ b/components/data_comps/datm/cime_config/config_component.xml @@ -45,13 +45,13 @@ char - CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR + CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ELMERA5,ELMERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR CORE2_NYF run_component_datm env_run.xml Mode for data atmosphere component. CORE2_NYF (CORE2 normal year forcing) are modes used in forcing prognostic ocean/sea-ice components. - CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, ERA5,ERA5_6HR, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. + CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, ELMERA5,ERA5_6HR, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. WARNING for CLMNLDAS2: This is a regional forcing dataset over the U.S. (25-53N, 235-293E). Garbage data will be produced for runs extending beyond this regional domain. WARNING for CLMGSWP3v1: Humidity is identically zero for last time step in Dec/2013 and all of 2014 so you should NOT use 2014 data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). @@ -70,7 +70,7 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). CLMCRUNCEP CLMCRUNCEPv7 CLMGSWP3v1 - ERA5 + ELMERA5 ERA5_6HR CLMMOSARTTEST CLMNLDAS2 diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index 219f069a8e0..b2efad22f70 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -36,8 +36,8 @@ CLMCRUNCEP = Run with the CLM CRU NCEP V4 ( default ) forcing valid from 1900 to 2010 (force CLM) CLMCRUNCEPv7 = Run with the CLM CRU NCEP V7 forcing valid from 1900 to 2010 (force CLM) CLMGSWP3v1 = Run with the CLM GSWP3 V1 forcing (force CLM) - ERA5 = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present - ERA5_6HR = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present + ELMERA5 = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present + ERA5_6HR = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present CLMMOSARTTEST = Run with the CLM NLDAS data (force CLM) for testing MOSART CLMNLDAS2 = Run with the CLM NLDAS2 regional forcing valid from 1980 to 2018 (force CLM) CLM1PT = Run with supplied single point data (force CLM) @@ -106,15 +106,15 @@ CLMGSWP3v1.Precip CLMGSWP3v1.TPQW - ERA5.msdrswrf # mean surface direct shortwave radiation flux - ERA5.msdfswrf # mean surface diffuse shortwave radiation flux - ERA5.mcpr # mean convective precipitation rate - ERA5.mlspr # mean large-scale precipitation rate - ERA5.t2m # temperature at 2 m - ERA5.sp # surface pressure - ERA5.d2m # dew point temperature at 2 m - ERA5.w10 # wind speed at 10 m - ERA5.msdwlwrf # mean surface downward longwave radiation flux + ELMERA5.msdrswrf # mean surface direct shortwave radiation flux + ELMERA5.msdfswrf # mean surface diffuse shortwave radiation flux + ELMERA5.mcpr # mean convective precipitation rate + ELMERA5.mlspr # mean large-scale precipitation rate + ELMERA5.t2m # temperature at 2 m + ELMERA5.sp # surface pressure + ELMERA5.d2m # dew point temperature at 2 m + ELMERA5.w10 # wind speed at 10 m + ELMERA5.msdwlwrf # mean surface downward longwave radiation flux ERA5_6HR.msdrswrf # mean surface direct shortwave radiation flux ERA5_6HR.msdfswrf # mean surface diffuse shortwave radiation flux @@ -224,7 +224,7 @@ CLMCRUNCEP.Solar,CLMCRUNCEP.Precip,CLMCRUNCEP.TPQW CLMCRUNCEPv7.Solar,CLMCRUNCEPv7.Precip,CLMCRUNCEPv7.TPQW CLMGSWP3v1.Solar,CLMGSWP3v1.Precip,CLMGSWP3v1.TPQW - ERA5.msdrswrf,ERA5.msdfswrf,ERA5.mcpr,ERA5.mlspr, ERA5.t2m,ERA5.sp,ERA5.d2m,ERA5.w10,ERA5.msdwlwrf + ELMERA5.msdrswrf,ELMERA5.msdfswrf,ELMERA5.mcpr,ELMERA5.mlspr,ELMERA5.t2m,ELMERA5.sp,ELMERA5.d2m,ELMERA5.w10,ELMERA5.msdwlwrf ERA5_6HR.msdrswrf,ERA5_6HR.msdfswrf,ERA5_6HR.mcpr,ERA5_6HR.mlspr,ERA5_6HR.t2m,ERA5_6HR.sp,ERA5_6HR.d2m,ERA5_6HR.w10,ERA5_6HR.msdwlwrf CLMMOSARTTEST CLMNLDAS2.Solar,CLMNLDAS2.Precip,CLMNLDAS2.TPQW @@ -258,7 +258,7 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715 $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.V5.c140715 @@ -328,7 +328,7 @@ domain.lnd.360x720.130305.nc domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.360x720_gswp3.0v1.c170606.nc - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc domain.lnd.nldas2_0224x0464_c110415.nc domain.lnd.0.125nldas2_0.125nldas2.190410.nc @@ -506,15 +506,15 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Solar3Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Precip3Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/TPHWL3Hrly - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec @@ -599,15 +599,15 @@ clmforc.GSWP3.c2011.0.5x0.5.Solr.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Prec.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.TPQWL.%ym.nc - elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc - elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc - elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc - elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc - elmforc.ERA5.c2018.0.25d.t2m.%ym.nc - elmforc.ERA5.c2018.0.25d.sp.%ym.nc - elmforc.ERA5.c2018.0.25d.d2m.%ym.nc - elmforc.ERA5.c2018.0.25d.w10.%ym.nc - elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc + elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc + elmforc.ERA5.c2018.0.25d.t2m.%ym.nc + elmforc.ERA5.c2018.0.25d.sp.%ym.nc + elmforc.ERA5.c2018.0.25d.d2m.%ym.nc + elmforc.ERA5.c2018.0.25d.w10.%ym.nc + elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc @@ -1587,31 +1587,31 @@ PSRF pbot FLDS lwdn - + msdrswrf swdndr - + msdfswrf swdndf - + mcpr precc - + mlspr precl - + t2m tbot - + sp pbot - + d2m tdew - + w10 wind - + msdwlwrf lwdn @@ -1911,7 +1911,7 @@ $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN - $DATM_CLMNCEP_YR_ALIGN + $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN @@ -1963,7 +1963,7 @@ $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START - $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START @@ -2036,7 +2036,7 @@ $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END - $DATM_CLMNCEP_YR_END + $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END @@ -2112,11 +2112,11 @@ 900 0 0 - -3600 - -3600 - -60 - -60 - -60 + -3600 + -3600 + -60 + -60 + -60 -21600 -21600 -60 @@ -2188,7 +2188,7 @@ NULL CLMNCEP - CLMNCEP + CLMNCEP CLMNCEP CORE2_NYF CORE2_IAF @@ -2230,7 +2230,7 @@ nn - copy + copy copy @@ -2386,11 +2386,11 @@ nearest coszen nearest - coszen - coszen - upper - linear - linear + coszen + coszen + upper + linear + linear coszen coszen upper @@ -2488,15 +2488,15 @@ 3.0 3.0 3.0 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 2.5 2.5 2.5 From aa8f96f7b5066acd059a1888e5dfed7a251f2158 Mon Sep 17 00:00:00 2001 From: Chloe Date: Wed, 7 Feb 2024 17:39:51 -0800 Subject: [PATCH 036/310] ERA% datm debugging --- .../datm/cime_config/config_component.xml | 2 ++ .../cime_config/namelist_definition_datm.xml | 29 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/components/data_comps/datm/cime_config/config_component.xml b/components/data_comps/datm/cime_config/config_component.xml index c9102773b29..1e03867dcf1 100644 --- a/components/data_comps/datm/cime_config/config_component.xml +++ b/components/data_comps/datm/cime_config/config_component.xml @@ -15,6 +15,7 @@ QIAN with water isotopes CRUNCEP data set CLM CRU NCEP v7 data set + CRUJRA data set GSWP3v1 data set Fifth generation ECMWF reanalysis Fifth generation ECMWF reanalysis,6 hourly data @@ -65,6 +66,7 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). CORE_RYF8485_JRA CORE_RYF9091_JRA CORE_RYF0304_JRA + CRUJRA CLM_QIAN CLM_QIAN_WISO CLMCRUNCEP diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index b2efad22f70..3c5377618a5 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -223,6 +223,7 @@ CLM1PT.$ATM_GRID CLMCRUNCEP.Solar,CLMCRUNCEP.Precip,CLMCRUNCEP.TPQW CLMCRUNCEPv7.Solar,CLMCRUNCEPv7.Precip,CLMCRUNCEPv7.TPQW + CRUJRA.Solar,CRUJRA.Precip,CRUJRA.TPQW CLMGSWP3v1.Solar,CLMGSWP3v1.Precip,CLMGSWP3v1.TPQW ELMERA5.msdrswrf,ELMERA5.msdfswrf,ELMERA5.mcpr,ELMERA5.mlspr,ELMERA5.t2m,ELMERA5.sp,ELMERA5.d2m,ELMERA5.w10,ELMERA5.msdwlwrf ERA5_6HR.msdrswrf,ERA5_6HR.msdfswrf,ERA5_6HR.mcpr,ERA5_6HR.mlspr,ERA5_6HR.t2m,ERA5_6HR.sp,ERA5_6HR.d2m,ERA5_6HR.w10,ERA5_6HR.msdwlwrf @@ -256,6 +257,7 @@ null $DIN_LOC_ROOT/atm/datm7 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715 + $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 @@ -325,6 +327,7 @@ domain.T62.050609.nc domain.T62.050609.nc domain.lnd.360x720_cruncep.130305.nc + domain.crujra.0.5x0.5.c200728.nc domain.lnd.360x720.130305.nc domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.360x720_gswp3.0v1.c170606.nc @@ -497,6 +500,9 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/Solar6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/Precip6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/TPHWL6Hrly + $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/Solar6Hrly + $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/Precip6Hrly + $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/TPHWL6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Solar $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Precip $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/TPHWL @@ -596,6 +602,9 @@ clmforc.cruncep.V7.c2016.0.5d.Solr.%ym.nc clmforc.cruncep.V7.c2016.0.5d.Prec.%ym.nc clmforc.cruncep.V7.c2016.0.5d.TPQWL.%ym.nc + clmforc.CRUJRA.0.5d.Solr.%ym.nc + clmforc.CRUJRA.0.5d.Prec.%ym.nc + clmforc.CRUJRA.0.5d.TPQWL.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Solr.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Prec.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.TPQWL.%ym.nc @@ -1574,6 +1583,18 @@ QBOT shum PSRF pbot + + FSDS swdn + + + PRECTmms precn + + + TBOT tbot + WIND wind + QBOT shum + PSRF pbot + FSDS swdn @@ -1915,6 +1936,7 @@ $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN + $DATM_CLMNCEP_YR_ALIGN 1 1 1 @@ -1967,6 +1989,7 @@ $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START 1 2010 2010 @@ -2040,6 +2063,7 @@ $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END + $DATM_CLMNCEP_YR_END 1 2011 2011 @@ -2137,7 +2161,7 @@ char streams shr_strdata_nml - CLMNCEP,COPYALL,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,IAF_JRA_1p5,CORE_RYF_JRA,NULL + CLMNCEP,COPYALL,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,IAF_JRA_1p5,CORE_RYF_JRA,CRUJRA,NULL general method that operates on the data. this is generally implemented in the data models but is set in the strdata method for @@ -2198,6 +2222,7 @@ COPYALL COPYALL COPYALL + CRUJRA @@ -2384,6 +2409,8 @@ nearest coszen nearest + coszen + nearest coszen nearest coszen From 126a55914a05fac804df73d8db8ccddf59177a59 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Thu, 8 Feb 2024 09:19:23 -0600 Subject: [PATCH 037/310] Updates surface dataset for r025 for 2010 --- components/elm/bld/namelist_files/namelist_defaults.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 7cc4b933aed..5389c45ff58 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -298,6 +298,8 @@ lnd/clm2/surfdata_map/surfdata_ne256pg2_simyr2010_c230207.nc lnd/clm2/surfdata_map/surfdata_ne1024pg2_simyr2010_c211021.nc lnd/clm2/surfdata_map/surfdata_ne1024np4_simyr2010_c220523.nc + +lnd/clm2/surfdata_map/surfdata_0.25x0.25_simyr2010_c240206_TOP.nc From 5419c2683975e0f044ea349e05b5aabc8a328f05 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Thu, 8 Feb 2024 09:19:55 -0600 Subject: [PATCH 038/310] Adds ne30pg2_r025_IcoswISC30E3r5 res --- cime_config/config_grids.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 9fe8abae330..f1178681910 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1396,6 +1396,16 @@ IcoswISC30E3r5 + + ne30np4.pg2 + r025 + IcoswISC30E3r5 + null + null + null + IcoswISC30E3r5 + + ne60np4 ne60np4 @@ -3492,6 +3502,14 @@ cpl/gridmaps/ne120pg2/map_r025_to_ne120pg2_traave.20240206.nc + + cpl/gridmaps/ne120pg2/map_ne30pg2_to_r025_traave.20240206.nc + cpl/gridmaps/ne120pg2/map_ne30pg2_to_r025_trfv2.20240206.nc + cpl/gridmaps/ne120pg2/map_ne30pg2_to_r025_esmfbilin.20240206.nc + cpl/gridmaps/ne120pg2/map_r025_to_ne30pg2_traave.20240206.nc + cpl/gridmaps/ne120pg2/map_r025_to_ne30pg2_traave.20240206.nc + + cpl/gridmaps/ne120np4/map_ne120np4_to_oRRS18to6v3_mono.20200702.nc cpl/gridmaps/ne120np4/map_ne120np4_to_oRRS18to6v3_mono.20200702.nc From 0882d2f253fafbe15123aef01e33af8e94689507 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 8 Feb 2024 11:19:58 -0800 Subject: [PATCH 039/310] small datm & mcmodel changes ; ERA5 still too slow --- cime_config/machines/cmake_macros/intel_pm-cpu.cmake | 2 +- .../data_comps/datm/cime_config/namelist_definition_datm.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cime_config/machines/cmake_macros/intel_pm-cpu.cmake b/cime_config/machines/cmake_macros/intel_pm-cpu.cmake index 0eab406627a..8eae9542d63 100644 --- a/cime_config/machines/cmake_macros/intel_pm-cpu.cmake +++ b/cime_config/machines/cmake_macros/intel_pm-cpu.cmake @@ -21,7 +21,7 @@ if (compile_threaded) endif() string(APPEND CMAKE_CXX_FLAGS_DEBUG " -O0 -g") string(APPEND CMAKE_CXX_FLAGS_RELEASE " -O2") -string(APPEND CMAKE_CXX_FLAGS " -fp-model=precise") # and manually add precise +string(APPEND CMAKE_CXX_FLAGS "-mcmodel=medium -dynamic -fp-model=precise") # and manually add precise #message(STATUS "ndk CXXFLAGS=${CXXFLAGS}") string(APPEND CMAKE_Fortran_FLAGS " -fp-model=consistent -fimf-use-svml") diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index 3c5377618a5..eb52cf73c84 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -2421,8 +2421,8 @@ coszen coszen upper - upper - upper + linear + linear coszen nearest nearest From a0e8e83e8505da9bf8ff13319c95cf8e17041c39 Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 8 Feb 2024 17:29:07 -0800 Subject: [PATCH 040/310] functional ERA5 datm --- .../machines/cmake_macros/intel_pm-cpu.cmake | 2 +- .../datm/cime_config/config_component.xml | 4 +-- .../cime_config/namelist_definition_datm.xml | 29 +------------------ 3 files changed, 3 insertions(+), 32 deletions(-) diff --git a/cime_config/machines/cmake_macros/intel_pm-cpu.cmake b/cime_config/machines/cmake_macros/intel_pm-cpu.cmake index 8eae9542d63..0eab406627a 100644 --- a/cime_config/machines/cmake_macros/intel_pm-cpu.cmake +++ b/cime_config/machines/cmake_macros/intel_pm-cpu.cmake @@ -21,7 +21,7 @@ if (compile_threaded) endif() string(APPEND CMAKE_CXX_FLAGS_DEBUG " -O0 -g") string(APPEND CMAKE_CXX_FLAGS_RELEASE " -O2") -string(APPEND CMAKE_CXX_FLAGS "-mcmodel=medium -dynamic -fp-model=precise") # and manually add precise +string(APPEND CMAKE_CXX_FLAGS " -fp-model=precise") # and manually add precise #message(STATUS "ndk CXXFLAGS=${CXXFLAGS}") string(APPEND CMAKE_Fortran_FLAGS " -fp-model=consistent -fimf-use-svml") diff --git a/components/data_comps/datm/cime_config/config_component.xml b/components/data_comps/datm/cime_config/config_component.xml index 1e03867dcf1..4c7d32413ac 100644 --- a/components/data_comps/datm/cime_config/config_component.xml +++ b/components/data_comps/datm/cime_config/config_component.xml @@ -15,7 +15,6 @@ QIAN with water isotopes CRUNCEP data set CLM CRU NCEP v7 data set - CRUJRA data set GSWP3v1 data set Fifth generation ECMWF reanalysis Fifth generation ECMWF reanalysis,6 hourly data @@ -46,7 +45,7 @@ char - CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ELMERA5,ELMERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR + CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ELMERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR CORE2_NYF run_component_datm env_run.xml @@ -66,7 +65,6 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). CORE_RYF8485_JRA CORE_RYF9091_JRA CORE_RYF0304_JRA - CRUJRA CLM_QIAN CLM_QIAN_WISO CLMCRUNCEP diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index eb52cf73c84..10c51a6bee1 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -223,7 +223,6 @@ CLM1PT.$ATM_GRID CLMCRUNCEP.Solar,CLMCRUNCEP.Precip,CLMCRUNCEP.TPQW CLMCRUNCEPv7.Solar,CLMCRUNCEPv7.Precip,CLMCRUNCEPv7.TPQW - CRUJRA.Solar,CRUJRA.Precip,CRUJRA.TPQW CLMGSWP3v1.Solar,CLMGSWP3v1.Precip,CLMGSWP3v1.TPQW ELMERA5.msdrswrf,ELMERA5.msdfswrf,ELMERA5.mcpr,ELMERA5.mlspr,ELMERA5.t2m,ELMERA5.sp,ELMERA5.d2m,ELMERA5.w10,ELMERA5.msdwlwrf ERA5_6HR.msdrswrf,ERA5_6HR.msdfswrf,ERA5_6HR.mcpr,ERA5_6HR.mlspr,ERA5_6HR.t2m,ERA5_6HR.sp,ERA5_6HR.d2m,ERA5_6HR.w10,ERA5_6HR.msdwlwrf @@ -257,7 +256,6 @@ null $DIN_LOC_ROOT/atm/datm7 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715 - $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 @@ -327,7 +325,6 @@ domain.T62.050609.nc domain.T62.050609.nc domain.lnd.360x720_cruncep.130305.nc - domain.crujra.0.5x0.5.c200728.nc domain.lnd.360x720.130305.nc domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.360x720_gswp3.0v1.c170606.nc @@ -500,9 +497,6 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/Solar6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/Precip6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.v7.c160715/TPHWL6Hrly - $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/Solar6Hrly - $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/Precip6Hrly - $DIN_LOC_ROOT_CLMFORC/atm_forcing.CRUJRA/TPHWL6Hrly $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Solar $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/Precip $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516/TPHWL @@ -602,9 +596,6 @@ clmforc.cruncep.V7.c2016.0.5d.Solr.%ym.nc clmforc.cruncep.V7.c2016.0.5d.Prec.%ym.nc clmforc.cruncep.V7.c2016.0.5d.TPQWL.%ym.nc - clmforc.CRUJRA.0.5d.Solr.%ym.nc - clmforc.CRUJRA.0.5d.Prec.%ym.nc - clmforc.CRUJRA.0.5d.TPQWL.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Solr.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.Prec.%ym.nc clmforc.GSWP3.c2011.0.5x0.5.TPQWL.%ym.nc @@ -1583,18 +1574,6 @@ QBOT shum PSRF pbot - - FSDS swdn - - - PRECTmms precn - - - TBOT tbot - WIND wind - QBOT shum - PSRF pbot - FSDS swdn @@ -1936,7 +1915,6 @@ $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN - $DATM_CLMNCEP_YR_ALIGN 1 1 1 @@ -1989,7 +1967,6 @@ $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START - $DATM_CLMNCEP_YR_START 1 2010 2010 @@ -2063,7 +2040,6 @@ $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END - $DATM_CLMNCEP_YR_END 1 2011 2011 @@ -2161,7 +2137,7 @@ char streams shr_strdata_nml - CLMNCEP,COPYALL,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,IAF_JRA_1p5,CORE_RYF_JRA,CRUJRA,NULL + CLMNCEP,COPYALL,CORE2_NYF,CORE2_IAF,CORE_IAF_JRA,IAF_JRA_1p5,CORE_RYF_JRA,NULL general method that operates on the data. this is generally implemented in the data models but is set in the strdata method for @@ -2222,7 +2198,6 @@ COPYALL COPYALL COPYALL - CRUJRA @@ -2409,8 +2384,6 @@ nearest coszen nearest - coszen - nearest coszen nearest coszen From 3f054ae96a222e802b392c527a4b560b08e9dbb7 Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Tue, 13 Feb 2024 13:35:04 -0800 Subject: [PATCH 041/310] modifications to get replay option to run --- components/eam/src/dynamics/se/se_iop_intr_mod.F90 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/eam/src/dynamics/se/se_iop_intr_mod.F90 b/components/eam/src/dynamics/se/se_iop_intr_mod.F90 index 02862980053..b77ef1540d4 100644 --- a/components/eam/src/dynamics/se/se_iop_intr_mod.F90 +++ b/components/eam/src/dynamics/se/se_iop_intr_mod.F90 @@ -56,7 +56,7 @@ subroutine iop_setinitial(elem) integer i, j, k, cix, ie, thelev integer inumliq, inumice, icldliq, icldice - if (.not. use_replay .and. get_nstep() .eq. 0 .and. par%dynproc) then + if (get_nstep() .eq. 0 .and. par%dynproc) then call cnst_get_ind('NUMLIQ', inumliq, abrtf=.false.) call cnst_get_ind('NUMICE', inumice, abrtf=.false.) call cnst_get_ind('CLDLIQ', icldliq) @@ -215,8 +215,7 @@ subroutine iop_setfield(elem,iop_update_phase1) integer i, j, k, ie do ie=1,nelemd - if (have_ps .and. use_replay .and. .not. iop_update_phase1) elem(ie)%state%ps_v(:,:,:) = psobs - if (have_ps .and. .not. use_replay) elem(ie)%state%ps_v(:,:,:) = psobs + if (have_ps) elem(ie)%state%ps_v(:,:,:) = psobs do i=1, PLEV ! If DP CRM mode do NOT write over dycore vertical velocity if ((have_omega .and. iop_update_phase1) .and. .not. dp_crm) elem(ie)%derived%omega_p(:,:,i)=wfld(i) ! set t to tobs at first From 6a393122d3ce920cde8727e5273c189bcb2f3321 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Tue, 20 Feb 2024 17:42:46 -0600 Subject: [PATCH 042/310] Additional support for compsets with active Greenland ice sheet. Increase default value for h2osno_max in many-layer snowpack model. Add missing code from MALI driver so that global and regional analysis members are called in simulations with dynamic ice sheets. --- components/elm/src/main/elm_varcon.F90 | 2 +- .../mpas-albany-landice/driver/glc_comp_mct.F | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/components/elm/src/main/elm_varcon.F90 b/components/elm/src/main/elm_varcon.F90 index 3a95fc05c52..d0cf834ddc1 100644 --- a/components/elm/src/main/elm_varcon.F90 +++ b/components/elm/src/main/elm_varcon.F90 @@ -248,7 +248,7 @@ subroutine elm_varcon_init() allocate( dzsoifl(1:nlevsoifl )) if (use_extrasnowlayers) then - h2osno_max = 10000._r8 + h2osno_max = 30000._r8 end if end subroutine elm_varcon_init diff --git a/components/mpas-albany-landice/driver/glc_comp_mct.F b/components/mpas-albany-landice/driver/glc_comp_mct.F index 957422fc859..1c7b63c084e 100644 --- a/components/mpas-albany-landice/driver/glc_comp_mct.F +++ b/components/mpas-albany-landice/driver/glc_comp_mct.F @@ -892,6 +892,19 @@ subroutine glc_run_mct( EClock, cdata_g, x2g_g, g2x_g)!{{{ ! call mpas_stream_mgr_reset_alarms(stream_manager, direction=MPAS_STREAM_INPUT, ierr=err_tmp) ! err = ior(err, err_tmp) + call mpas_stream_mgr_read(domain % streamManager, whence=MPAS_STREAM_LATEST_BEFORE, saveActualWhen = .true., ierr=err_tmp) + err = ior(err, err_tmp) + call mpas_stream_mgr_reset_alarms(domain % streamManager, direction=MPAS_STREAM_INPUT, ierr=err_tmp) + err = ior(err, err_tmp) + + ! call analysis driver compute, restart, write subroutines + ! (note: alarms and timers are handled by the analysis member code) + call li_analysis_compute(domain, err_tmp) + err = ior(err, err_tmp) + call li_analysis_restart(domain, err_tmp) + err = ior(err, err_tmp) + call li_analysis_write(domain, err_tmp) + err = ior(err, err_tmp) ! === ! === Write Output and/or Restart, if needed From d0b3e2c6fa94c9f4ad14054ca49ecabc0ddde7ed Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Tue, 20 Feb 2024 16:34:03 -0700 Subject: [PATCH 043/310] new variables to registry and streams --- components/mpas-ocean/cime_config/buildnml | 10 +++++ components/mpas-ocean/src/Registry.xml | 10 ++++- .../Registry_global_stats.xml | 42 +++++++++++++++++++ ...Registry_time_series_stats_monthly_max.xml | 2 + ...egistry_time_series_stats_monthly_mean.xml | 2 + ...Registry_time_series_stats_monthly_min.xml | 2 + 6 files changed, 67 insertions(+), 1 deletion(-) diff --git a/components/mpas-ocean/cime_config/buildnml b/components/mpas-ocean/cime_config/buildnml index a363c27883a..851820c786c 100755 --- a/components/mpas-ocean/cime_config/buildnml +++ b/components/mpas-ocean/cime_config/buildnml @@ -530,6 +530,8 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') + lines.append(' ') + lines.append(' ') lines.append(' ') lines.append(' ') if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']: @@ -807,6 +809,8 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') + lines.append(' ') + lines.append(' ') lines.append(' ') lines.append(' ') if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']: @@ -1227,6 +1231,8 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') + lines.append(' ') + lines.append(' ') lines.append(' ') lines.append(' ') lines.append(' ') @@ -1405,6 +1411,8 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') + lines.append(' ') + lines.append(' ') lines.append(' ') lines.append(' ') lines.append(' ') @@ -1467,6 +1475,8 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') + lines.append(' ') + lines.append(' ') lines.append(' ') lines.append(' ') lines.append(' ') diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index f8b56c083d4..d9cb0bf4f61 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -2291,6 +2291,10 @@ description="Salinity associated with accumulatedFrazilIceMass. Reset to zero at each coupling interval" packages="frazilIce" /> + + + @@ -157,6 +160,9 @@ + @@ -247,6 +253,9 @@ + @@ -256,6 +265,9 @@ + @@ -346,6 +358,9 @@ + @@ -355,6 +370,9 @@ + @@ -445,6 +463,9 @@ + @@ -454,6 +475,9 @@ + @@ -544,6 +568,9 @@ + @@ -553,6 +580,9 @@ + @@ -643,6 +673,9 @@ + @@ -652,6 +685,9 @@ + @@ -742,6 +778,9 @@ + @@ -751,6 +790,9 @@ + + + diff --git a/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_mean.xml b/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_mean.xml index 58ac7e95af4..2858e01961d 100644 --- a/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_mean.xml +++ b/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_mean.xml @@ -187,6 +187,8 @@ + + diff --git a/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_min.xml b/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_min.xml index 5ee051585d7..30121568ad4 100644 --- a/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_min.xml +++ b/components/mpas-ocean/src/analysis_members/Registry_time_series_stats_monthly_min.xml @@ -126,6 +126,8 @@ + + From e9e4b1cfa6733028f472635a4d712837d45feef4 Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Wed, 21 Feb 2024 12:38:50 -0700 Subject: [PATCH 044/310] flip frazil and ladice arrays --- components/mpas-ocean/driver/ocn_comp_mct.F | 7 ++----- .../mpas-ocean/src/mode_forward/mpas_ocn_forward_mode.F | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F index ec02127f7ca..1be8176fa3d 100644 --- a/components/mpas-ocean/driver/ocn_comp_mct.F +++ b/components/mpas-ocean/driver/ocn_comp_mct.F @@ -753,13 +753,12 @@ end subroutine xml_stream_get_attributes call mpas_pool_get_subpool(block_ptr % structs, 'scratch', scratchPool) call ocn_forcing_build_fraction_absorbed_array(meshPool, statePool, forcingPool, ierr, 1) + call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, ierr) call mpas_timer_start("land_ice_build_arrays", .false.) call ocn_surface_land_ice_fluxes_build_arrays(meshPool, forcingPool, scratchPool, & statePool, err=ierr) call mpas_timer_stop("land_ice_build_arrays") - call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, ierr) - block_ptr => block_ptr % next end do @@ -1095,7 +1094,7 @@ subroutine ocn_run_mct( EClock, cdata_o, x2o_o, o2x_o)!{{{ call mpas_pool_get_subpool(block_ptr % structs, 'scratch', scratchPool) call ocn_forcing_build_fraction_absorbed_array(meshPool, statePool, forcingPool, ierr, 1) - + call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, ierr) call mpas_timer_start("land_ice_build_arrays", .false.) call ocn_surface_land_ice_fluxes_build_arrays(meshPool, & forcingPool, scratchPool, statePool, ierr) @@ -1103,8 +1102,6 @@ subroutine ocn_run_mct( EClock, cdata_o, x2o_o, o2x_o)!{{{ call ocn_surface_land_ice_fluxes_accumulate_fluxes(meshPool, forcingPool, & statePool, dt, ierr) - call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, ierr) - call ocn_eddy_compute_mixed_layer_depth(statePool, forcingPool) if (config_use_GM .or. config_submesoscale_enable) then call ocn_eddy_compute_buoyancy_gradient() diff --git a/components/mpas-ocean/src/mode_forward/mpas_ocn_forward_mode.F b/components/mpas-ocean/src/mode_forward/mpas_ocn_forward_mode.F index af69a63e46c..daf0417a209 100644 --- a/components/mpas-ocean/src/mode_forward/mpas_ocn_forward_mode.F +++ b/components/mpas-ocean/src/mode_forward/mpas_ocn_forward_mode.F @@ -700,6 +700,7 @@ function ocn_forward_mode_run(domain) result(ierr)!{{{ call mpas_pool_get_subpool(block_ptr % structs, 'forcing', forcingPool) call mpas_pool_get_subpool(block_ptr % structs, 'scratch', scratchPool) call ocn_forcing_build_fraction_absorbed_array(meshPool, statePool, forcingPool, ierr, 1) + call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, err) call mpas_timer_start("land_ice_build_arrays") call ocn_surface_land_ice_fluxes_build_arrays(meshPool, & forcingPool, scratchPool, statePool, err) @@ -707,7 +708,6 @@ function ocn_forward_mode_run(domain) result(ierr)!{{{ call ocn_surface_land_ice_fluxes_accumulate_fluxes(meshPool, forcingPool, & statePool, dt, err) - call ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, statePool, err) call ocn_tidal_forcing_build_array(domain, meshPool, forcingPool, statePool, err) ! Compute normalGMBolusVelocity, relativeSlope and RediDiffVertCoef if respective flags are turned on From c31711cf33e50ce370a66c298a1c750ec3449a1f Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Wed, 21 Feb 2024 13:28:31 -0700 Subject: [PATCH 045/310] add global stats --- .../analysis_members/mpas_ocn_global_stats.F | 57 ++++++++++++++++++- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F b/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F index c21d1d4b5b5..bb8a593b15c 100644 --- a/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F +++ b/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F @@ -254,9 +254,9 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ real (kind=RKIND), dimension(:), pointer :: evaporationFlux, snowFlux real (kind=RKIND), dimension(:), pointer :: seaIceFreshWaterFlux, icebergFreshWaterFlux, riverRunoffFlux, iceRunoffFlux - real (kind=RKIND), dimension(:), pointer :: rainFlux, landIceFreshwaterFlux + real (kind=RKIND), dimension(:), pointer :: rainFlux, landIceFreshwaterFlux, landIceFreshwaterFluxTotal real (kind=RKIND), dimension(:), pointer :: accumulatedLandIceMass, accumulatedLandIceHeat, & - accumulatedLandIceFrazilMass + accumulatedLandIceFrazilMass, frazilIceFreshwaterFlux real (kind=RKIND), dimension(:,:), pointer :: frazilLayerThicknessTendency @@ -364,6 +364,7 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ call mpas_pool_get_array(forcingPool, 'rainFlux', rainFlux) call mpas_pool_get_array(forcingPool, 'frazilLayerThicknessTendency', frazilLayerThicknessTendency) call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFlux', landIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFluxTotal', landIceFreshwaterFluxTotal) call mpas_pool_get_array(forcingPool, 'landIceFloatingMask', landIceFloatingMask) call mpas_pool_get_array(tracersSurfaceFluxPool, 'activeTracersSurfaceFlux', activeTracersSurfaceFlux) @@ -376,6 +377,8 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ call mpas_pool_get_array(statePool, 'accumulatedLandIceMass', accumulatedLandIceMass, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceHeat', accumulatedLandIceHeat, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMass, 1) + call mpas_pool_get_array(statePool, 'frazilIceFreshwaterFlux', frazilIceFreshwaterFlux, 1) + allocate(areaEdge(1:nEdgesSolve)) areaEdge = dcEdge(1:nEdgesSolve)*dvEdge(1:nEdgesSolve) @@ -958,6 +961,21 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ maxes_tmp(variableIndex) = 0.0_RKIND end if + ! landIceFreshwaterFluxTotal + variableIndex = variableIndex + 1 + if ( associated(landIceFreshwaterFluxTotal) ) then + call ocn_compute_field_area_weighted_local_stats_surface(dminfo, nCellsSolve, & + landIceFloatingArea, & + landIceFreshwaterFluxTotal(1:nCellsSolve), sums_tmp(variableIndex), & + sumSquares_tmp(variableIndex), mins_tmp(variableIndex), & + maxes_tmp(variableIndex)) + else + sums_tmp(variableIndex) = 0.0_RKIND + sumSquares_tmp(variableIndex) = 0.0_RKIND + mins_tmp(variableIndex) = 0.0_RKIND + maxes_tmp(variableIndex) = 0.0_RKIND + end if + sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex) sumSquares(variableIndex) = sumSquares(variableIndex) + sumSquares_tmp(variableIndex) mins(variableIndex) = min(mins(variableIndex), mins_tmp(variableIndex)) @@ -1024,6 +1042,21 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ maxes_tmp(variableIndex) = 0.0_RKIND end if + ! frazilIceFreshwaterFlux + variableIndex = variableIndex + 1 + if (frazilIcePkgActive) then + call ocn_compute_field_area_weighted_local_stats_surface(dminfo, nCellsSolve, & + areaCell(1:nCellsSolve), & + frazilIceFreshwaterFlux(1:nCellsSolve), sums_tmp(variableIndex), & + sumSquares_tmp(variableIndex), mins_tmp(variableIndex), & + maxes_tmp(variableIndex)) + else + sums_tmp(variableIndex) = 0.0_RKIND + sumSquares_tmp(variableIndex) = 0.0_RKIND + mins_tmp(variableIndex) = 0.0_RKIND + maxes_tmp(variableIndex) = 0.0_RKIND + end if + sums(variableIndex) = sums(variableIndex) + sums_tmp(variableIndex) sumSquares(variableIndex) = sumSquares(variableIndex) + sumSquares_tmp(variableIndex) mins(variableIndex) = min(mins(variableIndex), mins_tmp(variableIndex)) @@ -1299,6 +1332,16 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ rms(variableIndex) = 0.0_RKIND end if + ! landIceFreshwaterFluxTotal + variableIndex = variableIndex + 1 + if (associated(landIceFreshwaterFluxTotal) .and. landIceFloatingAreaSum > 0.0_RKIND) then + averages(variableIndex) = sums(variableIndex)/(landIceFloatingAreaSum) + rms(variableIndex) = sqrt(sumSquares(variableIndex)/(landIceFloatingAreaSum)) + else + averages(variableIndex) = 0.0_RKIND + rms(variableIndex) = 0.0_RKIND + end if + ! continue accumulating fresh water inputs netFreshwaterInput = netFreshwaterInput + sums(variableIndex) * dt/rho_sw @@ -1332,6 +1375,16 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ rms(variableIndex) = 0.0_RKIND end if + ! frazilIceFreshwaterFlux + variableIndex = variableIndex + 1 + if (frazilIcePkgActive) then + averages(variableIndex) = sums(variableIndex)/(areaCellGlobal) + rms(variableIndex) = sqrt(sumSquares(variableIndex)/(areaCellGlobal)) + else + averages(variableIndex) = 0.0_RKIND + rms(variableIndex) = 0.0_RKIND + end if + ! calculate fresh water conservation check quantities absoluteFreshWaterConservation = totalVolumeChange - netFreshwaterInput if (abs(totalVolumeChange) < 1e-12_RKIND) then From 904c2c9ce6274103c85d2134fe2ef775d91f4af0 Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Thu, 22 Feb 2024 11:13:17 -0700 Subject: [PATCH 046/310] frazilIceFreshwaterFlux made forcing not state variable --- components/mpas-ocean/src/Registry.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index d9cb0bf4f61..921bf40459f 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -2291,10 +2291,6 @@ description="Salinity associated with accumulatedFrazilIceMass. Reset to zero at each coupling interval" packages="frazilIce" /> - + Date: Thu, 22 Feb 2024 11:19:33 -0700 Subject: [PATCH 047/310] add frazil flux accounting --- components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F index 16c22398684..dd4d4f1edaa 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F @@ -380,6 +380,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP real (kind=RKIND), pointer, dimension(:) :: accumulatedFrazilIceSalinityOld real (kind=RKIND), pointer, dimension(:) :: accumulatedLandIceFrazilMassNew real (kind=RKIND), pointer, dimension(:) :: accumulatedLandIceFrazilMassOld + real (kind=RKIND), pointer, dimension(:) :: frazilIceFreshwaterFlux real (kind=RKIND), pointer, dimension(:) :: ssh real (kind=RKIND), pointer, dimension(:,:) :: layerThickness real (kind=RKIND), pointer, dimension(:,:,:) :: activeTracers @@ -436,6 +437,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP call mpas_pool_get_array(forcingPool, 'frazilSurfacePressure', frazilSurfacePressure) call mpas_pool_get_array(forcingPool, 'landIceMask', landIceMask) call mpas_pool_get_array(forcingPool, 'landIceFloatingMask', landIceFloatingMask) + call mpas_pool_get_array(forcingPool, 'frazilIceFreshwaterFlux', frazilIceFreshwaterFlux) ! get time step in units of seconds timeStep = mpas_get_clock_timestep(domain % clock, ierr=err) @@ -607,6 +609,8 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP enddo ! do k=kBottom,minLevelCell,-1 + ! frazilIceFreshwaterFlux forms part of the landIceFreshwaterFluxTotal computed in surface land ice fluxes + frazilIceFreshwaterFlux(iCell) = (sumNewFrazilIceThickness * config_frazil_ice_density) / dt ! accumulate frazil mass to column total ! note: the accumulatedFrazilIceMass (at both time levels) is reset to zero after being sent to the coupler accumulatedFrazilIceMassNew(iCell) = accumulatedFrazilIceMassOld(iCell) + sumNewFrazilIceThickness & From fdea875d8ff721e2dcaff3f95b8472ce40668f30 Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Thu, 22 Feb 2024 11:27:15 -0700 Subject: [PATCH 048/310] edit land ice fluxes, add total --- .../shared/mpas_ocn_surface_land_ice_fluxes.F | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_surface_land_ice_fluxes.F b/components/mpas-ocean/src/shared/mpas_ocn_surface_land_ice_fluxes.F index 69c60c79ca5..c249f202757 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_surface_land_ice_fluxes.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_surface_land_ice_fluxes.F @@ -468,6 +468,8 @@ subroutine ocn_surface_land_ice_fluxes_build_arrays(meshPool, & landIceFreshwaterFlux, & landIceHeatFlux, heatFluxToLandIce + real (kind=RKIND), dimension(:), pointer :: frazilIceFreshwaterFlux, landIceFreshwaterFluxTotal + integer, dimension(:), pointer :: landIceFloatingMask real (kind=RKIND), dimension(:,:), pointer :: & @@ -505,6 +507,9 @@ subroutine ocn_surface_land_ice_fluxes_build_arrays(meshPool, & call mpas_pool_get_array(forcingPool, 'landIceHeatFlux', landIceHeatFlux) call mpas_pool_get_array(forcingPool, 'heatFluxToLandIce', heatFluxToLandIce) + call mpas_pool_get_array(forcingPool, 'frazilIceFreshwaterFlux', frazilIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFluxTotal', landIceFreshwaterFluxTotal) + call mpas_pool_get_array(forcingPool, 'landIceInterfaceTracers', landIceInterfaceTracers) call mpas_pool_get_dimension(forcingPool, & 'index_landIceInterfaceTemperature', & @@ -650,6 +655,17 @@ subroutine ocn_surface_land_ice_fluxes_build_arrays(meshPool, & endif ! jenkinsOn or hollandJenkinsOn + ! Add frazil and interface melt/freeze to get total fresh water flux + if ( associated(frazilIceFreshwaterFlux) ) then + do iCell = 1, nCells + landIceFreshwaterFluxTotal(iCell) = landIceFreshwaterFlux(iCell) + landIceFloatingMask(iCell)*frazilIceFreshwaterFlux(iCell) + end do + else + do iCell = 1, nCells + landIceFreshwaterFluxTotal(iCell) = landIceFreshwaterFlux(iCell) + end do + end if + if(useHollandJenkinsAdvDiff) then deallocate(freezeInterfaceSalinity, & freezeInterfaceTemperature, & From ee322ed7bdb072c187dffc570ade1dde13b91d84 Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Thu, 22 Feb 2024 12:09:04 -0700 Subject: [PATCH 049/310] correct pool type in global stats --- .../mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F b/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F index bb8a593b15c..203665999a8 100644 --- a/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F +++ b/components/mpas-ocean/src/analysis_members/mpas_ocn_global_stats.F @@ -365,6 +365,7 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ call mpas_pool_get_array(forcingPool, 'frazilLayerThicknessTendency', frazilLayerThicknessTendency) call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFlux', landIceFreshwaterFlux) call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFluxTotal', landIceFreshwaterFluxTotal) + call mpas_pool_get_array(forcingPool, 'frazilIceFreshwaterFlux', frazilIceFreshwaterFlux) call mpas_pool_get_array(forcingPool, 'landIceFloatingMask', landIceFloatingMask) call mpas_pool_get_array(tracersSurfaceFluxPool, 'activeTracersSurfaceFlux', activeTracersSurfaceFlux) @@ -377,7 +378,6 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ call mpas_pool_get_array(statePool, 'accumulatedLandIceMass', accumulatedLandIceMass, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceHeat', accumulatedLandIceHeat, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMass, 1) - call mpas_pool_get_array(statePool, 'frazilIceFreshwaterFlux', frazilIceFreshwaterFlux, 1) allocate(areaEdge(1:nEdgesSolve)) @@ -1044,7 +1044,7 @@ subroutine ocn_compute_global_stats(domain, timeLevel, err)!{{{ ! frazilIceFreshwaterFlux variableIndex = variableIndex + 1 - if (frazilIcePkgActive) then + if ( associated(frazilIceFreshwaterFlux) ) then call ocn_compute_field_area_weighted_local_stats_surface(dminfo, nCellsSolve, & areaCell(1:nCellsSolve), & frazilIceFreshwaterFlux(1:nCellsSolve), sums_tmp(variableIndex), & From 8eca6daa97067799a5cd01f613a8ebde1930a12b Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Fri, 23 Feb 2024 10:50:14 -0700 Subject: [PATCH 050/310] change sign so that frazilIceFreshwaterFlux leaving the ocean is negative --- components/mpas-ocean/src/Registry.xml | 2 +- components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index 921bf40459f..ba930e3a348 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -3834,7 +3834,7 @@ packages="frazilIce" /> diff --git a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F index dd4d4f1edaa..0f06a8d39c1 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F @@ -610,7 +610,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP enddo ! do k=kBottom,minLevelCell,-1 ! frazilIceFreshwaterFlux forms part of the landIceFreshwaterFluxTotal computed in surface land ice fluxes - frazilIceFreshwaterFlux(iCell) = (sumNewFrazilIceThickness * config_frazil_ice_density) / dt + frazilIceFreshwaterFlux(iCell) = - (sumNewFrazilIceThickness * config_frazil_ice_density) / dt ! accumulate frazil mass to column total ! note: the accumulatedFrazilIceMass (at both time levels) is reset to zero after being sent to the coupler accumulatedFrazilIceMassNew(iCell) = accumulatedFrazilIceMassOld(iCell) + sumNewFrazilIceThickness & From 48bff80650c4f5f645f0a34b97ea1fae77b7fbd7 Mon Sep 17 00:00:00 2001 From: Mathew Maltrud Date: Mon, 26 Feb 2024 11:28:29 -0600 Subject: [PATCH 051/310] add distinct passive tracer background vert diffusivity --- components/mpas-ocean/bld/build-namelist | 2 ++ .../namelist_defaults_mpaso.xml | 2 ++ .../namelist_definition_mpaso.xml | 16 ++++++++++++++++ components/mpas-ocean/src/Registry.xml | 12 ++++++++++++ .../shared/mpas_ocn_diagnostics_variables.F | 6 ++++++ .../mpas-ocean/src/shared/mpas_ocn_vmix.F | 19 ++++++++++++++++++- 6 files changed, 56 insertions(+), 1 deletion(-) diff --git a/components/mpas-ocean/bld/build-namelist b/components/mpas-ocean/bld/build-namelist index 0b8d3c782fa..238af2be2ab 100755 --- a/components/mpas-ocean/bld/build-namelist +++ b/components/mpas-ocean/bld/build-namelist @@ -616,6 +616,8 @@ add_default($nl, 'config_use_cvmix'); add_default($nl, 'config_cvmix_prandtl_number'); add_default($nl, 'config_cvmix_background_scheme'); add_default($nl, 'config_cvmix_background_diffusion'); +add_default($nl, 'config_cvmix_background_diffusion_passive_enable'); +add_default($nl, 'config_cvmix_background_diffusion_passive'); add_default($nl, 'config_cvmix_background_viscosity'); add_default($nl, 'config_cvmix_BryanLewis_bl1'); add_default($nl, 'config_cvmix_BryanLewis_bl2'); diff --git a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml index 4069eb144cf..d7e0485168c 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml @@ -229,6 +229,8 @@ 1.0 'constant' 0.0 +.false. +0.0 1.0e-4 8.0e-5 1.05E-4 diff --git a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml index 01456cd6583..6b1026ea4d1 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml @@ -747,6 +747,22 @@ Valid values: Any positive real value. Default: Defined in namelist_defaults.xml + +Enable different background vertical diffusion value for passive tracer quantities + +Valid values: .true. or .false. +Default: Defined in namelist_defaults.xml + + + +Background vertical diffusion applied to passive tracer quantities if enabled + +Valid values: Any positive real value. +Default: Defined in namelist_defaults.xml + + Background vertical viscosity applied to horizontal velocity diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index f8b56c083d4..5524651cc18 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -477,6 +477,14 @@ description="Background vertical diffusion applied to tracer quantities" possible_values="Any positive real value." /> + + + Date: Mon, 26 Feb 2024 11:46:57 -0600 Subject: [PATCH 052/310] define new GMPAS, GPMAS, ECO compsets with JRA --- cime_config/config_grids.xml | 42 +++++++++++++ .../cime_config/config_compsets.xml | 60 +++++++++++++++++++ .../cime_config/config_component_e3sm.xml | 1 + .../cime_config/config_component_e3sm.xml | 1 + 4 files changed, 104 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 1894ef66fa5..6015673350f 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -489,6 +489,36 @@ WC14to60E2r3 + + TL319 + r05 + WC14to60E2r3 + r05 + null + null + WC14to60E2r3 + + + + TL319 + r05 + EC30to60E2r2 + r05 + null + null + EC30to60E2r2 + + + + TL319 + r05 + ARRM10to60E2r1 + r05 + null + null + ARRM10to60E2r1 + + TL319 TL319 @@ -4108,6 +4138,13 @@ cpl/gridmaps/oRRS18to6v3/map_oRRS18to6v3_to_TL319_aave.220124.nc + + cpl/gridmaps/TL319/map_TL319_to_r05_traave.20240212.nc + cpl/gridmaps/TL319/map_TL319_to_r05_trbilin.20240212.nc + cpl/gridmaps/TL319/map_r05_to_TL319_traave.20240212.nc + cpl/gridmaps/TL319/map_r05_to_TL319_traave.20240212.nc + + cpl/cpl6/map_T31_to_gx3v7_aave_da_090903.nc cpl/cpl6/map_T31_to_gx3v7_patch_090903.nc @@ -4222,6 +4259,11 @@ lnd/clm2/mappingdata/maps/ne120np4/map_ne120np4_to_0.125_nomask_aave.160613.nc + + cpl/gridmaps/TL319/map_TL319_to_r05_traave.20240212.nc + cpl/gridmaps/TL319/map_TL319_to_r05_trbilin.20240212.nc + + diff --git a/components/mpas-ocean/cime_config/config_compsets.xml b/components/mpas-ocean/cime_config/config_compsets.xml index b15f9111be4..491b45244ed 100644 --- a/components/mpas-ocean/cime_config/config_compsets.xml +++ b/components/mpas-ocean/cime_config/config_compsets.xml @@ -62,6 +62,66 @@ 2000_DATM%JRA-1p5_SLND_MPASSI_MPASO%DATMFORCED_DROF%JRA-1p5_SGLC_SWAV + + GMPAS-OECO-JRA + 2000_DATM%JRA_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA_SGLC_SWAV + + + + GMPAS-OECO-JRA1p4 + 2000_DATM%JRA-1p4-2018_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA-1p4-2018_SGLC_SWAV + + + + GMPAS-OECO-JRA1p5 + 2000_DATM%JRA-1p5_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA-1p5_SGLC_SWAV + + + + GMPAS-OIECO-JRA + 2000_DATM%JRA_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA_SGLC_SWAV + + + + GMPAS-OIECO-JRA1p4 + 2000_DATM%JRA-1p4-2018_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA-1p4-2018_SGLC_SWAV + + + + GMPAS-OIECO-JRA1p5 + 2000_DATM%JRA-1p5_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA-1p5_SGLC_SWAV + + + + GPMPAS-OECO-JRA + 2000_DATM%JRA_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV + + + + GPMPAS-OECO-JRA1p4 + 2000_DATM%JRA-1p4-2018_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV + + + + GPMPAS-OECO-JRA1p5 + 2000_DATM%JRA-1p5_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV + + + + GPMPAS-OIECO-JRA + 2000_DATM%JRA_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV + + + + GPMPAS-OIECO-JRA1p4 + 2000_DATM%JRA-1p4-2018_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV + + + + GPMPAS-OIECO-JRA1p5 + 2000_DATM%JRA-1p5_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV + + GMPAS-JRA1p5-DIB-PISMF 2000_DATM%JRA-1p5_SLND_MPASSI%DIB_MPASO%IBPISMFDATMFORCED_DROF%JRA-1p5-AIS0ROF_SGLC_SWAV diff --git a/driver-mct/cime_config/config_component_e3sm.xml b/driver-mct/cime_config/config_component_e3sm.xml index 5d582b41b43..6f66a60759a 100755 --- a/driver-mct/cime_config/config_component_e3sm.xml +++ b/driver-mct/cime_config/config_component_e3sm.xml @@ -265,6 +265,7 @@ CO2A CO2A CO2A + CO2A CO2A_OI CO2A_OI CO2C diff --git a/driver-moab/cime_config/config_component_e3sm.xml b/driver-moab/cime_config/config_component_e3sm.xml index dd7a5ddb6c1..65c1b1a9e64 100644 --- a/driver-moab/cime_config/config_component_e3sm.xml +++ b/driver-moab/cime_config/config_component_e3sm.xml @@ -265,6 +265,7 @@ CO2A CO2A CO2A + CO2A CO2A_OI CO2A_OI CO2C From 58b5b79d3a7354a4a2744a44924f4b8bb078dd6b Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Wed, 28 Feb 2024 09:02:10 -0600 Subject: [PATCH 053/310] Add ocean non bfb test suite def --- cime_config/tests.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cime_config/tests.py b/cime_config/tests.py index 28462bec77c..d8558be1cab 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -228,6 +228,13 @@ ) }, + #ocean non bit-for-bit test + "e3sm_ocn_nbfb": { + "tests": ( + "MVKO_PS.T62_oQU240.GMPAS-NYF", + ) + }, + "e3sm_ocnice_stealth_features" : { "tests" : ( "SMS_D_Ld1.T62_oQU240wLI.GMPAS-IAF-PISMF.mpaso-impl_top_drag", From dcb1ad800a1cb5978c9f33e993d45f8b5bdf384d Mon Sep 17 00:00:00 2001 From: Irena Vankova Date: Wed, 28 Feb 2024 11:05:46 -0700 Subject: [PATCH 054/310] minimize variables in highFrequencyOutput --- components/mpas-ocean/cime_config/buildnml | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/mpas-ocean/cime_config/buildnml b/components/mpas-ocean/cime_config/buildnml index 851820c786c..7f6df71142e 100755 --- a/components/mpas-ocean/cime_config/buildnml +++ b/components/mpas-ocean/cime_config/buildnml @@ -808,9 +808,7 @@ def buildnml(case, caseroot, compname): lines.append(' ') lines.append(' ') lines.append(' ') - lines.append(' ') lines.append(' ') - lines.append(' ') lines.append(' ') lines.append(' ') if ocn_bgc in ['eco_only', 'eco_and_dms', 'eco_and_macromolecules', 'eco_and_dms_and_macromolecules']: From a1cdc62dd08031be1c146482bda492f6584bbcbd Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Thu, 29 Feb 2024 10:32:36 -0600 Subject: [PATCH 055/310] Add combined atm/ocn test suite --- cime_config/tests.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index d8558be1cab..885f47b79ab 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -232,7 +232,11 @@ "e3sm_ocn_nbfb": { "tests": ( "MVKO_PS.T62_oQU240.GMPAS-NYF", - ) + ) + }, + + "e3sm_nbfb": { + "inherit": ("e3sm_atm_nbfb", "e3sm_ocn_nbfb") }, "e3sm_ocnice_stealth_features" : { From 4c099eecf2326942e64d0d203b7ebcb4f020aabe Mon Sep 17 00:00:00 2001 From: Bryce Harrop Date: Fri, 1 Mar 2024 17:57:35 -0800 Subject: [PATCH 056/310] Fixes floating invalid in co2_diagnostics module from poorly initialized fields --- components/eam/src/physics/cam/co2_diagnostics.F90 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/components/eam/src/physics/cam/co2_diagnostics.F90 b/components/eam/src/physics/cam/co2_diagnostics.F90 index c24c908a524..81fdb3e9d76 100644 --- a/components/eam/src/physics/cam/co2_diagnostics.F90 +++ b/components/eam/src/physics/cam/co2_diagnostics.F90 @@ -433,16 +433,24 @@ subroutine print_global_carbon_diags(state, dtime, nstep) ( co2_print_diags_monthly .and. is_end_curr_month() ) .or. & ( co2_print_diags_total .and. is_last_step() ) ) then call gmean(tc, tc_glob, c_num_var) + else + tc_glob(:) = 1.e36 end if if ( co2_print_diags_timestep) then call gmean(flux_ts, flux_ts_glob, f_ts_num_var) + else + flux_ts_glob(:) = 0._r8 end if if ( co2_print_diags_monthly .and. is_end_curr_month() ) then call gmean(flux_mon, flux_mon_glob, f_mon_num_var) + else + flux_mon_glob(:) = 0._r8 end if if ( co2_print_diags_total .and. is_last_step() ) then call gmean(flux_run, flux_run_glob, f_run_num_var) + else + flux_run_glob(:) = 0._r8 end if ! assign global means to readable variables From ea3ec34004f2e5638de36f0b7a591e66e0f0cda0 Mon Sep 17 00:00:00 2001 From: Ryan Knox Date: Mon, 4 Mar 2024 11:12:25 -0500 Subject: [PATCH 057/310] adding fates radiation subfolder --- components/elm/bld/configure | 1 + 1 file changed, 1 insertion(+) diff --git a/components/elm/bld/configure b/components/elm/bld/configure index 01cc15f9d20..e0a13f30be7 100755 --- a/components/elm/bld/configure +++ b/components/elm/bld/configure @@ -477,6 +477,7 @@ sub write_filepath_cesmbld "external_models/fates/biogeochem", "external_models/fates/fire", "external_models/fates/parteh", + "external_models/fates/radiation", "external_models/mpp/src/mpp/dtypes", "external_models/mpp/src/mpp/thermal", "external_models/mpp/src/mpp/util", From 54ca44f917bcce0c850e2d907ff3538f1298cd2b Mon Sep 17 00:00:00 2001 From: Ryan Knox Date: Mon, 4 Mar 2024 11:18:12 -0500 Subject: [PATCH 058/310] Changing fates radiation calls to be method agnostic --- components/elm/src/main/elmfates_interfaceMod.F90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/components/elm/src/main/elmfates_interfaceMod.F90 b/components/elm/src/main/elmfates_interfaceMod.F90 index edcdd01f1ed..d12704ee1e2 100644 --- a/components/elm/src/main/elmfates_interfaceMod.F90 +++ b/components/elm/src/main/elmfates_interfaceMod.F90 @@ -149,7 +149,8 @@ module ELMFatesInterfaceMod use EDInitMod , only : init_patches use EDInitMod , only : set_site_properties use EDPftVarcon , only : EDpftvarcon_inst - use EDSurfaceRadiationMod , only : ED_SunShadeFracs, ED_Norman_Radiation + use FatesRadiationDriveMod, only : FatesSunShadeFracs + use FatesRadiationDriveMod, only : FatesNormalizedCanopyRadiation use EDBtranMod , only : btran_ed, & get_active_suction_layers use EDCanopyStructureMod , only : canopy_summarization, update_hlm_dynamics @@ -2055,7 +2056,7 @@ subroutine wrap_sunfrac(this,bounds_clump,top_af_inst,canopystate_inst) ! as well as total patch sun/shade fraction output boundary condition ! ------------------------------------------------------------------------------- - call ED_SunShadeFracs(this%fates(nc)%nsites, & + call FatesSunShadeFracs(this%fates(nc)%nsites, & this%fates(nc)%sites, & this%fates(nc)%bc_in, & this%fates(nc)%bc_out) @@ -2563,7 +2564,7 @@ subroutine wrap_canopy_radiation(this, bounds_clump, & end do end do - call ED_Norman_Radiation(this%fates(nc)%nsites, & + call FatesNormalizedCanopyRadiation(this%fates(nc)%nsites, & this%fates(nc)%sites, & this%fates(nc)%bc_in, & this%fates(nc)%bc_out) From 9b1d3ba67f8b5929abc5bde3c658f15cf9041138 Mon Sep 17 00:00:00 2001 From: Ryan Knox Date: Mon, 4 Mar 2024 11:21:22 -0500 Subject: [PATCH 059/310] setting fates submodule pointer to sci.1.72.0_api.33.0.0 --- components/elm/src/external_models/fates | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/src/external_models/fates b/components/elm/src/external_models/fates index 698a8df848e..42d804ba54d 160000 --- a/components/elm/src/external_models/fates +++ b/components/elm/src/external_models/fates @@ -1 +1 @@ -Subproject commit 698a8df848ecdb81aa72fee6c86be2c41b2545e9 +Subproject commit 42d804ba54d0cf013a9737018ff9920e0c9808ea From 04b755de79bca03ca16473f9d0d7a23ce24b09aa Mon Sep 17 00:00:00 2001 From: Aaron Donahue Date: Mon, 4 Mar 2024 16:54:17 -0800 Subject: [PATCH 060/310] This update reflects the new directory structure on LC for storing input. The switch from climdat to e3sm in the dir name. --- cime_config/machines/config_machines.xml | 97 ++----------------- .../eamxx/cmake/machine-files/lassen.cmake | 9 -- .../cmake/machine-files/quartz-intel.cmake | 2 +- .../eamxx/cmake/machine-files/quartz.cmake | 2 +- .../cmake/machine-files/ruby-intel.cmake | 2 +- .../eamxx/cmake/machine-files/ruby.cmake | 2 +- .../eamxx/cmake/machine-files/syrah.cmake | 13 --- .../eamxx/data/scream_default_remap.yaml | 2 +- components/eamxx/scripts/machines_specs.py | 8 +- 9 files changed, 19 insertions(+), 118 deletions(-) delete mode 100644 components/eamxx/cmake/machine-files/lassen.cmake delete mode 100644 components/eamxx/cmake/machine-files/syrah.cmake diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index f3aa5cfa614..af4b689a90d 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2897,83 +2897,6 @@ - - LLNL Linux Cluster, Linux, 4 V100 GPUs/node, 44 IBM P9 cpu cores/node - lassen.* - LINUX - gnugpu - spectrum-mpi - cbronze - /usr/workspace/$USER/e3sm_scratch - /usr/gdata/climdat/ccsm3data/inputdata - /usr/gdata/climdat/ccsm3data/inputdata/atm/datm7 - /usr/workspace/$USER/archive/$CASE - /usr/gdata/climdat/baselines/$COMPILER - 16 - lsf - donahue5 -at- llnl.gov - 40 - 40 - - - - - jsrun - - -X 1 - $SHELL{if [ {{ total_tasks }} -eq 1 ];then echo --nrs 1 --rs_per_host 1;else echo --nrs $NUM_RS --rs_per_host $RS_PER_NODE;fi} - --tasks_per_rs $SHELL{echo "({{ tasks_per_node }} + $RS_PER_NODE - 1)/$RS_PER_NODE"|bc} - -d plane:$SHELL{echo "({{ tasks_per_node }} + $RS_PER_NODE - 1)/$RS_PER_NODE"|bc} - --cpu_per_rs $ENV{CPU_PER_RS} - --gpu_per_rs $ENV{GPU_PER_RS} - --bind packed:smt:$ENV{OMP_NUM_THREADS} - --latency_priority $ENV{LTC_PRT} - --stdio_mode prepended - $ENV{JSRUN_THREAD_VARS} - $ENV{SMPIARGS} - - - - /usr/share/lmod/lmod/init/env_modules_python.py - /usr/share/lmod/lmod/init/perl - /usr/share/lmod/lmod/init/sh - /usr/share/lmod/lmod/init/csh - module - module - /usr/share/lmod/lmod/libexec/lmod python - /usr/share/lmod/lmod/libexec/lmod perl - - - git - gcc/8.3.1 - cuda/11.8.0 - cmake/3.16.8 - spectrum-mpi - python/3.7.2 - - - /p/gpfs1/$USER/e3sm_scratch/$CASE/run - $CIME_OUTPUT_ROOT/$CASE/bld - - - - - -E OMP_NUM_THREADS=$ENV{OMP_NUM_THREADS} -E OMP_PROC_BIND=spread -E OMP_PLACES=threads -E OMP_STACKSIZE=256M - - - y - /usr/gdata/climdat/netcdf/bin:$ENV{PATH} - /usr/gdata/climdat/netcdf/lib:$ENV{LD_LIBRARY_PATH} - /usr/gdata/climdat/netcdf - 2 - 20 - 2 - gpu-cpu - $SHELL{echo "2*((`./xmlquery --value TOTAL_TASKS` + `./xmlquery --value TASKS_PER_NODE` - 1)/`./xmlquery --value TASKS_PER_NODE`)"|bc} - --smpiargs="-gpu" - - - LLNL Linux Cluster, Linux (pgi), 56 pes/node, batch system is Slurm LINUX @@ -2981,11 +2904,11 @@ mpich cbronze /p/lustre2/$USER/e3sm_scratch/ruby - /usr/gdata/climdat/ccsm3data/inputdata - /usr/gdata/climdat/ccsm3data/inputdata/atm/datm7 + /usr/gdata/e3sm/ccsm3data/inputdata + /usr/gdata/e3sm/ccsm3data/inputdata/atm/datm7 /p/lustre2/$USER/archive/$CASE /p/lustre2/$USER/ccsm_baselines/$COMPILER - /usr/gdata/climdat/tools/cprnc + /usr/gdata/e3sm/tools/cprnc 8 lc_slurm donahue5 -at- llnl.gov @@ -3013,7 +2936,7 @@ intel-classic/2021.6.0-magic mvapich2/2.3.7 cmake/3.19.2 - /usr/gdata/climdat/install/quartz/modulefiles + /usr/gdata/e3sm/install/quartz/modulefiles hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 @@ -3024,7 +2947,7 @@ $CIME_OUTPUT_ROOT/$CASE/run $CIME_OUTPUT_ROOT/$CASE/bld - /usr/gdata/climdat/install/quartz/netcdf-fortran/ + /usr/gdata/e3sm/install/quartz/netcdf-fortran/ /usr/tce/packages/parallel-netcdf/parallel-netcdf-1.12.3-mvapich2-2.3.7-intel-classic-2021.6.0 @@ -3036,11 +2959,11 @@ mpich cbronze /p/lustre2/$USER/e3sm_scratch/quartz - /usr/gdata/climdat/ccsm3data/inputdata - /usr/gdata/climdat/ccsm3data/inputdata/atm/datm7 + /usr/gdata/e3sm/ccsm3data/inputdata + /usr/gdata/e3sm/ccsm3data/inputdata/atm/datm7 /p/lustre2/$USER/archive/$CASE /p/lustre2/$USER/ccsm_baselines/$COMPILER - /usr/gdata/climdat/tools/cprnc + /usr/gdata/e3sm/tools/cprnc 8 lc_slurm donahue5 -at- llnl.gov @@ -3068,7 +2991,7 @@ intel-classic/2021.6.0-magic mvapich2/2.3.7 cmake/3.19.2 - /usr/gdata/climdat/install/quartz/modulefiles + /usr/gdata/e3sm/install/quartz/modulefiles hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 @@ -3079,7 +3002,7 @@ $CIME_OUTPUT_ROOT/$CASE/run $CIME_OUTPUT_ROOT/$CASE/bld - /usr/gdata/climdat/install/quartz/netcdf-fortran/ + /usr/gdata/e3sm/install/quartz/netcdf-fortran/ /usr/tce/packages/parallel-netcdf/parallel-netcdf-1.12.3-mvapich2-2.3.7-intel-classic-2021.6.0 diff --git a/components/eamxx/cmake/machine-files/lassen.cmake b/components/eamxx/cmake/machine-files/lassen.cmake deleted file mode 100644 index 36b69c7f025..00000000000 --- a/components/eamxx/cmake/machine-files/lassen.cmake +++ /dev/null @@ -1,9 +0,0 @@ -include(${CMAKE_CURRENT_LIST_DIR}/common.cmake) -common_setup() - -set(NetCDF_PATH /usr/gdata/climdat/netcdf CACHE STRING "") -set(NetCDF_Fortran_PATH /usr/gdata/climdat/netcdf CACHE STRING "") -set(LAPACK_LIBRARIES /usr/lib64/liblapack.so CACHE STRING "") -set(CMAKE_CXX_FLAGS "-DTHRUST_IGNORE_CUB_VERSION_CHECK" CACHE STRING "" FORCE) - -set(SCREAM_INPUT_ROOT "/usr/gdata/climdat/ccsm3data/inputdata/" CACHE STRING "") diff --git a/components/eamxx/cmake/machine-files/quartz-intel.cmake b/components/eamxx/cmake/machine-files/quartz-intel.cmake index 753c782702d..defd8cbb2d3 100644 --- a/components/eamxx/cmake/machine-files/quartz-intel.cmake +++ b/components/eamxx/cmake/machine-files/quartz-intel.cmake @@ -4,4 +4,4 @@ set(PYTHON_EXECUTABLE "/usr/tce/packages/python/python-3.9.12/bin/python3" CACHE set(PYTHON_LIBRARIES "/usr/lib64/libpython3.9.so.1.0" CACHE STRING "" FORCE) option (SCREAM_ENABLE_ML_CORRECTION "Whether to enable ML correction parametrization" ON) set(HDF5_DISABLE_VERSION_CHECK 1 CACHE STRING "" FORCE) -execute_process(COMMAND source /usr/WS1/climdat/python_venv/3.9.2/screamML/bin/activate) +execute_process(COMMAND source /usr/WS1/e3sm/python_venv/3.9.2/screamML/bin/activate) diff --git a/components/eamxx/cmake/machine-files/quartz.cmake b/components/eamxx/cmake/machine-files/quartz.cmake index ee9a3dcbffd..e4b4fcbd8a5 100644 --- a/components/eamxx/cmake/machine-files/quartz.cmake +++ b/components/eamxx/cmake/machine-files/quartz.cmake @@ -16,4 +16,4 @@ elseif ("${COMPILER}" STREQUAL "gnu") set(CMAKE_EXE_LINKER_FLAGS "-L/usr/tce/packages/gcc/gcc-8.3.1/rh/lib/gcc/x86_64-redhat-linux/8/" CACHE STRING "" FORCE) endif() -set(SCREAM_INPUT_ROOT "/usr/gdata/climdat/ccsm3data/inputdata" CACHE STRING "") +set(SCREAM_INPUT_ROOT "/usr/gdata/e3sm/ccsm3data/inputdata" CACHE STRING "") diff --git a/components/eamxx/cmake/machine-files/ruby-intel.cmake b/components/eamxx/cmake/machine-files/ruby-intel.cmake index 63fff478fda..9c6318da495 100644 --- a/components/eamxx/cmake/machine-files/ruby-intel.cmake +++ b/components/eamxx/cmake/machine-files/ruby-intel.cmake @@ -4,4 +4,4 @@ set(PYTHON_EXECUTABLE "/usr/tce/packages/python/python-3.9.12/bin/python3" CACHE set(PYTHON_LIBRARIES "/usr/lib64/libpython3.9.so.1.0" CACHE STRING "" FORCE) option (SCREAM_ENABLE_ML_CORRECTION "Whether to enable ML correction parametrization" ON) set(HDF5_DISABLE_VERSION_CHECK 1 CACHE STRING "" FORCE) -execute_process(COMMAND source /usr/WS1/climdat/python_venv/3.9.2/screamML/bin/activate) +execute_process(COMMAND source /usr/WS1/e3sm/python_venv/3.9.2/screamML/bin/activate) diff --git a/components/eamxx/cmake/machine-files/ruby.cmake b/components/eamxx/cmake/machine-files/ruby.cmake index d0a9de4baf4..77d6e6618c7 100644 --- a/components/eamxx/cmake/machine-files/ruby.cmake +++ b/components/eamxx/cmake/machine-files/ruby.cmake @@ -12,4 +12,4 @@ include (${EKAT_MACH_FILES_PATH}/kokkos/openmp.cmake) include (${EKAT_MACH_FILES_PATH}/mpi/srun.cmake) -set(SCREAM_INPUT_ROOT "/usr/gdata/climdat/ccsm3data/inputdata" CACHE STRING "") +set(SCREAM_INPUT_ROOT "/usr/gdata/e3sm/ccsm3data/inputdata" CACHE STRING "") diff --git a/components/eamxx/cmake/machine-files/syrah.cmake b/components/eamxx/cmake/machine-files/syrah.cmake deleted file mode 100644 index f03fc1e9d46..00000000000 --- a/components/eamxx/cmake/machine-files/syrah.cmake +++ /dev/null @@ -1,13 +0,0 @@ -include(${CMAKE_CURRENT_LIST_DIR}/common.cmake) -common_setup() - -include (${EKAT_MACH_FILES_PATH}/kokkos/openmp.cmake) -include (${EKAT_MACH_FILES_PATH}/mpi/srun.cmake) - -# Enable Sandy Bridge arch in Kokkos -option(Kokkos_ARCH_SNB "" ON) - -set(CMAKE_CXX_FLAGS "-w -cxxlib=/usr/tce/packages/gcc/gcc-8.3.1/rh" CACHE STRING "" FORCE) -set(CMAKE_EXE_LINKER_FLAGS "-L/usr/tce/packages/gcc/gcc-8.3.1/rh/lib/gcc/x86_64-redhat-linux/8/ -mkl" CACHE STRING "" FORCE) - -set(SCREAM_INPUT_ROOT "/usr/gdata/climdat/ccsm3data/inputdata/" CACHE STRING "") diff --git a/components/eamxx/data/scream_default_remap.yaml b/components/eamxx/data/scream_default_remap.yaml index 8bf47386c76..3be4dc13244 100644 --- a/components/eamxx/data/scream_default_remap.yaml +++ b/components/eamxx/data/scream_default_remap.yaml @@ -4,7 +4,7 @@ filename_prefix: ${CASE}.scream.arm_sites.hi Averaging Type: Instant Max Snapshots Per File: 744 # One output every 31 days #remap_file: /g/g17/donahue5/Code/e3sm/scream-docs/regional_output_sites/20221123_ARM_sites_map.nc -remap_file: /usr/gdata/climdat/ccsm3data/inputdata/atm/scream/maps/map_ne30np4_to_ne4pg2_mono.20220714.nc +remap_file: /usr/gdata/e3sm/ccsm3data/inputdata/atm/scream/maps/map_ne30np4_to_ne4pg2_mono.20220714.nc Fields: Physics ${PHYSICS_GRID_TYPE}: Field Names: diff --git a/components/eamxx/scripts/machines_specs.py b/components/eamxx/scripts/machines_specs.py index cd717cba6b9..4b2d6174508 100644 --- a/components/eamxx/scripts/machines_specs.py +++ b/components/eamxx/scripts/machines_specs.py @@ -31,17 +31,17 @@ "", "/sems-data-store/ACME/baselines/scream/master-baselines"), "lassen" : (["module --force purge", "module load git gcc/8.3.1 cuda/11.8.0 cmake/3.16.8 spectrum-mpi python/3.7.2", "export LLNL_USE_OMPI_VARS='y'", - "export PATH=/usr/gdata/climdat/netcdf/bin:$PATH", - "export LD_LIBRARY_PATH=/usr/gdata/climdat/netcdf/lib:$LD_LIBRARY_PATH", + "export PATH=/usr/gdata/e3sm/netcdf/bin:$PATH", + "export LD_LIBRARY_PATH=/usr/gdata/e3sm/netcdf/lib:$LD_LIBRARY_PATH", ], ["mpicxx","mpifort","mpicc"], "bsub -Ip -qpdebug", ""), - "ruby-intel" : (["module --force purge", "module use --append /usr/gdata/climdat/install/quartz/modulefiles", "module load StdEnv cmake/3.19.2 mkl/2022.1.0 intel-classic/2021.6.0-magic mvapich2/2.3.7 hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 python/3.9.12 screamML-venv/0.0.1"], + "ruby-intel" : (["module --force purge", "module use --append /usr/gdata/e3sm/install/quartz/modulefiles", "module load StdEnv cmake/3.19.2 mkl/2022.1.0 intel-classic/2021.6.0-magic mvapich2/2.3.7 hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 python/3.9.12 screamML-venv/0.0.1"], ["mpicxx","mpifort","mpicc"], "salloc --partition=pdebug", ""), - "quartz-intel" : (["module --force purge", "module use --append /usr/gdata/climdat/install/quartz/modulefiles", "module load StdEnv cmake/3.19.2 mkl/2022.1.0 intel-classic/2021.6.0-magic mvapich2/2.3.7 hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 python/3.9.12 screamML-venv/0.0.1"], + "quartz-intel" : (["module --force purge", "module use --append /usr/gdata/e3sm/install/quartz/modulefiles", "module load StdEnv cmake/3.19.2 mkl/2022.1.0 intel-classic/2021.6.0-magic mvapich2/2.3.7 hdf5/1.12.2 netcdf-c/4.9.0 netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 python/3.9.12 screamML-venv/0.0.1"], ["mpicxx","mpifort","mpicc"], "salloc --partition=pdebug", ""), From daa7392d5a28f6b462fabf2755fcbaa35404d609 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Fri, 9 Feb 2024 13:46:19 -0600 Subject: [PATCH 061/310] Adding cryo fields to coupler budget accounting --- .../mpas-ocean/driver/mpaso_cpl_indices.F | 13 ++- components/mpas-ocean/driver/ocn_comp_mct.F | 63 ++++++++++- components/mpas-ocean/src/Registry.xml | 16 +++ .../Registry_conservation_check.xml | 24 ++--- .../mpas_ocn_conservation_check.F | 3 +- .../shared/mpas_ocn_time_average_coupled.F | 88 ++++++++++++++- driver-mct/main/seq_diag_mct.F90 | 100 +++++++++++------- driver-mct/shr/seq_flds_mod.F90 | 40 +++++++ 8 files changed, 290 insertions(+), 57 deletions(-) diff --git a/components/mpas-ocean/driver/mpaso_cpl_indices.F b/components/mpas-ocean/driver/mpaso_cpl_indices.F index 968a4090fe4..10cbfe80e96 100644 --- a/components/mpas-ocean/driver/mpaso_cpl_indices.F +++ b/components/mpas-ocean/driver/mpaso_cpl_indices.F @@ -22,7 +22,11 @@ module mpaso_cpl_indices integer :: index_o2x_Faoo_fco2_ocn integer :: index_o2x_Faoo_fdms_ocn integer :: index_o2x_So_ssh - + integer :: index_o2x_Foxo_ismw + integer :: index_o2x_Foxo_rrofl + integer :: index_o2x_Foxo_rrofi + integer :: index_o2x_Foxo_ismh + integer :: index_o2x_Foxo_rrofih ! ocn -> drv for calculation of ocean-ice sheet interactions @@ -188,6 +192,13 @@ subroutine mpaso_cpl_indices_set( ) index_o2x_Faoo_fdms_ocn = mct_avect_indexra(o2x,'Faoo_fdms_ocn',perrWith='quiet') index_o2x_So_ssh = mct_avect_indexra(o2x,'So_ssh') + index_o2x_Foxo_ismw = mct_avect_indexra(o2x,'Foxo_ismw') + index_o2x_Foxo_rrofl = mct_avect_indexra(o2x,'Foxo_rrofl') + index_o2x_Foxo_rrofi = mct_avect_indexra(o2x,'Foxo_rrofi') + + index_o2x_Foxo_ismh = mct_avect_indexra(o2x,'Foxo_ismh') + index_o2x_Foxo_rrofih = mct_avect_indexra(o2x,'Foxo_rrofih') + index_o2x_So_blt = mct_avect_indexra(o2x,'So_blt') index_o2x_So_bls = mct_avect_indexra(o2x,'So_bls') index_o2x_So_htv = mct_avect_indexra(o2x,'So_htv') diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F index ec02127f7ca..67f465b9332 100644 --- a/components/mpas-ocean/driver/ocn_comp_mct.F +++ b/components/mpas-ocean/driver/ocn_comp_mct.F @@ -689,6 +689,7 @@ end subroutine xml_stream_get_attributes if ( ierr /= 0 ) then write(ocnLogUnit,*) 'Fail to set define dom fields ' endif + ent_type = 1 ! cells @@ -2700,7 +2701,12 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ avgOceanSurfaceDOCSemiLabile, & avgOceanSurfaceFeParticulate, & avgOceanSurfaceFeDissolved, & - ssh + ssh, & + avgLandIceFreshwaterFlux, & + avgRemovedRiverRunoffFlux, & + avgRemovedIceRunoffFlux, & + avgLandIceHeatFlux, & + avgRemovedIceRunoffHeatFlux real (kind=RKIND), dimension(:,:), pointer :: avgTracersSurfaceValue, avgSurfaceVelocity, & avgSSHGradient, avgOceanSurfacePhytoC, & @@ -2709,6 +2715,7 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ real (kind=RKIND) :: surfaceFreezingTemp logical, pointer :: frazilIceActive, & + config_remove_AIS_coupler_runoff, & config_use_ecosysTracers, & config_use_DMSTracers, & config_use_MacroMoleculesTracers, & @@ -2725,6 +2732,7 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ call mpas_pool_get_package(domain % packages, 'frazilIceActive', frazilIceActive) call mpas_pool_get_config(domain % configs, 'config_use_ecosysTracers', config_use_ecosysTracers) call mpas_pool_get_config(domain % configs, 'config_land_ice_flux_mode', config_land_ice_flux_mode) + call mpas_pool_get_config(domain % configs, 'config_remove_AIS_coupler_runoff', config_remove_AIS_coupler_runoff) call mpas_pool_get_config(domain % configs, 'config_use_DMSTracers', config_use_DMSTracers) call mpas_pool_get_config(domain % configs, 'config_use_MacroMoleculesTracers', config_use_MacroMoleculesTracers) call mpas_pool_get_config(domain % configs, 'config_use_ecosysTracers_sea_ice_coupling', & @@ -2767,6 +2775,17 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ call mpas_pool_get_array(statePool, 'accumulatedFrazilIceMass', accumulatedFrazilIceMass, 1) end if + ! Cryo fields + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + call mpas_pool_get_array(forcingPool, 'avgLandIceFreshwaterFlux', avgLandIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'avgLandIceHeatFlux', avgLandIceHeatFlux) + endif + if (config_remove_AIS_coupler_runoff) then + call mpas_pool_get_array(forcingPool, 'avgRemovedRiverRunoffFlux', avgRemovedRiverRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffFlux', avgRemovedIceRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffHeatFlux', avgRemovedIceRunoffHeatFlux) + endif + ! BGC fields if (config_use_ecosysTracers) then @@ -2818,6 +2837,17 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ o2x_o % rAttr(index_o2x_Faoo_h2otemp, n) = avgTotalFreshWaterTemperatureFlux(i) * rho_sw * cp_sw + ! Cryo fields + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + o2x_o % rAttr(index_o2x_Foxo_ismw, n) = avgLandIceFreshwaterFlux(i) + o2x_o % rAttr(index_o2x_Foxo_ismh, n) = avgLandIceHeatFlux(i) + endif + if (config_remove_AIS_coupler_runoff) then + o2x_o % rAttr(index_o2x_Foxo_rrofl, n) = avgRemovedRiverRunoffFlux(i) + o2x_o % rAttr(index_o2x_Foxo_rrofi, n) = avgRemovedIceRunoffFlux(i) + o2x_o % rAttr(index_o2x_Foxo_rrofih, n) = avgRemovedIceRunoffHeatFlux(i) + endif + if ( frazilIceActive ) then ! negative when frazil ice can be melted keepFrazil = .true. @@ -3981,7 +4011,12 @@ subroutine ocn_export_moab(EClock) !{{{ avgOceanSurfaceDOCSemiLabile, & avgOceanSurfaceFeParticulate, & avgOceanSurfaceFeDissolved, & - ssh + ssh, & + avgLandIceFreshwaterFlux, & + avgRemovedRiverRunoffFlux, & + avgRemovedIceRunoffFlux, & + avgLandIceHeatFlux, & + avgRemovedIceRunoffHeatFlux real (kind=RKIND), dimension(:,:), pointer :: avgTracersSurfaceValue, avgSurfaceVelocity, & avgSSHGradient, avgOceanSurfacePhytoC, & @@ -3990,6 +4025,7 @@ subroutine ocn_export_moab(EClock) !{{{ real (kind=RKIND) :: surfaceFreezingTemp logical, pointer :: frazilIceActive, & + config_remove_AIS_coupler_runoff, & config_use_ecosysTracers, & config_use_DMSTracers, & config_use_MacroMoleculesTracers, & @@ -4006,6 +4042,7 @@ subroutine ocn_export_moab(EClock) !{{{ call mpas_pool_get_package(domain % packages, 'frazilIceActive', frazilIceActive) call mpas_pool_get_config(domain % configs, 'config_use_ecosysTracers', config_use_ecosysTracers) call mpas_pool_get_config(domain % configs, 'config_land_ice_flux_mode', config_land_ice_flux_mode) + call mpas_pool_get_config(domain % configs, 'config_remove_AIS_coupler_runoff', config_remove_AIS_coupler_runoff) call mpas_pool_get_config(domain % configs, 'config_use_DMSTracers', config_use_DMSTracers) call mpas_pool_get_config(domain % configs, 'config_use_MacroMoleculesTracers', config_use_MacroMoleculesTracers) call mpas_pool_get_config(domain % configs, 'config_use_ecosysTracers_sea_ice_coupling', & @@ -4047,6 +4084,16 @@ subroutine ocn_export_moab(EClock) !{{{ call mpas_pool_get_array(forcingPool, 'frazilSurfacePressure', frazilSurfacePressure) call mpas_pool_get_array(statePool, 'accumulatedFrazilIceMass', accumulatedFrazilIceMass, 1) end if + + if (trim(config_land_ice_flux_mode == 'standalone') .or. trim(config_land_ice_flux_mode) == 'data') then + call mpas_pool_get_array(forcingPool, 'avgLandIceFreshwaterFlux', avgLandIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'avgLandIceHeatFlux', avgLandIceHeatFlux) + endif + if (config_remove_AIS_coupler_runoff) then + call mpas_pool_get_array(forcingPool, 'avgRemovedRiverRunoffFlux', avgRemovedRiverRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffFlux', avgRemovedIceRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffHeatFlux', avgRemovedIceRunoffHeatFlux) + endif ! BGC fields if (config_use_ecosysTracers) then @@ -4098,7 +4145,17 @@ subroutine ocn_export_moab(EClock) !{{{ o2x_om(n, index_o2x_So_dhdy) = avgSSHGradient(index_avgMeridionalSSHGradient, i) o2x_om(n, index_o2x_Faoo_h2otemp) = avgTotalFreshWaterTemperatureFlux(i) * rho_sw * cp_sw - + + if (trim(config_land_ice_flux_mode == 'standalone') .or. trim(config_land_ice_flux_mode) == 'data') then + o2x_om(n, index_o2x_Foxo_ismw) = avgLandIceFreshwaterFlux(i) + o2x_om(n, index_o2x_Foxo_ismh) = avgLandIceHeatFlux(i) + endif + if (config_remove_AIS_coupler_runoff) then + o2x_om(n, index_o2x_Foxo_rrofl) = avgRemovedRiverRunoffFlux(i) + o2x_om(n, index_o2x_Foxo_rrofi) = avgRemovedIceRunoffFlux(i) + o2x_om(n, index_o2x_Foxo_rrofih) = avgRemovedIceRunoffHeatFlux(i) + endif + if ( frazilIceActive ) then ! negative when frazil ice can be melted keepFrazil = .true. diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index f8b56c083d4..a953b64d8f8 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -3608,6 +3608,7 @@ packages="activeTracersBulkRestoringPKG;thicknessBulkPKG" /> + + + + + + - - - - - - - - - - - - diff --git a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F index a4f2a0b7ab5..01f2b534546 100644 --- a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F +++ b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F @@ -2432,7 +2432,8 @@ subroutine ocn_restart_conservation_check(domain, err)!{{{ err = 0 if ( trim(config_land_ice_flux_mode) == 'standalone' .or. & - trim(config_land_ice_flux_mode) == 'coupled' ) then + trim(config_land_ice_flux_mode) == 'coupled' .or. & + trim(config_land_ice_flux_mode) == 'data' ) then landIceFreshwaterFluxesOn = .true. end if diff --git a/components/mpas-ocean/src/shared/mpas_ocn_time_average_coupled.F b/components/mpas-ocean/src/shared/mpas_ocn_time_average_coupled.F index b796c56fa1a..751c547d95b 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_time_average_coupled.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_time_average_coupled.F @@ -53,7 +53,10 @@ subroutine ocn_time_average_coupled_init(forcingPool)!{{{ real (kind=RKIND), dimension(:,:), pointer :: avgTracersSurfaceValue, avgSurfaceVelocity, avgSSHGradient, & avgLandIceBoundaryLayerTracers, avgLandIceTracerTransferVelocities - real (kind=RKIND), dimension(:), pointer :: avgEffectiveDensityInLandIce, avgTotalFreshWaterTemperatureFlux + real (kind=RKIND), dimension(:), pointer :: avgEffectiveDensityInLandIce, avgTotalFreshWaterTemperatureFlux, & + avgLandIceFreshwaterFlux, & + avgRemovedRiverRunoffFlux, avgRemovedIceRunoffFlux, & + avgLandIceHeatFlux, avgRemovedIceRunoffHeatFlux integer :: iCell integer, pointer :: nAccumulatedCoupled, nCells @@ -116,6 +119,37 @@ subroutine ocn_time_average_coupled_init(forcingPool)!{{{ !$omp end parallel end if + ! Set up polar fields if necessary + if(trim(config_land_ice_flux_mode)=='standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + call mpas_pool_get_array(forcingPool, 'avgLandIceFreshwaterFlux', avgLandIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'avgLandIceHeatFlux', avgLandIceHeatFlux) + + !$omp parallel + !$omp do schedule(runtime) + do iCell = 1, nCells + avgLandIceFreshwaterFlux(iCell) = 0.0_RKIND + avgLandIceHeatFlux(iCell) = 0.0_RKIND + end do + !$omp end do + !$omp end parallel + end if + + if(config_remove_AIS_coupler_runoff) then + call mpas_pool_get_array(forcingPool, 'avgRemovedRiverRunoffFlux', avgRemovedRiverRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffFlux', avgRemovedIceRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffHeatFlux', avgRemovedIceRunoffHeatFlux) + + !$omp parallel + !$omp do schedule(runtime) + do iCell = 1, nCells + avgRemovedRiverRunoffFlux(iCell) = 0.0_RKIND + avgRemovedIceRunoffFlux(iCell) = 0.0_RKIND + avgRemovedIceRunoffHeatFlux(iCell) = 0.0_RKIND + end do + !$omp end do + !$omp end parallel + end if + ! set up BGC coupling fields if necessary if (config_use_ecosysTracers) then @@ -201,6 +235,9 @@ end subroutine ocn_time_average_coupled_init!}}} ! !----------------------------------------------------------------------- subroutine ocn_time_average_coupled_accumulate(statePool, forcingPool, timeLevel)!{{{ + use ocn_constants, only: & + latent_heat_fusion_mks + type (mpas_pool_type), intent(in) :: statePool type (mpas_pool_type), intent(inout) :: forcingPool integer, intent(in) :: timeLevel @@ -215,7 +252,12 @@ subroutine ocn_time_average_coupled_accumulate(statePool, forcingPool, timeLevel real (kind=RKIND), dimension(:,:), pointer :: & avgLandIceBoundaryLayerTracers, avgLandIceTracerTransferVelocities real (kind=RKIND), dimension(:), pointer :: effectiveDensityInLandIce, avgEffectiveDensityInLandIce, & - totalFreshWaterTemperatureFlux, avgTotalFreshWaterTemperatureFlux + totalFreshWaterTemperatureFlux, avgTotalFreshWaterTemperatureFlux, & + landIceFreshwaterFlux, avgLandIceFreshwaterFlux, & + landIceHeatFlux, avgLandIceHeatFlux, & + removedRiverRunoffFlux, avgRemovedRiverRunoffFlux, & + removedIceRunoffFlux, avgRemovedIceRunoffFlux, & + avgRemovedIceRunoffHeatFlux type (mpas_pool_type), pointer :: tracersPool @@ -311,6 +353,48 @@ subroutine ocn_time_average_coupled_accumulate(statePool, forcingPool, timeLevel !$omp end parallel end if + ! Accumulate polar fields if necessary + if(trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + call mpas_pool_get_array(forcingPool, 'avgLandIceFreshwaterFlux', avgLandIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'landIceFreshwaterFlux', landIceFreshwaterFlux) + call mpas_pool_get_array(forcingPool, 'avgLandIceHeatFlux', avgLandIceHeatFlux) + call mpas_pool_get_array(forcingPool, 'landIceHeatFlux', landIceHeatFlux) + + !$omp parallel + !$omp do schedule(runtime) + do iCell = 1, nCells + avgLandIceFreshwaterFlux(iCell) = ( avgLandIceFreshwaterFlux(iCell) * nAccumulatedCoupled & + + landIceFreshwaterFlux(iCell) ) / ( nAccumulatedCoupled + 1) + avgLandIceHeatFlux(iCell) = ( avgLandIceHeatFlux(iCell) * nAccumulatedCoupled & + + landIceHeatFlux(iCell) ) / ( nAccumulatedCoupled + 1) + end do + !$omp end do + !$omp end parallel + + end if + + if (config_remove_AIS_coupler_runoff) then + call mpas_pool_get_array(forcingPool, 'avgRemovedRiverRunoffFlux', avgRemovedRiverRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffFlux', avgRemovedIceRunoffFlux) + call mpas_pool_get_array(forcingPool, 'avgRemovedIceRunoffHeatFlux', avgRemovedIceRunoffHeatFlux) + call mpas_pool_get_array(forcingPool, 'removedRiverRunoffFlux', removedRiverRunoffFlux) + call mpas_pool_get_array(forcingPool, 'removedIceRunoffFlux', removedIceRunoffFlux) + + !$omp parallel + !$omp do schedule(runtime) + do iCell = 1, nCells + avgRemovedRiverRunoffFlux(iCell) = ( avgRemovedRiverRunoffFlux(iCell) * nAccumulatedCoupled & + + removedRiverRunoffFlux(iCell) ) / ( nAccumulatedCoupled + 1) + avgRemovedIceRunoffFlux(iCell) = ( avgRemovedIceRunoffFlux(iCell) * nAccumulatedCoupled & + + removedIceRunoffFlux(iCell) ) / ( nAccumulatedCoupled + 1) + avgRemovedIceRunoffHeatFlux(iCell) = ( avgRemovedIceRunoffHeatFlux(iCell) * nAccumulatedCoupled & + + removedIceRunoffFlux(iCell)*latent_heat_fusion_mks ) / ( nAccumulatedCoupled + 1) + end do + !$omp end do + !$omp end parallel + + end if + ! accumulate BGC coupling fields if necessary if (config_use_ecosysTracers) then diff --git a/driver-mct/main/seq_diag_mct.F90 b/driver-mct/main/seq_diag_mct.F90 index 2a7d999ccc5..f3c466f15e9 100644 --- a/driver-mct/main/seq_diag_mct.F90 +++ b/driver-mct/main/seq_diag_mct.F90 @@ -139,37 +139,42 @@ module seq_diag_mct integer(in),parameter :: f_hioff = 9 ! heat : latent, fusion, frozen runoff integer(in),parameter :: f_hsen =10 ! heat : sensible integer(in),parameter :: f_hberg =11 ! heat : data icebergs - integer(in),parameter :: f_hh2ot =12 ! heat : water temperature - integer(in),parameter :: f_wfrz =13 ! water: freezing - integer(in),parameter :: f_wmelt =14 ! water: melting - integer(in),parameter :: f_wrain =15 ! water: precip, liquid - integer(in),parameter :: f_wsnow =16 ! water: precip, frozen - integer(in),parameter :: f_wberg =17 ! water: data icebergs - integer(in),parameter :: f_wevap =18 ! water: evaporation - integer(in),parameter :: f_wroff =19 ! water: runoff/flood - integer(in),parameter :: f_wioff =20 ! water: frozen runoff - integer(in),parameter :: f_wirrig =21 ! water: irrigation - integer(in),parameter :: f_wfrz_16O =22 ! water: freezing - integer(in),parameter :: f_wmelt_16O =23 ! water: melting - integer(in),parameter :: f_wrain_16O =24 ! water: precip, liquid - integer(in),parameter :: f_wsnow_16O =25 ! water: precip, frozen - integer(in),parameter :: f_wevap_16O =26 ! water: evaporation - integer(in),parameter :: f_wroff_16O =27 ! water: runoff/flood - integer(in),parameter :: f_wioff_16O =28 ! water: frozen runoff - integer(in),parameter :: f_wfrz_18O =29 ! water: freezing - integer(in),parameter :: f_wmelt_18O =30 ! water: melting - integer(in),parameter :: f_wrain_18O =31 ! water: precip, liquid - integer(in),parameter :: f_wsnow_18O =32 ! water: precip, frozen - integer(in),parameter :: f_wevap_18O =33 ! water: evaporation - integer(in),parameter :: f_wroff_18O =34 ! water: runoff/flood - integer(in),parameter :: f_wioff_18O =35 ! water: frozen runoff - integer(in),parameter :: f_wfrz_HDO =36 ! water: freezing - integer(in),parameter :: f_wmelt_HDO =37 ! water: melting - integer(in),parameter :: f_wrain_HDO =38 ! water: precip, liquid - integer(in),parameter :: f_wsnow_HDO =39 ! water: precip, frozen - integer(in),parameter :: f_wevap_HDO =40 ! water: evaporation - integer(in),parameter :: f_wroff_HDO =41 ! water: runoff/flood - integer(in),parameter :: f_wioff_HDO =42 ! water: frozen runoff + integer(in),parameter :: f_hism =12 ! heat : ice shelf melt + integer(in),parameter :: f_hriof =13 ! heat : data icebergs + integer(in),parameter :: f_hh2ot =14 ! heat : water temperature + integer(in),parameter :: f_wfrz =15 ! water: freezing + integer(in),parameter :: f_wmelt =16 ! water: melting + integer(in),parameter :: f_wrain =17 ! water: precip, liquid + integer(in),parameter :: f_wsnow =18 ! water: precip, frozen + integer(in),parameter :: f_wevap =19 ! water: evaporation + integer(in),parameter :: f_wroff =20 ! water: runoff/flood + integer(in),parameter :: f_wioff =21 ! water: frozen runoff + integer(in),parameter :: f_wberg =22 ! water: data icebergs + integer(in),parameter :: f_wism =23 ! water: ice-shelf melt + integer(in),parameter :: f_wrrof =24 ! water: removed liquid runoff + integer(in),parameter :: f_wriof =25 ! water: removed ice runoff + integer(in),parameter :: f_wirrig =26 ! water: irrigation + integer(in),parameter :: f_wfrz_16O =27 ! water: freezing + integer(in),parameter :: f_wmelt_16O =28 ! water: melting + integer(in),parameter :: f_wrain_16O =29 ! water: precip, liquid + integer(in),parameter :: f_wsnow_16O =30 ! water: precip, frozen + integer(in),parameter :: f_wevap_16O =31 ! water: evaporation + integer(in),parameter :: f_wroff_16O =32 ! water: runoff/flood + integer(in),parameter :: f_wioff_16O =33 ! water: frozen runoff + integer(in),parameter :: f_wfrz_18O =34 ! water: freezing + integer(in),parameter :: f_wmelt_18O =35 ! water: melting + integer(in),parameter :: f_wrain_18O =36 ! water: precip, liquid + integer(in),parameter :: f_wsnow_18O =37 ! water: precip, frozen + integer(in),parameter :: f_wevap_18O =38 ! water: evaporation + integer(in),parameter :: f_wroff_18O =39 ! water: runoff/flood + integer(in),parameter :: f_wioff_18O =40 ! water: frozen runoff + integer(in),parameter :: f_wfrz_HDO =41 ! water: freezing + integer(in),parameter :: f_wmelt_HDO =42 ! water: melting + integer(in),parameter :: f_wrain_HDO =43 ! water: precip, liquid + integer(in),parameter :: f_wsnow_HDO =44 ! water: precip, frozen + integer(in),parameter :: f_wevap_HDO =45 ! water: evaporation + integer(in),parameter :: f_wroff_HDO =46 ! water: runoff/flood + integer(in),parameter :: f_wioff_HDO =47 ! water: frozen runoff integer(in),parameter :: f_size = f_wioff_HDO ! Total array size of all elements integer(in),parameter :: f_a = f_area ! 1st index for area @@ -189,8 +194,10 @@ module seq_diag_mct (/' area',' hfreeze',' hmelt',' hnetsw',' hlwdn', & ' hlwup',' hlatvap',' hlatfus',' hiroff',' hsen', & - ' hberg',' hh2otemp',' wfreeze',' wmelt',' wrain', & - ' wsnow',' wberg',' wevap',' wrunoff',' wfrzrof', & + ' hberg',' hism',' hriof', & + ' hh2otemp',' wfreeze',' wmelt',' wrain', & + ' wsnow',' wevap',' wrunoff',' wfrzrof', & + ' wberg',' wism',' wrrof',' wriof', & ' wirrig', & ' wfreeze_16O',' wmelt_16O',' wrain_16O',' wsnow_16O', & ' wevap_16O',' wrunoff_16O',' wfrzrof_16O', & @@ -288,6 +295,12 @@ module seq_diag_mct integer :: index_o2x_Fioo_frazil integer :: index_o2x_Fioo_q + integer :: index_o2x_Foxo_ismw + integer :: index_o2x_Foxo_rrofl + integer :: index_o2x_Foxo_rrofi + integer :: index_o2x_Foxo_ismh + integer :: index_o2x_Foxo_rrofih + integer :: index_xao_Faox_lwup integer :: index_xao_Faox_lat integer :: index_xao_Faox_sen @@ -1337,7 +1350,7 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa integer(in) :: kArea ! index of area field in aVect integer(in) :: ko,ki ! fraction indices integer(in) :: lSize ! size of aVect - real(r8) :: ca_i,ca_o ! area of a grid cell + real(r8) :: ca_i,ca_o,ca_c ! area of a grid cell logical,save :: first_time = .true. logical,save :: flds_wiso_ocn = .false. @@ -1373,6 +1386,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') + index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw') + index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl') + index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi') + index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh') + index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih') end if lSize = mct_avect_lSize(o2x_o) @@ -1380,10 +1398,16 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa do n=1,lSize ca_o = dom_o%data%rAttr(kArea,n) * frac_o%rAttr(ko,n) ca_i = dom_o%data%rAttr(kArea,n) * frac_o%rAttr(ki,n) + ca_c = dom_o%data%rAttr(kArea,n) nf = f_area; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_o nf = f_wfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_frazil,n)) nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) + nf = f_wism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) + nf = f_wrrof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) + nf = f_wriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end do end if @@ -1613,8 +1637,8 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) if (present(do_i2x)) then index_i2x_Fioi_melth = mct_aVect_indexRA(i2x_i,'Fioi_melth') index_i2x_Fioi_meltw = mct_aVect_indexRA(i2x_i,'Fioi_meltw') - index_i2x_Fioi_bergh = mct_aVect_indexRA(i2x_i,'PFioi_bergh') - index_i2x_Fioi_bergw = mct_aVect_indexRA(i2x_i,'PFioi_bergw') +! index_i2x_Fioi_bergh = mct_aVect_indexRA(i2x_i,'PFioi_bergh') +! index_i2x_Fioi_bergw = mct_aVect_indexRA(i2x_i,'PFioi_bergw') index_i2x_Fioi_swpen = mct_aVect_indexRA(i2x_i,'Fioi_swpen') index_i2x_Faii_swnet = mct_aVect_indexRA(i2x_i,'Faii_swnet') index_i2x_Faii_lwup = mct_aVect_indexRA(i2x_i,'Faii_lwup') @@ -1650,9 +1674,9 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) nf = f_hlwup ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lwup,n) nf = f_hlatv ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lat,n) nf = f_hsen ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_sen,n) - nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergh,n) +! nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergh,n) nf = f_wmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_i*i2x_i%rAttr(index_i2x_Fioi_meltw,n) - nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergw,n) +! nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergw,n) nf = f_wevap ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_evap,n) if ( flds_wiso_ice )then diff --git a/driver-mct/shr/seq_flds_mod.F90 b/driver-mct/shr/seq_flds_mod.F90 index 4b37e40b7b3..cb41fa6439f 100644 --- a/driver-mct/shr/seq_flds_mod.F90 +++ b/driver-mct/shr/seq_flds_mod.F90 @@ -1583,6 +1583,46 @@ subroutine seq_flds_set(nmlfile, ID, infodata) attname = 'PFioi_bergw' call metadata_set(attname, longname, stdname, units) + ! Water flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismw") + longname = 'Water flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_melt_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_ismw' + call metadata_set(attname, longname, stdname, units) + + ! Heat flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismh") + longname = 'Heat flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_heat_flux' + units = 'W m-2' + attname = 'Foxo_ismh' + call metadata_set(attname, longname, stdname, units) + + ! Water flux from removed liquid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofl") + longname = 'Water flux due to removed liqiud runoff' + stdname = 'removed_liquid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofl' + call metadata_set(attname, longname, stdname, units) + + ! Water flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofi") + longname = 'Water flux due to removed solid runoff' + stdname = 'removed_solid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofi' + call metadata_set(attname, longname, stdname, units) + + ! Heat flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofih") + longname = 'Heat flux due to removed solid runoff' + stdname = 'removed_solid_runoff_heat_flux' + units = 'W m-2' + attname = 'Foxo_rrofih' + call metadata_set(attname, longname, stdname, units) + ! Salt flux call seq_flds_add(i2x_fluxes,"Fioi_salt") call seq_flds_add(x2o_fluxes,"Fioi_salt") From b505550e8b776dbba982f8b613733a2b21b63b27 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Thu, 15 Feb 2024 16:07:09 -0600 Subject: [PATCH 062/310] Combining polar terms into single row entry --- .../mpas-ocean/driver/mpaso_cpl_indices.F | 10 +- driver-mct/main/seq_diag_mct.F90 | 104 +++++++++--------- 2 files changed, 56 insertions(+), 58 deletions(-) diff --git a/components/mpas-ocean/driver/mpaso_cpl_indices.F b/components/mpas-ocean/driver/mpaso_cpl_indices.F index 10cbfe80e96..5fd341993c5 100644 --- a/components/mpas-ocean/driver/mpaso_cpl_indices.F +++ b/components/mpas-ocean/driver/mpaso_cpl_indices.F @@ -192,12 +192,12 @@ subroutine mpaso_cpl_indices_set( ) index_o2x_Faoo_fdms_ocn = mct_avect_indexra(o2x,'Faoo_fdms_ocn',perrWith='quiet') index_o2x_So_ssh = mct_avect_indexra(o2x,'So_ssh') - index_o2x_Foxo_ismw = mct_avect_indexra(o2x,'Foxo_ismw') - index_o2x_Foxo_rrofl = mct_avect_indexra(o2x,'Foxo_rrofl') - index_o2x_Foxo_rrofi = mct_avect_indexra(o2x,'Foxo_rrofi') + index_o2x_Foxo_ismw = mct_avect_indexra(o2x,'Foxo_ismw',perrWith='quiet') + index_o2x_Foxo_rrofl = mct_avect_indexra(o2x,'Foxo_rrofl',perrWith='quiet') + index_o2x_Foxo_rrofi = mct_avect_indexra(o2x,'Foxo_rrofi',perrWith='quiet') - index_o2x_Foxo_ismh = mct_avect_indexra(o2x,'Foxo_ismh') - index_o2x_Foxo_rrofih = mct_avect_indexra(o2x,'Foxo_rrofih') + index_o2x_Foxo_ismh = mct_avect_indexra(o2x,'Foxo_ismh',perrWith='quiet') + index_o2x_Foxo_rrofih = mct_avect_indexra(o2x,'Foxo_rrofih',perrWith='quiet') index_o2x_So_blt = mct_avect_indexra(o2x,'So_blt') index_o2x_So_bls = mct_avect_indexra(o2x,'So_bls') diff --git a/driver-mct/main/seq_diag_mct.F90 b/driver-mct/main/seq_diag_mct.F90 index f3c466f15e9..9d9df6fd3ab 100644 --- a/driver-mct/main/seq_diag_mct.F90 +++ b/driver-mct/main/seq_diag_mct.F90 @@ -138,43 +138,38 @@ module seq_diag_mct integer(in),parameter :: f_hlatf = 8 ! heat : latent, fusion, snow integer(in),parameter :: f_hioff = 9 ! heat : latent, fusion, frozen runoff integer(in),parameter :: f_hsen =10 ! heat : sensible - integer(in),parameter :: f_hberg =11 ! heat : data icebergs - integer(in),parameter :: f_hism =12 ! heat : ice shelf melt - integer(in),parameter :: f_hriof =13 ! heat : data icebergs - integer(in),parameter :: f_hh2ot =14 ! heat : water temperature - integer(in),parameter :: f_wfrz =15 ! water: freezing - integer(in),parameter :: f_wmelt =16 ! water: melting - integer(in),parameter :: f_wrain =17 ! water: precip, liquid - integer(in),parameter :: f_wsnow =18 ! water: precip, frozen - integer(in),parameter :: f_wevap =19 ! water: evaporation - integer(in),parameter :: f_wroff =20 ! water: runoff/flood - integer(in),parameter :: f_wioff =21 ! water: frozen runoff - integer(in),parameter :: f_wberg =22 ! water: data icebergs - integer(in),parameter :: f_wism =23 ! water: ice-shelf melt - integer(in),parameter :: f_wrrof =24 ! water: removed liquid runoff - integer(in),parameter :: f_wriof =25 ! water: removed ice runoff - integer(in),parameter :: f_wirrig =26 ! water: irrigation - integer(in),parameter :: f_wfrz_16O =27 ! water: freezing - integer(in),parameter :: f_wmelt_16O =28 ! water: melting - integer(in),parameter :: f_wrain_16O =29 ! water: precip, liquid - integer(in),parameter :: f_wsnow_16O =30 ! water: precip, frozen - integer(in),parameter :: f_wevap_16O =31 ! water: evaporation - integer(in),parameter :: f_wroff_16O =32 ! water: runoff/flood - integer(in),parameter :: f_wioff_16O =33 ! water: frozen runoff - integer(in),parameter :: f_wfrz_18O =34 ! water: freezing - integer(in),parameter :: f_wmelt_18O =35 ! water: melting - integer(in),parameter :: f_wrain_18O =36 ! water: precip, liquid - integer(in),parameter :: f_wsnow_18O =37 ! water: precip, frozen - integer(in),parameter :: f_wevap_18O =38 ! water: evaporation - integer(in),parameter :: f_wroff_18O =39 ! water: runoff/flood - integer(in),parameter :: f_wioff_18O =40 ! water: frozen runoff - integer(in),parameter :: f_wfrz_HDO =41 ! water: freezing - integer(in),parameter :: f_wmelt_HDO =42 ! water: melting - integer(in),parameter :: f_wrain_HDO =43 ! water: precip, liquid - integer(in),parameter :: f_wsnow_HDO =44 ! water: precip, frozen - integer(in),parameter :: f_wevap_HDO =45 ! water: evaporation - integer(in),parameter :: f_wroff_HDO =46 ! water: runoff/flood - integer(in),parameter :: f_wioff_HDO =47 ! water: frozen runoff + integer(in),parameter :: f_hpolar =11 ! heat : AIS imbalance + integer(in),parameter :: f_hh2ot =12 ! heat : water temperature + integer(in),parameter :: f_wfrz =13 ! water: freezing + integer(in),parameter :: f_wmelt =14 ! water: melting + integer(in),parameter :: f_wrain =15 ! water: precip, liquid + integer(in),parameter :: f_wsnow =16 ! water: precip, frozen + integer(in),parameter :: f_wpolar =17 ! water: AIS imbalance + integer(in),parameter :: f_wevap =18 ! water: evaporation + integer(in),parameter :: f_wroff =19 ! water: runoff/flood + integer(in),parameter :: f_wioff =20 ! water: frozen runoff + integer(in),parameter :: f_wirrig =21 ! water: irrigation + integer(in),parameter :: f_wfrz_16O =22 ! water: freezing + integer(in),parameter :: f_wmelt_16O =23 ! water: melting + integer(in),parameter :: f_wrain_16O =24 ! water: precip, liquid + integer(in),parameter :: f_wsnow_16O =25 ! water: precip, frozen + integer(in),parameter :: f_wevap_16O =26 ! water: evaporation + integer(in),parameter :: f_wroff_16O =27 ! water: runoff/flood + integer(in),parameter :: f_wioff_16O =28 ! water: frozen runoff + integer(in),parameter :: f_wfrz_18O =29 ! water: freezing + integer(in),parameter :: f_wmelt_18O =30 ! water: melting + integer(in),parameter :: f_wrain_18O =31 ! water: precip, liquid + integer(in),parameter :: f_wsnow_18O =32 ! water: precip, frozen + integer(in),parameter :: f_wevap_18O =33 ! water: evaporation + integer(in),parameter :: f_wroff_18O =34 ! water: runoff/flood + integer(in),parameter :: f_wioff_18O =35 ! water: frozen runoff + integer(in),parameter :: f_wfrz_HDO =36 ! water: freezing + integer(in),parameter :: f_wmelt_HDO =37 ! water: melting + integer(in),parameter :: f_wrain_HDO =38 ! water: precip, liquid + integer(in),parameter :: f_wsnow_HDO =39 ! water: precip, frozen + integer(in),parameter :: f_wevap_HDO =40 ! water: evaporation + integer(in),parameter :: f_wroff_HDO =41 ! water: runoff/flood + integer(in),parameter :: f_wioff_HDO =42 ! water: frozen runoff integer(in),parameter :: f_size = f_wioff_HDO ! Total array size of all elements integer(in),parameter :: f_a = f_area ! 1st index for area @@ -194,10 +189,8 @@ module seq_diag_mct (/' area',' hfreeze',' hmelt',' hnetsw',' hlwdn', & ' hlwup',' hlatvap',' hlatfus',' hiroff',' hsen', & - ' hberg',' hism',' hriof', & - ' hh2otemp',' wfreeze',' wmelt',' wrain', & - ' wsnow',' wevap',' wrunoff',' wfrzrof', & - ' wberg',' wism',' wrrof',' wriof', & + ' hpolar',' hh2otemp',' wfreeze',' wmelt',' wrain', & + ' wsnow',' wpolar',' wevap',' wrunoff',' wfrzrof', & ' wirrig', & ' wfreeze_16O',' wmelt_16O',' wrain_16O',' wsnow_16O', & ' wevap_16O',' wrunoff_16O',' wfrzrof_16O', & @@ -1386,11 +1379,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') - index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw') - index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl') - index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi') - index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh') - index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih') + index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') + index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl',perrWith='quiet') + index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi',perrWith='quiet') + index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh',perrWith='quiet') + index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih',perrWith='quiet') end if lSize = mct_avect_lSize(o2x_o) @@ -1403,11 +1396,16 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_wfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_frazil,n)) nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) - nf = f_wism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) - nf = f_wrrof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) - nf = f_wriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) - nf = f_hism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) - nf = f_hriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) +! nf = f_wism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) +! nf = f_wrrof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) +! nf = f_wriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) +! nf = f_hism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) +! nf = f_hriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end do end if @@ -1514,11 +1512,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_hmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_melth,n) nf = f_hswnet; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_swnet,n) nf = f_hlwdn ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_lwdn,n) - nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergh,n) + nf = f_hpolar; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergh,n) nf = f_wmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_meltw,n) nf = f_wrain ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_rain,n) nf = f_wsnow ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_snow,n) - nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergw,n) + nf = f_wpolar; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergw,n) nf = f_wroff ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_rofl,n) nf = f_wioff ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_rofi,n) From 2f4d71369e33b94a1e821901155d9281962b4b87 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Thu, 22 Feb 2024 12:18:15 -0600 Subject: [PATCH 063/310] Only send new coupling fields in polar configurations --- components/mpas-ocean/driver/ocn_comp_mct.F | 1 - driver-mct/cime_config/buildnml | 1 + .../cime_config/config_component_e3sm.xml | 12 +++ .../cime_config/namelist_definition_drv.xml | 12 +++ driver-mct/main/seq_diag_mct.F90 | 37 ++++----- driver-mct/shr/seq_flds_mod.F90 | 83 +++++++++++-------- 6 files changed, 88 insertions(+), 58 deletions(-) diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F index 67f465b9332..86ea9290c01 100644 --- a/components/mpas-ocean/driver/ocn_comp_mct.F +++ b/components/mpas-ocean/driver/ocn_comp_mct.F @@ -689,7 +689,6 @@ end subroutine xml_stream_get_attributes if ( ierr /= 0 ) then write(ocnLogUnit,*) 'Fail to set define dom fields ' endif - ent_type = 1 ! cells diff --git a/driver-mct/cime_config/buildnml b/driver-mct/cime_config/buildnml index 426995b8ffb..4938e9da0b1 100755 --- a/driver-mct/cime_config/buildnml +++ b/driver-mct/cime_config/buildnml @@ -40,6 +40,7 @@ def _create_drv_namelists(case, infile, confdir, nmlgen, files): config['CPL_ALBAV'] = case.get_value('CPL_ALBAV') config['CPL_EPBAL'] = case.get_value('CPL_EPBAL') config['FLDS_WISO'] = case.get_value('FLDS_WISO') + config['FLDS_POLAR'] = case.get_value('FLDS_POLAR') config['BUDGETS'] = case.get_value('BUDGETS') config['MACH'] = case.get_value('MACH') config['MPILIB'] = case.get_value('MPILIB') diff --git a/driver-mct/cime_config/config_component_e3sm.xml b/driver-mct/cime_config/config_component_e3sm.xml index 5d582b41b43..a6f756b24b2 100755 --- a/driver-mct/cime_config/config_component_e3sm.xml +++ b/driver-mct/cime_config/config_component_e3sm.xml @@ -172,6 +172,18 @@ Turn on the passing of water isotope fields through the coupler + + logical + TRUE,FALSE + FALSE + + TRUE + + run_flags + env_run.xml + Turn on the passing of polar fields through the coupler + + char minus1p8,linear_salt,mushy diff --git a/driver-mct/cime_config/namelist_definition_drv.xml b/driver-mct/cime_config/namelist_definition_drv.xml index 038444efa94..40c912b33ea 100644 --- a/driver-mct/cime_config/namelist_definition_drv.xml +++ b/driver-mct/cime_config/namelist_definition_drv.xml @@ -137,6 +137,18 @@ + + logical + seq_flds + seq_cplflds_inparm + + If set to .true. Polar fields will be passed from the ocean to the coupler. + + + $FLDS_POLAR + + + logical seq_flds diff --git a/driver-mct/main/seq_diag_mct.F90 b/driver-mct/main/seq_diag_mct.F90 index 9d9df6fd3ab..627cbcc001e 100644 --- a/driver-mct/main/seq_diag_mct.F90 +++ b/driver-mct/main/seq_diag_mct.F90 @@ -317,8 +317,6 @@ module seq_diag_mct integer :: index_i2x_Fioi_melth integer :: index_i2x_Fioi_meltw - integer :: index_i2x_Fioi_bergh - integer :: index_i2x_Fioi_bergw integer :: index_i2x_Fioi_salt integer :: index_i2x_Faii_swnet integer :: index_i2x_Fioi_swpen @@ -1346,6 +1344,7 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa real(r8) :: ca_i,ca_o,ca_c ! area of a grid cell logical,save :: first_time = .true. logical,save :: flds_wiso_ocn = .false. + logical,save :: flds_polar = .false. !----- formats ----- character(*),parameter :: subName = '(seq_diag_ocn_mct) ' @@ -1379,11 +1378,14 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') - index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') - index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl',perrWith='quiet') - index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi',perrWith='quiet') - index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh',perrWith='quiet') - index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih',perrWith='quiet') + index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') + if ( index_o2x_Foxo_ismw /= 0 ) flds_polar = .true. + if ( flds_polar ) then + index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl',perrWith='quiet') + index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi',perrWith='quiet') + index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh',perrWith='quiet') + index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih',perrWith='quiet') + end if end if lSize = mct_avect_lSize(o2x_o) @@ -1396,16 +1398,13 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_wfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_frazil,n)) nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) - nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) - nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) - nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) -! nf = f_wism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) -! nf = f_wrrof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) -! nf = f_wriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) - nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) - nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) -! nf = f_hism; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) -! nf = f_hriof; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) + if (flds_polar) then + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) + end if end do end if @@ -1635,8 +1634,6 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) if (present(do_i2x)) then index_i2x_Fioi_melth = mct_aVect_indexRA(i2x_i,'Fioi_melth') index_i2x_Fioi_meltw = mct_aVect_indexRA(i2x_i,'Fioi_meltw') -! index_i2x_Fioi_bergh = mct_aVect_indexRA(i2x_i,'PFioi_bergh') -! index_i2x_Fioi_bergw = mct_aVect_indexRA(i2x_i,'PFioi_bergw') index_i2x_Fioi_swpen = mct_aVect_indexRA(i2x_i,'Fioi_swpen') index_i2x_Faii_swnet = mct_aVect_indexRA(i2x_i,'Faii_swnet') index_i2x_Faii_lwup = mct_aVect_indexRA(i2x_i,'Faii_lwup') @@ -1672,9 +1669,7 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) nf = f_hlwup ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lwup,n) nf = f_hlatv ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lat,n) nf = f_hsen ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_sen,n) -! nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergh,n) nf = f_wmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_i*i2x_i%rAttr(index_i2x_Fioi_meltw,n) -! nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergw,n) nf = f_wevap ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_evap,n) if ( flds_wiso_ice )then diff --git a/driver-mct/shr/seq_flds_mod.F90 b/driver-mct/shr/seq_flds_mod.F90 index cb41fa6439f..bbc7795442d 100644 --- a/driver-mct/shr/seq_flds_mod.F90 +++ b/driver-mct/shr/seq_flds_mod.F90 @@ -379,10 +379,11 @@ subroutine seq_flds_set(nmlfile, ID, infodata) logical :: flds_co2_dmsa logical :: flds_bgc_oi logical :: flds_wiso + logical :: flds_polar integer :: glc_nec namelist /seq_cplflds_inparm/ & - flds_co2a, flds_co2b, flds_co2c, flds_co2_dmsa, flds_wiso, glc_nec, & + flds_co2a, flds_co2b, flds_co2c, flds_co2_dmsa, flds_wiso, flds_polar, glc_nec, & ice_ncat, seq_flds_i2o_per_cat, flds_bgc_oi, & nan_check_component_fields, rof_heat, atm_flux_method, atm_gustiness, & rof2ocn_nutrients, lnd_rof_two_way, ocn_rof_two_way, rof_sed @@ -416,6 +417,7 @@ subroutine seq_flds_set(nmlfile, ID, infodata) flds_co2_dmsa = .false. flds_bgc_oi = .false. flds_wiso = .false. + flds_polar = .false. glc_nec = 0 ice_ncat = 1 seq_flds_i2o_per_cat = .false. @@ -449,6 +451,7 @@ subroutine seq_flds_set(nmlfile, ID, infodata) call shr_mpi_bcast(flds_co2_dmsa, mpicom) call shr_mpi_bcast(flds_bgc_oi , mpicom) call shr_mpi_bcast(flds_wiso , mpicom) + call shr_mpi_bcast(flds_polar , mpicom) call shr_mpi_bcast(glc_nec , mpicom) call shr_mpi_bcast(ice_ncat , mpicom) call shr_mpi_bcast(seq_flds_i2o_per_cat, mpicom) @@ -1583,45 +1586,53 @@ subroutine seq_flds_set(nmlfile, ID, infodata) attname = 'PFioi_bergw' call metadata_set(attname, longname, stdname, units) - ! Water flux from ice shelf melt - call seq_flds_add(o2x_fluxes,"Foxo_ismw") - longname = 'Water flux due to basal melting of ice shelves' - stdname = 'basal_iceshelf_melt_flux' - units = 'kg m-2 s-1' - attname = 'Foxo_ismw' - call metadata_set(attname, longname, stdname, units) + !-------------------------------- + ! ocn<->cpl only exchange - Polar + !-------------------------------- - ! Heat flux from ice shelf melt - call seq_flds_add(o2x_fluxes,"Foxo_ismh") - longname = 'Heat flux due to basal melting of ice shelves' - stdname = 'basal_iceshelf_heat_flux' - units = 'W m-2' - attname = 'Foxo_ismh' - call metadata_set(attname, longname, stdname, units) + if (flds_polar) then - ! Water flux from removed liquid runoff - call seq_flds_add(o2x_fluxes,"Foxo_rrofl") - longname = 'Water flux due to removed liqiud runoff' - stdname = 'removed_liquid_runoff_flux' - units = 'kg m-2 s-1' - attname = 'Foxo_rrofl' - call metadata_set(attname, longname, stdname, units) + ! Water flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismw") + longname = 'Water flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_melt_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_ismw' + call metadata_set(attname, longname, stdname, units) - ! Water flux from removed solid runoff - call seq_flds_add(o2x_fluxes,"Foxo_rrofi") - longname = 'Water flux due to removed solid runoff' - stdname = 'removed_solid_runoff_flux' - units = 'kg m-2 s-1' - attname = 'Foxo_rrofi' - call metadata_set(attname, longname, stdname, units) + ! Heat flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismh") + longname = 'Heat flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_heat_flux' + units = 'W m-2' + attname = 'Foxo_ismh' + call metadata_set(attname, longname, stdname, units) - ! Heat flux from removed solid runoff - call seq_flds_add(o2x_fluxes,"Foxo_rrofih") - longname = 'Heat flux due to removed solid runoff' - stdname = 'removed_solid_runoff_heat_flux' - units = 'W m-2' - attname = 'Foxo_rrofih' - call metadata_set(attname, longname, stdname, units) + ! Water flux from removed liquid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofl") + longname = 'Water flux due to removed liqiud runoff' + stdname = 'removed_liquid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofl' + call metadata_set(attname, longname, stdname, units) + + ! Water flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofi") + longname = 'Water flux due to removed solid runoff' + stdname = 'removed_solid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofi' + call metadata_set(attname, longname, stdname, units) + + ! Heat flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofih") + longname = 'Heat flux due to removed solid runoff' + stdname = 'removed_solid_runoff_heat_flux' + units = 'W m-2' + attname = 'Foxo_rrofih' + call metadata_set(attname, longname, stdname, units) + + end if ! Salt flux call seq_flds_add(i2x_fluxes,"Fioi_salt") From d7adcea88af839c46c1f0137bad102a77fc38ecc Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Thu, 22 Feb 2024 12:20:04 -0600 Subject: [PATCH 064/310] Adding analogs to driver-moab --- driver-moab/cime_config/buildnml | 1 + .../cime_config/config_component_e3sm.xml | 12 +++++ .../cime_config/namelist_definition_drv.xml | 12 +++++ driver-moab/main/seq_diag_mct.F90 | 37 ++++++++++++---- driver-moab/shr/seq_flds_mod.F90 | 44 ++++++++++++++++++- 5 files changed, 96 insertions(+), 10 deletions(-) diff --git a/driver-moab/cime_config/buildnml b/driver-moab/cime_config/buildnml index 0d282d40215..cfaa3c63f8b 100755 --- a/driver-moab/cime_config/buildnml +++ b/driver-moab/cime_config/buildnml @@ -40,6 +40,7 @@ def _create_drv_namelists(case, infile, confdir, nmlgen, files): config['CPL_ALBAV'] = case.get_value('CPL_ALBAV') config['CPL_EPBAL'] = case.get_value('CPL_EPBAL') config['FLDS_WISO'] = case.get_value('FLDS_WISO') + config['FLDS_POLAR'] = case.get_value('FLDS_POLAR') config['BUDGETS'] = case.get_value('BUDGETS') config['MACH'] = case.get_value('MACH') config['MPILIB'] = case.get_value('MPILIB') diff --git a/driver-moab/cime_config/config_component_e3sm.xml b/driver-moab/cime_config/config_component_e3sm.xml index dd7a5ddb6c1..708823bc070 100644 --- a/driver-moab/cime_config/config_component_e3sm.xml +++ b/driver-moab/cime_config/config_component_e3sm.xml @@ -172,6 +172,18 @@ Turn on the passing of water isotope fields through the coupler + + logical + TRUE,FALSE + FALSE + + TRUE + + run_flags + env_run.xml + Turn on the passing of polar fields through the coupler + + char minus1p8,linear_salt,mushy diff --git a/driver-moab/cime_config/namelist_definition_drv.xml b/driver-moab/cime_config/namelist_definition_drv.xml index 203c6cf5f07..49c77d853c5 100644 --- a/driver-moab/cime_config/namelist_definition_drv.xml +++ b/driver-moab/cime_config/namelist_definition_drv.xml @@ -149,6 +149,18 @@ + + logical + seq_flds + seq_cplflds_inparm + + If set to .true. Polar fields will be passed from the ocean to the coupler. + + + $FLDS_POLAR + + + char seq_flds diff --git a/driver-moab/main/seq_diag_mct.F90 b/driver-moab/main/seq_diag_mct.F90 index 2a7d999ccc5..34f97cb78ff 100644 --- a/driver-moab/main/seq_diag_mct.F90 +++ b/driver-moab/main/seq_diag_mct.F90 @@ -138,13 +138,13 @@ module seq_diag_mct integer(in),parameter :: f_hlatf = 8 ! heat : latent, fusion, snow integer(in),parameter :: f_hioff = 9 ! heat : latent, fusion, frozen runoff integer(in),parameter :: f_hsen =10 ! heat : sensible - integer(in),parameter :: f_hberg =11 ! heat : data icebergs + integer(in),parameter :: f_hpolar =11 ! heat : AIS imbalance integer(in),parameter :: f_hh2ot =12 ! heat : water temperature integer(in),parameter :: f_wfrz =13 ! water: freezing integer(in),parameter :: f_wmelt =14 ! water: melting integer(in),parameter :: f_wrain =15 ! water: precip, liquid integer(in),parameter :: f_wsnow =16 ! water: precip, frozen - integer(in),parameter :: f_wberg =17 ! water: data icebergs + integer(in),parameter :: f_wpolar =17 ! water: AIS imbalance integer(in),parameter :: f_wevap =18 ! water: evaporation integer(in),parameter :: f_wroff =19 ! water: runoff/flood integer(in),parameter :: f_wioff =20 ! water: frozen runoff @@ -189,8 +189,8 @@ module seq_diag_mct (/' area',' hfreeze',' hmelt',' hnetsw',' hlwdn', & ' hlwup',' hlatvap',' hlatfus',' hiroff',' hsen', & - ' hberg',' hh2otemp',' wfreeze',' wmelt',' wrain', & - ' wsnow',' wberg',' wevap',' wrunoff',' wfrzrof', & + ' hpolar',' hh2otemp',' wfreeze',' wmelt',' wrain', & + ' wsnow',' wpolar',' wevap',' wrunoff',' wfrzrof', & ' wirrig', & ' wfreeze_16O',' wmelt_16O',' wrain_16O',' wsnow_16O', & ' wevap_16O',' wrunoff_16O',' wfrzrof_16O', & @@ -288,6 +288,12 @@ module seq_diag_mct integer :: index_o2x_Fioo_frazil integer :: index_o2x_Fioo_q + integer :: index_o2x_Foxo_ismw + integer :: index_o2x_Foxo_rrofl + integer :: index_o2x_Foxo_rrofi + integer :: index_o2x_Foxo_ismh + integer :: index_o2x_Foxo_rrofih + integer :: index_xao_Faox_lwup integer :: index_xao_Faox_lat integer :: index_xao_Faox_sen @@ -1337,9 +1343,10 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa integer(in) :: kArea ! index of area field in aVect integer(in) :: ko,ki ! fraction indices integer(in) :: lSize ! size of aVect - real(r8) :: ca_i,ca_o ! area of a grid cell + real(r8) :: ca_i,ca_o,ca_c ! area of a grid cell logical,save :: first_time = .true. logical,save :: flds_wiso_ocn = .false. + logical,save :: flds_polar = .false. !----- formats ----- character(*),parameter :: subName = '(seq_diag_ocn_mct) ' @@ -1373,6 +1380,14 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') + index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') + if ( index_o2x_Foxo_ismw /= 0 ) flds_polar = .true. + if ( flds_polar ) then + index_o2x_Foxo_rrofl = mct_aVect_indexRA(o2x_o,'Foxo_rrofl',perrWith='quiet') + index_o2x_Foxo_rrofi = mct_aVect_indexRA(o2x_o,'Foxo_rrofi',perrWith='quiet') + index_o2x_Foxo_ismh = mct_aVect_indexRA(o2x_o,'Foxo_ismh',perrWith='quiet') + index_o2x_Foxo_rrofih = mct_aVect_indexRA(o2x_o,'Foxo_rrofih',perrWith='quiet') + end if end if lSize = mct_avect_lSize(o2x_o) @@ -1380,10 +1395,18 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa do n=1,lSize ca_o = dom_o%data%rAttr(kArea,n) * frac_o%rAttr(ko,n) ca_i = dom_o%data%rAttr(kArea,n) * frac_o%rAttr(ki,n) + ca_c = dom_o%data%rAttr(kArea,n) nf = f_area; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_o nf = f_wfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_frazil,n)) nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) + if (flds_polar) then + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) + end if end do end if @@ -1613,8 +1636,6 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) if (present(do_i2x)) then index_i2x_Fioi_melth = mct_aVect_indexRA(i2x_i,'Fioi_melth') index_i2x_Fioi_meltw = mct_aVect_indexRA(i2x_i,'Fioi_meltw') - index_i2x_Fioi_bergh = mct_aVect_indexRA(i2x_i,'PFioi_bergh') - index_i2x_Fioi_bergw = mct_aVect_indexRA(i2x_i,'PFioi_bergw') index_i2x_Fioi_swpen = mct_aVect_indexRA(i2x_i,'Fioi_swpen') index_i2x_Faii_swnet = mct_aVect_indexRA(i2x_i,'Faii_swnet') index_i2x_Faii_lwup = mct_aVect_indexRA(i2x_i,'Faii_lwup') @@ -1650,9 +1671,7 @@ subroutine seq_diag_ice_mct( ice, frac_i, infodata, do_i2x, do_x2i) nf = f_hlwup ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lwup,n) nf = f_hlatv ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_lat,n) nf = f_hsen ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_sen,n) - nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergh,n) nf = f_wmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_i*i2x_i%rAttr(index_i2x_Fioi_meltw,n) - nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*i2x_i%rAttr(index_i2x_Fioi_bergw,n) nf = f_wevap ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_i*i2x_i%rAttr(index_i2x_Faii_evap,n) if ( flds_wiso_ice )then diff --git a/driver-moab/shr/seq_flds_mod.F90 b/driver-moab/shr/seq_flds_mod.F90 index e03771a7a9c..3fafa8cd978 100644 --- a/driver-moab/shr/seq_flds_mod.F90 +++ b/driver-moab/shr/seq_flds_mod.F90 @@ -395,10 +395,11 @@ subroutine seq_flds_set(nmlfile, ID, infodata) logical :: flds_co2_dmsa logical :: flds_bgc_oi logical :: flds_wiso + logical :: flds_polar integer :: glc_nec namelist /seq_cplflds_inparm/ & - flds_co2a, flds_co2b, flds_co2c, flds_co2_dmsa, flds_wiso, glc_nec, & + flds_co2a, flds_co2b, flds_co2c, flds_co2_dmsa, flds_wiso, flds_polar, glc_nec, & ice_ncat, seq_flds_i2o_per_cat, flds_bgc_oi, & nan_check_component_fields, rof_heat, atm_flux_method, atm_gustiness, & rof2ocn_nutrients, lnd_rof_two_way, ocn_rof_two_way, rof_sed @@ -435,6 +436,7 @@ subroutine seq_flds_set(nmlfile, ID, infodata) flds_co2_dmsa = .false. flds_bgc_oi = .false. flds_wiso = .false. + flds_polar = .false. glc_nec = 0 ice_ncat = 1 seq_flds_i2o_per_cat = .false. @@ -468,6 +470,7 @@ subroutine seq_flds_set(nmlfile, ID, infodata) call shr_mpi_bcast(flds_co2_dmsa, mpicom) call shr_mpi_bcast(flds_bgc_oi , mpicom) call shr_mpi_bcast(flds_wiso , mpicom) + call shr_mpi_bcast(flds_polar , mpicom) call shr_mpi_bcast(glc_nec , mpicom) call shr_mpi_bcast(ice_ncat , mpicom) call shr_mpi_bcast(seq_flds_i2o_per_cat, mpicom) @@ -1602,6 +1605,45 @@ subroutine seq_flds_set(nmlfile, ID, infodata) attname = 'PFioi_bergw' call metadata_set(attname, longname, stdname, units) + !-------------------------------- + ! ocn<->cpl only exchange - Polar + !-------------------------------- + if (flds_polar) then + + ! Water flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismw") + longname = 'Water flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_melt_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_ismw' + call metadata_set(attname, longname, stdname, units) + + ! Heat flux from ice shelf melt + call seq_flds_add(o2x_fluxes,"Foxo_ismh") + longname = 'Heat flux due to basal melting of ice shelves' + stdname = 'basal_iceshelf_heat_flux' + units = 'W m-2' + attname = 'Foxo_ismh' + call metadata_set(attname, longname, stdname, units) + + ! Water flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofi") + longname = 'Water flux due to removed solid runoff' + stdname = 'removed_solid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofi' + call metadata_set(attname, longname, stdname, units) + + ! Heat flux from removed solid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofih") + longname = 'Heat flux due to removed solid runoff' + stdname = 'removed_solid_runoff_heat_flux' + units = 'W m-2' + attname = 'Foxo_rrofih' + call metadata_set(attname, longname, stdname, units) + + end if + ! Salt flux call seq_flds_add(i2x_fluxes,"Fioi_salt") call seq_flds_add(x2o_fluxes,"Fioi_salt") From c762d3ea531e20682261ad179565ab3576a6a6e3 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Sun, 25 Feb 2024 13:11:18 -0600 Subject: [PATCH 065/310] Making conditional for flds_polar more verbose --- driver-mct/cime_config/config_component_e3sm.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/driver-mct/cime_config/config_component_e3sm.xml b/driver-mct/cime_config/config_component_e3sm.xml index a6f756b24b2..b7a85c5e2cb 100755 --- a/driver-mct/cime_config/config_component_e3sm.xml +++ b/driver-mct/cime_config/config_component_e3sm.xml @@ -177,7 +177,9 @@ TRUE,FALSE FALSE - TRUE + TRUE + TRUE + TRUE run_flags env_run.xml From 8d0942f8a4cb9ee2e639870ce86dbaabe28c2fd4 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Sun, 25 Feb 2024 13:12:11 -0600 Subject: [PATCH 066/310] Remove setting flds_polar by xml so it can be set in user_nl_cpl --- driver-mct/cime_config/namelist_definition_drv.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/driver-mct/cime_config/namelist_definition_drv.xml b/driver-mct/cime_config/namelist_definition_drv.xml index 40c912b33ea..7fbf83688c8 100644 --- a/driver-mct/cime_config/namelist_definition_drv.xml +++ b/driver-mct/cime_config/namelist_definition_drv.xml @@ -137,7 +137,7 @@ - + logical seq_flds seq_cplflds_inparm From dc4b9c0ef5fc42f2523134a646f4fb8044dc2fd6 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Sun, 25 Feb 2024 13:15:39 -0600 Subject: [PATCH 067/310] Moving Registry unit changes out of this branch to its own --- .../Registry_conservation_check.xml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/components/mpas-ocean/src/analysis_members/Registry_conservation_check.xml b/components/mpas-ocean/src/analysis_members/Registry_conservation_check.xml index 295ad031930..5c20fd0a567 100644 --- a/components/mpas-ocean/src/analysis_members/Registry_conservation_check.xml +++ b/components/mpas-ocean/src/analysis_members/Registry_conservation_check.xml @@ -129,43 +129,43 @@ - - - - - - - - - - - - From 6d1b8a9201e681f0f35f32760ae25ef6a76ba548 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Sun, 25 Feb 2024 18:01:52 -0600 Subject: [PATCH 068/310] changes to driver-moab files to match driver-mct --- driver-moab/cime_config/config_component_e3sm.xml | 4 +++- driver-moab/cime_config/namelist_definition_drv.xml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/driver-moab/cime_config/config_component_e3sm.xml b/driver-moab/cime_config/config_component_e3sm.xml index 708823bc070..1d2b6b2e61d 100644 --- a/driver-moab/cime_config/config_component_e3sm.xml +++ b/driver-moab/cime_config/config_component_e3sm.xml @@ -177,7 +177,9 @@ TRUE,FALSE FALSE - TRUE + TRUE + TRUE + TRUE run_flags env_run.xml diff --git a/driver-moab/cime_config/namelist_definition_drv.xml b/driver-moab/cime_config/namelist_definition_drv.xml index 49c77d853c5..5510783582f 100644 --- a/driver-moab/cime_config/namelist_definition_drv.xml +++ b/driver-moab/cime_config/namelist_definition_drv.xml @@ -149,7 +149,7 @@ - + logical seq_flds seq_cplflds_inparm From 5b24073c4dea30eb34e4905356ceed738e2896df Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 27 Feb 2024 12:22:56 -0600 Subject: [PATCH 069/310] Changing sign on ismh term in hpolar budget, correcting berg terms in polar sum in driver-moab --- driver-mct/main/seq_diag_mct.F90 | 2 +- driver-moab/main/seq_diag_mct.F90 | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/driver-mct/main/seq_diag_mct.F90 b/driver-mct/main/seq_diag_mct.F90 index 627cbcc001e..bb597fd9783 100644 --- a/driver-mct/main/seq_diag_mct.F90 +++ b/driver-mct/main/seq_diag_mct.F90 @@ -1402,7 +1402,7 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) - nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end if end do diff --git a/driver-moab/main/seq_diag_mct.F90 b/driver-moab/main/seq_diag_mct.F90 index 34f97cb78ff..bb597fd9783 100644 --- a/driver-moab/main/seq_diag_mct.F90 +++ b/driver-moab/main/seq_diag_mct.F90 @@ -317,8 +317,6 @@ module seq_diag_mct integer :: index_i2x_Fioi_melth integer :: index_i2x_Fioi_meltw - integer :: index_i2x_Fioi_bergh - integer :: index_i2x_Fioi_bergw integer :: index_i2x_Fioi_salt integer :: index_i2x_Faii_swnet integer :: index_i2x_Fioi_swpen @@ -1404,7 +1402,7 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) - nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end if end do @@ -1513,11 +1511,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_hmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_melth,n) nf = f_hswnet; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_swnet,n) nf = f_hlwdn ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_lwdn,n) - nf = f_hberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergh,n) + nf = f_hpolar; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergh,n) nf = f_wmelt ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_meltw,n) nf = f_wrain ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_rain,n) nf = f_wsnow ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Faxa_snow,n) - nf = f_wberg ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergw,n) + nf = f_wpolar; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Fioi_bergw,n) nf = f_wroff ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_rofl,n) nf = f_wioff ; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*x2o_o%rAttr(index_x2o_Foxx_rofi,n) From 8ab1f4eae505ad9ff254217ac2452feb65cc0797 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 27 Feb 2024 19:02:26 -0600 Subject: [PATCH 070/310] Adding missing removed liquid runoff field to driver-moab --- driver-moab/shr/seq_flds_mod.F90 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/driver-moab/shr/seq_flds_mod.F90 b/driver-moab/shr/seq_flds_mod.F90 index 3fafa8cd978..0f9feea18ea 100644 --- a/driver-moab/shr/seq_flds_mod.F90 +++ b/driver-moab/shr/seq_flds_mod.F90 @@ -1626,6 +1626,14 @@ subroutine seq_flds_set(nmlfile, ID, infodata) attname = 'Foxo_ismh' call metadata_set(attname, longname, stdname, units) + ! Water flux from removed liquid runoff + call seq_flds_add(o2x_fluxes,"Foxo_rrofl") + longname = 'Water flux due to removed liqiud runoff' + stdname = 'removed_liquid_runoff_flux' + units = 'kg m-2 s-1' + attname = 'Foxo_rrofl' + call metadata_set(attname, longname, stdname, units) + ! Water flux from removed solid runoff call seq_flds_add(o2x_fluxes,"Foxo_rrofi") longname = 'Water flux due to removed solid runoff' From 7d8afb50583d346a7c84f5b96ee8c38fba714a93 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 14 Mar 2024 15:35:21 -0500 Subject: [PATCH 071/310] Minor edits and additions in response to PR review by M. Hoffman. --- cime_config/config_grids.xml | 2 +- cime_config/machines/config_machines.xml | 3 ++- .../bld/namelist_files/albany_input.yaml | 2 +- components/mpas-albany-landice/driver/glc_comp_mct.F | 8 +++----- driver-mct/cime_config/config_component.xml | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 0e3a7cf2960..f9fc81042c9 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -2918,7 +2918,7 @@ 427386 1 - mpas.gis1to10km is a variable-resolution, from 1- to 10-km, MALI grid of the Greenland Ice Sheet. + mpas.gis1to10kmR2 is an updated (fewer grid cells; improved optimization) variable-resolution, from 1- to 10-km, MALI grid of the Greenland Ice Sheet. diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 43afc5f8091..92bbe8ac77a 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -292,7 +292,8 @@ $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /global/cfs/cdirs/e3sm/3rdparty/adios2/2.9.1/cray-mpich-8.1.25/aocc-4.0.0; else echo "$ADIOS2_ROOT"; fi} - -1 + -1 + diff --git a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml index 1fd5e577c63..c61cb53005c 100644 --- a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml +++ b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml @@ -15,7 +15,7 @@ ANONYMOUS: Cubature Degree: 4 Basal Friction Coefficient: Type: Power Law - Power Exponent: 1.0 #left blank to cause an error if not filled + Power Exponent: 1.0 Mu Type: Field Effective Pressure Type: Hydrostatic Computed At Nodes Zero Effective Pressure On Floating Ice At Nodes: true diff --git a/components/mpas-albany-landice/driver/glc_comp_mct.F b/components/mpas-albany-landice/driver/glc_comp_mct.F index 1c7b63c084e..ac33d17b1f3 100644 --- a/components/mpas-albany-landice/driver/glc_comp_mct.F +++ b/components/mpas-albany-landice/driver/glc_comp_mct.F @@ -886,12 +886,10 @@ subroutine glc_run_mct( EClock, cdata_g, x2g_g, g2x_g)!{{{ ! will allow that. ! Finally, set whence to latest_before so we have piecewise-constant forcing. ! Could add, e.g., linear interpolation later. -! In coupled mode, we don't want to use forcing from a file - that should come from the coupler! -! call mpas_stream_mgr_read(stream_manager, whence=MPAS_STREAM_LATEST_BEFORE, ierr=err_tmp) -! err = ior(err, err_tmp) -! call mpas_stream_mgr_reset_alarms(stream_manager, direction=MPAS_STREAM_INPUT, ierr=err_tmp) -! err = ior(err, err_tmp) + ! NOTE: If any input ("forcing") files here contain fields that the coupler also passes, + ! the input file versions here will clobber the fields passed from the coupler. + call mpas_stream_mgr_read(domain % streamManager, whence=MPAS_STREAM_LATEST_BEFORE, saveActualWhen = .true., ierr=err_tmp) err = ior(err, err_tmp) call mpas_stream_mgr_reset_alarms(domain % streamManager, direction=MPAS_STREAM_INPUT, ierr=err_tmp) diff --git a/driver-mct/cime_config/config_component.xml b/driver-mct/cime_config/config_component.xml index 737ed23cd0e..09f8d4706a7 100644 --- a/driver-mct/cime_config/config_component.xml +++ b/driver-mct/cime_config/config_component.xml @@ -1085,7 +1085,7 @@ char - gland20,gland10,gland5,gland5UM,gland4,mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,mpas.gis1to10kmR2,null + mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,mpas.gis1to10kmR2,null gland5UM build_grid env_build.xml From 7077dbd3e13f39b19303c506a3ad24de7b25f955 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 14 Mar 2024 15:38:39 -0500 Subject: [PATCH 072/310] Remove extraneous comments from albany solver input file. --- .../mpas-albany-landice/bld/namelist_files/albany_input.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml index c61cb53005c..478ed9dd658 100644 --- a/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml +++ b/components/mpas-albany-landice/bld/namelist_files/albany_input.yaml @@ -1,8 +1,6 @@ %YAML 1.1 --- ANONYMOUS: -# In order to use ML, change Tpetra to Epetra in the following line, -# and "Preconditioner Type: MueLu" to " Preconditioner Type: ML" several lines below Build Type: Tpetra Problem: From 28b66fd969a017cf06aa672f172a9a067c113b49 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 14 Mar 2024 16:59:57 -0500 Subject: [PATCH 073/310] Remove support for CISM meshes. Remove no longer needed support for CISM Greenland meshes. Where a default mesh is asked for, it now points to mpas.gis20km. --- cime_config/config_grids.xml | 3 --- .../elm/bld/namelist_files/namelist_defaults.xml | 15 +-------------- .../namelist_files/namelist_defaults_overall.xml | 2 +- .../bld/namelist_files/namelist_definition.xml | 8 +++----- driver-mct/cime_config/config_component.xml | 2 +- driver-moab/cime_config/config_component.xml | 4 ++-- 6 files changed, 8 insertions(+), 26 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index f9fc81042c9..2c2258011f6 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -38,9 +38,6 @@ r05 r05 null - gland5UM - gland4 - gland4 null null null diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 8597e21773a..90b9d047e17 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -576,20 +576,7 @@ this mask will have smb calculated over the entire global land surface lnd/clm2/griddata/glcmaskdata_0.9x1.25_GIS_AIS.nc lnd/clm2/griddata/glcmaskdata_ne30np4_GIS_AIS_171002.nc - -glc/cism/griddata/glcmaskdata_48x96_Gland20km.nc -glc/cism/griddata/glcmaskdata_48x96_Gland10km.nc -glc/cism/griddata/glcmaskdata_48x96_Gland5km.nc -glc/cism/griddata/glcmaskdata_48x96_Gland5km.nc -glc/cism/griddata/glcmaskdata_0.9x1.25_Gland20km.nc -glc/cism/griddata/glcmaskdata_0.9x1.25_Gland10km.nc -glc/cism/griddata/glcmaskdata_0.9x1.25_Gland5km.nc -glc/cism/griddata/glcmaskdata_0.9x1.25_Gland5km.nc -glc/cism/griddata/glcmaskdata_1.9x2.5_Gland20km.nc -glc/cism/griddata/glcmaskdata_1.9x2.5_Gland10km.nc -glc/cism/griddata/glcmaskdata_1.9x2.5_Gland5km.nc -glc/cism/griddata/glcmaskdata_1.9x2.5_Gland5km.nc - + glc/cism/griddata/glcmaskdata_0.9x1.25_Gland5km.nc lnd/clm2/griddata/glcmaskdata_0.9x1.25_60S.nc lnd/clm2/griddata/glcmaskdata_0.5x0.5_everywhere.nc diff --git a/components/elm/bld/namelist_files/namelist_defaults_overall.xml b/components/elm/bld/namelist_files/namelist_defaults_overall.xml index 5bbe8211a64..daf8ae6b959 100644 --- a/components/elm/bld/namelist_files/namelist_defaults_overall.xml +++ b/components/elm/bld/namelist_files/namelist_defaults_overall.xml @@ -90,7 +90,7 @@ determine default values for namelists. none -gland5UM +mpas.gis20km .false. .true. 0 diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index 1353f8b84b6..c8d22c054cd 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -215,12 +215,10 @@ Normally this is ONLY used when running CESM with the active glacier model. + group="elm_inparm" valid_values="mpas.gis20km,mpas.gis1to10km" > Glacier model grid - gland20 = Greenland at 20km resolution - gland10 = Greenland at 10km resolution - gland5 = Greenland at 5km resolution - gland5UM = Greenland at 5km resolution, using new UMontana ice sheet data for present day Greenland + mpas.gis20km = Greenland at 20km resolution + mpas.gis1to10km = Greenland at variable resolution (1-to-10km) char mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,mpas.gis1to10kmR2,null - gland5UM + mpas.gis20km build_grid env_build.xml glacier (glc) grid - DO NOT EDIT (for experts only) diff --git a/driver-moab/cime_config/config_component.xml b/driver-moab/cime_config/config_component.xml index 8e4e686aa1c..e497381a333 100644 --- a/driver-moab/cime_config/config_component.xml +++ b/driver-moab/cime_config/config_component.xml @@ -1085,8 +1085,8 @@ char - gland20,gland10,gland5,gland5UM,gland4,mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,null - gland5UM + mpas.aisgis20km,mpas.gis20km,mpas.ais20km,mpas.gis1to10km,gis1to10kmR2,null + mpas.gis20km build_grid env_build.xml glacier (glc) grid - DO NOT EDIT (for experts only) From 098651e7bcbafe65b0e2e1cbec1fdb30b64f1524 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Mon, 25 Mar 2024 09:58:07 -0700 Subject: [PATCH 074/310] Renames ERA5_6HR to ERA56HR --- .../datm/cime_config/config_component.xml | 16 ++- .../cime_config/namelist_definition_datm.xml | 128 +++++++++--------- 2 files changed, 75 insertions(+), 69 deletions(-) diff --git a/components/data_comps/datm/cime_config/config_component.xml b/components/data_comps/datm/cime_config/config_component.xml index 4c7d32413ac..f3016f784e4 100644 --- a/components/data_comps/datm/cime_config/config_component.xml +++ b/components/data_comps/datm/cime_config/config_component.xml @@ -10,14 +10,14 @@ This file may have atm desc entries. --> - Data driven ATM + Data driven ATM QIAN data set QIAN with water isotopes CRUNCEP data set CLM CRU NCEP v7 data set GSWP3v1 data set Fifth generation ECMWF reanalysis - Fifth generation ECMWF reanalysis,6 hourly data + Fifth generation ECMWF reanalysis,6 hourly data MOSART test data set using older NLDAS data NLDAS2 regional 0.125 degree data set over the U.S. (25-53N, 235-293E). WARNING: Garbage data will be produced for runs extending beyond this regional domain. Coupler hist data set (in this mode, it is strongly recommended that the model domain and the coupler history forcing are on the same domain) @@ -45,13 +45,13 @@ char - CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ELMERA5,ERA5_6HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR + CORE2_NYF,CORE2_IAF,CLM_QIAN,CLM_QIAN_WISO,CLM1PT,CLMCRUNCEP,CLMCRUNCEPv7,CLMGSWP3v1,ELMERA5,ERA56HR,CLMMOSARTTEST,CLMNLDAS2,CPLHIST,CORE_IAF_JRA,IAF_JRA_1p5,CORE_IAF_JRA_1p4_2018,CORE_RYF8485_JRA,CORE_RYF9091_JRA,CORE_RYF0304_JRA,CFSv2,CFSR CORE2_NYF run_component_datm env_run.xml Mode for data atmosphere component. CORE2_NYF (CORE2 normal year forcing) are modes used in forcing prognostic ocean/sea-ice components. - CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, ELMERA5,ERA5_6HR, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. + CLM_QIAN, CLMCRUNCEP, CLMCRUNCEPv7, CLMGSWP3v1, ELMERA5,ERA56HR, CLMMOSARTTEST, CLMNLDAS2 and CLM1PT are modes using observational data for forcing prognostic land components. WARNING for CLMNLDAS2: This is a regional forcing dataset over the U.S. (25-53N, 235-293E). Garbage data will be produced for runs extending beyond this regional domain. WARNING for CLMGSWP3v1: Humidity is identically zero for last time step in Dec/2013 and all of 2014 so you should NOT use 2014 data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). @@ -71,7 +71,7 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). CLMCRUNCEPv7 CLMGSWP3v1 ELMERA5 - ERA5_6HR + ERA56HR CLMMOSARTTEST CLMNLDAS2 CLM1PT @@ -247,6 +247,8 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START run_component_datm env_run.xml @@ -290,6 +292,8 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). 2005 2002 1958 + 1979 + 1979 run_component_datm env_run.xml @@ -334,6 +338,8 @@ data (see cime issue #3653 -- https://github.com/ESMCI/cime/issues/3653). 2003 2016 2020 + 1979 + 1979 run_component_datm env_run.xml diff --git a/components/data_comps/datm/cime_config/namelist_definition_datm.xml b/components/data_comps/datm/cime_config/namelist_definition_datm.xml index 10c51a6bee1..faba5ddaccc 100644 --- a/components/data_comps/datm/cime_config/namelist_definition_datm.xml +++ b/components/data_comps/datm/cime_config/namelist_definition_datm.xml @@ -37,7 +37,7 @@ CLMCRUNCEPv7 = Run with the CLM CRU NCEP V7 forcing valid from 1900 to 2010 (force CLM) CLMGSWP3v1 = Run with the CLM GSWP3 V1 forcing (force CLM) ELMERA5 = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present - ERA5_6HR = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present + ERA56HR = Run with the ELM fifth generation ECMWF reanalysis from 1979 to present CLMMOSARTTEST = Run with the CLM NLDAS data (force CLM) for testing MOSART CLMNLDAS2 = Run with the CLM NLDAS2 regional forcing valid from 1980 to 2018 (force CLM) CLM1PT = Run with supplied single point data (force CLM) @@ -116,15 +116,15 @@ ELMERA5.w10 # wind speed at 10 m ELMERA5.msdwlwrf # mean surface downward longwave radiation flux - ERA5_6HR.msdrswrf # mean surface direct shortwave radiation flux - ERA5_6HR.msdfswrf # mean surface diffuse shortwave radiation flux - ERA5_6HR.mcpr # mean convective precipitation rate - ERA5_6HR.mlspr # mean large-scale precipitation rate - ERA5_6HR.t2m # temperature at 2 m - ERA5_6HR.sp # surface pressure - ERA5_6HR.d2m # dew point temperature at 2 m - ERA5_6HR.w10 # wind speed at 10 m - ERA5_6HR.msdwlwrf # mean surface downward longwave radiation flux + ERA56HR.msdrswrf # mean surface direct shortwave radiation flux + ERA56HR.msdfswrf # mean surface diffuse shortwave radiation flux + ERA56HR.mcpr # mean convective precipitation rate + ERA56HR.mlspr # mean large-scale precipitation rate + ERA56HR.t2m # temperature at 2 m + ERA56HR.sp # surface pressure + ERA56HR.d2m # dew point temperature at 2 m + ERA56HR.w10 # wind speed at 10 m + ERA56HR.msdwlwrf # mean surface downward longwave radiation flux CLMMOSARTTEST @@ -225,7 +225,7 @@ CLMCRUNCEPv7.Solar,CLMCRUNCEPv7.Precip,CLMCRUNCEPv7.TPQW CLMGSWP3v1.Solar,CLMGSWP3v1.Precip,CLMGSWP3v1.TPQW ELMERA5.msdrswrf,ELMERA5.msdfswrf,ELMERA5.mcpr,ELMERA5.mlspr,ELMERA5.t2m,ELMERA5.sp,ELMERA5.d2m,ELMERA5.w10,ELMERA5.msdwlwrf - ERA5_6HR.msdrswrf,ERA5_6HR.msdfswrf,ERA5_6HR.mcpr,ERA5_6HR.mlspr,ERA5_6HR.t2m,ERA5_6HR.sp,ERA5_6HR.d2m,ERA5_6HR.w10,ERA5_6HR.msdwlwrf + ERA56HR.msdrswrf,ERA56HR.msdfswrf,ERA56HR.mcpr,ERA56HR.mlspr,ERA56HR.t2m,ERA56HR.sp,ERA56HR.d2m,ERA56HR.w10,ERA56HR.msdwlwrf CLMMOSARTTEST CLMNLDAS2.Solar,CLMNLDAS2.Precip,CLMNLDAS2.TPQW CORE2_NYF.GISS,CORE2_NYF.GXGXS,CORE2_NYF.NCEP @@ -259,7 +259,7 @@ $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614 - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 $DIN_LOC_ROOT/share/domains/domain.clm $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.cruncep_qianFill.0.5d.V5.c140715 $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.GSWP3.0.5d.v1.c170516 @@ -329,7 +329,7 @@ domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.360x720_gswp3.0v1.c170606.nc domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc domain.lnd.nldas2_0224x0464_c110415.nc domain.lnd.0.125nldas2_0.125nldas2.190410.nc nyf.giss.T62.051007.nc @@ -515,15 +515,15 @@ $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind - $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind + $DIN_LOC_ROOT_CLMFORC/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn $DIN_LOC_ROOT/atm/datm7/NLDAS $DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.NLDAS2.0.125d.v1/Solar $DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.NLDAS2.0.125d.v1/Precip @@ -608,15 +608,15 @@ elmforc.ERA5.c2018.0.25d.d2m.%ym.nc elmforc.ERA5.c2018.0.25d.w10.%ym.nc elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc - elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc - elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc - elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc - elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc - elmforc.ERA5.c2018.0.25d.t2m.%ym.nc - elmforc.ERA5.c2018.0.25d.sp.%ym.nc - elmforc.ERA5.c2018.0.25d.d2m.%ym.nc - elmforc.ERA5.c2018.0.25d.w10.%ym.nc - elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdrswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.msdfswrf.%ym.nc + elmforc.ERA5.c2018.0.25d.mcpr.%ym.nc + elmforc.ERA5.c2018.0.25d.mlspr.%ym.nc + elmforc.ERA5.c2018.0.25d.t2m.%ym.nc + elmforc.ERA5.c2018.0.25d.sp.%ym.nc + elmforc.ERA5.c2018.0.25d.d2m.%ym.nc + elmforc.ERA5.c2018.0.25d.w10.%ym.nc + elmforc.ERA5.c2018.0.25d.msdwlwrf.%ym.nc clmforc.nldas.%ym.nc ctsmforc.NLDAS2.0.125d.v1.Solr.%ym.nc ctsmforc.NLDAS2.0.125d.v1.Prec.%ym.nc @@ -1614,31 +1614,31 @@ msdwlwrf lwdn - + msdrswrf swdndr - + msdfswrf swdndf - + mcpr precc - + mlspr precl - + t2m tbot - + sp pbot - + d2m tdew - + w10 wind - + msdwlwrf lwdn @@ -1912,7 +1912,7 @@ $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN - $DATM_CLMNCEP_YR_ALIGN + $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN $DATM_CLMNCEP_YR_ALIGN 1 @@ -1964,7 +1964,7 @@ $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START - $DATM_CLMNCEP_YR_START + $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START $DATM_CLMNCEP_YR_START 1 @@ -2037,7 +2037,7 @@ $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END - $DATM_CLMNCEP_YR_END + $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END $DATM_CLMNCEP_YR_END 1 @@ -2117,11 +2117,11 @@ -60 -60 -60 - -21600 - -21600 - -60 - -60 - -60 + -21600 + -21600 + -60 + -60 + -60 @@ -2189,7 +2189,7 @@ NULL CLMNCEP CLMNCEP - CLMNCEP + CLMNCEP CORE2_NYF CORE2_IAF CORE_IAF_JRA @@ -2231,7 +2231,7 @@ nn copy - copy + copy @@ -2391,11 +2391,11 @@ upper linear linear - coszen - coszen - upper - linear - linear + coszen + coszen + upper + linear + linear coszen nearest nearest @@ -2497,15 +2497,15 @@ 2.5 2.5 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 - 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 + 2.5 From f73612909cda7b3c5379b838f841bfc7e598e542 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Mon, 25 Mar 2024 10:03:23 -0700 Subject: [PATCH 075/310] Adds compsets for ERA5 and ERA5 6Hourly DATM --- components/elm/cime_config/config_compsets.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/elm/cime_config/config_compsets.xml b/components/elm/cime_config/config_compsets.xml index 01366aa71dd..8af60d5d15b 100644 --- a/components/elm/cime_config/config_compsets.xml +++ b/components/elm/cime_config/config_compsets.xml @@ -24,6 +24,16 @@ 1850_DATM%QIA_ELM%SPBC_SICE_SOCN_MOSART_SGLC_SWAV + + IERA5ELM + 2000_DATM%ERA5_ELM%SP_SICE_SOCN_MOSART_SGLC_SWAV + + + + IERA56HRELM + 2000_DATM%ERA56HR_ELM%SP_SICE_SOCN_MOSART_SGLC_SWAV + + IELM 2000_DATM%QIA_ELM%SP_SICE_SOCN_MOSART_SGLC_SWAV From d0a7f8dab61aacd49deff1dffa5b7df4e907be1a Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Mon, 25 Mar 2024 11:44:50 -0700 Subject: [PATCH 076/310] Adds two tests --- cime_config/tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cime_config/tests.py b/cime_config/tests.py index 5e94f9c3007..7c3f9529574 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -48,6 +48,8 @@ "ERS.f19_g16.I1850GSWCNPECACNTBC.elm-eca_f19_g16_I1850GSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPECACNTBC.elm-eca_f19_g16_I20TRGSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPRDCTCBC.elm-ctc_f19_g16_I20TRGSWCNPRDCTCBC", + "ERS.f19_g16.IERA5ELM", + "ERS.f19_g16.IERA56HRELM", ) }, From dcf1e150716342e377bffabd7a70aec6dd36a4e3 Mon Sep 17 00:00:00 2001 From: Tian Zhou Date: Mon, 26 Feb 2024 19:15:01 -0600 Subject: [PATCH 077/310] add rof 025 --- cime_config/config_grids.xml | 10 ++++++++++ .../bld/namelist_files/namelist_defaults_mosart.xml | 2 ++ components/mosart/cime_config/buildnml | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index f1178681910..2a724dd7468 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -681,6 +681,16 @@ oEC60to30v3 + + r025 + r025 + r025 + r025 + null + null + oEC60to30v3 + + r0125 r0125 diff --git a/components/mosart/bld/namelist_files/namelist_defaults_mosart.xml b/components/mosart/bld/namelist_files/namelist_defaults_mosart.xml index 9a7c5e4eeae..1f7e4472212 100644 --- a/components/mosart/bld/namelist_files/namelist_defaults_mosart.xml +++ b/components/mosart/bld/namelist_files/namelist_defaults_mosart.xml @@ -42,12 +42,14 @@ for the CLM data in the CESM distribution rof/mosart/MOSART_global_8th_20180211c.nc +rof/mosart/MOSART_global_qd_20240212.v3.nc rof/mosart/MOSART_global_half_20180721a.nc rof/mosart/MOSART_Global_2deg_antarctica_flowing_to_north_c09162020.nc rof/mosart/MOSART_NLDAS_8th_20160426.nc share/meshes/rof/MOSART_global_8th.scrip.20180211c.nc +share/meshes/rof/SCRIPgrid_0.25x0.25_nomask_c200309.nc share/meshes/rof/SCRIPgrid_0.5x0.5_nomask_c110308.nc share/meshes/rof/SCRIPgrid_2x2_nomask_c210211.nc diff --git a/components/mosart/cime_config/buildnml b/components/mosart/cime_config/buildnml index ba015b01f6a..90b3b3bb379 100755 --- a/components/mosart/cime_config/buildnml +++ b/components/mosart/cime_config/buildnml @@ -46,8 +46,8 @@ def buildnml(case, caseroot, compname): # Verify rof grid is supported #-------------------------------------------------------------------- - rof_grid_supported = ("null", "r2", "r05", "r0125", "r01", "NLDAS", "ELM_USRDAT") - expect(rof_grid in rof_grid_supported, "ROF_GRID '{}' is not supported in mosart. Choose from: null, r2, r05, r0125, r01, NLDAS, ELM_USRDAT".format(rof_grid)) + rof_grid_supported = ("null", "r2", "r05", "r025", "r0125", "r01", "NLDAS", "ELM_USRDAT") + expect(rof_grid in rof_grid_supported, "ROF_GRID '{}' is not supported in mosart. Choose from: null, r2, r05, r025, r0125, r01, NLDAS, ELM_USRDAT".format(rof_grid)) #-------------------------------------------------------------------- # Invoke mosart build-namelist - output will go in $CASEBUILD/mosartconf From d92858a279672358454dec032fd540d7efb05c04 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 26 Mar 2024 13:22:23 -0500 Subject: [PATCH 078/310] Adding coupling fields for land ice frazil mass/heat --- .../mpas-ocean/driver/mpaso_cpl_indices.F | 4 ++++ components/mpas-ocean/driver/ocn_comp_mct.F | 13 ++++++++--- .../mpas_ocn_conservation_check.F | 22 +++++-------------- driver-mct/main/seq_diag_mct.F90 | 6 +++++ driver-mct/shr/seq_flds_mod.F90 | 16 ++++++++++++++ driver-moab/main/seq_diag_mct.F90 | 6 +++++ driver-moab/shr/seq_flds_mod.F90 | 16 ++++++++++++++ 7 files changed, 64 insertions(+), 19 deletions(-) diff --git a/components/mpas-ocean/driver/mpaso_cpl_indices.F b/components/mpas-ocean/driver/mpaso_cpl_indices.F index 5fd341993c5..f099cf8ea46 100644 --- a/components/mpas-ocean/driver/mpaso_cpl_indices.F +++ b/components/mpas-ocean/driver/mpaso_cpl_indices.F @@ -17,7 +17,9 @@ module mpaso_cpl_indices integer :: index_o2x_So_dhdx integer :: index_o2x_So_dhdy integer :: index_o2x_Fioo_q + integer :: index_o2x_Foxo_q_li integer :: index_o2x_Fioo_frazil + integer :: index_o2x_Foxo_frazil_li integer :: index_o2x_Faoo_h2otemp integer :: index_o2x_Faoo_fco2_ocn integer :: index_o2x_Faoo_fdms_ocn @@ -186,7 +188,9 @@ subroutine mpaso_cpl_indices_set( ) index_o2x_So_dhdx = mct_avect_indexra(o2x,'So_dhdx') index_o2x_So_dhdy = mct_avect_indexra(o2x,'So_dhdy') index_o2x_Fioo_q = mct_avect_indexra(o2x,'Fioo_q',perrWith='quiet') + index_o2x_Foxo_q_li = mct_avect_indexra(o2x,'Foxo_q_li',perrWith='quiet') index_o2x_Fioo_frazil = mct_avect_indexra(o2x,'Fioo_frazil',perrWith='quiet') + index_o2x_Foxo_frazil_li= mct_avect_indexra(o2x,'Foxo_frazil_li',perrWith='quiet') index_o2x_Faoo_h2otemp = mct_avect_indexra(o2x,'Faoo_h2otemp',perrWith='quiet') index_o2x_Faoo_fco2_ocn = mct_avect_indexra(o2x,'Faoo_fco2_ocn',perrWith='quiet') index_o2x_Faoo_fdms_ocn = mct_avect_indexra(o2x,'Faoo_fdms_ocn',perrWith='quiet') diff --git a/components/mpas-ocean/driver/ocn_comp_mct.F b/components/mpas-ocean/driver/ocn_comp_mct.F index 86ea9290c01..0097ac3f302 100644 --- a/components/mpas-ocean/driver/ocn_comp_mct.F +++ b/components/mpas-ocean/driver/ocn_comp_mct.F @@ -2882,6 +2882,10 @@ subroutine ocn_export_mct(o2x_o, errorCode) !{{{ o2x_o % rAttr(index_o2x_Fioo_q, n) = 0.0_RKIND o2x_o % rAttr(index_o2x_Fioo_frazil, n) = 0.0_RKIND + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + o2x_o % rAttr(index_o2x_Foxo_q_li, n) = accumulatedFrazilIceMass(i) * config_frazil_heat_of_fusion / ocn_cpl_dt + o2x_o % rAttr(index_o2x_Foxo_frazil_li, n) = accumulatedFrazilIceMass(i) / ocn_cpl_dt + endif end if @@ -4084,7 +4088,7 @@ subroutine ocn_export_moab(EClock) !{{{ call mpas_pool_get_array(statePool, 'accumulatedFrazilIceMass', accumulatedFrazilIceMass, 1) end if - if (trim(config_land_ice_flux_mode == 'standalone') .or. trim(config_land_ice_flux_mode) == 'data') then + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then call mpas_pool_get_array(forcingPool, 'avgLandIceFreshwaterFlux', avgLandIceFreshwaterFlux) call mpas_pool_get_array(forcingPool, 'avgLandIceHeatFlux', avgLandIceHeatFlux) endif @@ -4145,7 +4149,7 @@ subroutine ocn_export_moab(EClock) !{{{ o2x_om(n, index_o2x_Faoo_h2otemp) = avgTotalFreshWaterTemperatureFlux(i) * rho_sw * cp_sw - if (trim(config_land_ice_flux_mode == 'standalone') .or. trim(config_land_ice_flux_mode) == 'data') then + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then o2x_om(n, index_o2x_Foxo_ismw) = avgLandIceFreshwaterFlux(i) o2x_om(n, index_o2x_Foxo_ismh) = avgLandIceHeatFlux(i) endif @@ -4190,7 +4194,10 @@ subroutine ocn_export_moab(EClock) !{{{ o2x_om(n, index_o2x_Fioo_q) = 0.0_RKIND o2x_om(n, index_o2x_Fioo_frazil) = 0.0_RKIND - + if (trim(config_land_ice_flux_mode) == 'standalone' .or. trim(config_land_ice_flux_mode) == 'data') then + o2x_om(n, index_o2x_Foxo_q_li) = accumulatedFrazilIceMass(i) * config_frazil_heat_of_fusion / ocn_cpl_dt + o2x_om(n, index_o2x_Foxo_frazil_li) = accumulatedFrazilIceMass(i) / ocn_cpl_dt + endif end if ! Reset SeaIce Energy and Accumulated Frazil Ice diff --git a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F index 01f2b534546..ad262579044 100644 --- a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F +++ b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F @@ -598,16 +598,14 @@ subroutine energy_conservation(domain, err) enddo end if - if (landIceFreshwaterFluxesOn & - .and.config_use_frazil_ice_formation & - .and.config_frazil_under_land_ice) then + if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassOld, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassNew, 2) do iCell = 1, nCellsSolve ! Frazil ice mass is negative. Negative coefficient makes heat ! flux positive, because freezing ice releases heat. sumArray(18) = sumArray(18) - areaCell(iCell) * config_frazil_heat_of_fusion & - * (accumulatedLandIceFrazilMassNew(iCell) - accumulatedLandIceFrazilMassOld(iCell)) + * (accumulatedLandIceFrazilMassNew(iCell) - accumulatedLandIceFrazilMassOld(iCell))/dt enddo end if @@ -748,9 +746,7 @@ subroutine energy_conservation(domain, err) if (landIceFreshwaterFluxesOn) then v=accumulatedLandIceHeatFlux ; write(m,"('landIceHeatFlux ',es16.8,' ',f16.8)") v,v/A; call mpas_log_write(m); s=s+v end if - if (landIceFreshwaterFluxesOn & - .and.config_use_frazil_ice_formation & - .and.config_frazil_under_land_ice) then + if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then v=accumulatedLandIceFrazilHeatFlux ; write(m,"(' landIceFrazilHeatFlux ',es16.8,' (already in hfreeze, do not sum )',f16.8)") v,v/A; call mpas_log_write(m); ! no sum: s=s+v end if write(m,"('SUM EXPLICIT HEAT FLUXES ',es16.8,' ',f16.8)") s, s/A; call mpas_log_write(m) @@ -976,9 +972,7 @@ subroutine mass_conservation(domain, err) enddo end if - if (landIceFreshwaterFluxesOn & - .and.config_use_frazil_ice_formation & - .and.config_frazil_under_land_ice) then + if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassOld, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassNew, 2) do iCell = 1, nCellsSolve @@ -1101,9 +1095,7 @@ subroutine mass_conservation(domain, err) write(m,"(' SUM: ice runoff ',es16.8,' x2o_Foxx_rofi wfrzrof SUM ',f16.8)") v,v*c; call mpas_log_write(m) v=accumulatedLandIceFlux ; write(m,"('landIceFreshwaterFlux ',es16.8,' ',f16.8)") v,v*c; call mpas_log_write(m); s=s+v endif - if (landIceFreshwaterFluxesOn & - .and.config_use_frazil_ice_formation & - .and.config_frazil_under_land_ice) then + if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then v=accumulatedLandIceFrazilFlux ; write(m,"(' landIceFrazilFlux ',es16.8,' (already in wfreeze, do not sum )',f16.8)") v,v*c; call mpas_log_write(m); ! no sum: s=s+v endif write(m,"('SUM VOLUME FLUXES ',es16.8,' ',f16.8,es16.8)") s, s*c; call mpas_log_write(m) @@ -1258,9 +1250,7 @@ subroutine salt_conservation(domain, err) enddo end if - if (landIceFreshwaterFluxesOn & - .and.config_use_frazil_ice_formation & - .and.config_frazil_under_land_ice) then + if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassOld, 1) call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassNew, 2) do iCell = 1, nCellsSolve diff --git a/driver-mct/main/seq_diag_mct.F90 b/driver-mct/main/seq_diag_mct.F90 index bb597fd9783..8534008f9be 100644 --- a/driver-mct/main/seq_diag_mct.F90 +++ b/driver-mct/main/seq_diag_mct.F90 @@ -286,7 +286,9 @@ module seq_diag_mct integer :: index_o2x_Faoo_h2otemp integer :: index_o2x_Fioo_frazil + integer :: index_o2x_Foxo_frazil_li integer :: index_o2x_Fioo_q + integer :: index_o2x_Foxo_q_li integer :: index_o2x_Foxo_ismw integer :: index_o2x_Foxo_rrofl @@ -1376,7 +1378,9 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa if (present(do_o2x)) then if (first_time) then index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') + index_o2x_Foxo_frazil_li= mct_aVect_indexRA(o2x_o,'Foxo_frazil_li',perrWith='quiet') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') + index_o2x_Foxo_q_li = mct_aVect_indexRA(o2x_o,'Foxo_q_li',perrWith='quiet') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') if ( index_o2x_Foxo_ismw /= 0 ) flds_polar = .true. @@ -1399,9 +1403,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) if (flds_polar) then + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_frazil_li,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_q_li,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end if diff --git a/driver-mct/shr/seq_flds_mod.F90 b/driver-mct/shr/seq_flds_mod.F90 index bbc7795442d..dbfba0889d0 100644 --- a/driver-mct/shr/seq_flds_mod.F90 +++ b/driver-mct/shr/seq_flds_mod.F90 @@ -1592,6 +1592,22 @@ subroutine seq_flds_set(nmlfile, ID, infodata) if (flds_polar) then + ! Ocean Land ice freeze potential + call seq_flds_add(o2x_fluxes,"Foxo_q_li") + longname = 'Ocean land ice freeze potential' + stdname = 'ice_shelf_cavity_ice_heat_flux' + units = 'W m-2' + attname = 'Foxo_q_li' + call metadata_set(attname, longname, stdname, units) + + ! Ocean land ice frazil production + call seq_flds_add(o2x_fluxes,"Foxo_frazil_li") + longname = 'Ocean land ice frazil production' + stdname = 'ocean_land_ice_frazil_ice_production' + units = 'kg m-2 s-1' + attname = 'Foxo_frazil_li' + call metadata_set(attname, longname, stdname, units) + ! Water flux from ice shelf melt call seq_flds_add(o2x_fluxes,"Foxo_ismw") longname = 'Water flux due to basal melting of ice shelves' diff --git a/driver-moab/main/seq_diag_mct.F90 b/driver-moab/main/seq_diag_mct.F90 index bb597fd9783..8534008f9be 100644 --- a/driver-moab/main/seq_diag_mct.F90 +++ b/driver-moab/main/seq_diag_mct.F90 @@ -286,7 +286,9 @@ module seq_diag_mct integer :: index_o2x_Faoo_h2otemp integer :: index_o2x_Fioo_frazil + integer :: index_o2x_Foxo_frazil_li integer :: index_o2x_Fioo_q + integer :: index_o2x_Foxo_q_li integer :: index_o2x_Foxo_ismw integer :: index_o2x_Foxo_rrofl @@ -1376,7 +1378,9 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa if (present(do_o2x)) then if (first_time) then index_o2x_Fioo_frazil = mct_aVect_indexRA(o2x_o,'Fioo_frazil') + index_o2x_Foxo_frazil_li= mct_aVect_indexRA(o2x_o,'Foxo_frazil_li',perrWith='quiet') index_o2x_Fioo_q = mct_aVect_indexRA(o2x_o,'Fioo_q') + index_o2x_Foxo_q_li = mct_aVect_indexRA(o2x_o,'Foxo_q_li',perrWith='quiet') index_o2x_Faoo_h2otemp = mct_aVect_indexRA(o2x_o,'Faoo_h2otemp') index_o2x_Foxo_ismw = mct_aVect_indexRA(o2x_o,'Foxo_ismw',perrWith='quiet') if ( index_o2x_Foxo_ismw /= 0 ) flds_polar = .true. @@ -1399,9 +1403,11 @@ subroutine seq_diag_ocn_mct( ocn, xao_o, frac_o, infodata, do_o2x, do_x2o, do_xa nf = f_hfrz; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*max(0.0_r8,o2x_o%rAttr(index_o2x_Fioo_q,n)) nf = f_hh2ot; budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Faoo_h2otemp,n) if (flds_polar) then + nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - ca_c*o2x_o%rAttr(index_o2x_Foxo_frazil_li,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismw,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofl,n) nf = f_wpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) - (ca_o+ca_i)*o2x_o%rAttr(index_o2x_Foxo_rrofi,n) + nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_q_li,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_ismh,n) nf = f_hpolar;budg_dataL(nf,ic,ip) = budg_dataL(nf,ic,ip) + ca_c*o2x_o%rAttr(index_o2x_Foxo_rrofih,n) end if diff --git a/driver-moab/shr/seq_flds_mod.F90 b/driver-moab/shr/seq_flds_mod.F90 index 0f9feea18ea..7e8fb2282c8 100644 --- a/driver-moab/shr/seq_flds_mod.F90 +++ b/driver-moab/shr/seq_flds_mod.F90 @@ -1610,6 +1610,22 @@ subroutine seq_flds_set(nmlfile, ID, infodata) !-------------------------------- if (flds_polar) then + ! Ocean Land ice freeze potential + call seq_flds_add(o2x_fluxes,"Foxo_q_li") + longname = 'Ocean land ice freeze potential' + stdname = 'ice_shelf_cavity_ice_heat_flux' + units = 'W m-2' + attname = 'Foxo_q_li' + call metadata_set(attname, longname, stdname, units) + + ! Ocean land ice frazil production + call seq_flds_add(o2x_fluxes,"Foxo_frazil_li") + longname = 'Ocean land ice frazil production' + stdname = 'ocean_land_ice_frazil_ice_production' + units = 'kg m-2 s-1' + attname = 'Foxo_frazil_li' + call metadata_set(attname, longname, stdname, units) + ! Water flux from ice shelf melt call seq_flds_add(o2x_fluxes,"Foxo_ismw") longname = 'Water flux due to basal melting of ice shelves' From 16c9d583cd3c624a80c59d7dacd62029a6f8bd82 Mon Sep 17 00:00:00 2001 From: Carolyn Begeman Date: Wed, 20 Mar 2024 16:40:03 -0500 Subject: [PATCH 079/310] Remove capability to have non-zero land ice frazil salinity --- components/mpas-ocean/src/Registry.xml | 6 +---- .../Registry_conservation_check.xml | 7 +----- .../mpas_ocn_conservation_check.F | 23 ++++++------------- .../src/shared/mpas_ocn_frazil_forcing.F | 3 ++- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index a953b64d8f8..38cc06f5559 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -954,13 +954,9 @@ possible_values="Any positive real number." /> - - @@ -305,7 +302,6 @@ - @@ -362,7 +358,6 @@ - diff --git a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F index ad262579044..bdd07e799b5 100644 --- a/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F +++ b/components/mpas-ocean/src/analysis_members/mpas_ocn_conservation_check.F @@ -1162,8 +1162,8 @@ subroutine salt_conservation(domain, err) real(kind=RKIND), pointer :: & accumulatedSeaIceSalinityFlux, & - accumulatedFrazilSalinityFlux, & - accumulatedLandIceFrazilSalinityFlux + accumulatedFrazilSalinityFlux + ! accumulatedLandIceFrazilSalinityFlux is not present because it is always 0 real(kind=RKIND), dimension(:), allocatable :: & sumArray, & @@ -1209,7 +1209,6 @@ subroutine salt_conservation(domain, err) call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedSeaIceSalinityFlux", accumulatedSeaIceSalinityFlux) call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedFrazilSalinityFlux", accumulatedFrazilSalinityFlux) - call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedLandIceFrazilSalinityFlux", accumulatedLandIceFrazilSalinityFlux) !------------------------------------------------------------- ! Net salt flux to ice @@ -1251,11 +1250,9 @@ subroutine salt_conservation(domain, err) end if if (config_use_frazil_ice_formation .and. config_frazil_under_land_ice) then - call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassOld, 1) - call mpas_pool_get_array(statePool, 'accumulatedLandIceFrazilMass', accumulatedLandIceFrazilMassNew, 2) + ! Land ice frazil salinity is always 0 do iCell = 1, nCellsSolve - sumArray(3) = sumArray(3) + areaCell(iCell) & - * (accumulatedLandIceFrazilMassNew(iCell) - accumulatedLandIceFrazilMassOld(iCell))/dt + sumArray(3) = sumArray(3) + 0.0_RKIND enddo end if @@ -1268,7 +1265,6 @@ subroutine salt_conservation(domain, err) ! accumulate fluxes accumulatedSeaIceSalinityFlux = accumulatedSeaIceSalinityFlux + sumArrayOut(1) accumulatedFrazilSalinityFlux = accumulatedFrazilSalinityFlux + sumArrayOut(2) - accumulatedLandIceFrazilSalinityFlux = accumulatedLandIceFrazilSalinityFlux + sumArrayOut(3) ! cleanup deallocate(sumArray) @@ -1285,7 +1281,6 @@ subroutine salt_conservation(domain, err) ! Average the fluxes accumulatedSeaIceSalinityFlux = accumulatedSeaIceSalinityFlux /accumulatedFluxCounter accumulatedFrazilSalinityFlux = accumulatedFrazilSalinityFlux /accumulatedFluxCounter - accumulatedLandIceFrazilSalinityFlux = accumulatedLandIceFrazilSalinityFlux /accumulatedFluxCounter ! get initial salt content call MPAS_pool_get_array(conservationCheckSaltAMPool, "initialSalt", initialSalt) @@ -1302,8 +1297,7 @@ subroutine salt_conservation(domain, err) call MPAS_pool_get_array(conservationCheckSaltAMPool, "netSaltFlux", netSaltFlux) netSaltFlux = accumulatedSeaIceSalinityFlux & - + accumulatedFrazilSalinityFlux & - + accumulatedLandIceFrazilSalinityFlux + + accumulatedFrazilSalinityFlux ! compute the final salt error call MPAS_pool_get_array(conservationCheckSaltAMPool, "absoluteSaltError", absoluteSaltError) @@ -1331,7 +1325,7 @@ subroutine salt_conservation(domain, err) if (landIceFreshwaterFluxesOn & .and.config_use_frazil_ice_formation & .and.config_frazil_under_land_ice) then -v=accumulatedLandIceFrazilSalinityFlux; write(m,"('LandIceFrazilSalinityFlux',es16.8,' (already in wmelt, do not sum) ',f16.8)") v,v*c; call mpas_log_write(m); !no sum: s=s+v +v=0; write(m,"('LandIceFrazilSalinityFlux',es16.8,' (already in wmelt, do not sum) ',f16.8)") v,v*c; call mpas_log_write(m); !no sum: s=s+v end if write(m,"('SUM VOLUME FLUXES ',es16.8,' ',f16.8,es16.8)") s, s*c; call mpas_log_write(m) @@ -2256,8 +2250,7 @@ subroutine reset_accumulated_variables(domain) real(kind=RKIND), pointer :: & accumulatedSeaIceSalinityFlux, & - accumulatedFrazilSalinityFlux, & - accumulatedLandIceFrazilSalinityFlux + accumulatedFrazilSalinityFlux real(kind=RKIND), pointer :: & accumulatedCarbonSourceSink, & @@ -2343,11 +2336,9 @@ subroutine reset_accumulated_variables(domain) call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedSeaIceSalinityFlux", accumulatedSeaIceSalinityFlux) call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedFrazilSalinityFlux", accumulatedFrazilSalinityFlux) - call MPAS_pool_get_array(conservationCheckSaltAMPool, "accumulatedLandIceFrazilSalinityFlux", accumulatedLandIceFrazilSalinityFlux) accumulatedSeaIceSalinityFlux = 0.0_RKIND accumulatedFrazilSalinityFlux = 0.0_RKIND - accumulatedLandIceFrazilSalinityFlux = 0.0_RKIND call MPAS_pool_get_subpool(domain % blocklist % structs, "conservationCheckCarbonAM", conservationCheckCarbonAMPool) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F index 16c22398684..7a94095bc08 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F @@ -527,7 +527,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP ! get frazil salinity if (underLandIce) then - frazilSalinity = config_frazil_land_ice_reference_salinity + frazilSalinity = 0.0_RKIND else frazilSalinity = config_frazil_sea_ice_reference_salinity end if @@ -618,6 +618,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP ! for freshwater budgets accumulatedLandIceFrazilMassNew(iCell) = accumulatedLandIceFrazilMassOld(iCell) & + sumNewFrazilIceThickness * config_frazil_ice_density + ! There is no accumulatedLandIceFrazilSalinity because it is always 0 end if enddo ! do iCell = 1, nCells From 842522c9a410a1463c824bc9470a47d2533fd55b Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 26 Mar 2024 15:21:20 -0500 Subject: [PATCH 080/310] Adding back in removed land_ice_reference_salinity namelist --- components/mpas-ocean/src/Registry.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index 38cc06f5559..a953b64d8f8 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -954,9 +954,13 @@ possible_values="Any positive real number." /> + Date: Tue, 26 Mar 2024 15:34:39 -0500 Subject: [PATCH 081/310] Reverting hard-coded zero land ice frazil salinity --- components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F index 7a94095bc08..0f71ab176eb 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F @@ -527,7 +527,7 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP ! get frazil salinity if (underLandIce) then - frazilSalinity = 0.0_RKIND + frazilSalinity = config_frazil_land_ice_reference_salinity else frazilSalinity = config_frazil_sea_ice_reference_salinity end if From edf89d103bc9ed32d8172abba720eecabd28ec9b Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 26 Mar 2024 18:06:06 -0500 Subject: [PATCH 082/310] Removing comment from frazil_forcing.F --- components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F | 1 - 1 file changed, 1 deletion(-) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F index 0f71ab176eb..16c22398684 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_frazil_forcing.F @@ -618,7 +618,6 @@ subroutine ocn_frazil_forcing_build_arrays(domain, meshPool, forcingPool, stateP ! for freshwater budgets accumulatedLandIceFrazilMassNew(iCell) = accumulatedLandIceFrazilMassOld(iCell) & + sumNewFrazilIceThickness * config_frazil_ice_density - ! There is no accumulatedLandIceFrazilSalinity because it is always 0 end if enddo ! do iCell = 1, nCells From 80efc0f4cc6873ee85f9048cf1beee0d11be6134 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 27 Mar 2024 09:18:38 -0600 Subject: [PATCH 083/310] initial MPAS-seaice documentation --- .../mpas-seaice/docs/dev-guide/index.md | 194 ++++++++++++++++++ components/mpas-seaice/docs/index.md | 21 ++ .../mpas-seaice/docs/tech-guide/index.md | 85 ++++++++ .../mpas-seaice/docs/user-guide/index.md | 1 + components/mpas-seaice/mkdocs.yml | 9 + docs/index.md | 1 + 6 files changed, 311 insertions(+) create mode 100644 components/mpas-seaice/docs/dev-guide/index.md create mode 100644 components/mpas-seaice/docs/index.md create mode 100644 components/mpas-seaice/docs/tech-guide/index.md create mode 100644 components/mpas-seaice/docs/user-guide/index.md create mode 100644 components/mpas-seaice/mkdocs.yml diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md new file mode 100644 index 00000000000..afd02201db7 --- /dev/null +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -0,0 +1,194 @@ +Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. Please refer to LINK for instructions. For changes to Icepack, please consult the [CICE Consortium's recommendations for code contributions](https://github.com/CICE-Consortium/About-Us/wiki/Contributing). + +To access the column physics in Icepack, MPAS-seaice uses methods defined in ``icepack_intfc.F90``. The 'init' and 'query' methods are used to set and retrieve Icepack values. A 'write' method is also available for documenting these values. MPAS-seaice follows the 'icepack_warnings' methodology where ``icepack_warnings_aborted`` is checked and ``icepack_warnings_flush`` is called after every call to an Icepack method. It does not directly “use” Icepack data, accessing Icepack data only through these interfaces. + +Basic Icepack development can be done in standalone mode using Icepack's testing scripts, directly in the submodule branch in MPAS-seaice. We recommend that Icepack developments be thoroughly tested within E3SM's coupled framework throughout the development process, including fully coupled simulations. + +**E3SM-Polar-Developer Script** +----------------------------------- + +To accelerate early development stages, a script is available for configuring and testing MPAS-seaice (including the Icepack submodule) in D compsets, which have the sea ice component active and data models for the other components. + +**View helpful information, including default values for duration, configuration, etc.** + + git clone git@github.com:E3SM-Project/SimulationScripts.git + cd SimulationScripts/archive/PolarGroup + ./E3SM-Polar-Developer.sh -h + +For debugging E3SM, search the script for 'debug' and follow the instructions. + +The following examples describe how to use the script for development in Icepack. Similar procedures could be used for any MPAS-SI physics development. + +**Set up and run baselines** + +Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. (A file without ``config`` settings will create a single, default baseline.) + + $ less nset01.nlk + [mpassi] + config_column_physics_type = {'column_package','icepack'} + config_use_snicar_ad = {.false.} + +Fetch E3SM (choose any name for the directory baselines01): + + ./E3SM-Polar-Developer.sh -s baselines01 -f git@github.com:E3SM-Project/E3SM + +Set up a new case and build it: + + ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -n -b + +Submit: + + ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -q + +Examine the diagnostic output (compares the icepack run with the column_package run in this example): + + ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -a -v + + +**Set up a sandbox for model development, to be compared with the baselines** + +Fetch E3SM (choose any name for the directory newdev01): + + ./E3SM-Polar-Developer.sh -s newdev01 -f git@github.com:E3SM-Project/E3SM + +Create a new development branch: + + cd ~/E3SM-Polar/code/newdev01 + git branch newbranch + git checkout newbranch + +Set up a new case and build it: + + ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -n -b + +Develop and test... +Build/compile: + + ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -b + +Submit: + + ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -q + +Examine the diagnostic output: + + ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -a -v + +Compare with the baselines case directory (use your D3 baselines directory): + + ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -a D3.nset01.baselines01.master.E3SM-Project.anvil -v + + +**Make changes in Icepack and PR to the Consortium** + +We recommend PR’ing Icepack changes first to the Consortium then to E3SM’s icepack fork, in order to keep the repositories in sync and to ensure the changes are robust outside of E3SM. Some changes to Icepack require extensive changes to the driver code (e.g. MPAS-seaice or CICE), making this process challenging. Contact the [CICE Consortium](https://github.com/CICE-Consortium/About-Us/wiki/Contributing) to discuss and identify a collaborative path forward. + +First, create a baseline (standalone) Icepack test suite using the E3SM icepack fork or, if the Consortium code is different, using Consortium icepack main +(see [Consortium documentation](https://cice-consortium-icepack.readthedocs.io/en/main/user_guide/ug_testing.html).) + +Similarly test your branch of Icepack within E3SM and compare with the baseline. +When satisfied with E3SM testing, PR to Consortium icepack main: + + git remote add cice git@github.com:cice-consortium/icepack.git + git pull cice main + +Fix conflicts if needed, then + + git add ... + git commit -m "update from cice-consortium main" + +Continue testing. When satisfied, + + git push origin branch + +Create a PR from branch to cice-consortium/icepack -b main. + +Once the PR has been tested and merged into the main Icepack codebase, a new PR is submitted to E3SM. + +More extensive documentation of this workflow tool used for the Icepack merge project is available [here](https://acme-climate.atlassian.net/wiki/spaces/ICE/pages/3450339435/Project+Workflow). + +**CICE-QC Quality Control Testing** +----------------------------------- + +Example to run a CICE-QC comparison between icepack and column_package on a branch + +**Set up and run simulations to be compared** + + cd ~/SimulationScripts/archive/PolarGroup/ + +Create a `.nlk` file with namelist changes to include the thickness analysis member (append the last 3 lines here to the end of your standard D-case test .nlk) + + $ less qcPR19.nlk + [mpassi] + config_column_physics_type = {'column_package','icepack'} + config_AM_thicknesses_enable = {.true.} + config_AM_thicknesses_compute_on_startup = {.true.} + config_AM_thicknesses_write_on_startup = {.true.} + +Use test script to clone E3SM, and create a sandbox + + ./E3SM-Polar-Developer.sh -s qcPR19 -f git@github.com:eclare108213/E3SM snicar_active + +Edit ``~/E3SM-Polar/code/qcPR19/components/mpas-seaice/cime_config/buildnml`` to change: + + lines.append(' output_interval="none" + +to + + lines.append(' output_interval="00-00-01_00:00:00">') + +for ``stream name=“output”`` (line 451) and add + + lines.append(' ') + +at line 458. + +Create and build both cases to run 5 years, then submit: + + ./E3SM-Polar-Developer.sh -s qcPR19 -k qcPR19.nlk -e -d60 -nb + ./E3SM-Polar-Developer.sh -s qcPR19 -k qcPR19.nlk -e -d60 -q + +**Run QC comparison** + +----UPDATE THIS SINCE THE PR HAS NOW BEEN MERGED ------ + +See ``README.md`` at [https://github.com/E3SM-Seaice-Discussion/E3SM/pull/8/files](https://github.com/E3SM-Seaice-Discussion/E3SM/pull/8/files). + + mkdir CICE-QC --- if it doesn’t already exist + cd CICE-QC + git clone git@github.com:darincomeau/E3SM.git -b add-mpas-seaice-qc-testing + cd E3SM/components/mpas-seaice/testing_and_setup/qc_testing/ + +[the following might not be necessary with the latest E3SM-Polar-Developer script] + +Edit ``job_script.qc-testing-mpassi.anvil``, e.g. + + export BASE=/lcrc/group/acme/ac.eclare/E3SM-Polar/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/run.k000 + export TEST=/lcrc/group/acme/ac.eclare/E3SM-Polar/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/run.k001 + +Edit ``mpas-seaice.t-test.py`` to comment out the lines that insist on the path ending with ``run/`` but still define + + path_a = base_dir + path_b = test_dir + +Submit QC test: + + sbatch job_script.qc-testing-mpassi.anvil + +Test results will be in the file ``qc_log.txt``. + +**Create comparison plots** + +To generate MPAS-Analysis plots from the CICE-QC runs and compare: + +Copy the scripts in the file above to anvil or chrysalis - PROVIDE FILE + +Edit each script for your run names, directories, etc (search for 'echmod' to find settings used for the qcPR19 comparison above) + +Edit and submit (on chrysalis) the job script 3 times, once for icepack, once for column, and finally for the comparison. + +Browse the html output, e.g. navigate to + + https://web.lcrc.anl.gov/public/e3sm/diagnostic_output/ac.eclare/icepack-testing/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/mpas_analysis_output/ + + diff --git a/components/mpas-seaice/docs/index.md b/components/mpas-seaice/docs/index.md new file mode 100644 index 00000000000..24aeefd71d4 --- /dev/null +++ b/components/mpas-seaice/docs/index.md @@ -0,0 +1,21 @@ +# The E3SM Sea Ice Model (MPAS-seaice) + +MPAS-seaice is an unstructured-mesh sea-ice model that uses the Modeling for Prediction Across Scales (MPAS) framework, allowing enhanced horizontal resolution in regions of interest. MPAS-seaice uses many of the methods used in the Los Alamos CICE sea-ice model, but adapted to the Spherical Centroidal Vornoi Tesselation (SCVT) meshes used by the MPAS framework. + +* The [MPAS-seaice User's Guide](user-guide/index.md) explains how to control MPAS-seaice within E3SM. +* The [MPAS-seaice Developer's Guide](dev-guide/index.md) explains MPAS-seaice data structures and how to develop new code. +* The [MPAS-seaice Technical Guide](tech-guide/index.md) explains the science behind MPAS-seaice code. + +**Icepack** + +MPAS-seaice incorporates the Icepack software package for sea ice column physics, developed by the [CICE Consortium](https://github.com/cice-consortium), as a submodule. Icepack documentation provides a complete description of the column physics and instructions for using Icepack as a standalone model. The source code for this documentation is maintained in the Consortium's [Icepack repository](https://github.com/cice-consortium/Icepack), and it is fully rendered at +[readthedocs](https://cice-consortium-icepack.readthedocs.io/en/main/). + +If modifications have been made to the Icepack repository and documentation that have not yet been migrated to E3SM's fork, then the documentation may not match E3SM's version of the Icepack code. E3SM does not render the readthedocs documentation from within its fork of the Icepack repository, but the source can be viewed directly at [https://github.com/E3SM-Project/Icepack/](https://github.com/E3SM-Project/Icepack/) (navigate to doc/source/ and then likely science_guide/, etc). This is the documentation associated with the latest Icepack version that has been merged into E3SM, plus any documentation changes made within E3SM itself. + +If the source code is difficult to read, the Icepack repository's documentation for the most recent release incorporated in E3SM can be found in readthedocs: + +* Check the [release tags](https://github.com/E3SM-Project/Icepack/tags) to get the release number. +* Choose the release version of the documentation from the [Icepack release table](https://github.com/CICE-Consortium/Icepack/wiki/Icepack-Release-Table). + +[Guidance for developing Icepack documentation](https://github.com/CICE-Consortium/About-Us/wiki/Documentation-Workflow-Guide) includes instructions for building the readthedocs documentation yourself. \ No newline at end of file diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md new file mode 100644 index 00000000000..d5bcbf55653 --- /dev/null +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -0,0 +1,85 @@ +**Primary documentation for MPAS-seaice** +----------------------------------------- + +Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., Wolfe, J. D., et al. (2019). The DOE E3SM coupled model version 1: Overview and evaluation at
standard resolution. Journal of Advances in Modeling Earth
Systems, 11, 2089–2129. https://doi.org/10.1029/2018MS001603 + +Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. https://doi.org/10.5194/gmd-2021-355 + +Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. https://doi.org/10.1029/2022MS003156 + +Full documentation for Icepack can be found at …. Link to main location in E3SM docs and https://github.com/CICE-Consortium/Icepack (use readthedocs link). + +**Meshes** +---------- + +MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses a B-grid (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. + +**Velocity and Stresses** +------------------------- + +Velocity components at cell vertices are not aligned with the mesh, as in sea ice models with structured meshes and quadrilateral cells. Instead, the velocity components are aligned with a spherical coordinate system that is locally Cartesian, eastwards (u) and northwards (v), irrespective of the orientation of edges joining that vertex. Such a definition, however, would result in a convergence of v components at the geographic North Pole and strong metric terms in the velocity solution. Consequently, in addition, these definitions of u and v are rotated so that their pole lies on the geographical equator at 0◦ longitude. + +Velocities are determined by solving the sea ice momentum equation (Hibler, 1979; Hunke & Dukowicz, 1997). During coupled simulations the ocean model provides the ocean surface tilt term; the only other term that depends on the properties of the horizontal grid is the divergence of internal stress. Therefore only this stress term must be adapted for use on MPAS meshes. Otherwise the velocity solver is identical to that in CICE’s standard EVP approach. Determination of the divergence of the internal stress can be broken down into three stages: + +1. The strain rate tensor is determined from the velocity field. + +2. The stress tensor at a point is determined, through a constitutive relation, from the strain rate tensor at that point. + +3. The divergence of this stress tensor is calculated. + +Two schemes to calculate the strain rate tensor and the divergence of internal stress on MPAS meshes are implemented in MPAS-Seaice, a variational scheme based on that used in CICE (Hunke and Dukowicz, 2002), and a weak scheme that uses the line integral forms of the symmetric gradient and divergence operators. The variational scheme is based on the fact that over the entire domain, Ω, and ignoring boundary effects, the total work done by the internal stress is equal to the dissipation of mechanical energy. Instead of the bilinear basis functions used by CICE, MPAS-Seaice uses Wachspress basis functions (Dasgupta, 2003), which are integrated with the quadrature rules of Dunavant (1985). + +**Horizontal Transport of Ice Area Fraction and Tracers** +--------------------------------------------------------- + +Horizontal transport of ice concentration, volume, and tracers is achieved with an incremental remapping (IR) scheme similar to that described in Dukowicz and Baumgardner (2000), Lipscomb and Hunke (2004), and Lipscomb and Ringler (2005). For MPAS-Seaice the IR scheme was generalized to work on either the standard MPAS mesh (hexagons and other n-gons of varying sizes, with a vertex degree of 3) or a quadrilateral mesh (with a vertex degree of 4 as in CICE). Since MPAS meshes are unstructured, the IR scheme had to be rewritten from scratch. Most of the code is mesh-agnostic, but a small amount of code is specific to quad meshes. +The transport equations describe conservation of quantities such as volume and energy. Fractional ice area (aka sea ice concentration) is a mass-like quantity whose transport equation forms the basis for all other transported quantities in the model. In particular, ice volume is the product of ice area and thickness; therefore thickness is treated as a tracer on ice area, transported with the continuity equation for conservation of volume. Likewise, snow depth is carried as a tracer on ice area via a conservation of snow volume equation. Ice thickness and snow depth are referred to as “type 1” tracers (carried directly on ice area). Ice and snow enthalpy in each vertical layer are type 2 tracers, carried on ice and snow volume. When run with advanced options (e.g., active melt ponds and biogeochemistry), MPAS-Seaice advects tracers up to type 3. Thus, the mass-like field (area) is the “parent field” for type 1 tracers; type 1 tracers are parents of type 2; and type 2 tracers are parents of type 3. Sources and sinks of mass and tracers (e.g., ice growth and melting) are treated separately from transport. + +The transport time step is limited by the requirement that trajectories projected backward from vertices are confined to the cells sharing the vertex (i.e., 3 cells for the standard MPAS mesh and 4 for the quad mesh). This is what is meant by incremental as opposed to general remapping. For highly divergent velocity fields, the maximum time step may have to be reduced by a factor of 2 to ensure that trajectories do not cross. The IR algorithm consists of the following steps: + +1. Given mean values of the ice area and tracer fields in each grid cell and thickness category, construct linear approximations of these fields. Limit the field gradients to preserve mono- tonicity. +2. Given ice velocities at grid cell vertices, identify departure regions for the transport across each cell edge. Divide these departure regions into triangles and compute the coordinates of the triangle vertices. +3. Integrate the area and tracer fields over the departure triangles to obtain the area, volume, and other conserved quantities transported across each cell edge. +4. Given these transports, update the area and tracers. + +Since all fields are transported by the same velocity field, the second step is done only once per time step. The other steps are repeated for each field. + +With advanced physics and biogeochemistry (BGC) options, MPAS-Seaice can be configured to include numerous tracer fields, each of which is advected in every thickness category, and many of which are defined in each vertical ice or snow layer. In order to accommodate different tracer combinations and make it easy to add new tracers, the tracer fields are organized in a linked list that depends on which physics and BGC packages are active. The list is arranged with fractional ice area first, followed by the type 1 tracers, type 2 tracers, and finally type 3 tracers. In this way, values computed for parent tracers are always available when needed for computations involving child tracers. + +**Column Physics** +------------------ + +Because of the strong thermal gradients between the (cold) atmosphere and (relatively warm) oceans in polar regions, a large portion of the physics in sea ice models can be described in a vertical column, without reference to neighboring grid cells. MPAS-Seaice shares the same column physics code as CICE through the Icepack library (Hunke et al., 2018), which is maintained by the CICE Consortium. This code includes several options for simulating sea ice thermodynamics, mechanical redistribution (ridging) and associated area and thickness changes. In addition, the model supports a number of tracers, including thickness, enthalpy, ice age, first-year ice area, deformed ice area and volume, melt ponds, snow properties and biogeochemistry. + +Icepack is implemented in MPAS-seaice as a git submodule. Icepack consists of three independent parts, the column physics code, the Icepack driver that supports stand-alone testing of the column physics code, and the Icepack scripts that build and test the Icepack model. E3SM uses only the column physics code, which is called for each ocean grid cell. Icepack’s own driver and testing scripts are used when preparing new developments to be merged back to the CICE Consortium’s Icepack repository. + +Icepack includes sophisticated vertical physics and biogeochemical schemes, which include vertical thermodynamics schemes (Bitz and Lipscomb, 1999; Turner et al., 2013; Turner and Hunke, 2015), melt-pond parameterizations (Flocco et al., 2010; Hunke et al., 2013), a delta-Eddington radiation scheme (Briegleb and Light, 2007; Holland et al., 2012a), schemes for transport in thickness space (Lipscomb, 2001), and representations of mechanical redistribution (Lipscomb et al., 2007). + +**Thermodynamics** + +In its default configuration, MPAS-Seaice uses the “mushy layer” vertical thermodynamics scheme of Turner et al. (2013) and Turner and Hunke (2015). The mushy layer formulation describes the sea ice as a two-phase system of crystalline, fresh ice and liquid brine. Enthalpy depends on temperature and salinity, all of which are prognostic variables. The mushy layer equations are derived from conservation of energy, conservation of salt, an ice-brine liquidus relation that determines the temperature- and salinity-dependent phase, and Darcy flow through a porous medium to describe the vertical movement of brine within the ice. When or where the ice is cold, brine pockets are isolated from each other, but warmer temperatures cause the brine pockets to expand and connect into vertical channels in which meltwater, seawater, biology and nutrients may move through the ice. + +**Melt Ponds** + +MPAS-seaice uses the level-ice melt pond scheme of Hunke et al. (2013). The ponds are carried as tracers on the level (undeformed) ice area of each thickness category, thus limiting their spatial extent based on the simulated sea ice topography. This limiting is meant to approximate the horizontal drainage of melt water into depressions in ice floes. The ponds evolve according to physically based process descriptions, assuming a thickness-area ratio for changes in pond volume. Melt pond processes include addition of liquid water from rain, melting snow and melting surface ice, drainage of pond water when its weight pushes the ice surface below sea level or when the ice interior becomes permeable, and refreezing of the pond water. If snow falls after a layer of ice has formed on the ponds, the snow may block sunlight from reaching the ponds below. When melt water forms with snow still on the ice, the water is assumed to infiltrate the snow. If there is enough water to fill the air spaces within the snowpack, then the pond becomes visible above the snow, thus decreasing the albedo and ultimately causing the snow to melt faster. The albedo also decreases as snow depth decreases, and thus a thin layer of snow remaining above a pond-saturated layer of snow will have a lower albedo than if the melt water were not present. Level-ice melt ponds are “virtual” in the sense that rain and meltwater is sent to the ocean immediately, and the tracers are only used thereafter to adjust the radiative calculations as if the ponds were present. The delta-Eddington radiative transfer scheme must be active for this purpose. + +**Radiation** + +The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75◦ (Dang et al., 2019). + +**Snow** + +A new snow-on-sea ice-morphology has been added to E3SMv2 that includes the effects of wind redistribution: losses to leads and meltponds, and the piling of snow against ridges. Snow grain radius, now a prognosed tracer field on sea ice, evolves according to temperature gradient and wet snow metamorphisms and feeds back to the SNICAR-AD radiative model up to a dry maximum of 2800 μm. Fresh snow falls at a grain radius of 54.5 μm, and five vertical snow layers replace the previous single snow layer atop  each of the five sea ice thickness categories retained from E3SMv1. + +**Biogeochemistry** + +**Coupling of MPAS-seaice within E3SM** +--------------------------------------- + +v1: Coupling of the sea ice component to the ocean takes advantage of z star ocean coordinates as described by Campin et al. (2008) and is a departure from the coupling of CICE and POP (Parallel Ocean Program) in CESM1. The weight of sea ice contributes to the ocean's barotropic mode, notably affecting the free surface over continental shelves. In shallow water depths at or less than the floating ice draft, the weight passed to the ocean model is limited to prevent evacuation of the underlying liquid column. When frazil ice forms in the ocean model, the volume of newly formed crystals is passed to the sea ice model with a fixed salinity of 4 PSU, rather than exchanging a freezing potential as in other models. Future versions of E3SM will permit progressive brine drainage to the ocean from the mushy layer physics used in MPAS-Seaice (Turner & Hunke, 2015). For E3SMv1, brine drainage occurs internally in MPAS-Seaice for thermodynamic calculations, but for the sake of freshwater coupling, the ocean model only receives mass fluxes back from melted sea ice at the fixed salinity that it originally passed to its cryospheric counterpart (4 PSU). The ocean temperature immediately under the ice is the same as the liquid phase in the lowest layer of the sea ice model and is not fixed at −1.8 ◦C as is typical of previous generation coupled models (Naughten et al., 2017). For the current version, we have addressed these long-standing ocean-ice coupling issues identified by the modeling community: explicit sea ice mass and salt exchange, a pressure force of the ice on the ocean, a basal sea ice temperature consistent with the ocean model's equation of state, and resolved inertial oscillations (Hibler et al., 2006; Lique et al., 2016; Schmidt et al., 2004). + +v2: The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content  assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conserva tion between sea ice and ocean models, this improvement greatly reduces a negative sea  ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model as described by Campin et al. (2008). 
Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. + +**Prescribed Ice Mode** + +E3SMv2 now also includes a prescribed-extent ice mode for MPAS-SeaIce based  CICE in E3SMv1 and CESM (Bailey et al., 2011). This mode is needed for AMIP (Atmospheric Model Intercomparison Project) style simulations where a full prognostic sea ice model is not desired but sea ice surface fluxes, albedos, snow depth, and surface temperature are needed by the atmosphere model and are calculated by the vertical thermodynamics module of the sea ice component. The mode is intended for atmosphere sensitivity experiments and does not conserve energy or mass. In this mode sea ice thermodynamics is active but sea ice dynamics are disabled and at each time step ice area and thickness are reset to specified values. Ice area is interpolated in time and space from an input data set, while ice thickness in grid cells containing sea ice is set to 2 m in the Northern hemisphere and 1 m in the Southern hemisphere. During each adjustment snow volume is adjusted to preserve the snow thickness prognosed in the previous time step. Snow temperatures are reset to the surface temperature, as prognosed in the previous time step, while ice temperatures are set so that the ice temperature gradient is linear, with the ice temperature at the top equal to the prognosed surface tem perature, and equal to the sea freezing temperature at the base of the ice. The vertical ice salinity profile is reset to the profile from Bitz & Lipscomb (1999). MPAS-SeaIce can now replace CICE in such configurations, but CICE continues to be used for those requiring exceptional computational efficiency. 
 diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md new file mode 100644 index 00000000000..d4678df4a32 --- /dev/null +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -0,0 +1 @@ +MPAS-seaice User's Guide is under construction. \ No newline at end of file diff --git a/components/mpas-seaice/mkdocs.yml b/components/mpas-seaice/mkdocs.yml new file mode 100644 index 00000000000..062ee03553f --- /dev/null +++ b/components/mpas-seaice/mkdocs.yml @@ -0,0 +1,9 @@ +site_name: MPAS-seaice + +nav: + - Introduction: 'index.md' + - User's Guide: user-guide/index.md + - Developer's Guide: dev-guide/index.md + - Technical Guide: tech-guide/index.md + + diff --git a/docs/index.md b/docs/index.md index 07a58797469..fad76aebee6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,5 +8,6 @@ The documentation for the components of E3SM is found here. - [EAMxx](./EAMxx/index.md) - [ELM](./ELM/index.md) - [MOSART](./MOSART/index.md) +- [MPAS-seaice](./MPAS-seaice/index.md) Please see [Developing Docs](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) to learn about developing documentation for E3SM. From a49e2ca819cb16c07cd6493f1d8919abbf9f5ab2 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 27 Mar 2024 22:25:40 -0700 Subject: [PATCH 084/310] add two stream testmod to fates test list --- cime_config/tests.py | 1 + .../testmods_dirs/elm/fates_cold_twostream/README | 15 +++++++++++++++ .../elm/fates_cold_twostream/include_user_mods | 1 + .../elm/fates_cold_twostream/shell_commands | 8 ++++++++ .../elm/fates_cold_twostream/user_nl_clm | 1 + 5 files changed, 26 insertions(+) create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm diff --git a/cime_config/tests.py b/cime_config/tests.py index f75032ef334..e47ef8b7ade 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -425,6 +425,7 @@ "ERS_Ld60.f45_g37.IELMFATES.elm-fates_cold_nofire", "ERS_Ld60.f45_g37.IELMFATES.elm-fates_cold_st3", "ERS_Ld60.f45_g37.IELMFATES.elm-fates_cold_pphys", + "SMS_D_Ld15.f45_g37.IELMFATES.elm-fates_cold_twostream", ) }, diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README new file mode 100644 index 00000000000..9044e113547 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README @@ -0,0 +1,15 @@ +Testing FATES two-stream radiation scheme is activated by switching the fates_rad_model +parameter from 1 to 2. This is all that is needed, both radiation schemes +1) Norman and 2) two-stream use the same optical parameters. + +fates_rad_model + +Note that to avoid exceeding the filename string length maximum, the parameter +file generated on the fly is placed in the $SRCROOT/src/fates/parameter_files +directory. This may still run into problems is the $SRCROOT string is too long. + +Like the test with seed dispersal activation, the main downside of this method is +that this file will require a custom update for every fates parameter file API update. +Allowing the HLM to generate the file at runtime via buildnamelist step +will provide the capability to build the fates parameter file on +the fly which with the appropriate values for this test. diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods new file mode 100644 index 00000000000..14f7591b725 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods @@ -0,0 +1 @@ +../FatesCold diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands new file mode 100644 index 00000000000..5d94e5f6594 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands @@ -0,0 +1,8 @@ +SRCDIR=`./xmlquery SRCROOT --value` +CASEDIR=`./xmlquery CASEROOT --value` +FATESDIR=$SRCDIR/src/fates +FATESPARAMFILE=$CASEDIR/fates_params_twostream.nc + +ncgen -o $FATESPARAMFILE $FATESDIR/parameter_files/fates_params_default.cdl + +$FATESDIR/tools/modify_fates_paramfile.py --O --fin $FATESPARAMFILE --fout $FATESPARAMFILE --var fates_rad_model --val 2 --allpfts diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm new file mode 100644 index 00000000000..cae5fc2112d --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm @@ -0,0 +1 @@ +fates_paramfile = '$CASEROOT/fates_params_twostream.nc' From 65df1fe783837555129a41fd468d0ca8752ce63a Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Wed, 27 Mar 2024 22:57:02 -0700 Subject: [PATCH 085/310] correct fates two stream testmod --- .../elm/fates_cold_twostream/include_user_mods | 2 +- .../testmods_dirs/elm/fates_cold_twostream/shell_commands | 7 +++++++ .../elm/fates_cold_twostream/{user_nl_clm => user_nl_elm} | 0 3 files changed, 8 insertions(+), 1 deletion(-) rename components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/{user_nl_clm => user_nl_elm} (100%) diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods index 14f7591b725..45e8af32d22 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/include_user_mods @@ -1 +1 @@ -../FatesCold +../fates_cold diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands index 5d94e5f6594..dbf88f570c4 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands @@ -1,3 +1,7 @@ +module load e4s +spack env activate gcc +spack load nco + SRCDIR=`./xmlquery SRCROOT --value` CASEDIR=`./xmlquery CASEROOT --value` FATESDIR=$SRCDIR/src/fates @@ -6,3 +10,6 @@ FATESPARAMFILE=$CASEDIR/fates_params_twostream.nc ncgen -o $FATESPARAMFILE $FATESDIR/parameter_files/fates_params_default.cdl $FATESDIR/tools/modify_fates_paramfile.py --O --fin $FATESPARAMFILE --fout $FATESPARAMFILE --var fates_rad_model --val 2 --allpfts + +spack unload nco +module unload e4s diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_elm similarity index 100% rename from components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_clm rename to components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/user_nl_elm From 76be65b94f630ee6f4752a1dce1a79376449f299 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Fri, 15 Mar 2024 06:32:18 -0500 Subject: [PATCH 086/310] Add IcosXISC30E3r7 mesh to MPAS-Ocean and MPAS-Seaice --- .../namelist_defaults_mpaso.xml | 21 +++++++++++++++++++ components/mpas-ocean/cime_config/buildnml | 11 ++++++++++ .../namelist_defaults_mpassi.xml | 4 ++++ components/mpas-seaice/cime_config/buildnml | 10 +++++++++ 4 files changed, 46 insertions(+) diff --git a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml index 6541b9a5a2b..5a3359cd2d7 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml @@ -49,6 +49,7 @@ '00:10:00' '00:30:00' '00:30:00' +'00:30:00' '00:08:00' '00:04:00' '00:02:00' @@ -77,6 +78,7 @@ .true. .true. .true. +.true. .true. .true. .true. @@ -97,6 +99,7 @@ .true. .true. .true. +.true. .true. .true. .true. @@ -111,6 +114,7 @@ 462.0 1000.0 1000.0 +1000.0 308.0 154.0 77.0 @@ -140,6 +144,7 @@ 1.18e10 1.2e11 1.2e11 +1.2e11 3.50e09 4.37e08 5.46e07 @@ -175,6 +180,7 @@ 'RossbyRadius' 'RossbyRadius' 'ramp' +'ramp' 'RossbyRadius' 'RossbyRadius' 'RossbyRadius' @@ -204,6 +210,7 @@ 'N2_dependent' 'N2_dependent' 'constant' +'constant' 'N2_dependent' 'N2_dependent' 'N2_dependent' @@ -217,6 +224,7 @@ 600.0 600.0 600.0 +600.0 600.0 600.0 600.0 @@ -229,6 +237,7 @@ 1.0 1.0 3.0 +3.0 1.0 1.0 1.0 @@ -243,6 +252,7 @@ 'RossbyRadius' 'RossbyRadius' 'ramp' +'ramp' 'RossbyRadius' 'RossbyRadius' 'RossbyRadius' @@ -383,6 +393,7 @@ 'pressure_only' 'pressure_only' 'pressure_only' +'pressure_only' 'pressure_only' 'pressure_only' 'pressure_only' @@ -400,6 +411,7 @@ 4.48e-3 4.48e-3 4.48e-3 +4.48e-3 4.48e-3 4.48e-3 4.48e-3 @@ -412,6 +424,7 @@ 0.00295 0.00295 0.00295 +0.00295 0.00295 0.00295 0.00295 @@ -422,6 +435,7 @@ 8.42e-5 8.42e-5 8.42e-5 +8.42e-5 8.42e-5 8.42e-5 8.42e-5 @@ -449,6 +463,7 @@ 4.48e-3 4.48e-3 4.48e-3 +4.48e-3 4.48e-3 4.48e-3 4.48e-3 @@ -531,6 +546,7 @@ '0000_00:00:15' '0000_00:01:15' '0000_00:01:00' +'0000_00:01:00' '0000_00:00:10' '0000_00:00:05' '0000_00:00:02.5' @@ -576,6 +592,7 @@ .false. .false. .false. +.false. .false. .false. .false. @@ -1097,6 +1114,7 @@ .true. .true. .true. +.true. .true. .true. .true. @@ -1183,6 +1201,7 @@ .true. .true. .true. +.true. .true. .true. .true. @@ -1193,6 +1212,7 @@ .true. .true. .true. +.true. .true. .true. .true. @@ -1201,6 +1221,7 @@ .true. .true. .true. +.true. .true. .true. .true. diff --git a/components/mpas-ocean/cime_config/buildnml b/components/mpas-ocean/cime_config/buildnml index 048e621fafa..7dca58023e0 100755 --- a/components/mpas-ocean/cime_config/buildnml +++ b/components/mpas-ocean/cime_config/buildnml @@ -352,6 +352,17 @@ def buildnml(case, caseroot, compname): if ocn_ismf == 'data': data_ismf_file = 'prescribed_ismf_paolo2023.IcoswISC30E3r5.20240227.nc' + elif ocn_grid == 'IcosXISC30E3r7': + decomp_date = '20240314' + decomp_prefix = 'partitions/mpas-o.graph.info.' + restoring_file = 'sss.PHC2_monthlyClimatology.IcosXISC30E3r7.20240314.nc' + analysis_mask_file = 'IcosXISC30E3r7_mocBasinsAndTransects20210623.nc' + ic_date = '20240314' + ic_prefix = 'mpaso.IcosXISC30E3r7' + if ocn_ic_mode == 'spunup': + ic_date = '20240314' + ic_prefix = 'mpaso.IcosXISC30E3r7.rstFromPiControlSpinup-chrysalis' + #-------------------------------------------------------------------- # Set OCN_FORCING = datm_forced_restoring if restoring file is available #-------------------------------------------------------------------- diff --git a/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml b/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml index a47e5798159..23f258f2a30 100644 --- a/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml +++ b/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml @@ -25,6 +25,7 @@ 1800.0 1800.0 1800.0 +1800.0 480.0 240.0 120.0 @@ -81,6 +82,7 @@ 75.0 70.0 +70.0 85.0 85.0 85.0 @@ -95,6 +97,7 @@ -75.0 -60.0 +-60.0 -85.0 -85.0 -85.0 @@ -160,6 +163,7 @@ 1 1 1 +1 1 1 1 diff --git a/components/mpas-seaice/cime_config/buildnml b/components/mpas-seaice/cime_config/buildnml index 0aa12105bf9..feecb0c6987 100755 --- a/components/mpas-seaice/cime_config/buildnml +++ b/components/mpas-seaice/cime_config/buildnml @@ -307,6 +307,16 @@ def buildnml(case, caseroot, compname): grid_date = '20231121' grid_prefix = 'mpassi.IcoswISC30E3r5.rstFromG-chrysalis' + elif ice_grid == 'IcosXISC30E3r7': + grid_date = '20240314' + grid_prefix = 'mpassi.IcosXISC30E3r7' + decomp_date = '20240314' + decomp_prefix = 'partitions/mpas-seaice.graph.info.' + data_iceberg_file = 'Iceberg_Climatology_Merino.IcosXISC30E3r7.20240314.nc' + if ice_ic_mode == 'spunup': + grid_date = '20240314' + grid_prefix = 'mpassi.IcosXISC30E3r7.rstFromPiControlSpinup-chrysalis' + elif ice_grid == 'ICOS10': grid_date = '211015' grid_prefix = 'seaice.ICOS10' From 1d15db8e1a03a4a14f1afd289d589447a782890c Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Fri, 15 Mar 2024 06:33:05 -0500 Subject: [PATCH 087/310] Add IcosXISC30E3r7 mesh to ELM --- components/elm/bld/namelist_files/namelist_definition.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index 45a419edb99..204a1f97fae 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -1419,7 +1419,7 @@ Representative concentration pathway for future scenarios [radiative forcing at + valid_values="USGS,gx3v7,gx1v6,navy,test,tx0.1v2,tx1v1,T62,TL319,cruncep,oEC60to30v3,oEC60to30v3wLI,ECwISC30to60E1r2,EC30to60E2r2,WC14to60E2r3,WCAtl12to45E2r4,SOwISC12to60E2r4,ECwISC30to60E2r1,oRRS18to6,oRRS18to6v3,oRRS15to5,oARRM60to10,oARRM60to6,ARRM10to60E2r1,oQU480,oQU240,oQU240wLI,oQU120,oRRS30to10v3,oRRS30to10v3wLI,360x720cru,NLDASww3a,NLDAS,tx0.1v2,ICOS10,IcoswISC30E3r5,IcosXISC30E3r7"> Land mask description From 7c04ae9dba40c86ed340a3394cf69b1b761b45d5 Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Wed, 20 Mar 2024 17:02:04 -0500 Subject: [PATCH 088/310] Add domain and mapping files to support IcosXISC30E3r7 --- cime_config/config_grids.xml | 65 ++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 6c478c23541..7f83b139238 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -569,6 +569,16 @@ IcoswISC30E3r5 + + TL319 + TL319 + IcosXISC30E3r7 + JRA025 + null + null + IcosXISC30E3r7 + + TL319 TL319 @@ -2104,6 +2114,16 @@ IcoswISC30E3r5 + + ne30np4.pg2 + r05 + IcosXISC30E3r7 + r05 + null + null + IcosXISC30E3r7 + + ne30np4.pg2 r05 @@ -2466,6 +2486,8 @@ $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_ECwISC30to60E2r1.201007.nc $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_IcoswISC30E3r5.231121.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_IcosXISC30E3r7.240319.nc $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_oRRS18to6v3.220124.nc $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_oRRS18to6v3.220124.nc TL319 is JRA lat/lon grid: @@ -2575,6 +2597,8 @@ $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_oRRS18to6v3.211101.nc $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_IcoswISC30E3r5.231121.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_IcosXISC30E3r7.240319.nc $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_gx1v6.190806.nc $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_gx1v6.190806.nc ne30np4.pg2 is Spectral Elem 1-deg grid w/ 2x2 FV physics grid per element: @@ -2877,6 +2901,13 @@ IcoswISC30E3r5 is a MPAS ocean grid generated with the jigsaw/compass process using a dual mesh that is a subdivided icosahedron, resulting in a nearly uniform resolution of 30 km. Additionally, it has ocean in ice-shelf cavities: + + 463013 + 1 + $DIN_LOC_ROOT/share/domains/domain.ocn.IcosXISC30E3r7.240319.nc + IcosXISC30E3r7 is a MPAS ocean grid generated with the jigsaw/compass process using a dual mesh that is a subdivided icosahedron, resulting in a nearly uniform resolution of 30 km.: + + @@ -2909,6 +2940,8 @@ $DIN_LOC_ROOT/share/domains/domain.lnd.r05_WC14to60E2r3.200929.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcoswISC30E3r5.231121.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240319.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_gx1v6.191014.nc r05 is 1/2 degree river routing grid: @@ -3375,6 +3408,16 @@ cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcoswISC30E3r5_trfvnp2.20231121.nc + + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_traave.20240319.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240319.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240319.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240319.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240319.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240319.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240319.nc + + cpl/gridmaps/ne30pg3/map_ne30pg3_to_oEC60to30v3_mono.200331.nc cpl/gridmaps/ne30pg3/map_ne30pg3_to_oEC60to30v3_bilin.200331.nc @@ -4230,6 +4273,14 @@ cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_TL319_traave.20231121.nc + + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_traave.20240319.nc + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_trbilin.20240319.nc + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_esmfpatch.20240319.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240319.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240319.nc + + cpl/gridmaps/TL319/map_TL319_to_oRRS18to6v3_aave.220124.nc cpl/gridmaps/TL319/map_TL319_to_oRRS18to6v3_bilin.220124.nc @@ -4589,6 +4640,10 @@ cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_r05_traave.20231121.nc + + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_r05_traave.20240319.nc + + cpl/cpl6/map_EC30to60E2r2_to_r05_neareststod.220728.nc @@ -4775,6 +4830,11 @@ cpl/cpl6/map_JRA025_to_IcoswISC30E3r5_cstmnn.r150e300.20231121.nc + + cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + + cpl/cpl6/map_JRA025_to_oRRS18to6v3_smoothed.r50e100.220124.nc cpl/cpl6/map_JRA025_to_oRRS18to6v3_smoothed.r50e100.220124.nc @@ -4860,6 +4920,11 @@ cpl/cpl6/map_r05_to_IcoswISC30E3r5_cstmnn.r150e300.20231121.nc + + cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + + cpl/cpl6/map_r0125_to_WC14to60E2r3_smoothed.r150e300.200929.nc cpl/cpl6/map_r0125_to_WC14to60E2r3_smoothed.r150e300.200929.nc From 6e0a0263e9e9d66ae8a37377d5b3fddb79e70bc1 Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Tue, 26 Mar 2024 17:34:15 -0500 Subject: [PATCH 089/310] Replace domain and mapping files to support IcosXISC30E3r7 --- cime_config/config_grids.xml | 48 ++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 7f83b139238..fbed1ee1742 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -2486,8 +2486,8 @@ $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_ECwISC30to60E2r1.201007.nc $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_IcoswISC30E3r5.231121.nc - $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_IcosXISC30E3r7.240319.nc - $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_IcosXISC30E3r7.240326.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_IcosXISC30E3r7.240326.nc $DIN_LOC_ROOT/share/domains/domain.lnd.TL319_oRRS18to6v3.220124.nc $DIN_LOC_ROOT/share/domains/domain.ocn.TL319_oRRS18to6v3.220124.nc TL319 is JRA lat/lon grid: @@ -2597,8 +2597,8 @@ $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_oRRS18to6v3.211101.nc $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_IcoswISC30E3r5.231121.nc - $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_IcosXISC30E3r7.240319.nc - $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_IcosXISC30E3r7.240326.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_IcosXISC30E3r7.240326.nc $DIN_LOC_ROOT/share/domains/domain.lnd.ne30pg2_gx1v6.190806.nc $DIN_LOC_ROOT/share/domains/domain.ocn.ne30pg2_gx1v6.190806.nc ne30np4.pg2 is Spectral Elem 1-deg grid w/ 2x2 FV physics grid per element: @@ -2904,7 +2904,7 @@ 463013 1 - $DIN_LOC_ROOT/share/domains/domain.ocn.IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.IcosXISC30E3r7.240326.nc IcosXISC30E3r7 is a MPAS ocean grid generated with the jigsaw/compass process using a dual mesh that is a subdivided icosahedron, resulting in a nearly uniform resolution of 30 km.: @@ -2940,8 +2940,8 @@ $DIN_LOC_ROOT/share/domains/domain.lnd.r05_WC14to60E2r3.200929.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcoswISC30E3r5.231121.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcoswISC30E3r5.231121.nc - $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240319.nc - $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240319.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240326.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.r05_IcosXISC30E3r7.240326.nc $DIN_LOC_ROOT/share/domains/domain.lnd.r05_gx1v6.191014.nc r05 is 1/2 degree river routing grid: @@ -3409,13 +3409,13 @@ - cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_traave.20240319.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240319.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240319.nc - cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240319.nc - cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240319.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240319.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240319.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_traave.20240326.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240326.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trbilin.20240326.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240326.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_ne30pg2_traave.20240326.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240326.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_IcosXISC30E3r7_trfvnp2.20240326.nc @@ -4274,11 +4274,11 @@ - cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_traave.20240319.nc - cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_trbilin.20240319.nc - cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_esmfpatch.20240319.nc - cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240319.nc - cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240319.nc + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_traave.20240326.nc + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_trbilin.20240326.nc + cpl/gridmaps/TL319/map_TL319_to_IcosXISC30E3r7_esmfpatch.20240326.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240326.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_TL319_traave.20240326.nc @@ -4641,7 +4641,7 @@ - cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_r05_traave.20240319.nc + cpl/gridmaps/IcosXISC30E3r7/map_IcosXISC30E3r7_to_r05_traave.20240326.nc @@ -4831,8 +4831,8 @@ - cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc - cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240326.nc + cpl/cpl6/map_JRA025_to_IcosXISC30E3r7_cstmnn.r150e300.20240326.nc @@ -4921,8 +4921,8 @@ - cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc - cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240319.nc + cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240326.nc + cpl/cpl6/map_r05_to_IcosXISC30E3r7_cstmnn.r150e300.20240326.nc From 885c2616b1ebf10ba049e021ce0e808b0a28e298 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Thu, 28 Mar 2024 10:47:33 -0500 Subject: [PATCH 090/310] Adding PE layouts for Chrysalis --- cime_config/allactive/config_pesall.xml | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/cime_config/allactive/config_pesall.xml b/cime_config/allactive/config_pesall.xml index 7bcf72e44e6..ca034e18a7a 100644 --- a/cime_config/allactive/config_pesall.xml +++ b/cime_config/allactive/config_pesall.xml @@ -1586,6 +1586,67 @@ + + + + --compset WCYCL* --res ne30pg2_r05_IcosXISC30E3r7 on 20 nodes pure-MPI, ~7.25 sypd + + 1024 + 1024 + 256 + 640 + 384 + 385 + + + 0 + 0 + 1024 + 0 + 640 + 640 + + + + --compset WCYCL* --res ne30pg2_r05_IcosXISC30E3r7 on 54 nodes pure-MPI, ~17.5 sypd + + 2752 + 2752 + 704 + 2048 + 704 + 704 + + + 0 + 0 + 2752 + 0 + 2048 + 2048 + + + + --compset WCYCL* --res ne30pg2_r05_IcosXISC30E3r7 on 105 nodes pure-MPI, ~27.7 sypd + + 5440 + 5440 + 1280 + 4352 + 1088 + 1088 + + + 0 + 0 + 5440 + 0 + 4352 + 4352 + + + + From 7d38b82afcd50eabaee48e8fa3ffc77aef0d45b7 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 28 Mar 2024 15:33:31 -0600 Subject: [PATCH 091/310] Further development of MPAS-seaice documentation --- .../mpas-seaice/docs/dev-guide/index.md | 21 ++++- components/mpas-seaice/docs/figures/mesh.png | Bin 0 -> 62356 bytes components/mpas-seaice/docs/index.md | 34 +++++-- .../mpas-seaice/docs/tech-guide/index.md | 11 ++- .../mpas-seaice/docs/user-guide/index.md | 84 +++++++++++++++++- 5 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 components/mpas-seaice/docs/figures/mesh.png diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index afd02201db7..d0e1c6f7f7c 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -1,8 +1,16 @@ -Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. Please refer to LINK for instructions. For changes to Icepack, please consult the [CICE Consortium's recommendations for code contributions](https://github.com/CICE-Consortium/About-Us/wiki/Contributing). +Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. + +[Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) +[Development Guide for E3SM Documentation](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) + +**Icepack** +----------- + +For changes to Icepack, please consult the [CICE Consortium's recommendations for code contributions](https://github.com/CICE-Consortium/About-Us/wiki/Contributing). To access the column physics in Icepack, MPAS-seaice uses methods defined in ``icepack_intfc.F90``. The 'init' and 'query' methods are used to set and retrieve Icepack values. A 'write' method is also available for documenting these values. MPAS-seaice follows the 'icepack_warnings' methodology where ``icepack_warnings_aborted`` is checked and ``icepack_warnings_flush`` is called after every call to an Icepack method. It does not directly “use” Icepack data, accessing Icepack data only through these interfaces. -Basic Icepack development can be done in standalone mode using Icepack's testing scripts, directly in the submodule branch in MPAS-seaice. We recommend that Icepack developments be thoroughly tested within E3SM's coupled framework throughout the development process, including fully coupled simulations. +Basic Icepack development can be done in standalone mode using Icepack's testing scripts, directly in the submodule branch in MPAS-seaice. **We recommend that Icepack developments be thoroughly tested within E3SM's coupled framework throughout the development process, including fully coupled simulations.** **E3SM-Polar-Developer Script** ----------------------------------- @@ -21,13 +29,18 @@ The following examples describe how to use the script for development in Icepack **Set up and run baselines** -Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. (A file without ``config`` settings will create a single, default baseline.) - +Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. + $ less nset01.nlk [mpassi] config_column_physics_type = {'column_package','icepack'} config_use_snicar_ad = {.false.} +Notes: + + - A .nlk file without any config settings will create a baseline using default settings. + - The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. + Fetch E3SM (choose any name for the directory baselines01): ./E3SM-Polar-Developer.sh -s baselines01 -f git@github.com:E3SM-Project/E3SM diff --git a/components/mpas-seaice/docs/figures/mesh.png b/components/mpas-seaice/docs/figures/mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ddc3612388f642c0044ab4903698679f79b6c3 GIT binary patch literal 62356 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 literal 0 HcmV?d00001 diff --git a/components/mpas-seaice/docs/index.md b/components/mpas-seaice/docs/index.md index 24aeefd71d4..fca2046e2ac 100644 --- a/components/mpas-seaice/docs/index.md +++ b/components/mpas-seaice/docs/index.md @@ -7,15 +7,37 @@ MPAS-seaice is an unstructured-mesh sea-ice model that uses the Modeling for Pre * The [MPAS-seaice Technical Guide](tech-guide/index.md) explains the science behind MPAS-seaice code. **Icepack** +----------- -MPAS-seaice incorporates the Icepack software package for sea ice column physics, developed by the [CICE Consortium](https://github.com/cice-consortium), as a submodule. Icepack documentation provides a complete description of the column physics and instructions for using Icepack as a standalone model. The source code for this documentation is maintained in the Consortium's [Icepack repository](https://github.com/cice-consortium/Icepack), and it is fully rendered at -[readthedocs](https://cice-consortium-icepack.readthedocs.io/en/main/). +MPAS-seaice incorporates the Icepack software package for sea ice column physics, developed by the [CICE Consortium](https://github.com/cice-consortium), as a submodule. Icepack documentation provides a complete description of the column physics and instructions for using Icepack as a standalone model. The source code for this documentation is maintained in [E3SM's Icepack fork](https://github.com/E3SM-Project/Icepack/) (navigate to the desired branch, then to doc/source/, etc). This is the documentation associated with the latest Icepack version that has been merged into E3SM, plus any documentation changes made within E3SM itself. This documentation is fully rendered in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). -If modifications have been made to the Icepack repository and documentation that have not yet been migrated to E3SM's fork, then the documentation may not match E3SM's version of the Icepack code. E3SM does not render the readthedocs documentation from within its fork of the Icepack repository, but the source can be viewed directly at [https://github.com/E3SM-Project/Icepack/](https://github.com/E3SM-Project/Icepack/) (navigate to doc/source/ and then likely science_guide/, etc). This is the documentation associated with the latest Icepack version that has been merged into E3SM, plus any documentation changes made within E3SM itself. - -If the source code is difficult to read, the Icepack repository's documentation for the most recent release incorporated in E3SM can be found in readthedocs: +If needed, documentation for the most recent Icepack release incorporated in E3SM can be found in the CICE Consortium's readthedocs project area: * Check the [release tags](https://github.com/E3SM-Project/Icepack/tags) to get the release number. * Choose the release version of the documentation from the [Icepack release table](https://github.com/CICE-Consortium/Icepack/wiki/Icepack-Release-Table). -[Guidance for developing Icepack documentation](https://github.com/CICE-Consortium/About-Us/wiki/Documentation-Workflow-Guide) includes instructions for building the readthedocs documentation yourself. \ No newline at end of file +[Guidance for developing Icepack documentation](https://github.com/CICE-Consortium/About-Us/wiki/Documentation-Workflow-Guide) includes instructions for building the readthedocs documentation yourself. + + +**MPAS-seaice code structure** +------------------------------ + +Some MPAS-seaice functionality is sourced from the MPAS Framework: +``E3SM/components/mpas-framework``. In particular, see ``E3SM/components/mpas-framework/core_seaice``. + +Code structure within the ``mpas-seaice/``component-level directory: + +| Directories | Function | +| ----------- | -------- | +| `` bld`` | namelist configuration files | +| `` cime_config`` | build and configuration scripts | +| `` docs`` | this documentation | +| `` driver`` | coupling modules | +| `` src`` | source code for the model physics and output | +| `` src/analysis_members`` | source code for model output | +| `` src/column `` | source code for the (original) ``column_package`` | +| `` src/icepack `` | link to icepack submodule | +| `` src/model_forward`` | top-level mpas-seaice modules | +| `` src/shared`` | dynamics and general-purpose modules (e.g. mesh, constants) | +| `` testing`` | testing scripts | + diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index d5bcbf55653..8a993ab42d8 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -7,12 +7,15 @@ Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engw Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. https://doi.org/10.1029/2022MS003156 -Full documentation for Icepack can be found at …. Link to main location in E3SM docs and https://github.com/CICE-Consortium/Icepack (use readthedocs link). +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). + +A comprehensive paper describing MPAS-seaice is in preparation. **Meshes** ---------- -MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses a B-grid (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. +MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses a B-grid (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. For more information about the meshes, see the [Users Guide](../user-guide/index.md). +![mesh](../figures/mesh.png) **Velocity and Stresses** ------------------------- @@ -49,6 +52,10 @@ With advanced physics and biogeochemistry (BGC) options, MPAS-Seaice can be conf **Column Physics** ------------------ +The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. + +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). + Because of the strong thermal gradients between the (cold) atmosphere and (relatively warm) oceans in polar regions, a large portion of the physics in sea ice models can be described in a vertical column, without reference to neighboring grid cells. MPAS-Seaice shares the same column physics code as CICE through the Icepack library (Hunke et al., 2018), which is maintained by the CICE Consortium. This code includes several options for simulating sea ice thermodynamics, mechanical redistribution (ridging) and associated area and thickness changes. In addition, the model supports a number of tracers, including thickness, enthalpy, ice age, first-year ice area, deformed ice area and volume, melt ponds, snow properties and biogeochemistry. Icepack is implemented in MPAS-seaice as a git submodule. Icepack consists of three independent parts, the column physics code, the Icepack driver that supports stand-alone testing of the column physics code, and the Icepack scripts that build and test the Icepack model. E3SM uses only the column physics code, which is called for each ocean grid cell. Icepack’s own driver and testing scripts are used when preparing new developments to be merged back to the CICE Consortium’s Icepack repository. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index d4678df4a32..de73ce37843 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -1 +1,83 @@ -MPAS-seaice User's Guide is under construction. \ No newline at end of file +Guidance for using E3SM is available from [E3SM's public web site](https://e3sm.org/model/running-e3sm/e3sm-quick-start/). + +**MPAS Framework** +------------------ + +MPAS-seaice is built on the MPAS Framework. + +The MPAS Framework provides the foundation for a generalized geophysical fluid dynamics model on unstructured spherical and planar meshes. On top of the framework, implementations specific to the modeling of a particular physical system (e.g., land ice, ocean) are created as MPAS cores. To date, MPAS cores for atmosphere (Skamarock et al., 2012), ocean (Ringler et al., 2013; Petersen et al., 2015, 2018), shallow water (Ringler et al., 2011), sea ice (Turner et al., 2018), and land ice (Hoffman et al., 2018) have been implemented. The MPAS design philosophy is to leverage the efforts of developers from the various MPAS cores to provide common framework functionality with minimal effort, allowing MPAS core developers to focus on development of the physics and features relevant to their application. + +The framework code includes shared modules for fundamental model operation. Significant capabilities include: + + - Description of model data types. MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom accessor routines exist. Core-specific variables are easily defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. + - Description of the mesh specification. MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. More details are provided in the next section. + - Distributed memory parallelization and domain decomposition. The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each pro- cessor to, for example, optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. + - Parallel input and output capabilities. MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO) (Dennis et al., 2012). The Registry definitions control which fields can be input and/or output, and a framework streams functionality provides easy run- time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. + - Advanced timekeeping. MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). + - Run-time configurable control of model options. Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. + - Online, run-time analysis framework. A system for defining analysis of model states during run time, reducing the need for post-processing and model output. +Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. + + +The MPAS grid system requires the definition of seven elements. These seven elements are composed of two types of _cells_, two types of _lines_, and three types of _points_. These elements can be defined on either the plane or the surface of the sphere. The two types of cells form two meshes, a primal mesh composed of Voronoi regions and a dual mesh composed of Delaunay triangles. Each corner of a primal mesh cell is uniquely associated with the "center" of a dual mesh cell and vice versa. The boundary of a given primal mesh cell is composed of the set of lines that connect the centers of the dual mesh cells. Similarly, the boundary of a given dual mesh cell is composed of the set of lines that connect the center points of the associated primal mesh cells. A line segment that connects two primal mesh cell centers is uniquely associated with a line seqment that connects two dual mesh cell centers. We assume that these two line seqments cross and are orthogonal. Since the two line seqments crossing are othogonal, they form a convenient local coordinate system for each edge. + + + +**Configuring MPAS-seaice** +--------------------------- + +MPAS-seaice is controlled using namelist options. + + - Default namelist values are found in + ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml``. + - Namelist options are defined in + ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, + including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the element. + + +| Namelist Groups | Relevant application | +| ------------------- | -------------------- | +| ``seaice_model`` | general options | +| ``io`` | input/output | +| ``decomposition`` | mesh parallelization | +| ``restart`` | restarting the code | +| ``dimensions`` | ? | +| ``initialize`` | initialization | +| ``use_sections`` | ? | +| ``forcing`` | forcing for standalone configurations | +| ``velocity_solver`` | algorithms for solving the dynamics (velocity and stress) equations | +| ``advection`` | advection | +| ``column_package`` | general column package software configurations | +| ``biogeochemistry`` | biogeochemistry | +| ``shortwave`` | radiation | +| ``snow`` | advanced snow physics | +| ``meltponds`` | melt pond parameterization flags and parameters | +| ``thermodynamics`` | basic thermodynamics | +| ``itd`` | ice thickness distribution | +| ``floesize`` | floe size distribution | +| ``ridging`` | mechanical redistribution | +| ``atmosphere`` | atmospheric boundary layer and coupling | +| ``ocean`` | oceanic boundary layer and coupling | +| ``diagnostics`` | diagnostic output | +| ``prescribed_ice`` | for testing atmosphere simulations | + +**Icepack** +----------- + +The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. + +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). + +The mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in E3SM/components/mpas-seaice/src/..... + +**Configuring Model Input and Output** +-------------------------------------- + +The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream represents a fixed set of model fields, together with dimensions and attributes, that are all written or read together to or from the same file or set of files. Each MPAS model core may define its own set of default streams that it typically uses for reading initial conditions, for writing and reading restart fields, and for writing additional model history fields. Besides these default streams, users may define new streams to, e.g., write certain diagnostic fields at a higher temporal frequency than the usual model history fields. + +Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file is simply ‘streams.’ suffixed with the name of the core. For example, the streams for the sw (shallow-water) core are defined in a file named ‘streams.sw’. An XML stream file may further reference other text files that contain lists of the model fields that are read or written in each of the streams defined in the XML stream file + +Changes to the XML stream configuration file will take effect the next time an MPAS core is run; there is no need to re-compile after making modifications to the XML files. As described in the next section, it is therefore possible, e.g., to change the interval at which a stream is written, the template for the filenames associated with a stream, or the set of fields that are written to a stream, without the need to re-compile any code. + +Two classes of streams exist in MPAS: immutable streams and mutable streams. Immutable streams are those for which the set of fields that belong to the stream may not be modified at model run-time; however, it is possible to modify the interval at which the stream is read or written, the filename template describing the files containing the stream on disk, and several other parameters of the stream. In contrast, all aspects of mutable streams, including the set of fields that belong to the stream, may be modified at run-time. The motivation for the creation of two stream classes is the idea that an MPAS core may not function correctly if certain fields are not read in upon model start-up or written to restart files, and it is therefore not reasonable for users to modify this set of required fields at run-time. An MPAS core developer may choose to implement such streams as immutable streams. Since fields may not be added to an immutable stream at run-time, new immutable streams may not be defined at run-time, and the only type of new stream that may be defined at run-time is the mutable stream type. + From 4f7ae11f739e27cbca5868c348e546694759db4e Mon Sep 17 00:00:00 2001 From: Hong-Yi Li Date: Thu, 28 Mar 2024 16:51:25 -0700 Subject: [PATCH 092/310] Enforcing system abort when there is negative channel storage --- components/mosart/src/riverroute/MOSART_physics_mod.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/mosart/src/riverroute/MOSART_physics_mod.F90 b/components/mosart/src/riverroute/MOSART_physics_mod.F90 index 912014904e9..cad978577cd 100644 --- a/components/mosart/src/riverroute/MOSART_physics_mod.F90 +++ b/components/mosart/src/riverroute/MOSART_physics_mod.F90 @@ -682,8 +682,8 @@ subroutine Euler ! check for negative channel storage if (negchan < -1.e-10) then - write(iulog,*) 'Warning: Negative channel storage found! ',negchan -! call shr_sys_abort('mosart: negative channel storage') + write(iulog,*) 'Error: Negative channel storage found! ',negchan + call shr_sys_abort('mosart: negative channel storage') endif TRunoff%flow = TRunoff%flow / Tctl%DLevelH2R TRunoff%erowm_regi(:,nt_nmud:nt_nsan) = TRunoff%erowm_regi(:,nt_nmud:nt_nsan) / Tctl%DLevelH2R From 468157c237c1f008fdd1797f265c72ef10a78627 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Sun, 31 Mar 2024 22:57:43 -0700 Subject: [PATCH 093/310] remove history variables from fates allvar test module These variables were removed with API33 --- .../testdefs/testmods_dirs/elm/fates_cold_allvars/user_nl_elm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_allvars/user_nl_elm b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_allvars/user_nl_elm index 67f363bb0a3..2aff9c0b3c2 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_allvars/user_nl_elm +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_allvars/user_nl_elm @@ -14,8 +14,7 @@ hist_fincl1 = 'FATES_CROWNAREA_PF', 'FATES_CANOPYCROWNAREA_PF', 'FATES_LAISHA_TOP_CL', 'FATES_FABD_SUN_CLLLPF', 'FATES_FABD_SHA_CLLLPF', 'FATES_FABI_SUN_CLLLPF', 'FATES_FABI_SHA_CLLLPF', 'FATES_FABD_SUN_CLLL', 'FATES_FABD_SHA_CLLL', 'FATES_FABI_SUN_CLLL', 'FATES_FABI_SHA_CLLL', -'FATES_PARPROF_DIR_CLLLPF', 'FATES_PARPROF_DIF_CLLLPF', -'FATES_PARPROF_DIR_CLLL', 'FATES_PARPROF_DIF_CLLL', 'FATES_FABD_SUN_TOPLF_CL', +'FATES_PARPROF_DIR_CLLLPF', 'FATES_PARPROF_DIF_CLLLPF','FATES_FABD_SUN_TOPLF_CL', 'FATES_FABD_SHA_TOPLF_CL', 'FATES_FABI_SUN_TOPLF_CL', 'FATES_FABI_SHA_TOPLF_CL', 'FATES_NET_C_UPTAKE_CLLL', 'FATES_CROWNAREA_CLLL', 'FATES_NPLANT_CANOPY_SZAP', 'FATES_NPLANT_USTORY_SZAP', 'FATES_DDBH_CANOPY_SZAP', 'FATES_DDBH_USTORY_SZAP', From 5e483733fa22b287d006d6b3db9e3ed84a83e8a4 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Mon, 1 Apr 2024 10:29:35 -0700 Subject: [PATCH 094/310] fix fates path definition in two stream testmod --- .../testdefs/testmods_dirs/elm/fates_cold_twostream/README | 4 ++++ .../testmods_dirs/elm/fates_cold_twostream/shell_commands | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README index 9044e113547..8211a863c35 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/README @@ -13,3 +13,7 @@ that this file will require a custom update for every fates parameter file API u Allowing the HLM to generate the file at runtime via buildnamelist step will provide the capability to build the fates parameter file on the fly which with the appropriate values for this test. + +Note that the test as currently designed is not machine agnostic as it requires +specific shell commands for enabling the workflow to have access to ncgen. Currently +this test is only usable on perlmutter. diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands index dbf88f570c4..e3f2fa482d6 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold_twostream/shell_commands @@ -4,7 +4,7 @@ spack load nco SRCDIR=`./xmlquery SRCROOT --value` CASEDIR=`./xmlquery CASEROOT --value` -FATESDIR=$SRCDIR/src/fates +FATESDIR=$SRCDIR/components/elm/src/external_models/fates FATESPARAMFILE=$CASEDIR/fates_params_twostream.nc ncgen -o $FATESPARAMFILE $FATESDIR/parameter_files/fates_params_default.cdl From 1247c13c4890c2f8d26c2356904c550daf3f51ee Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Tue, 2 Apr 2024 14:07:28 -0400 Subject: [PATCH 095/310] output CCN fields per air mass --- components/eam/src/physics/cam/ndrop.F90 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/components/eam/src/physics/cam/ndrop.F90 b/components/eam/src/physics/cam/ndrop.F90 index b4dc999309b..12757ec7128 100644 --- a/components/eam/src/physics/cam/ndrop.F90 +++ b/components/eam/src/physics/cam/ndrop.F90 @@ -58,6 +58,8 @@ module ndrop (/ 0.02_r8, 0.05_r8, 0.1_r8, 0.2_r8, 0.5_r8, 1.0_r8 /) character(len=8) :: ccn_name(psat)= & (/'CCN1','CCN2','CCN3','CCN4','CCN5','CCN6'/) +character(len=8) :: ccnmair_name(psat)= & + (/'CCN1MAIR','CCN2MAIR','CCN3MAIR','CCN4MAIR','CCN5MAIR','CCN6MAIR'/) ! indices in state and pbuf structures integer :: numliq_idx = -1 @@ -274,6 +276,12 @@ subroutine ndrop_init call addfld('CCN5',(/ 'lev' /), 'A','1/cm3','CCN concentration at S=0.5%') call addfld('CCN6',(/ 'lev' /), 'A','1/cm3','CCN concentration at S=1.0%') + call addfld('CCN1MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=0.02%') + call addfld('CCN2MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=0.05%') + call addfld('CCN3MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=0.1%') + call addfld('CCN4MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=0.2%') + call addfld('CCN5MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=0.5%') + call addfld('CCN6MAIR',(/ 'lev' /), 'A','1/kg','CCN concentration at S=1.0%') call addfld('WTKE', (/ 'lev' /), 'A', 'm/s', 'Standard deviation of updraft velocity') call addfld('NDROPMIX', (/ 'lev' /), 'A', '1/kg/s', 'Droplet number mixing') @@ -436,6 +444,7 @@ subroutine dropmixnuc( & real(r8), allocatable :: coltend(:,:) ! column tendency for diagnostic output real(r8), allocatable :: coltend_cw(:,:) ! column tendency real(r8) :: ccn(pcols,pver,psat) ! number conc of aerosols activated at supersat + real(r8) :: ccnmair(pcols,pver,psat) ! number conc of aerosols activated at supersat integer :: ccn3d_idx real(r8), pointer :: ccn3d(:, :) @@ -1105,9 +1114,10 @@ subroutine dropmixnuc( & call outfld('NDROPMIX', ndropmix, pcols, lchnk) call outfld('WTKE ', wtke, pcols, lchnk) - call ccncalc(state, pbuf, cs, ccn) + call ccncalc(state, pbuf, cs, ccn, ccnmair) do l = 1, psat call outfld(ccn_name(l), ccn(1,1,l), pcols, lchnk) + call outfld(ccnmair_name(l), ccnmair(1,1,l), pcols, lchnk) enddo if(do_aerocom_ind3) then @@ -1705,6 +1715,7 @@ end subroutine maxsat !=============================================================================== subroutine ccncalc(state, pbuf, cs, ccn) +subroutine ccncalc(state, pbuf, cs, ccn, ccnmair) ! calculates number concentration of aerosols activated as CCN at ! supersaturation supersat. @@ -1721,6 +1732,7 @@ subroutine ccncalc(state, pbuf, cs, ccn) real(r8), intent(in) :: cs(pcols,pver) ! air density (kg/m3) real(r8), intent(out) :: ccn(pcols,pver,psat) ! number conc of aerosols activated at supersat (#/m3) + real(r8), intent(out) :: ccnmair(pcols,pver,psat) ! number conc of aerosols activated at supersat (#/kg) ! local @@ -1770,6 +1782,7 @@ subroutine ccncalc(state, pbuf, cs, ccn) end do ccn = 0._r8 + ccnmair = 0._r8 do k=top_lev,pver do i=1,ncol @@ -1796,6 +1809,7 @@ subroutine ccncalc(state, pbuf, cs, ccn) do i=1,ncol arg(i)=argfactor(m)*log(sm(i)/super(l)) ccn(i,k,l)=ccn(i,k,l)+naerosol(i)*0.5_r8*(1._r8-erf(arg(i))) + ccnmair(i,k,l)=ccn(i,k,l)/cs(i,k) ! convert from #/m3 to #/kg enddo enddo enddo From fb025c59fda2db6e6b1e50ac4895982f776c7a58 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Tue, 2 Apr 2024 14:08:15 -0400 Subject: [PATCH 096/310] avoid repeating subroutine statement --- components/eam/src/physics/cam/ndrop.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/components/eam/src/physics/cam/ndrop.F90 b/components/eam/src/physics/cam/ndrop.F90 index 12757ec7128..4abe5a81168 100644 --- a/components/eam/src/physics/cam/ndrop.F90 +++ b/components/eam/src/physics/cam/ndrop.F90 @@ -1714,7 +1714,6 @@ end subroutine maxsat !=============================================================================== -subroutine ccncalc(state, pbuf, cs, ccn) subroutine ccncalc(state, pbuf, cs, ccn, ccnmair) ! calculates number concentration of aerosols activated as CCN at From c80ebd360e9c0d5722e677837f4a23f89cab2cc6 Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Fri, 29 Mar 2024 07:50:17 -0700 Subject: [PATCH 097/310] Add provis_state subpool at RK4 init - Avoids create/destroy at each timestep --- .../src/framework/mpas_pool_routines.F | 196 ++++++++++++------ .../mpas_ocn_time_integration_rk4.F | 80 ++++--- 2 files changed, 165 insertions(+), 111 deletions(-) diff --git a/components/mpas-framework/src/framework/mpas_pool_routines.F b/components/mpas-framework/src/framework/mpas_pool_routines.F index 9611129c8ea..161ddcb0488 100644 --- a/components/mpas-framework/src/framework/mpas_pool_routines.F +++ b/components/mpas-framework/src/framework/mpas_pool_routines.F @@ -932,20 +932,32 @@ end subroutine mpas_pool_clone_pool!}}} !> copy the data from the members of srcPool into the members of destPool. ! !----------------------------------------------------------------------- - recursive subroutine mpas_pool_copy_pool(srcPool, destPool)!{{{ + recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{{{ implicit none type (mpas_pool_type), pointer :: srcPool type (mpas_pool_type), pointer :: destPool + integer, intent(in), optional :: overrideTimeLevel integer :: i, j, threadNum + integer :: timeLevel type (mpas_pool_member_type), pointer :: ptr type (mpas_pool_data_type), pointer :: dptr type (mpas_pool_data_type), pointer :: mem threadNum = mpas_threading_get_thread_num() + timeLevel = 2 + + if (present(overrideTimeLevel)) then + timeLevel = overrideTimeLevel + + if (timeLevel < 1) then + call mpas_pool_set_error_level(MPAS_POOL_FATAL) + call pool_mesg('ERROR in mpas_pool_clone_pool: Input time levels cannot be less than 1.') + end if + end if if ( threadNum == 0 ) then do i=1,srcPool % size @@ -1014,83 +1026,135 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool)!{{{ else if (associated(dptr % l0)) then call mpas_duplicate_field(dptr % l0, mem % l0, copy_array_only=.true.) else if (associated(dptr % r0a)) then - do j=1,mem % contentsTimeLevs - mem % r0 => mem % r0a(j) - call mpas_duplicate_field(dptr % r0a(j), mem % r0, copy_array_only=.true.) - nullify(mem % r0) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r0 => mem % r0a(j) + call mpas_duplicate_field(dptr % r0a(j), mem % r0, copy_array_only=.true.) + nullify(mem % r0) + end do + else + call mpas_duplicate_field(dptr % r0a(1), mem % r0, copy_array_only=.true.) + end if else if (associated(dptr % r1a)) then - do j=1,mem % contentsTimeLevs - mem % r1 => mem % r1a(j) - call mpas_duplicate_field(dptr % r1a(j), mem % r1, copy_array_only=.true.) - nullify(mem % r1) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r1 => mem % r1a(j) + call mpas_duplicate_field(dptr % r1a(j), mem % r1, copy_array_only=.true.) + nullify(mem % r1) + end do + else + call mpas_duplicate_field(dptr % r1a(1), mem % r1, copy_array_only=.true.) + end if else if (associated(dptr % r2a)) then - do j=1,mem % contentsTimeLevs - mem % r2 => mem % r2a(j) - call mpas_duplicate_field(dptr % r2a(j), mem % r2, copy_array_only=.true.) - nullify(mem % r2) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r2 => mem % r2a(j) + call mpas_duplicate_field(dptr % r2a(j), mem % r2, copy_array_only=.true.) + nullify(mem % r2) + end do + else + call mpas_duplicate_field(dptr % r2a(1), mem % r2, copy_array_only=.true.) + end if else if (associated(dptr % r3a)) then - do j=1,mem % contentsTimeLevs - mem % r3 => mem % r3a(j) - call mpas_duplicate_field(dptr % r3a(j), mem % r3, copy_array_only=.true.) - nullify(mem % r3) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r3 => mem % r3a(j) + call mpas_duplicate_field(dptr % r3a(j), mem % r3, copy_array_only=.true.) + nullify(mem % r3) + end do + else + call mpas_duplicate_field(dptr % r3a(1), mem % r3, copy_array_only=.true.) + end if else if (associated(dptr % r4a)) then - do j=1,mem % contentsTimeLevs - mem % r4 => mem % r4a(j) - call mpas_duplicate_field(dptr % r4a(j), mem % r4, copy_array_only=.true.) - nullify(mem % r4) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r4 => mem % r4a(j) + call mpas_duplicate_field(dptr % r4a(j), mem % r4, copy_array_only=.true.) + nullify(mem % r4) + end do + else + call mpas_duplicate_field(dptr % r4a(1), mem % r4, copy_array_only=.true.) + end if else if (associated(dptr % r5a)) then - do j=1,mem % contentsTimeLevs - mem % r5 => mem % r5a(j) - call mpas_duplicate_field(dptr % r5a(j), mem % r5, copy_array_only=.true.) - nullify(mem % r5) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % r5 => mem % r5a(j) + call mpas_duplicate_field(dptr % r5a(j), mem % r5, copy_array_only=.true.) + nullify(mem % r5) + end do + else + call mpas_duplicate_field(dptr % r5a(1), mem % r5, copy_array_only=.true.) + end if else if (associated(dptr % i0a)) then - do j=1,mem % contentsTimeLevs - mem % i0 => mem % i0a(j) - call mpas_duplicate_field(dptr % i0a(j), mem % i0, copy_array_only=.true.) - nullify(mem % i0) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % i0 => mem % i0a(j) + call mpas_duplicate_field(dptr % i0a(j), mem % i0, copy_array_only=.true.) + nullify(mem % i0) + end do + else + call mpas_duplicate_field(dptr % i0a(1), mem % i0, copy_array_only=.true.) + end if else if (associated(dptr % i1a)) then - do j=1,mem % contentsTimeLevs - mem % i1 => mem % i1a(j) - call mpas_duplicate_field(dptr % i1a(j), mem % i1, copy_array_only=.true.) - nullify(mem % i1) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % i1 => mem % i1a(j) + call mpas_duplicate_field(dptr % i1a(j), mem % i1, copy_array_only=.true.) + nullify(mem % i1) + end do + else + call mpas_duplicate_field(dptr % i1a(1), mem % i1, copy_array_only=.true.) + end if else if (associated(dptr % i2a)) then - do j=1,mem % contentsTimeLevs - mem % i2 => mem % i2a(j) - call mpas_duplicate_field(dptr % i2a(j), mem % i2, copy_array_only=.true.) - nullify(mem % i2) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % i2 => mem % i2a(j) + call mpas_duplicate_field(dptr % i2a(j), mem % i2, copy_array_only=.true.) + nullify(mem % i2) + end do + else + call mpas_duplicate_field(dptr % i2a(1), mem % i2, copy_array_only=.true.) + end if else if (associated(dptr % i3a)) then - do j=1,mem % contentsTimeLevs - mem % i3 => mem % i3a(j) - call mpas_duplicate_field(dptr % i3a(j), mem % i3, copy_array_only=.true.) - nullify(mem % i3) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % i3 => mem % i3a(j) + call mpas_duplicate_field(dptr % i3a(j), mem % i3, copy_array_only=.true.) + nullify(mem % i3) + end do + else + call mpas_duplicate_field(dptr % i3a(1), mem % i3, copy_array_only=.true.) + end if else if (associated(dptr % c0a)) then - do j=1,mem % contentsTimeLevs - mem % c0 => mem % c0a(j) - call mpas_duplicate_field(dptr % c0a(j), mem % c0, copy_array_only=.true.) - nullify(mem % c0) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % c0 => mem % c0a(j) + call mpas_duplicate_field(dptr % c0a(j), mem % c0, copy_array_only=.true.) + nullify(mem % c0) + end do + else + call mpas_duplicate_field(dptr % c0a(1), mem % c0, copy_array_only=.true.) + end if else if (associated(dptr % c1a)) then - do j=1,mem % contentsTimeLevs - mem % c1 => mem % c1a(j) - call mpas_duplicate_field(dptr % c1a(j), mem % c1, copy_array_only=.true.) - nullify(mem % c1) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % c1 => mem % c1a(j) + call mpas_duplicate_field(dptr % c1a(j), mem % c1, copy_array_only=.true.) + nullify(mem % c1) + end do + else + call mpas_duplicate_field(dptr % c1a(1), mem % c1, copy_array_only=.true.) + end if else if (associated(dptr % l0a)) then - do j=1,mem % contentsTimeLevs - mem % l0 => mem % l0a(j) - call mpas_duplicate_field(dptr % l0a(j), mem % l0, copy_array_only=.true.) - nullify(mem % l0) - end do + if (timeLevel > 1) then + do j=1,mem % contentsTimeLevs + mem % l0 => mem % l0a(j) + call mpas_duplicate_field(dptr % l0a(j), mem % l0, copy_array_only=.true.) + nullify(mem % l0) + end do + else + call mpas_duplicate_field(dptr % l0a(1), mem % l0, copy_array_only=.true.) + end if else call pool_mesg('While copying pool, member '//trim(ptr % key)//' has no valid field pointers.') end if diff --git a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_rk4.F b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_rk4.F index af583448157..d4f4021eb67 100644 --- a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_rk4.F +++ b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_rk4.F @@ -228,10 +228,9 @@ subroutine ocn_time_integrator_rk4(domain, dt)!{{{ call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_subpool(block % structs, 'diagnostics', diagnosticsPool) - call mpas_pool_create_pool(provisStatePool) + call mpas_pool_get_subpool(block % structs, 'provis_state', provisStatePool) - call mpas_pool_clone_pool(statePool, provisStatePool, 1) - call mpas_pool_add_subpool(block % structs, 'provis_state', provisStatePool) + call mpas_pool_copy_pool(statePool, provisStatePool, 1) call mpas_pool_get_dimension(block % dimensions, 'nCells', nCells) call mpas_pool_get_dimension(block % dimensions, 'nEdges', nEdges) @@ -315,37 +314,6 @@ subroutine ocn_time_integrator_rk4(domain, dt)!{{{ block => block % next end do - block => domain % blocklist - do while(associated(block)) - if (associated(block % prev)) then - call mpas_pool_get_subpool(block % prev % structs, 'provis_state', prevProvisPool) - else - nullify(prevProvisPool) - end if - - if (associated(block % next)) then - call mpas_pool_get_subpool(block % next % structs, 'provis_state', nextProvisPool) - else - nullify(nextProvisPool) - end if - - call mpas_pool_get_subpool(block % structs, 'provis_state', provisStatePool) - - if (associated(prevProvisPool) .and. associated(nextProvisPool)) then - call mpas_pool_link_pools(provisStatePool, prevProvisPool, nextProvisPool) - else if (associated(prevProvisPool)) then - call mpas_pool_link_pools(provisStatePool, prevProvisPool) - else if (associated(nextProvisPool)) then - call mpas_pool_link_pools(provisStatePool, nextPool=nextProvisPool) - else - call mpas_pool_link_pools(provisStatePool) - end if - - call mpas_pool_link_parinfo(block, provisStatePool) - - block => block % next - end do - ! Fourth-order Runge-Kutta, solving dy/dt = f(t,y) is typically written as follows ! where h = delta t is the large time step. Here f(t,y) is the right hand side, ! called the tendencies in the code below. @@ -853,16 +821,6 @@ subroutine ocn_time_integrator_rk4(domain, dt)!{{{ call mpas_timer_stop("RK4-cleanup phase") - block => domain % blocklist - do while(associated(block)) - call mpas_pool_get_subpool(block % structs, 'provis_state', provisStatePool) - - call mpas_pool_destroy_pool(provisStatePool) - - call mpas_pool_remove_subpool(block % structs, 'provis_state') - block => block % next - end do - end subroutine ocn_time_integrator_rk4!}}} subroutine ocn_time_integrator_rk4_compute_vel_tends(domain, block, dt, & @@ -1731,7 +1689,8 @@ subroutine ocn_time_integration_rk4_init(domain)!{{{ ! local variables !----------------------------------------------------------------- type (block_type), pointer :: block - type (mpas_pool_type), pointer :: meshPool + type (mpas_pool_type), pointer :: meshPool, statePool, provisStatePool + type (mpas_pool_type), pointer :: nextProvisPool, prevProvisPool logical, pointer :: config_use_debugTracers integer, pointer :: nVertLevels ! End preamble @@ -1742,12 +1701,43 @@ subroutine ocn_time_integration_rk4_init(domain)!{{{ block => domain % blocklist do while (associated(block)) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) + call mpas_pool_get_subpool(block % structs, 'state', statePool) call mpas_pool_get_dimension(meshPool, 'nVertLevels', nVertLevels) if (config_use_debugTracers .and. nVertLevels == 1) then call mpas_log_write('Debug tracers may cause failures in a ' & // 'single layer case. Consider setting ' & // 'config_use_debugTracers to .false.', MPAS_LOG_WARN) endif + + call mpas_pool_create_pool(provisStatePool) + call mpas_pool_clone_pool(statePool, provisStatePool, 1) + call mpas_pool_add_subpool(block % structs, 'provis_state', provisStatePool) + + if (associated(block % prev)) then + call mpas_pool_get_subpool(block % prev % structs, 'provis_state', prevProvisPool) + else + nullify(prevProvisPool) + end if + + if (associated(block % next)) then + call mpas_pool_get_subpool(block % next % structs, 'provis_state', nextProvisPool) + else + nullify(nextProvisPool) + end if + + call mpas_pool_get_subpool(block % structs, 'provis_state', provisStatePool) + + if (associated(prevProvisPool) .and. associated(nextProvisPool)) then + call mpas_pool_link_pools(provisStatePool, prevProvisPool, nextProvisPool) + else if (associated(prevProvisPool)) then + call mpas_pool_link_pools(provisStatePool, prevProvisPool) + else if (associated(nextProvisPool)) then + call mpas_pool_link_pools(provisStatePool, nextPool=nextProvisPool) + else + call mpas_pool_link_pools(provisStatePool) + end if + + call mpas_pool_link_parinfo(block, provisStatePool) block => block % next end do From c0abc0b288bfec6ba266647fd5266be744d516e1 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Tue, 2 Apr 2024 16:06:11 -0500 Subject: [PATCH 098/310] Add default PE layout and remove unecessary nl file edits Add a defulat PE layout for pm-cpu and Chrys for the 1to10km Greenland init. cond. when running IG cases. Remove mali user namelist file edits for new 20km tests as they are redundant w/ default settings. --- components/elm/cime_config/config_pes.xml | 38 +++++++++++++++++++ .../testmods_dirs/elm/gis20kmERP/user_nl_mali | 8 ---- .../testmods_dirs/elm/gis20kmERS/user_nl_mali | 8 ---- .../testmods_dirs/elm/gis20kmSMS/user_nl_mali | 8 ---- 4 files changed, 38 insertions(+), 24 deletions(-) delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali diff --git a/components/elm/cime_config/config_pes.xml b/components/elm/cime_config/config_pes.xml index 14384649a1c..ab67953ca90 100644 --- a/components/elm/cime_config/config_pes.xml +++ b/components/elm/cime_config/config_pes.xml @@ -561,4 +561,42 @@ + + + + GIS 1-to-10km (high-res) config + 128 + 128 + + 512 + 512 + 512 + 512 + 512 + 512 + 512 + 512 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali deleted file mode 100644 index 2b3fdea5d15..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/user_nl_mali +++ /dev/null @@ -1,8 +0,0 @@ -config_velocity_solver = 'FO' -config_thickness_advection = 'fo' -config_thermal_solver = 'none' -config_pio_num_iotasks = 47 -config_pio_stride = 64 -config_calving = 'none' -config_restore_calving_front = .true. -config_dt = '0000-00-01_00:00:00' diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali deleted file mode 100644 index 2b3fdea5d15..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERS/user_nl_mali +++ /dev/null @@ -1,8 +0,0 @@ -config_velocity_solver = 'FO' -config_thickness_advection = 'fo' -config_thermal_solver = 'none' -config_pio_num_iotasks = 47 -config_pio_stride = 64 -config_calving = 'none' -config_restore_calving_front = .true. -config_dt = '0000-00-01_00:00:00' diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali deleted file mode 100644 index 2b3fdea5d15..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmSMS/user_nl_mali +++ /dev/null @@ -1,8 +0,0 @@ -config_velocity_solver = 'FO' -config_thickness_advection = 'fo' -config_thermal_solver = 'none' -config_pio_num_iotasks = 47 -config_pio_stride = 64 -config_calving = 'none' -config_restore_calving_front = .true. -config_dt = '0000-00-01_00:00:00' From 12368b9d7f71efad9cb16dc9444fdc587a6a3497 Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Wed, 3 Apr 2024 09:55:10 -0700 Subject: [PATCH 099/310] Improve overrideTimeLevels option for mpas_pool_copy_pool --- .../src/framework/mpas_pool_routines.F | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/components/mpas-framework/src/framework/mpas_pool_routines.F b/components/mpas-framework/src/framework/mpas_pool_routines.F index 161ddcb0488..89a489ca308 100644 --- a/components/mpas-framework/src/framework/mpas_pool_routines.F +++ b/components/mpas-framework/src/framework/mpas_pool_routines.F @@ -932,30 +932,30 @@ end subroutine mpas_pool_clone_pool!}}} !> copy the data from the members of srcPool into the members of destPool. ! !----------------------------------------------------------------------- - recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{{{ + recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevels)!{{{ implicit none type (mpas_pool_type), pointer :: srcPool type (mpas_pool_type), pointer :: destPool - integer, intent(in), optional :: overrideTimeLevel + integer, intent(in), optional :: overrideTimeLevels integer :: i, j, threadNum - integer :: timeLevel + integer :: timeLevels type (mpas_pool_member_type), pointer :: ptr type (mpas_pool_data_type), pointer :: dptr type (mpas_pool_data_type), pointer :: mem threadNum = mpas_threading_get_thread_num() - timeLevel = 2 + timeLevels = -1 - if (present(overrideTimeLevel)) then - timeLevel = overrideTimeLevel + if (present(overrideTimeLevels)) then + timeLevels = overrideTimeLevels - if (timeLevel < 1) then + if (timeLevels < 1) then call mpas_pool_set_error_level(MPAS_POOL_FATAL) - call pool_mesg('ERROR in mpas_pool_clone_pool: Input time levels cannot be less than 1.') + call pool_mesg('ERROR in mpas_pool_copy_pool: Input time levels cannot be less than 1.') end if end if @@ -997,8 +997,14 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ dptr => ptr % data - ! Do this through brute force... mem => pool_get_member(destPool, ptr % key, MPAS_POOL_FIELD) + + ! Allow for overrideTimeLevels + if (timeLevels == -1) then + timeLevels = mem % contentsTimeLevs + endif + + ! Do this through brute force... if (associated(dptr % r0)) then call mpas_duplicate_field(dptr % r0, mem % r0, copy_array_only=.true.) else if (associated(dptr % r1)) then @@ -1026,8 +1032,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ else if (associated(dptr % l0)) then call mpas_duplicate_field(dptr % l0, mem % l0, copy_array_only=.true.) else if (associated(dptr % r0a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r0 => mem % r0a(j) call mpas_duplicate_field(dptr % r0a(j), mem % r0, copy_array_only=.true.) nullify(mem % r0) @@ -1036,8 +1042,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r0a(1), mem % r0, copy_array_only=.true.) end if else if (associated(dptr % r1a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r1 => mem % r1a(j) call mpas_duplicate_field(dptr % r1a(j), mem % r1, copy_array_only=.true.) nullify(mem % r1) @@ -1046,8 +1052,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r1a(1), mem % r1, copy_array_only=.true.) end if else if (associated(dptr % r2a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r2 => mem % r2a(j) call mpas_duplicate_field(dptr % r2a(j), mem % r2, copy_array_only=.true.) nullify(mem % r2) @@ -1056,8 +1062,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r2a(1), mem % r2, copy_array_only=.true.) end if else if (associated(dptr % r3a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r3 => mem % r3a(j) call mpas_duplicate_field(dptr % r3a(j), mem % r3, copy_array_only=.true.) nullify(mem % r3) @@ -1066,8 +1072,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r3a(1), mem % r3, copy_array_only=.true.) end if else if (associated(dptr % r4a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r4 => mem % r4a(j) call mpas_duplicate_field(dptr % r4a(j), mem % r4, copy_array_only=.true.) nullify(mem % r4) @@ -1076,8 +1082,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r4a(1), mem % r4, copy_array_only=.true.) end if else if (associated(dptr % r5a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % r5 => mem % r5a(j) call mpas_duplicate_field(dptr % r5a(j), mem % r5, copy_array_only=.true.) nullify(mem % r5) @@ -1086,8 +1092,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % r5a(1), mem % r5, copy_array_only=.true.) end if else if (associated(dptr % i0a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % i0 => mem % i0a(j) call mpas_duplicate_field(dptr % i0a(j), mem % i0, copy_array_only=.true.) nullify(mem % i0) @@ -1096,8 +1102,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % i0a(1), mem % i0, copy_array_only=.true.) end if else if (associated(dptr % i1a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % i1 => mem % i1a(j) call mpas_duplicate_field(dptr % i1a(j), mem % i1, copy_array_only=.true.) nullify(mem % i1) @@ -1106,8 +1112,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % i1a(1), mem % i1, copy_array_only=.true.) end if else if (associated(dptr % i2a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % i2 => mem % i2a(j) call mpas_duplicate_field(dptr % i2a(j), mem % i2, copy_array_only=.true.) nullify(mem % i2) @@ -1116,8 +1122,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % i2a(1), mem % i2, copy_array_only=.true.) end if else if (associated(dptr % i3a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % i3 => mem % i3a(j) call mpas_duplicate_field(dptr % i3a(j), mem % i3, copy_array_only=.true.) nullify(mem % i3) @@ -1126,8 +1132,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % i3a(1), mem % i3, copy_array_only=.true.) end if else if (associated(dptr % c0a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % c0 => mem % c0a(j) call mpas_duplicate_field(dptr % c0a(j), mem % c0, copy_array_only=.true.) nullify(mem % c0) @@ -1136,8 +1142,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % c0a(1), mem % c0, copy_array_only=.true.) end if else if (associated(dptr % c1a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % c1 => mem % c1a(j) call mpas_duplicate_field(dptr % c1a(j), mem % c1, copy_array_only=.true.) nullify(mem % c1) @@ -1146,8 +1152,8 @@ recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevel)!{ call mpas_duplicate_field(dptr % c1a(1), mem % c1, copy_array_only=.true.) end if else if (associated(dptr % l0a)) then - if (timeLevel > 1) then - do j=1,mem % contentsTimeLevs + if (timeLevels > 1) then + do j=1,timeLevels mem % l0 => mem % l0a(j) call mpas_duplicate_field(dptr % l0a(j), mem % l0, copy_array_only=.true.) nullify(mem % l0) From 6c909cae74f18edc9bba63e794a115e8e3ea6cef Mon Sep 17 00:00:00 2001 From: jayeshkrishna Date: Thu, 4 Apr 2024 11:02:03 -0500 Subject: [PATCH 100/310] Upgrading to SCORPIO v1.6.2 SCORPIO v1.6.2 includes the following fixes/enhancements, * Support for standalone EAMXX/SCREAM builds * A new rearranger, PIO_REARR_ANY SCORPIO v1.6.1 includes the following fixes, * Fixes for ADIOS to NetCDF conversion tool hangs/crashes in certain scenarios * Fixes for ultra high res simulations using the SUBSET rearranger SCORPIO v1.6.0 includes the following fixes/enhancements, * Support for reading ADIOS BP files and updates to the BP to NetCDF conversion tool to integrate with CIME/E3SM * Adding a SCORPIO CMake package during install * Support for new CDF5 types in the C interface * Support for pio_set_fill() * Fix for performance issues while writing large output files (hang during enddef() call) * Misc bug fixes --- externals/scorpio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/scorpio b/externals/scorpio index de0b1ca2200..dc6f1eb24f3 160000 --- a/externals/scorpio +++ b/externals/scorpio @@ -1 +1 @@ -Subproject commit de0b1ca2200f62c6eb5e3fd40147965409e97123 +Subproject commit dc6f1eb24f3dae1dcb0ebb13130c4941dc9bd445 From 353ab56ebf294f4b0158d2273b776a0deda4b4f9 Mon Sep 17 00:00:00 2001 From: jayeshkrishna Date: Thu, 4 Apr 2024 11:32:08 -0500 Subject: [PATCH 101/310] Reset MPICH GPU support for conversion tool Disable MPICH/MPI GPU support for ADIOS to NetCDF conversion tool. Without this change the conversion tool crashes (with message "MPIDI_CRAY_init: GPU_SUPPORT_ENABLED is requested, but GTL library is not linked" - most likely due to the way SCREAM builds/links SCORPIO) on Frontier. --- cime_config/customize/case_post_run_io.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cime_config/customize/case_post_run_io.py b/cime_config/customize/case_post_run_io.py index bb44477ebb5..83419aa8134 100755 --- a/cime_config/customize/case_post_run_io.py +++ b/cime_config/customize/case_post_run_io.py @@ -74,6 +74,12 @@ def _convert_adios_to_nc(case): # Load the environment case.load_env(reset=True) + # Reset MPICH/MPI GPU support, if enabled + is_mpich_gpu_enabled = os.environ.get('MPICH_GPU_SUPPORT_ENABLED') + if int(0 if is_mpich_gpu_enabled is None else is_mpich_gpu_enabled) == 1: + logger.info("Resetting support for GPU in MPICH/MPI library (since its not used by the tool)") + os.environ['MPICH_GPU_SUPPORT_ENABLED'] = str(0); + run_func = lambda: run_cmd(cmd, from_dir=rundir)[0] # Run the modified case From daee1ecfded5e55c4e8acd801f2c56f143d149d8 Mon Sep 17 00:00:00 2001 From: noel Date: Thu, 4 Apr 2024 19:53:54 -0700 Subject: [PATCH 102/310] remove "use mct_mod" to avoid build error with nvidia as there was conflict with lsize integer --- components/data_comps/docn/src/docn_comp_mod.F90 | 1 - 1 file changed, 1 deletion(-) diff --git a/components/data_comps/docn/src/docn_comp_mod.F90 b/components/data_comps/docn/src/docn_comp_mod.F90 index 03fc4a3459a..f5d45f83277 100644 --- a/components/data_comps/docn/src/docn_comp_mod.F90 +++ b/components/data_comps/docn/src/docn_comp_mod.F90 @@ -120,7 +120,6 @@ subroutine docn_comp_init(Eclock, x2o, o2x, & scmMode, scm_multcols, scmlat, scmlon, scm_nx, scm_ny) ! !DESCRIPTION: initialize docn model - use mct_mod use pio , only : iosystem_desc_t use shr_pio_mod, only : shr_pio_getiosys, shr_pio_getiotype #ifdef HAVE_MOAB From 2f49d4920706c1ba5e4088c6da4cd2f9728f7c1a Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Fri, 5 Apr 2024 07:02:25 -0700 Subject: [PATCH 103/310] Add addtional subpools for LTS and FBLTS at init --- .../mpas_ocn_time_integration_fblts.F | 119 +++++----- .../mpas_ocn_time_integration_lts.F | 204 +++++++++--------- 2 files changed, 174 insertions(+), 149 deletions(-) diff --git a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_fblts.F b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_fblts.F index 36b6dc05766..5b0db3848cb 100644 --- a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_fblts.F +++ b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_fblts.F @@ -224,13 +224,12 @@ subroutine ocn_time_integrator_fblts(domain, dt)!{{{ call mpas_pool_get_array(LTSPool, 'nEdgesInLTSRegion', nEdgesInLTSRegion) ! Create and retrieve additional pools for LTS - call mpas_pool_create_pool(tendSum3rdPool) - call mpas_pool_clone_pool(tendPool, tendSum3rdPool, 1) - call mpas_pool_create_pool(tendSlowPool) - call mpas_pool_clone_pool(tendPool, tendSlowPool, 1) + call mpas_pool_get_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_get_subpool(block % structs, 'tend_slow', tendSlowPool) + + call mpas_pool_copy_pool(tendPool, tendSum3rdPool, 1) + call mpas_pool_copy_pool(tendPool, tendSlowPool, 1) - call mpas_pool_add_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_add_subpool(block % structs, 'tend_slow', tendSlowPool) call mpas_pool_get_array(tendSlowPool, 'normalVelocity', & normalVelocityTendSlow) @@ -259,47 +258,6 @@ subroutine ocn_time_integrator_fblts(domain, dt)!{{{ normalVelocityTendSum3rd(:,:) = 0.0_RKIND layerThicknessTendSum3rd(:,:) = 0.0_RKIND - if (associated(block % prev)) then - call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_get_subpool(block % prev % structs, 'tend_slow', tendSlowPool) - else - nullify(prevTendSum3rdPool) - nullify(prevTendSlowPool) - end if - - if (associated(block % next)) then - call mpas_pool_get_subpool(block % next % structs, 'tend_sum_3rd', nextTendSum3rdPool) - call mpas_pool_get_subpool(block % next % structs, 'tend_slow', nextTendSlowPool) - else - nullify(nextTendSum3rdPool) - nullify(nextTendSlowPool) - end if - - call mpas_pool_get_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_get_subpool(block % structs, 'tend_slow', tendSlowPool) - - if (associated(prevTendSum3rdPool) .and. associated(nextTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool, nextTendSum3rdPool) - else if (associated(prevTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool) - else if (associated(nextTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool,nextPool=nextTendSum3rdPool) - else - call mpas_pool_link_pools(tendSum3rdPool) - end if - - if (associated(prevTendSlowPool) .and. associated(nextTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool, nextTendSlowPool) - else if (associated(prevTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool) - else if (associated(nextTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool,nextPool=nextTendSlowPool) - else - call mpas_pool_link_pools(tendSlowPool) - end if - - call mpas_pool_link_parinfo(block, tendSum3rdPool) - call mpas_pool_link_parinfo(block, tendSlowPool) call mpas_timer_stop("FB_LTS time-step prep") @@ -1367,12 +1325,6 @@ subroutine ocn_time_integrator_fblts(domain, dt)!{{{ call ocn_diagnostic_solve(dt, statePool, forcingPool, meshPool, & verticalMeshPool, scratchPool, tracersPool, 2) - call mpas_pool_destroy_pool(tendSum3rdPool) - call mpas_pool_destroy_pool(tendSlowPool) - - call mpas_pool_remove_subpool(block % structs, 'tend_sum_3rd') - call mpas_pool_remove_subpool(block % structs, 'tend_slow') - call mpas_timer_stop("FB_LTS cleanup") end subroutine ocn_time_integrator_fblts!}}} @@ -1415,6 +1367,15 @@ subroutine ocn_time_integration_fblts_init(domain)!{{{ type (mpas_pool_type), pointer :: & LTSPool + + type (mpas_pool_type), pointer :: & + tendSlowPool, & + tendSum3rdPool, & + prevTendSlowPool, nextTendSlowPool, & + prevTendSum3rdPool, nextTendSum3rdPool + + type (mpas_pool_type), pointer :: & + tendPool integer, dimension(:), allocatable :: & isLTSRegionEdgeAssigned @@ -1445,6 +1406,58 @@ subroutine ocn_time_integration_fblts_init(domain)!{{{ minMaxLTSRegion(2) = 2 block => domain % blocklist + call mpas_pool_get_subpool(block%structs, 'tend', tendPool) + + call mpas_pool_create_pool(tendSum3rdPool) + call mpas_pool_clone_pool(tendPool, tendSum3rdPool, 1) + call mpas_pool_create_pool(tendSlowPool) + call mpas_pool_clone_pool(tendPool, tendSlowPool, 1) + + call mpas_pool_add_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_add_subpool(block % structs, 'tend_slow', tendSlowPool) + + if (associated(block % prev)) then + call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_get_subpool(block % prev % structs, 'tend_slow', tendSlowPool) + else + nullify(prevTendSum3rdPool) + nullify(prevTendSlowPool) + end if + + if (associated(block % next)) then + call mpas_pool_get_subpool(block % next % structs, 'tend_sum_3rd', nextTendSum3rdPool) + call mpas_pool_get_subpool(block % next % structs, 'tend_slow', nextTendSlowPool) + else + nullify(nextTendSum3rdPool) + nullify(nextTendSlowPool) + end if + + call mpas_pool_get_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_get_subpool(block % structs, 'tend_slow', tendSlowPool) + + if (associated(prevTendSum3rdPool) .and. associated(nextTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool, nextTendSum3rdPool) + else if (associated(prevTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool) + else if (associated(nextTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool,nextPool=nextTendSum3rdPool) + else + call mpas_pool_link_pools(tendSum3rdPool) + end if + + if (associated(prevTendSlowPool) .and. associated(nextTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool, nextTendSlowPool) + else if (associated(prevTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool) + else if (associated(nextTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool,nextPool=nextTendSlowPool) + else + call mpas_pool_link_pools(tendSlowPool) + end if + + call mpas_pool_link_parinfo(block, tendSum3rdPool) + call mpas_pool_link_parinfo(block, tendSlowPool) + call mpas_pool_get_subpool(block % structs, 'LTS', LTSPool) call mpas_pool_get_array(LTSPool, 'LTSRegion', LTSRegion) diff --git a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_lts.F b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_lts.F index d123c69aecb..24f9f208ab3 100644 --- a/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_lts.F +++ b/components/mpas-ocean/src/mode_forward/mpas_ocn_time_integration_lts.F @@ -254,20 +254,18 @@ subroutine ocn_time_integrator_lts(domain,dt)!{{{ call mpas_pool_get_array(LTSPool, 'nEdgesInLTSRegion', & nEdgesInLTSRegion) - !--- Create additional pools for LTS - call mpas_pool_create_pool(tendSum1stPool) - call mpas_pool_clone_pool(tendPool, tendSum1stPool, 1) - call mpas_pool_create_pool(tendSum2ndPool) - call mpas_pool_clone_pool(tendPool, tendSum2ndPool, 1) - call mpas_pool_create_pool(tendSum3rdPool) - call mpas_pool_clone_pool(tendPool, tendSum3rdPool, 1) - call mpas_pool_create_pool(tendSlowPool) - call mpas_pool_clone_pool(tendPool, tendSlowPool, 1) + !--- Update additional pools for LTS + call mpas_pool_get_subpool(block % structs, 'tend_sum_1st', tendSum1stPool) + call mpas_pool_get_subpool(block % structs, 'tend_sum_2nd', tendSum2ndPool) + call mpas_pool_get_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_get_subpool(block % structs, 'tend_slow', tendSlowPool) + + + call mpas_pool_copy_pool(tendPool, tendSum1stPool, 1) + call mpas_pool_copy_pool(tendPool, tendSum2ndPool, 1) + call mpas_pool_copy_pool(tendPool, tendSum3rdPool, 1) + call mpas_pool_copy_pool(tendPool, tendSlowPool, 1) - call mpas_pool_add_subpool(block % structs, 'tend_sum_1st', tendSum1stPool) - call mpas_pool_add_subpool(block % structs, 'tend_sum_2nd', tendSum2ndPool) - call mpas_pool_add_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_add_subpool(block % structs, 'tend_slow', tendSlowPool) call mpas_pool_get_array(tendSlowPool, 'normalVelocity', normalVelocityTendSlow) @@ -307,79 +305,6 @@ subroutine ocn_time_integrator_lts(domain,dt)!{{{ normalVelocityTendSum3rd(:,:) = 0.0_RKIND layerThicknessTendSum3rd(:,:) = 0.0_RKIND - if (associated(block % prev)) then - call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_1st', tendSum1stPool) - call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_2nd', tendSum2ndPool) - call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_get_subpool(block % prev % structs, 'tend_slow', tendSlowPool) - else - nullify(prevTendSum1stPool) - nullify(prevTendSum2ndPool) - nullify(prevTendSum3rdPool) - nullify(prevTendSlowPool) - end if - - if (associated(block % next)) then - call mpas_pool_get_subpool(block % next % structs, 'tend_sum_1st', nextTendSum1stPool) - call mpas_pool_get_subpool(block % next % structs, 'tend_sum_2nd', nextTendSum2ndPool) - call mpas_pool_get_subpool(block % next % structs, 'tend_sum_3rd', nextTendSum3rdPool) - call mpas_pool_get_subpool(block % next % structs, 'tend_slow', nextTendSlowPool) - else - nullify(nextTendSum1stPool) - nullify(nextTendSum2ndPool) - nullify(nextTendSum3rdPool) - nullify(nextTendSlowPool) - end if - - call mpas_pool_get_subpool(block % structs, 'tend_sum_1st', tendSum1stPool) - call mpas_pool_get_subpool(block % structs, 'tend_sum_2nd', tendSum2ndPool) - call mpas_pool_get_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) - call mpas_pool_get_subpool(block % structs, 'tend_slow', tendSlowPool) - - if (associated(prevTendSum1stPool) .and. associated(nextTendSum1stPool)) then - call mpas_pool_link_pools(tendSum1stPool, prevTendSum1stPool, nextTendSum1stPool) - else if (associated(prevTendSum1stPool)) then - call mpas_pool_link_pools(tendSum1stPool, prevTendSum1stPool) - else if (associated(nextTendSum1stPool)) then - call mpas_pool_link_pools(tendSum1stPool,nextPool=nextTendSum1stPool) - else - call mpas_pool_link_pools(tendSum1stPool) - end if - - if (associated(prevTendSum2ndPool) .and. associated(nextTendSum2ndPool)) then - call mpas_pool_link_pools(tendSum2ndPool, prevTendSum2ndPool, nextTendSum2ndPool) - else if (associated(prevTendSum2ndPool)) then - call mpas_pool_link_pools(tendSum2ndPool, prevTendSum2ndPool) - else if (associated(nextTendSum2ndPool)) then - call mpas_pool_link_pools(tendSum2ndPool,nextPool=nextTendSum2ndPool) - else - call mpas_pool_link_pools(tendSum2ndPool) - end if - - if (associated(prevTendSum3rdPool) .and. associated(nextTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool, nextTendSum3rdPool) - else if (associated(prevTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool) - else if (associated(nextTendSum3rdPool)) then - call mpas_pool_link_pools(tendSum3rdPool,nextPool=nextTendSum3rdPool) - else - call mpas_pool_link_pools(tendSum3rdPool) - end if - - if (associated(prevTendSlowPool) .and. associated(nextTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool, nextTendSlowPool) - else if (associated(prevTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool) - else if (associated(nextTendSlowPool)) then - call mpas_pool_link_pools(tendSlowPool,nextPool=nextTendSlowPool) - else - call mpas_pool_link_pools(tendSlowPool) - end if - - call mpas_pool_link_parinfo(block, tendSum1stPool) - call mpas_pool_link_parinfo(block, tendSum2ndPool) - call mpas_pool_link_parinfo(block, tendSum3rdPool) - call mpas_pool_link_parinfo(block, tendSlowPool) call mpas_timer_stop("lts time-step prep") @@ -1084,16 +1009,6 @@ subroutine ocn_time_integrator_lts(domain,dt)!{{{ ! DIAGNOSTICS UPDATE --- call ocn_diagnostic_solve(dt, statePool, forcingPool, meshPool, verticalMeshPool, scratchPool, tracersPool, 2) - call mpas_pool_destroy_pool(tendSum1stPool) - call mpas_pool_destroy_pool(tendSum2ndPool) - call mpas_pool_destroy_pool(tendSum3rdPool) - call mpas_pool_destroy_pool(tendSlowPool) - - call mpas_pool_remove_subpool(block % structs, 'tend_sum_1st') - call mpas_pool_remove_subpool(block % structs, 'tend_sum_2nd') - call mpas_pool_remove_subpool(block % structs, 'tend_sum_3rd') - call mpas_pool_remove_subpool(block % structs, 'tend_slow') - call mpas_timer_stop("lts cleanup phase") @@ -1123,6 +1038,16 @@ subroutine ocn_time_integration_lts_init(domain)!{{{ type (block_type), pointer :: block type (mpas_pool_type), pointer :: LTSPool + type (mpas_pool_type), pointer :: tendPool + type (mpas_pool_type), pointer :: & + tendSlowPool, & + tendSum1stPool, & + tendSum2ndPool, & + tendSum3rdPool, & + prevTendSlowPool, nextTendSlowPool, & + prevTendSum1stPool, nextTendSum1stPool, & + prevTendSum2ndPool, nextTendSum2ndPool, & + prevTendSum3rdPool, nextTendSum3rdPool integer, dimension(:), allocatable :: isLTSRegionEdgeAssigned integer :: i, iCell, iEdge, iRegion, coarseRegions, fineRegions, fineRegionsM1 integer, dimension(:), pointer :: LTSRegion @@ -1134,6 +1059,93 @@ subroutine ocn_time_integration_lts_init(domain)!{{{ minMaxLTSRegion(2) = 2 block => domain % blocklist + + ! Create additional pools + call mpas_pool_get_subpool(block%structs, 'tend', tendPool) + + call mpas_pool_create_pool(tendSum1stPool) + call mpas_pool_clone_pool(tendPool, tendSum1stPool, 1) + call mpas_pool_create_pool(tendSum2ndPool) + call mpas_pool_clone_pool(tendPool, tendSum2ndPool, 1) + call mpas_pool_create_pool(tendSum3rdPool) + call mpas_pool_clone_pool(tendPool, tendSum3rdPool, 1) + call mpas_pool_create_pool(tendSlowPool) + call mpas_pool_clone_pool(tendPool, tendSlowPool, 1) + + call mpas_pool_add_subpool(block % structs, 'tend_sum_1st', tendSum1stPool) + call mpas_pool_add_subpool(block % structs, 'tend_sum_2nd', tendSum2ndPool) + call mpas_pool_add_subpool(block % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_add_subpool(block % structs, 'tend_slow', tendSlowPool) + + if (associated(block % prev)) then + call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_1st', tendSum1stPool) + call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_2nd', tendSum2ndPool) + call mpas_pool_get_subpool(block % prev % structs, 'tend_sum_3rd', tendSum3rdPool) + call mpas_pool_get_subpool(block % prev % structs, 'tend_slow', tendSlowPool) + else + nullify(prevTendSum1stPool) + nullify(prevTendSum2ndPool) + nullify(prevTendSum3rdPool) + nullify(prevTendSlowPool) + end if + + if (associated(block % next)) then + call mpas_pool_get_subpool(block % next % structs, 'tend_sum_1st', nextTendSum1stPool) + call mpas_pool_get_subpool(block % next % structs, 'tend_sum_2nd', nextTendSum2ndPool) + call mpas_pool_get_subpool(block % next % structs, 'tend_sum_3rd', nextTendSum3rdPool) + call mpas_pool_get_subpool(block % next % structs, 'tend_slow', nextTendSlowPool) + else + nullify(nextTendSum1stPool) + nullify(nextTendSum2ndPool) + nullify(nextTendSum3rdPool) + nullify(nextTendSlowPool) + end if + + if (associated(prevTendSum1stPool) .and. associated(nextTendSum1stPool)) then + call mpas_pool_link_pools(tendSum1stPool, prevTendSum1stPool, nextTendSum1stPool) + else if (associated(prevTendSum1stPool)) then + call mpas_pool_link_pools(tendSum1stPool, prevTendSum1stPool) + else if (associated(nextTendSum1stPool)) then + call mpas_pool_link_pools(tendSum1stPool,nextPool=nextTendSum1stPool) + else + call mpas_pool_link_pools(tendSum1stPool) + end if + + if (associated(prevTendSum2ndPool) .and. associated(nextTendSum2ndPool)) then + call mpas_pool_link_pools(tendSum2ndPool, prevTendSum2ndPool, nextTendSum2ndPool) + else if (associated(prevTendSum2ndPool)) then + call mpas_pool_link_pools(tendSum2ndPool, prevTendSum2ndPool) + else if (associated(nextTendSum2ndPool)) then + call mpas_pool_link_pools(tendSum2ndPool,nextPool=nextTendSum2ndPool) + else + call mpas_pool_link_pools(tendSum2ndPool) + end if + + if (associated(prevTendSum3rdPool) .and. associated(nextTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool, nextTendSum3rdPool) + else if (associated(prevTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool, prevTendSum3rdPool) + else if (associated(nextTendSum3rdPool)) then + call mpas_pool_link_pools(tendSum3rdPool,nextPool=nextTendSum3rdPool) + else + call mpas_pool_link_pools(tendSum3rdPool) + end if + + if (associated(prevTendSlowPool) .and. associated(nextTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool, nextTendSlowPool) + else if (associated(prevTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool, prevTendSlowPool) + else if (associated(nextTendSlowPool)) then + call mpas_pool_link_pools(tendSlowPool,nextPool=nextTendSlowPool) + else + call mpas_pool_link_pools(tendSlowPool) + end if + + call mpas_pool_link_parinfo(block, tendSum1stPool) + call mpas_pool_link_parinfo(block, tendSum2ndPool) + call mpas_pool_link_parinfo(block, tendSum3rdPool) + call mpas_pool_link_parinfo(block, tendSlowPool) + call mpas_pool_get_subpool(block % structs, 'LTS', LTSPool) call mpas_pool_get_array(LTSPool, 'LTSRegion', LTSRegion) From 909af120f29d7b8c30dbbdeadf6e2c32cc0acbc3 Mon Sep 17 00:00:00 2001 From: jayeshkrishna Date: Thu, 4 Apr 2024 11:40:17 -0500 Subject: [PATCH 104/310] Adding support for PIO_REARR_ANY Adding support for new SCORPIO rearranger, PIO_REARR_ANY --- driver-mct/cime_config/config_component.xml | 4 ++-- driver-mct/cime_config/namelist_definition_modelio.xml | 4 ++-- driver-moab/cime_config/config_component.xml | 4 ++-- driver-moab/cime_config/namelist_definition_modelio.xml | 4 ++-- share/util/shr_pio_mod.F90 | 3 ++- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/driver-mct/cime_config/config_component.xml b/driver-mct/cime_config/config_component.xml index a76311dbfa7..d037770ed5c 100644 --- a/driver-mct/cime_config/config_component.xml +++ b/driver-mct/cime_config/config_component.xml @@ -2692,10 +2692,10 @@ integer - 1,2 + 1,2,3 run_pio env_run.xml - pio rearranger choice box=1, subset=2 + pio rearranger choice box=1, subset=2, any=3 $PIO_VERSION $PIO_VERSION diff --git a/driver-mct/cime_config/namelist_definition_modelio.xml b/driver-mct/cime_config/namelist_definition_modelio.xml index ce0275e59bf..2860ffd7106 100644 --- a/driver-mct/cime_config/namelist_definition_modelio.xml +++ b/driver-mct/cime_config/namelist_definition_modelio.xml @@ -90,9 +90,9 @@ integer pio pio_inparm - -99,1,2 + -99,1,2,3 - Rearranger method for pio 1=box, 2=subset. + Rearranger method for pio 1=box, 2=subset, 3=any. $CPL_PIO_REARRANGER diff --git a/driver-moab/cime_config/config_component.xml b/driver-moab/cime_config/config_component.xml index 8e4e686aa1c..bcd9cb05008 100644 --- a/driver-moab/cime_config/config_component.xml +++ b/driver-moab/cime_config/config_component.xml @@ -2684,10 +2684,10 @@ integer - 1,2 + 1,2,3 run_pio env_run.xml - pio rearranger choice box=1, subset=2 + pio rearranger choice box=1, subset=2, any=3 $PIO_VERSION $PIO_VERSION diff --git a/driver-moab/cime_config/namelist_definition_modelio.xml b/driver-moab/cime_config/namelist_definition_modelio.xml index ce0275e59bf..2860ffd7106 100644 --- a/driver-moab/cime_config/namelist_definition_modelio.xml +++ b/driver-moab/cime_config/namelist_definition_modelio.xml @@ -90,9 +90,9 @@ integer pio pio_inparm - -99,1,2 + -99,1,2,3 - Rearranger method for pio 1=box, 2=subset. + Rearranger method for pio 1=box, 2=subset, 3=any. $CPL_PIO_REARRANGER diff --git a/share/util/shr_pio_mod.F90 b/share/util/shr_pio_mod.F90 index ed7dfdaa2ed..0935bce351a 100644 --- a/share/util/shr_pio_mod.F90 +++ b/share/util/shr_pio_mod.F90 @@ -730,7 +730,8 @@ subroutine shr_pio_namelist_set(npes,mycomm, pio_stride, pio_root, pio_numiotask if(pio_stride == 1 .and. .not. pio_async_interface) then pio_root = 0 endif - if(pio_rearranger .ne. PIO_REARR_SUBSET .and. pio_rearranger .ne. PIO_REARR_BOX) then + if(pio_rearranger .ne. PIO_REARR_SUBSET .and. pio_rearranger .ne. PIO_REARR_BOX .and.& + pio_rearranger .ne. PIO_REARR_ANY) then write(shr_log_unit,*) 'pio_rearranger value, ',pio_rearranger,& ', not supported - using PIO_REARR_BOX' pio_rearranger = PIO_REARR_BOX From e8a6bfd3a5bc76244db27fb4df92c3c68fcb0976 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Sun, 7 Apr 2024 21:00:32 -0500 Subject: [PATCH 105/310] Update SSP370 compset/configuration and use_case files --- cime_config/allactive/config_compsets.xml | 4 +- .../use_cases/SSP370_eam_CMIP6.xml | 0 ...SP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 55 +++++++++++++++---- .../use_cases/SSP585_eam_CMIP6.xml | 0 ...SP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 0 .../eam/cime_config/config_component.xml | 5 +- .../eam/cime_config/config_compsets.xml | 4 +- .../use_cases/2015-2100_SSP370_transient.xml | 3 +- 8 files changed, 51 insertions(+), 20 deletions(-) mode change 100755 => 100644 components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6.xml mode change 100755 => 100644 components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml mode change 100755 => 100644 components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6.xml mode change 100755 => 100644 components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml diff --git a/cime_config/allactive/config_compsets.xml b/cime_config/allactive/config_compsets.xml index 637facc327d..be74598e8f9 100755 --- a/cime_config/allactive/config_compsets.xml +++ b/cime_config/allactive/config_compsets.xml @@ -113,12 +113,12 @@ WCYCLSSP585 - SSP585SOI_EAM%CMIP6_ELM%SPBC_MPASSI_MPASO_MOSART_SGLC_SWAV + SSP585SOI_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV WCYCLSSP370 - SSP370SOI_EAM%CMIP6_ELM%SPBC_MPASSI_MPASO_MOSART_SGLC_SWAV + SSP370SOI_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV diff --git a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6.xml b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6.xml old mode 100755 new mode 100644 diff --git a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml old mode 100755 new mode 100644 index 60912c54419..1924b917f88 --- a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -12,13 +12,6 @@ atm/cam/ggas/GHG_CMIP_SSP370-1-2-1_Annual_Global_2015-2500_c20210509.nc RAMPED - -atm/cam/volc -CMIP_DOE-ACME_radiation_average_1850-2014_v3_c20171204.nc -VOLC_CMIP6 -CYCLICAL -1 - .true. .true. @@ -26,8 +19,9 @@ INTERP_MISSING_MONTHS -atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_elev_2015-2100_c210216.nc -atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_soag_elev_2015-2100_c210216.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_volc_elev_2015-2100_c240331.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_elev_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_elev_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_elev_2015-2100_c210216.nc @@ -38,8 +32,20 @@ INTERP_MISSING_MONTHS +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CO_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240208.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO_surface_2015-2100_1.9x2.5_c20240208.nc atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_surf_2015-2100_c210216.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240208.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_surf_2015-2100_c210216.nc @@ -47,15 +53,39 @@ atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc +atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_1750-2100_0.9x1.25_c20170322.nc + + INTERP_MISSING_MONTHS atm/cam/chem/trop_mozart_aero/oxid oxid_SSP370_1.9x2.5_L70_2015-2100_c20211006.nc +'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' + +ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc +atm/cam/chem/methane +CYCLICAL +1995 +'' +'prsd_ch4:CH4' + + + + 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', + 'A:O3:O3', 'A:N2OLNZ:N2O', 'A:CH4LNZ:CH4', + 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam5_mode1:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode2:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', + 'M:mam5_mode3:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode4:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', + 'M:mam5_mode5:$INPUTDATA_ROOT/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' + + 3 1 @@ -74,7 +104,12 @@ INTERP_MISSING_MONTHS -'H2O2', 'H2SO4', 'SO2' +'xactive_lnd' +'O3','H2O2','CH2O','CH3OOH','NO','NO2','HNO3','HO2NO2','PAN','CO','CH3COCH3','C2H5OOH','CH3CHO','H2SO4','SO2','NO3','N2O5','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'NEU' +'C2H5OOH','CH2O','CH3CHO','CH3OOH','H2O2','H2SO4','HNO3','HO2NO2','SO2','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'CH2O', 'CH3O2', 'CH3OOH', 'PAN', 'CO', 'C2H6', 'C3H8', 'C2H4', 'ROHO2', 'CH3COCH3', 'C2H5O2', 'C2H5OOH', 'CH3CHO', 'CH3CO3', 'ISOP', 'ISOPO2', 'MVKMACR', 'MVKO2' +'' 2015-2100 diff --git a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6.xml b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6.xml old mode 100755 new mode 100644 diff --git a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml old mode 100755 new mode 100644 diff --git a/components/eam/cime_config/config_component.xml b/components/eam/cime_config/config_component.xml index 33eaacb36b5..6bc56eb9833 100755 --- a/components/eam/cime_config/config_component.xml +++ b/components/eam/cime_config/config_component.xml @@ -51,10 +51,7 @@ -mach $MACH -phys default - &eamv3_phys_defaults; &eamv3_chem_defaults; - &eamv3_phys_defaults; &eamv3_chem_defaults; - &eamv3_phys_defaults; &eamv3_chem_defaults; - &eamv3_phys_defaults; &eamv2_chem_defaults; + &eamv3_phys_defaults; &eamv3_chem_defaults; -bc_dep_to_snow_updates -co2_cycle diff --git a/components/eam/cime_config/config_compsets.xml b/components/eam/cime_config/config_compsets.xml index 7c3393b1118..486766dbc1c 100644 --- a/components/eam/cime_config/config_compsets.xml +++ b/components/eam/cime_config/config_compsets.xml @@ -53,12 +53,12 @@ FSSP370 - SSP370_eam_EAM%CMIP6_ELM%SPBC_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV + SSP370_eam_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV FSSP585 - SSP585_eam_EAM%CMIP6_ELM%SPBC_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV + SSP585_eam_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml index cc708a828c9..fcb2d6e117e 100755 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml @@ -36,8 +36,7 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30pg2_SSP3_RCP70_simyr2015-2100_c211015.nc - -lnd/clm2/surfdata_map/landuse.timeseries_ne30pg2_SSP3_RCP70_simyr2015-2100_c211015.nc +lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_rcp3.0_simyr2015-2100_c240308.nc From 6f91d15504c994fb4fcd5358e218f33b55f3804e Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Mon, 8 Apr 2024 17:36:58 -0500 Subject: [PATCH 106/310] Replace old E90 file with one for all v3 SSP scenarios --- .../use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index 1924b917f88..f976c594e92 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -53,7 +53,7 @@ atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc -atm/cam/chem/emis/CMIP6_emissions_1750_2015/emissions_E90global_surface_1750-2100_0.9x1.25_c20170322.nc +atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc From 6f5121424275cb5cc25e034f39d1fc8fc1356522 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Mon, 8 Apr 2024 20:12:02 -0400 Subject: [PATCH 107/310] add comments to code additions --- components/eam/src/physics/cam/ndrop.F90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/eam/src/physics/cam/ndrop.F90 b/components/eam/src/physics/cam/ndrop.F90 index 4abe5a81168..6ffe89fa730 100644 --- a/components/eam/src/physics/cam/ndrop.F90 +++ b/components/eam/src/physics/cam/ndrop.F90 @@ -58,6 +58,8 @@ module ndrop (/ 0.02_r8, 0.05_r8, 0.1_r8, 0.2_r8, 0.5_r8, 1.0_r8 /) character(len=8) :: ccn_name(psat)= & (/'CCN1','CCN2','CCN3','CCN4','CCN5','CCN6'/) +! The following additional fields output CCN in units of 1/kg, +! which could be handy for appplications such as SCREAM-SPA. character(len=8) :: ccnmair_name(psat)= & (/'CCN1MAIR','CCN2MAIR','CCN3MAIR','CCN4MAIR','CCN5MAIR','CCN6MAIR'/) @@ -443,8 +445,8 @@ subroutine dropmixnuc( & real(r8), allocatable :: coltend(:,:) ! column tendency for diagnostic output real(r8), allocatable :: coltend_cw(:,:) ! column tendency - real(r8) :: ccn(pcols,pver,psat) ! number conc of aerosols activated at supersat - real(r8) :: ccnmair(pcols,pver,psat) ! number conc of aerosols activated at supersat + real(r8) :: ccn(pcols,pver,psat) ! number conc [1/m3] of aerosols activated at supersat + real(r8) :: ccnmair(pcols,pver,psat) ! number conc [1/kg] of aerosols activated at supersat integer :: ccn3d_idx real(r8), pointer :: ccn3d(:, :) From 643dae08ec6380db8e23f9b8702a20d689a3ea12 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Tue, 9 Apr 2024 10:01:44 -0500 Subject: [PATCH 108/310] Rename v3 SSP370 LULC file --- .../bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml index fcb2d6e117e..44b6fdb35cb 100755 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml @@ -36,7 +36,7 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30pg2_SSP3_RCP70_simyr2015-2100_c211015.nc -lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_rcp3.0_simyr2015-2100_c240308.nc +lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp3_rcp70_simyr2015-2100_c240308.nc From 8600d43136e6fd86c96ccf4584a2d0e9d32fc55d Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Tue, 9 Apr 2024 12:03:27 -0500 Subject: [PATCH 109/310] Update SSP370 prescribed oxidant file --- .../use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index f976c594e92..53e9fe57a12 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -60,7 +60,7 @@ INTERP_MISSING_MONTHS atm/cam/chem/trop_mozart_aero/oxid -oxid_SSP370_1.9x2.5_L70_2015-2100_c20211006.nc +oxid_SSP370_1.9x2.5_L70_1849-2101_c20240228.nc 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' From 7bcc0a78ddba46e559869e2ae40748ce06c742a4 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Tue, 9 Apr 2024 13:18:27 -0500 Subject: [PATCH 110/310] Add v3 SSP245 compsets and use_case files --- cime_config/allactive/config_compsets.xml | 5 + ...SP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 117 ++++++++++++++++++ .../eam/cime_config/config_component.xml | 1 + .../eam/cime_config/config_compsets.xml | 5 + .../use_cases/2015-2100_SSP245_transient.xml | 46 +++++++ .../elm/cime_config/config_component.xml | 1 + 6 files changed, 175 insertions(+) create mode 100644 components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml create mode 100755 components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml diff --git a/cime_config/allactive/config_compsets.xml b/cime_config/allactive/config_compsets.xml index be74598e8f9..439854c75b2 100755 --- a/cime_config/allactive/config_compsets.xml +++ b/cime_config/allactive/config_compsets.xml @@ -121,6 +121,11 @@ SSP370SOI_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV + + WCYCLSSP245 + SSP245SOI_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV + + diff --git a/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml new file mode 100644 index 00000000000..19f9e0d06d2 --- /dev/null +++ b/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -0,0 +1,117 @@ + + + + +.true. + + +atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc +SERIAL + + +atm/cam/ggas/GHG_CMIP_SSP245-1-2-1_Annual_Global_2015-2500_c20200807.nc +RAMPED + + +.true. +.true. +.true. + + +INTERP_MISSING_MONTHS +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_volc_elev_2015-2100_c240331.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_elev_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_elev_2015-2100_c200716.nc + + +INTERP_MISSING_MONTHS +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CO_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO_surface_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240219.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_surf_2015-2100_c200716.nc +atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc + + + + +INTERP_MISSING_MONTHS +atm/cam/chem/trop_mozart_aero/oxid +oxid_SSP245_1.9x2.5_L70_1849-2101_c20240228.nc +'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' +'' + + + + +ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc +atm/cam/chem/methane +CYCLICAL +1995 +'' +'prsd_ch4:CH4' + + + + 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', + 'A:O3:O3', 'A:N2OLNZ:N2O', 'A:CH4LNZ:CH4', + 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam5_mode1:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode2:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', + 'M:mam5_mode3:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode4:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', + 'M:mam5_mode5:$INPUTDATA_ROOT/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' + + + +3 +1 +'atm/cam/chem/trop_mam/marine_BGC/' +'CYCLICAL' +'monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc' +0 +0 +'chla:CHL1','mpoly:TRUEPOLYC','mprot:TRUEPROTC','mlip:TRUELIPC' + + +atm/cam/chem/trop_mozart/ub/Linoz_Chlorine_Loading_CMIP6_Hist_SSP245_0003-2503_c20200808.nc +SERIAL +linv3_1849-2101_CMIP6_Hist_SSP245_10deg_58km_c20230705.nc +atm/cam/chem/trop_mozart/ub +INTERP_MISSING_MONTHS + + +'xactive_lnd' +'O3','H2O2','CH2O','CH3OOH','NO','NO2','HNO3','HO2NO2','PAN','CO','CH3COCH3','C2H5OOH','CH3CHO','H2SO4','SO2','NO3','N2O5','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'NEU' +'C2H5OOH','CH2O','CH3CHO','CH3OOH','H2O2','H2SO4','HNO3','HO2NO2','SO2','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'CH2O', 'CH3O2', 'CH3OOH', 'PAN', 'CO', 'C2H6', 'C3H8', 'C2H4', 'ROHO2', 'CH3COCH3', 'C2H5O2', 'C2H5OOH', 'CH3CHO', 'CH3CO3', 'ISOP', 'ISOPO2', 'MVKMACR', 'MVKO2' +'' + + +2015-2100 + + diff --git a/components/eam/cime_config/config_component.xml b/components/eam/cime_config/config_component.xml index 6bc56eb9833..f25727162cc 100755 --- a/components/eam/cime_config/config_component.xml +++ b/components/eam/cime_config/config_component.xml @@ -126,6 +126,7 @@ 20TR_eam_CMIP6_chemUCI-Linoz-mam5-vbs SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs + SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs SSP585_cam5_CMIP6_bgc 20TR_E3SMv1_superfast_ar5-emis 20TRS_E3SMv1_superfast_ar5-emis diff --git a/components/eam/cime_config/config_compsets.xml b/components/eam/cime_config/config_compsets.xml index 486766dbc1c..39971fbb094 100644 --- a/components/eam/cime_config/config_compsets.xml +++ b/components/eam/cime_config/config_compsets.xml @@ -51,6 +51,11 @@ 2010_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FSSP245 + SSP245_eam_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV + + FSSP370 SSP370_eam_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI%PRES_DOCN%DOM_MOSART_SGLC_SWAV diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml new file mode 100755 index 00000000000..ba255f3dc29 --- /dev/null +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml @@ -0,0 +1,46 @@ + + + + +Simulate transient land-use, and aerosol deposition changes from 2015 to 2100 +Simulate transient land-use, aerosol deposition, and Nitrogen deposition changes from 2015 to 2100 +Simulate transient land-use, aerosol deposition, and Nitrogen deposition changes from 2015 to 2100 +Simulate transient land-use, aerosol deposition, and Nitrogen deposition changes from 2015 to 2100 + + + +2015-2100 + +arb_ic + +flanduse_timeseries + + + + + + + +lnd/clm2/surfdata_map/surfdata_0.5x0.5_simyr1850_c200609_with_TOP.nc +lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp2_rcp45_simyr2015-2100_c240408.nc + + + +.false. +.true. +.true. +.false. + + diff --git a/components/elm/cime_config/config_component.xml b/components/elm/cime_config/config_component.xml index 513805d1cfb..94fac9ab939 100755 --- a/components/elm/cime_config/config_component.xml +++ b/components/elm/cime_config/config_component.xml @@ -83,6 +83,7 @@ 2015-2100_SSP585_transient 2015-2100_SSP585_CMIP6bgc_transient 2015-2100_SSP370_transient + 2015-2100_SSP245_transient 2010_CMIP6LR_control 2010_CMIP6HR_control From 45934853e9a6e5e18942d303410071bb582f2b27 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 9 Apr 2024 16:33:30 -0400 Subject: [PATCH 111/310] update Summit machine config for SummitPLUS --- cime_config/machines/config_machines.xml | 33 ++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index ac009674b8f..14b69785c85 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -4874,12 +4874,12 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' cli115 /gpfs/alpine/proj-shared/cli115 .* - /gpfs/alpine/$PROJECT/proj-shared/$ENV{USER}/e3sm_scratch - /gpfs/alpine/cli115/world-shared/e3sm/inputdata - /gpfs/alpine/cli115/world-shared/e3sm/inputdata/atm/datm7 + /gpfs/alpine2/$PROJECT/proj-shared/$ENV{USER}/e3sm_scratch + /gpfs/alpine2/atm146/world-shared/e3sm/inputdata + /gpfs/alpine2/atm146/world-shared/e3sm/inputdata/atm/datm7 /gpfs/alpine/$PROJECT/proj-shared/$ENV{USER}/archive/$CASE - /gpfs/alpine/cli115/world-shared/e3sm/baselines/$COMPILER - /gpfs/alpine/cli115/world-shared/e3sm/tools/cprnc.summit/cprnc + /gpfs/alpine2/atm146/world-shared/e3sm/baselines/$COMPILER + /gpfs/alpine2/atm146/world-shared/e3sm/tools/cprnc.summit/cprnc 8 e3sm_developer 4 @@ -4889,7 +4889,7 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' 18 42 42 - + 84 18 @@ -4923,7 +4923,7 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' module - DefApps + DefApps-2023 python/3.7-anaconda3 subversion/1.14.0 git/2.31.1 @@ -4971,6 +4971,7 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' $ENV{OLCF_PARALLEL_NETCDF_ROOT} 0 + True @@ -5034,15 +5035,15 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' mlx5_3:1,mlx5_0:1 mlx5_0:1,mlx5_3:1 - - $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /gpfs/alpine/cli115/world-shared/3rdparty/adios2/2.9.1/spectrum-mpi-10.4.0.3/xl-16.1.1-10; else echo "$ADIOS2_ROOT"; fi} - - - $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /gpfs/alpine/cli115/world-shared/3rdparty/adios2/2.9.1/spectrum-mpi-10.4.0.3/nvhpc-21.11; else echo "$ADIOS2_ROOT"; fi} - - - $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /gpfs/alpine/cli115/world-shared/3rdparty/adios2/2.9.1/spectrum-mpi-10.4.0.3/gcc-9.1.0; else echo "$ADIOS2_ROOT"; fi} - + + + + + + + + + From eda5420ac40fae7f5357f3489535bb0d32b7983d Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 9 Apr 2024 17:44:03 -0400 Subject: [PATCH 112/310] remove adios env var lines for Summit --- cime_config/machines/config_machines.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 14b69785c85..dc3f5d2e9e9 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -5035,15 +5035,6 @@ AMD EPYC 7713 64-Core (Milan) (256GB) and 4 nvidia A100' mlx5_3:1,mlx5_0:1 mlx5_0:1,mlx5_3:1 - - - - - - - - - From feb3eafd5f8b07866f26b0715257970d94f2d9d8 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Tue, 9 Apr 2024 21:03:45 -0500 Subject: [PATCH 113/310] Update v3 SSP585 use_case files --- ...SP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 57 +++++++++++++++---- .../use_cases/2015-2100_SSP585_transient.xml | 3 +- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index 98e2dcf7604..25019238bf0 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -12,13 +12,6 @@ atm/cam/ggas/GHG_CMIP_SSP585-1-2-1_Annual_Global_2015-2500_c20190310.nc RAMPED - -atm/cam/volc -CMIP_DOE-ACME_radiation_average_1850-2014_v3_c20171204.nc -VOLC_CMIP6 -CYCLICAL -1 - .true. .true. @@ -26,8 +19,9 @@ INTERP_MISSING_MONTHS -atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_elev_2015-2100_c190828.nc -atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_soag_elev_2015-2100_c190828.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_volc_elev_2015-2100_c240331.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240304.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_elev_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_elev_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_elev_2015-2100_c190828.nc @@ -38,8 +32,20 @@ INTERP_MISSING_MONTHS +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CO_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240304.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO_surface_2015-2100_1.9x2.5_c20240304.nc atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_surf_2015-2100_c190828.nc +atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240304.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_surf_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_surf_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_surf_2015-2100_c190828.nc @@ -47,15 +53,39 @@ atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_surf_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_surf_2015-2100_c190828.nc atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_surf_2015-2100_c190828.nc +atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc + + INTERP_MISSING_MONTHS atm/cam/chem/trop_mozart_aero/oxid -oxid_1.9x2.5_L70_2015-2100_c20190421.nc +oxid_SSP585_1.9x2.5_L70_2014-2101_c20240228.nc +'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' + +ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc +atm/cam/chem/methane +CYCLICAL +1995 +'' +'prsd_ch4:CH4' + + + + 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', + 'A:O3:O3', 'A:N2OLNZ:N2O', 'A:CH4LNZ:CH4', + 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam5_mode1:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode2:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', + 'M:mam5_mode3:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode4:$INPUTDATA_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', + 'M:mam5_mode5:$INPUTDATA_ROOT/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' + + 3 1 @@ -74,7 +104,12 @@ INTERP_MISSING_MONTHS -'H2O2', 'H2SO4', 'SO2' +'xactive_lnd' +'O3','H2O2','CH2O','CH3OOH','NO','NO2','HNO3','HO2NO2','PAN','CO','CH3COCH3','C2H5OOH','CH3CHO','H2SO4','SO2','NO3','N2O5','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'NEU' +'C2H5OOH','CH2O','CH3CHO','CH3OOH','H2O2','H2SO4','HNO3','HO2NO2','SO2','SOAG0','SOAG15','SOAG24','SOAG35','SOAG34','SOAG33','SOAG32','SOAG31' +'CH2O', 'CH3O2', 'CH3OOH', 'PAN', 'CO', 'C2H6', 'C3H8', 'C2H4', 'ROHO2', 'CH3COCH3', 'C2H5O2', 'C2H5OOH', 'CH3CHO', 'CH3CO3', 'ISOP', 'ISOPO2', 'MVKMACR', 'MVKO2' +'' 2015-2100 diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml index bd62af24858..66a50136c5f 100644 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml @@ -36,8 +36,7 @@ lnd/clm2/surfdata_map/landuse.timeseries_ne30pg2_SSP5_RCP85_simyr2015-2100_c220310.nc - -lnd/clm2/surfdata_map/landuse.timeseries_ne30pg2_SSP3_RCP70_simyr2015-2100_c211015.nc +lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp5_rcp85_simyr2015-2100_c240408.nc From 57d539d258a4176cf9f9feb4b16442220162b8c9 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Tue, 19 Mar 2024 11:00:28 -0500 Subject: [PATCH 114/310] remove np references in coupler they are needed only for spectral model currently, it is not supported, so we should have another way of specifying np to the coupler maybe use infodata ? it was imported from dimensions_mod, which is an homme module --- driver-moab/main/cplcomp_exchange_mod.F90 | 4 ++-- driver-moab/main/prep_atm_mod.F90 | 11 ++++++----- driver-moab/main/prep_lnd_mod.F90 | 4 ++-- driver-moab/main/prep_ocn_mod.F90 | 4 ++-- driver-moab/main/prep_rof_mod.F90 | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 4a317bc621e..fce98053f7f 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -29,7 +29,7 @@ module cplcomp_exchange_mod use seq_comm_mct, only : MPSIID, mbixid ! sea-ice on comp pes and on coupler pes use seq_comm_mct, only : mrofid, mbrxid ! iMOAB id of moab rof app on comp pes and on coupler too use shr_mpi_mod, only: shr_mpi_max - use dimensions_mod, only : np ! for atmosphere + ! use dimensions_mod, only : np ! for atmosphere use iso_c_binding implicit none @@ -1136,7 +1136,7 @@ subroutine cplcomp_moab_Init(infodata,comp) numco = 1 ! usually 1 value per cell else ! this is not supported now, but leave it here tagname = trim(seq_flds_a2x_ext_fields)//C_NULL_CHAR ! MOAB versions of a2x for spectral - numco = np*np ! usually 16 values per cell, GLL points; should be 4 x 4 = 16 + numco = 16 ! np*np ! usually 16 values per cell, GLL points; should be 4 x 4 = 16 endif ierr = iMOAB_DefineTagStorage(mbaxid, tagname, tagtype, numco, tagindex ) if (ierr .ne. 0) then diff --git a/driver-moab/main/prep_atm_mod.F90 b/driver-moab/main/prep_atm_mod.F90 index 34197cc3b0e..c48350d463a 100644 --- a/driver-moab/main/prep_atm_mod.F90 +++ b/driver-moab/main/prep_atm_mod.F90 @@ -35,7 +35,7 @@ module prep_atm_mod use seq_comm_mct, only : seq_comm_getinfo => seq_comm_setptrs use seq_comm_mct, only : num_moab_exports - use dimensions_mod, only : np ! for atmosphere + !use dimensions_mod, only : np ! for atmosphere #ifdef MOABCOMP use component_type_mod, only: compare_mct_av_moab_tag #endif @@ -273,7 +273,8 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at call shr_sys_abort(subname//' ERROR in coin defining tags for seq_flds_o2x_fields') endif else ! spectral case, fix later TODO - numco = np*np ! + !numco = np*np ! + numco = 16 endif ! @@ -319,7 +320,7 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at else dm2 = "cgll"//C_NULL_CHAR dofnameT="GLOBAL_DOFS"//C_NULL_CHAR - orderT = np ! it should be 4 + orderT = 4 ! np ! it should be 4 endif dm1 = "fv"//C_NULL_CHAR dofnameS="GLOBAL_ID"//C_NULL_CHAR @@ -585,7 +586,7 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at else dm2 = "cgll"//C_NULL_CHAR dofnameT="GLOBAL_DOFS"//C_NULL_CHAR - orderT = np ! it should be 4 + orderT = 4 ! np ! it should be 4 endif dm1 = "fv"//C_NULL_CHAR dofnameS="GLOBAL_ID"//C_NULL_CHAR @@ -765,7 +766,7 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at else dm2 = "cgll"//C_NULL_CHAR dofnameT="GLOBAL_DOFS"//C_NULL_CHAR - orderT = np ! it should be 4 + orderT = 4 ! np ! it should be 4 endif dm1 = "fv"//C_NULL_CHAR dofnameS="GLOBAL_ID"//C_NULL_CHAR diff --git a/driver-moab/main/prep_lnd_mod.F90 b/driver-moab/main/prep_lnd_mod.F90 index 43c213c7385..44ae5490e2c 100644 --- a/driver-moab/main/prep_lnd_mod.F90 +++ b/driver-moab/main/prep_lnd_mod.F90 @@ -21,7 +21,7 @@ module prep_lnd_mod use seq_comm_mct, only: mbaxid ! iMOAB id for atm migrated mesh to coupler pes use seq_comm_mct, only: atm_pg_active ! whether the atm uses FV mesh or not ; made true if fv_nphys > 0 - use dimensions_mod, only: np ! for atmosphere + ! use dimensions_mod, only: np ! for atmosphere use seq_comm_mct, only: seq_comm_getinfo => seq_comm_setptrs use seq_map_type_mod use seq_map_mod @@ -479,7 +479,7 @@ subroutine prep_lnd_init(infodata, atm_c2_lnd, rof_c2_lnd, glc_c2_lnd, iac_c2_ln else dm1 = "cgll"//C_NULL_CHAR dofnameS="GLOBAL_DOFS"//C_NULL_CHAR - orderS = np ! it should be 4 + orderS = 4 ! np ! it should be 4 endif dm2 = "fv"//C_NULL_CHAR dofnameT="GLOBAL_ID"//C_NULL_CHAR diff --git a/driver-moab/main/prep_ocn_mod.F90 b/driver-moab/main/prep_ocn_mod.F90 index afd186d35a6..b76a314fe50 100644 --- a/driver-moab/main/prep_ocn_mod.F90 +++ b/driver-moab/main/prep_ocn_mod.F90 @@ -23,7 +23,7 @@ module prep_ocn_mod use seq_comm_mct, only : mbintxoa ! iMOAB id for intx mesh between ocean and atmosphere use seq_comm_mct, only : mhid ! iMOAB id for atm instance use seq_comm_mct, only : mhpgid ! iMOAB id for atm pgx grid, on atm pes; created with se and gll grids - use dimensions_mod, only : np ! for atmosphere degree + ! use dimensions_mod, only : np ! for atmosphere degree use seq_comm_mct, only : mbixid ! iMOAB for sea-ice migrated to coupler use seq_comm_mct, only : CPLALLICEID use seq_comm_mct, only : seq_comm_iamin @@ -478,7 +478,7 @@ subroutine prep_ocn_init(infodata, atm_c2_ocn, atm_c2_ice, ice_c2_ocn, rof_c2_oc else dm1 = "cgll"//C_NULL_CHAR dofnameS="GLOBAL_DOFS"//C_NULL_CHAR - orderS = np ! it should be 4 + orderS = 4 ! np ! it should be 4 endif dm2 = "fv"//C_NULL_CHAR dofnameT="GLOBAL_ID"//C_NULL_CHAR diff --git a/driver-moab/main/prep_rof_mod.F90 b/driver-moab/main/prep_rof_mod.F90 index a8cce9455a4..1fb1e3e75fc 100644 --- a/driver-moab/main/prep_rof_mod.F90 +++ b/driver-moab/main/prep_rof_mod.F90 @@ -15,7 +15,7 @@ module prep_rof_mod use seq_comm_mct, only: mboxid use seq_comm_mct, only: mbintxlr ! iMOAB id for intx mesh between land and river use seq_comm_mct, only : atm_pg_active ! whether the atm uses FV mesh or not ; made true if fv_nphys > 0 - use dimensions_mod, only : np ! for atmosphere degree + !use dimensions_mod, only : np ! for atmosphere degree use seq_comm_mct, only: seq_comm_getData=>seq_comm_setptrs use seq_infodata_mod, only: seq_infodata_type, seq_infodata_getdata use shr_log_mod , only: errMsg => shr_log_errMsg @@ -582,7 +582,7 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) else ! this part does not work, anyway dm1 = "cgll"//C_NULL_CHAR dofnameS="GLOBAL_DOFS"//C_NULL_CHAR - orderS = np ! it should be 4 + orderS = 4 ! np ! it should be 4 endif dm2 = "fv"//C_NULL_CHAR dofnameT="GLOBAL_ID"//C_NULL_CHAR From fe695d5e9bbe2811da49aa736b8d4058d44f6553 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Tue, 19 Mar 2024 16:07:19 -0500 Subject: [PATCH 115/310] instance atm data for moab driver need to fix some indices --- .../data_comps/datm/src/atm_comp_mct.F90 | 16 +++ .../data_comps/datm/src/datm_comp_mod.F90 | 128 ++++++++++++++++++ .../data_comps/docn/src/docn_comp_mod.F90 | 6 +- .../data_comps/docn/src/ocn_comp_mct.F90 | 4 +- driver-moab/shr/seq_infodata_mod.F90 | 16 ++- 5 files changed, 162 insertions(+), 8 deletions(-) diff --git a/components/data_comps/datm/src/atm_comp_mct.F90 b/components/data_comps/datm/src/atm_comp_mct.F90 index a5f2855ae63..de83102a660 100644 --- a/components/data_comps/datm/src/atm_comp_mct.F90 +++ b/components/data_comps/datm/src/atm_comp_mct.F90 @@ -18,6 +18,11 @@ module atm_comp_mct use datm_shr_mod , only: presaero use seq_flds_mod , only: seq_flds_a2x_fields, seq_flds_x2a_fields +#ifdef HAVE_MOAB + use seq_comm_mct, only : mphaid ! iMOAB app id for phys atm; comp atm is 5, phys 5+200 + use iso_c_binding + use iMOAB , only: iMOAB_RegisterApplication +#endif ! !PUBLIC TYPES: implicit none private ! except @@ -164,6 +169,17 @@ subroutine atm_init_mct( EClock, cdata, x2a, a2x, NLFilename ) ! Initialize datm !---------------------------------------------------------------------------- + +#ifdef HAVE_MOAB + ierr = iMOAB_RegisterApplication(trim("DATM")//C_NULL_CHAR, mpicom, compid, mphaid) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in registering data atm comp' + call shr_sys_abort(subname//' ERROR in registering data atm comp') + endif + ! send path of atm domain file to MOAB coupler. Note that here we may have the land domain in some cases? + call seq_infodata_PutData( infodata, atm_mesh=SDATM%domainFile) +#endif + call datm_comp_init(Eclock, x2a, a2x, & seq_flds_x2a_fields, seq_flds_a2x_fields, & SDATM, gsmap, ggrid, mpicom, compid, my_task, master_task, & diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index 3ad18c4a238..ab2f4b38b3c 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -212,6 +212,14 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & scmMode, scmlat, scmlon, & orbEccen, orbMvelpp, orbLambm0, orbObliqr, phase, nextsw_cday) +#ifdef HAVE_MOAB + use iMOAB, only: iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & + iMOAB_SetIntTagStorage, iMOAB_SetDoubleTagStorage, & + iMOAB_ResolveSharedEntities, iMOAB_CreateVertices, & + iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo + use seq_comm_mct, only : mphaid ! iMOAB app id for phys atm; comp atm is 5, phys 5+200 + use iso_c_binding +#endif ! !DESCRIPTION: initialize data atm model implicit none @@ -258,6 +266,16 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & character(CL) :: calendar ! calendar type character(CL) :: flds_strm +#ifdef HAVE_MOAB + character*400 tagname + real(R8) latv, lonv + integer iv, tagindex, ilat, ilon, ierr + real(R8), allocatable, target :: data(:) + integer(IN), pointer :: idata(:) ! temporary + real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary + integer :: mpigrp ! mpigrp +#endif + !--- formats --- character(*), parameter :: F00 = "('(datm_comp_init) ',8a)" character(*), parameter :: F0L = "('(datm_comp_init) ',a, l2)" @@ -347,6 +365,116 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & call shr_dmodel_rearrGGrid(SDATM%grid, ggrid, gsmap, rearr, mpicom) call t_stopf('datm_initmctdom') +#ifdef HAVE_MOAB + ilat = mct_aVect_indexRA(ggrid%data,'lat') + ilon = mct_aVect_indexRA(ggrid%data,'lon') + allocate(moab_vert_coords(lsize*3)) + do iv = 1, lsize + lonv = ggrid%data%rAttr(ilon, iv) * SHR_CONST_PI/180. + latv = ggrid%data%rAttr(ilat, iv) * SHR_CONST_PI/180. + moab_vert_coords(3*iv-2)=COS(latv)*COS(lonv) + moab_vert_coords(3*iv-1)=COS(latv)*SIN(lonv) + moab_vert_coords(3*iv )=SIN(latv) + enddo + + ! create the vertices with coordinates from MCT domain + ierr = iMOAB_CreateVertices(mphaid, lsize*3, 3, moab_vert_coords) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to create MOAB vertices in land model') + + tagname='GLOBAL_ID'//C_NULL_CHAR + ierr = iMOAB_DefineTagStorage(mphaid, tagname, & + 0, & ! dense, integer + 1, & ! number of components + tagindex ) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to retrieve GLOBAL_ID tag ') + + ! get list of global IDs for Dofs + call mct_gsMap_orderedPoints(gsMap, my_task, idata) + + ierr = iMOAB_SetIntTagStorage ( mphaid, tagname, lsize, & + 0, & ! vertex type + idata) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to set GLOBAL_ID tag ') + + ierr = iMOAB_ResolveSharedEntities( mphaid, lsize, idata ); + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to resolve shared entities') + + deallocate(moab_vert_coords) + deallocate(idata) + + ierr = iMOAB_UpdateMeshInfo( mphaid ) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to update mesh info ') + + allocate(data(lsize)) + ierr = iMOAB_DefineTagStorage( mphaid, "area:aream:frac:mask"//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create tag: area:aream:frac:mask' ) + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'area'),:) + tagname='area'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to get area tag ') + + ! set the same data for aream (model area) as area + ! data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'aream'),:) + tagname='aream'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set aream tag ') + + data(:) = ggrid%data%rAttr(kmask,:) + tagname='mask'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set mask tag ') + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'frac'),:) + tagname='frac'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set frac tag ') + + deallocate(data) + + ! define tags + ierr = iMOAB_DefineTagStorage( mphaid, trim(seq_flds_x2a_fields)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create seq_flds_x2a_fields tags ') + + ierr = iMOAB_DefineTagStorage( mphaid, trim(seq_flds_a2x_fields)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create seq_flds_a2x_fields tags ') + + ierr = iMOAB_DefineTagStorage( mphaid, trim(flds_strm)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create flds_strm tags ') +#endif !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors !---------------------------------------------------------------------------- diff --git a/components/data_comps/docn/src/docn_comp_mod.F90 b/components/data_comps/docn/src/docn_comp_mod.F90 index 03fc4a3459a..f62fcf092a7 100644 --- a/components/data_comps/docn/src/docn_comp_mod.F90 +++ b/components/data_comps/docn/src/docn_comp_mod.F90 @@ -125,8 +125,7 @@ subroutine docn_comp_init(Eclock, x2o, o2x, & use shr_pio_mod, only : shr_pio_getiosys, shr_pio_getiotype #ifdef HAVE_MOAB #include "moab/MOABConfig.h" - use iMOAB, only: iMOAB_RegisterApplication, iMOAB_LoadMesh, & - iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & + use iMOAB, only: iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & iMOAB_SetIntTagStorage, iMOAB_SetDoubleTagStorage, & iMOAB_ResolveSharedEntities, iMOAB_CreateVertices, & iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo @@ -171,13 +170,12 @@ subroutine docn_comp_init(Eclock, x2o, o2x, & type(iosystem_desc_t), pointer :: ocn_pio_subsystem #ifdef HAVE_MOAB - character*100 tagname + character*400 tagname real(R8) latv, lonv integer iv, tagindex real(R8), allocatable, target :: data(:) integer(IN), pointer :: idata(:) ! temporary real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary - integer :: mpigrp ! mpigrp #endif !--- formats --- diff --git a/components/data_comps/docn/src/ocn_comp_mct.F90 b/components/data_comps/docn/src/ocn_comp_mct.F90 index d3d237d1adf..6b029981438 100644 --- a/components/data_comps/docn/src/ocn_comp_mct.F90 +++ b/components/data_comps/docn/src/ocn_comp_mct.F90 @@ -169,8 +169,8 @@ subroutine ocn_init_mct( EClock, cdata, x2o, o2x, NLFilename ) #ifdef HAVE_MOAB ierr = iMOAB_RegisterApplication(trim("DOCN")//C_NULL_CHAR, mpicom, compid, mpoid) if (ierr .ne. 0) then - write(logunit,*) subname,' error in registering atm ocn intx' - call shr_sys_abort(subname//' ERROR in registering atm ocn intx') + write(logunit,*) subname,' error in registering data ocn comp' + call shr_sys_abort(subname//' ERROR in registering data ocn comp') endif ! send path of ocean domain file to MOAB coupler. call seq_infodata_PutData( infodata, ocn_domain=SDOCN%domainFile) diff --git a/driver-moab/shr/seq_infodata_mod.F90 b/driver-moab/shr/seq_infodata_mod.F90 index deb63205728..77236e027cc 100644 --- a/driver-moab/shr/seq_infodata_mod.F90 +++ b/driver-moab/shr/seq_infodata_mod.F90 @@ -233,6 +233,7 @@ MODULE seq_infodata_mod character(SHR_KIND_CL) :: lnd_domain ! path to land domain file character(SHR_KIND_CL) :: rof_mesh ! path to river mesh file character(SHR_KIND_CL) :: ocn_domain ! path to ocean domain file, used by data ocean models only + character(SHR_KIND_CL) :: atm_mesh ! path to atmosphere domain/mesh file, used by data atm models only !--- set via components and may be time varying --- real(SHR_KIND_R8) :: nextsw_cday ! calendar of next atm shortwave @@ -792,6 +793,8 @@ SUBROUTINE seq_infodata_Init( infodata, nmlfile, ID, pioid, cpl_tag) infodata%lnd_domain = 'none' infodata%rof_mesh = 'none' infodata%ocn_domain = 'none' ! will be used for ocean data models only; will be used as a signal + infodata%atm_mesh = 'none' ! will be used for atmosphere data models only; will be used as a signal + ! not sure if it exists always actually infodata%nextsw_cday = -1.0_SHR_KIND_R8 infodata%precip_fact = 1.0_SHR_KIND_R8 @@ -1034,7 +1037,8 @@ SUBROUTINE seq_infodata_GetData_explicit( infodata, cime_model, case_name, case_ glc_phase, rof_phase, atm_phase, lnd_phase, ocn_phase, ice_phase, & wav_phase, iac_phase, esp_phase, wav_nx, wav_ny, atm_nx, atm_ny, & lnd_nx, lnd_ny, rof_nx, rof_ny, ice_nx, ice_ny, ocn_nx, ocn_ny, & - iac_nx, iac_ny, glc_nx, glc_ny, lnd_domain, rof_mesh, ocn_domain, eps_frac, & + iac_nx, iac_ny, glc_nx, glc_ny, lnd_domain, rof_mesh, ocn_domain, & + atm_mesh, eps_frac, & eps_amask, eps_agrid, eps_aarea, eps_omask, eps_ogrid, eps_oarea, & reprosum_use_ddpdd, reprosum_allow_infnan, & reprosum_diffmax, reprosum_recompute, & @@ -1209,6 +1213,7 @@ SUBROUTINE seq_infodata_GetData_explicit( infodata, cime_model, case_name, case_ character(SHR_KIND_CL), optional, intent(OUT) :: lnd_domain character(SHR_KIND_CL), optional, intent(OUT) :: rof_mesh character(SHR_KIND_CL), optional, intent(OUT) :: ocn_domain + character(SHR_KIND_CL), optional, intent(OUT) :: atm_mesh real(SHR_KIND_R8), optional, intent(OUT) :: nextsw_cday ! calendar of next atm shortwave real(SHR_KIND_R8), optional, intent(OUT) :: precip_fact ! precip factor @@ -1397,6 +1402,7 @@ SUBROUTINE seq_infodata_GetData_explicit( infodata, cime_model, case_name, case_ if ( present(lnd_domain) ) lnd_domain = infodata%lnd_domain if ( present(rof_mesh) ) rof_mesh = infodata%rof_mesh if ( present(ocn_domain) ) ocn_domain = infodata%ocn_domain + if ( present(atm_mesh) ) atm_mesh = infodata%atm_mesh if ( present(nextsw_cday) ) nextsw_cday = infodata%nextsw_cday if ( present(precip_fact) ) precip_fact = infodata%precip_fact @@ -1592,7 +1598,8 @@ SUBROUTINE seq_infodata_PutData_explicit( infodata, cime_model, case_name, case_ wav_phase, iac_phase, esp_phase, wav_nx, wav_ny, atm_nx, atm_ny, & lnd_nx, lnd_ny, rof_nx, rof_ny, ice_nx, ice_ny, ocn_nx, ocn_ny, & iac_nx, iac_ny, glc_nx, glc_ny, eps_frac, eps_amask, lnd_domain, & - rof_mesh, ocn_domain, eps_agrid, eps_aarea, eps_omask, eps_ogrid, eps_oarea, & + rof_mesh, ocn_domain, atm_mesh, eps_agrid, eps_aarea, eps_omask, & + eps_ogrid, eps_oarea, & reprosum_use_ddpdd, reprosum_allow_infnan, & reprosum_diffmax, reprosum_recompute, & mct_usealltoall, mct_usevector, glc_valid_input, nlmaps_verbosity) @@ -1765,6 +1772,7 @@ SUBROUTINE seq_infodata_PutData_explicit( infodata, cime_model, case_name, case_ character(SHR_KIND_CL), optional, intent(IN) :: lnd_domain character(SHR_KIND_CL), optional, intent(IN) :: rof_mesh character(SHR_KIND_CL), optional, intent(IN) :: ocn_domain + character(SHR_KIND_CL), optional, intent(IN) :: atm_mesh real(SHR_KIND_R8), optional, intent(IN) :: nextsw_cday ! calendar of next atm shortwave real(SHR_KIND_R8), optional, intent(IN) :: precip_fact ! precip factor @@ -1952,6 +1960,7 @@ SUBROUTINE seq_infodata_PutData_explicit( infodata, cime_model, case_name, case_ if ( present(lnd_domain) ) infodata%lnd_domain = lnd_domain if ( present(rof_mesh) ) infodata%rof_mesh = rof_mesh if ( present(ocn_domain) ) infodata%ocn_domain = ocn_domain + if ( present(atm_mesh) ) infodata%atm_mesh = atm_mesh if ( present(nextsw_cday) ) infodata%nextsw_cday = nextsw_cday if ( present(precip_fact) ) infodata%precip_fact = precip_fact @@ -2263,6 +2272,7 @@ subroutine seq_infodata_bcast(infodata,mpicom) call shr_mpi_bcast(infodata%lnd_domain, mpicom) call shr_mpi_bcast(infodata%rof_mesh, mpicom) call shr_mpi_bcast(infodata%ocn_domain, mpicom) + call shr_mpi_bcast(infodata%atm_mesh, mpicom) call shr_mpi_bcast(infodata%nextsw_cday, mpicom) call shr_mpi_bcast(infodata%precip_fact, mpicom) call shr_mpi_bcast(infodata%atm_phase, mpicom) @@ -2480,6 +2490,7 @@ subroutine seq_infodata_Exchange(infodata,ID,type) call shr_mpi_bcast(infodata%atm_nx, mpicom, pebcast=cmppe) call shr_mpi_bcast(infodata%atm_ny, mpicom, pebcast=cmppe) call shr_mpi_bcast(infodata%atm_aero, mpicom, pebcast=cmppe) + call shr_mpi_bcast(infodata%atm_mesh, mpicom, pebcast=cmppe) ! dead_comps is true if it's ever set to true deads = infodata%dead_comps call shr_mpi_bcast(deads, mpicom, pebcast=cmppe) @@ -2980,6 +2991,7 @@ SUBROUTINE seq_infodata_print( infodata ) write(logunit,F0I) subname,'lnd_domain = ', infodata%lnd_domain write(logunit,F0I) subname,'rof_mesh = ', infodata%rof_mesh write(logunit,F0I) subname,'ocn_domain = ', infodata%ocn_domain + write(logunit,F0I) subname,'atm_mesh = ', infodata%atm_mesh write(logunit,F0R) subname,'nextsw_cday = ', infodata%nextsw_cday write(logunit,F0R) subname,'precip_fact = ', infodata%precip_fact From 52f7ec1aa81efeadcc2b4be01cba98001584baab Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Tue, 19 Mar 2024 18:45:20 -0500 Subject: [PATCH 116/310] add runtime set for tags for data atm --- .../data_comps/datm/src/atm_comp_mct.F90 | 6 +- .../data_comps/datm/src/datm_comp_mod.F90 | 96 ++++++++++++++++++- .../data_comps/docn/src/docn_comp_mod.F90 | 5 +- driver-moab/main/cplcomp_exchange_mod.F90 | 90 +++++++++++------ 4 files changed, 159 insertions(+), 38 deletions(-) diff --git a/components/data_comps/datm/src/atm_comp_mct.F90 b/components/data_comps/datm/src/atm_comp_mct.F90 index de83102a660..4970ac726d7 100644 --- a/components/data_comps/datm/src/atm_comp_mct.F90 +++ b/components/data_comps/datm/src/atm_comp_mct.F90 @@ -85,6 +85,9 @@ subroutine atm_init_mct( EClock, cdata, x2a, a2x, NLFilename ) real(R8) :: orbObliqr ! orb obliquity (radians) real(R8) :: nextsw_cday ! calendar of next atm sw +#ifdef HAVE_MOAB + integer(IN) :: ATM_PHYS_CID ! used to create a new comp id for phys atm; 200+ compid +#endif !--- formats --- character(*), parameter :: F00 = "('(datm_comp_init) ',8a)" integer(IN) , parameter :: master_task=0 ! task number of master task @@ -171,7 +174,8 @@ subroutine atm_init_mct( EClock, cdata, x2a, a2x, NLFilename ) #ifdef HAVE_MOAB - ierr = iMOAB_RegisterApplication(trim("DATM")//C_NULL_CHAR, mpicom, compid, mphaid) + ATM_PHYS_CID = 200 + compid + ierr = iMOAB_RegisterApplication(trim("DATM")//C_NULL_CHAR, mpicom, ATM_PHYS_CID, mphaid) if (ierr .ne. 0) then write(logunit,*) subname,' error in registering data atm comp' call shr_sys_abort(subname//' ERROR in registering data atm comp') diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index ab2f4b38b3c..60843737e89 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -32,6 +32,9 @@ module datm_comp_mod use datm_shr_mod , only: iradsw ! namelist input use datm_shr_mod , only: nullstr +#ifdef HAVE_MOAB + use iso_c_binding +#endif ! !PUBLIC TYPES: implicit none @@ -216,9 +219,8 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & use iMOAB, only: iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & iMOAB_SetIntTagStorage, iMOAB_SetDoubleTagStorage, & iMOAB_ResolveSharedEntities, iMOAB_CreateVertices, & - iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo + iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo, iMOAB_WriteMesh use seq_comm_mct, only : mphaid ! iMOAB app id for phys atm; comp atm is 5, phys 5+200 - use iso_c_binding #endif ! !DESCRIPTION: initialize data atm model implicit none @@ -274,6 +276,9 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & integer(IN), pointer :: idata(:) ! temporary real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary integer :: mpigrp ! mpigrp +#ifdef MOABDEBUG + character*100 outfile, wopts +#endif #endif !--- formats --- @@ -434,8 +439,8 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & data) if (ierr > 0 ) & call shr_sys_abort('Error: fail to set aream tag ') - - data(:) = ggrid%data%rAttr(kmask,:) + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'mask'),:) tagname='mask'//C_NULL_CHAR ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & 0, & ! set data on vertices @@ -474,6 +479,16 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & tagindex ) if (ierr > 0 ) & call shr_sys_abort('Error: fail to create flds_strm tags ') +#ifdef MOABDEBUG + ! debug test + outfile = 'AtmDataMesh.h5m'//C_NULL_CHAR + wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! + ! write out the mesh file to disk + ierr = iMOAB_WriteMesh(mphaid, trim(outfile), trim(wopts)) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in writing data mesh atm ') + endif +#endif #endif !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors @@ -700,6 +715,34 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & end subroutine datm_comp_init +#ifdef HAVE_MOAB + !=============================================================================== + + subroutine moab_set_tag(tagname, avx, index, dataarr, lsize) + + ! !DESCRIPTION: set field method for data atm model + use iMOAB, only: iMOAB_SetDoubleTagStorage + use seq_comm_mct, only : mphaid ! + implicit none + + integer :: ierr, lsize + character(len=*), intent(in) :: tagname + type(mct_aVect), intent(in) :: avx + integer, intent(in) :: index + real(R8), intent(inout) :: dataarr(:) + + !write(*,* ) "Setting data for tag: ", tagname, " with size = ", lsize + dataarr(:) = avx%rAttr(index, :) + ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & + 0, & ! data on vertices + dataarr ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set tag values for '//tagname) + + end subroutine moab_set_tag + +#endif + !=============================================================================== subroutine datm_comp_run(EClock, x2a, a2x, & SDATM, gsmap, ggrid, mpicom, compid, my_task, master_task, & @@ -755,7 +798,9 @@ subroutine datm_comp_run(EClock, x2a, a2x, & !--- temporaries real(R8) :: uprime,vprime,swndr,swndf,swvdr,swvdf,ratio_rvrf real(R8) :: tbot,pbot,rtmp,vp,ea,e,qsat,frac - +#ifdef HAVE_MOAB + real(R8), allocatable, target :: datam(:) +#endif character(*), parameter :: F00 = "('(datm_comp_run) ',8a)" character(*), parameter :: F04 = "('(datm_comp_run) ',2a,2i8,'s')" character(*), parameter :: subName = "(datm_comp_run) " @@ -1273,6 +1318,47 @@ subroutine datm_comp_run(EClock, x2a, a2x, & ! Reset shr logging to original values !---------------------------------------------------------------------------- +#ifdef HAVE_MOAB + lsize = mct_avect_lsize(a2x) ! is it the same as mct_avect_lsize(avstrm) ? + allocate(datam(lsize)) ! + call moab_set_tag('Sa_z'//C_NULL_CHAR , a2x, kz, datam, lsize) ! kz = mct_aVect_indexRA(a2x,'Sa_z') + call moab_set_tag('Sa_topo'//C_NULL_CHAR, a2x, ktopo, datam, lsize) ! ktopo = mct_aVect_indexRA(a2x,'Sa_topo') + call moab_set_tag('Sa_u'//C_NULL_CHAR, a2x, ku , datam, lsize) ! ku = mct_aVect_indexRA(a2x,'Sa_u') + call moab_set_tag('Sa_v'//C_NULL_CHAR, a2x, kv , datam, lsize) ! kv = mct_aVect_indexRA(a2x,'Sa_v') + call moab_set_tag('Sa_tbot'//C_NULL_CHAR, a2x, ktbot, datam, lsize) ! ktbot = mct_aVect_indexRA(a2x,'Sa_tbot') + call moab_set_tag('Sa_ptem'//C_NULL_CHAR, a2x, kptem, datam, lsize) ! kptem = mct_aVect_indexRA(a2x,'Sa_ptem') + call moab_set_tag('Sa_shum'//C_NULL_CHAR, a2x, kshum, datam, lsize) ! kshum = mct_aVect_indexRA(a2x,'Sa_shum') + call moab_set_tag('Sa_dens'//C_NULL_CHAR, a2x, kdens, datam, lsize) ! kdens = mct_aVect_indexRA(a2x,'Sa_dens') + call moab_set_tag('Sa_pbot'//C_NULL_CHAR, a2x, kpbot, datam, lsize) ! kpbot = mct_aVect_indexRA(a2x,'Sa_pbot') + call moab_set_tag('Sa_pslv'//C_NULL_CHAR, a2x, kpslv, datam, lsize) ! kpslv = mct_aVect_indexRA(a2x,'Sa_pslv') + call moab_set_tag('Faxa_lwdn'//C_NULL_CHAR, a2x, klwdn, datam, lsize) ! klwdn = mct_aVect_indexRA(a2x,'Faxa_lwdn') + call moab_set_tag('Faxa_rainc'//C_NULL_CHAR, a2x, krc, datam, lsize) ! krc = mct_aVect_indexRA(a2x,'Faxa_rainc') + call moab_set_tag('Faxa_rainl'//C_NULL_CHAR, a2x, krl, datam, lsize) ! krl = mct_aVect_indexRA(a2x,'Faxa_rainl') + call moab_set_tag('Faxa_snowc'//C_NULL_CHAR, a2x, ksc, datam, lsize) ! ksc = mct_aVect_indexRA(a2x,'Faxa_snowc') + call moab_set_tag('Faxa_snowl'//C_NULL_CHAR, a2x, ksl, datam, lsize) ! ksl = mct_aVect_indexRA(a2x,'Faxa_snowl') + call moab_set_tag('Faxa_swndr'//C_NULL_CHAR, a2x, kswndr, datam, lsize) ! kswndr= mct_aVect_indexRA(a2x,'Faxa_swndr') + call moab_set_tag('Faxa_swndf'//C_NULL_CHAR, a2x, kswndf, datam, lsize) ! kswndf= mct_aVect_indexRA(a2x,'Faxa_swndf') + call moab_set_tag('Faxa_swvdr'//C_NULL_CHAR, a2x, kswvdr, datam, lsize) ! kswvdr= mct_aVect_indexRA(a2x,'Faxa_swvdr') + call moab_set_tag('Faxa_swvdf'//C_NULL_CHAR, a2x, kswvdf, datam, lsize) ! kswvdf= mct_aVect_indexRA(a2x,'Faxa_swvdf') + call moab_set_tag('Faxa_swnet'//C_NULL_CHAR, a2x, kswnet, datam, lsize) ! kswnet= mct_aVect_indexRA(a2x,'Faxa_swnet') + +if (wiso_datm) then ! water isotopic forcing + call moab_set_tag('Sa_shum_16O'//C_NULL_CHAR, a2x, kshum_16O, datam, lsize) ! kshum_16O = mct_aVect_indexRA(a2x,'Sa_shum_16O') + call moab_set_tag('Sa_shum_18O'//C_NULL_CHAR, a2x, kshum_18O, datam, lsize) ! kshum_18O = mct_aVect_indexRA(a2x,'Sa_shum_18O') + call moab_set_tag('Sa_shum_HDO'//C_NULL_CHAR, a2x, kshum_HDO, datam, lsize) ! kshum_HDO = mct_aVect_indexRA(a2x,'Sa_shum_HDO') + call moab_set_tag('Faxa_rainc_18O'//C_NULL_CHAR, a2x, krc_18O, datam, lsize) ! krc_18O = mct_aVect_indexRA(a2x,'Faxa_rainc_18O') + call moab_set_tag('Faxa_rainc_HDO'//C_NULL_CHAR, a2x, krc_HDO, datam, lsize) ! krc_HDO = mct_aVect_indexRA(a2x,'Faxa_rainc_HDO') + call moab_set_tag('Faxa_rainl_18O'//C_NULL_CHAR, a2x, krl_18O, datam, lsize) ! krl_18O = mct_aVect_indexRA(a2x,'Faxa_rainl_18O') + call moab_set_tag('Faxa_rainl_HDO'//C_NULL_CHAR, a2x, krl_HDO, datam, lsize) ! krl_HDO = mct_aVect_indexRA(a2x,'Faxa_rainl_HDO') + call moab_set_tag('Faxa_snowc_18O'//C_NULL_CHAR, a2x, ksc_18O, datam, lsize) ! ksc_18O = mct_aVect_indexRA(a2x,'Faxa_snowc_18O') + call moab_set_tag('Faxa_snowc_HDO'//C_NULL_CHAR, a2x, ksc_HDO, datam, lsize) ! ksc_HDO = mct_aVect_indexRA(a2x,'Faxa_snowc_HDO') + call moab_set_tag('Faxa_snowl_18O'//C_NULL_CHAR, a2x, ksl_18O, datam, lsize) ! ksl_18O = mct_aVect_indexRA(a2x,'Faxa_snowl_18O') + call moab_set_tag('Faxa_snowl_HDO'//C_NULL_CHAR, a2x, ksl_HDO, datam, lsize) ! ksl_HDO = mct_aVect_indexRA(a2x,'Faxa_snowl_HDO') +end if + deallocate(datam) ! maybe we should keep it around, deallocate at the end + +#endif + call t_startf('datm_run2') if (my_task == master_task) then write(logunit,F04) trim(myModelName),': model date ', CurrentYMD,CurrentTOD diff --git a/components/data_comps/docn/src/docn_comp_mod.F90 b/components/data_comps/docn/src/docn_comp_mod.F90 index f62fcf092a7..5858da5b783 100644 --- a/components/data_comps/docn/src/docn_comp_mod.F90 +++ b/components/data_comps/docn/src/docn_comp_mod.F90 @@ -526,11 +526,10 @@ end subroutine docn_comp_init subroutine moab_init_tag(tagname, avx, index, dataarr) ! !DESCRIPTION: run method for docn model - use iMOAB, only: iMOAB_SetDoubleTagStorage, & - iMOAB_SetDoubleTagStorageWithGid + use iMOAB, only: iMOAB_SetDoubleTagStorage implicit none - integer :: ierr, n, lsize, tagindex + integer :: ierr, lsize character(len=*), intent(in) :: tagname type(mct_aVect), intent(in) :: avx integer, intent(in) :: index diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index fce98053f7f..69690615c41 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -1020,6 +1020,7 @@ subroutine cplcomp_moab_Init(infodata,comp) character(CL) :: rtm_mesh character(CL) :: lnd_domain character(CL) :: ocn_domain + character(CL) :: atm_mesh integer :: maxMH, maxMPO, maxMLID, maxMSID, maxMRID ! max pids for moab apps atm, ocn, lnd, sea-ice, rof integer :: tagtype, numco, tagindex, partMethod, nghlay integer :: rank, ent_type @@ -1064,18 +1065,31 @@ subroutine cplcomp_moab_Init(infodata,comp) if ( comp%oneletterid == 'a' .and. maxMH /= -1) then call seq_comm_getinfo(cplid ,mpigrp=mpigrp_cplid) ! receiver group call seq_comm_getinfo(id_old,mpigrp=mpigrp_old) ! component group pes + + ! find atm mesh/domain file if it exists; it would be for data atm model (atm_prognostic false) + call seq_infodata_GetData(infodata,atm_mesh = atm_mesh) ! now, if on coupler pes, receive mesh; if on comp pes, send mesh + + if (mphaid >= 0) then + ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) + comp%mbApCCid = mphaid ! phys atm + comp%mbGridType = 0 ! point cloud + comp%mblsize = nvert(1) ! point cloud + endif + if (MPI_COMM_NULL /= mpicom_old ) then ! it means we are on the component pes (atmosphere) ! send mesh to coupler - if (atm_pg_active) then ! change : send the pg2 mesh, not coarse mesh, when atm pg active - ierr = iMOAB_SendMesh(mhpgid, mpicom_join, mpigrp_cplid, id_join, partMethod) - else - ! still use the mhid, original coarse mesh - ierr = iMOAB_SendMesh(mhid, mpicom_join, mpigrp_cplid, id_join, partMethod) - endif - if (ierr .ne. 0) then - write(logunit,*) subname,' error in sending mesh from atm comp ' - call shr_sys_abort(subname//' ERROR in sending mesh from atm comp') + if ( trim(atm_mesh) == 'none' ) then + if (atm_pg_active) then ! change : send the pg2 mesh, not coarse mesh, when atm pg active + ierr = iMOAB_SendMesh(mhpgid, mpicom_join, mpigrp_cplid, id_join, partMethod) + else + ! still use the mhid, original coarse mesh + ierr = iMOAB_SendMesh(mhid, mpicom_join, mpigrp_cplid, id_join, partMethod) + endif + if (ierr .ne. 0) then + write(logunit,*) subname,' error in sending mesh from atm comp ' + call shr_sys_abort(subname//' ERROR in sending mesh from atm comp') + endif endif endif if (MPI_COMM_NULL /= mpicom_new ) then ! we are on the coupler pes @@ -1086,25 +1100,48 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in registering ', appname call shr_sys_abort(subname//' ERROR registering '// appname) endif - ierr = iMOAB_ReceiveMesh(mbaxid, mpicom_join, mpigrp_old, id_old) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in receiving mesh on atm coupler ' - call shr_sys_abort(subname//' ERROR in receiving mesh on atm coupler ') + if ( trim(atm_mesh) == 'none' ) then + ierr = iMOAB_ReceiveMesh(mbaxid, mpicom_join, mpigrp_old, id_old) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in receiving mesh on atm coupler ' + call shr_sys_abort(subname//' ERROR in receiving mesh on atm coupler ') + endif + else + ! we need to read the atm mesh on coupler, from domain file + ierr = iMOAB_LoadMesh(mbaxid, trim(atm_mesh)//C_NULL_CHAR, & + "PARALLEL=READ_PART;PARTITION_METHOD=SQIJ;NO_CULLING", 0) + if ( ierr /= 0 ) then + write(logunit,*) 'Failed to load atm domain mesh on coupler' + call shr_sys_abort(subname//' ERROR Failed to load atm domain mesh on coupler ') + endif + ! need to add global id tag to the app, it will be used in restart + tagtype = 0 ! dense, integer + numco = 1 + tagname='GLOBAL_ID'//C_NULL_CHAR + ierr = iMOAB_DefineTagStorage(mbaxid, tagname, tagtype, numco, tagindex ) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in adding global id tag to atmx' + call shr_sys_abort(subname//' ERROR in adding global id tag to atmx ') + endif endif + + endif ! iMOAB_FreeSenderBuffers needs to be called after receiving the mesh if (mhid .ge. 0) then ! we are on component atm pes - context_id = id_join - if (atm_pg_active) then! we send mesh from mhpgid app - ierr = iMOAB_FreeSenderBuffers(mhpgid, context_id) - else - ierr = iMOAB_FreeSenderBuffers(mhid, context_id) - endif - if (ierr .ne. 0) then - write(logunit,*) subname,' error in freeing send buffers ' - call shr_sys_abort(subname//' ERROR in freeing send buffers') + if ( trim(atm_mesh) == 'none' ) then + context_id = id_join + if (atm_pg_active) then! we send mesh from mhpgid app + ierr = iMOAB_FreeSenderBuffers(mhpgid, context_id) + else + ierr = iMOAB_FreeSenderBuffers(mhid, context_id) + endif + if (ierr .ne. 0) then + write(logunit,*) subname,' error in freeing send buffers ' + call shr_sys_abort(subname//' ERROR in freeing send buffers') + endif endif endif @@ -1116,13 +1153,8 @@ subroutine cplcomp_moab_Init(infodata,comp) typeB = 3 ! in this case, we will have cells associated with DOFs as GLOBAL_ID tag endif ATM_PHYS_CID = 200 + id_old ! 200 + 5 for atm, see line 969 ATM_PHYS = 200 + ATMID ! in - ! components/cam/src/cpl/atm_comp_mct.F90 - if (mphaid >= 0) then - ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) - comp%mbApCCid = mphaid ! phys atm - comp%mbGridType = 0 ! point cloud - comp%mblsize = nvert(1) ! point cloud - endif + ! components/cam/src/cpl/atm_comp_mct.F90 + ! components/data_comps/datm/src/atm_comp_mct.F90 ! line 177 !! ierr = iMOAB_ComputeCommGraph( mphaid, mbaxid, mpicom_join, mpigrp_old, mpigrp_cplid, & typeA, typeB, ATM_PHYS_CID, id_join) ! ID_JOIN is now 6 From 2006011cfae1ab3bb5d987b070b40dc3f00cb787 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Tue, 19 Mar 2024 23:59:04 -0500 Subject: [PATCH 117/310] atm data changes mphaid is now used to signal atm existence on compcpl_exchange (not mhid) make sure MPIgroup is retrieved iso_c_binding is always needed mpoid is not needed on coupler side --- driver-moab/main/cime_comp_mod.F90 | 4 +--- driver-moab/main/cplcomp_exchange_mod.F90 | 2 +- driver-moab/main/prep_atm_mod.F90 | 1 + driver-moab/main/prep_ocn_mod.F90 | 1 - 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/driver-moab/main/cime_comp_mod.F90 b/driver-moab/main/cime_comp_mod.F90 index e09483a3bc0..3bec58b8756 100644 --- a/driver-moab/main/cime_comp_mod.F90 +++ b/driver-moab/main/cime_comp_mod.F90 @@ -209,9 +209,7 @@ module cime_comp_mod use component_type_mod , only: expose_mct_grid_moab #endif -#ifdef MOABCOMP - use iso_c_binding -#endif + use iso_c_binding implicit none diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 69690615c41..1e917f25b49 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -1053,7 +1053,7 @@ subroutine cplcomp_moab_Init(infodata,comp) call seq_comm_getinfo(ID_new ,mpicom=mpicom_new) call seq_comm_getinfo(ID_join,mpicom=mpicom_join) - call shr_mpi_max(mhid, maxMH, mpicom_join, all=.true.) ! if on atm / cpl joint, maxMH /= -1 + call shr_mpi_max(mphaid, maxMH, mpicom_join, all=.true.) ! if on atm / cpl joint, maxMH /= -1 call shr_mpi_max(mpoid, maxMPO, mpicom_join, all=.true.) call shr_mpi_max(mlnid, maxMLID, mpicom_join, all=.true.) call shr_mpi_max(MPSIID, maxMSID, mpicom_join, all=.true.) diff --git a/driver-moab/main/prep_atm_mod.F90 b/driver-moab/main/prep_atm_mod.F90 index c48350d463a..e5009867745 100644 --- a/driver-moab/main/prep_atm_mod.F90 +++ b/driver-moab/main/prep_atm_mod.F90 @@ -797,6 +797,7 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at ! we do not compute intersection, so we will have to just send data from atm to land and viceversa, by GLOBAL_ID matching ! so we compute just a comm graph, between lnd and atm dofs, on the coupler; target is atm ! land is point cloud in this case, type1 = 2 + call seq_comm_getinfo(CPLID ,mpigrp=mpigrp_CPLID) ! make sure we have the right MPI group type1 = 3; ! full mesh for land now type2 = 3; ! fv for target atm ierr = iMOAB_ComputeCommGraph( mblxid, mbaxid, mpicom_CPLID, mpigrp_CPLID, mpigrp_CPLID, type1, type2, & diff --git a/driver-moab/main/prep_ocn_mod.F90 b/driver-moab/main/prep_ocn_mod.F90 index b76a314fe50..7514cc40db0 100644 --- a/driver-moab/main/prep_ocn_mod.F90 +++ b/driver-moab/main/prep_ocn_mod.F90 @@ -12,7 +12,6 @@ module prep_ocn_mod use seq_comm_mct, only: CPLID, OCNID, logunit use seq_comm_mct, only: seq_comm_getData=>seq_comm_setptrs - use seq_comm_mct, only: mpoid ! iMOAB pid for ocean mesh on component pes use seq_comm_mct, only: mboxid ! iMOAB id for mpas ocean migrated mesh to coupler pes use seq_comm_mct, only: mbrmapro ! iMOAB id for map read from rof2ocn map file use seq_comm_mct, only: mbrxoid ! iMOAB id for rof on coupler in ocean context; From a142b44b8f9ca6766d8111b2f32f8850e46a3016 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Wed, 20 Mar 2024 16:59:30 -0500 Subject: [PATCH 118/310] force atm_pg_active for data atm models not sure if this is correct also, accumulated arrays should not be set if the size is 0 --- driver-moab/main/cplcomp_exchange_mod.F90 | 2 ++ driver-moab/main/prep_rof_mod.F90 | 30 ++++++++++++++--------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 1e917f25b49..1d6adf349a3 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -1114,6 +1114,8 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) 'Failed to load atm domain mesh on coupler' call shr_sys_abort(subname//' ERROR Failed to load atm domain mesh on coupler ') endif + ! right now, turn atm_pg_active to true + atm_pg_active = .true. ! FIXME TODO ! need to add global id tag to the app, it will be used in restart tagtype = 0 ! dense, integer numco = 1 diff --git a/driver-moab/main/prep_rof_mod.F90 b/driver-moab/main/prep_rof_mod.F90 index 1fb1e3e75fc..6466692c314 100644 --- a/driver-moab/main/prep_rof_mod.F90 +++ b/driver-moab/main/prep_rof_mod.F90 @@ -1033,10 +1033,12 @@ subroutine prep_rof_accum_avg_moab() tagname = trim(sharedFieldsLndRof)//C_NULL_CHAR arrsize = nfields_sh_lr * lsize_lm ent_type = 1 ! cell type - ierr = iMOAB_SetDoubleTagStorage ( mblxid, tagname, arrsize , ent_type, l2racc_lm) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on land instance ') - endif + if (arrsize > 0) then + ierr = iMOAB_SetDoubleTagStorage ( mblxid, tagname, arrsize , ent_type, l2racc_lm) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on land instance ') + endif + endif #ifdef MOABDEBUG if (mblxid .ge. 0 ) then ! we are on coupler pes, for sure @@ -1058,10 +1060,12 @@ subroutine prep_rof_accum_avg_moab() tagname = trim(sharedFieldsAtmRof)//C_NULL_CHAR arrsize = nfields_sh_ar * lsize_am ent_type = 1 ! cell type - ierr = iMOAB_SetDoubleTagStorage ( mbaxid, tagname, arrsize , ent_type, a2racc_am) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on atm instance ') - endif + if (arrsize > 0) then + ierr = iMOAB_SetDoubleTagStorage ( mbaxid, tagname, arrsize , ent_type, a2racc_am) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on atm instance ') + endif + endif #ifdef MOABDEBUG if (mbaxid .ge. 0 ) then ! we are on coupler pes, for sure write(lnum,"(I0.2)")num_moab_exports @@ -1081,10 +1085,12 @@ subroutine prep_rof_accum_avg_moab() tagname = trim(sharedFieldsOcnRof)//C_NULL_CHAR arrsize = nfields_sh_or * lsize_om ent_type = 1 ! cell type - ierr = iMOAB_SetDoubleTagStorage ( mboxid, tagname, arrsize , ent_type, o2racc_om) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on ocn instance ') - endif + if (arrsize > 0 ) then + ierr = iMOAB_SetDoubleTagStorage ( mboxid, tagname, arrsize , ent_type, o2racc_om) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' error in setting accumulated shared fields on rof on ocn instance ') + endif + endif #ifdef MOABDEBUG if (mboxid .ge. 0 ) then ! we are on coupler pes, for sure write(lnum,"(I0.2)")num_moab_exports From df560e2094cc3e9b6b747df48335d9f90de13d6c Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Thu, 21 Mar 2024 09:01:07 -0500 Subject: [PATCH 119/310] change the name to seq_moab_drv also, debug datm_comp_comp_run.h5m still, x2l fields dry deposition, carbon, are not init; maybe we should --- .../data_comps/datm/src/datm_comp_mod.F90 | 21 ++++++++++++++++++- driver-moab/main/cime_comp_mod.F90 | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index 60843737e89..e6e769d6f75 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -751,7 +751,10 @@ subroutine datm_comp_run(EClock, x2a, a2x, & nextsw_cday, case_name) ! !DESCRIPTION: run method for datm model - +#ifdef MOABDEBUG + use seq_comm_mct, only : mphaid ! + use iMOAB, only: iMOAB_WriteMesh +#endif implicit none ! !INPUT/OUTPUT PARAMETERS: @@ -800,6 +803,11 @@ subroutine datm_comp_run(EClock, x2a, a2x, & real(R8) :: tbot,pbot,rtmp,vp,ea,e,qsat,frac #ifdef HAVE_MOAB real(R8), allocatable, target :: datam(:) +#ifdef MOABDEBUG + integer :: cur_datm_stepno, ierr + character*100 outfile, wopts, lnum +#endif + #endif character(*), parameter :: F00 = "('(datm_comp_run) ',8a)" character(*), parameter :: F04 = "('(datm_comp_run) ',2a,2i8,'s')" @@ -1357,6 +1365,17 @@ subroutine datm_comp_run(EClock, x2a, a2x, & end if deallocate(datam) ! maybe we should keep it around, deallocate at the end +#ifdef MOABDEBUG + call seq_timemgr_EClockGetData( EClock, stepno=cur_datm_stepno ) + write(lnum,"(I0.2)")cur_datm_stepno + outfile = 'datm_comp_run_'//trim(lnum)//'.h5m'//C_NULL_CHAR + wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR + ierr = iMOAB_WriteMesh(mphaid, outfile, wopts) + if (ierr > 0 ) then + write(logunit,*) 'Failed to write data atm component state ' + endif +#endif + #endif call t_startf('datm_run2') diff --git a/driver-moab/main/cime_comp_mod.F90 b/driver-moab/main/cime_comp_mod.F90 index 3bec58b8756..dada0e1f5f8 100644 --- a/driver-moab/main/cime_comp_mod.F90 +++ b/driver-moab/main/cime_comp_mod.F90 @@ -679,7 +679,7 @@ module cime_comp_mod !---------------------------------------------------------------------------- ! formats !---------------------------------------------------------------------------- - character(*), parameter :: subname = '(seq_mct_drv)' + character(*), parameter :: subname = '(seq_moab_drv)' character(*), parameter :: F00 = "('"//subname//" : ', 4A )" character(*), parameter :: F0L = "('"//subname//" : ', A, L6 )" character(*), parameter :: F01 = "('"//subname//" : ', A, 2i8, 3x, A )" From c6d67f8d3b9e868f5d1f60e6460d9d6d4745682a Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Sat, 23 Mar 2024 01:05:08 -0500 Subject: [PATCH 120/310] zeroing out x2a and a2x fields did not fix the bug --- driver-moab/main/cplcomp_exchange_mod.F90 | 60 +++++++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 1d6adf349a3..f77bcb6d3ce 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -994,7 +994,7 @@ subroutine cplcomp_moab_Init(infodata,comp) ! use iMOAB, only: iMOAB_RegisterApplication, iMOAB_ReceiveMesh, iMOAB_SendMesh, & iMOAB_WriteMesh, iMOAB_DefineTagStorage, iMOAB_GetMeshInfo, & - iMOAB_SetIntTagStorage, iMOAB_FreeSenderBuffers, iMOAB_ComputeCommGraph, iMOAB_LoadMesh + iMOAB_SetDoubleTagStorage, iMOAB_FreeSenderBuffers, iMOAB_ComputeCommGraph, iMOAB_LoadMesh ! use seq_infodata_mod ! @@ -1026,8 +1026,11 @@ subroutine cplcomp_moab_Init(infodata,comp) integer :: rank, ent_type integer :: typeA, typeB, ATM_PHYS_CID ! used to compute par graph between atm phys ! and atm spectral on coupler - character(CXX) :: tagname - integer nvert(3), nvise(3), nbl(3), nsurf(3), nvisBC(3) + character(CXX) :: tagname + integer nvert(3), nvise(3), nbl(3), nsurf(3), nvisBC(3) + type(mct_list) :: temp_list + integer :: nfields, arrsize + real(R8), allocatable, target :: values(:) !----------------------------------------------------- @@ -1183,6 +1186,39 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in defining tags seq_flds_x2a_fields on atm on coupler ' call shr_sys_abort(subname//' ERROR in defining tags ') endif + ! zero out the fields for seq_flds_x2a_fields and seq_flds_a2x_fields, on mbaxid + ! first determine the size of array + ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in getting mesh info on atm on coupler ' + call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') + endif + ! find the length of fields, from the nb of fields of the AVs + call mct_list_init(temp_list ,seq_flds_x2a_fields) + nfields = mct_list_nitem (temp_list) + call mct_list_clean(temp_list) + arrsize=nfields * nvise(1) + tagname = trim(seq_flds_x2a_fields)//C_NULL_CHAR + allocate(values(arrsize)) + values = 0. + ierr = iMOAB_SetDoubleTagStorage(mbaxid, tagname, arrsize, 1, values ) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in zeroing out x2a_fields ' + call shr_sys_abort(subname//' ERROR in zeroing out x2a_fields ') + endif + deallocate(values) + call mct_list_init(temp_list ,seq_flds_a2x_fields) + nfields = mct_list_nitem (temp_list) + call mct_list_clean(temp_list) + arrsize=nfields * nvise(1) + tagname = trim(seq_flds_a2x_fields)//C_NULL_CHAR + allocate(values(arrsize)) + values = 0. + ierr = iMOAB_SetDoubleTagStorage(mbaxid, tagname, arrsize, 1, values ) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in zeroing out a2x_fields ' + call shr_sys_abort(subname//' ERROR in zeroing out a2x_fields ') + endif !add the normalization tag tagname = trim(seq_flds_dom_fields)//":norm8wt"//C_NULL_CHAR @@ -1335,7 +1371,7 @@ subroutine cplcomp_moab_Init(infodata,comp) endif endif endif - ! in case of domain read, we need ot compute the comm graph + ! in case of domain read, we need to compute the comm graph if ( trim(ocn_domain) /= 'none' ) then ! we are now on joint pes, compute comm graph between data ocn and coupler model ocn typeA = 2 ! point cloud on component PEs @@ -1766,16 +1802,20 @@ subroutine component_exch_moab(comp, mbAPPid1, mbAppid2, direction, fields ) call shr_sys_abort(subname//' cannot free sender buffers') endif endif - + #ifdef MOABDEBUG + if (direction .eq. 0 ) then + dir = 'c2x' + else + dir = 'x2c' + endif + if (seq_comm_iamroot(CPLID) ) then + write(logunit,'(A)') subname//' '//comp%ntype//' called in direction '//trim(dir)//' for fields '//trim(tagname) + endif if (mbAPPid2 .ge. 0 ) then ! we are on receiving pes, for sure ! number_proj = number_proj+1 ! count the number of projections write(lnum,"(I0.2)") num_moab_exports - if (direction .eq. 0 ) then - dir = 'c2x' - else - dir = 'x2c' - endif + outfile = comp%ntype//'_'//trim(dir)//'_'//trim(lnum)//'.h5m'//C_NULL_CHAR wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! ierr = iMOAB_WriteMesh(mbAPPid2, trim(outfile), trim(wopts)) From 6db12b336dd754ca8658edc90538ecf8287f203b Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Mon, 25 Mar 2024 10:22:08 -0500 Subject: [PATCH 121/310] init on atm data side with zeros; it helps finishing and not crashing in land model we do not zero out in general, like call mct_aVect_zero(x2a) this is one instance in which this was essential to continue --- .../data_comps/datm/src/datm_comp_mod.F90 | 32 +++- driver-moab/main/cime_comp_mod.F90 | 137 +++++++++++++++++- driver-moab/main/component_type_mod.F90 | 2 +- 3 files changed, 163 insertions(+), 8 deletions(-) diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index e6e769d6f75..b1043b60735 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -271,11 +271,12 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & #ifdef HAVE_MOAB character*400 tagname real(R8) latv, lonv - integer iv, tagindex, ilat, ilon, ierr + integer iv, tagindex, ilat, ilon, ierr, arrsize, nfields real(R8), allocatable, target :: data(:) integer(IN), pointer :: idata(:) ! temporary real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary integer :: mpigrp ! mpigrp + real(R8), allocatable, target :: vtags_zero(:, :) #ifdef MOABDEBUG character*100 outfile, wopts #endif @@ -626,7 +627,36 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & !---------------------------------------------------------------------------- ! Read restart !---------------------------------------------------------------------------- +#ifdef HAVE_MOAB + ! zero out moab tags too, as in + ! call mct_aVect_zero(x2a) + ! call mct_aVect_zero(a2x) + nfields=mct_aVect_nRAttr(x2a) + allocate( vtags_zero(lsize, nfields)) + vtags_zero = 0. + arrsize = lsize * nfields + tagname = trim(seq_flds_x2a_fields)//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage(mphaid, tagname, arrsize, & + 0, & ! set data on vertices + vtags_zero) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in setting tags to 0 ') + endif + deallocate(vtags_zero) + nfields=mct_aVect_nRAttr(a2x) + allocate( vtags_zero(lsize, nfields)) + vtags_zero = 0. + arrsize = lsize * nfields + tagname = trim(seq_flds_a2x_fields)//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage(mphaid, tagname, arrsize, & + 0, & ! set data on vertices + vtags_zero) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in setting tags to 0 ') + endif + deallocate(vtags_zero) +#endif if (read_restart) then if (trim(rest_file) == trim(nullstr) .and. & trim(rest_file_strm) == trim(nullstr)) then diff --git a/driver-moab/main/cime_comp_mod.F90 b/driver-moab/main/cime_comp_mod.F90 index dada0e1f5f8..255778fd8ed 100644 --- a/driver-moab/main/cime_comp_mod.F90 +++ b/driver-moab/main/cime_comp_mod.F90 @@ -129,6 +129,8 @@ module cime_comp_mod use seq_rest_mod, only : seq_rest_read, seq_rest_mb_read, seq_rest_write, seq_rest_mb_write #ifdef MOABDEBUG use seq_rest_mod, only : write_moab_state + use iMOAB, only: iMOAB_GetDoubleTagStorage, iMOAB_GetMeshInfo + use component_type_mod, only: component_get_name, component_get_c2x_cc #endif ! flux calc routines @@ -688,6 +690,14 @@ module cime_comp_mod character(*), parameter :: FormatD = '(A,": =============== ", A20,I10.8,I8,6x, " ===============")' character(*), parameter :: FormatR = '(A,": =============== ", A31,F12.3,1x, " ===============")' character(*), parameter :: FormatQ = '(A,": =============== ", A20,2F10.2,4x," ===============")' + +#ifdef MOABDEBUG +! allocate to get data frpm moab + real(r8) , private, pointer :: moab_tag_vals(:,:) ! various tags for debug purposes + integer nvert(3), nvise(3), nbl(3), nsurf(3), nvisBC(3), arrsize, ent_type + character(100) :: tagname + type(mct_aVect) , pointer :: a2x_aa => null() +#endif !=============================================================================== contains !=============================================================================== @@ -1490,6 +1500,30 @@ subroutine cime_init() call component_init_cc(Eclock_a, atm, atm_init, infodata, NLFilename) call t_adj_detailf(-2) call t_stopf('CPL:comp_init_cc_atm') +#ifdef MOABDEBUG + if (mphaid .ge. 0) then + a2x_aa => component_get_c2x_cc(atm(1)) + write(logunit,*) ' a2x_aa (22,1..) after atm init', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) + tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR + ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting mesh info on atm on comp ') + endif + allocate(moab_tag_vals(nvert(1), 3)) + arrsize = nvise(1)*3 + ent_type = 1 + ierr = iMOAB_GetDoubleTagStorage(mphaid, tagname, arrsize , ent_type, moab_tag_vals) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting 3 tags ') + endif + if (iamroot_CPLID )then + write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals on comp:', moab_tag_vals(1,1), & + moab_tag_vals(1,2), moab_tag_vals(1,3) + endif + deallocate(moab_tag_vals) + endif +#endif + call t_startf('CPL:comp_init_cc_lnd') call t_adj_detailf(+2) @@ -1539,6 +1573,7 @@ subroutine cime_init() call t_adj_detailf(-2) call t_stopf('CPL:comp_init_cc_iac') + !--------------------------------------------------------------------------------------- ! Initialize coupler-component data ! if processor has cpl or model @@ -1570,7 +1605,12 @@ subroutine cime_init() call component_init_cx(iac, infodata) call t_adj_detailf(-2) call t_stopf('CPL:comp_init_cx_all') - +#ifdef MOABDEBUG + if (iamroot_CPLID )then + a2x_ax => component_get_c2x_cx(atm(1)) + write(logunit,*) ' a2x_ax (22,1..) after init cx', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) + endif +#endif !--------------------------------------------------------------------------------------- ! Determine complist (list of comps for each id) ! Build complist string that will be output later. @@ -2032,7 +2072,12 @@ subroutine cime_init() ! MOAB: compute intersection intx for each pair of grids on coupler and weights ! MOAB: augment seq_map_type object with MOAB attributes to enable seq_map_map to do MOAB-based projections !---------------------------------------------------------- - +#ifdef MOABDEBUG + if (mphaid .ge. 0) then + a2x_aa => component_get_c2x_cc(atm(1)) + write(logunit,*) ' a2x_aa (22,1..) before atm prep', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) + endif +#endif if (iamin_CPLID) then call t_startf('CPL:init_maps') @@ -2042,7 +2087,12 @@ subroutine cime_init() ! init maps for So2a, Sl2a, Si2a, Fo2a, Fl2a, Fi2a ! MOAB: calculate o2a intx, l2a intx for tri-grid call prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_lnd) - +#ifdef MOABDEBUG + if (iamroot_CPLID )then + a2x_ax => component_get_c2x_cx(atm(1)) + write(logunit,*) ' a2x_ax (22,1..) after prep atm init', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) + endif +#endif ! init maps for Sa2l, Fa2l, Fr2l, Sg2l, Fg2l ! MOABTODO: a2l intx for tri-grid r2l intx for bi-grid intx call prep_lnd_init(infodata, atm_c2_lnd, rof_c2_lnd, glc_c2_lnd, iac_c2_lnd) @@ -2157,7 +2207,52 @@ subroutine cime_init() ! mostly for debug mode num_moab_exports = 0 - +#ifdef MOABDEBUG + if (iamroot_CPLID )then + a2x_ax => component_get_c2x_cx(atm(1)) + write(logunit,*) ' a2x_ax (22,1..) before area corrections', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) + endif + if (mphaid .ge. 0) then + a2x_aa => component_get_c2x_cc(atm(1)) + write(logunit,*) ' a2x_aa (22,1..) before area corrections', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) + tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR + ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting mesh info on atm on comp ') + endif + allocate(moab_tag_vals(nvert(1), 3)) + arrsize = nvise(1)*3 + ent_type = 1 + ierr = iMOAB_GetDoubleTagStorage(mphaid, tagname, arrsize , ent_type, moab_tag_vals) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting 3 tags ') + endif + if (iamroot_CPLID )then + write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals on comp:', moab_tag_vals(1,1), & + moab_tag_vals(1,2), moab_tag_vals(1,3) + endif + deallocate(moab_tag_vals) + endif + if (mbaxid .ge. 0) then + tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR + ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') + endif + allocate(moab_tag_vals(nvise(1), 3)) + arrsize = nvise(1)*3 + ent_type = 1 + ierr = iMOAB_GetDoubleTagStorage(mbaxid, tagname, arrsize , ent_type, moab_tag_vals) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting 3 tags ') + endif + if (iamroot_CPLID )then + write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals:', moab_tag_vals(1,1), & + moab_tag_vals(1,2), moab_tag_vals(1,3) + endif + deallocate(moab_tag_vals) + endif +#endif call mpi_barrier(mpicom_GLOID,ierr) if (atm_present) call component_init_areacor(atm, areafact_samegrid, seq_flds_a2x_fluxes) ! send initial data to coupler @@ -2196,7 +2291,32 @@ subroutine cime_init() call t_adj_detailf(-2) call t_stopf ('CPL:init_areacor') - +#ifdef MOABDEBUG + + if (iamroot_CPLID )then + a2x_ax => component_get_c2x_cx(atm(1)) + write(logunit,*) ' a2x_ax (22,1..) after area corrections', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) + endif + if (mbaxid .ge. 0) then + tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR + ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') + endif + allocate(moab_tag_vals(nvise(1), 3)) + arrsize = nvise(1)*3 + ent_type = 1 + ierr = iMOAB_GetDoubleTagStorage(mbaxid, tagname, arrsize , ent_type, moab_tag_vals) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in getting 3 tags ') + endif + if (iamroot_CPLID )then + write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals:', moab_tag_vals(1,1), & + moab_tag_vals(1,2), moab_tag_vals(1,3) + endif + deallocate(moab_tag_vals) + endif +#endif !---------------------------------------------------------- !| global sum diagnostics for initial data sent to coupler. !---------------------------------------------------------- @@ -2316,7 +2436,12 @@ subroutine cime_init() call t_adj_detailf(-2) call t_stopf ('CPL:init_fracs') endif - +#ifdef MOABDEBUG + a2x_ax => component_get_c2x_cx(atm(1)) + if (iamroot_CPLID )then + write(logunit,*) ' a2x_ax (22,1..) after fractions', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) + endif +#endif !---------------------------------------------------------- !| Initialize prep_aoflux_mod module variables xao_*x and ! set to zero. diff --git a/driver-moab/main/component_type_mod.F90 b/driver-moab/main/component_type_mod.F90 index 7f6ab3765b3..85a300356c9 100644 --- a/driver-moab/main/component_type_mod.F90 +++ b/driver-moab/main/component_type_mod.F90 @@ -482,7 +482,7 @@ subroutine compare_mct_av_moab_tag(comp, attrVect, mct_field, appId, tagname, en deallocate(values) ! now start comparing tags after set - ierr = iMOAB_GetMeshInfo ( appId, nvert, nvise, nbl, nsurf, nvisBC ); + ierr = iMOAB_GetMeshInfo ( appId, nvert, nvise, nbl, nsurf, nvisBC ) if (ierr > 0 ) & call shr_sys_abort(subname//'Error: fail to get mesh info') if (ent_type .eq. 0) then From e070fa69e3f454c3ec7516925406afed9bb94f2a Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Mon, 25 Mar 2024 18:12:06 -0500 Subject: [PATCH 122/310] set moab fields in a loop instead of going by each tag we were missing anyway some fields that were set by stream routine that was the big miss init to 0 are not needed anymore, as everything is now set properly --- .../data_comps/datm/src/datm_comp_mod.F90 | 101 +++++--------- driver-moab/main/cime_comp_mod.F90 | 128 +----------------- driver-moab/main/cplcomp_exchange_mod.F90 | 34 +---- 3 files changed, 44 insertions(+), 219 deletions(-) diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index b1043b60735..76efa2c6d09 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -271,12 +271,12 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & #ifdef HAVE_MOAB character*400 tagname real(R8) latv, lonv - integer iv, tagindex, ilat, ilon, ierr, arrsize, nfields + integer iv, tagindex, ilat, ilon, ierr !, arrsize, nfields real(R8), allocatable, target :: data(:) integer(IN), pointer :: idata(:) ! temporary real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary integer :: mpigrp ! mpigrp - real(R8), allocatable, target :: vtags_zero(:, :) + !real(R8), allocatable, target :: vtags_zero(:, :) #ifdef MOABDEBUG character*100 outfile, wopts #endif @@ -627,36 +627,7 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & !---------------------------------------------------------------------------- ! Read restart !---------------------------------------------------------------------------- -#ifdef HAVE_MOAB - ! zero out moab tags too, as in - ! call mct_aVect_zero(x2a) - ! call mct_aVect_zero(a2x) - nfields=mct_aVect_nRAttr(x2a) - allocate( vtags_zero(lsize, nfields)) - vtags_zero = 0. - arrsize = lsize * nfields - tagname = trim(seq_flds_x2a_fields)//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage(mphaid, tagname, arrsize, & - 0, & ! set data on vertices - vtags_zero) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in setting tags to 0 ') - endif - deallocate(vtags_zero) - nfields=mct_aVect_nRAttr(a2x) - allocate( vtags_zero(lsize, nfields)) - vtags_zero = 0. - arrsize = lsize * nfields - tagname = trim(seq_flds_a2x_fields)//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage(mphaid, tagname, arrsize, & - 0, & ! set data on vertices - vtags_zero) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in setting tags to 0 ') - endif - deallocate(vtags_zero) -#endif if (read_restart) then if (trim(rest_file) == trim(nullstr) .and. & trim(rest_file_strm) == trim(nullstr)) then @@ -784,6 +755,9 @@ subroutine datm_comp_run(EClock, x2a, a2x, & #ifdef MOABDEBUG use seq_comm_mct, only : mphaid ! use iMOAB, only: iMOAB_WriteMesh +#endif +#ifdef HAVE_MOAB + use seq_flds_mod , only: seq_flds_a2x_fields ! this should not be an argument in datm_comp_init #endif implicit none @@ -833,6 +807,10 @@ subroutine datm_comp_run(EClock, x2a, a2x, & real(R8) :: tbot,pbot,rtmp,vp,ea,e,qsat,frac #ifdef HAVE_MOAB real(R8), allocatable, target :: datam(:) + type(mct_list) :: temp_list + integer :: size_list, index_list + type(mct_string) :: mctOStr ! + character*400 tagname, mct_field #ifdef MOABDEBUG integer :: cur_datm_stepno, ierr character*100 outfile, wopts, lnum @@ -886,6 +864,11 @@ subroutine datm_comp_run(EClock, x2a, a2x, & allocate(count_av(SDATM%nstreams)) allocate(count_st(SDATM%nstreams)) end if + +#ifdef MOABDEBUG + write(logunit,*) ' a2x_aa (22,1..) at beginning of datm_comp_run', a2x%rattr(22,1), a2x%rattr(22,2) +#endif + do n = 1,SDATM%nstreams if (firstcall) then call shr_dmodel_translate_list(SDATM%avs(n),a2x,& @@ -896,6 +879,9 @@ subroutine datm_comp_run(EClock, x2a, a2x, & ilist_av(n),olist_av(n),rearr) end if enddo +#ifdef MOABDEBUG + write(logunit,*) ' a2x_aa (22,1..) after datm_comp_run translate lists', a2x%rattr(22,1), a2x%rattr(22,2) +#endif do n = 1,SDATM%nstreams if (firstcall) then call shr_dmodel_translate_list(SDATM%avs(n),avstrm,& @@ -907,7 +893,9 @@ subroutine datm_comp_run(EClock, x2a, a2x, & end if enddo call t_stopf('datm_scatter') - +#ifdef MOABDEBUG + write(logunit,*) ' a2x_aa (22,1..) after datm_comp_run scatter ', a2x%rattr(22,1), a2x%rattr(22,2) +#endif !------------------------------------------------- ! Determine data model behavior based on the mode !------------------------------------------------- @@ -1321,7 +1309,9 @@ subroutine datm_comp_run(EClock, x2a, a2x, & !---------------------------------------------------------- ! bias correction / anomaly forcing ( end block ) !---------------------------------------------------------- - +#ifdef MOABDEBUG + write(logunit,*) ' a2x_aa (22,1..) at the end of of datm_comp_run', a2x%rattr(22,1), a2x%rattr(22,2) +#endif !-------------------- ! Write restart !-------------------- @@ -1359,41 +1349,16 @@ subroutine datm_comp_run(EClock, x2a, a2x, & #ifdef HAVE_MOAB lsize = mct_avect_lsize(a2x) ! is it the same as mct_avect_lsize(avstrm) ? allocate(datam(lsize)) ! - call moab_set_tag('Sa_z'//C_NULL_CHAR , a2x, kz, datam, lsize) ! kz = mct_aVect_indexRA(a2x,'Sa_z') - call moab_set_tag('Sa_topo'//C_NULL_CHAR, a2x, ktopo, datam, lsize) ! ktopo = mct_aVect_indexRA(a2x,'Sa_topo') - call moab_set_tag('Sa_u'//C_NULL_CHAR, a2x, ku , datam, lsize) ! ku = mct_aVect_indexRA(a2x,'Sa_u') - call moab_set_tag('Sa_v'//C_NULL_CHAR, a2x, kv , datam, lsize) ! kv = mct_aVect_indexRA(a2x,'Sa_v') - call moab_set_tag('Sa_tbot'//C_NULL_CHAR, a2x, ktbot, datam, lsize) ! ktbot = mct_aVect_indexRA(a2x,'Sa_tbot') - call moab_set_tag('Sa_ptem'//C_NULL_CHAR, a2x, kptem, datam, lsize) ! kptem = mct_aVect_indexRA(a2x,'Sa_ptem') - call moab_set_tag('Sa_shum'//C_NULL_CHAR, a2x, kshum, datam, lsize) ! kshum = mct_aVect_indexRA(a2x,'Sa_shum') - call moab_set_tag('Sa_dens'//C_NULL_CHAR, a2x, kdens, datam, lsize) ! kdens = mct_aVect_indexRA(a2x,'Sa_dens') - call moab_set_tag('Sa_pbot'//C_NULL_CHAR, a2x, kpbot, datam, lsize) ! kpbot = mct_aVect_indexRA(a2x,'Sa_pbot') - call moab_set_tag('Sa_pslv'//C_NULL_CHAR, a2x, kpslv, datam, lsize) ! kpslv = mct_aVect_indexRA(a2x,'Sa_pslv') - call moab_set_tag('Faxa_lwdn'//C_NULL_CHAR, a2x, klwdn, datam, lsize) ! klwdn = mct_aVect_indexRA(a2x,'Faxa_lwdn') - call moab_set_tag('Faxa_rainc'//C_NULL_CHAR, a2x, krc, datam, lsize) ! krc = mct_aVect_indexRA(a2x,'Faxa_rainc') - call moab_set_tag('Faxa_rainl'//C_NULL_CHAR, a2x, krl, datam, lsize) ! krl = mct_aVect_indexRA(a2x,'Faxa_rainl') - call moab_set_tag('Faxa_snowc'//C_NULL_CHAR, a2x, ksc, datam, lsize) ! ksc = mct_aVect_indexRA(a2x,'Faxa_snowc') - call moab_set_tag('Faxa_snowl'//C_NULL_CHAR, a2x, ksl, datam, lsize) ! ksl = mct_aVect_indexRA(a2x,'Faxa_snowl') - call moab_set_tag('Faxa_swndr'//C_NULL_CHAR, a2x, kswndr, datam, lsize) ! kswndr= mct_aVect_indexRA(a2x,'Faxa_swndr') - call moab_set_tag('Faxa_swndf'//C_NULL_CHAR, a2x, kswndf, datam, lsize) ! kswndf= mct_aVect_indexRA(a2x,'Faxa_swndf') - call moab_set_tag('Faxa_swvdr'//C_NULL_CHAR, a2x, kswvdr, datam, lsize) ! kswvdr= mct_aVect_indexRA(a2x,'Faxa_swvdr') - call moab_set_tag('Faxa_swvdf'//C_NULL_CHAR, a2x, kswvdf, datam, lsize) ! kswvdf= mct_aVect_indexRA(a2x,'Faxa_swvdf') - call moab_set_tag('Faxa_swnet'//C_NULL_CHAR, a2x, kswnet, datam, lsize) ! kswnet= mct_aVect_indexRA(a2x,'Faxa_swnet') - -if (wiso_datm) then ! water isotopic forcing - call moab_set_tag('Sa_shum_16O'//C_NULL_CHAR, a2x, kshum_16O, datam, lsize) ! kshum_16O = mct_aVect_indexRA(a2x,'Sa_shum_16O') - call moab_set_tag('Sa_shum_18O'//C_NULL_CHAR, a2x, kshum_18O, datam, lsize) ! kshum_18O = mct_aVect_indexRA(a2x,'Sa_shum_18O') - call moab_set_tag('Sa_shum_HDO'//C_NULL_CHAR, a2x, kshum_HDO, datam, lsize) ! kshum_HDO = mct_aVect_indexRA(a2x,'Sa_shum_HDO') - call moab_set_tag('Faxa_rainc_18O'//C_NULL_CHAR, a2x, krc_18O, datam, lsize) ! krc_18O = mct_aVect_indexRA(a2x,'Faxa_rainc_18O') - call moab_set_tag('Faxa_rainc_HDO'//C_NULL_CHAR, a2x, krc_HDO, datam, lsize) ! krc_HDO = mct_aVect_indexRA(a2x,'Faxa_rainc_HDO') - call moab_set_tag('Faxa_rainl_18O'//C_NULL_CHAR, a2x, krl_18O, datam, lsize) ! krl_18O = mct_aVect_indexRA(a2x,'Faxa_rainl_18O') - call moab_set_tag('Faxa_rainl_HDO'//C_NULL_CHAR, a2x, krl_HDO, datam, lsize) ! krl_HDO = mct_aVect_indexRA(a2x,'Faxa_rainl_HDO') - call moab_set_tag('Faxa_snowc_18O'//C_NULL_CHAR, a2x, ksc_18O, datam, lsize) ! ksc_18O = mct_aVect_indexRA(a2x,'Faxa_snowc_18O') - call moab_set_tag('Faxa_snowc_HDO'//C_NULL_CHAR, a2x, ksc_HDO, datam, lsize) ! ksc_HDO = mct_aVect_indexRA(a2x,'Faxa_snowc_HDO') - call moab_set_tag('Faxa_snowl_18O'//C_NULL_CHAR, a2x, ksl_18O, datam, lsize) ! ksl_18O = mct_aVect_indexRA(a2x,'Faxa_snowl_18O') - call moab_set_tag('Faxa_snowl_HDO'//C_NULL_CHAR, a2x, ksl_HDO, datam, lsize) ! ksl_HDO = mct_aVect_indexRA(a2x,'Faxa_snowl_HDO') -end if - deallocate(datam) ! maybe we should keep it around, deallocate at the end + call mct_list_init(temp_list ,seq_flds_a2x_fields) + size_list=mct_list_nitem (temp_list) + do index_list = 1, size_list + call mct_list_get(mctOStr,index_list,temp_list) + mct_field = mct_string_toChar(mctOStr) + tagname= trim(mct_field)//C_NULL_CHAR + call moab_set_tag(tagname, a2x, index_list, datam, lsize) ! loop over all a2x fields, not just a few + enddo + call mct_list_clean(temp_list) + deallocate(datam) ! maybe we should keep it around, deallocate at the final only? #ifdef MOABDEBUG call seq_timemgr_EClockGetData( EClock, stepno=cur_datm_stepno ) diff --git a/driver-moab/main/cime_comp_mod.F90 b/driver-moab/main/cime_comp_mod.F90 index 255778fd8ed..265f8e11338 100644 --- a/driver-moab/main/cime_comp_mod.F90 +++ b/driver-moab/main/cime_comp_mod.F90 @@ -681,7 +681,7 @@ module cime_comp_mod !---------------------------------------------------------------------------- ! formats !---------------------------------------------------------------------------- - character(*), parameter :: subname = '(seq_moab_drv)' + character(*), parameter :: subname = '(moab_driver)' character(*), parameter :: F00 = "('"//subname//" : ', 4A )" character(*), parameter :: F0L = "('"//subname//" : ', A, L6 )" character(*), parameter :: F01 = "('"//subname//" : ', A, 2i8, 3x, A )" @@ -1500,30 +1500,6 @@ subroutine cime_init() call component_init_cc(Eclock_a, atm, atm_init, infodata, NLFilename) call t_adj_detailf(-2) call t_stopf('CPL:comp_init_cc_atm') -#ifdef MOABDEBUG - if (mphaid .ge. 0) then - a2x_aa => component_get_c2x_cc(atm(1)) - write(logunit,*) ' a2x_aa (22,1..) after atm init', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) - tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR - ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting mesh info on atm on comp ') - endif - allocate(moab_tag_vals(nvert(1), 3)) - arrsize = nvise(1)*3 - ent_type = 1 - ierr = iMOAB_GetDoubleTagStorage(mphaid, tagname, arrsize , ent_type, moab_tag_vals) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting 3 tags ') - endif - if (iamroot_CPLID )then - write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals on comp:', moab_tag_vals(1,1), & - moab_tag_vals(1,2), moab_tag_vals(1,3) - endif - deallocate(moab_tag_vals) - endif -#endif - call t_startf('CPL:comp_init_cc_lnd') call t_adj_detailf(+2) @@ -1605,12 +1581,7 @@ subroutine cime_init() call component_init_cx(iac, infodata) call t_adj_detailf(-2) call t_stopf('CPL:comp_init_cx_all') -#ifdef MOABDEBUG - if (iamroot_CPLID )then - a2x_ax => component_get_c2x_cx(atm(1)) - write(logunit,*) ' a2x_ax (22,1..) after init cx', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) - endif -#endif + !--------------------------------------------------------------------------------------- ! Determine complist (list of comps for each id) ! Build complist string that will be output later. @@ -2072,12 +2043,7 @@ subroutine cime_init() ! MOAB: compute intersection intx for each pair of grids on coupler and weights ! MOAB: augment seq_map_type object with MOAB attributes to enable seq_map_map to do MOAB-based projections !---------------------------------------------------------- -#ifdef MOABDEBUG - if (mphaid .ge. 0) then - a2x_aa => component_get_c2x_cc(atm(1)) - write(logunit,*) ' a2x_aa (22,1..) before atm prep', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) - endif -#endif + if (iamin_CPLID) then call t_startf('CPL:init_maps') @@ -2087,12 +2053,7 @@ subroutine cime_init() ! init maps for So2a, Sl2a, Si2a, Fo2a, Fl2a, Fi2a ! MOAB: calculate o2a intx, l2a intx for tri-grid call prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_lnd) -#ifdef MOABDEBUG - if (iamroot_CPLID )then - a2x_ax => component_get_c2x_cx(atm(1)) - write(logunit,*) ' a2x_ax (22,1..) after prep atm init', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) - endif -#endif + ! init maps for Sa2l, Fa2l, Fr2l, Sg2l, Fg2l ! MOABTODO: a2l intx for tri-grid r2l intx for bi-grid intx call prep_lnd_init(infodata, atm_c2_lnd, rof_c2_lnd, glc_c2_lnd, iac_c2_lnd) @@ -2207,52 +2168,7 @@ subroutine cime_init() ! mostly for debug mode num_moab_exports = 0 -#ifdef MOABDEBUG - if (iamroot_CPLID )then - a2x_ax => component_get_c2x_cx(atm(1)) - write(logunit,*) ' a2x_ax (22,1..) before area corrections', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) - endif - if (mphaid .ge. 0) then - a2x_aa => component_get_c2x_cc(atm(1)) - write(logunit,*) ' a2x_aa (22,1..) before area corrections', a2x_aa%rattr(22,1), a2x_aa%rattr(22,2) - tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR - ierr = iMOAB_GetMeshInfo ( mphaid, nvert, nvise, nbl, nsurf, nvisBC ) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting mesh info on atm on comp ') - endif - allocate(moab_tag_vals(nvert(1), 3)) - arrsize = nvise(1)*3 - ent_type = 1 - ierr = iMOAB_GetDoubleTagStorage(mphaid, tagname, arrsize , ent_type, moab_tag_vals) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting 3 tags ') - endif - if (iamroot_CPLID )then - write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals on comp:', moab_tag_vals(1,1), & - moab_tag_vals(1,2), moab_tag_vals(1,3) - endif - deallocate(moab_tag_vals) - endif - if (mbaxid .ge. 0) then - tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR - ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') - endif - allocate(moab_tag_vals(nvise(1), 3)) - arrsize = nvise(1)*3 - ent_type = 1 - ierr = iMOAB_GetDoubleTagStorage(mbaxid, tagname, arrsize , ent_type, moab_tag_vals) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting 3 tags ') - endif - if (iamroot_CPLID )then - write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals:', moab_tag_vals(1,1), & - moab_tag_vals(1,2), moab_tag_vals(1,3) - endif - deallocate(moab_tag_vals) - endif -#endif + call mpi_barrier(mpicom_GLOID,ierr) if (atm_present) call component_init_areacor(atm, areafact_samegrid, seq_flds_a2x_fluxes) ! send initial data to coupler @@ -2291,32 +2207,7 @@ subroutine cime_init() call t_adj_detailf(-2) call t_stopf ('CPL:init_areacor') -#ifdef MOABDEBUG - - if (iamroot_CPLID )then - a2x_ax => component_get_c2x_cx(atm(1)) - write(logunit,*) ' a2x_ax (22,1..) after area corrections', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) - endif - if (mbaxid .ge. 0) then - tagname = "Faxa_bcphidry:Faxa_bcphodry:Faxa_bcphiwet"//C_NULL_CHAR - ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') - endif - allocate(moab_tag_vals(nvise(1), 3)) - arrsize = nvise(1)*3 - ent_type = 1 - ierr = iMOAB_GetDoubleTagStorage(mbaxid, tagname, arrsize , ent_type, moab_tag_vals) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in getting 3 tags ') - endif - if (iamroot_CPLID )then - write(logunit,*) ' Faxa_bcphidry Faxa_bcphodry Faxa_bcphiwet vals:', moab_tag_vals(1,1), & - moab_tag_vals(1,2), moab_tag_vals(1,3) - endif - deallocate(moab_tag_vals) - endif -#endif + !---------------------------------------------------------- !| global sum diagnostics for initial data sent to coupler. !---------------------------------------------------------- @@ -2436,12 +2327,7 @@ subroutine cime_init() call t_adj_detailf(-2) call t_stopf ('CPL:init_fracs') endif -#ifdef MOABDEBUG - a2x_ax => component_get_c2x_cx(atm(1)) - if (iamroot_CPLID )then - write(logunit,*) ' a2x_ax (22,1..) after fractions', a2x_ax%rattr(22,1), a2x_ax%rattr(22,2) - endif -#endif + !---------------------------------------------------------- !| Initialize prep_aoflux_mod module variables xao_*x and ! set to zero. diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index f77bcb6d3ce..8afaf8d0424 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -994,7 +994,7 @@ subroutine cplcomp_moab_Init(infodata,comp) ! use iMOAB, only: iMOAB_RegisterApplication, iMOAB_ReceiveMesh, iMOAB_SendMesh, & iMOAB_WriteMesh, iMOAB_DefineTagStorage, iMOAB_GetMeshInfo, & - iMOAB_SetDoubleTagStorage, iMOAB_FreeSenderBuffers, iMOAB_ComputeCommGraph, iMOAB_LoadMesh + iMOAB_FreeSenderBuffers, iMOAB_ComputeCommGraph, iMOAB_LoadMesh ! use seq_infodata_mod ! @@ -1028,9 +1028,9 @@ subroutine cplcomp_moab_Init(infodata,comp) ! and atm spectral on coupler character(CXX) :: tagname integer nvert(3), nvise(3), nbl(3), nsurf(3), nvisBC(3) - type(mct_list) :: temp_list - integer :: nfields, arrsize - real(R8), allocatable, target :: values(:) + ! type(mct_list) :: temp_list + ! integer :: nfields, arrsize + ! real(R8), allocatable, target :: values(:) !----------------------------------------------------- @@ -1193,32 +1193,6 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in getting mesh info on atm on coupler ' call shr_sys_abort(subname//' ERROR in getting mesh info on atm on coupler ') endif - ! find the length of fields, from the nb of fields of the AVs - call mct_list_init(temp_list ,seq_flds_x2a_fields) - nfields = mct_list_nitem (temp_list) - call mct_list_clean(temp_list) - arrsize=nfields * nvise(1) - tagname = trim(seq_flds_x2a_fields)//C_NULL_CHAR - allocate(values(arrsize)) - values = 0. - ierr = iMOAB_SetDoubleTagStorage(mbaxid, tagname, arrsize, 1, values ) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in zeroing out x2a_fields ' - call shr_sys_abort(subname//' ERROR in zeroing out x2a_fields ') - endif - deallocate(values) - call mct_list_init(temp_list ,seq_flds_a2x_fields) - nfields = mct_list_nitem (temp_list) - call mct_list_clean(temp_list) - arrsize=nfields * nvise(1) - tagname = trim(seq_flds_a2x_fields)//C_NULL_CHAR - allocate(values(arrsize)) - values = 0. - ierr = iMOAB_SetDoubleTagStorage(mbaxid, tagname, arrsize, 1, values ) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in zeroing out a2x_fields ' - call shr_sys_abort(subname//' ERROR in zeroing out a2x_fields ') - endif !add the normalization tag tagname = trim(seq_flds_dom_fields)//":norm8wt"//C_NULL_CHAR From e4110c05ed6aecc722d671c9498323b49e6f671e Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Sun, 31 Mar 2024 20:51:09 -0500 Subject: [PATCH 123/310] data rof model and refactor set_moab_tag_from_av set_moab_tag_from_av is defined now in seq_flds_mod it is used by data models run methods to set moab tags values (from AV attributes to moab tags) each field is set at a time, the vector data is allocated before the method and deallocated at the end of the loop data rof is involving now the same procedure as before data rof does not have a rof mesh defined on coupler side, me just transfer coupler data mbrxid is now only vertices; how is that affecting the rest of the tags ? need to pay attention to projection from other meshes to rof, and from rof to others --- .../data_comps/datm/src/datm_comp_mod.F90 | 79 ++------ .../data_comps/docn/src/docn_comp_mod.F90 | 83 ++------ .../data_comps/drof/src/drof_comp_mod.F90 | 185 +++++++++++++++++- .../data_comps/drof/src/rof_comp_mct.F90 | 16 +- driver-moab/main/cplcomp_exchange_mod.F90 | 64 ++++-- driver-moab/main/seq_frac_mct.F90 | 11 +- driver-moab/shr/seq_comm_mct.F90 | 1 + driver-moab/shr/seq_flds_mod.F90 | 30 +++ 8 files changed, 322 insertions(+), 147 deletions(-) diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index 76efa2c6d09..9af9f06732b 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -275,7 +275,6 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & real(R8), allocatable, target :: data(:) integer(IN), pointer :: idata(:) ! temporary real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary - integer :: mpigrp ! mpigrp !real(R8), allocatable, target :: vtags_zero(:, :) #ifdef MOABDEBUG character*100 outfile, wopts @@ -474,22 +473,6 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & if (ierr > 0 ) & call shr_sys_abort('Error: fail to create seq_flds_a2x_fields tags ') - ierr = iMOAB_DefineTagStorage( mphaid, trim(flds_strm)//C_NULL_CHAR, & - 1, & ! dense, double - 1, & ! number of components - tagindex ) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to create flds_strm tags ') -#ifdef MOABDEBUG - ! debug test - outfile = 'AtmDataMesh.h5m'//C_NULL_CHAR - wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! - ! write out the mesh file to disk - ierr = iMOAB_WriteMesh(mphaid, trim(outfile), trim(wopts)) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in writing data mesh atm ') - endif -#endif #endif !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors @@ -623,6 +606,24 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & yc(:) = ggrid%data%rAttr(klat,:) call t_stopf('datm_initmctavs') +#ifdef HAVE_MOAB + ierr = iMOAB_DefineTagStorage( mphaid, trim(flds_strm)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create flds_strm tags ') +#ifdef MOABDEBUG + ! debug test + outfile = 'AtmDataMesh.h5m'//C_NULL_CHAR + wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! + ! write out the mesh file to disk + ierr = iMOAB_WriteMesh(mphaid, trim(outfile), trim(wopts)) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in writing data mesh atm ') + endif +#endif +#endif !---------------------------------------------------------------------------- ! Read restart @@ -716,34 +717,6 @@ subroutine datm_comp_init(Eclock, x2a, a2x, & end subroutine datm_comp_init -#ifdef HAVE_MOAB - !=============================================================================== - - subroutine moab_set_tag(tagname, avx, index, dataarr, lsize) - - ! !DESCRIPTION: set field method for data atm model - use iMOAB, only: iMOAB_SetDoubleTagStorage - use seq_comm_mct, only : mphaid ! - implicit none - - integer :: ierr, lsize - character(len=*), intent(in) :: tagname - type(mct_aVect), intent(in) :: avx - integer, intent(in) :: index - real(R8), intent(inout) :: dataarr(:) - - !write(*,* ) "Setting data for tag: ", tagname, " with size = ", lsize - dataarr(:) = avx%rAttr(index, :) - ierr = iMOAB_SetDoubleTagStorage ( mphaid, tagname, lsize, & - 0, & ! data on vertices - dataarr ) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to set tag values for '//tagname) - - end subroutine moab_set_tag - -#endif - !=============================================================================== subroutine datm_comp_run(EClock, x2a, a2x, & SDATM, gsmap, ggrid, mpicom, compid, my_task, master_task, & @@ -754,6 +727,7 @@ subroutine datm_comp_run(EClock, x2a, a2x, & ! !DESCRIPTION: run method for datm model #ifdef MOABDEBUG use seq_comm_mct, only : mphaid ! + use seq_flds_mod, only: moab_set_tag_from_av use iMOAB, only: iMOAB_WriteMesh #endif #ifdef HAVE_MOAB @@ -865,9 +839,6 @@ subroutine datm_comp_run(EClock, x2a, a2x, & allocate(count_st(SDATM%nstreams)) end if -#ifdef MOABDEBUG - write(logunit,*) ' a2x_aa (22,1..) at beginning of datm_comp_run', a2x%rattr(22,1), a2x%rattr(22,2) -#endif do n = 1,SDATM%nstreams if (firstcall) then @@ -879,9 +850,7 @@ subroutine datm_comp_run(EClock, x2a, a2x, & ilist_av(n),olist_av(n),rearr) end if enddo -#ifdef MOABDEBUG - write(logunit,*) ' a2x_aa (22,1..) after datm_comp_run translate lists', a2x%rattr(22,1), a2x%rattr(22,2) -#endif + do n = 1,SDATM%nstreams if (firstcall) then call shr_dmodel_translate_list(SDATM%avs(n),avstrm,& @@ -893,9 +862,6 @@ subroutine datm_comp_run(EClock, x2a, a2x, & end if enddo call t_stopf('datm_scatter') -#ifdef MOABDEBUG - write(logunit,*) ' a2x_aa (22,1..) after datm_comp_run scatter ', a2x%rattr(22,1), a2x%rattr(22,2) -#endif !------------------------------------------------- ! Determine data model behavior based on the mode !------------------------------------------------- @@ -1309,9 +1275,6 @@ subroutine datm_comp_run(EClock, x2a, a2x, & !---------------------------------------------------------- ! bias correction / anomaly forcing ( end block ) !---------------------------------------------------------- -#ifdef MOABDEBUG - write(logunit,*) ' a2x_aa (22,1..) at the end of of datm_comp_run', a2x%rattr(22,1), a2x%rattr(22,2) -#endif !-------------------- ! Write restart !-------------------- @@ -1355,7 +1318,7 @@ subroutine datm_comp_run(EClock, x2a, a2x, & call mct_list_get(mctOStr,index_list,temp_list) mct_field = mct_string_toChar(mctOStr) tagname= trim(mct_field)//C_NULL_CHAR - call moab_set_tag(tagname, a2x, index_list, datam, lsize) ! loop over all a2x fields, not just a few + call moab_set_tag_from_av(tagname, a2x, index_list, mphaid, datam, lsize) ! loop over all a2x fields, not just a few enddo call mct_list_clean(temp_list) deallocate(datam) ! maybe we should keep it around, deallocate at the final only? diff --git a/components/data_comps/docn/src/docn_comp_mod.F90 b/components/data_comps/docn/src/docn_comp_mod.F90 index 5858da5b783..31e0d856a28 100644 --- a/components/data_comps/docn/src/docn_comp_mod.F90 +++ b/components/data_comps/docn/src/docn_comp_mod.F90 @@ -520,34 +520,6 @@ subroutine docn_comp_init(Eclock, x2o, o2x, & end subroutine docn_comp_init -#ifdef HAVE_MOAB - !=============================================================================== - - subroutine moab_init_tag(tagname, avx, index, dataarr) - - ! !DESCRIPTION: run method for docn model - use iMOAB, only: iMOAB_SetDoubleTagStorage - implicit none - - integer :: ierr, lsize - character(len=*), intent(in) :: tagname - type(mct_aVect), intent(in) :: avx - integer, intent(in) :: index - real(R8), intent(inout) :: dataarr(:) - - lsize = mct_avect_lsize(avx) - !write(*,* ) "Setting data for tag: ", tagname, " with size = ", lsize - dataarr(:) = avx%rAttr(index, :) - ierr = iMOAB_SetDoubleTagStorage ( mpoid, tagname, lsize, & - 0, & ! data on vertices - dataarr ) - if (ierr > 0 ) & - call errorout(ierr, 'Error: fail to set tag values for ' // tagname ) - - end subroutine moab_init_tag - -#endif - subroutine docn_comp_run(EClock, x2o, o2x, & SDOCN, gsmap, ggrid, mpicom, compid, my_task, master_task, & inst_suffix, logunit, read_restart, write_restart, & @@ -558,6 +530,7 @@ subroutine docn_comp_run(EClock, x2o, o2x, & use iMOAB, only: iMOAB_GetMeshInfo, & iMOAB_SetDoubleTagStorage, & iMOAB_WriteMesh + use seq_flds_mod, only: moab_set_tag_from_av #endif implicit none @@ -842,63 +815,45 @@ subroutine docn_comp_run(EClock, x2o, o2x, & ! set dense double tags on vertices of the temporary DOCN app ! first set o2x data - call moab_init_tag( 'So_t'//C_NULL_CHAR, o2x, & - kt, data) + call moab_set_tag_from_av('So_t'//C_NULL_CHAR, o2x, kt, data, lsize) - call moab_init_tag( 'So_s'//C_NULL_CHAR, o2x, & - ks, data) + call moab_set_tag_from_av('So_s'//C_NULL_CHAR, o2x, ks, data, lsize) - call moab_init_tag( 'So_u'//C_NULL_CHAR, o2x, & - ku, data) + call moab_set_tag_from_av( 'So_u'//C_NULL_CHAR, o2x, ku, data, lsize) - call moab_init_tag( 'So_v'//C_NULL_CHAR, o2x, & - kv, data) + call moab_set_tag_from_av( 'So_v'//C_NULL_CHAR, o2x, kv, data, lsize) - call moab_init_tag( 'So_dhdx'//C_NULL_CHAR, o2x, & - kdhdx, data) + call moab_set_tag_from_av( 'So_dhdx'//C_NULL_CHAR, o2x, kdhdx, data, lsize) - call moab_init_tag( 'So_dhdy'//C_NULL_CHAR, o2x, & - kdhdy, data) + call moab_set_tag_from_av( 'So_dhdy'//C_NULL_CHAR, o2x, kdhdy, data, lsize) - call moab_init_tag( 'Fioo_q'//C_NULL_CHAR, o2x, & - kq, data) + call moab_set_tag_from_av( 'Fioo_q'//C_NULL_CHAR, o2x, kq, data, lsize) if (kswp /= 0) then - call moab_init_tag( 'So_fswpen'//C_NULL_CHAR, o2x, & - kswp, data) + call moab_set_tag_from_av( 'So_fswpen'//C_NULL_CHAR, o2x, kswp, data, lsize) endif ! next set x2o data - call moab_init_tag( 'Foxx_swnet'//C_NULL_CHAR, x2o, & - kswnet, data) + call moab_set_tag_from_av( 'Foxx_swnet'//C_NULL_CHAR, x2o, kswnet, data, lsize) - call moab_init_tag( 'Foxx_lwup'//C_NULL_CHAR, x2o, & - klwup, data) + call moab_set_tag_from_av( 'Foxx_lwup'//C_NULL_CHAR, x2o, klwup, data, lsize) - call moab_init_tag( 'Foxx_sen'//C_NULL_CHAR, x2o, & - ksen, data) + call moab_set_tag_from_av( 'Foxx_sen'//C_NULL_CHAR, x2o, ksen, data, lsize) - call moab_init_tag( 'Foxx_lat'//C_NULL_CHAR, x2o, & - klat, data) + call moab_set_tag_from_av( 'Foxx_lat'//C_NULL_CHAR, x2o, klat, data, lsize) - call moab_init_tag( 'Foxx_rofi'//C_NULL_CHAR, x2o, & - krofi, data) + call moab_set_tag_from_av( 'Foxx_rofi'//C_NULL_CHAR, x2o, krofi, data, lsize) - call moab_init_tag( 'Faxa_lwdn'//C_NULL_CHAR, x2o, & - klwdn, data) + call moab_set_tag_from_av( 'Faxa_lwdn'//C_NULL_CHAR, x2o, klwdn, data, lsize) - call moab_init_tag( 'Faxa_snow'//C_NULL_CHAR, x2o, & - ksnow, data) + call moab_set_tag_from_av( 'Faxa_snow'//C_NULL_CHAR, x2o, ksnow, data, lsize) - call moab_init_tag( 'Fioi_melth'//C_NULL_CHAR, x2o, & - kmelth, data) + call moab_set_tag_from_av( 'Fioi_melth'//C_NULL_CHAR, x2o, kmelth, data, lsize) ! next set avstrm data - call moab_init_tag( 'strm_h'//C_NULL_CHAR, avstrm, & - kh, data) + call moab_set_tag_from_av( 'strm_h'//C_NULL_CHAR, avstrm, kh, data, lsize) - call moab_init_tag( 'strm_qbot'//C_NULL_CHAR, avstrm, & - kqbot, data) + call moab_set_tag_from_av( 'strm_qbot'//C_NULL_CHAR, avstrm, kqbot, data, lsize) #ifdef MOABDEBUG diff --git a/components/data_comps/drof/src/drof_comp_mod.F90 b/components/data_comps/drof/src/drof_comp_mod.F90 index cb060e02ff8..6aac7fba80d 100644 --- a/components/data_comps/drof/src/drof_comp_mod.F90 +++ b/components/data_comps/drof/src/drof_comp_mod.F90 @@ -25,7 +25,11 @@ module drof_comp_mod use drof_shr_mod , only: rest_file ! namelist input use drof_shr_mod , only: rest_file_strm ! namelist input use drof_shr_mod , only: nullstr - +#ifdef HAVE_MOAB + use seq_comm_mct, only : mrofid ! id of moab rof app + use seq_comm_mct, only : mbrof_data ! turn on if the data rof + use iso_c_binding +#endif ! ! !PUBLIC TYPES: implicit none @@ -67,6 +71,12 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & inst_suffix, inst_name, logunit, read_restart) +#ifdef HAVE_MOAB + use iMOAB, only: iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & + iMOAB_SetIntTagStorage, iMOAB_SetDoubleTagStorage, & + iMOAB_ResolveSharedEntities, iMOAB_CreateVertices, & + iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo, iMOAB_WriteMesh +#endif ! !DESCRIPTION: initialize drof model implicit none @@ -92,7 +102,18 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & logical :: exists ! file existance logical integer(IN) :: nu ! unit number character(CL) :: calendar ! model calendar - +#ifdef HAVE_MOAB + character*400 tagname + real(R8) latv, lonv + integer iv, tagindex, ilat, ilon, ierr !, arrsize, nfields + real(R8), allocatable, target :: data(:) + integer(IN), pointer :: idata(:) ! temporary + real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary + !real(R8), allocatable, target :: vtags_zero(:, :) +#ifdef MOABDEBUG + character*100 outfile, wopts +#endif +#endif !--- formats --- character(*), parameter :: F00 = "('(drof_comp_init) ',8a)" character(*), parameter :: F0L = "('(drof_comp_init) ',a, l2)" @@ -164,6 +185,122 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & call t_stopf('drof_initmctdom') +! copy from data atm ; just need mrofid + +#ifdef HAVE_MOAB + ilat = mct_aVect_indexRA(ggrid%data,'lat') + ilon = mct_aVect_indexRA(ggrid%data,'lon') + allocate(moab_vert_coords(lsize*3)) + do iv = 1, lsize + lonv = ggrid%data%rAttr(ilon, iv) * SHR_CONST_PI/180. + latv = ggrid%data%rAttr(ilat, iv) * SHR_CONST_PI/180. + moab_vert_coords(3*iv-2)=COS(latv)*COS(lonv) + moab_vert_coords(3*iv-1)=COS(latv)*SIN(lonv) + moab_vert_coords(3*iv )=SIN(latv) + enddo + + ! create the vertices with coordinates from MCT domain + ierr = iMOAB_CreateVertices(mrofid, lsize*3, 3, moab_vert_coords) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to create MOAB vertices in land model') + + tagname='GLOBAL_ID'//C_NULL_CHAR + ierr = iMOAB_DefineTagStorage(mrofid, tagname, & + 0, & ! dense, integer + 1, & ! number of components + tagindex ) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to retrieve GLOBAL_ID tag ') + + ! get list of global IDs for Dofs + call mct_gsMap_orderedPoints(gsMap, my_task, idata) + + ierr = iMOAB_SetIntTagStorage ( mrofid, tagname, lsize, & + 0, & ! vertex type + idata) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to set GLOBAL_ID tag ') + + ierr = iMOAB_ResolveSharedEntities( mrofid, lsize, idata ); + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to resolve shared entities') + + deallocate(moab_vert_coords) + deallocate(idata) + + ierr = iMOAB_UpdateMeshInfo( mrofid ) + if (ierr .ne. 0) & + call shr_sys_abort('Error: fail to update mesh info ') + + allocate(data(lsize)) + ierr = iMOAB_DefineTagStorage( mrofid, "area:aream:frac:mask"//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create tag: area:aream:frac:mask' ) + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'area'),:) + tagname='area'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to get area tag ') + + ! set the same data for aream (model area) as area + ! data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'aream'),:) + tagname='aream'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set aream tag ') + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'mask'),:) + tagname='mask'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set mask tag ') + + data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'frac'),:) + tagname='frac'//C_NULL_CHAR + ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & + 0, & ! set data on vertices + data) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set frac tag ') + + deallocate(data) + + ! define tags + ierr = iMOAB_DefineTagStorage( mrofid, trim(seq_flds_x2r_fields)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create seq_flds_x2r_fields tags ') + + ierr = iMOAB_DefineTagStorage( mrofid, trim(seq_flds_r2x_fields)//C_NULL_CHAR, & + 1, & ! dense, double + 1, & ! number of components + tagindex ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to create seq_flds_r2x_fields tags ') + mbrof_data = .true. ! will have effects +#ifdef MOABDEBUG + ! debug test + outfile = 'RofDataMesh.h5m'//C_NULL_CHAR + wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! + ! write out the mesh file to disk + ierr = iMOAB_WriteMesh(mrofid, trim(outfile), trim(wopts)) + if (ierr .ne. 0) then + call shr_sys_abort(subname//' ERROR in writing data mesh rof ') + endif +#endif +#endif !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors !---------------------------------------------------------------------------- @@ -256,6 +393,13 @@ subroutine drof_comp_run(EClock, x2r, r2x, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & inst_suffix, logunit, case_name) +#ifdef MOABDEBUG + use iMOAB, only: iMOAB_WriteMesh +#endif +#ifdef HAVE_MOAB + use seq_flds_mod , only: seq_flds_r2x_fields + use seq_flds_mod , only: moab_set_tag_from_av +#endif ! !DESCRIPTION: run method for drof model implicit none @@ -285,7 +429,18 @@ subroutine drof_comp_run(EClock, x2r, r2x, & integer(IN) :: nu ! unit number integer(IN) :: nflds_r2x character(len=18) :: date_str +#ifdef HAVE_MOAB + real(R8), allocatable, target :: datam(:) + type(mct_list) :: temp_list + integer :: size_list, index_list + type(mct_string) :: mctOStr ! + character*400 tagname, mct_field +#ifdef MOABDEBUG + integer :: cur_drof_stepno, ierr + character*100 outfile, wopts, lnum +#endif +#endif character(*), parameter :: F00 = "('(drof_comp_run) ',8a)" character(*), parameter :: F04 = "('(drof_comp_run) ',2a,2i8,'s')" character(*), parameter :: subName = "(drof_comp_run) " @@ -384,6 +539,32 @@ subroutine drof_comp_run(EClock, x2r, r2x, & !---------------------------------------------------------------------------- ! Log output for model date !---------------------------------------------------------------------------- +#ifdef HAVE_MOAB + lsize = mct_avect_lsize(r2x) ! is it the same as mct_avect_lsize(avstrm) ? + allocate(datam(lsize)) ! + call mct_list_init(temp_list ,seq_flds_r2x_fields) + size_list=mct_list_nitem (temp_list) + do index_list = 1, size_list + call mct_list_get(mctOStr,index_list,temp_list) + mct_field = mct_string_toChar(mctOStr) + tagname= trim(mct_field)//C_NULL_CHAR + call moab_set_tag_from_av(tagname, r2x, index_list, mrofid, datam, lsize) ! loop over all a2x fields, not just a few + enddo + call mct_list_clean(temp_list) + deallocate(datam) ! maybe we should keep it around, deallocate at the final only? + +#ifdef MOABDEBUG + call seq_timemgr_EClockGetData( EClock, stepno=cur_drof_stepno ) + write(lnum,"(I0.2)")cur_drof_stepno + outfile = 'drof_comp_run_'//trim(lnum)//'.h5m'//C_NULL_CHAR + wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR + ierr = iMOAB_WriteMesh(mrofid, outfile, wopts) + if (ierr > 0 ) then + write(logunit,*) 'Failed to write data rof component state ' + endif +#endif + +#endif call t_startf('drof_run2') if (my_task == master_task) then diff --git a/components/data_comps/drof/src/rof_comp_mct.F90 b/components/data_comps/drof/src/rof_comp_mct.F90 index bafdc6d3f98..77850d86f61 100644 --- a/components/data_comps/drof/src/rof_comp_mct.F90 +++ b/components/data_comps/drof/src/rof_comp_mct.F90 @@ -16,7 +16,11 @@ module rof_comp_mct use drof_comp_mod , only: drof_comp_init, drof_comp_run, drof_comp_final use drof_shr_mod , only: drof_shr_read_namelists use seq_flds_mod , only: seq_flds_x2r_fields, seq_flds_r2x_fields - +#ifdef HAVE_MOAB + use seq_comm_mct, only : mrofid ! iMOAB app id for rof + use iso_c_binding + use iMOAB , only: iMOAB_RegisterApplication +#endif ! !PUBLIC TYPES: implicit none private ! except @@ -140,6 +144,16 @@ subroutine rof_init_mct( EClock, cdata, x2r, r2x, NLFilename ) ! Initialize drof !---------------------------------------------------------------------------- +#ifdef HAVE_MOAB + ierr = iMOAB_RegisterApplication(trim("DROF")//C_NULL_CHAR, mpicom, compid, mrofid) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in registering data rof comp' + call shr_sys_abort(subname//' ERROR in registering data rof comp') + endif + ! send path of atm domain file to MOAB coupler. Note that here we may have the land domain in some cases? + !call seq_infodata_PutData( infodata, atm_mesh=SDATM%domainFile) +#endif + call drof_comp_init(Eclock, x2r, r2x, & seq_flds_x2r_fields, seq_flds_r2x_fields, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 8afaf8d0424..5031c8be072 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -28,6 +28,7 @@ module cplcomp_exchange_mod use seq_comm_mct, only : mphaid ! iMOAB app id for phys atm; comp atm is 5, phys 5+200 use seq_comm_mct, only : MPSIID, mbixid ! sea-ice on comp pes and on coupler pes use seq_comm_mct, only : mrofid, mbrxid ! iMOAB id of moab rof app on comp pes and on coupler too + use seq_comm_mct, only : mbrof_data ! if data rof use shr_mpi_mod, only: shr_mpi_max ! use dimensions_mod, only : np ! for atmosphere use iso_c_binding @@ -1213,7 +1214,7 @@ subroutine cplcomp_moab_Init(infodata,comp) outfile = 'recMeshAtm.h5m'//C_NULL_CHAR endif wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR - ! write out the mesh file to disk + ! write out the mesh file to diskocn_domain ierr = iMOAB_WriteMesh(mbaxid, trim(outfile), trim(wopts)) if (ierr .ne. 0) then write(logunit,*) subname,' error in writing mesh ' @@ -1622,21 +1623,43 @@ subroutine cplcomp_moab_Init(infodata,comp) call seq_comm_getinfo(cplid ,mpigrp=mpigrp_cplid) ! receiver group call seq_comm_getinfo(id_old,mpigrp=mpigrp_old) ! component group pes + call seq_infodata_GetData(infodata,rof_mesh=rtm_mesh) + + if (MPI_COMM_NULL /= mpicom_old ) then ! it means we are on the component pes (rof) + comp%mbApCCid = mrofid ! rof comp app in moab + if ( trim(rtm_mesh) == 'none' ) then ! mbrof_data is .true. also + ! send mesh to coupler + ierr = iMOAB_SendMesh(mrofid, mpicom_join, mpigrp_cplid, id_join, partMethod) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in sending rof mesh to coupler ' + call shr_sys_abort(subname//' ERROR in sending rof mesh to coupler ') + endif + endif + endif if (MPI_COMM_NULL /= mpicom_new ) then ! we are on the coupler pes appname = "COUPLE_MROF"//C_NULL_CHAR ierr = iMOAB_RegisterApplication(trim(appname), mpicom_new, id_join, mbrxid) + if ( trim(rtm_mesh) == 'none' ) then + mbrof_data = .true. ! turn it on the coupler pes too; + ierr = iMOAB_ReceiveMesh(mbrxid, mpicom_join, mpigrp_old, id_old) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in receiving mesh on rof coupler ' + call shr_sys_abort(subname//' ERROR in receiving mesh on rof coupler ') + endif + else ! load mesh from scrip file passed from river model - call seq_infodata_GetData(infodata,rof_mesh=rtm_mesh) - outfile = trim(rtm_mesh)//C_NULL_CHAR - ropts = 'PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN'//C_NULL_CHAR - - nghlay = 0 ! no ghost layers - ierr = iMOAB_LoadMesh(mbrxid, outfile, ropts, nghlay) - if ( ierr .ne. 0 ) then - call shr_sys_abort( subname//' ERROR: cannot read rof mesh on coupler' ) - end if - ! need to add global id tag to the app, it will be used in restart + outfile = trim(rtm_mesh)//C_NULL_CHAR + ropts = 'PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN'//C_NULL_CHAR + + nghlay = 0 ! no ghost layers + ierr = iMOAB_LoadMesh(mbrxid, outfile, ropts, nghlay) + if ( ierr .ne. 0 ) then + call shr_sys_abort( subname//' ERROR: cannot read rof mesh on coupler' ) + end if + + endif + ! need to add global id tag to the app, it will be used in restart tagtype = 0 ! dense, integer numco = 1 tagname='GLOBAL_ID'//C_NULL_CHAR @@ -1645,7 +1668,6 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in adding global id tag to rof' call shr_sys_abort(subname//' ERROR in adding global id tag to rof ') endif - #ifdef MOABDEBUG ! debug test outfile = 'recRof.h5m'//C_NULL_CHAR @@ -1685,14 +1707,16 @@ subroutine cplcomp_moab_Init(infodata,comp) comp%mbGridType = 0 ! 0 or 1, pc or cells comp%mblsize = nvert(1) ! vertices endif - ! we are now on joint pes, compute comm graph between rof and coupler model - typeA = 2 ! point cloud on component PEs - typeB = 3 ! full mesh on coupler pes, we just read it - ierr = iMOAB_ComputeCommGraph( mrofid, mbrxid, mpicom_join, mpigrp_old, mpigrp_cplid, & - typeA, typeB, id_old, id_join) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in computing comm graph for rof model ' - call shr_sys_abort(subname//' ERROR in computing comm graph for rof model ') + if ( trim(rtm_mesh) /= 'none' ) then ! we are in full mesh case + ! we are now on joint pes, compute comm graph between rof and coupler model + typeA = 2 ! point cloud on component PEs + typeB = 3 ! full mesh on coupler pes, we just read it + ierr = iMOAB_ComputeCommGraph( mrofid, mbrxid, mpicom_join, mpigrp_old, mpigrp_cplid, & + typeA, typeB, id_old, id_join) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in computing comm graph for rof model ' + call shr_sys_abort(subname//' ERROR in computing comm graph for rof model ') + endif endif ! if (mrofid .ge. 0) then ! we are on component rof pes diff --git a/driver-moab/main/seq_frac_mct.F90 b/driver-moab/main/seq_frac_mct.F90 index a89fc0b9aa4..b2e1b41960a 100644 --- a/driver-moab/main/seq_frac_mct.F90 +++ b/driver-moab/main/seq_frac_mct.F90 @@ -177,6 +177,7 @@ module seq_frac_mct ! for tri grid, sameg_al would be false use seq_comm_mct, only : mbrxid ! iMOAB id of moab rof migrated to coupler pes + use seq_comm_mct, only : mbrof_data ! different logic for data rof model use iMOAB, only : iMOAB_DefineTagStorage, iMOAB_SetDoubleTagStorage, & iMOAB_GetMeshInfo, iMOAB_SetDoubleTagStorageWithGid, iMOAB_WriteMesh, & @@ -516,9 +517,15 @@ subroutine seq_frac_init( infodata, & call shr_sys_abort(subname//' ERROR in defining tags on rof phys mesh on cpl') endif ierr = iMOAB_GetMeshInfo ( mbrxid, nvert, nvise, nbl, nsurf, nvisBC ); - arrSize = 3 * nvise(1) ! there are 3 tags + if (mbrof_data) then ! then the coupler has point cloud too + arrSize = 3 * nvert(1) + ent_type = 0 ! vertex type on rof + else + arrSize = 3 * nvise(1) ! there are 3 tags + ent_type = 1 ! cell type, rof is now FV on coupler side + endif allocate(tagValues(arrSize) ) - ent_type = 1 ! vertex type, rof is now FV + tagValues = 0. ierr = iMOAB_SetDoubleTagStorage ( mbrxid, tagname, arrSize , ent_type, tagValues) deallocate(tagValues) diff --git a/driver-moab/shr/seq_comm_mct.F90 b/driver-moab/shr/seq_comm_mct.F90 index 10a23b9c509..44d29e91ad2 100644 --- a/driver-moab/shr/seq_comm_mct.F90 +++ b/driver-moab/shr/seq_comm_mct.F90 @@ -241,6 +241,7 @@ module seq_comm_mct integer, public :: mbrmapro ! iMOAB id for read map between river and ocean; it exists on coupler PEs ! similar to intx id, oa, la; integer, public :: mbrxoid ! iMOAB id for rof migrated to coupler for ocean context (r2o mapping) + logical, public :: mbrof_data = .false. ! made true if no rtm mesh, which means data rof ? integer, public :: mbintxar ! iMOAB id for intx mesh between atm and river integer, public :: mbintxlr ! iMOAB id for intx mesh between land and river integer, public :: mbintxrl ! iMOAB id for intx mesh between river and land diff --git a/driver-moab/shr/seq_flds_mod.F90 b/driver-moab/shr/seq_flds_mod.F90 index e03771a7a9c..9d06837af80 100644 --- a/driver-moab/shr/seq_flds_mod.F90 +++ b/driver-moab/shr/seq_flds_mod.F90 @@ -293,6 +293,8 @@ module seq_flds_mod ! namelist variables logical :: nan_check_component_fields + public moab_set_tag_from_av ! will be caled usually from data models, to set moab tags from data fields in AVs + !---------------------------------------------------------------------------- contains !---------------------------------------------------------------------------- @@ -4369,4 +4371,32 @@ subroutine seq_flds_esmf_metadata_get(shortname, longname, stdname, units) end subroutine seq_flds_esmf_metadata_get +#ifdef HAVE_MOAB + !=============================================================================== + + subroutine moab_set_tag_from_av(tagname, avx, index, mbapid, dataarr, lsize) + + ! !DESCRIPTION: set field method for data atm model + use iMOAB, only: iMOAB_SetDoubleTagStorage + use shr_kind_mod , only: r8 => SHR_KIND_R8 + implicit none + + integer :: ierr, lsize + character(len=*), intent(in) :: tagname + type(mct_aVect), intent(in) :: avx + integer, intent(in) :: index + integer, intent(in) :: mbapid ! moab app id + real(R8), intent(inout) :: dataarr(:) + + !write(*,* ) "Setting data for tag: ", tagname, " with size = ", lsize + dataarr(:) = avx%rAttr(index, :) + ierr = iMOAB_SetDoubleTagStorage ( mbapid, tagname, lsize, & + 0, & ! data on vertices + dataarr ) + if (ierr > 0 ) & + call shr_sys_abort('Error: fail to set tag values for '//tagname) + + end subroutine moab_set_tag_from_av + +#endif end module seq_flds_mod From f3c042ced15e4996a0fb0562de652924af721842 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Sun, 31 Mar 2024 23:03:56 -0500 Subject: [PATCH 124/310] project i2a only if ice_c2_atm is true we do initialize mapper_Fi2a, for domain checking ? even if ice_c2_atm is false in that case, do not augment with moab data, because we do not want those projections --- driver-moab/main/prep_atm_mod.F90 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/driver-moab/main/prep_atm_mod.F90 b/driver-moab/main/prep_atm_mod.F90 index e5009867745..c8c2de76362 100644 --- a/driver-moab/main/prep_atm_mod.F90 +++ b/driver-moab/main/prep_atm_mod.F90 @@ -646,7 +646,8 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at 'mapper_Fi2a initialization',esmf_map_flag, no_match) #ifdef HAVE_MOAB - ! now take care of the mapper for MOAB + ! now take care of the mapper for MOAB, only if ice is coupled to atm ! + if (ice_c2_atm) then if ( mapper_Fi2a%src_mbid .gt. -1 ) then if (iamroot_CPLID) then write(logunit,F00) 'overwriting '//trim(mapper_Fi2a%mbname) & @@ -662,6 +663,7 @@ subroutine prep_atm_init(infodata, ocn_c2_atm, ice_c2_atm, lnd_c2_atm, iac_c2_at wgtIdef = 'scalar'//C_NULL_CHAR mapper_Fi2a%weight_identifier = wgtIdef mapper_Fi2a%mbname = 'mapper_Fi2a' + endif #endif endif ! if (ice_present) then call shr_sys_flush(logunit) From 6ddfa092823baafadc62686314374baefe027125 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Mon, 1 Apr 2024 12:57:52 -0500 Subject: [PATCH 125/310] fix error in data ocean introduced at refactoring --- .../data_comps/docn/src/docn_comp_mod.F90 | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/components/data_comps/docn/src/docn_comp_mod.F90 b/components/data_comps/docn/src/docn_comp_mod.F90 index 31e0d856a28..31ba533eebd 100644 --- a/components/data_comps/docn/src/docn_comp_mod.F90 +++ b/components/data_comps/docn/src/docn_comp_mod.F90 @@ -815,45 +815,45 @@ subroutine docn_comp_run(EClock, x2o, o2x, & ! set dense double tags on vertices of the temporary DOCN app ! first set o2x data - call moab_set_tag_from_av('So_t'//C_NULL_CHAR, o2x, kt, data, lsize) + call moab_set_tag_from_av('So_t'//C_NULL_CHAR, o2x, kt, mpoid, data, lsize) - call moab_set_tag_from_av('So_s'//C_NULL_CHAR, o2x, ks, data, lsize) + call moab_set_tag_from_av('So_s'//C_NULL_CHAR, o2x, ks, mpoid, data, lsize) - call moab_set_tag_from_av( 'So_u'//C_NULL_CHAR, o2x, ku, data, lsize) + call moab_set_tag_from_av( 'So_u'//C_NULL_CHAR, o2x, ku, mpoid, data, lsize) - call moab_set_tag_from_av( 'So_v'//C_NULL_CHAR, o2x, kv, data, lsize) + call moab_set_tag_from_av( 'So_v'//C_NULL_CHAR, o2x, kv, mpoid, data, lsize) - call moab_set_tag_from_av( 'So_dhdx'//C_NULL_CHAR, o2x, kdhdx, data, lsize) + call moab_set_tag_from_av( 'So_dhdx'//C_NULL_CHAR, o2x, kdhdx, mpoid, data, lsize) - call moab_set_tag_from_av( 'So_dhdy'//C_NULL_CHAR, o2x, kdhdy, data, lsize) + call moab_set_tag_from_av( 'So_dhdy'//C_NULL_CHAR, o2x, kdhdy, mpoid, data, lsize) - call moab_set_tag_from_av( 'Fioo_q'//C_NULL_CHAR, o2x, kq, data, lsize) + call moab_set_tag_from_av( 'Fioo_q'//C_NULL_CHAR, o2x, kq, mpoid, data, lsize) if (kswp /= 0) then - call moab_set_tag_from_av( 'So_fswpen'//C_NULL_CHAR, o2x, kswp, data, lsize) + call moab_set_tag_from_av( 'So_fswpen'//C_NULL_CHAR, o2x, kswp, mpoid, data, lsize) endif ! next set x2o data - call moab_set_tag_from_av( 'Foxx_swnet'//C_NULL_CHAR, x2o, kswnet, data, lsize) + call moab_set_tag_from_av( 'Foxx_swnet'//C_NULL_CHAR, x2o, kswnet, mpoid, data, lsize) - call moab_set_tag_from_av( 'Foxx_lwup'//C_NULL_CHAR, x2o, klwup, data, lsize) + call moab_set_tag_from_av( 'Foxx_lwup'//C_NULL_CHAR, x2o, klwup, mpoid, data, lsize) - call moab_set_tag_from_av( 'Foxx_sen'//C_NULL_CHAR, x2o, ksen, data, lsize) + call moab_set_tag_from_av( 'Foxx_sen'//C_NULL_CHAR, x2o, ksen, mpoid, data, lsize) - call moab_set_tag_from_av( 'Foxx_lat'//C_NULL_CHAR, x2o, klat, data, lsize) + call moab_set_tag_from_av( 'Foxx_lat'//C_NULL_CHAR, x2o, klat, mpoid, data, lsize) - call moab_set_tag_from_av( 'Foxx_rofi'//C_NULL_CHAR, x2o, krofi, data, lsize) + call moab_set_tag_from_av( 'Foxx_rofi'//C_NULL_CHAR, x2o, krofi, mpoid, data, lsize) - call moab_set_tag_from_av( 'Faxa_lwdn'//C_NULL_CHAR, x2o, klwdn, data, lsize) + call moab_set_tag_from_av( 'Faxa_lwdn'//C_NULL_CHAR, x2o, klwdn, mpoid, data, lsize) - call moab_set_tag_from_av( 'Faxa_snow'//C_NULL_CHAR, x2o, ksnow, data, lsize) + call moab_set_tag_from_av( 'Faxa_snow'//C_NULL_CHAR, x2o, ksnow, mpoid, data, lsize) - call moab_set_tag_from_av( 'Fioi_melth'//C_NULL_CHAR, x2o, kmelth, data, lsize) + call moab_set_tag_from_av( 'Fioi_melth'//C_NULL_CHAR, x2o, kmelth, mpoid, data, lsize) ! next set avstrm data - call moab_set_tag_from_av( 'strm_h'//C_NULL_CHAR, avstrm, kh, data, lsize) + call moab_set_tag_from_av( 'strm_h'//C_NULL_CHAR, avstrm, kh, mpoid, data, lsize) - call moab_set_tag_from_av( 'strm_qbot'//C_NULL_CHAR, avstrm, kqbot, data, lsize) + call moab_set_tag_from_av( 'strm_qbot'//C_NULL_CHAR, avstrm, kqbot, mpoid, data, lsize) #ifdef MOABDEBUG From 32e0cebd9ea5afb79b242a6c8764bd0435677611 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Mon, 1 Apr 2024 14:00:42 -0500 Subject: [PATCH 126/310] revert data rof changes on data atm branch --- .../data_comps/drof/src/drof_comp_mod.F90 | 185 +----------------- .../data_comps/drof/src/rof_comp_mct.F90 | 16 +- driver-moab/main/cplcomp_exchange_mod.F90 | 64 ++---- driver-moab/main/seq_frac_mct.F90 | 11 +- driver-moab/shr/seq_comm_mct.F90 | 1 - 5 files changed, 25 insertions(+), 252 deletions(-) diff --git a/components/data_comps/drof/src/drof_comp_mod.F90 b/components/data_comps/drof/src/drof_comp_mod.F90 index 6aac7fba80d..cb060e02ff8 100644 --- a/components/data_comps/drof/src/drof_comp_mod.F90 +++ b/components/data_comps/drof/src/drof_comp_mod.F90 @@ -25,11 +25,7 @@ module drof_comp_mod use drof_shr_mod , only: rest_file ! namelist input use drof_shr_mod , only: rest_file_strm ! namelist input use drof_shr_mod , only: nullstr -#ifdef HAVE_MOAB - use seq_comm_mct, only : mrofid ! id of moab rof app - use seq_comm_mct, only : mbrof_data ! turn on if the data rof - use iso_c_binding -#endif + ! ! !PUBLIC TYPES: implicit none @@ -71,12 +67,6 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & inst_suffix, inst_name, logunit, read_restart) -#ifdef HAVE_MOAB - use iMOAB, only: iMOAB_DefineTagStorage, iMOAB_GetDoubleTagStorage, & - iMOAB_SetIntTagStorage, iMOAB_SetDoubleTagStorage, & - iMOAB_ResolveSharedEntities, iMOAB_CreateVertices, & - iMOAB_GetMeshInfo, iMOAB_UpdateMeshInfo, iMOAB_WriteMesh -#endif ! !DESCRIPTION: initialize drof model implicit none @@ -102,18 +92,7 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & logical :: exists ! file existance logical integer(IN) :: nu ! unit number character(CL) :: calendar ! model calendar -#ifdef HAVE_MOAB - character*400 tagname - real(R8) latv, lonv - integer iv, tagindex, ilat, ilon, ierr !, arrsize, nfields - real(R8), allocatable, target :: data(:) - integer(IN), pointer :: idata(:) ! temporary - real(r8), dimension(:), allocatable :: moab_vert_coords ! temporary - !real(R8), allocatable, target :: vtags_zero(:, :) -#ifdef MOABDEBUG - character*100 outfile, wopts -#endif -#endif + !--- formats --- character(*), parameter :: F00 = "('(drof_comp_init) ',8a)" character(*), parameter :: F0L = "('(drof_comp_init) ',a, l2)" @@ -185,122 +164,6 @@ subroutine drof_comp_init(Eclock, x2r, r2x, & call t_stopf('drof_initmctdom') -! copy from data atm ; just need mrofid - -#ifdef HAVE_MOAB - ilat = mct_aVect_indexRA(ggrid%data,'lat') - ilon = mct_aVect_indexRA(ggrid%data,'lon') - allocate(moab_vert_coords(lsize*3)) - do iv = 1, lsize - lonv = ggrid%data%rAttr(ilon, iv) * SHR_CONST_PI/180. - latv = ggrid%data%rAttr(ilat, iv) * SHR_CONST_PI/180. - moab_vert_coords(3*iv-2)=COS(latv)*COS(lonv) - moab_vert_coords(3*iv-1)=COS(latv)*SIN(lonv) - moab_vert_coords(3*iv )=SIN(latv) - enddo - - ! create the vertices with coordinates from MCT domain - ierr = iMOAB_CreateVertices(mrofid, lsize*3, 3, moab_vert_coords) - if (ierr .ne. 0) & - call shr_sys_abort('Error: fail to create MOAB vertices in land model') - - tagname='GLOBAL_ID'//C_NULL_CHAR - ierr = iMOAB_DefineTagStorage(mrofid, tagname, & - 0, & ! dense, integer - 1, & ! number of components - tagindex ) - if (ierr .ne. 0) & - call shr_sys_abort('Error: fail to retrieve GLOBAL_ID tag ') - - ! get list of global IDs for Dofs - call mct_gsMap_orderedPoints(gsMap, my_task, idata) - - ierr = iMOAB_SetIntTagStorage ( mrofid, tagname, lsize, & - 0, & ! vertex type - idata) - if (ierr .ne. 0) & - call shr_sys_abort('Error: fail to set GLOBAL_ID tag ') - - ierr = iMOAB_ResolveSharedEntities( mrofid, lsize, idata ); - if (ierr .ne. 0) & - call shr_sys_abort('Error: fail to resolve shared entities') - - deallocate(moab_vert_coords) - deallocate(idata) - - ierr = iMOAB_UpdateMeshInfo( mrofid ) - if (ierr .ne. 0) & - call shr_sys_abort('Error: fail to update mesh info ') - - allocate(data(lsize)) - ierr = iMOAB_DefineTagStorage( mrofid, "area:aream:frac:mask"//C_NULL_CHAR, & - 1, & ! dense, double - 1, & ! number of components - tagindex ) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to create tag: area:aream:frac:mask' ) - - data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'area'),:) - tagname='area'//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & - 0, & ! set data on vertices - data) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to get area tag ') - - ! set the same data for aream (model area) as area - ! data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'aream'),:) - tagname='aream'//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & - 0, & ! set data on vertices - data) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to set aream tag ') - - data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'mask'),:) - tagname='mask'//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & - 0, & ! set data on vertices - data) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to set mask tag ') - - data(:) = ggrid%data%rAttr(mct_aVect_indexRA(ggrid%data,'frac'),:) - tagname='frac'//C_NULL_CHAR - ierr = iMOAB_SetDoubleTagStorage ( mrofid, tagname, lsize, & - 0, & ! set data on vertices - data) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to set frac tag ') - - deallocate(data) - - ! define tags - ierr = iMOAB_DefineTagStorage( mrofid, trim(seq_flds_x2r_fields)//C_NULL_CHAR, & - 1, & ! dense, double - 1, & ! number of components - tagindex ) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to create seq_flds_x2r_fields tags ') - - ierr = iMOAB_DefineTagStorage( mrofid, trim(seq_flds_r2x_fields)//C_NULL_CHAR, & - 1, & ! dense, double - 1, & ! number of components - tagindex ) - if (ierr > 0 ) & - call shr_sys_abort('Error: fail to create seq_flds_r2x_fields tags ') - mbrof_data = .true. ! will have effects -#ifdef MOABDEBUG - ! debug test - outfile = 'RofDataMesh.h5m'//C_NULL_CHAR - wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR ! - ! write out the mesh file to disk - ierr = iMOAB_WriteMesh(mrofid, trim(outfile), trim(wopts)) - if (ierr .ne. 0) then - call shr_sys_abort(subname//' ERROR in writing data mesh rof ') - endif -#endif -#endif !---------------------------------------------------------------------------- ! Initialize MCT attribute vectors !---------------------------------------------------------------------------- @@ -393,13 +256,6 @@ subroutine drof_comp_run(EClock, x2r, r2x, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & inst_suffix, logunit, case_name) -#ifdef MOABDEBUG - use iMOAB, only: iMOAB_WriteMesh -#endif -#ifdef HAVE_MOAB - use seq_flds_mod , only: seq_flds_r2x_fields - use seq_flds_mod , only: moab_set_tag_from_av -#endif ! !DESCRIPTION: run method for drof model implicit none @@ -429,18 +285,7 @@ subroutine drof_comp_run(EClock, x2r, r2x, & integer(IN) :: nu ! unit number integer(IN) :: nflds_r2x character(len=18) :: date_str -#ifdef HAVE_MOAB - real(R8), allocatable, target :: datam(:) - type(mct_list) :: temp_list - integer :: size_list, index_list - type(mct_string) :: mctOStr ! - character*400 tagname, mct_field -#ifdef MOABDEBUG - integer :: cur_drof_stepno, ierr - character*100 outfile, wopts, lnum -#endif -#endif character(*), parameter :: F00 = "('(drof_comp_run) ',8a)" character(*), parameter :: F04 = "('(drof_comp_run) ',2a,2i8,'s')" character(*), parameter :: subName = "(drof_comp_run) " @@ -539,32 +384,6 @@ subroutine drof_comp_run(EClock, x2r, r2x, & !---------------------------------------------------------------------------- ! Log output for model date !---------------------------------------------------------------------------- -#ifdef HAVE_MOAB - lsize = mct_avect_lsize(r2x) ! is it the same as mct_avect_lsize(avstrm) ? - allocate(datam(lsize)) ! - call mct_list_init(temp_list ,seq_flds_r2x_fields) - size_list=mct_list_nitem (temp_list) - do index_list = 1, size_list - call mct_list_get(mctOStr,index_list,temp_list) - mct_field = mct_string_toChar(mctOStr) - tagname= trim(mct_field)//C_NULL_CHAR - call moab_set_tag_from_av(tagname, r2x, index_list, mrofid, datam, lsize) ! loop over all a2x fields, not just a few - enddo - call mct_list_clean(temp_list) - deallocate(datam) ! maybe we should keep it around, deallocate at the final only? - -#ifdef MOABDEBUG - call seq_timemgr_EClockGetData( EClock, stepno=cur_drof_stepno ) - write(lnum,"(I0.2)")cur_drof_stepno - outfile = 'drof_comp_run_'//trim(lnum)//'.h5m'//C_NULL_CHAR - wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR - ierr = iMOAB_WriteMesh(mrofid, outfile, wopts) - if (ierr > 0 ) then - write(logunit,*) 'Failed to write data rof component state ' - endif -#endif - -#endif call t_startf('drof_run2') if (my_task == master_task) then diff --git a/components/data_comps/drof/src/rof_comp_mct.F90 b/components/data_comps/drof/src/rof_comp_mct.F90 index 77850d86f61..bafdc6d3f98 100644 --- a/components/data_comps/drof/src/rof_comp_mct.F90 +++ b/components/data_comps/drof/src/rof_comp_mct.F90 @@ -16,11 +16,7 @@ module rof_comp_mct use drof_comp_mod , only: drof_comp_init, drof_comp_run, drof_comp_final use drof_shr_mod , only: drof_shr_read_namelists use seq_flds_mod , only: seq_flds_x2r_fields, seq_flds_r2x_fields -#ifdef HAVE_MOAB - use seq_comm_mct, only : mrofid ! iMOAB app id for rof - use iso_c_binding - use iMOAB , only: iMOAB_RegisterApplication -#endif + ! !PUBLIC TYPES: implicit none private ! except @@ -144,16 +140,6 @@ subroutine rof_init_mct( EClock, cdata, x2r, r2x, NLFilename ) ! Initialize drof !---------------------------------------------------------------------------- -#ifdef HAVE_MOAB - ierr = iMOAB_RegisterApplication(trim("DROF")//C_NULL_CHAR, mpicom, compid, mrofid) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in registering data rof comp' - call shr_sys_abort(subname//' ERROR in registering data rof comp') - endif - ! send path of atm domain file to MOAB coupler. Note that here we may have the land domain in some cases? - !call seq_infodata_PutData( infodata, atm_mesh=SDATM%domainFile) -#endif - call drof_comp_init(Eclock, x2r, r2x, & seq_flds_x2r_fields, seq_flds_r2x_fields, & SDROF, gsmap, ggrid, mpicom, compid, my_task, master_task, & diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 5031c8be072..8afaf8d0424 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -28,7 +28,6 @@ module cplcomp_exchange_mod use seq_comm_mct, only : mphaid ! iMOAB app id for phys atm; comp atm is 5, phys 5+200 use seq_comm_mct, only : MPSIID, mbixid ! sea-ice on comp pes and on coupler pes use seq_comm_mct, only : mrofid, mbrxid ! iMOAB id of moab rof app on comp pes and on coupler too - use seq_comm_mct, only : mbrof_data ! if data rof use shr_mpi_mod, only: shr_mpi_max ! use dimensions_mod, only : np ! for atmosphere use iso_c_binding @@ -1214,7 +1213,7 @@ subroutine cplcomp_moab_Init(infodata,comp) outfile = 'recMeshAtm.h5m'//C_NULL_CHAR endif wopts = ';PARALLEL=WRITE_PART'//C_NULL_CHAR - ! write out the mesh file to diskocn_domain + ! write out the mesh file to disk ierr = iMOAB_WriteMesh(mbaxid, trim(outfile), trim(wopts)) if (ierr .ne. 0) then write(logunit,*) subname,' error in writing mesh ' @@ -1623,43 +1622,21 @@ subroutine cplcomp_moab_Init(infodata,comp) call seq_comm_getinfo(cplid ,mpigrp=mpigrp_cplid) ! receiver group call seq_comm_getinfo(id_old,mpigrp=mpigrp_old) ! component group pes - call seq_infodata_GetData(infodata,rof_mesh=rtm_mesh) - - if (MPI_COMM_NULL /= mpicom_old ) then ! it means we are on the component pes (rof) - comp%mbApCCid = mrofid ! rof comp app in moab - if ( trim(rtm_mesh) == 'none' ) then ! mbrof_data is .true. also - ! send mesh to coupler - ierr = iMOAB_SendMesh(mrofid, mpicom_join, mpigrp_cplid, id_join, partMethod) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in sending rof mesh to coupler ' - call shr_sys_abort(subname//' ERROR in sending rof mesh to coupler ') - endif - endif - endif if (MPI_COMM_NULL /= mpicom_new ) then ! we are on the coupler pes appname = "COUPLE_MROF"//C_NULL_CHAR ierr = iMOAB_RegisterApplication(trim(appname), mpicom_new, id_join, mbrxid) - if ( trim(rtm_mesh) == 'none' ) then - mbrof_data = .true. ! turn it on the coupler pes too; - ierr = iMOAB_ReceiveMesh(mbrxid, mpicom_join, mpigrp_old, id_old) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in receiving mesh on rof coupler ' - call shr_sys_abort(subname//' ERROR in receiving mesh on rof coupler ') - endif - else ! load mesh from scrip file passed from river model - outfile = trim(rtm_mesh)//C_NULL_CHAR - ropts = 'PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN'//C_NULL_CHAR - - nghlay = 0 ! no ghost layers - ierr = iMOAB_LoadMesh(mbrxid, outfile, ropts, nghlay) - if ( ierr .ne. 0 ) then - call shr_sys_abort( subname//' ERROR: cannot read rof mesh on coupler' ) - end if - - endif - ! need to add global id tag to the app, it will be used in restart + call seq_infodata_GetData(infodata,rof_mesh=rtm_mesh) + outfile = trim(rtm_mesh)//C_NULL_CHAR + ropts = 'PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN'//C_NULL_CHAR + + nghlay = 0 ! no ghost layers + ierr = iMOAB_LoadMesh(mbrxid, outfile, ropts, nghlay) + if ( ierr .ne. 0 ) then + call shr_sys_abort( subname//' ERROR: cannot read rof mesh on coupler' ) + end if + ! need to add global id tag to the app, it will be used in restart tagtype = 0 ! dense, integer numco = 1 tagname='GLOBAL_ID'//C_NULL_CHAR @@ -1668,6 +1645,7 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in adding global id tag to rof' call shr_sys_abort(subname//' ERROR in adding global id tag to rof ') endif + #ifdef MOABDEBUG ! debug test outfile = 'recRof.h5m'//C_NULL_CHAR @@ -1707,16 +1685,14 @@ subroutine cplcomp_moab_Init(infodata,comp) comp%mbGridType = 0 ! 0 or 1, pc or cells comp%mblsize = nvert(1) ! vertices endif - if ( trim(rtm_mesh) /= 'none' ) then ! we are in full mesh case - ! we are now on joint pes, compute comm graph between rof and coupler model - typeA = 2 ! point cloud on component PEs - typeB = 3 ! full mesh on coupler pes, we just read it - ierr = iMOAB_ComputeCommGraph( mrofid, mbrxid, mpicom_join, mpigrp_old, mpigrp_cplid, & - typeA, typeB, id_old, id_join) - if (ierr .ne. 0) then - write(logunit,*) subname,' error in computing comm graph for rof model ' - call shr_sys_abort(subname//' ERROR in computing comm graph for rof model ') - endif + ! we are now on joint pes, compute comm graph between rof and coupler model + typeA = 2 ! point cloud on component PEs + typeB = 3 ! full mesh on coupler pes, we just read it + ierr = iMOAB_ComputeCommGraph( mrofid, mbrxid, mpicom_join, mpigrp_old, mpigrp_cplid, & + typeA, typeB, id_old, id_join) + if (ierr .ne. 0) then + write(logunit,*) subname,' error in computing comm graph for rof model ' + call shr_sys_abort(subname//' ERROR in computing comm graph for rof model ') endif ! if (mrofid .ge. 0) then ! we are on component rof pes diff --git a/driver-moab/main/seq_frac_mct.F90 b/driver-moab/main/seq_frac_mct.F90 index b2e1b41960a..a89fc0b9aa4 100644 --- a/driver-moab/main/seq_frac_mct.F90 +++ b/driver-moab/main/seq_frac_mct.F90 @@ -177,7 +177,6 @@ module seq_frac_mct ! for tri grid, sameg_al would be false use seq_comm_mct, only : mbrxid ! iMOAB id of moab rof migrated to coupler pes - use seq_comm_mct, only : mbrof_data ! different logic for data rof model use iMOAB, only : iMOAB_DefineTagStorage, iMOAB_SetDoubleTagStorage, & iMOAB_GetMeshInfo, iMOAB_SetDoubleTagStorageWithGid, iMOAB_WriteMesh, & @@ -517,15 +516,9 @@ subroutine seq_frac_init( infodata, & call shr_sys_abort(subname//' ERROR in defining tags on rof phys mesh on cpl') endif ierr = iMOAB_GetMeshInfo ( mbrxid, nvert, nvise, nbl, nsurf, nvisBC ); - if (mbrof_data) then ! then the coupler has point cloud too - arrSize = 3 * nvert(1) - ent_type = 0 ! vertex type on rof - else - arrSize = 3 * nvise(1) ! there are 3 tags - ent_type = 1 ! cell type, rof is now FV on coupler side - endif + arrSize = 3 * nvise(1) ! there are 3 tags allocate(tagValues(arrSize) ) - + ent_type = 1 ! vertex type, rof is now FV tagValues = 0. ierr = iMOAB_SetDoubleTagStorage ( mbrxid, tagname, arrSize , ent_type, tagValues) deallocate(tagValues) diff --git a/driver-moab/shr/seq_comm_mct.F90 b/driver-moab/shr/seq_comm_mct.F90 index 44d29e91ad2..10a23b9c509 100644 --- a/driver-moab/shr/seq_comm_mct.F90 +++ b/driver-moab/shr/seq_comm_mct.F90 @@ -241,7 +241,6 @@ module seq_comm_mct integer, public :: mbrmapro ! iMOAB id for read map between river and ocean; it exists on coupler PEs ! similar to intx id, oa, la; integer, public :: mbrxoid ! iMOAB id for rof migrated to coupler for ocean context (r2o mapping) - logical, public :: mbrof_data = .false. ! made true if no rtm mesh, which means data rof ? integer, public :: mbintxar ! iMOAB id for intx mesh between atm and river integer, public :: mbintxlr ! iMOAB id for intx mesh between land and river integer, public :: mbintxrl ! iMOAB id for intx mesh between river and land From 3a271fb542875cec6ee8121a210cce246606a351 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Wed, 3 Apr 2024 19:47:45 -0500 Subject: [PATCH 127/310] misplaced ifdefs --- components/data_comps/datm/src/datm_comp_mod.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/data_comps/datm/src/datm_comp_mod.F90 b/components/data_comps/datm/src/datm_comp_mod.F90 index 9af9f06732b..6f0adeedcd0 100644 --- a/components/data_comps/datm/src/datm_comp_mod.F90 +++ b/components/data_comps/datm/src/datm_comp_mod.F90 @@ -725,13 +725,13 @@ subroutine datm_comp_run(EClock, x2a, a2x, & nextsw_cday, case_name) ! !DESCRIPTION: run method for datm model -#ifdef MOABDEBUG +#ifdef HAVE_MOAB + use seq_flds_mod , only: seq_flds_a2x_fields ! this should not be an argument in datm_comp_init use seq_comm_mct, only : mphaid ! use seq_flds_mod, only: moab_set_tag_from_av +#ifdef MOABDEBUG use iMOAB, only: iMOAB_WriteMesh #endif -#ifdef HAVE_MOAB - use seq_flds_mod , only: seq_flds_a2x_fields ! this should not be an argument in datm_comp_init #endif implicit none From 15ed4014d67376509211835c81d8b030a3e54266 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Thu, 4 Apr 2024 16:26:07 -0500 Subject: [PATCH 128/310] initialize area, aream on coupler side for data atm --- driver-moab/main/cplcomp_exchange_mod.F90 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/driver-moab/main/cplcomp_exchange_mod.F90 b/driver-moab/main/cplcomp_exchange_mod.F90 index 8afaf8d0424..2fd8bb1f5f6 100644 --- a/driver-moab/main/cplcomp_exchange_mod.F90 +++ b/driver-moab/main/cplcomp_exchange_mod.F90 @@ -1201,6 +1201,12 @@ subroutine cplcomp_moab_Init(infodata,comp) write(logunit,*) subname,' error in defining tags seq_flds_dom_fields on atm on coupler ' call shr_sys_abort(subname//' ERROR in defining tags ') endif + if ( trim(atm_mesh) /= 'none' ) then + ! also, frac, area, aream, masks has to come from atm mphaid, not from domain file reader + ! this is hard to digest :( + tagname = 'area:aream:frac:mask'//C_NULL_CHAR + call component_exch_moab(comp, mphaid, mbaxid, 0, tagname) + endif endif @@ -1358,7 +1364,7 @@ subroutine cplcomp_moab_Init(infodata,comp) endif ! also, frac, area, aream, masks has to come from ocean mpoid, not from domain file reader ! this is hard to digest :( - tagname = 'area:frac:frac:mask'//C_NULL_CHAR + tagname = 'area:aream:frac:mask'//C_NULL_CHAR call component_exch_moab(comp, mpoid, mboxid, 0, tagname) endif From 483f57ccf7d25b0f3ae90b4ead058c0d984dfdf0 Mon Sep 17 00:00:00 2001 From: Michael Kelleher Date: Wed, 10 Apr 2024 13:14:40 -0500 Subject: [PATCH 129/310] Fix offset for annual avg --- components/mpas-ocean/cime_config/SystemTests/mvko.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mpas-ocean/cime_config/SystemTests/mvko.py b/components/mpas-ocean/cime_config/SystemTests/mvko.py index de6e6edb30e..71477a4dfc1 100644 --- a/components/mpas-ocean/cime_config/SystemTests/mvko.py +++ b/components/mpas-ocean/cime_config/SystemTests/mvko.py @@ -180,7 +180,7 @@ def build_phase(self, sharedlib_only=False, model_only=False): # Write yearly averages to custom output file tss_climatology_config = [ "config_am_timeseriesstatsclimatology_enable = .true.\n", - "config_am_timeseriesstatsclimatology_backward_output_offset = '00-03-00_00:00:00'\n", + "config_am_timeseriesstatsclimatology_backward_output_offset = '01-00-00_00:00:00'\n", "config_am_timeseriesstatsclimatology_compute_interval = '00-00-00_01:00:00'\n", "config_am_timeseriesstatsclimatology_compute_on_startup = .false.\n", "config_am_timeseriesstatsclimatology_duration_intervals = '01-00-00_00:00'\n", From 1327c10523fb657c6e81814d0b886244789a07fa Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Wed, 10 Apr 2024 13:37:40 -0500 Subject: [PATCH 130/310] Update mapping and domain files, add support for v3 ocn/ice mesh --- cime_config/config_grids.xml | 112 +++++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 18 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 2c2258011f6..ac3c4b2ddbf 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1665,6 +1665,26 @@ EC30to60E2r2 + + ne30np4.pg2 + r05 + IcoswISC30E3r5 + r05 + mpas.gis20km + null + IcoswISC30E3r5 + + + + TL319 + TL319 + IcoswISC30E3r5 + JRA025 + mpas.gis20km + null + IcoswISC30E3r5 + + ne30np4.pg2 r05 @@ -1715,6 +1735,26 @@ EC30to60E2r2 + + ne30np4.pg2 + r05 + IcoswISC30E3r5 + r05 + mpas.gis1to10kmR2 + null + IcoswISC30E3r5 + + + + TL319 + TL319 + IcoswISC30E3r5 + JRA025 + mpas.gis1to10kmR2 + null + IcoswISC30E3r5 + + ne120np4.pg2 r0125 @@ -4857,17 +4897,24 @@ - cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_mono.230510.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_bilin.230510.nc - cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_mono.230510.nc - cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_mono.230510.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_traave.20240403.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis20km_trbilin.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_traave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_ne30pg2_traave.20240403.nc - cpl/gridmaps/r05/map_r05_to_gis20km_mono.230510.nc - cpl/gridmaps/r05/map_r05_to_gis20km_bilin.230510.nc - cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_mono.230510.nc - cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_mono.230510.nc + cpl/gridmaps/r05/map_r05_to_gis20km_traave.20240403.nc + cpl/gridmaps/r05/map_r05_to_gis20km_trbilin.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_traave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_r05_traave.20240403.nc + + + + cpl/gridmaps/TL319/map_TL319_to_gis20km_traave.20240404.nc + cpl/gridmaps/TL319/map_TL319_to_gis20km_trbilin.20240404.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_TL319_traave.20240404.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_TL319_traave.20240404.nc @@ -4881,6 +4928,17 @@ cpl/gridmaps/mpas.gis20km/map_gis20km_to_EC30to60E2r2_aave.230510.nc + + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_gis20km_esmfaave.20240403.nc + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_gis20km_esmfbilin.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis20km/map_gis20km_to_IcoswISC30E3r5_esmfaave.20240403.nc + + @@ -4933,19 +4991,26 @@ - cpl/gridmaps/r05/map_r05_to_gis1to10r02_mono.230725.nc - cpl/gridmaps/r05/map_r05_to_gis1to10r02_bilin.230725.nc - cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_r05_mono.230725.nc - cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_r05_mono.230725.nc + cpl/gridmaps/r05/map_r05_to_gis1to10kmR2_traave.20240403.nc + cpl/gridmaps/r05/map_r05_to_gis1to10kmR2_trbilin.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_r05_traave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_r05_traave.20240403.nc - + - cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10r02_mono.230725.nc - cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10r02_bilin.230725.nc - cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_ne30pg2_mono.230725.nc - cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_ne30pg2_mono.230725.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10kmR2_traave.20240403.nc + cpl/gridmaps/ne30pg2/map_ne30pg2_to_gis1to10kmR2_trbilin.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_ne30pg2_traave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_ne30pg2_traave.20240403.nc + + + + cpl/gridmaps/TL319/map_TL319_to_gis20km_traave.20240404.nc + cpl/gridmaps/TL319/map_TL319_to_gis20km_trbilin.20240404.nc + cpl/gridmaps/mpas.gis1to10km/map_gis20km_to_TL319_traave.20240404.nc + cpl/gridmaps/mpas.gis1to10km/map_gis20km_to_TL319_traave.20240404.nc - + cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis1to10r02_aave.230725.nc cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_gis1to10r02_bilin.230725.nc @@ -4957,6 +5022,17 @@ cpl/gridmaps/mpas.gis1to10km/map_gis1to10r02_to_EC30to60E2r2_aave.230725.nc + + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_gis1to10kmR2_esmfaave.20240403.nc + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_gis1to10kmR2_esmfbilin.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_IcoswISC30E3r5_esmfaave.20240403.nc + + From acc601c0039ae313e1ddf9d84dd8d8f7be2d5da3 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Wed, 10 Apr 2024 13:46:51 -0500 Subject: [PATCH 131/310] add moab paths for anlgce-ub22 machine --- cime_config/machines/config_machines.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 14f2d9121eb..f61948fb31d 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2125,6 +2125,7 @@ /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/hdf5/1.12.2/mpich-4.1.2/gcc-12.1.0 /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/netcdf/4.8.0c-4.3.1cxx-4.5.3f-parallel/mpich-4.1.2/gcc-12.1.0 /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/pnetcdf/1.12.3/mpich-4.1.2/gcc-12.1.0 + $SHELL{if [ -z "$MOAB_ROOT" ]; then echo /nfs/gce/projects/climate/software/moab/devel/mpich-4.1.2/gcc-12.1.0; else echo "$MOAB_ROOT"; fi} @@ -2134,6 +2135,7 @@ /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/hdf5/1.12.2/openmpi-4.1.6/gcc-12.1.0 /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/netcdf/4.8.0c-4.3.1cxx-4.5.3f-parallel/openmpi-4.1.6/gcc-12.1.0 /nfs/gce/projects/climate/software/linux-ubuntu22.04-x86_64/pnetcdf/1.12.3/openmpi-4.1.6/gcc-12.1.0 + $SHELL{if [ -z "$MOAB_ROOT" ]; then echo /nfs/gce/projects/climate/software/moab/devel/openmpi-4.1.6/gcc-12.1.0; else echo "$MOAB_ROOT"; fi} 64M From 3dbf165fed67d8233c40265fb717d723ad7d9a8c Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 09:49:45 -0400 Subject: [PATCH 132/310] add repository link in header of docs --- mkdocs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mkdocs.yaml b/mkdocs.yaml index aaeefb4c81f..748ce944df6 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -5,6 +5,9 @@ nav: - 'Developing Docs': 'https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation' - Components: '*include ./components/*/mkdocs.yml' +repo_name: E3SM-Project/E3SM +repo_url: https://github.com/E3SM-Project/E3SM + theme: name: material palette: From 0b514b4773975293ac186b9de3ccf5c5432ca40b Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 11 Apr 2024 10:01:37 -0400 Subject: [PATCH 133/310] add search feature to header --- mkdocs.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mkdocs.yaml b/mkdocs.yaml index 748ce944df6..e9bca8aec0f 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -42,6 +42,8 @@ plugins: - monorepo - bibtex: bib_file: components/elm/docs/refs.bib + - search: + separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' extra_javascript: - javascript/mathjax.js From 0b07fac0bfb1f01740b5250d516a7b0c3d17a42a Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 11 Apr 2024 10:19:02 -0400 Subject: [PATCH 134/310] small fixes to site search additions --- mkdocs.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index e9bca8aec0f..48aafc2beb4 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -26,7 +26,10 @@ theme: - navigation.instant - navigation.sections - navigation.top -# - navigation.tabs + - search.suggest + - search.highlight + - search.share + markdown_extensions: - footnotes @@ -42,8 +45,7 @@ plugins: - monorepo - bibtex: bib_file: components/elm/docs/refs.bib - - search: - separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' + - search extra_javascript: - javascript/mathjax.js From 33f6e69b1c59d0b7af3d2f6469b9d71392e40422 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 11 Apr 2024 10:33:54 -0400 Subject: [PATCH 135/310] minor edits in navigation --- mkdocs.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index 48aafc2beb4..e31edf75f0c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -22,9 +22,12 @@ theme: icon: material/weather-night name: Switch to light mode features: - - navigation.indices + - navigation.indexes - navigation.instant + - navigation.instant.prefetch - navigation.sections + - navigation.path + - navigation.tracking - navigation.top - search.suggest - search.highlight From 3760c12d31e7ac6b3ab1aeee94463063a1d11ebe Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 11 Apr 2024 10:40:09 -0400 Subject: [PATCH 136/310] add code blocks edits, page actions --- mkdocs.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mkdocs.yaml b/mkdocs.yaml index e31edf75f0c..2fe54bfee1b 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -32,6 +32,11 @@ theme: - search.suggest - search.highlight - search.share + - content.code.select + - content.code.copy + - content.action.edit + - content.action.view + - content.tooltips markdown_extensions: From f6fa04dd1a2674dad00c5738dc8e4c793efa3dee Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 11:19:58 -0400 Subject: [PATCH 137/310] limit gh/ci to only eam, but not its docs --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index ff9263f9fc7..b286905fe23 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -3,6 +3,11 @@ name: gh on: pull_request: branches: [ master ] + paths: + - 'cime_config/**' + - 'components/eam/**' + paths-ignore: + - 'components/eam/docs/**' workflow_dispatch: From d6079692eee791f865d894d8737e24ef6a421abe Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 11:20:36 -0400 Subject: [PATCH 138/310] add linter to lint new md files in prs --- .github/workflows/e3sm-gh-md-linter.yml | 27 +++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/e3sm-gh-md-linter.yml diff --git a/.github/workflows/e3sm-gh-md-linter.yml b/.github/workflows/e3sm-gh-md-linter.yml new file mode 100644 index 00000000000..50bc13bd4b8 --- /dev/null +++ b/.github/workflows/e3sm-gh-md-linter.yml @@ -0,0 +1,27 @@ +name: markdown + +# if .md files are touched in a PR, lint them! + +on: + pull_request: + branches: ["master"] + paths: + - '**/*.md' + +jobs: + linter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: tj-actions/changed-files@v44 + id: changed-files + with: + files: '**/*.md' + separator: "," + - uses: DavidAnson/markdownlint-cli2-action@v16 + if: steps.changed-files.outputs.any_changed == 'true' + with: + globs: ${{ steps.changed-files.outputs.all_changed_files }} + separator: "," From 33643f0152e7e4321a2f0fd7b32e613401207c4b Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 11:42:14 -0400 Subject: [PATCH 139/310] run gh/ci F-case on elm as well --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index b286905fe23..feb4d23b140 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -6,8 +6,10 @@ on: paths: - 'cime_config/**' - 'components/eam/**' + - 'components/elm/**' paths-ignore: - 'components/eam/docs/**' + - 'components/elm/docs/**' workflow_dispatch: From 549070aac841685a07c3135c264afd8778897efb Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 11:42:52 -0400 Subject: [PATCH 140/310] ignore edits in mkdocs yml in cmp dir --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index feb4d23b140..78b8a565002 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -9,7 +9,9 @@ on: - 'components/elm/**' paths-ignore: - 'components/eam/docs/**' + - 'components/eam/mkdocs.yml' - 'components/elm/docs/**' + - 'components/elm/mkdocs.yml' workflow_dispatch: From d4246522038c8ee7814df5faf3c59e44f465dd55 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 11 Apr 2024 11:48:01 -0400 Subject: [PATCH 141/310] use negation instead of paths-ignore --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index 78b8a565002..b8b0ec45e61 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -4,14 +4,15 @@ on: pull_request: branches: [ master ] paths: + # first, yes to these - 'cime_config/**' - 'components/eam/**' - 'components/elm/**' - paths-ignore: - - 'components/eam/docs/**' - - 'components/eam/mkdocs.yml' - - 'components/elm/docs/**' - - 'components/elm/mkdocs.yml' + # second, no to these + - '!components/eam/docs/**' + - '!components/eam/mkdocs.yml' + - '!components/elm/docs/**' + - '!components/elm/mkdocs.yml' workflow_dispatch: From 9fa0ce63dd75f7b14cfce56fd1d5f85db1fae6e1 Mon Sep 17 00:00:00 2001 From: jayeshkrishna Date: Thu, 11 Apr 2024 09:18:21 -0500 Subject: [PATCH 142/310] Turn on BP to NC on close for tests Enable conversion of the ADIOS BP output files to NetCDF during file close for tests. This is required for tests like ERIO tests that require the NetCDF output before the dependent conversion job (which runs after the current job completes) gets a chance to perform the conversion. --- components/cmake/modules/FindPIO.cmake | 3 +++ share/build/buildlib.spio | 3 +++ 2 files changed, 6 insertions(+) diff --git a/components/cmake/modules/FindPIO.cmake b/components/cmake/modules/FindPIO.cmake index 7df8a9ba106..0277918ac8e 100644 --- a/components/cmake/modules/FindPIO.cmake +++ b/components/cmake/modules/FindPIO.cmake @@ -18,6 +18,9 @@ endif() if (PIO_VERSION STREQUAL 2) # This is a pio2 library set(PIOLIBS "${PIO_LIBDIR}/libpiof.a;${PIO_LIBDIR}/libpioc.a") + if (DEFINED ENV{ADIOS2_ROOT}) + list(APPEND PIOLIBS "${PIO_LIBDIR}/libadios2pio-nm-lib.a") + endif() else() # This is a pio1 library set(PIOLIBS "${PIO_LIBDIR}/libpio.a") diff --git a/share/build/buildlib.spio b/share/build/buildlib.spio index d65d5547936..49b898202f7 100755 --- a/share/build/buildlib.spio +++ b/share/build/buildlib.spio @@ -106,6 +106,9 @@ def buildlib(bldroot, installpath, case): if "ADIOS2_ROOT" in os.environ: cmake_opts += "-DWITH_ADIOS2:BOOL=ON " + if "FROM_CREATE_TEST" in os.environ and os.environ["FROM_CREATE_TEST"] == "True": + cmake_opts += "-DADIOS_BP2NC_TEST:BOOL=ON " + if debug: cmake_opts += "-DPIO_ENABLE_LOGGING=ON " # Case changes for NetCDF/NETCDF forces us to do this. For other packages From 9c4874594274bea67850fdabd0e22a73ea55ffaa Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Thu, 11 Apr 2024 15:55:58 -0500 Subject: [PATCH 143/310] Reduce the number of new compset aliases to just one flavor of JRA --- .../cime_config/config_compsets.xml | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/components/mpas-ocean/cime_config/config_compsets.xml b/components/mpas-ocean/cime_config/config_compsets.xml index 491b45244ed..fa87ed02e7a 100644 --- a/components/mpas-ocean/cime_config/config_compsets.xml +++ b/components/mpas-ocean/cime_config/config_compsets.xml @@ -62,66 +62,26 @@ 2000_DATM%JRA-1p5_SLND_MPASSI_MPASO%DATMFORCED_DROF%JRA-1p5_SGLC_SWAV - - GMPAS-OECO-JRA - 2000_DATM%JRA_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA_SGLC_SWAV - - GMPAS-OECO-JRA1p4 2000_DATM%JRA-1p4-2018_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA-1p4-2018_SGLC_SWAV - - GMPAS-OECO-JRA1p5 - 2000_DATM%JRA-1p5_SLND_MPASSI_MPASO%OECODATMFORCED_DROF%JRA-1p5_SGLC_SWAV - - - - GMPAS-OIECO-JRA - 2000_DATM%JRA_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA_SGLC_SWAV - - GMPAS-OIECO-JRA1p4 2000_DATM%JRA-1p4-2018_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA-1p4-2018_SGLC_SWAV - - GMPAS-OIECO-JRA1p5 - 2000_DATM%JRA-1p5_SLND_MPASSI%BGC_MPASO%OIECODATMFORCED_DROF%JRA-1p5_SGLC_SWAV - - - - GPMPAS-OECO-JRA - 2000_DATM%JRA_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV - - GPMPAS-OECO-JRA1p4 2000_DATM%JRA-1p4-2018_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV - - GPMPAS-OECO-JRA1p5 - 2000_DATM%JRA-1p5_ELM%SPBC_MPASSI_MPASO%OECODATMFORCED_MOSART_SGLC_SWAV - - - - GPMPAS-OIECO-JRA - 2000_DATM%JRA_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV - - GPMPAS-OIECO-JRA1p4 2000_DATM%JRA-1p4-2018_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV - - GPMPAS-OIECO-JRA1p5 - 2000_DATM%JRA-1p5_ELM%SPBC_MPASSI%BGC_MPASO%OIECODATMFORCED_MOSART_SGLC_SWAV - - GMPAS-JRA1p5-DIB-PISMF 2000_DATM%JRA-1p5_SLND_MPASSI%DIB_MPASO%IBPISMFDATMFORCED_DROF%JRA-1p5-AIS0ROF_SGLC_SWAV From 1274e0add1c3b8782e31d7fdacce04fe607db224 Mon Sep 17 00:00:00 2001 From: Chloe Date: Fri, 8 Mar 2024 11:27:10 -0800 Subject: [PATCH 144/310] adjusted use_extrasnowlayers parameters based on Schneider et al., 2021 --- .../elm/src/biogeophys/SnowHydrologyMod.F90 | 12 +++---- .../elm/src/biogeophys/SnowSnicarMod.F90 | 2 +- .../elm/src/data_types/ColumnDataType.F90 | 31 +++++++++++++------ components/elm/src/main/elm_instMod.F90 | 20 ++++++++++-- components/elm/src/main/elm_varcon.F90 | 3 +- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/components/elm/src/biogeophys/SnowHydrologyMod.F90 b/components/elm/src/biogeophys/SnowHydrologyMod.F90 index 62f2ba24242..6354dd598b0 100644 --- a/components/elm/src/biogeophys/SnowHydrologyMod.F90 +++ b/components/elm/src/biogeophys/SnowHydrologyMod.F90 @@ -571,14 +571,14 @@ subroutine SnowCompaction(bounds, num_snowc, filter_snowc, & ! parameters real(r8), parameter :: c2 = 23.e-3_r8 ! [m3/kg] real(r8), parameter :: c3 = 2.777e-6_r8 ! [1/s] - real(r8), parameter :: c3_ams = 5.8e-7_r8 ! Schneider et al., 2020 [1/s] + real(r8), parameter :: c3_ams = 0.83e-6_r8 ! Schneider et al.,(2021),Table 2 [1/s] real(r8), parameter :: c4 = 0.04_r8 ! [1/K] real(r8), parameter :: c5 = 2.0_r8 ! real(r8), parameter :: dm = 100.0_r8 ! Upper Limit on Destructive Metamorphism Compaction [kg/m3] - real(r8), parameter :: rho_dm = 150.0_r8 ! Upper limit on destructive metamorphism compaction [kg/m3] (Anderson, 1976; Schneider et al., 2020) + real(r8), parameter :: rho_dm = 150.0_r8 ! Upper limit on destructive metamorphism compaction [kg/m3] (Anderson, 1976;Schneider et al., 2021) real(r8), parameter :: eta0 = 9.e+5_r8 ! The Viscosity Coefficient Eta0 [kg-s/m2] - real(r8), parameter :: k_creep_snow = 1.4e-9_r8 ! Creep coefficient for snow (bi < 550 kg / m3) [m3-s/kg] - real(r8), parameter :: k_creep_firn = 1.2e-9_r8 ! Creep coefficient for firn (bi > 550 kg / m3) + real(r8), parameter :: k_creep_snow = 9.2e-9_r8 ! Creep coefficient for snow (bi < 550 kg / m3) [m3-s/kg] + real(r8), parameter :: k_creep_firn = 3.7e-9_r8 ! Creep coefficient for firn (bi > 550 kg / m3) [m3-s/kg] ! real(r8) :: p_gls ! grain load stress [kg / m-s2] real(r8) :: burden(bounds%begc:bounds%endc) ! pressure of overlying snow [kg/m2] @@ -693,12 +693,12 @@ subroutine SnowCompaction(bounds, num_snowc, filter_snowc, & ddz2 = (-k_creep_snow * (max(denice / bi, 1._r8) - 1._r8) * & exp(-60.e6_r8 / (rgas * t_soisno(c,j))) * p_gls) / & (snw_rds(c,j) * 1.e-6_r8 * snw_rds(c,j) * 1.e-6_r8) - & - 2.02e-10_r8 + 1.0e-10_r8 else ! High density, i.e. firn ddz2 = (-k_creep_firn * (max(denice / bi, 1._r8) - 1._r8) * & exp(-60.e6_r8 / (rgas * t_soisno(c,j))) * p_gls) / & (snw_rds(c,j) * 1.e-6_r8 * snw_rds(c,j) * 1.e-6_r8) - & - 2.7e-11_r8 + 1.0e-10_r8 endif endif diff --git a/components/elm/src/biogeophys/SnowSnicarMod.F90 b/components/elm/src/biogeophys/SnowSnicarMod.F90 index fae56d8927d..abaa72d0a5f 100644 --- a/components/elm/src/biogeophys/SnowSnicarMod.F90 +++ b/components/elm/src/biogeophys/SnowSnicarMod.F90 @@ -80,7 +80,7 @@ module SnowSnicarMod integer, parameter :: snw_rds_max_tbl = 1500 ! maximum effective radius defined in Mie lookup table [microns] integer, parameter :: snw_rds_min_tbl = 30 ! minimium effective radius defined in Mie lookup table [microns] real(r8), parameter :: snw_rds_max = 1500._r8 ! maximum allowed snow effective radius [microns] - real(r8), parameter :: snw_rds_refrz = 1000._r8 ! effective radius of re-frozen snow [microns] + real(r8), parameter :: snw_rds_refrz = 1500._r8 ! effective radius of re-frozen snow [microns] !$acc declare copyin(snw_rds_max_tbl) !$acc declare copyin(snw_rds_min_tbl) !$acc declare copyin(snw_rds_max ) diff --git a/components/elm/src/data_types/ColumnDataType.F90 b/components/elm/src/data_types/ColumnDataType.F90 index bc6c935efa5..1793628598e 100644 --- a/components/elm/src/data_types/ColumnDataType.F90 +++ b/components/elm/src/data_types/ColumnDataType.F90 @@ -18,7 +18,7 @@ module ColumnDataType use elm_varpar , only : nlevdecomp_full, crop_prog, nlevdecomp use elm_varpar , only : i_met_lit, i_cel_lit, i_lig_lit, i_cwd use elm_varcon , only : spval, ispval, zlnd, snw_rds_min, denice, denh2o, tfrz, pondmx - use elm_varcon , only : watmin, bdsno, zsoi, zisoi, dzsoi_decomp + use elm_varcon , only : watmin, bdsno, bdfirn, zsoi, zisoi, dzsoi_decomp use elm_varcon , only : c13ratio, c14ratio, secspday use elm_varctl , only : use_fates, use_fates_planthydro, create_glacier_mec_landunit use elm_varctl , only : use_hydrstress, use_crop @@ -28,6 +28,7 @@ module ColumnDataType use elm_varctl , only : hist_wrtch4diag, use_century_decomp use elm_varctl , only : get_carbontag, override_bgc_restart_mismatch_dump use elm_varctl , only : pf_hmode, nu_com + use elm_varctl , only : use_extrasnowlayers use elm_varctl , only : use_fan use ch4varcon , only : allowlakeprod use pftvarcon , only : VMAX_MINSURF_P_vr, KM_MINSURF_P_vr, pinit_beta1, pinit_beta2 @@ -1742,8 +1743,20 @@ subroutine col_ws_init(this, begc, endc, h2osno_input, snow_depth_input, watsat_ end do do j = -nlevsno+1, 0 if (j > col_pp%snl(c)) then - this%h2osoi_ice(c,j) = col_pp%dz(c,j)*250._r8 - this%h2osoi_liq(c,j) = 0._r8 + if (use_extrasnowlayers) then + ! amschnei@uci.edu: Initialize "deep firn" on glacier columns + if (lun_pp%itype(l) == istice .or. lun_pp%itype(l) == istice_mec) then + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdfirn + this%h2osoi_liq(c,j) = 0._r8 + else + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdsno + this%h2osoi_liq(c,j) = 0._r8 + end if + else ! no firn model (default in v2) + ! Below, "250._r8" should instead be "bdsno", which is 250 kg m^3 by default + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*250._r8 + this%h2osoi_liq(c,j) = 0._r8 + end if end if end do end if @@ -5830,26 +5843,26 @@ subroutine col_wf_init(this, begc, endc) avgflag='A', long_name='column-integrated snow freezing rate', & ptr_col=this%qflx_snofrz, set_lake=spval, c2l_scale_type='urbanf', default='inactive') - if (create_glacier_mec_landunit) then + !if (create_glacier_mec_landunit) then this%qflx_glcice(begc:endc) = spval call hist_addfld1d (fname='QICE', units='mm/s', & avgflag='A', long_name='ice growth/melt', & ptr_col=this%qflx_glcice, l2g_scale_type='ice') - end if + !end if - if (create_glacier_mec_landunit) then + !if (create_glacier_mec_landunit) then this%qflx_glcice_frz(begc:endc) = spval call hist_addfld1d (fname='QICE_FRZ', units='mm/s', & avgflag='A', long_name='ice growth', & ptr_col=this%qflx_glcice_frz, l2g_scale_type='ice') - end if + !end if - if (create_glacier_mec_landunit) then + !if (create_glacier_mec_landunit) then this%qflx_glcice_melt(begc:endc) = spval call hist_addfld1d (fname='QICE_MELT', units='mm/s', & avgflag='A', long_name='ice melt', & ptr_col=this%qflx_glcice_melt, l2g_scale_type='ice') - end if + !end if ! As defined here, snow_sources - snow_sinks will equal the change in h2osno at any ! given time step but only if there is at least one snow layer (for all landunits diff --git a/components/elm/src/main/elm_instMod.F90 b/components/elm/src/main/elm_instMod.F90 index ce5fb9bda4e..d14d6ba3f10 100644 --- a/components/elm/src/main/elm_instMod.F90 +++ b/components/elm/src/main/elm_instMod.F90 @@ -262,7 +262,7 @@ subroutine elm_inst_biogeophys(bounds_proc) ! use shr_scam_mod , only : shr_scam_getCloseLatLon use landunit_varcon , only : istice, istice_mec, istsoil - use elm_varcon , only : h2osno_max, bdsno + use elm_varcon , only : h2osno_max, bdsno, bdfirn use domainMod , only : ldomain use elm_varpar , only : nlevsno, numpft use elm_varctl , only : single_column, fsurdat, scmlat, scmlon, use_extrasnowlayers @@ -318,8 +318,18 @@ subroutine elm_inst_biogeophys(bounds_proc) else h2osno_col(c) = 0._r8 endif + snow_depth_col(c) = h2osno_col(c) / bdsno else ! With a deeper firn model, we can no longer depend on "h2osno_max," because this will - ! potentially be large, resulting in a lot of artificial firn at initialization. + ! potentially be large, resulting in a lot of artificial firn at initialization. ! + ! amschnei@uci.edu: UPDATE - By including a new parameter, bdfirn, we can + ! initialize a dense (e.g, 730 kd m^-3) "deep firn" layer for glacier + ! land units. This deep firn layer can be set to half of the total + ! maximum allotted snowpack mass (i.e., "h2osno_max"), which effectively + ! sets the Greenland and Antarctic ice sheets' (and mountain glaciers') + ! climatic (aka surface) mass balance (SMB) initial condition to 0. With this + ! cold start condition, a multi-decadal (100 to 300 years or more) + ! spin up is first required to prognose nonzero SMB. + ! ! However... (below docstring from CLMv5) ! In areas that should be snow-covered, it can be problematic to start with 0 snow ! cover, because this can affect the long-term state through soil heating, albedo @@ -328,14 +338,18 @@ subroutine elm_inst_biogeophys(bounds_proc) ! feedback may not activate on time (or at all). So, as a compromise, we start with ! a small amount of snow in places that are likely to be snow-covered for much or ! all of the year. + ! amschnei@uci.edu: Initializing "deep firn" for glacier columns if (lun_pp%itype(l)==istice .or. lun_pp%itype(l)==istice_mec) then ! land ice (including multiple elevation classes, i.e. glacier_mec) - h2osno_col(c) = 50._r8 + h2osno_col(c) = 0.5_r8*h2osno_max ! start with half full snow column, representing deep firn + snow_depth_col(c) = h2osno_col(c) / bdfirn else if (lun_pp%itype(l)==istsoil .and. grc_pp%latdeg(g) >= 44._r8) then ! Northern hemisphere seasonal snow h2osno_col(c) = 50._r8 + snow_depth_col(c) = h2osno_col(c) / bdsno else h2osno_col(c) = 0._r8 + snow_depth_col(c) = h2osno_col(c) / bdsno endif endif snow_depth_col(c) = h2osno_col(c) / bdsno diff --git a/components/elm/src/main/elm_varcon.F90 b/components/elm/src/main/elm_varcon.F90 index 3a95fc05c52..2fcf09dbf8a 100644 --- a/components/elm/src/main/elm_varcon.F90 +++ b/components/elm/src/main/elm_varcon.F90 @@ -67,6 +67,7 @@ module elm_varcon real(r8) :: oneatm = 1.01325e5_r8 ! one standard atmospheric pressure [Pa] real(r8) :: bdsno = 250._r8 ! bulk density snow (kg/m**3) + real(r8) :: bdfirn = 730._r8 ! bulk density of deep firn (kg/m**3) real(r8) :: alpha_aero = 1.0_r8 ! constant for aerodynamic parameter weighting real(r8) :: tlsai_crit = 2.0_r8 ! critical value of elai+esai for which aerodynamic parameters are maximum real(r8) :: watmin = 0.01_r8 ! minimum soil moisture (mm) @@ -130,7 +131,7 @@ module elm_varcon real(r8) :: ac_wasteheat_factor = 0.0_r8 !wasteheat factor for urban air conditioning (-) real(r8) :: wasteheat_limit = 100._r8 !limit on wasteheat (W/m2) - real(r8) :: h2osno_max = 1000._r8 ! max allowed snow thickness (mm H2O) + real(r8) :: h2osno_max = 30000._r8 ! max allowed snow thickness (mm H2O) real(r8), parameter :: lapse_glcmec = 0.006_r8 ! surface temperature lapse rate (deg m-1) ! Pritchard et al. (GRL, 35, 2008) use 0.006 real(r8), parameter :: glcmec_rain_snow_threshold = SHR_CONST_TKFRZ ! temperature dividing rain & snow in downscaling (K) From 67625371c49535701ece5252d318044f443601ec Mon Sep 17 00:00:00 2001 From: Chloe Date: Thu, 21 Mar 2024 15:17:36 -0700 Subject: [PATCH 145/310] stylistic code mods --- .../elm/src/data_types/ColumnDataType.F90 | 58 +++++++++---------- components/elm/src/main/elm_instMod.F90 | 22 +++---- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/components/elm/src/data_types/ColumnDataType.F90 b/components/elm/src/data_types/ColumnDataType.F90 index 1793628598e..2d79412e568 100644 --- a/components/elm/src/data_types/ColumnDataType.F90 +++ b/components/elm/src/data_types/ColumnDataType.F90 @@ -1744,19 +1744,19 @@ subroutine col_ws_init(this, begc, endc, h2osno_input, snow_depth_input, watsat_ do j = -nlevsno+1, 0 if (j > col_pp%snl(c)) then if (use_extrasnowlayers) then - ! amschnei@uci.edu: Initialize "deep firn" on glacier columns - if (lun_pp%itype(l) == istice .or. lun_pp%itype(l) == istice_mec) then - this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdfirn - this%h2osoi_liq(c,j) = 0._r8 - else - this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdsno - this%h2osoi_liq(c,j) = 0._r8 - end if - else ! no firn model (default in v2) + ! amschnei@uci.edu: Initialize "deep firn" on glacier columns + if (lun_pp%itype(l) == istice .or. lun_pp%itype(l) == istice_mec) then + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdfirn + this%h2osoi_liq(c,j) = 0._r8 + else + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*bdsno + this%h2osoi_liq(c,j) = 0._r8 + end if + else ! no firn model (default in v2) ! Below, "250._r8" should instead be "bdsno", which is 250 kg m^3 by default - this%h2osoi_ice(c,j) = col_pp%dz(c,j)*250._r8 - this%h2osoi_liq(c,j) = 0._r8 - end if + this%h2osoi_ice(c,j) = col_pp%dz(c,j)*250._r8 + this%h2osoi_liq(c,j) = 0._r8 + end if end if end do end if @@ -5843,26 +5843,20 @@ subroutine col_wf_init(this, begc, endc) avgflag='A', long_name='column-integrated snow freezing rate', & ptr_col=this%qflx_snofrz, set_lake=spval, c2l_scale_type='urbanf', default='inactive') - !if (create_glacier_mec_landunit) then - this%qflx_glcice(begc:endc) = spval - call hist_addfld1d (fname='QICE', units='mm/s', & - avgflag='A', long_name='ice growth/melt', & - ptr_col=this%qflx_glcice, l2g_scale_type='ice') - !end if - - !if (create_glacier_mec_landunit) then - this%qflx_glcice_frz(begc:endc) = spval - call hist_addfld1d (fname='QICE_FRZ', units='mm/s', & - avgflag='A', long_name='ice growth', & - ptr_col=this%qflx_glcice_frz, l2g_scale_type='ice') - !end if - - !if (create_glacier_mec_landunit) then - this%qflx_glcice_melt(begc:endc) = spval - call hist_addfld1d (fname='QICE_MELT', units='mm/s', & - avgflag='A', long_name='ice melt', & - ptr_col=this%qflx_glcice_melt, l2g_scale_type='ice') - !end if + this%qflx_glcice(begc:endc) = spval + call hist_addfld1d (fname='QICE', units='mm/s', & + avgflag='A', long_name='ice growth/melt', & + ptr_col=this%qflx_glcice, l2g_scale_type='ice') + + this%qflx_glcice_frz(begc:endc) = spval + call hist_addfld1d (fname='QICE_FRZ', units='mm/s', & + avgflag='A', long_name='ice growth', & + ptr_col=this%qflx_glcice_frz, l2g_scale_type='ice') + + this%qflx_glcice_melt(begc:endc) = spval + call hist_addfld1d (fname='QICE_MELT', units='mm/s', & + avgflag='A', long_name='ice melt', & + ptr_col=this%qflx_glcice_melt, l2g_scale_type='ice') ! As defined here, snow_sources - snow_sinks will equal the change in h2osno at any ! given time step but only if there is at least one snow layer (for all landunits diff --git a/components/elm/src/main/elm_instMod.F90 b/components/elm/src/main/elm_instMod.F90 index d14d6ba3f10..b8afca87e24 100644 --- a/components/elm/src/main/elm_instMod.F90 +++ b/components/elm/src/main/elm_instMod.F90 @@ -319,17 +319,17 @@ subroutine elm_inst_biogeophys(bounds_proc) h2osno_col(c) = 0._r8 endif snow_depth_col(c) = h2osno_col(c) / bdsno - else ! With a deeper firn model, we can no longer depend on "h2osno_max," because this will - ! potentially be large, resulting in a lot of artificial firn at initialization. ! - ! amschnei@uci.edu: UPDATE - By including a new parameter, bdfirn, we can - ! initialize a dense (e.g, 730 kd m^-3) "deep firn" layer for glacier - ! land units. This deep firn layer can be set to half of the total - ! maximum allotted snowpack mass (i.e., "h2osno_max"), which effectively - ! sets the Greenland and Antarctic ice sheets' (and mountain glaciers') - ! climatic (aka surface) mass balance (SMB) initial condition to 0. With this - ! cold start condition, a multi-decadal (100 to 300 years or more) - ! spin up is first required to prognose nonzero SMB. - ! + else! With a deeper firn model, we can no longer depend on "h2osno_max," because this will + ! potentially be large, resulting in a lot of artificial firn at initialization. ! + ! amschnei@uci.edu: UPDATE - By including a new parameter, bdfirn, we can + ! initialize a dense (e.g, 730 kd m^-3) "deep firn" layer for glacier + ! land units. This deep firn layer can be set to half of the total + ! maximum allotted snowpack mass (i.e., "h2osno_max"), which effectively + ! sets the Greenland and Antarctic ice sheets' (and mountain glaciers') + ! climatic (aka surface) mass balance (SMB) initial condition to 0. With this + ! cold start condition, a multi-decadal (100 to 300 years or more) + ! spin up is first required to prognose nonzero SMB. + ! ! However... (below docstring from CLMv5) ! In areas that should be snow-covered, it can be problematic to start with 0 snow ! cover, because this can affect the long-term state through soil heating, albedo From db67eb039f0da97fa141c9650c262f6d2274fdf2 Mon Sep 17 00:00:00 2001 From: Chloe Date: Tue, 26 Mar 2024 12:47:41 -0700 Subject: [PATCH 146/310] mod to use_extrasnowlayers tuning to be BFB --- components/elm/src/biogeophys/SnowSnicarMod.F90 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/elm/src/biogeophys/SnowSnicarMod.F90 b/components/elm/src/biogeophys/SnowSnicarMod.F90 index abaa72d0a5f..b0965762207 100644 --- a/components/elm/src/biogeophys/SnowSnicarMod.F90 +++ b/components/elm/src/biogeophys/SnowSnicarMod.F90 @@ -1441,6 +1441,12 @@ subroutine SnowAge_grain(bounds, & newsnow = max(0._r8, (qflx_snow_grnd_col(c_idx)*dtime)) endif + if (use_extrasnowlayers) then + snw_rds_refrz = 1500._r8 + else + snw_rds_refrz = 1000._r8 + endif + ! snow that has re-frozen [kg/m2] refrzsnow = max(0._r8, (qflx_snofrz_lyr(c_idx,i)*dtime)) From 0bbb3b9153886a90aca685fc53b773a95e2d56a4 Mon Sep 17 00:00:00 2001 From: Chloe Date: Mon, 1 Apr 2024 13:08:57 -0700 Subject: [PATCH 147/310] bug fixes to get B4B --- components/elm/src/biogeophys/SnowSnicarMod.F90 | 2 +- components/elm/src/main/elm_varcon.F90 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/elm/src/biogeophys/SnowSnicarMod.F90 b/components/elm/src/biogeophys/SnowSnicarMod.F90 index b0965762207..d6d6de75ffa 100644 --- a/components/elm/src/biogeophys/SnowSnicarMod.F90 +++ b/components/elm/src/biogeophys/SnowSnicarMod.F90 @@ -80,7 +80,7 @@ module SnowSnicarMod integer, parameter :: snw_rds_max_tbl = 1500 ! maximum effective radius defined in Mie lookup table [microns] integer, parameter :: snw_rds_min_tbl = 30 ! minimium effective radius defined in Mie lookup table [microns] real(r8), parameter :: snw_rds_max = 1500._r8 ! maximum allowed snow effective radius [microns] - real(r8), parameter :: snw_rds_refrz = 1500._r8 ! effective radius of re-frozen snow [microns] + real(r8) :: snw_rds_refrz = 1000._r8 ! effective radius of re-frozen snow [microns] !$acc declare copyin(snw_rds_max_tbl) !$acc declare copyin(snw_rds_min_tbl) !$acc declare copyin(snw_rds_max ) diff --git a/components/elm/src/main/elm_varcon.F90 b/components/elm/src/main/elm_varcon.F90 index 2fcf09dbf8a..01df6ce0afd 100644 --- a/components/elm/src/main/elm_varcon.F90 +++ b/components/elm/src/main/elm_varcon.F90 @@ -131,7 +131,7 @@ module elm_varcon real(r8) :: ac_wasteheat_factor = 0.0_r8 !wasteheat factor for urban air conditioning (-) real(r8) :: wasteheat_limit = 100._r8 !limit on wasteheat (W/m2) - real(r8) :: h2osno_max = 30000._r8 ! max allowed snow thickness (mm H2O) + real(r8) :: h2osno_max = 1000._r8 ! max allowed snow thickness (mm H2O) real(r8), parameter :: lapse_glcmec = 0.006_r8 ! surface temperature lapse rate (deg m-1) ! Pritchard et al. (GRL, 35, 2008) use 0.006 real(r8), parameter :: glcmec_rain_snow_threshold = SHR_CONST_TKFRZ ! temperature dividing rain & snow in downscaling (K) @@ -249,7 +249,7 @@ subroutine elm_varcon_init() allocate( dzsoifl(1:nlevsoifl )) if (use_extrasnowlayers) then - h2osno_max = 10000._r8 + h2osno_max = 30000._r8 end if end subroutine elm_varcon_init From bebb944912f82c1d74e16ff8b902f9ac0bc8937b Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Fri, 12 Apr 2024 21:57:01 -0500 Subject: [PATCH 148/310] usage of export list from AV calling mct_aVect_exportRList2c on an empty r attribute AV caused runtime errors in debug mode, on gnu compilers check the size of attribute first --- driver-mct/main/seq_map_mod.F90 | 6 +++-- driver-moab/main/prep_rof_mod.F90 | 38 ++++++++++++++++--------------- driver-moab/main/seq_map_mod.F90 | 9 +++++--- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/driver-mct/main/seq_map_mod.F90 b/driver-mct/main/seq_map_mod.F90 index 13623d0b920..0eaa45296d9 100644 --- a/driver-mct/main/seq_map_mod.F90 +++ b/driver-mct/main/seq_map_mod.F90 @@ -910,9 +910,11 @@ subroutine seq_map_avNormArr(mapper, av_i, av_o, norm_i, rList, norm, omit_nonli call mct_aVect_init(avp_i, rList=trim( rList)//trim(appnd), lsize=lsize_i) call mct_aVect_init(avp_o, rList=trim( rList)//trim(appnd), lsize=lsize_o) else - lrList = mct_aVect_exportRList2c(av_i) + lrList = '' + if(mct_aVect_nRAttr(av_i) /= 0) lrList = mct_aVect_exportRList2c(av_i) call mct_aVect_init(avp_i, rList=trim(lrList)//trim(appnd), lsize=lsize_i) - lrList = mct_aVect_exportRList2c(av_o) + lrList = '' + if(mct_aVect_nRAttr(av_o) /= 0) lrList = mct_aVect_exportRList2c(av_o) call mct_aVect_init(avp_o, rList=trim(lrList)//trim(appnd), lsize=lsize_o) endif diff --git a/driver-moab/main/prep_rof_mod.F90 b/driver-moab/main/prep_rof_mod.F90 index a8cce9455a4..54aa8c539af 100644 --- a/driver-moab/main/prep_rof_mod.F90 +++ b/driver-moab/main/prep_rof_mod.F90 @@ -264,8 +264,9 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) l2racc_lx_cnt = 0 #ifdef HAVE_MOAB ! this l2racc_lm will be over land size ? - sharedFieldsLndRof=trim( mct_aVect_exportRList2c(l2racc_lx(1)) ) + sharedFieldsLndRof='' nfields_sh_lr = mct_aVect_nRAttr(l2racc_lx(1)) + if( nfields_sh_lr /= 0 ) sharedFieldsLndRof=trim( mct_aVect_exportRList2c(l2racc_lx(1)) ) tagname = trim(sharedFieldsLndRof)//C_NULL_CHAR ! find the size of land mesh locally ! find out the number of local elements in moab mesh lnd instance on coupler @@ -340,12 +341,12 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) call shr_sys_abort(subname//' ERROR in computing comm graph , lnd-rof') endif ! context for rearrange is target in this case - if ( mapper_Fl2r%src_mbid .gt. -1 ) then - if (iamroot_CPLID) then - write(logunit,F00) 'overwriting '//trim(mapper_Fl2r%mbname) & - //' mapper_Fl2r' - endif - endif + if ( mapper_Fl2r%src_mbid .gt. -1 ) then + if (iamroot_CPLID) then + write(logunit,F00) 'overwriting '//trim(mapper_Fl2r%mbname) & + //' mapper_Fl2r' + endif + endif mapper_Fl2r%src_mbid = mblxid mapper_Fl2r%tgt_mbid = mbrxid mapper_Fl2r%src_context = lnd(1)%cplcompid @@ -373,12 +374,12 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) call shr_sys_abort(subname//' ERROR in computing comm graph for second hop, lnd-rof') endif ! now take care of the mapper - if ( mapper_Fl2r%src_mbid .gt. -1 ) then - if (iamroot_CPLID) then - write(logunit,F00) 'overwriting '//trim(mapper_Fl2r%mbname) & - //' mapper_Fl2r' - endif - endif + if ( mapper_Fl2r%src_mbid .gt. -1 ) then + if (iamroot_CPLID) then + write(logunit,F00) 'overwriting '//trim(mapper_Fl2r%mbname) & + //' mapper_Fl2r' + endif + endif mapper_Fl2r%src_mbid = mblxid mapper_Fl2r%tgt_mbid = mbrxid mapper_Fl2r%intx_mbid = mbintxlr @@ -435,7 +436,6 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) endif #endif end if ! if ((mblxid .ge. 0) .and. (mbrxid .ge. 0)) - ! endif HAVE_MOAB endif ! samegrid_lr #endif ! We'll map irrigation specially, so exclude this from the list of l2r fields @@ -469,9 +469,10 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) a2racc_ax_cnt = 0 #ifdef HAVE_MOAB ! this a2racc_am will be over atm size - sharedFieldsAtmRof=trim( mct_aVect_exportRList2c(a2racc_ax(1)) ) - tagname = trim(sharedFieldsAtmRof)//C_NULL_CHAR + sharedFieldsAtmRof='' nfields_sh_ar = mct_aVect_nRAttr(a2racc_ax(1)) + if (nfields_sh_ar /= 0 ) sharedFieldsAtmRof = trim( mct_aVect_exportRList2c(a2racc_ax(1)) ) + tagname = trim(sharedFieldsAtmRof)//C_NULL_CHAR ! find the size of atm mesh locally ! find out the number of local elements in moab mesh atm instance on coupler ierr = iMOAB_GetMeshInfo ( mbaxid, nvert, nvise, nbl, nsurf, nvisBC ) @@ -675,9 +676,10 @@ subroutine prep_rof_init(infodata, lnd_c2_rof, atm_c2_rof, ocn_c2_rof) #ifdef HAVE_MOAB ! this o2racc_om will be over ocn size - sharedFieldsOcnRof=trim( mct_aVect_exportRList2c(o2racc_ox(1)) ) - tagname = trim(sharedFieldsOcnRof)//C_NULL_CHAR + sharedFieldsOcnRof='' nfields_sh_or = mct_aVect_nRAttr(o2racc_ox(1)) + if ( nfields_sh_or /= 0 ) sharedFieldsOcnRof = trim( mct_aVect_exportRList2c(o2racc_ox(1)) ) + tagname = trim(sharedFieldsOcnRof)//C_NULL_CHAR ! find the size of ocn mesh locally ! find out the number of local elements in moab mesh ocn instance on coupler diff --git a/driver-moab/main/seq_map_mod.F90 b/driver-moab/main/seq_map_mod.F90 index 82da0474402..be47473f444 100644 --- a/driver-moab/main/seq_map_mod.F90 +++ b/driver-moab/main/seq_map_mod.F90 @@ -423,7 +423,8 @@ subroutine seq_map_map( mapper, av_s, av_d, fldlist, norm, avwts_s, avwtsfld_s, else ! Extract character strings from attribute vector nfields = mct_aVect_nRAttr(av_s) - fldlist_moab = trim(mct_aVect_exportRList2c(av_s)) + fldlist_moab = '' + if ( nfields /= 0 ) fldlist_moab = trim(mct_aVect_exportRList2c(av_s)) endif if (mbnorm) then @@ -1244,9 +1245,11 @@ subroutine seq_map_avNormArr(mapper, av_i, av_o, norm_i, rList, norm) call mct_aVect_init(avp_i, rList=trim( rList)//trim(appnd), lsize=lsize_i) call mct_aVect_init(avp_o, rList=trim( rList)//trim(appnd), lsize=lsize_o) else - lrList = mct_aVect_exportRList2c(av_i) + lrList = '' + if(mct_aVect_nRAttr(av_i) /= 0) lrList = mct_aVect_exportRList2c(av_i) call mct_aVect_init(avp_i, rList=trim(lrList)//trim(appnd), lsize=lsize_i) - lrList = mct_aVect_exportRList2c(av_o) + lrList = '' + if(mct_aVect_nRAttr(av_o) /= 0) lrList = mct_aVect_exportRList2c(av_o) call mct_aVect_init(avp_o, rList=trim(lrList)//trim(appnd), lsize=lsize_o) endif From 493409551fecdb66d85afc428b37af5bcefbaf11 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Sat, 13 Apr 2024 12:45:43 -0400 Subject: [PATCH 149/310] add a config to override line-length rule --- .github/workflows/e3sm-gh-md-linter.yml | 1 + docs/.markdownlint.json | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 docs/.markdownlint.json diff --git a/.github/workflows/e3sm-gh-md-linter.yml b/.github/workflows/e3sm-gh-md-linter.yml index 50bc13bd4b8..6484335213d 100644 --- a/.github/workflows/e3sm-gh-md-linter.yml +++ b/.github/workflows/e3sm-gh-md-linter.yml @@ -23,5 +23,6 @@ jobs: - uses: DavidAnson/markdownlint-cli2-action@v16 if: steps.changed-files.outputs.any_changed == 'true' with: + config: 'docs/.markdownlint.json' globs: ${{ steps.changed-files.outputs.all_changed_files }} separator: "," diff --git a/docs/.markdownlint.json b/docs/.markdownlint.json new file mode 100644 index 00000000000..feec355226e --- /dev/null +++ b/docs/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "line-length": false +} From cc5f0bd1c118177c84ac30a42c101d8a8b95ebbb Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Sat, 13 Apr 2024 15:12:59 -0500 Subject: [PATCH 150/310] Updates the tests to only use 1-month of DATM data --- cime_config/tests.py | 4 +-- .../testmods_dirs/elm/era5/shell_commands | 3 ++ .../era5/user_datm.streams.txt.ELMERA5.d2m | 35 +++++++++++++++++++ .../era5/user_datm.streams.txt.ELMERA5.mcpr | 35 +++++++++++++++++++ .../era5/user_datm.streams.txt.ELMERA5.mlspr | 35 +++++++++++++++++++ .../user_datm.streams.txt.ELMERA5.msdfswrf | 35 +++++++++++++++++++ .../user_datm.streams.txt.ELMERA5.msdrswrf | 35 +++++++++++++++++++ .../user_datm.streams.txt.ELMERA5.msdwlwrf | 35 +++++++++++++++++++ .../elm/era5/user_datm.streams.txt.ELMERA5.sp | 35 +++++++++++++++++++ .../era5/user_datm.streams.txt.ELMERA5.t2m | 35 +++++++++++++++++++ .../era5/user_datm.streams.txt.ELMERA5.w10 | 35 +++++++++++++++++++ .../testmods_dirs/elm/era56hr/shell_commands | 4 +++ .../era56hr/user_datm.streams.txt.ERA56HR.d2m | 35 +++++++++++++++++++ .../user_datm.streams.txt.ERA56HR.mcpr | 35 +++++++++++++++++++ .../user_datm.streams.txt.ERA56HR.mlspr | 35 +++++++++++++++++++ .../user_datm.streams.txt.ERA56HR.msdfswrf | 35 +++++++++++++++++++ .../user_datm.streams.txt.ERA56HR.msdrswrf | 35 +++++++++++++++++++ .../user_datm.streams.txt.ERA56HR.msdwlwrf | 35 +++++++++++++++++++ .../era56hr/user_datm.streams.txt.ERA56HR.sp | 35 +++++++++++++++++++ .../era56hr/user_datm.streams.txt.ERA56HR.t2m | 35 +++++++++++++++++++ .../era56hr/user_datm.streams.txt.ERA56HR.w10 | 35 +++++++++++++++++++ 21 files changed, 639 insertions(+), 2 deletions(-) create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m create mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 diff --git a/cime_config/tests.py b/cime_config/tests.py index 7c3f9529574..e8baefad2eb 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -48,8 +48,8 @@ "ERS.f19_g16.I1850GSWCNPECACNTBC.elm-eca_f19_g16_I1850GSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPECACNTBC.elm-eca_f19_g16_I20TRGSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPRDCTCBC.elm-ctc_f19_g16_I20TRGSWCNPRDCTCBC", - "ERS.f19_g16.IERA5ELM", - "ERS.f19_g16.IERA56HRELM", + "ERS.f19_g16.IERA5ELM.elm-era5", + "ERS.f19_g16.IERA56HRELM.elm-er56hr", ) }, diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands new file mode 100644 index 00000000000..b69b9cd6ee9 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands @@ -0,0 +1,3 @@ +CASEDIR=`./xmlquery CASEROOT --value` +SRCROOT=`./xmlquery SRCROOT --value` +cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.* $CASEDIR diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m new file mode 100644 index 00000000000..bae3cf6a147 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + d2m tdew + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew + + + elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr new file mode 100644 index 00000000000..5413ff5ccbd --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + mcpr precc + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + + + elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr new file mode 100644 index 00000000000..9696d75511e --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + mlspr precl + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + + + elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf new file mode 100644 index 00000000000..8229e921e0c --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdfswrf swdndf + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + + + elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc + + + -3600 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf new file mode 100644 index 00000000000..42ec79040ca --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdrswrf swdndr + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + + + elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc + + + -3600 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf new file mode 100644 index 00000000000..e4aa32907a0 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdwlwrf lwdn + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn + + + elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp new file mode 100644 index 00000000000..dec0ed40e09 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + sp pbot + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot + + + elmforc.ERA5.c2018.0.25d.sp.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m new file mode 100644 index 00000000000..c65b62c9399 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + t2m tbot + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot + + + elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 new file mode 100644 index 00000000000..e66da30e438 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + w10 wind + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind + + + elmforc.ERA5.c2018.0.25d.w10.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands new file mode 100644 index 00000000000..13c1a77803f --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands @@ -0,0 +1,4 @@ +CASEDIR=`./xmlquery CASEROOT --value` +SRCROOT=`./xmlquery SRCROOT --value` +cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.* $CASEDIR + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m new file mode 100644 index 00000000000..b40af4edcd5 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + d2m tdew + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew + + + elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr new file mode 100644 index 00000000000..697ac03f515 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + mcpr precc + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + + + elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr new file mode 100644 index 00000000000..f0f622cb54b --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + mlspr precl + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + + + elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf new file mode 100644 index 00000000000..78391fe9729 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdfswrf swdndf + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + + + elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc + + + -21600 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf new file mode 100644 index 00000000000..e49c036d486 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdrswrf swdndr + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + + + elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc + + + -21600 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf new file mode 100644 index 00000000000..cfff16d580d --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + msdwlwrf lwdn + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn + + + elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc + + + -60 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp new file mode 100644 index 00000000000..692b57e1b02 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + sp pbot + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot + + + elmforc.ERA5.c2018.0.25d.sp.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m new file mode 100644 index 00000000000..f214f84e2a5 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + t2m tbot + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot + + + elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc + + + 0 + + + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 new file mode 100644 index 00000000000..42cbd413863 --- /dev/null +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 @@ -0,0 +1,35 @@ + + + + GENERIC + + + + time time + xc lon + yc lat + area area + mask mask + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + + + domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc + + + + + w10 wind + + + /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind + + + elmforc.ERA5.c2018.0.25d.w10.1979-01.nc + + + 0 + + + From 801afeec9a866ac44977176fd2fe779fe4a65c42 Mon Sep 17 00:00:00 2001 From: Ryan Knox Date: Mon, 15 Apr 2024 15:35:56 -0400 Subject: [PATCH 151/310] Update elmfates_interfaceMod.F90 --- components/elm/src/main/elmfates_interfaceMod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/src/main/elmfates_interfaceMod.F90 b/components/elm/src/main/elmfates_interfaceMod.F90 index d12704ee1e2..9b9fbc6e390 100644 --- a/components/elm/src/main/elmfates_interfaceMod.F90 +++ b/components/elm/src/main/elmfates_interfaceMod.F90 @@ -520,7 +520,7 @@ subroutine ELMFatesGlobals2() call set_fates_ctrlparms('num_lu_harvest_cats',ival=pass_num_lu_harvest_types) call set_fates_ctrlparms('use_logging',ival=pass_logging) - if(use_fates_luh) then + if (use_fates_luh) then pass_use_luh = 1 pass_num_luh_states = num_landuse_state_vars pass_num_luh_transitions = num_landuse_transition_vars From 7d55c63d4baee8931a831c531972fa95137c040e Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Mon, 15 Apr 2024 14:14:24 -0700 Subject: [PATCH 152/310] add new tool to replace gen_domain in cime --- tools/generate_domain_files_E3SM.py | 336 ++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 tools/generate_domain_files_E3SM.py diff --git a/tools/generate_domain_files_E3SM.py b/tools/generate_domain_files_E3SM.py new file mode 100644 index 00000000000..9b24d6ab319 --- /dev/null +++ b/tools/generate_domain_files_E3SM.py @@ -0,0 +1,336 @@ +#!/usr/bin/env python3 +#------------------------------------------------------------------------------- +''' +This is a replacement for the legacy gen_domain tool created for CESM. +Most legacy functionality is reproduced, with the notable exception of +the pole point latitude adjustment needed for the CESM FV grid. + +Created April, 2024 by Walter Hannah (LLNL) +''' +#------------------------------------------------------------------------------- +''' +The map file used to generate the domain files can be created a few different ways. +For a typical E3SM configuration we recommend using a conservative, monotone map. +Here is an example command that can be used to generate one as of NCO version 5.2.2 + + ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} + +''' +#------------------------------------------------------------------------------- +import datetime, os, numpy as np, xarray as xr, numba, itertools +user, host = os.getenv('USER'), os.getenv('HOST') +source_code_meta = 'generate_domain_E3SM.py' +#------------------------------------------------------------------------------- +class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m','\033[36m' +#------------------------------------------------------------------------------- +usage = ''' +python generate_domain_files_E3SM.py -m + -o + -l + [--fminval ] + [--fmaxval ] + [--set-omask] + +Purpose: + For "bi-grid" configurations of E3SM (land grid is same as atmos): + Given a mapping file from the ocean grid (where the mask is defined) + to the atmosphere grid, this tool creates land and ocean domain files + needed by data model components (ex. datm, dlnd, docn) + + For "tr-grid" configurations of E3SM (land grid is different from atmos/ocn): + In addition to running this tool with the ocn->atm map as above, + a second iteration is needed with a similar ocn->lnd map. + +The following output domain files are created: + + domain.lnd._..nc + land domain file on the land/atmos grid with a land fraction + corresponding to (1-ocnfrac) mask mapped to the land grid + + domain.ocn._..nc + ocean domain on the land/atmos grid with an ocean fraction based + on the ocean grid mask mapped to the land/atmos grid for when + atm,lnd,ice,ocn are all on the same grid + (not compatible with MPAS sea-ice) + + domain.ocn...nc + ocean domain on the ocean grid +''' +from optparse import OptionParser +parser = OptionParser(usage=usage) +parser.add_option('-m', + dest='map_file', + default=None, + help='Input mapping file from ocean to atmosphere grid - '+\ + 'This is the primary source from which the ocean and'+\ + 'land domains will be determined') +parser.add_option('-l', + dest='lnd_grid', + default=None, + help='Output land grid name') +parser.add_option('-o', + dest='ocn_grid', + default=None, + help='Output ocean grid name') +parser.add_option('--output-root', + dest='output_root', + default='./', + help='Output path for domain files') +parser.add_option('--date-stamp', + dest='date_stamp', + default=None, + help='Creation date stamp for domain files') +parser.add_option('--fminval', + dest='fminval', + default=0, + help='Minimum allowable land fraction (reset to 0 below fminval)') +parser.add_option('--fmaxval', + dest='fmaxval', + default=1, + help='Maximum allowable land fraction (reset to 1 above fmaxval)') +parser.add_option('--set-omask', + dest='set_omask', + default=False, + action='store_true', + help='If True then an ocean mask is not required and will '+\ + 'simply be set to a vector of 1\'s if mask_a is not '+\ + 'present in the input mapping file. If --set-omask is '+\ + 'omitted, then mask_a is required and an error will be '+\ + 'raised if it does not exist in the input mapping file.') +(opts, args) = parser.parse_args() +#------------------------------------------------------------------------------- +# check for valid input arguments +if opts.map_file is None: + raise ValueError(f'{clr.RED}input map file was not specified{clr.END}') +if opts.lnd_grid is None: + raise ValueError(f'{clr.RED}land grid name was not specified{clr.END}') +if opts.ocn_grid is None: + raise ValueError(f'{clr.RED}ocean grid name was not specified{clr.END}') +if not os.path.exists(opts.output_root) : + raise ValueError(f'{clr.RED}Output root path does not exist{clr.END}') +#------------------------------------------------------------------------------- +# define constants +eps = 1.0e-12 +# Set date stamp for file name +if opts.date_stamp is None: + cdate = datetime.datetime.utcnow().strftime('%Y%m%d') +else: + cdate = opts.date_stamp +#------------------------------------------------------------------------------- +# specify output file names +domain_file_ocn_on_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' +domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' +domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + +fn1_out_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' +fn2_out_lnd = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' +fn2_out_ocn = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' +#------------------------------------------------------------------------------- +# print some informative stuff +print(f''' +Input files and parameter values: + {clr.GREEN}map_file {clr.END}: {opts.map_file} + {clr.GREEN}lnd_grid {clr.END}: {opts.lnd_grid} + {clr.GREEN}ocn_grid {clr.END}: {opts.ocn_grid} + {clr.GREEN}fminval {clr.END}: {opts.fminval} + {clr.GREEN}fmaxval {clr.END}: {opts.fmaxval} + {clr.GREEN}set_omask {clr.END}: {opts.set_omask} + {clr.GREEN}eps {clr.END}: {eps} +''') +#--------------------------------------------------------------------------------------------------- +def add_metadata(ds): + # add variable attirbutes + ds_out['xc'] = ds_out['xc'].assign_attrs({'long_name':'longitude of grid cell center'}) + ds_out['xc'] = ds_out['xc'].assign_attrs({'units':'degrees_east'}) + ds_out['xc'] = ds_out['xc'].assign_attrs({'bounds':'xv'}) + + ds_out['yc'] = ds_out['yc'].assign_attrs({'long_name':'latitude of grid cell center'}) + ds_out['yc'] = ds_out['yc'].assign_attrs({'units':'degrees_north'}) + ds_out['yc'] = ds_out['yc'].assign_attrs({'bounds':'yv'}) + + ds_out['xv'] = ds_out['xv'].assign_attrs({'long_name':'longitude of grid cell verticies'}) + ds_out['xv'] = ds_out['xv'].assign_attrs({'units':'degrees_east'}) + + ds_out['yv'] = ds_out['yv'].assign_attrs({'long_name':'latitude of grid cell verticies'}) + ds_out['yv'] = ds_out['yv'].assign_attrs({'units':'degrees_north'}) + + ds_out['area'] = ds_out['area'].assign_attrs({'long_name':'area of grid cell in radians squared'}) + ds_out['area'] = ds_out['area'].assign_attrs({'units':'radian2'}) + ds_out['area'] = ds_out['area'].assign_attrs({'coordinates':'xc yc'}) + + ds_out['frac'] = ds_out['frac'].assign_attrs({'long_name':'fraction of grid cell that is active'}) + ds_out['frac'] = ds_out['frac'].assign_attrs({'units':'unitless'}) + ds_out['frac'] = ds_out['frac'].assign_attrs({'coordinates':'xc yc'}) + ds_out['frac'] = ds_out['frac'].assign_attrs({'filter1':f'error if frac> 1.0+eps or frac < 0.0-eps; eps = {eps}'}) + ds_out['frac'] = ds_out['frac'].assign_attrs({'filter2':f'limit frac to [fminval,fmaxval]; fminval={opts.fminval} fmaxval={opts.fmaxval}'}) + + ds_out['mask'] = ds_out['mask'].assign_attrs({'long_name':'domain mask'}) + ds_out['mask'] = ds_out['mask'].assign_attrs({'units':'unitless'}) + ds_out['mask'] = ds_out['mask'].assign_attrs({'coordinates':'xc yc'}) + ds_out['mask'] = ds_out['mask'].assign_attrs({'comment':'0 value indicates cell is not active'}) + # add global attributes + ds.attrs['title'] = 'E3SM domain data' + ds.attrs['Conventions'] = 'CF-1.0' + ds.attrs['source_code'] = source_code_meta + ds.attrs['hostname'] = host + ds.attrs['history'] = f'created by {user}, '+datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') + ds.attrs['source'] = opts.map_file + ds.attrs['map_domain_a'] = domain_a_grid_file + ds.attrs['map_domain_b'] = domain_b_grid_file + ds.attrs['map_grid_file_ocn'] = ocn_grid_file + ds.attrs['map_grid_file_atm'] = atm_grid_file +#--------------------------------------------------------------------------------------------------- +def get_mask(ds,opts,suffix): + mask_var_name = 'mask'+suffix + if mask_var_name in ds.variables: + mask_tmp = ds[mask_var_name] + else: + if opts.set_omask: + # set mask=1 everywhere + mask_tmp = xr.ones_like(ds['area'+suffix]) + else: + raise ValueError(f'{clr.RED}{mask_var_name} does not exist in input map file{clr.END}') + return mask_tmp +#--------------------------------------------------------------------------------------------------- +@numba.njit() +def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): + for k in range(n_s): + ofrac[row[k]] = ofrac[row[k]] + frac_a[col[k]] * S[k] + return ofrac +#--------------------------------------------------------------------------------------------------- + +# open map file as dataset +ds = xr.open_dataset(opts.map_file) + +#------------------------------------------------------------------------------- +# read grid meta-data from map file + +domain_a_grid_file = 'unknown' +domain_b_grid_file = 'unknown' +ocn_grid_file = 'unknown' +atm_grid_file = 'unknown' + +if 'domain_a' in ds.attrs.keys(): domain_a_grid_file = ds.attrs['domain_a'] +if 'domain_b' in ds.attrs.keys(): domain_b_grid_file = ds.attrs['domain_b'] + +if 'grid_file_ocn' in ds.attrs.keys(): + ocn_grid_file = ds.attrs['grid_file_ocn'] +else: + ocn_grid_file = ds.attrs['grid_file_src'] + +if 'grid_file_ocn' in ds.attrs.keys(): + atm_grid_file = ds.attrs['grid_file_atm'] +else: + atm_grid_file = ds.attrs['grid_file_dst'] + +print(f''' +Grid information from map file: + {clr.CYAN}domain_a file {clr.END}: {domain_a_grid_file} + {clr.CYAN}domain_b file {clr.END}: {domain_b_grid_file} + {clr.CYAN}ocn_grid_file {clr.END}: {ocn_grid_file} + {clr.CYAN}atm_grid_file {clr.END}: {atm_grid_file} + {clr.CYAN}ocn grid size (n_a){clr.END}: {len(ds.n_a)} + {clr.CYAN}atm grid size (n_b){clr.END}: {len(ds.n_b)} + {clr.CYAN}sparse mat size (n_s){clr.END}: {len(ds.n_s)} +''') + +#------------------------------------------------------------------------------- +# Create ocean domain on ocean grid (fn1_out_ocn) + +# Get ocn mask on ocn grid +omask = get_mask(ds,opts,suffix='_a') +ofrac = xr.zeros_like(ds['area_a']) + +ds_out = xr.Dataset() +ds_out['xc'] = ds['xc_a'] .expand_dims(dim='nj').rename({'n_a':'ni'}) +ds_out['yc'] = ds['yc_a'] .expand_dims(dim='nj').rename({'n_a':'ni'}) +ds_out['xv'] = ds['xv_a'] .expand_dims(dim='nj').rename({'n_a':'ni','nv_a':'nv'}) +ds_out['yv'] = ds['yv_a'] .expand_dims(dim='nj').rename({'n_a':'ni','nv_a':'nv'}) +ds_out['area'] = ds['area_a'].expand_dims(dim='nj').rename({'n_a':'ni'}) +ds_out['frac'] = ofrac .expand_dims(dim='nj').rename({'n_a':'ni'}) +ds_out['mask'] = omask .expand_dims(dim='nj').rename({'n_a':'ni'}) +add_metadata(ds_out) +ds_out.to_netcdf(path=fn1_out_ocn,mode='w') + +print(f'successfully created domain file: {clr.MAGENTA}{fn1_out_ocn}{clr.END}') + +#------------------------------------------------------------------------------- +# Create land and ocean domains on atmosphere grid ( fn2_out_lnd / fn2_out_ocn ) + +xc = ds['xc_b'] +yc = ds['yc_b'] +xv = ds['xv_b'] +yv = ds['yv_b'] +area = ds['area_b'] + +mask_a = get_mask(ds,opts,suffix='_a') +frac_a = xr.where( mask_a!=0, xr.ones_like(ds['area_a']), xr.zeros_like(ds['area_a']) ) + +# compute ocn fraction on atm grid +ofrac = compute_ofrac_on_atm( len(ds['n_s']), np.zeros(ds['area_b'].shape), + frac_a.values, ds['S'].values, + ds['row'].values-1, ds['col'].values-1 ) +ofrac = xr.DataArray(ofrac,dims=['n_b']) + +# lfrac is area frac of mask "_a" on grid "_b" or float(mask) +lfrac = xr.zeros_like(ds['area_b']) + +# convert to land fraction +lfrac_min = opts.fmaxval +lfrac_max = opts.fminval +omask = xr.ones_like(ds['area_b'],dtype=int32) +lmask = xr.zeros_like(ds['area_b'],dtype=int32) +lfrac = 1 - ofrac +lfrac_min = lfrac.min().values +lfrac_max = lfrac.max().values +lfrac = xr.where( lfrac>opts.fmaxval, 1, lfrac ) +lfrac = xr.where( lfrac Date: Mon, 15 Apr 2024 17:27:47 -0400 Subject: [PATCH 153/310] run F gh/ci only if eam/elm/coupler mods --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index ff9263f9fc7..7dbf2abcd52 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -3,6 +3,18 @@ name: gh on: pull_request: branches: [ master ] + paths: + # first, yes to these + - 'cime_config/**' + - 'components/eam/**' + - 'components/elm/**' + - 'driver-moab/**' + - 'driver-mct/**' + # second, no to these + - '!components/eam/docs/**' + - '!components/eam/mkdocs.yml' + - '!components/elm/docs/**' + - '!components/elm/mkdocs.yml' workflow_dispatch: From 558eb58c731daa935323bc3a77d3ea67215c1a6a Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Mon, 15 Apr 2024 17:30:51 -0400 Subject: [PATCH 154/310] remove gh/ci edits to incorporate them in a separate PR --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index b8b0ec45e61..ff9263f9fc7 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -3,16 +3,6 @@ name: gh on: pull_request: branches: [ master ] - paths: - # first, yes to these - - 'cime_config/**' - - 'components/eam/**' - - 'components/elm/**' - # second, no to these - - '!components/eam/docs/**' - - '!components/eam/mkdocs.yml' - - '!components/elm/docs/**' - - '!components/elm/mkdocs.yml' workflow_dispatch: From cf7f4bee951b06dc51e47c431ee4fa6639347513 Mon Sep 17 00:00:00 2001 From: Aaron Donahue Date: Mon, 15 Apr 2024 16:53:14 -0700 Subject: [PATCH 155/310] add missing subversion module to machine configs for quartz and ruby --- cime_config/machines/config_machines.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index af4b689a90d..c5b3d0d562d 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2942,6 +2942,7 @@ netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 screamML-venv/0.0.1 + subversion $CIME_OUTPUT_ROOT/$CASE/run @@ -2997,6 +2998,7 @@ netcdf-fortran/4.6.0 parallel-netcdf/1.12.3 screamML-venv/0.0.1 + subversion $CIME_OUTPUT_ROOT/$CASE/run From 46f0bb3252336840d9ed4509b7f9eb98c84a7def Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Tue, 16 Apr 2024 09:32:50 -0400 Subject: [PATCH 156/310] add WCYCL2010NS compset --- cime_config/allactive/config_compsets.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cime_config/allactive/config_compsets.xml b/cime_config/allactive/config_compsets.xml index 637facc327d..0d0bcb11af0 100755 --- a/cime_config/allactive/config_compsets.xml +++ b/cime_config/allactive/config_compsets.xml @@ -70,6 +70,12 @@ 1850_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV + + + WCYCL2010NS + 2010_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV + + WCYCL1950 1950SOI_EAM%CMIP6_ELM%CNPRDCTCBCTOP_MPASSI_MPASO_MOSART_SGLC_SWAV From d46acbf9b7f4229131fd5cdeb4bd60a861866565 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Tue, 16 Apr 2024 09:54:55 -0400 Subject: [PATCH 157/310] add gh/ci-w tests --- .github/workflows/e3sm-gh-ci-w-cime-tests.yml | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/e3sm-gh-ci-w-cime-tests.yml diff --git a/.github/workflows/e3sm-gh-ci-w-cime-tests.yml b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml new file mode 100644 index 00000000000..9701bedb138 --- /dev/null +++ b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml @@ -0,0 +1,59 @@ +name: gh + +on: + pull_request: + branches: [ master ] + paths: + # no to these + - '!docs/**' + - '!components/*/docs/**' + - '!components/*/mkdocs.yml' + + workflow_dispatch: + +jobs: + + ci-w: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + test: + - SMS_D_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - SMS_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - REP_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - ERS_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - ERS_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu.allactive-wcprod_1850 + - ERP_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - PET_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + - PEM_P8.ne4pg2_oQU480.WCYCL2010NS.singularity_gnu + container: + image: ghcr.io/mahf708/e3sm-imgs:v0.0.6 + + steps: + - + name: Checkout + uses: actions/checkout@v4 + with: + show-progress: false + submodules: recursive + - + name: CIME + working-directory: cime/scripts + run: | + mkdir -p $HOME/projects/e3sm/cesm-inputdata/atm/cam/physprops/ + wget https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/physprops/p3_lookup_table_1.dat-v4.1.2 + mv p3_lookup_table_1.dat-v4.1.2 $HOME/projects/e3sm/cesm-inputdata/atm/cam/physprops/ + export USER=test + ./create_test ${{ matrix.test }} --wait --debug + - + name: Artifacts + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: ${{ matrix.test }} + path: | + ~/projects/e3sm/scratch/${{ matrix.test }}*/TestStatus.log + ~/projects/e3sm/scratch/${{ matrix.test }}*/bld/*.bldlog.* + ~/projects/e3sm/scratch/${{ matrix.test }}*/run/*.log.* + ~/projects/e3sm/scratch/${{ matrix.test }}*/run/*.cprnc.out From 3318f32b7860557c34aa51dbfddbee060f369d15 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Tue, 16 Apr 2024 09:59:40 -0400 Subject: [PATCH 158/310] exclude paths properly via paths-ignore --- .github/workflows/e3sm-gh-ci-w-cime-tests.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/e3sm-gh-ci-w-cime-tests.yml b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml index 9701bedb138..7d31767b11c 100644 --- a/.github/workflows/e3sm-gh-ci-w-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml @@ -3,11 +3,10 @@ name: gh on: pull_request: branches: [ master ] - paths: - # no to these - - '!docs/**' - - '!components/*/docs/**' - - '!components/*/mkdocs.yml' + paths-ignore: + - 'docs/**' + - 'components/*/docs/**' + - 'components/*/mkdocs.yml' workflow_dispatch: From 1d67d94988eaa04eafc9524c299cd66ae0c625e0 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 16 Apr 2024 08:34:41 -0700 Subject: [PATCH 159/310] update tools/generate_domain_files_E3SM.py --- tools/generate_domain_files_E3SM.py | 33 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/tools/generate_domain_files_E3SM.py b/tools/generate_domain_files_E3SM.py index 9b24d6ab319..d4f68e38bb6 100644 --- a/tools/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files_E3SM.py @@ -27,6 +27,8 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m python generate_domain_files_E3SM.py -m -o -l + [--output-root ] + [--date-stamp ] [--fminval ] [--fmaxval ] [--set-omask] @@ -39,7 +41,16 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m For "tr-grid" configurations of E3SM (land grid is different from atmos/ocn): In addition to running this tool with the ocn->atm map as above, - a second iteration is needed with a similar ocn->lnd map. + a second iteration is needed with a similar ocn->lnd map. + +Environment + + This tool requires a few special packages, such as xarray, numba, and itertools. + These are all included in the E3SM unified environment: + https://e3sm.org/resources/tools/other-tools/e3sm-unified-environment/ + + Otherwise a simple conda environment can be created: + conda create --name example_env --channel conda-forge xarray numpy numba scikit-learn netcdf4 The following output domain files are created: @@ -121,10 +132,6 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m domain_file_ocn_on_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' - -fn1_out_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' -fn2_out_lnd = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' -fn2_out_ocn = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' #------------------------------------------------------------------------------- # print some informative stuff print(f''' @@ -235,7 +242,7 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): ''') #------------------------------------------------------------------------------- -# Create ocean domain on ocean grid (fn1_out_ocn) +# Create ocean domain on ocean grid (domain_file_ocn_on_ocn) # Get ocn mask on ocn grid omask = get_mask(ds,opts,suffix='_a') @@ -250,12 +257,12 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): ds_out['frac'] = ofrac .expand_dims(dim='nj').rename({'n_a':'ni'}) ds_out['mask'] = omask .expand_dims(dim='nj').rename({'n_a':'ni'}) add_metadata(ds_out) -ds_out.to_netcdf(path=fn1_out_ocn,mode='w') +ds_out.to_netcdf(path=domain_file_ocn_on_ocn,mode='w') -print(f'successfully created domain file: {clr.MAGENTA}{fn1_out_ocn}{clr.END}') +print(f'successfully created domain file: {clr.MAGENTA}{domain_file_ocn_on_ocn}{clr.END}') #------------------------------------------------------------------------------- -# Create land and ocean domains on atmosphere grid ( fn2_out_lnd / fn2_out_ocn ) +# Create land and ocean domains on atmosphere grid ( domain_file_lnd_on_atm / domain_file_ocn_on_atm ) xc = ds['xc_b'] yc = ds['yc_b'] @@ -311,9 +318,9 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): add_metadata(ds_out) -ds_out.to_netcdf(path=fn2_out_lnd,mode='w') +ds_out.to_netcdf(path=domain_file_lnd_on_atm,mode='w') -print(f'successfully created domain file: {clr.MAGENTA}{fn2_out_lnd}{clr.END}') +print(f'successfully created domain file: {clr.MAGENTA}{domain_file_lnd_on_atm}{clr.END}') #------------------------------------------------------------------------------- @@ -328,9 +335,9 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): add_metadata(ds_out) -ds_out.to_netcdf(path=fn2_out_ocn,mode='w') +ds_out.to_netcdf(path=domain_file_ocn_on_atm,mode='w') -print(f'successfully created domain file: {clr.MAGENTA}{fn2_out_ocn}{clr.END}') +print(f'successfully created domain file: {clr.MAGENTA}{domain_file_ocn_on_atm}{clr.END}') #------------------------------------------------------------------------------- print() From 9a0ab28b237f714bf253d1805683a61f45408541 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Tue, 16 Apr 2024 10:50:11 -0500 Subject: [PATCH 160/310] Remove prescribed methane section from use_case files for SSPs --- .../SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 10 ---------- .../SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 10 ---------- .../SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml | 10 ---------- 3 files changed, 30 deletions(-) diff --git a/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index 19f9e0d06d2..120fb939165 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP245_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -64,16 +64,6 @@ 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' - - - -ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc -atm/cam/chem/methane -CYCLICAL -1995 -'' -'prsd_ch4:CH4' - 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', diff --git a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index 53e9fe57a12..e15be0889fd 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP370_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -64,16 +64,6 @@ 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' - - - -ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc -atm/cam/chem/methane -CYCLICAL -1995 -'' -'prsd_ch4:CH4' - 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', diff --git a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml index 25019238bf0..f9c45623d5a 100644 --- a/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml +++ b/components/eam/bld/namelist_files/use_cases/SSP585_eam_CMIP6_chemUCI-Linoz-mam5-vbs.xml @@ -64,16 +64,6 @@ 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' '' - - - -ch4_oxid_1.9x2.5_L26_1990-1999clim.c090804.nc -atm/cam/chem/methane -CYCLICAL -1995 -'' -'prsd_ch4:CH4' - 'A:H2OLNZ:H2O', 'N:O2:O2', 'N:CO2:CO2', From 057cc515603a8e1c9a4ecd14efe3c4e06c37029f Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Tue, 16 Apr 2024 15:07:01 -0500 Subject: [PATCH 161/310] Remove support for Greenland 20km ERP test ERP test currently fails due to known limitations of preconditioned linear solves in MALI (expected behavior). Removing this support for the time being with the understanding that a workaround will be put in place in the future after further consultation with Infrastructure team. --- cime_config/tests.py | 1 - .../testmods_dirs/elm/gis20kmERP/shell_commands | 10 ---------- 2 files changed, 11 deletions(-) delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands diff --git a/cime_config/tests.py b/cime_config/tests.py index 144924485b6..b7373aaaeab 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -124,7 +124,6 @@ "tests" : ( "SMS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmSMS", "ERS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmERS", - "ERP.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmERP", ) }, diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands deleted file mode 100644 index 732ccb23523..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/gis20kmERP/shell_commands +++ /dev/null @@ -1,10 +0,0 @@ -./xmlchange STOP_OPTION=ndays -./xmlchange STOP_N=3 -./xmlchange REST_OPTION=ndays -./xmlchange REST_N=3 -./xmlchange NCPL_BASE_PERIOD=year -./xmlchange ATM_NCPL=17520 -./xmlchange LND_NCPL=17520 -./xmlchange OCN_NCPL=8760 -./xmlchange GLC_NCPL=365 -./xmlchange ROF_NCPL=17520 From ede39e5bc6172f92dd5702cb933bdaf1fbf7466e Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 16 Apr 2024 17:00:01 -0600 Subject: [PATCH 162/310] move domain tool and add documentation --- docs/index.md | 10 ++++--- mkdocs.yaml | 1 + tools/generate_domain_files/docs/index.md | 26 +++++++++++++++++++ .../generate_domain_files_E3SM.py | 0 tools/generate_domain_files/mkdocs.yml | 7 +++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 tools/generate_domain_files/docs/index.md rename tools/{ => generate_domain_files}/generate_domain_files_E3SM.py (100%) create mode 100644 tools/generate_domain_files/mkdocs.yml diff --git a/docs/index.md b/docs/index.md index 07a58797469..4d484b4e048 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,12 +1,16 @@ # The Energy Exascale Earth System Model (E3SM) -The documentation for the components of E3SM is found here. +The E3SM documentation is organized into sections for each component model and additional sections for shared tools and general guides. -## Components +## Component Models - [EAM](./EAM/index.md) - [EAMxx](./EAMxx/index.md) - [ELM](./ELM/index.md) - [MOSART](./MOSART/index.md) -Please see [Developing Docs](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) to learn about developing documentation for E3SM. +## Tools + +- [generate_domain_files](./generate_domain_files/index.md) + +Please see [Developing Docs](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) to learn about how to contribute to the documentation. diff --git a/mkdocs.yaml b/mkdocs.yaml index aaeefb4c81f..632091f4ee5 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -4,6 +4,7 @@ nav: - Introduction: 'index.md' - 'Developing Docs': 'https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation' - Components: '*include ./components/*/mkdocs.yml' + - Tools: '*include ./tools/*/mkdocs.yml' theme: name: material diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md new file mode 100644 index 00000000000..99164a0294e --- /dev/null +++ b/tools/generate_domain_files/docs/index.md @@ -0,0 +1,26 @@ +# Generating Domain Files + +Domain files are needed at runtime by the coupler, data models, and land model. +The land model uses the mask to determine where to run and the coupler use the +land fraction to merge fluxes from multiple surface types to the atmosphere +above them. + +Domain files are created from a conservative, monotone mapping file from the +ocean grid (where the mask is defined) to the atmosphere grid. + +a mapping files created in the +previous step, using a tool provided with CIME in +${e3sm_root}/cime/tools/mapping/gen_domain_files. + + +## Environement + +The new domain generation tool requires a few special packages, +such as xarray, numba, and itertools. +These are all included in the E3SM unified environment: +https://e3sm.org/resources/tools/other-tools/e3sm-unified-environment/ + +Alternatively, a simple conda environment can be created with the following command: +``` +conda create --name example_env --channel conda-forge xarray numpy numba scikit-learn netcdf4 +``` \ No newline at end of file diff --git a/tools/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py similarity index 100% rename from tools/generate_domain_files_E3SM.py rename to tools/generate_domain_files/generate_domain_files_E3SM.py diff --git a/tools/generate_domain_files/mkdocs.yml b/tools/generate_domain_files/mkdocs.yml new file mode 100644 index 00000000000..800a2dafd8c --- /dev/null +++ b/tools/generate_domain_files/mkdocs.yml @@ -0,0 +1,7 @@ +site_name: generate_domain_files + +# nav: + # - Overview: 'index.md' + # - User Guide: 'index.md' + # - Developers's Guide: dev-guide/index.md + # - Technical Guide: tech-guide/index.md From 3573055deff0013186b9831a0fa2b0abde9b5d2d Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 16 Apr 2024 17:03:06 -0600 Subject: [PATCH 163/310] rename yaml file --- tools/generate_domain_files/mkdocs.yaml | 1 + tools/generate_domain_files/mkdocs.yml | 7 ------- 2 files changed, 1 insertion(+), 7 deletions(-) create mode 100644 tools/generate_domain_files/mkdocs.yaml delete mode 100644 tools/generate_domain_files/mkdocs.yml diff --git a/tools/generate_domain_files/mkdocs.yaml b/tools/generate_domain_files/mkdocs.yaml new file mode 100644 index 00000000000..ec668aa263d --- /dev/null +++ b/tools/generate_domain_files/mkdocs.yaml @@ -0,0 +1 @@ +site_name: generate_domain_files diff --git a/tools/generate_domain_files/mkdocs.yml b/tools/generate_domain_files/mkdocs.yml deleted file mode 100644 index 800a2dafd8c..00000000000 --- a/tools/generate_domain_files/mkdocs.yml +++ /dev/null @@ -1,7 +0,0 @@ -site_name: generate_domain_files - -# nav: - # - Overview: 'index.md' - # - User Guide: 'index.md' - # - Developers's Guide: dev-guide/index.md - # - Technical Guide: tech-guide/index.md From 2930e549b1a5dd0e805b80079120c48f59d8a52b Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 16 Apr 2024 17:06:09 -0600 Subject: [PATCH 164/310] fix typo --- mkdocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index 632091f4ee5..98a13114209 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -4,7 +4,7 @@ nav: - Introduction: 'index.md' - 'Developing Docs': 'https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation' - Components: '*include ./components/*/mkdocs.yml' - - Tools: '*include ./tools/*/mkdocs.yml' + - Tools: '*include ./tools/*/mkdocs.yaml' theme: name: material From 75fcd8235bb667352e2a475e3d6bc7ee87406678 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 16 Apr 2024 17:06:22 -0600 Subject: [PATCH 165/310] add text to docs --- tools/generate_domain_files/docs/index.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index 99164a0294e..49ecdce6ee8 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -23,4 +23,14 @@ https://e3sm.org/resources/tools/other-tools/e3sm-unified-environment/ Alternatively, a simple conda environment can be created with the following command: ``` conda create --name example_env --channel conda-forge xarray numpy numba scikit-learn netcdf4 +``` + +## Map File Generation + +The map file used to generate the domain files can be created a few different ways. +For a typical E3SM configuration we recommend using a conservative, monotone map. +Here is an example command that can be used to generate one (as of NCO version 5.2.2) + +``` +ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} ``` \ No newline at end of file From f1f6eb29998ae2148e2af88dd0614e9aaa226b10 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Tue, 16 Apr 2024 19:32:56 -0500 Subject: [PATCH 166/310] Fixing logical on flds_polar driver namelist --- driver-mct/cime_config/config_component_e3sm.xml | 3 +-- driver-moab/cime_config/config_component_e3sm.xml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/driver-mct/cime_config/config_component_e3sm.xml b/driver-mct/cime_config/config_component_e3sm.xml index b53d948be66..2895650d242 100755 --- a/driver-mct/cime_config/config_component_e3sm.xml +++ b/driver-mct/cime_config/config_component_e3sm.xml @@ -177,8 +177,7 @@ TRUE,FALSE FALSE - TRUE - TRUE + TRUE TRUE run_flags diff --git a/driver-moab/cime_config/config_component_e3sm.xml b/driver-moab/cime_config/config_component_e3sm.xml index d0b362b9abd..044cc1e9f9d 100644 --- a/driver-moab/cime_config/config_component_e3sm.xml +++ b/driver-moab/cime_config/config_component_e3sm.xml @@ -177,8 +177,7 @@ TRUE,FALSE FALSE - TRUE - TRUE + TRUE TRUE run_flags From 1aa5d068ec82f21b92815061ad9c0426e06a0015 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Tue, 16 Apr 2024 19:58:33 -0600 Subject: [PATCH 167/310] Updated formatting and CICE-QC instructions in development guide --- .../mpas-seaice/docs/dev-guide/index.md | 232 +++++++++++++----- 1 file changed, 166 insertions(+), 66 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index d0e1c6f7f7c..43c0d504699 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -19,9 +19,11 @@ To accelerate early development stages, a script is available for configuring an **View helpful information, including default values for duration, configuration, etc.** - git clone git@github.com:E3SM-Project/SimulationScripts.git - cd SimulationScripts/archive/PolarGroup - ./E3SM-Polar-Developer.sh -h +``` +git clone git@github.com:E3SM-Project/SimulationScripts.git +cd SimulationScripts/archive/PolarGroup +./E3SM-Polar-Developer.sh -h +``` For debugging E3SM, search the script for 'debug' and follow the instructions. @@ -31,10 +33,12 @@ The following examples describe how to use the script for development in Icepack Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. - $ less nset01.nlk - [mpassi] - config_column_physics_type = {'column_package','icepack'} - config_use_snicar_ad = {.false.} +``` +$ less nset01.nlk +[mpassi] +config_column_physics_type = {'column_package','icepack'} +config_use_snicar_ad = {.false.} +``` Notes: @@ -43,54 +47,76 @@ Notes: Fetch E3SM (choose any name for the directory baselines01): - ./E3SM-Polar-Developer.sh -s baselines01 -f git@github.com:E3SM-Project/E3SM +``` +./E3SM-Polar-Developer.sh -s baselines01 -f git@github.com:E3SM-Project/E3SM +``` Set up a new case and build it: - ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -n -b +``` +./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -n -b +``` Submit: - ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -q +``` +./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -q +``` Examine the diagnostic output (compares the icepack run with the column_package run in this example): - ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -a -v +``` +./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -a -v +``` **Set up a sandbox for model development, to be compared with the baselines** Fetch E3SM (choose any name for the directory newdev01): - ./E3SM-Polar-Developer.sh -s newdev01 -f git@github.com:E3SM-Project/E3SM +``` +./E3SM-Polar-Developer.sh -s newdev01 -f git@github.com:E3SM-Project/E3SM +``` Create a new development branch: - cd ~/E3SM-Polar/code/newdev01 - git branch newbranch - git checkout newbranch +``` +cd ~/E3SM-Polar/code/newdev01 +git branch newbranch +git checkout newbranch +``` Set up a new case and build it: - ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -n -b + +``` +./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -n -b +``` Develop and test... Build/compile: - ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -b +``` +./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -b +``` Submit: - ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -q +``` +./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -q +``` Examine the diagnostic output: - ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -a -v +``` +./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -a -v +``` Compare with the baselines case directory (use your D3 baselines directory): - ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -a D3.nset01.baselines01.master.E3SM-Project.anvil -v - +``` +./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -a D3.nset01.baselines01.master.E3SM-Project.anvil -v +``` **Make changes in Icepack and PR to the Consortium** @@ -102,17 +128,23 @@ First, create a baseline (standalone) Icepack test suite using the E3SM icepack Similarly test your branch of Icepack within E3SM and compare with the baseline. When satisfied with E3SM testing, PR to Consortium icepack main: - git remote add cice git@github.com:cice-consortium/icepack.git - git pull cice main +``` +git remote add consortium git@github.com:cice-consortium/icepack.git +git pull consortium main +``` Fix conflicts if needed, then - git add ... - git commit -m "update from cice-consortium main" +``` +git add ... +git commit -m "update from cice-consortium main" +``` Continue testing. When satisfied, - git push origin branch +``` +git push origin branch +``` Create a PR from branch to cice-consortium/icepack -b main. @@ -123,72 +155,140 @@ More extensive documentation of this workflow tool used for the Icepack merge pr **CICE-QC Quality Control Testing** ----------------------------------- -Example to run a CICE-QC comparison between icepack and column_package on a branch +Example to run a CICE-QC comparison between two E3SM simulations with changes to the sea ice component. **Set up and run simulations to be compared** - cd ~/SimulationScripts/archive/PolarGroup/ +``` +cd ~/SimulationScripts/archive/PolarGroup/ +``` -Create a `.nlk` file with namelist changes to include the thickness analysis member (append the last 3 lines here to the end of your standard D-case test .nlk) +Create a `.nlk` file with namelist changes to include the thickness analysis member. Include changes to namelist values needed in both the baseline and the test here, if desired (append the last 3 lines here to the end of your standard D-case test .nlk). - $ less qcPR19.nlk - [mpassi] - config_column_physics_type = {'column_package','icepack'} - config_AM_thicknesses_enable = {.true.} - config_AM_thicknesses_compute_on_startup = {.true.} - config_AM_thicknesses_write_on_startup = {.true.} +``` +$ less qcbase.nlk +[mpassi] +config_AM_thicknesses_enable = {.true.} +config_AM_thicknesses_compute_on_startup = {.true.} +config_AM_thicknesses_write_on_startup = {.true.} +``` Use test script to clone E3SM, and create a sandbox - ./E3SM-Polar-Developer.sh -s qcPR19 -f git@github.com:eclare108213/E3SM snicar_active +``` +./E3SM-Polar-Developer.sh -s qcbaseline -f git@github.com:E3SM-Project/E3SM +``` -Edit ``~/E3SM-Polar/code/qcPR19/components/mpas-seaice/cime_config/buildnml`` to change: +Edit ``~/E3SM-Polar/code/qcbaseline/components/mpas-seaice/cime_config/buildnml`` to change: - lines.append(' output_interval="none" +``` +lines.append(' output_interval="none">') +``` to - lines.append(' output_interval="00-00-01_00:00:00">') - -for ``stream name=“output”`` (line 451) and add - - lines.append(' ') - -at line 458. - -Create and build both cases to run 5 years, then submit: - - ./E3SM-Polar-Developer.sh -s qcPR19 -k qcPR19.nlk -e -d60 -nb - ./E3SM-Polar-Developer.sh -s qcPR19 -k qcPR19.nlk -e -d60 -q +``` +lines.append(' output_interval="00-00-01_00:00:00">') +``` + +for ``stream name=“output”`` and add + +``` +lines.append(' ') +``` + +a few lines below that: +``` + lines.append('') ++ lines.append(' output_interval="00-00-01_00:00:00">') + lines.append('') + lines.append(' ') + lines.append(' ') + lines.append(' ') + lines.append(' ') + lines.append(' ') + lines.append(' ') ++ lines.append(' ') + lines.append(' ') + lines.append(' ') + lines.append('') + lines.append('') +``` + +Build and run baseline case for 5 years (60 months): +``` +./E3SM-Polar-Developer.sh -s qcbaseline -k qcbase.nlk -e -d60 -nb +./E3SM-Polar-Developer.sh -s qcbaseline -k qcbase.nlk -e -d60 -q +``` + +Copy the thickness analysis member changes into your development directory: + +``` +cd ~/E3SM-Polar/code/newdev01/components/mpas-seaice/cime_config/ +cp ~/E3SM-Polar/code/qcbaseline/components/mpas-seaice/cime_config/buildnml . +``` + +If your development case adds namelist parameters, add the thickness analysis member to your .nlk file as above. This example uses the default configuration. + +Build and run the development case: + +``` +cd ~/SimulationScripts/archive/PolarGroup/ +./E3SM-Polar-Developer.sh -s newdev01 -k qcbase.nlk -e -d60 -nb +./E3SM-Polar-Developer.sh -s newdev01 -k qcbase.nlk -e -d60 -q +``` **Run QC comparison** -----UPDATE THIS SINCE THE PR HAS NOW BEEN MERGED ------ +``` +cd ~/E3SM-Polar/code/newdev01/components/mpas-seaice/testing/cice-qc +``` + +See README.md. This example is for anvil. -See ``README.md`` at [https://github.com/E3SM-Seaice-Discussion/E3SM/pull/8/files](https://github.com/E3SM-Seaice-Discussion/E3SM/pull/8/files). - mkdir CICE-QC --- if it doesn’t already exist - cd CICE-QC - git clone git@github.com:darincomeau/E3SM.git -b add-mpas-seaice-qc-testing - cd E3SM/components/mpas-seaice/testing_and_setup/qc_testing/ +Edit ``job_script.cice-qc.anvil`` to export (insert your username) -[the following might not be necessary with the latest E3SM-Polar-Developer script] +``` +BASE = /lcrc/group/e3sm/[username]/E3SM-Polar/D12.qcbase.emc.qcbaseline.master.E3SM-Project.anvil/run.k000/ +TEST = /lcrc/group/e3sm/[username]/E3SM-Polar/D12.qcbase.emc.newdev01.branch.E3SM-Project.anvil/run.k000 +``` -Edit ``job_script.qc-testing-mpassi.anvil``, e.g. +Submit QC test. Test results will be in the file ``qc_log.txt``. - export BASE=/lcrc/group/acme/ac.eclare/E3SM-Polar/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/run.k000 - export TEST=/lcrc/group/acme/ac.eclare/E3SM-Polar/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/run.k001 +``` +sbatch job_script.qc-testing-mpassi.anvil +less qc_log.txt +``` -Edit ``mpas-seaice.t-test.py`` to comment out the lines that insist on the path ending with ``run/`` but still define +Example of desired result: - path_a = base_dir - path_b = test_dir +``` +Running QC test on the following directories: + /lcrc/group/e3sm/ac.eclare/E3SM-Polar/D12.qcbase.emc.qcbaseline.master.E3SM-Project.anvil/run.k000/ + /lcrc/group/e3sm/ac.eclare/E3SM-Polar/D12.qcbase.emc.newdev01.branch.E3SM-Project.anvil/run.k000 +Number of files: 61 +2 Stage Test Passed +Quadratic Skill Test Passed for Northern Hemisphere +Quadratic Skill Test Passed for Southern Hemisphere +``` -Submit QC test: +**Generate statistics from the CICE-QC runs** - sbatch job_script.qc-testing-mpassi.anvil +This only works if the .nlk filename is the same for both cases. If comparing only namelist changes within MPAS-seaice, use the ``./E3SM-Polar-Developer.sh`` script with a single .nlk file that includes each option. -Test results will be in the file ``qc_log.txt``. +``` +cd ~/SimulationScripts/archive/PolarGroup/ +$ ./E3SM-Polar-Developer.sh -s qcbaseline -k qcbase.nlk -e -d60 -a D12.qcbase.emc.newdev01.branch.E3SM-Project.anvil -v +``` **Create comparison plots** From 03371d602064cf7a5cc5383b4a4950ce1b60adfe Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 16 Apr 2024 15:47:51 -0700 Subject: [PATCH 168/310] add land grid check to fates_cold test mod --- .../testdefs/testmods_dirs/elm/fates_cold/shell_commands | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold/shell_commands index 5c5dc3a9118..c2771ff61c4 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/fates_cold/shell_commands @@ -1,2 +1,8 @@ ./xmlchange TEST_MEMLEAK_TOLERANCE=0.75 ./xmlchange NTHRDS=1 + +# Change PIO settings as temporary fix for #6316 +if [ `./xmlquery --value LND_GRID` == 1.9x2.5 ]; then + ./xmlchange PIO_NUMTASKS=4 + ./xmlchange PIO_STRIDE=-999 +fi From 829f56a14ac3fb7afed818ba180d8de23104751a Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 11:45:23 -0600 Subject: [PATCH 169/310] update docs --- tools/generate_domain_files/docs/index.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index 49ecdce6ee8..2bb6d5e02f6 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -33,4 +33,14 @@ Here is an example command that can be used to generate one (as of NCO version 5 ``` ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} -``` \ No newline at end of file +``` + +## Generating Domain Files + +Below is a typical example of how to invoke the domain generation tool from the command line: + +``` +NE=30 +MAP_FILE=${MAP_FILE_ROOT}/map_oEC60to30v3_to_ne${NE}pg2_traave.20240313.nc +python generate_domain_files_E3SM.py -m ${MAP_FILE} -o oEC60to30v3 -l ne${NE}pg2 --date-stamp=9999 --output-root=${OUTPUT_ROOT} +``` From 450dee16587123b787cfcffe35148f2c20c517a4 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 12:19:21 -0600 Subject: [PATCH 170/310] update docs --- tools/generate_domain_files/docs/index.md | 41 ++++++++++++----------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index 2bb6d5e02f6..939617ac5e0 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -1,45 +1,46 @@ # Generating Domain Files -Domain files are needed at runtime by the coupler, data models, and land model. -The land model uses the mask to determine where to run and the coupler use the -land fraction to merge fluxes from multiple surface types to the atmosphere -above them. - -Domain files are created from a conservative, monotone mapping file from the -ocean grid (where the mask is defined) to the atmosphere grid. - -a mapping files created in the -previous step, using a tool provided with CIME in -${e3sm_root}/cime/tools/mapping/gen_domain_files. +Domain files are needed at runtime by the coupler, data models, and land model. The land model uses the mask to determine where to run and the coupler use the land fraction to merge fluxes from multiple surface types to the atmosphere above them. +Domain files are created from a conservative, monotone mapping file from the ocean grid (where the mask is defined) to the atmosphere grid. ## Environement -The new domain generation tool requires a few special packages, -such as xarray, numba, and itertools. -These are all included in the E3SM unified environment: +The new domain generation tool requires a few special packages, such as xarray, numba, and itertools. These are all included in the E3SM unified environment: https://e3sm.org/resources/tools/other-tools/e3sm-unified-environment/ Alternatively, a simple conda environment can be created with the following command: -``` + +```bash conda create --name example_env --channel conda-forge xarray numpy numba scikit-learn netcdf4 ``` ## Map File Generation -The map file used to generate the domain files can be created a few different ways. -For a typical E3SM configuration we recommend using a conservative, monotone map. -Here is an example command that can be used to generate one (as of NCO version 5.2.2) +The map file used to generate the domain files can be created a few different ways. For a typical E3SM configuration we recommend using a conservative, monotone map. Here is an example command that can be used to generate one (as of NCO version 5.2.2) -``` +```bash ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} ``` +Note that existing ocean grid files can be found in the inputdata repository: `inputdata/ocn/mpas-o//` + +The atmosphere grid file should be on the "pg2" grid. These grid files are easily generated with three TempestRemap commands as follows: + +```bash +NE=30 +GenerateCSMesh --alt --res ${NE} --file ${GRID_FILE_PATH}/ne${NE}.g +GenerateVolumetricMesh --in ${GRID_FILE_PATH}/ne${NE}.g --out ${GRID_FILE_PATH}/ne${NE}pg2.g --np 2 --uniform +ConvertMeshToSCRIP --in ${GRID_FILE_PATH}/ne${NE}pg2.g --out ${GRID_FILE_PATH}/ne${NE}pg2_scrip.nc +``` + +For RRM grids the last two commands would be used on the exodus file produced by [SQuadGen](https://github.com/ClimateGlobalChange/squadgen) (See the [Adding Support for New Grids](https://docs.e3sm.org/user-guides/adding-grid-support-overview.md) tutorial for more information.). + ## Generating Domain Files Below is a typical example of how to invoke the domain generation tool from the command line: -``` +```bash NE=30 MAP_FILE=${MAP_FILE_ROOT}/map_oEC60to30v3_to_ne${NE}pg2_traave.20240313.nc python generate_domain_files_E3SM.py -m ${MAP_FILE} -o oEC60to30v3 -l ne${NE}pg2 --date-stamp=9999 --output-root=${OUTPUT_ROOT} From d97f0b24ae7d532bf09590fb04348130c89018f1 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 12:29:27 -0600 Subject: [PATCH 171/310] linter fixes --- tools/generate_domain_files/docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index 939617ac5e0..3aa92e46481 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -7,7 +7,7 @@ Domain files are created from a conservative, monotone mapping file from the oce ## Environement The new domain generation tool requires a few special packages, such as xarray, numba, and itertools. These are all included in the E3SM unified environment: -https://e3sm.org/resources/tools/other-tools/e3sm-unified-environment/ + Alternatively, a simple conda environment can be created with the following command: @@ -36,7 +36,7 @@ ConvertMeshToSCRIP --in ${GRID_FILE_PATH}/ne${NE}pg2.g --out ${GRID_FILE_PATH}/n For RRM grids the last two commands would be used on the exodus file produced by [SQuadGen](https://github.com/ClimateGlobalChange/squadgen) (See the [Adding Support for New Grids](https://docs.e3sm.org/user-guides/adding-grid-support-overview.md) tutorial for more information.). -## Generating Domain Files +## Running the Domain Generation Tool Below is a typical example of how to invoke the domain generation tool from the command line: From bc653149c7475e554fb0e12aebe096ae552b0115 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 12:29:40 -0600 Subject: [PATCH 172/310] remove un-used eps variable --- tools/generate_domain_files/generate_domain_files_E3SM.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index d4f68e38bb6..e5729133b5c 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -120,8 +120,6 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m if not os.path.exists(opts.output_root) : raise ValueError(f'{clr.RED}Output root path does not exist{clr.END}') #------------------------------------------------------------------------------- -# define constants -eps = 1.0e-12 # Set date stamp for file name if opts.date_stamp is None: cdate = datetime.datetime.utcnow().strftime('%Y%m%d') @@ -142,7 +140,6 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m {clr.GREEN}fminval {clr.END}: {opts.fminval} {clr.GREEN}fmaxval {clr.END}: {opts.fmaxval} {clr.GREEN}set_omask {clr.END}: {opts.set_omask} - {clr.GREEN}eps {clr.END}: {eps} ''') #--------------------------------------------------------------------------------------------------- def add_metadata(ds): @@ -168,8 +165,7 @@ def add_metadata(ds): ds_out['frac'] = ds_out['frac'].assign_attrs({'long_name':'fraction of grid cell that is active'}) ds_out['frac'] = ds_out['frac'].assign_attrs({'units':'unitless'}) ds_out['frac'] = ds_out['frac'].assign_attrs({'coordinates':'xc yc'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'filter1':f'error if frac> 1.0+eps or frac < 0.0-eps; eps = {eps}'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'filter2':f'limit frac to [fminval,fmaxval]; fminval={opts.fminval} fmaxval={opts.fmaxval}'}) + ds_out['frac'] = ds_out['frac'].assign_attrs({'filter':f'limit frac to [fminval,fmaxval]; fminval={opts.fminval} fmaxval={opts.fmaxval}'}) ds_out['mask'] = ds_out['mask'].assign_attrs({'long_name':'domain mask'}) ds_out['mask'] = ds_out['mask'].assign_attrs({'units':'unitless'}) From e8510509cd3c1fe75486cdfbfca4e00d473607c2 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 12:40:43 -0600 Subject: [PATCH 173/310] refactor domain generation tool --- .../generate_domain_files_E3SM.py | 368 ++++++++++-------- 1 file changed, 195 insertions(+), 173 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index e5729133b5c..47ead5d4744 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -#------------------------------------------------------------------------------- +#--------------------------------------------------------------------------------------------------- ''' This is a replacement for the legacy gen_domain tool created for CESM. Most legacy functionality is reproduced, with the notable exception of @@ -7,7 +7,7 @@ Created April, 2024 by Walter Hannah (LLNL) ''' -#------------------------------------------------------------------------------- +#--------------------------------------------------------------------------------------------------- ''' The map file used to generate the domain files can be created a few different ways. For a typical E3SM configuration we recommend using a conservative, monotone map. @@ -16,13 +16,13 @@ ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} ''' -#------------------------------------------------------------------------------- +#--------------------------------------------------------------------------------------------------- import datetime, os, numpy as np, xarray as xr, numba, itertools user, host = os.getenv('USER'), os.getenv('HOST') source_code_meta = 'generate_domain_E3SM.py' -#------------------------------------------------------------------------------- +#--------------------------------------------------------------------------------------------------- class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m','\033[36m' -#------------------------------------------------------------------------------- +#--------------------------------------------------------------------------------------------------- usage = ''' python generate_domain_files_E3SM.py -m -o @@ -109,38 +109,192 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m 'omitted, then mask_a is required and an error will be '+\ 'raised if it does not exist in the input mapping file.') (opts, args) = parser.parse_args() -#------------------------------------------------------------------------------- -# check for valid input arguments -if opts.map_file is None: - raise ValueError(f'{clr.RED}input map file was not specified{clr.END}') -if opts.lnd_grid is None: - raise ValueError(f'{clr.RED}land grid name was not specified{clr.END}') -if opts.ocn_grid is None: - raise ValueError(f'{clr.RED}ocean grid name was not specified{clr.END}') -if not os.path.exists(opts.output_root) : - raise ValueError(f'{clr.RED}Output root path does not exist{clr.END}') -#------------------------------------------------------------------------------- -# Set date stamp for file name -if opts.date_stamp is None: - cdate = datetime.datetime.utcnow().strftime('%Y%m%d') -else: - cdate = opts.date_stamp -#------------------------------------------------------------------------------- -# specify output file names -domain_file_ocn_on_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' -domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' -domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' -#------------------------------------------------------------------------------- -# print some informative stuff -print(f''' -Input files and parameter values: - {clr.GREEN}map_file {clr.END}: {opts.map_file} - {clr.GREEN}lnd_grid {clr.END}: {opts.lnd_grid} - {clr.GREEN}ocn_grid {clr.END}: {opts.ocn_grid} - {clr.GREEN}fminval {clr.END}: {opts.fminval} - {clr.GREEN}fmaxval {clr.END}: {opts.fmaxval} - {clr.GREEN}set_omask {clr.END}: {opts.set_omask} -''') +#--------------------------------------------------------------------------------------------------- +def main(): + + #------------------------------------------------------------------------------- + # check for valid input arguments + + if opts.map_file is None: + raise ValueError(f'{clr.RED}input map file was not specified{clr.END}') + if opts.lnd_grid is None: + raise ValueError(f'{clr.RED}land grid name was not specified{clr.END}') + if opts.ocn_grid is None: + raise ValueError(f'{clr.RED}ocean grid name was not specified{clr.END}') + if not os.path.exists(opts.output_root) : + raise ValueError(f'{clr.RED}Output root path does not exist{clr.END}') + + #------------------------------------------------------------------------------- + # Set date stamp for file name + + if opts.date_stamp is None: + cdate = datetime.datetime.utcnow().strftime('%Y%m%d') + else: + cdate = opts.date_stamp + + #------------------------------------------------------------------------------- + # specify output file names + + domain_file_ocn_on_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' + domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + + #----------------------------------------------------------------------------- + # print some informative stuff + + print(f''' + Input files and parameter values: + {clr.GREEN}map_file {clr.END}: {opts.map_file} + {clr.GREEN}lnd_grid {clr.END}: {opts.lnd_grid} + {clr.GREEN}ocn_grid {clr.END}: {opts.ocn_grid} + {clr.GREEN}fminval {clr.END}: {opts.fminval} + {clr.GREEN}fmaxval {clr.END}: {opts.fmaxval} + {clr.GREEN}set_omask {clr.END}: {opts.set_omask} + ''') + + #----------------------------------------------------------------------------- + # open map file as dataset + + ds = xr.open_dataset(opts.map_file) + + #----------------------------------------------------------------------------- + # read grid meta-data from map file + + domain_a_grid_file = 'unknown' + domain_b_grid_file = 'unknown' + ocn_grid_file = 'unknown' + atm_grid_file = 'unknown' + + if 'domain_a' in ds.attrs.keys(): domain_a_grid_file = ds.attrs['domain_a'] + if 'domain_b' in ds.attrs.keys(): domain_b_grid_file = ds.attrs['domain_b'] + + if 'grid_file_ocn' in ds.attrs.keys(): + ocn_grid_file = ds.attrs['grid_file_ocn'] + else: + ocn_grid_file = ds.attrs['grid_file_src'] + + if 'grid_file_ocn' in ds.attrs.keys(): + atm_grid_file = ds.attrs['grid_file_atm'] + else: + atm_grid_file = ds.attrs['grid_file_dst'] + + #----------------------------------------------------------------------------- + # print some useful information from the map file + + print(f''' + Grid information from map file: + {clr.CYAN}domain_a file {clr.END}: {domain_a_grid_file} + {clr.CYAN}domain_b file {clr.END}: {domain_b_grid_file} + {clr.CYAN}ocn_grid_file {clr.END}: {ocn_grid_file} + {clr.CYAN}atm_grid_file {clr.END}: {atm_grid_file} + {clr.CYAN}ocn grid size (n_a){clr.END}: {len(ds.n_a)} + {clr.CYAN}atm grid size (n_b){clr.END}: {len(ds.n_b)} + {clr.CYAN}sparse mat size (n_s){clr.END}: {len(ds.n_s)} + ''') + + #----------------------------------------------------------------------------- + # Create ocean domain on ocean grid (domain_file_ocn_on_ocn) + + # Get ocn mask on ocn grid + omask = get_mask(ds,opts,suffix='_a') + ofrac = xr.zeros_like(ds['area_a']) + + ds_out = xr.Dataset() + ds_out['xc'] = ds['xc_a'] .expand_dims(dim='nj').rename({'n_a':'ni'}) + ds_out['yc'] = ds['yc_a'] .expand_dims(dim='nj').rename({'n_a':'ni'}) + ds_out['xv'] = ds['xv_a'] .expand_dims(dim='nj').rename({'n_a':'ni','nv_a':'nv'}) + ds_out['yv'] = ds['yv_a'] .expand_dims(dim='nj').rename({'n_a':'ni','nv_a':'nv'}) + ds_out['area'] = ds['area_a'].expand_dims(dim='nj').rename({'n_a':'ni'}) + ds_out['frac'] = ofrac .expand_dims(dim='nj').rename({'n_a':'ni'}) + ds_out['mask'] = omask .expand_dims(dim='nj').rename({'n_a':'ni'}) + + add_metadata(ds_out) + + ds_out.to_netcdf(path=domain_file_ocn_on_ocn,mode='w') + + print(f'successfully created domain file: {clr.MAGENTA}{domain_file_ocn_on_ocn}{clr.END}') + + #----------------------------------------------------------------------------- + # Create land and ocean domains on atmosphere grid + + xc = ds['xc_b'] + yc = ds['yc_b'] + xv = ds['xv_b'] + yv = ds['yv_b'] + area = ds['area_b'] + + mask_a = get_mask(ds,opts,suffix='_a') + frac_a = xr.where( mask_a!=0, xr.ones_like(ds['area_a']), xr.zeros_like(ds['area_a']) ) + + # compute ocn fraction on atm grid + ofrac = compute_ofrac_on_atm( len(ds['n_s']), np.zeros(ds['area_b'].shape), + frac_a.values, ds['S'].values, + ds['row'].values-1, ds['col'].values-1 ) + ofrac = xr.DataArray(ofrac,dims=['n_b']) + + # lfrac is area frac of mask "_a" on grid "_b" or float(mask) + lfrac = xr.zeros_like(ds['area_b']) + + # convert to land fraction + lfrac_min = opts.fmaxval + lfrac_max = opts.fminval + omask = xr.ones_like(ds['area_b'],dtype=int32) + lmask = xr.zeros_like(ds['area_b'],dtype=int32) + lfrac = 1 - ofrac + lfrac_min = lfrac.min().values + lfrac_max = lfrac.max().values + lfrac = xr.where( lfrac>opts.fmaxval, 1, lfrac ) + lfrac = xr.where( lfracopts.fmaxval, 1, lfrac ) -lfrac = xr.where( lfrac Date: Wed, 17 Apr 2024 12:42:39 -0600 Subject: [PATCH 174/310] typo fix in docs --- tools/generate_domain_files/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index 3aa92e46481..d39f7c8269f 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -4,7 +4,7 @@ Domain files are needed at runtime by the coupler, data models, and land model. Domain files are created from a conservative, monotone mapping file from the ocean grid (where the mask is defined) to the atmosphere grid. -## Environement +## Environment The new domain generation tool requires a few special packages, such as xarray, numba, and itertools. These are all included in the E3SM unified environment: From be2735c91b8951a7196c0c747fc2e84ada6d1854 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 13:13:38 -0600 Subject: [PATCH 175/310] change yaml to yml --- mkdocs.yaml | 2 +- tools/generate_domain_files/{mkdocs.yaml => mkdocs.yml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tools/generate_domain_files/{mkdocs.yaml => mkdocs.yml} (100%) diff --git a/mkdocs.yaml b/mkdocs.yaml index 98a13114209..632091f4ee5 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -4,7 +4,7 @@ nav: - Introduction: 'index.md' - 'Developing Docs': 'https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation' - Components: '*include ./components/*/mkdocs.yml' - - Tools: '*include ./tools/*/mkdocs.yaml' + - Tools: '*include ./tools/*/mkdocs.yml' theme: name: material diff --git a/tools/generate_domain_files/mkdocs.yaml b/tools/generate_domain_files/mkdocs.yml similarity index 100% rename from tools/generate_domain_files/mkdocs.yaml rename to tools/generate_domain_files/mkdocs.yml From fdc6927eed922f33cd1103c553148fdf1c6656f0 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 17 Apr 2024 13:17:39 -0600 Subject: [PATCH 176/310] switch bash to shell --- tools/generate_domain_files/docs/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/generate_domain_files/docs/index.md b/tools/generate_domain_files/docs/index.md index d39f7c8269f..57858205140 100644 --- a/tools/generate_domain_files/docs/index.md +++ b/tools/generate_domain_files/docs/index.md @@ -11,7 +11,7 @@ The new domain generation tool requires a few special packages, such as xarray, Alternatively, a simple conda environment can be created with the following command: -```bash +```shell conda create --name example_env --channel conda-forge xarray numpy numba scikit-learn netcdf4 ``` @@ -19,7 +19,7 @@ conda create --name example_env --channel conda-forge xarray numpy numba scikit- The map file used to generate the domain files can be created a few different ways. For a typical E3SM configuration we recommend using a conservative, monotone map. Here is an example command that can be used to generate one (as of NCO version 5.2.2) -```bash +```shell ncremap -5 -a traave --src_grd=${OCN_GRID} --dst_grd=${ATM_GRID} --map_file=${MAP_FILE} ``` @@ -27,7 +27,7 @@ Note that existing ocean grid files can be found in the inputdata repository: `i The atmosphere grid file should be on the "pg2" grid. These grid files are easily generated with three TempestRemap commands as follows: -```bash +```shell NE=30 GenerateCSMesh --alt --res ${NE} --file ${GRID_FILE_PATH}/ne${NE}.g GenerateVolumetricMesh --in ${GRID_FILE_PATH}/ne${NE}.g --out ${GRID_FILE_PATH}/ne${NE}pg2.g --np 2 --uniform @@ -40,7 +40,7 @@ For RRM grids the last two commands would be used on the exodus file produced by Below is a typical example of how to invoke the domain generation tool from the command line: -```bash +```shell NE=30 MAP_FILE=${MAP_FILE_ROOT}/map_oEC60to30v3_to_ne${NE}pg2_traave.20240313.nc python generate_domain_files_E3SM.py -m ${MAP_FILE} -o oEC60to30v3 -l ne${NE}pg2 --date-stamp=9999 --output-root=${OUTPUT_ROOT} From 61dc8c0adcaf7f1a50d52949d96943e2a63d5cc5 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Wed, 17 Apr 2024 16:26:22 -0400 Subject: [PATCH 177/310] Updates the libraries for GNU-GPU on Frontier - Uses `-L/opt/cray/pe/gcc//11.2.0/snos/lib64/ -lgfortran` instead of `-L/opt/cray/pe/gcc-libs -lgfortran` as the lib in `/opt/cray/pe/gcc-libs` corresponds to GCC 12.2.0, while we are using GCC 11.2.0. - Adds missing `-L/opt/rocm-5.4.0/lib -lhsa-runtime64` [BFB] --- cime_config/machines/cmake_macros/gnugpu_frontier.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/machines/cmake_macros/gnugpu_frontier.cmake b/cime_config/machines/cmake_macros/gnugpu_frontier.cmake index dbbe7ba2b2e..174f8207d0d 100644 --- a/cime_config/machines/cmake_macros/gnugpu_frontier.cmake +++ b/cime_config/machines/cmake_macros/gnugpu_frontier.cmake @@ -18,7 +18,7 @@ string(APPEND SPIO_CMAKE_OPTS " -DPIO_ENABLE_TOOLS:BOOL=OFF") set(E3SM_LINK_WITH_FORTRAN "TRUE") string(APPEND CMAKE_CXX_FLAGS " -I$ENV{MPICH_DIR}/include --offload-arch=gfx90a") -string(APPEND CMAKE_EXE_LINKER_FLAGS " -L/opt/cray/pe/gcc-libs -lgfortran -L$ENV{MPICH_DIR}/lib -lmpi -L$ENV{CRAY_MPICH_ROOTDIR}/gtl/lib -lmpi_gtl_hsa ") +string(APPEND CMAKE_EXE_LINKER_FLAGS " -L/opt/cray/pe/gcc/11.2.0/snos/lib64/ -lgfortran -L/opt/rocm-5.4.0/lib -lhsa-runtime64 -L$ENV{MPICH_DIR}/lib -lmpi -L$ENV{CRAY_MPICH_ROOTDIR}/gtl/lib -lmpi_gtl_hsa ") string(APPEND KOKKOS_OPTIONS " -DKokkos_ENABLE_HIP=On -DKokkos_ARCH_ZEN3=On -DKokkos_ARCH_VEGA90A=On -DKokkos_ENABLE_OPENMP=Off") From 867cfa2f288d2bf19a83746b017c2252d21ae95a Mon Sep 17 00:00:00 2001 From: Qi Tang Date: Wed, 17 Apr 2024 19:35:25 -0500 Subject: [PATCH 178/310] Add v3.NARRM resolution Add the northamericax4v1pg2_r025_IcoswISC30E3r5 resolution for the v3.NARRM release. --- cime_config/config_grids.xml | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index 909db8f42ef..3ee9e2f6d06 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -1073,6 +1073,16 @@ oRRS15to5 + + ne0np4_northamericax4v1.pg2 + r025 + IcoswISC30E3r5 + r025 + null + null + IcoswISC30E3r5 + + ne0np4_northamericax4v1.pg2 r0125 @@ -3136,6 +3146,8 @@ $DIN_LOC_ROOT/share/domains/domain.ocn.northamericax4v1pg2_WC14to60E2r3.200929.nc $DIN_LOC_ROOT/share/domains/domain.lnd.northamericax4v1pg2_EC30to60E2r2.220428.nc $DIN_LOC_ROOT/share/domains/domain.ocn.northamericax4v1pg2_EC30to60E2r2.220428.nc + $DIN_LOC_ROOT/share/domains/domain.lnd.northamericax4v1pg2_IcoswISC30E3r5.240416.nc + $DIN_LOC_ROOT/share/domains/domain.ocn.northamericax4v1pg2_IcoswISC30E3r5.240416.nc 1-deg with 1/4-deg over North America (version 1) pg2: @@ -3937,6 +3949,16 @@ cpl/gridmaps/EC30to60E2r2/map_EC30to60E2r2_to_northamericax4v1pg2_mono.220428.nc + + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_IcoswISC30E3r5_traave.20240411.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_IcoswISC30E3r5_trbilin.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_IcoswISC30E3r5-nomask_trbilin.20240331.nc + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_northamericax4v1pg2_traave.20240331.nc + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_northamericax4v1pg2_traave.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_IcoswISC30E3r5_trfvnp2.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_IcoswISC30E3r5_trfvnp2.20240331.nc + + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r0125_mono.20200401.nc cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r0125_bilin.20200401.nc @@ -3944,6 +3966,14 @@ cpl/gridmaps/r0125/map_r0125_to_northamericax4v1pg2_mono.20200401.nc + + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_traave.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_trfvnp2.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_trbilin.20240331.nc + cpl/gridmaps/r025/map_r025_to_northamericax4v1pg2_traave.20240331.nc + cpl/gridmaps/r025/map_r025_to_northamericax4v1pg2_traave.20240331.nc + + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r0125_mono.20200401.nc cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r0125_bilin.20200401.nc @@ -3954,6 +3984,12 @@ cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r05_bilin.220428.nc + + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_traave.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_trfvnp2.20240331.nc + cpl/gridmaps/northamericax4v1np4/map_northamericax4v1pg2_to_r025_trbilin.20240331.nc + + cpl/gridmaps/arcticx4v1pg2/map_arcticx4v1pg2_to_oARRM60to10_mono.20210407.nc cpl/gridmaps/arcticx4v1pg2/map_arcticx4v1pg2_to_oARRM60to10_mono.20210407.nc @@ -4697,6 +4733,10 @@ cpl/cpl6/map_EC30to60E2r2_to_r05_neareststod.220728.nc + + cpl/gridmaps/IcoswISC30E3r5/map_IcoswISC30E3r5_to_r025_traave.20240401.nc + + @@ -4964,6 +5004,11 @@ cpl/cpl6/map_r05_to_IcoswISC30E3r5_cstmnn.r150e300.20231121.nc + + cpl/cpl6/map_r025_to_IcoswISC30E3r5_cstmnn.r150e300.20240401.nc + cpl/cpl6/map_r025_to_IcoswISC30E3r5_cstmnn.r150e300.20240401.nc + + cpl/cpl6/map_r0125_to_WC14to60E2r3_smoothed.r150e300.200929.nc cpl/cpl6/map_r0125_to_WC14to60E2r3_smoothed.r150e300.200929.nc From dcb96aeb605876be81abba0ee052049fd235dd3d Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 20:58:32 -0600 Subject: [PATCH 179/310] Add references, updates to all other pages --- .../mpas-seaice/docs/dev-guide/index.md | 5 ++ components/mpas-seaice/docs/index.md | 14 +++--- components/mpas-seaice/docs/references.md | 46 +++++++++++++++++++ .../mpas-seaice/docs/tech-guide/index.md | 38 +++++++++------ .../mpas-seaice/docs/user-guide/index.md | 34 +++++++------- components/mpas-seaice/mkdocs.yml | 8 ++-- 6 files changed, 105 insertions(+), 40 deletions(-) create mode 100644 components/mpas-seaice/docs/references.md diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 43c0d504699..6c9e4e1d92b 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -3,6 +3,11 @@ Development of the MPAS-seaice component should follow the general procedures ou [Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) [Development Guide for E3SM Documentation](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) +**Configuration Controls** +-------------------------- + +MPAS-seaice is controlled using namelist options. Namelist files for E3SM runs are found in ``E3SM/components/mpas-seaice/bld/namelist_files/``. However, the values in these files are drawn from the Registry, following the convention of all MPAS components. Registry files are used directly for stand-alone MPAS-seaice runs, and E3SM scripts pass information from them into E3SM's namelist files when a PR is merged. E3SM's namelist files need to be changed for development purposes. It's easiest to change all of them when needed, to keep them consistent, taking care not to unintentionally change standalone MPAS-seaice configurations. + **Icepack** ----------- diff --git a/components/mpas-seaice/docs/index.md b/components/mpas-seaice/docs/index.md index fca2046e2ac..cc046f34968 100644 --- a/components/mpas-seaice/docs/index.md +++ b/components/mpas-seaice/docs/index.md @@ -1,20 +1,22 @@ # The E3SM Sea Ice Model (MPAS-seaice) -MPAS-seaice is an unstructured-mesh sea-ice model that uses the Modeling for Prediction Across Scales (MPAS) framework, allowing enhanced horizontal resolution in regions of interest. MPAS-seaice uses many of the methods used in the Los Alamos CICE sea-ice model, but adapted to the Spherical Centroidal Vornoi Tesselation (SCVT) meshes used by the MPAS framework. +MPAS-seaice is an unstructured-mesh sea-ice model that uses the Modeling for Prediction Across Scales (MPAS) framework, allowing enhanced horizontal resolution in regions of interest. MPAS-seaice incorporates many of the methods used in the Los Alamos CICE sea-ice model, but adapted to the Spherical Centroidal Vornoi Tesselation (SCVT) meshes used by the MPAS framework. -* The [MPAS-seaice User's Guide](user-guide/index.md) explains how to control MPAS-seaice within E3SM. -* The [MPAS-seaice Developer's Guide](dev-guide/index.md) explains MPAS-seaice data structures and how to develop new code. -* The [MPAS-seaice Technical Guide](tech-guide/index.md) explains the science behind MPAS-seaice code. +* The [MPAS-seaice User's Guide](user-guide/index.md) outlines the MPAS Framework, on which MPAS-seaice is built, and Icepack, the column physics submodule in MPAS-seaice, and it provides guidance for controlling MPAS-seaice within E3SM. +* The [MPAS-seaice Technical Guide](tech-guide/index.md) describes the mesh and major physics components underlying MPAS-seaice code and its coupling to E3SM. +* The [MPAS-seaice Developer's Guide](dev-guide/index.md) provides additional information relevant for model development, including the Icepack interface and development/testing scripts. **Icepack** ----------- -MPAS-seaice incorporates the Icepack software package for sea ice column physics, developed by the [CICE Consortium](https://github.com/cice-consortium), as a submodule. Icepack documentation provides a complete description of the column physics and instructions for using Icepack as a standalone model. The source code for this documentation is maintained in [E3SM's Icepack fork](https://github.com/E3SM-Project/Icepack/) (navigate to the desired branch, then to doc/source/, etc). This is the documentation associated with the latest Icepack version that has been merged into E3SM, plus any documentation changes made within E3SM itself. This documentation is fully rendered in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). +MPAS-seaice incorporates the Icepack software package for sea ice column physics, developed by the [CICE Consortium](https://github.com/cice-consortium), as a submodule. [Icepack documentation](https://e3sm-icepack.readthedocs.io/en/latest/). provides a complete description of the column physics and instructions for using Icepack as a standalone model. The source code for this documentation is maintained in [E3SM's Icepack fork](https://github.com/E3SM-Project/Icepack/) (navigate to the desired branch, then to doc/source/, etc). This is the documentation associated with the latest Icepack version that has been merged into E3SM, plus any documentation changes made within E3SM itself. This documentation is fully rendered in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). + [Guidance for developing Icepack documentation](https://github.com/CICE-Consortium/About-Us/wiki/Documentation-Workflow-Guide) includes instructions for building the readthedocs documentation yourself. @@ -36,7 +38,7 @@ Code structure within the ``mpas-seaice/``component-level directory: | `` src`` | source code for the model physics and output | | `` src/analysis_members`` | source code for model output | | `` src/column `` | source code for the (original) ``column_package`` | -| `` src/icepack `` | link to icepack submodule | +| `` src/icepack `` | link to the icepack submodule | | `` src/model_forward`` | top-level mpas-seaice modules | | `` src/shared`` | dynamics and general-purpose modules (e.g. mesh, constants) | | `` testing`` | testing scripts | diff --git a/components/mpas-seaice/docs/references.md b/components/mpas-seaice/docs/references.md new file mode 100644 index 00000000000..ea23fe40b8b --- /dev/null +++ b/components/mpas-seaice/docs/references.md @@ -0,0 +1,46 @@ +Bitz, C. M., and W. H. Lipscomb (1999). An energy-conserving thermodynamic model of sea ice, Journal of Geophysical Research: Oceans, 104(C7), 15,669–15,677, doi: 10.1029/1999JC900100. + +Briegleb, B. P., and B. Light (2007). A Delta-Eddington multiple scattering parameterization for solar radiation in the sea ice component of the Community Climate Sys- tem Model, Tech. Rep. NCAR/TN-472+STR, National Center for Atmospheric Research, Boulder, Colorado USA. + +Dang, C., C. S. Zender, and M. G. Flanner (2019). Intercomparison and improvement of two-stream shortwave radiative transfer schemes in earth system models for a unified treatment of cryospheric surfaces. The Cryosphere, 13:2325–2343. doi:10.5194/tc-13-2325-2019. + +Dasgupta, G. (2003). Interpolants within convex polygons: Wachpress' shape functions. Journal of Aerospace Engineering, 16, 1–8. https://doi.org/10.1061/(ASCE)0893- 1321(2003)16:1(1) + +Dukowicz, J. K., & Baumgardner, J. R. (2000). Incremental remapping as a transport/advection algorithm. Journal of Computational Physics, 160(1), 318–335. https://doi.org/10.1006/jcph.2000.6465 + +Dunavant, D. A. (1985). High degree efficient symmetrical Gaussian quadrature rules for the triangle. International Journal for Numerical Methods in Engineering, 21(6), 1129–1148. https://doi.org/10.1002/nme.1620210612 + +Flocco, D., D. L. Feltham, and A. K. Turner (2010). Incorporation of a physically based melt pond scheme into the sea ice component of a climate model, Journal of Geophysi- cal Research: Oceans, 115(C8), doi:10.1029/2009JC005568, C08012. + +Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., Wolfe, J. D., et al. (2019). The DOE E3SM coupled model version 1: Overview and evaluation at
standard resolution. Journal of Advances in Modeling Earth
Systems, 11, 2089–2129. https://doi.org/10.1029/2018MS001603 + +Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. https://doi.org/10.1029/2022MS003156 + +Hibler, W. D. III (1979). A dynamic thermodynamic sea ice model. Journal of Physical Oceanography, 9(4), 815–846. https://doi.org/10.1175/1520- 0485(1979)009<0815:ADTSIM>2.0.CO;2 + +Holland, M. M., D. A. Bailey, B. P. Briegleb, B. Light, and E. Hunke (2012). Improved sea ice shortwave radiation physics in CCSM4: The impact of melt ponds and aerosols on arctic sea ice, Journal of Climate, 25(5), 1413–1430, doi:10.1175/JCLI-D-11- 00078.1. + + +Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. https://doi.org/10.5281/zenodo.1213462 + +Hunke, E. C., & Dukowicz, J. K. (1997). An elastic-viscous-plastic model for sea ice dynamics. Journal of Physical Oceanography, 27(9), 1849–1867. https://doi.org/10.1175/1520-0485(1997)027<1849:AEVPMF>2.0.CO;2 + +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. https://doi.org/10.1175/1520- 0493(2002)130<1848:TEVPSI>2.0.CO;2 + +Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. https://doi.org/10.1016/j.ocemod.2012.11.008 + +Lipscomb, W. H. (2001). Remapping the thickness distribution in sea ice models, Journal of Geophysical Research: Oceans, 106(C7), 13,989–14,000, doi:10.1029/2000JC000518. + +Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. https://doi.org/10.1175/1520-0493(2004)132<1341:MSITUI>2.0.CO;2 + +Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. https://doi.org/10.1029/2005JC003355 + +Lipscomb, W. H., & Ringler, T. D. (2005). An incremental remapping transport scheme on a spherical geodesic grid. Monthly Weather Review, 133(8), 2335–2350. https://doi.org/10.1175/MWR2983.1 + +Turner, A. K., and E. C. Hunke (2015). Impacts of a mushy-layer thermodynamic ap- proach in global sea-ice simulations using the CICE sea-ice model, Journal of Geophys- ical Research: Oceans, 120(2), 1253–1275, doi:10.1002/2014JC010358. + +Turner, A. K., E. C. Hunke, and C. M. Bitz (2013). Two modes of sea-ice gravity drainage: A parameterization for large-scale modeling, Journal of Geophysical Research: Oceans, 118(5), 2279–2294, doi:10.1002/jgrc.20171. + +Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. https://doi.org/10.5194/gmd-2021-355 + + diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index 8a993ab42d8..427f670186b 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -1,21 +1,25 @@ **Primary documentation for MPAS-seaice** ----------------------------------------- +See complete citations in [References](../references.md). -Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., Wolfe, J. D., et al. (2019). The DOE E3SM coupled model version 1: Overview and evaluation at
standard resolution. Journal of Advances in Modeling Earth
Systems, 11, 2089–2129. https://doi.org/10.1029/2018MS001603 +**E3SM v1 Overview**: Golaz et al., JAMES 2019 -Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. https://doi.org/10.5194/gmd-2021-355 +**MPAS-seaice v1**: Turner et al., GMD Discussions, 2021. -Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. https://doi.org/10.1029/2022MS003156 +**E3SM v2 Overview**: Golaz et al., JAMES 2022 -Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). +**Icepack**: Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). A comprehensive paper describing MPAS-seaice is in preparation. **Meshes** ---------- -MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses a B-grid (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. For more information about the meshes, see the [Users Guide](../user-guide/index.md). +MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses B-grid discretizations (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. + +The MPAS mesh system requires the definition of seven elements. These seven elements are composed of two types of _cells_, two types of _lines_, and three types of _points_. These elements can be defined on either the plane or the surface of the sphere. The two types of cells form two meshes, a primal mesh composed of Voronoi regions and a dual mesh composed of Delaunay triangles. Each corner of a primal mesh cell is uniquely associated with the "center" of a dual mesh cell and vice versa. The boundary of a given primal mesh cell is composed of the set of lines that connect the centers of the dual mesh cells. Similarly, the boundary of a given dual mesh cell is composed of the set of lines that connect the center points of the associated primal mesh cells. A line segment that connects two primal mesh cell centers is uniquely associated with a line seqment that connects two dual mesh cell centers. We assume that these two line seqments cross and are orthogonal. Since the two line seqments crossing are othogonal, they form a convenient local coordinate system for each edge. ![mesh](../figures/mesh.png) +Figure: Sample from an MPAS mesh showing the primal mesh (solid lines), the dual mesh (dashed), and velocity components aligned with a locally Cartesian coordinate system (east/north). **Velocity and Stresses** ------------------------- @@ -35,10 +39,10 @@ Two schemes to calculate the strain rate tensor and the divergence of internal s **Horizontal Transport of Ice Area Fraction and Tracers** --------------------------------------------------------- -Horizontal transport of ice concentration, volume, and tracers is achieved with an incremental remapping (IR) scheme similar to that described in Dukowicz and Baumgardner (2000), Lipscomb and Hunke (2004), and Lipscomb and Ringler (2005). For MPAS-Seaice the IR scheme was generalized to work on either the standard MPAS mesh (hexagons and other n-gons of varying sizes, with a vertex degree of 3) or a quadrilateral mesh (with a vertex degree of 4 as in CICE). Since MPAS meshes are unstructured, the IR scheme had to be rewritten from scratch. Most of the code is mesh-agnostic, but a small amount of code is specific to quad meshes. -The transport equations describe conservation of quantities such as volume and energy. Fractional ice area (aka sea ice concentration) is a mass-like quantity whose transport equation forms the basis for all other transported quantities in the model. In particular, ice volume is the product of ice area and thickness; therefore thickness is treated as a tracer on ice area, transported with the continuity equation for conservation of volume. Likewise, snow depth is carried as a tracer on ice area via a conservation of snow volume equation. Ice thickness and snow depth are referred to as “type 1” tracers (carried directly on ice area). Ice and snow enthalpy in each vertical layer are type 2 tracers, carried on ice and snow volume. When run with advanced options (e.g., active melt ponds and biogeochemistry), MPAS-Seaice advects tracers up to type 3. Thus, the mass-like field (area) is the “parent field” for type 1 tracers; type 1 tracers are parents of type 2; and type 2 tracers are parents of type 3. Sources and sinks of mass and tracers (e.g., ice growth and melting) are treated separately from transport. +Horizontal transport of ice concentration, volume, and tracers is achieved with an incremental remapping (IR) scheme similar to that described in Dukowicz and Baumgardner (2000), Lipscomb and Hunke (2004), and Lipscomb and Ringler (2005). For MPAS-Seaice the IR scheme was generalized to work on either the standard MPAS mesh (hexagons and other n-gons of varying sizes, with a vertex degree of 3, or a quadrilateral mesh with a vertex degree of 4 as in CICE. Since MPAS meshes are unstructured, the IR scheme had to be rewritten from scratch. Most of the code is mesh-agnostic, but a small amount of code is specific to quad meshes. +The transport equations describe conservation of quantities such as volume and energy. Fractional ice area (also known as sea ice concentration) is a mass-like quantity whose transport equation forms the basis for all other transported quantities in the model. In particular, ice volume is the product of ice area and thickness; therefore thickness is treated as a tracer on ice area, transported with the continuity equation for conservation of volume. Likewise, snow depth is carried as a tracer on ice area via a conservation of snow volume equation. Ice thickness and snow depth are referred to as “type 1” tracers (carried directly on ice area). Ice and snow enthalpy in each vertical layer are type 2 tracers, carried on ice and snow volume. When run with advanced options (e.g., active melt ponds and biogeochemistry), MPAS-Seaice advects tracers up to type 3. Thus, the mass-like field (area) is the “parent field” for type 1 tracers; type 1 tracers are parents of type 2; and type 2 tracers are parents of type 3. Sources and sinks of mass and tracers (e.g., ice growth and melting) are treated separately from transport. -The transport time step is limited by the requirement that trajectories projected backward from vertices are confined to the cells sharing the vertex (i.e., 3 cells for the standard MPAS mesh and 4 for the quad mesh). This is what is meant by incremental as opposed to general remapping. For highly divergent velocity fields, the maximum time step may have to be reduced by a factor of 2 to ensure that trajectories do not cross. The IR algorithm consists of the following steps: +The transport time step is limited by the requirement that trajectories projected backward from vertices are confined to the cells sharing the vertex (i.e., 3 cells for the standard MPAS mesh and 4 for the quad mesh). This is what is meant by incremental as opposed to general remapping. For highly divergent velocity fields, the maximum time step may have to be reduced by a factor of 2 to ensure that trajectories do not cross. The incremental remapping algorithm consists of the following steps: 1. Given mean values of the ice area and tracer fields in each grid cell and thickness category, construct linear approximations of these fields. Limit the field gradients to preserve mono- tonicity. 2. Given ice velocities at grid cell vertices, identify departure regions for the transport across each cell edge. Divide these departure regions into triangles and compute the coordinates of the triangle vertices. @@ -52,9 +56,7 @@ With advanced physics and biogeochemistry (BGC) options, MPAS-Seaice can be conf **Column Physics** ------------------ -The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. - -Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). +The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``config_column_physics_type = 'column_package'`` option is still available but is no longer being supported in MPAS-seaice. Because of the strong thermal gradients between the (cold) atmosphere and (relatively warm) oceans in polar regions, a large portion of the physics in sea ice models can be described in a vertical column, without reference to neighboring grid cells. MPAS-Seaice shares the same column physics code as CICE through the Icepack library (Hunke et al., 2018), which is maintained by the CICE Consortium. This code includes several options for simulating sea ice thermodynamics, mechanical redistribution (ridging) and associated area and thickness changes. In addition, the model supports a number of tracers, including thickness, enthalpy, ice age, first-year ice area, deformed ice area and volume, melt ponds, snow properties and biogeochemistry. @@ -62,6 +64,8 @@ Icepack is implemented in MPAS-seaice as a git submodule. Icepack consists of th Icepack includes sophisticated vertical physics and biogeochemical schemes, which include vertical thermodynamics schemes (Bitz and Lipscomb, 1999; Turner et al., 2013; Turner and Hunke, 2015), melt-pond parameterizations (Flocco et al., 2010; Hunke et al., 2013), a delta-Eddington radiation scheme (Briegleb and Light, 2007; Holland et al., 2012a), schemes for transport in thickness space (Lipscomb, 2001), and representations of mechanical redistribution (Lipscomb et al., 2007). +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). + **Thermodynamics** In its default configuration, MPAS-Seaice uses the “mushy layer” vertical thermodynamics scheme of Turner et al. (2013) and Turner and Hunke (2015). The mushy layer formulation describes the sea ice as a two-phase system of crystalline, fresh ice and liquid brine. Enthalpy depends on temperature and salinity, all of which are prognostic variables. The mushy layer equations are derived from conservation of energy, conservation of salt, an ice-brine liquidus relation that determines the temperature- and salinity-dependent phase, and Darcy flow through a porous medium to describe the vertical movement of brine within the ice. When or where the ice is cold, brine pockets are isolated from each other, but warmer temperatures cause the brine pockets to expand and connect into vertical channels in which meltwater, seawater, biology and nutrients may move through the ice. @@ -72,21 +76,27 @@ MPAS-seaice uses the level-ice melt pond scheme of Hunke et al. (2013). The pond **Radiation** -The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75◦ (Dang et al., 2019). +The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75o (Dang et al., 2019). **Snow** -A new snow-on-sea ice-morphology has been added to E3SMv2 that includes the effects of wind redistribution: losses to leads and meltponds, and the piling of snow against ridges. Snow grain radius, now a prognosed tracer field on sea ice, evolves according to temperature gradient and wet snow metamorphisms and feeds back to the SNICAR-AD radiative model up to a dry maximum of 2800 μm. Fresh snow falls at a grain radius of 54.5 μm, and five vertical snow layers replace the previous single snow layer atop  each of the five sea ice thickness categories retained from E3SMv1. +A new snow-on-sea-ice morphology has been added to E3SMv2 that includes the effects of wind redistribution: losses to leads and meltponds, and the piling of snow against ridges. Snow grain radius, now a prognosed tracer field on sea ice, evolves according to temperature gradient and wet snow metamorphism and feeds back to the SNICAR-AD radiative model up to a dry maximum of 2800 μm. Fresh snow falls at a grain radius of 54.5 μm, and five vertical snow layers replace the previous single snow layer atop each of the five sea ice thickness categories retained from E3SMv1. + +A paper describing the advanced snow physics is in preparation. **Biogeochemistry** +This section is under construction, pending the full merge of BGC codes in Icepack and the older column physics package. + **Coupling of MPAS-seaice within E3SM** --------------------------------------- +This section is under construction. Current text is quoted from the v1 and v2 overview papers. + v1: Coupling of the sea ice component to the ocean takes advantage of z star ocean coordinates as described by Campin et al. (2008) and is a departure from the coupling of CICE and POP (Parallel Ocean Program) in CESM1. The weight of sea ice contributes to the ocean's barotropic mode, notably affecting the free surface over continental shelves. In shallow water depths at or less than the floating ice draft, the weight passed to the ocean model is limited to prevent evacuation of the underlying liquid column. When frazil ice forms in the ocean model, the volume of newly formed crystals is passed to the sea ice model with a fixed salinity of 4 PSU, rather than exchanging a freezing potential as in other models. Future versions of E3SM will permit progressive brine drainage to the ocean from the mushy layer physics used in MPAS-Seaice (Turner & Hunke, 2015). For E3SMv1, brine drainage occurs internally in MPAS-Seaice for thermodynamic calculations, but for the sake of freshwater coupling, the ocean model only receives mass fluxes back from melted sea ice at the fixed salinity that it originally passed to its cryospheric counterpart (4 PSU). The ocean temperature immediately under the ice is the same as the liquid phase in the lowest layer of the sea ice model and is not fixed at −1.8 ◦C as is typical of previous generation coupled models (Naughten et al., 2017). For the current version, we have addressed these long-standing ocean-ice coupling issues identified by the modeling community: explicit sea ice mass and salt exchange, a pressure force of the ice on the ocean, a basal sea ice temperature consistent with the ocean model's equation of state, and resolved inertial oscillations (Hibler et al., 2006; Lique et al., 2016; Schmidt et al., 2004). v2: The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content  assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conserva tion between sea ice and ocean models, this improvement greatly reduces a negative sea  ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model as described by Campin et al. (2008). 
Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. **Prescribed Ice Mode** -E3SMv2 now also includes a prescribed-extent ice mode for MPAS-SeaIce based  CICE in E3SMv1 and CESM (Bailey et al., 2011). This mode is needed for AMIP (Atmospheric Model Intercomparison Project) style simulations where a full prognostic sea ice model is not desired but sea ice surface fluxes, albedos, snow depth, and surface temperature are needed by the atmosphere model and are calculated by the vertical thermodynamics module of the sea ice component. The mode is intended for atmosphere sensitivity experiments and does not conserve energy or mass. In this mode sea ice thermodynamics is active but sea ice dynamics are disabled and at each time step ice area and thickness are reset to specified values. Ice area is interpolated in time and space from an input data set, while ice thickness in grid cells containing sea ice is set to 2 m in the Northern hemisphere and 1 m in the Southern hemisphere. During each adjustment snow volume is adjusted to preserve the snow thickness prognosed in the previous time step. Snow temperatures are reset to the surface temperature, as prognosed in the previous time step, while ice temperatures are set so that the ice temperature gradient is linear, with the ice temperature at the top equal to the prognosed surface tem perature, and equal to the sea freezing temperature at the base of the ice. The vertical ice salinity profile is reset to the profile from Bitz & Lipscomb (1999). MPAS-SeaIce can now replace CICE in such configurations, but CICE continues to be used for those requiring exceptional computational efficiency. 
 +E3SM also includes a prescribed-extent ice mode for MPAS-SeaIce based the CESM implementation. This mode is needed for Atmospheric Model Intercomparison Project (AMIP) style simulations where a full prognostic sea ice model is not desired but sea ice surface fluxes, albedos, snow depth, and surface temperature are needed by the atmosphere model. These fields are calculated by the vertical thermodynamics module of the sea ice component. The prescribed-ice mode is intended for atmosphere sensitivity experiments and does not conserve energy or mass. In this mode, sea ice thermodynamics is active but sea ice dynamics are disabled, and at each time step ice area and thickness are reset to specified values. Ice area is interpolated in time and space from an input data set, while ice thickness in grid cells containing sea ice is set to 2 m in the Northern hemisphere and 1 m in the Southern hemisphere. During each area and thickness adjustment, snow volume preserves the snow thickness prognosed in the previous time step. Snow temperatures are reset to the surface temperature, as prognosed in the previous time step, while ice temperatures are set so that the ice temperature gradient is linear, with the ice temperature at the top equal to the prognosed surface temperature, and equal to the sea freezing temperature at the base of the ice. The vertical ice salinity profile is reset to the profile from Bitz & Lipscomb (1999). The prescribed-ice mode implemented in MPAS-SeaIce can now replace that in CICE in such configurations, but CICE continues to be used for those requiring exceptional computational efficiency. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index de73ce37843..fcf0c163924 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -5,23 +5,19 @@ Guidance for using E3SM is available from [E3SM's public web site](https://e3sm. MPAS-seaice is built on the MPAS Framework. -The MPAS Framework provides the foundation for a generalized geophysical fluid dynamics model on unstructured spherical and planar meshes. On top of the framework, implementations specific to the modeling of a particular physical system (e.g., land ice, ocean) are created as MPAS cores. To date, MPAS cores for atmosphere (Skamarock et al., 2012), ocean (Ringler et al., 2013; Petersen et al., 2015, 2018), shallow water (Ringler et al., 2011), sea ice (Turner et al., 2018), and land ice (Hoffman et al., 2018) have been implemented. The MPAS design philosophy is to leverage the efforts of developers from the various MPAS cores to provide common framework functionality with minimal effort, allowing MPAS core developers to focus on development of the physics and features relevant to their application. +The MPAS Framework provides the foundation for a generalized geophysical fluid dynamics model on unstructured spherical and planar meshes. On top of the framework, implementations specific to the modeling of a particular physical system (e.g., sea ice, ocean) are created as MPAS cores. The MPAS design philosophy is to leverage the efforts of developers from the various MPAS cores to provide common framework functionality with minimal effort, allowing MPAS core developers to focus on development of the physics and features relevant to their application. The framework code includes shared modules for fundamental model operation. Significant capabilities include: - - Description of model data types. MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom accessor routines exist. Core-specific variables are easily defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. - - Description of the mesh specification. MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. More details are provided in the next section. - - Distributed memory parallelization and domain decomposition. The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each pro- cessor to, for example, optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. - - Parallel input and output capabilities. MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO) (Dennis et al., 2012). The Registry definitions control which fields can be input and/or output, and a framework streams functionality provides easy run- time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. - - Advanced timekeeping. MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). - - Run-time configurable control of model options. Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. - - Online, run-time analysis framework. A system for defining analysis of model states during run time, reducing the need for post-processing and model output. -Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. - - -The MPAS grid system requires the definition of seven elements. These seven elements are composed of two types of _cells_, two types of _lines_, and three types of _points_. These elements can be defined on either the plane or the surface of the sphere. The two types of cells form two meshes, a primal mesh composed of Voronoi regions and a dual mesh composed of Delaunay triangles. Each corner of a primal mesh cell is uniquely associated with the "center" of a dual mesh cell and vice versa. The boundary of a given primal mesh cell is composed of the set of lines that connect the centers of the dual mesh cells. Similarly, the boundary of a given dual mesh cell is composed of the set of lines that connect the center points of the associated primal mesh cells. A line segment that connects two primal mesh cell centers is uniquely associated with a line seqment that connects two dual mesh cell centers. We assume that these two line seqments cross and are orthogonal. Since the two line seqments crossing are othogonal, they form a convenient local coordinate system for each edge. - + - **Description of model data types.** MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom access routines exist. Core-specific variables are defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. + - **Mesh specification.** MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. For more information about the meshes, see the [Users Guide](../user-guide/index.md). + - **Distributed memory parallelization and domain decomposition.** The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each processor to optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. + - **Parallel input and output capabilities.** MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO). The Registry definitions control which fields can be input and/or output, and a framework "streams" functionality provides run-time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. + - **Advanced timekeeping.** MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). + - **Run-time configurable control of model options.** Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. + - **Online, run-time analysis framework.** A system for defining analysis of model states during run time, reducing the need for post-processing and model output. +Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. **Configuring MPAS-seaice** --------------------------- @@ -33,7 +29,9 @@ MPAS-seaice is controlled using namelist options. - Namelist options are defined in ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the element. + - Some namelist values or combinations are not allowed and will generate warnings and often abort the code. The consistency checks for using MPAS-seaice within E3SM are in ``mpas_seaice_initialize`` (subroutines ``seaice_check_configs_coupled``, ``seaice_check_constants_coupled``), and those specific to Icepack can be found in subroutine ``check_column_package_configs`` in ``mpas_seaice_icepack.F``. +Related namelist variables are grouped according to their application. | Namelist Groups | Relevant application | | ------------------- | -------------------- | @@ -41,9 +39,9 @@ MPAS-seaice is controlled using namelist options. | ``io`` | input/output | | ``decomposition`` | mesh parallelization | | ``restart`` | restarting the code | -| ``dimensions`` | ? | +| ``dimensions`` | column physics dimensions (layers, categories) | | ``initialize`` | initialization | -| ``use_sections`` | ? | +| ``use_sections`` | turn entire parameterizations on and off | | ``forcing`` | forcing for standalone configurations | | ``velocity_solver`` | algorithms for solving the dynamics (velocity and stress) equations | | ``advection`` | advection | @@ -68,7 +66,11 @@ The Icepack software has replaced the original ``colpkg`` column physics code in Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). -The mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in E3SM/components/mpas-seaice/src/..... +The MPAS-seaice driver for Icepack is + +``E3SM/components/mpas-seaice/src/shared/mpas_seaice_icepack.f`` + +and the mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in subroutine ``init_icepack_package_configs`` (see the argument list for ``call subroutine icepack_init_parameters`` and comments at the end of ``init_icepack_package_configs``. **Configuring Model Input and Output** -------------------------------------- diff --git a/components/mpas-seaice/mkdocs.yml b/components/mpas-seaice/mkdocs.yml index 062ee03553f..c89222d5e58 100644 --- a/components/mpas-seaice/mkdocs.yml +++ b/components/mpas-seaice/mkdocs.yml @@ -2,8 +2,8 @@ site_name: MPAS-seaice nav: - Introduction: 'index.md' - - User's Guide: user-guide/index.md - - Developer's Guide: dev-guide/index.md - - Technical Guide: tech-guide/index.md - + - User's Guide: 'user-guide/index.md' + - Technical Guide: 'tech-guide/index.md' + - Developer's Guide: 'dev-guide/index.md' + - References: 'references.md' From bccf3ec1112ca138cf2a30e6764a967deca97696 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 21:54:27 -0600 Subject: [PATCH 180/310] Attempt to fix some linter errors --- .../mpas-seaice/docs/dev-guide/index.md | 103 +++++++++--------- 1 file changed, 51 insertions(+), 52 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 6c9e4e1d92b..d7ff3820dca 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -1,6 +1,9 @@ +**General Guidance** +-------------------- + Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. -[Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) +[Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) [Development Guide for E3SM Documentation](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) **Configuration Controls** @@ -18,13 +21,13 @@ To access the column physics in Icepack, MPAS-seaice uses methods defined in ``i Basic Icepack development can be done in standalone mode using Icepack's testing scripts, directly in the submodule branch in MPAS-seaice. **We recommend that Icepack developments be thoroughly tested within E3SM's coupled framework throughout the development process, including fully coupled simulations.** **E3SM-Polar-Developer Script** ------------------------------------ +------------------------------- To accelerate early development stages, a script is available for configuring and testing MPAS-seaice (including the Icepack submodule) in D compsets, which have the sea ice component active and data models for the other components. **View helpful information, including default values for duration, configuration, etc.** -``` +```text git clone git@github.com:E3SM-Project/SimulationScripts.git cd SimulationScripts/archive/PolarGroup ./E3SM-Polar-Developer.sh -h @@ -34,11 +37,11 @@ For debugging E3SM, search the script for 'debug' and follow the instructions. The following examples describe how to use the script for development in Icepack. Similar procedures could be used for any MPAS-SI physics development. -**Set up and run baselines** +**Set up and run baselines.** Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. -``` +```text $ less nset01.nlk [mpassi] config_column_physics_type = {'column_package','icepack'} @@ -47,45 +50,44 @@ config_use_snicar_ad = {.false.} Notes: - - A .nlk file without any config settings will create a baseline using default settings. - - The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. +- A .nlk file without any config settings will create a baseline using default settings. +- The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. Fetch E3SM (choose any name for the directory baselines01): -``` +```text ./E3SM-Polar-Developer.sh -s baselines01 -f git@github.com:E3SM-Project/E3SM ``` Set up a new case and build it: -``` +```text ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -n -b ``` Submit: -``` +```text ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -q ``` Examine the diagnostic output (compares the icepack run with the column_package run in this example): -``` +```text ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -a -v ``` - -**Set up a sandbox for model development, to be compared with the baselines** +**Set up a sandbox for model development, to be compared with the baselines.** Fetch E3SM (choose any name for the directory newdev01): -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -f git@github.com:E3SM-Project/E3SM ``` Create a new development branch: -``` +```text cd ~/E3SM-Polar/code/newdev01 git branch newbranch git checkout newbranch @@ -93,61 +95,59 @@ git checkout newbranch Set up a new case and build it: - -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -n -b ``` -Develop and test... +Develop and test... Build/compile: -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -b ``` Submit: -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -q ``` Examine the diagnostic output: -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -e -a -v ``` Compare with the baselines case directory (use your D3 baselines directory): -``` +```text ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -a D3.nset01.baselines01.master.E3SM-Project.anvil -v ``` -**Make changes in Icepack and PR to the Consortium** +**Make changes in Icepack and PR to the Consortium.** We recommend PR’ing Icepack changes first to the Consortium then to E3SM’s icepack fork, in order to keep the repositories in sync and to ensure the changes are robust outside of E3SM. Some changes to Icepack require extensive changes to the driver code (e.g. MPAS-seaice or CICE), making this process challenging. Contact the [CICE Consortium](https://github.com/CICE-Consortium/About-Us/wiki/Contributing) to discuss and identify a collaborative path forward. -First, create a baseline (standalone) Icepack test suite using the E3SM icepack fork or, if the Consortium code is different, using Consortium icepack main -(see [Consortium documentation](https://cice-consortium-icepack.readthedocs.io/en/main/user_guide/ug_testing.html).) +First, create a baseline (standalone) Icepack test suite using the E3SM icepack fork or, if the Consortium code is different, using Consortium icepack main (see [Consortium documentation](https://cice-consortium-icepack.readthedocs.io/en/main/user_guide/ug_testing.html).) -Similarly test your branch of Icepack within E3SM and compare with the baseline. +Similarly test your branch of Icepack within E3SM and compare with the baseline. When satisfied with E3SM testing, PR to Consortium icepack main: -``` +```text git remote add consortium git@github.com:cice-consortium/icepack.git git pull consortium main ``` Fix conflicts if needed, then -``` +```text git add ... git commit -m "update from cice-consortium main" ``` Continue testing. When satisfied, -``` +```text git push origin branch ``` @@ -162,15 +162,15 @@ More extensive documentation of this workflow tool used for the Icepack merge pr Example to run a CICE-QC comparison between two E3SM simulations with changes to the sea ice component. -**Set up and run simulations to be compared** +**Set up and run simulations to be compared.** -``` +```text cd ~/SimulationScripts/archive/PolarGroup/ ``` Create a `.nlk` file with namelist changes to include the thickness analysis member. Include changes to namelist values needed in both the baseline and the test here, if desired (append the last 3 lines here to the end of your standard D-case test .nlk). -``` +```text $ less qcbase.nlk [mpassi] config_AM_thicknesses_enable = {.true.} @@ -180,30 +180,30 @@ config_AM_thicknesses_write_on_startup = {.true.} Use test script to clone E3SM, and create a sandbox -``` +```text ./E3SM-Polar-Developer.sh -s qcbaseline -f git@github.com:E3SM-Project/E3SM ``` Edit ``~/E3SM-Polar/code/qcbaseline/components/mpas-seaice/cime_config/buildnml`` to change: -``` +```text lines.append(' output_interval="none">') ``` -to +to -``` +```text lines.append(' output_interval="00-00-01_00:00:00">') ``` for ``stream name=“output”`` and add -``` +```text lines.append(' ') ``` a few lines below that: -``` +```text lines.append(' Date: Wed, 17 Apr 2024 22:24:20 -0600 Subject: [PATCH 181/310] More delinting --- .../mpas-seaice/docs/dev-guide/index.md | 8 ++--- components/mpas-seaice/docs/index.md | 29 ++++++++------- components/mpas-seaice/docs/references.md | 31 ++++++++-------- .../mpas-seaice/docs/tech-guide/index.md | 20 ++++++----- .../mpas-seaice/docs/user-guide/index.md | 36 ++++++++++--------- 5 files changed, 66 insertions(+), 58 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index d7ff3820dca..688ae3e7416 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -1,5 +1,6 @@ -**General Guidance** --------------------- +Developer's Guide +================= + Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. @@ -203,6 +204,7 @@ lines.append(' ') ``` a few lines below that: + ```text lines.append(' -Dukowicz, J. K., & Baumgardner, J. R. (2000). Incremental remapping as a transport/advection algorithm. Journal of Computational Physics, 160(1), 318–335. https://doi.org/10.1006/jcph.2000.6465 +Dukowicz, J. K., & Baumgardner, J. R. (2000). Incremental remapping as a transport/advection algorithm. Journal of Computational Physics, 160(1), 318–335. -Dunavant, D. A. (1985). High degree efficient symmetrical Gaussian quadrature rules for the triangle. International Journal for Numerical Methods in Engineering, 21(6), 1129–1148. https://doi.org/10.1002/nme.1620210612 +Dunavant, D. A. (1985). High degree efficient symmetrical Gaussian quadrature rules for the triangle. International Journal for Numerical Methods in Engineering, 21(6), 1129–1148. Flocco, D., D. L. Feltham, and A. K. Turner (2010). Incorporation of a physically based melt pond scheme into the sea ice component of a climate model, Journal of Geophysi- cal Research: Oceans, 115(C8), doi:10.1029/2009JC005568, C08012. -Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., Wolfe, J. D., et al. (2019). The DOE E3SM coupled model version 1: Overview and evaluation at
standard resolution. Journal of Advances in Modeling Earth
Systems, 11, 2089–2129. https://doi.org/10.1029/2018MS001603 +Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., Wolfe, J. D., et al. (2019). The DOE E3SM coupled model version 1: Overview and evaluation at
standard resolution. Journal of Advances in Modeling Earth
Systems, 11, 2089–2129. -Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. https://doi.org/10.1029/2022MS003156 +Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. -Hibler, W. D. III (1979). A dynamic thermodynamic sea ice model. Journal of Physical Oceanography, 9(4), 815–846. https://doi.org/10.1175/1520- 0485(1979)009<0815:ADTSIM>2.0.CO;2 +Hibler, W. D. III (1979). A dynamic thermodynamic sea ice model. Journal of Physical Oceanography, 9(4), 815–846. Holland, M. M., D. A. Bailey, B. P. Briegleb, B. Light, and E. Hunke (2012). Improved sea ice shortwave radiation physics in CCSM4: The impact of melt ponds and aerosols on arctic sea ice, Journal of Climate, 25(5), 1413–1430, doi:10.1175/JCLI-D-11- 00078.1. -Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. https://doi.org/10.5281/zenodo.1213462 +Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. -Hunke, E. C., & Dukowicz, J. K. (1997). An elastic-viscous-plastic model for sea ice dynamics. Journal of Physical Oceanography, 27(9), 1849–1867. https://doi.org/10.1175/1520-0485(1997)027<1849:AEVPMF>2.0.CO;2 +Hunke, E. C., & Dukowicz, J. K. (1997). An elastic-viscous-plastic model for sea ice dynamics. Journal of Physical Oceanography, 27(9), 1849–1867. -Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. https://doi.org/10.1175/1520- 0493(2002)130<1848:TEVPSI>2.0.CO;2 +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> -Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. https://doi.org/10.1016/j.ocemod.2012.11.008 +Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. Lipscomb, W. H. (2001). Remapping the thickness distribution in sea ice models, Journal of Geophysical Research: Oceans, 106(C7), 13,989–14,000, doi:10.1029/2000JC000518. -Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. https://doi.org/10.1175/1520-0493(2004)132<1341:MSITUI>2.0.CO;2 +Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. 2.0.CO;2> -Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. https://doi.org/10.1029/2005JC003355 +Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. -Lipscomb, W. H., & Ringler, T. D. (2005). An incremental remapping transport scheme on a spherical geodesic grid. Monthly Weather Review, 133(8), 2335–2350. https://doi.org/10.1175/MWR2983.1 +Lipscomb, W. H., & Ringler, T. D. (2005). An incremental remapping transport scheme on a spherical geodesic grid. Monthly Weather Review, 133(8), 2335–2350. Turner, A. K., and E. C. Hunke (2015). Impacts of a mushy-layer thermodynamic ap- proach in global sea-ice simulations using the CICE sea-ice model, Journal of Geophys- ical Research: Oceans, 120(2), 1253–1275, doi:10.1002/2014JC010358. Turner, A. K., E. C. Hunke, and C. M. Bitz (2013). Two modes of sea-ice gravity drainage: A parameterization for large-scale modeling, Journal of Geophysical Research: Oceans, 118(5), 2279–2294, doi:10.1002/jgrc.20171. -Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. https://doi.org/10.5194/gmd-2021-355 +Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index 427f670186b..e6f1d4e04e6 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -1,5 +1,9 @@ +Technical Guide +=============== + **Primary documentation for MPAS-seaice** ----------------------------------------- + See complete citations in [References](../references.md). **E3SM v1 Overview**: Golaz et al., JAMES 2019 @@ -8,7 +12,7 @@ See complete citations in [References](../references.md). **E3SM v2 Overview**: Golaz et al., JAMES 2022 -**Icepack**: Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). +**Icepack**: Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](). A comprehensive paper describing MPAS-seaice is in preparation. @@ -64,27 +68,27 @@ Icepack is implemented in MPAS-seaice as a git submodule. Icepack consists of th Icepack includes sophisticated vertical physics and biogeochemical schemes, which include vertical thermodynamics schemes (Bitz and Lipscomb, 1999; Turner et al., 2013; Turner and Hunke, 2015), melt-pond parameterizations (Flocco et al., 2010; Hunke et al., 2013), a delta-Eddington radiation scheme (Briegleb and Light, 2007; Holland et al., 2012a), schemes for transport in thickness space (Lipscomb, 2001), and representations of mechanical redistribution (Lipscomb et al., 2007). -Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](). -**Thermodynamics** +**Thermodynamics.** In its default configuration, MPAS-Seaice uses the “mushy layer” vertical thermodynamics scheme of Turner et al. (2013) and Turner and Hunke (2015). The mushy layer formulation describes the sea ice as a two-phase system of crystalline, fresh ice and liquid brine. Enthalpy depends on temperature and salinity, all of which are prognostic variables. The mushy layer equations are derived from conservation of energy, conservation of salt, an ice-brine liquidus relation that determines the temperature- and salinity-dependent phase, and Darcy flow through a porous medium to describe the vertical movement of brine within the ice. When or where the ice is cold, brine pockets are isolated from each other, but warmer temperatures cause the brine pockets to expand and connect into vertical channels in which meltwater, seawater, biology and nutrients may move through the ice. -**Melt Ponds** +**Melt Ponds.** MPAS-seaice uses the level-ice melt pond scheme of Hunke et al. (2013). The ponds are carried as tracers on the level (undeformed) ice area of each thickness category, thus limiting their spatial extent based on the simulated sea ice topography. This limiting is meant to approximate the horizontal drainage of melt water into depressions in ice floes. The ponds evolve according to physically based process descriptions, assuming a thickness-area ratio for changes in pond volume. Melt pond processes include addition of liquid water from rain, melting snow and melting surface ice, drainage of pond water when its weight pushes the ice surface below sea level or when the ice interior becomes permeable, and refreezing of the pond water. If snow falls after a layer of ice has formed on the ponds, the snow may block sunlight from reaching the ponds below. When melt water forms with snow still on the ice, the water is assumed to infiltrate the snow. If there is enough water to fill the air spaces within the snowpack, then the pond becomes visible above the snow, thus decreasing the albedo and ultimately causing the snow to melt faster. The albedo also decreases as snow depth decreases, and thus a thin layer of snow remaining above a pond-saturated layer of snow will have a lower albedo than if the melt water were not present. Level-ice melt ponds are “virtual” in the sense that rain and meltwater is sent to the ocean immediately, and the tracers are only used thereafter to adjust the radiative calculations as if the ponds were present. The delta-Eddington radiative transfer scheme must be active for this purpose. -**Radiation** +**Radiation.** The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75o (Dang et al., 2019). -**Snow** +**Snow.** A new snow-on-sea-ice morphology has been added to E3SMv2 that includes the effects of wind redistribution: losses to leads and meltponds, and the piling of snow against ridges. Snow grain radius, now a prognosed tracer field on sea ice, evolves according to temperature gradient and wet snow metamorphism and feeds back to the SNICAR-AD radiative model up to a dry maximum of 2800 μm. Fresh snow falls at a grain radius of 54.5 μm, and five vertical snow layers replace the previous single snow layer atop each of the five sea ice thickness categories retained from E3SMv1. A paper describing the advanced snow physics is in preparation. -**Biogeochemistry** +**Biogeochemistry.** This section is under construction, pending the full merge of BGC codes in Icepack and the older column physics package. @@ -97,6 +101,6 @@ v1: Coupling of the sea ice component to the ocean takes advantage of z star oce v2: The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content  assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conserva tion between sea ice and ocean models, this improvement greatly reduces a negative sea  ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model as described by Campin et al. (2008). 
Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. -**Prescribed Ice Mode** +**Prescribed Ice Mode.** E3SM also includes a prescribed-extent ice mode for MPAS-SeaIce based the CESM implementation. This mode is needed for Atmospheric Model Intercomparison Project (AMIP) style simulations where a full prognostic sea ice model is not desired but sea ice surface fluxes, albedos, snow depth, and surface temperature are needed by the atmosphere model. These fields are calculated by the vertical thermodynamics module of the sea ice component. The prescribed-ice mode is intended for atmosphere sensitivity experiments and does not conserve energy or mass. In this mode, sea ice thermodynamics is active but sea ice dynamics are disabled, and at each time step ice area and thickness are reset to specified values. Ice area is interpolated in time and space from an input data set, while ice thickness in grid cells containing sea ice is set to 2 m in the Northern hemisphere and 1 m in the Southern hemisphere. During each area and thickness adjustment, snow volume preserves the snow thickness prognosed in the previous time step. Snow temperatures are reset to the surface temperature, as prognosed in the previous time step, while ice temperatures are set so that the ice temperature gradient is linear, with the ice temperature at the top equal to the prognosed surface temperature, and equal to the sea freezing temperature at the base of the ice. The vertical ice salinity profile is reset to the profile from Bitz & Lipscomb (1999). The prescribed-ice mode implemented in MPAS-SeaIce can now replace that in CICE in such configurations, but CICE continues to be used for those requiring exceptional computational efficiency. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index fcf0c163924..76cb2a6bccd 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -1,4 +1,7 @@ -Guidance for using E3SM is available from [E3SM's public web site](https://e3sm.org/model/running-e3sm/e3sm-quick-start/). +User's Guide +============ + +Guidance for using E3SM is available from [E3SM's public web site](). **MPAS Framework** ------------------ @@ -9,14 +12,14 @@ The MPAS Framework provides the foundation for a generalized geophysical fluid d The framework code includes shared modules for fundamental model operation. Significant capabilities include: - - **Description of model data types.** MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom access routines exist. Core-specific variables are defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. - - **Mesh specification.** MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. For more information about the meshes, see the [Users Guide](../user-guide/index.md). +- **Description of model data types.** MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom access routines exist. Core-specific variables are defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. +- **Mesh specification.** MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. For more information about the meshes, see the [Users Guide](../user-guide/index.md). +- **Distributed memory parallelization and domain decomposition.** The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each processor to optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. +- **Parallel input and output capabilities.** MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO). The Registry definitions control which fields can be input and/or output, and a framework "streams" functionality provides run-time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. +- **Advanced timekeeping.** MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). +- **Run-time configurable control of model options.** Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. +- **Online, run-time analysis framework.** A system for defining analysis of model states during run time, reducing the need for post-processing and model output. - - **Distributed memory parallelization and domain decomposition.** The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each processor to optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. - - **Parallel input and output capabilities.** MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO). The Registry definitions control which fields can be input and/or output, and a framework "streams" functionality provides run-time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. - - **Advanced timekeeping.** MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). - - **Run-time configurable control of model options.** Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. - - **Online, run-time analysis framework.** A system for defining analysis of model states during run time, reducing the need for post-processing and model output. Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. **Configuring MPAS-seaice** @@ -24,12 +27,12 @@ Additionally, a number of shared operators exist to perform common operations on MPAS-seaice is controlled using namelist options. - - Default namelist values are found in - ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml``. - - Namelist options are defined in - ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, - including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the element. - - Some namelist values or combinations are not allowed and will generate warnings and often abort the code. The consistency checks for using MPAS-seaice within E3SM are in ``mpas_seaice_initialize`` (subroutines ``seaice_check_configs_coupled``, ``seaice_check_constants_coupled``), and those specific to Icepack can be found in subroutine ``check_column_package_configs`` in ``mpas_seaice_icepack.F``. +- Default namelist values are found in +``E3SM/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml``. +- Namelist options are defined in +``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, +including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the element. +- Some namelist values or combinations are not allowed and will generate warnings and often abort the code. The consistency checks for using MPAS-seaice within E3SM are in ``mpas_seaice_initialize`` (subroutines ``seaice_check_configs_coupled``, ``seaice_check_constants_coupled``), and those specific to Icepack can be found in subroutine ``check_column_package_configs`` in ``mpas_seaice_icepack.F``. Related namelist variables are grouped according to their application. @@ -64,7 +67,7 @@ Related namelist variables are grouped according to their application. The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. -Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest/). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main/). +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](). The MPAS-seaice driver for Icepack is @@ -77,9 +80,8 @@ and the mapping between the names of Icepack's namelist options and those in MPA The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream represents a fixed set of model fields, together with dimensions and attributes, that are all written or read together to or from the same file or set of files. Each MPAS model core may define its own set of default streams that it typically uses for reading initial conditions, for writing and reading restart fields, and for writing additional model history fields. Besides these default streams, users may define new streams to, e.g., write certain diagnostic fields at a higher temporal frequency than the usual model history fields. -Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file is simply ‘streams.’ suffixed with the name of the core. For example, the streams for the sw (shallow-water) core are defined in a file named ‘streams.sw’. An XML stream file may further reference other text files that contain lists of the model fields that are read or written in each of the streams defined in the XML stream file +Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file is simply ‘streams.’ suffixed with the name of the core. For example, the streams for the sw (shallow-water) core are defined in a file named ‘streams.sw’. An XML stream file may further reference other text files that contain lists of the model fields that are read or written in each of the streams defined in the XML stream file. Changes to the XML stream configuration file will take effect the next time an MPAS core is run; there is no need to re-compile after making modifications to the XML files. As described in the next section, it is therefore possible, e.g., to change the interval at which a stream is written, the template for the filenames associated with a stream, or the set of fields that are written to a stream, without the need to re-compile any code. Two classes of streams exist in MPAS: immutable streams and mutable streams. Immutable streams are those for which the set of fields that belong to the stream may not be modified at model run-time; however, it is possible to modify the interval at which the stream is read or written, the filename template describing the files containing the stream on disk, and several other parameters of the stream. In contrast, all aspects of mutable streams, including the set of fields that belong to the stream, may be modified at run-time. The motivation for the creation of two stream classes is the idea that an MPAS core may not function correctly if certain fields are not read in upon model start-up or written to restart files, and it is therefore not reasonable for users to modify this set of required fields at run-time. An MPAS core developer may choose to implement such streams as immutable streams. Since fields may not be added to an immutable stream at run-time, new immutable streams may not be defined at run-time, and the only type of new stream that may be defined at run-time is the mutable stream type. - From d71076597c5b4b2d81149a63a8fdf342f78f6c9c Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 22:38:29 -0600 Subject: [PATCH 182/310] More delinting --- components/mpas-seaice/docs/dev-guide/index.md | 3 +-- components/mpas-seaice/docs/index.md | 4 ++-- components/mpas-seaice/docs/references.md | 8 +++----- components/mpas-seaice/docs/tech-guide/index.md | 6 +++--- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 688ae3e7416..9bb55eace12 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -1,7 +1,6 @@ Developer's Guide ================= - Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. [Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) @@ -41,7 +40,7 @@ The following examples describe how to use the script for development in Icepack **Set up and run baselines.** Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. - + ```text $ less nset01.nlk [mpassi] diff --git a/components/mpas-seaice/docs/index.md b/components/mpas-seaice/docs/index.md index cd2659f769e..e4239d697fd 100644 --- a/components/mpas-seaice/docs/index.md +++ b/components/mpas-seaice/docs/index.md @@ -37,8 +37,8 @@ Code structure within the ``mpas-seaice/``component-level directory: | ``driver`` | coupling modules | | ``src`` | source code for the model physics and output | | ``src/analysis_members`` | source code for model output | -| ``src/column `` | source code for the (original) ``column_package`` | -| ``src/icepack `` | link to the icepack submodule | +| ``src/column`` | source code for the (original) ``column_package`` | +| ``src/icepack`` | link to the icepack submodule | | ``src/model_forward`` | top-level mpas-seaice modules | | ``src/shared`` | dynamics and general-purpose modules (e.g. mesh, constants) | | ``testing`` | testing scripts | diff --git a/components/mpas-seaice/docs/references.md b/components/mpas-seaice/docs/references.md index a0eb6c20b15..2aea4f44476 100644 --- a/components/mpas-seaice/docs/references.md +++ b/components/mpas-seaice/docs/references.md @@ -19,16 +19,16 @@ Golaz, J.-C., Caldwell, P. M.,
Van Roekel, L. P., Petersen, M. R., Tang, Q., W Golaz, J.-C., Van Roekel, L. P., Zheng, X., Roberts, A. F., Wolfe, J. D., Lin, W., et al. (2022). The DOE E3SM Model version 2: Overview of the physical model and initial model evaluation. Journal of Advances in Modeling Earth Systems, 14, e2022MS003156. -Hibler, W. D. III (1979). A dynamic thermodynamic sea ice model. Journal of Physical Oceanography, 9(4), 815–846. +Hibler, W. D. III (1979). A dynamic thermodynamic sea ice model. Journal of Physical Oceanography, 9(4), 815–846. -Holland, M. M., D. A. Bailey, B. P. Briegleb, B. Light, and E. Hunke (2012). Improved sea ice shortwave radiation physics in CCSM4: The impact of melt ponds and aerosols on arctic sea ice, Journal of Climate, 25(5), 1413–1430, doi:10.1175/JCLI-D-11- 00078.1. +Holland, M. M., D. A. Bailey, B. P. Briegleb, B. Light, and E. Hunke (2012). Improved sea ice shortwave radiation physics in CCSM4: The impact of melt ponds and aerosols on arctic sea ice, Journal of Climate, 25(5), 1413–1430, doi:10.1175/JCLI-D-11-00078.1. Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. Hunke, E. C., & Dukowicz, J. K. (1997). An elastic-viscous-plastic model for sea ice dynamics. Journal of Physical Oceanography, 27(9), 1849–1867. -Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. @@ -45,5 +45,3 @@ Turner, A. K., and E. C. Hunke (2015). Impacts of a mushy-layer thermodynamic ap Turner, A. K., E. C. Hunke, and C. M. Bitz (2013). Two modes of sea-ice gravity drainage: A parameterization for large-scale modeling, Journal of Geophysical Research: Oceans, 118(5), 2279–2294, doi:10.1002/jgrc.20171. Turner, A. K., Lipscomb, W. H., Hunke, E. C., Jacobsen, D. W., Jeffery, N., Engwirda, D., Ringer, T. D., Wolfe, J. D. (2021). MPAS-seaice (v1.0.0): Sea-ice dynamics on unstructured Voronoi meshes. Geoscientific Model Development Discussions, 1–46. - - diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index e6f1d4e04e6..7bddb37d033 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -12,7 +12,7 @@ See complete citations in [References](../references.md). **E3SM v2 Overview**: Golaz et al., JAMES 2022 -**Icepack**: Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](). +**Icepack**: Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main). A comprehensive paper describing MPAS-seaice is in preparation. @@ -68,7 +68,7 @@ Icepack is implemented in MPAS-seaice as a git submodule. Icepack consists of th Icepack includes sophisticated vertical physics and biogeochemical schemes, which include vertical thermodynamics schemes (Bitz and Lipscomb, 1999; Turner et al., 2013; Turner and Hunke, 2015), melt-pond parameterizations (Flocco et al., 2010; Hunke et al., 2013), a delta-Eddington radiation scheme (Briegleb and Light, 2007; Holland et al., 2012a), schemes for transport in thickness space (Lipscomb, 2001), and representations of mechanical redistribution (Lipscomb et al., 2007). -Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](). +Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main). **Thermodynamics.** @@ -80,7 +80,7 @@ MPAS-seaice uses the level-ice melt pond scheme of Hunke et al. (2013). The pond **Radiation.** -The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75o (Dang et al., 2019). +The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75 degrees (Dang et al., 2019). **Snow.** From 508c537ef470912ba7c305dd2d3e1e404de4746f Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 22:44:25 -0600 Subject: [PATCH 183/310] More delinting --- components/mpas-seaice/docs/references.md | 4 ++-- components/mpas-seaice/docs/tech-guide/index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/mpas-seaice/docs/references.md b/components/mpas-seaice/docs/references.md index 2aea4f44476..a5508019717 100644 --- a/components/mpas-seaice/docs/references.md +++ b/components/mpas-seaice/docs/references.md @@ -28,13 +28,13 @@ Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. -Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. Lipscomb, W. H. (2001). Remapping the thickness distribution in sea ice models, Journal of Geophysical Research: Oceans, 106(C7), 13,989–14,000, doi:10.1029/2000JC000518. -Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. 2.0.CO;2> +Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. 2.0.CO;2> Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index 7bddb37d033..c45bb5daa18 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -28,7 +28,7 @@ Figure: Sample from an MPAS mesh showing the primal mesh (solid lines), the dual **Velocity and Stresses** ------------------------- -Velocity components at cell vertices are not aligned with the mesh, as in sea ice models with structured meshes and quadrilateral cells. Instead, the velocity components are aligned with a spherical coordinate system that is locally Cartesian, eastwards (u) and northwards (v), irrespective of the orientation of edges joining that vertex. Such a definition, however, would result in a convergence of v components at the geographic North Pole and strong metric terms in the velocity solution. Consequently, in addition, these definitions of u and v are rotated so that their pole lies on the geographical equator at 0◦ longitude. +Velocity components at cell vertices are not aligned with the mesh, as in sea ice models with structured meshes and quadrilateral cells. Instead, the velocity components are aligned with a spherical coordinate system that is locally Cartesian, eastwards (u) and northwards (v), irrespective of the orientation of edges joining that vertex. Such a definition, however, would result in a convergence of v components at the geographic North Pole and strong metric terms in the velocity solution. Consequently, in addition, these definitions of u and v are rotated so that their pole lies on the geographical equator at 0 deg longitude. Velocities are determined by solving the sea ice momentum equation (Hibler, 1979; Hunke & Dukowicz, 1997). During coupled simulations the ocean model provides the ocean surface tilt term; the only other term that depends on the properties of the horizontal grid is the divergence of internal stress. Therefore only this stress term must be adapted for use on MPAS meshes. Otherwise the velocity solver is identical to that in CICE’s standard EVP approach. Determination of the divergence of the internal stress can be broken down into three stages: From cf650e0eb086b739ea858a5deeabd36c2b550483 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 22:48:43 -0600 Subject: [PATCH 184/310] More delinting --- components/mpas-seaice/docs/references.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/mpas-seaice/docs/references.md b/components/mpas-seaice/docs/references.md index a5508019717..9b9247228e1 100644 --- a/components/mpas-seaice/docs/references.md +++ b/components/mpas-seaice/docs/references.md @@ -28,13 +28,13 @@ Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. -Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. 2.0.CO;2> +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. Lipscomb, W. H. (2001). Remapping the thickness distribution in sea ice models, Journal of Geophysical Research: Oceans, 106(C7), 13,989–14,000, doi:10.1029/2000JC000518. -Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. 2.0.CO;2> +Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. From 033a76fa61b4e1fad64bc3d4594788e47466270c Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Wed, 17 Apr 2024 22:51:58 -0600 Subject: [PATCH 185/310] More delinting --- components/mpas-seaice/docs/references.md | 4 ++-- components/mpas-seaice/docs/user-guide/index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/mpas-seaice/docs/references.md b/components/mpas-seaice/docs/references.md index 9b9247228e1..95dbe8f36ee 100644 --- a/components/mpas-seaice/docs/references.md +++ b/components/mpas-seaice/docs/references.md @@ -28,13 +28,13 @@ Hunke, E., et al. (2018). CICE-Consortium/Icepack. Zenodo. -Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. +Hunke, E. C., & Dukowicz, J. K. (2002). The elastic-viscous-plastic sea ice dynamics model in general orthogonal curvilinear coordinates on a sphere—Incorporation of metric terms. Monthly Weather Review, 130(7), 1848–1865. Hunke, E. C., Hebert, D. A., & Lecomte, O. (2013). Level-ice melt ponds in the Los Alamos sea ice model, CICE. Ocean Modelling, 71, 26–42. Lipscomb, W. H. (2001). Remapping the thickness distribution in sea ice models, Journal of Geophysical Research: Oceans, 106(C7), 13,989–14,000, doi:10.1029/2000JC000518. -Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. +Lipscomb, W. H., & Hunke, E. C. (2004). Modeling sea ice transport using incremental remapping. Monthly Weather Review, 132(6), 1341–1354. Lipscomb, W. H., Hunke, E. C., Maslowski, W., & Jakacki, J. (2007). Ridging, strength, and stability in high-resolution sea ice models. Journal of Geophysical Research, 112. C03S91. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index 76cb2a6bccd..27040435929 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -31,7 +31,7 @@ MPAS-seaice is controlled using namelist options. ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_defaults_mpassi.xml``. - Namelist options are defined in ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, -including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the element. +including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an ``entry`` element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the ``entry`` element. - Some namelist values or combinations are not allowed and will generate warnings and often abort the code. The consistency checks for using MPAS-seaice within E3SM are in ``mpas_seaice_initialize`` (subroutines ``seaice_check_configs_coupled``, ``seaice_check_constants_coupled``), and those specific to Icepack can be found in subroutine ``check_column_package_configs`` in ``mpas_seaice_icepack.F``. Related namelist variables are grouped according to their application. From 0a3162135466e711e9f330e0783b83026632d928 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 18 Apr 2024 10:22:34 -0600 Subject: [PATCH 186/310] Move MPAS Framework section, fix level-3 subsection headers --- .../mpas-seaice/docs/dev-guide/index.md | 35 ++++++++++++++----- .../mpas-seaice/docs/tech-guide/index.md | 12 +++---- .../mpas-seaice/docs/user-guide/index.md | 19 ---------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 9bb55eace12..7f17f5fb62d 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -11,6 +11,25 @@ Development of the MPAS-seaice component should follow the general procedures ou MPAS-seaice is controlled using namelist options. Namelist files for E3SM runs are found in ``E3SM/components/mpas-seaice/bld/namelist_files/``. However, the values in these files are drawn from the Registry, following the convention of all MPAS components. Registry files are used directly for stand-alone MPAS-seaice runs, and E3SM scripts pass information from them into E3SM's namelist files when a PR is merged. E3SM's namelist files need to be changed for development purposes. It's easiest to change all of them when needed, to keep them consistent, taking care not to unintentionally change standalone MPAS-seaice configurations. +**MPAS Framework** +------------------ + +MPAS-seaice is built on the MPAS Framework. + +The MPAS Framework provides the foundation for a generalized geophysical fluid dynamics model on unstructured spherical and planar meshes. On top of the framework, implementations specific to the modeling of a particular physical system (e.g., sea ice, ocean) are created as MPAS cores. The MPAS design philosophy is to leverage the efforts of developers from the various MPAS cores to provide common framework functionality with minimal effort, allowing MPAS core developers to focus on development of the physics and features relevant to their application. + +The framework code includes shared modules for fundamental model operation. Significant capabilities include: + +- **Description of model data types.** MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom access routines exist. Core-specific variables are defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. +- **Mesh specification.** MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. For more information about the meshes, see the [Users Guide](../user-guide/index.md). +- **Distributed memory parallelization and domain decomposition.** The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each processor to optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. +- **Parallel input and output capabilities.** MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO). The Registry definitions control which fields can be input and/or output, and a framework "streams" functionality provides run-time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. +- **Advanced timekeeping.** MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). +- **Run-time configurable control of model options.** Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. +- **Online, run-time analysis framework.** A system for defining analysis of model states during run time, reducing the need for post-processing and model output. + +Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. + **Icepack** ----------- @@ -25,7 +44,7 @@ Basic Icepack development can be done in standalone mode using Icepack's testing To accelerate early development stages, a script is available for configuring and testing MPAS-seaice (including the Icepack submodule) in D compsets, which have the sea ice component active and data models for the other components. -**View helpful information, including default values for duration, configuration, etc.** +### View helpful information, including default values for duration, configuration, etc. ```text git clone git@github.com:E3SM-Project/SimulationScripts.git @@ -37,7 +56,7 @@ For debugging E3SM, search the script for 'debug' and follow the instructions. The following examples describe how to use the script for development in Icepack. Similar procedures could be used for any MPAS-SI physics development. -**Set up and run baselines.** +### Set up and run baselines Create a file containing modified namelist options. The file ``nset01.nlk`` in this example creates baselines for two types of column physics and turns off the ``snicar_ad`` radiation scheme. @@ -77,7 +96,7 @@ Examine the diagnostic output (compares the icepack run with the column_package ./E3SM-Polar-Developer.sh -s baselines01 -k nset01.nlk -e -a -v ``` -**Set up a sandbox for model development, to be compared with the baselines.** +### Set up a sandbox for model development, to be compared with the baselines Fetch E3SM (choose any name for the directory newdev01): @@ -124,7 +143,7 @@ Compare with the baselines case directory (use your D3 baselines directory): ./E3SM-Polar-Developer.sh -s newdev01 -k nset01.nlk -a D3.nset01.baselines01.master.E3SM-Project.anvil -v ``` -**Make changes in Icepack and PR to the Consortium.** +### Make changes in Icepack and PR to the Consortium We recommend PR’ing Icepack changes first to the Consortium then to E3SM’s icepack fork, in order to keep the repositories in sync and to ensure the changes are robust outside of E3SM. Some changes to Icepack require extensive changes to the driver code (e.g. MPAS-seaice or CICE), making this process challenging. Contact the [CICE Consortium](https://github.com/CICE-Consortium/About-Us/wiki/Contributing) to discuss and identify a collaborative path forward. @@ -162,7 +181,7 @@ More extensive documentation of this workflow tool used for the Icepack merge pr Example to run a CICE-QC comparison between two E3SM simulations with changes to the sea ice component. -**Set up and run simulations to be compared.** +### Set up and run simulations to be compared ```text cd ~/SimulationScripts/archive/PolarGroup/ @@ -253,7 +272,7 @@ cd ~/SimulationScripts/archive/PolarGroup/ ./E3SM-Polar-Developer.sh -s newdev01 -k qcbase.nlk -e -d60 -q ``` -**Run QC comparison.** +### Run QC comparison ```text cd ~/E3SM-Polar/code/newdev01/components/mpas-seaice/testing/cice-qc @@ -287,7 +306,7 @@ Quadratic Skill Test Passed for Northern Hemisphere Quadratic Skill Test Passed for Southern Hemisphere ``` -**Generate statistics from the CICE-QC runs.** +### Generate statistics from the CICE-QC runs This only works if the .nlk filename is the same for both cases. If comparing only namelist changes within MPAS-seaice, use the ``./E3SM-Polar-Developer.sh`` script with a single .nlk file that includes each option. @@ -296,7 +315,7 @@ cd ~/SimulationScripts/archive/PolarGroup/ $ ./E3SM-Polar-Developer.sh -s qcbaseline -k qcbase.nlk -e -d60 -a D12.qcbase.emc.newdev01.branch.E3SM-Project.anvil -v ``` -**Create comparison plots.** +### Create comparison plots To generate MPAS-Analysis plots from the CICE-QC runs and compare: diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index c45bb5daa18..ec7e06fff23 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -70,25 +70,25 @@ Icepack includes sophisticated vertical physics and biogeochemical schemes, whic Full documentation for E3SM's version of Icepack can be found in [E3SM's Icepack readthedocs](https://e3sm-icepack.readthedocs.io/en/latest). The most up-to-date documentation from the CICE Consortium's main Icepack repository is [here](https://cice-consortium-icepack.readthedocs.io/en/main). -**Thermodynamics.** +### Thermodynamics In its default configuration, MPAS-Seaice uses the “mushy layer” vertical thermodynamics scheme of Turner et al. (2013) and Turner and Hunke (2015). The mushy layer formulation describes the sea ice as a two-phase system of crystalline, fresh ice and liquid brine. Enthalpy depends on temperature and salinity, all of which are prognostic variables. The mushy layer equations are derived from conservation of energy, conservation of salt, an ice-brine liquidus relation that determines the temperature- and salinity-dependent phase, and Darcy flow through a porous medium to describe the vertical movement of brine within the ice. When or where the ice is cold, brine pockets are isolated from each other, but warmer temperatures cause the brine pockets to expand and connect into vertical channels in which meltwater, seawater, biology and nutrients may move through the ice. -**Melt Ponds.** +### Melt Ponds MPAS-seaice uses the level-ice melt pond scheme of Hunke et al. (2013). The ponds are carried as tracers on the level (undeformed) ice area of each thickness category, thus limiting their spatial extent based on the simulated sea ice topography. This limiting is meant to approximate the horizontal drainage of melt water into depressions in ice floes. The ponds evolve according to physically based process descriptions, assuming a thickness-area ratio for changes in pond volume. Melt pond processes include addition of liquid water from rain, melting snow and melting surface ice, drainage of pond water when its weight pushes the ice surface below sea level or when the ice interior becomes permeable, and refreezing of the pond water. If snow falls after a layer of ice has formed on the ponds, the snow may block sunlight from reaching the ponds below. When melt water forms with snow still on the ice, the water is assumed to infiltrate the snow. If there is enough water to fill the air spaces within the snowpack, then the pond becomes visible above the snow, thus decreasing the albedo and ultimately causing the snow to melt faster. The albedo also decreases as snow depth decreases, and thus a thin layer of snow remaining above a pond-saturated layer of snow will have a lower albedo than if the melt water were not present. Level-ice melt ponds are “virtual” in the sense that rain and meltwater is sent to the ocean immediately, and the tracers are only used thereafter to adjust the radiative calculations as if the ponds were present. The delta-Eddington radiative transfer scheme must be active for this purpose. -**Radiation.** +### Radiation The Delta-Eddington radiation scheme of Briegleb & Light (2007) has been updated to the Dang et al. (2019) SNICAR-AD model, to ensure radiative consistency across all snow surfaces in E3SM, including on land, ice sheets and sea ice. The SNICAR-AD radiative transfer code includes five-band snow single-scattering properties, two-stream Delta-Eddington approximation with the adding–doubling technique, and parameterization for correcting the near-infrared (NIR) snow albedo biases when solar zenith angle exceeds 75 degrees (Dang et al., 2019). -**Snow.** +### Snow A new snow-on-sea-ice morphology has been added to E3SMv2 that includes the effects of wind redistribution: losses to leads and meltponds, and the piling of snow against ridges. Snow grain radius, now a prognosed tracer field on sea ice, evolves according to temperature gradient and wet snow metamorphism and feeds back to the SNICAR-AD radiative model up to a dry maximum of 2800 μm. Fresh snow falls at a grain radius of 54.5 μm, and five vertical snow layers replace the previous single snow layer atop each of the five sea ice thickness categories retained from E3SMv1. A paper describing the advanced snow physics is in preparation. -**Biogeochemistry.** +### Biogeochemistry This section is under construction, pending the full merge of BGC codes in Icepack and the older column physics package. @@ -101,6 +101,6 @@ v1: Coupling of the sea ice component to the ocean takes advantage of z star oce v2: The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content  assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conserva tion between sea ice and ocean models, this improvement greatly reduces a negative sea  ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model as described by Campin et al. (2008). 
Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. -**Prescribed Ice Mode.** +### Prescribed Ice Mode E3SM also includes a prescribed-extent ice mode for MPAS-SeaIce based the CESM implementation. This mode is needed for Atmospheric Model Intercomparison Project (AMIP) style simulations where a full prognostic sea ice model is not desired but sea ice surface fluxes, albedos, snow depth, and surface temperature are needed by the atmosphere model. These fields are calculated by the vertical thermodynamics module of the sea ice component. The prescribed-ice mode is intended for atmosphere sensitivity experiments and does not conserve energy or mass. In this mode, sea ice thermodynamics is active but sea ice dynamics are disabled, and at each time step ice area and thickness are reset to specified values. Ice area is interpolated in time and space from an input data set, while ice thickness in grid cells containing sea ice is set to 2 m in the Northern hemisphere and 1 m in the Southern hemisphere. During each area and thickness adjustment, snow volume preserves the snow thickness prognosed in the previous time step. Snow temperatures are reset to the surface temperature, as prognosed in the previous time step, while ice temperatures are set so that the ice temperature gradient is linear, with the ice temperature at the top equal to the prognosed surface temperature, and equal to the sea freezing temperature at the base of the ice. The vertical ice salinity profile is reset to the profile from Bitz & Lipscomb (1999). The prescribed-ice mode implemented in MPAS-SeaIce can now replace that in CICE in such configurations, but CICE continues to be used for those requiring exceptional computational efficiency. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index 27040435929..1612252d1b0 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -3,25 +3,6 @@ User's Guide Guidance for using E3SM is available from [E3SM's public web site](). -**MPAS Framework** ------------------- - -MPAS-seaice is built on the MPAS Framework. - -The MPAS Framework provides the foundation for a generalized geophysical fluid dynamics model on unstructured spherical and planar meshes. On top of the framework, implementations specific to the modeling of a particular physical system (e.g., sea ice, ocean) are created as MPAS cores. The MPAS design philosophy is to leverage the efforts of developers from the various MPAS cores to provide common framework functionality with minimal effort, allowing MPAS core developers to focus on development of the physics and features relevant to their application. - -The framework code includes shared modules for fundamental model operation. Significant capabilities include: - -- **Description of model data types.** MPAS uses a handful of fundamental Fortran derived types for basic model functionality. Core-specific model variables are handled through custom groupings of model fields called pools, for which custom access routines exist. Core-specific variables are defined in XML syntax in a Registry, and the framework parses the Registry, defines variables, and allocates memory as needed. -- **Mesh specification.** MPAS requires 36 fields to fully describe the mesh used in a simulation. These include the position, area, orientation, and connectivity of all cells, edges, and vertices in the mesh. The mesh specification can flexibly describe both spherical and planar meshes. For more information about the meshes, see the [Users Guide](../user-guide/index.md). -- **Distributed memory parallelization and domain decomposition.** The MPAS Framework provides needed routines for exchanging information between processors in a parallel environment using Message Passing Interface (MPI). This includes halo updates, global reductions, and global broadcasts. MPAS also supports decomposing multiple domain blocks on each processor to optimize model performance by minimizing transfer of data from disk to memory. Shared memory parallelization through OpenMP is also supported, but the implementation is left up to each core. -- **Parallel input and output capabilities.** MPAS performs parallel input and output of data from and to disk through the commonly used libraries of NetCDF, Parallel NetCDF (pnetcdf), and Parallel Input/Output (PIO). The Registry definitions control which fields can be input and/or output, and a framework "streams" functionality provides run-time configuration of what fields are to be written to what file name and at what frequency through an XML streams file. The MPAS framework includes additional functionality specific to providing a flexible model restart capability. -- **Advanced timekeeping.** MPAS uses a customized version of the timekeeping functionality of the Earth System Modeling Framework (ESMF), which includes a robust set of time and calendar tools used by many Earth System Models (ESMs). This allows explicit definition of model epochs in terms of years, months, days, hours, minutes, seconds, and fractional seconds and can be set to three different calendar types: Gregorian, Gregorian no leap, and 360 day. This flexibility helps enable multi-scale physics and simplifies coupling to ESMs. To manage the complex date/time types that ensue, MPAS framework provides routines for arithmetic of time intervals and the definition of alarm objects for handling events (e.g., when to write output, when the simulation should end). -- **Run-time configurable control of model options.** Model options are configured through namelist files that use standard Fortran namelist file format, and input/output are configured through streams files that use XML format. Both are completely adjustable at run time. -- **Online, run-time analysis framework.** A system for defining analysis of model states during run time, reducing the need for post-processing and model output. - -Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. - **Configuring MPAS-seaice** --------------------------- From 1a524b7d204442bf8d1d2f20bd0f241577fe4430 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Thu, 18 Apr 2024 10:33:22 -0600 Subject: [PATCH 187/310] Remove mixed header styles for the linter --- .../mpas-seaice/docs/dev-guide/index.md | 20 +++++++----------- .../mpas-seaice/docs/tech-guide/index.md | 21 +++++++------------ .../mpas-seaice/docs/user-guide/index.md | 12 ++++------- 3 files changed, 18 insertions(+), 35 deletions(-) diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 7f17f5fb62d..24fabfa73ac 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -1,18 +1,15 @@ -Developer's Guide -================= +# Developer's Guide Development of the MPAS-seaice component should follow the general procedures outlined by the E3SM project. [Development Guide for E3SM Code](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) [Development Guide for E3SM Documentation](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation) -**Configuration Controls** --------------------------- +## Configuration Controls MPAS-seaice is controlled using namelist options. Namelist files for E3SM runs are found in ``E3SM/components/mpas-seaice/bld/namelist_files/``. However, the values in these files are drawn from the Registry, following the convention of all MPAS components. Registry files are used directly for stand-alone MPAS-seaice runs, and E3SM scripts pass information from them into E3SM's namelist files when a PR is merged. E3SM's namelist files need to be changed for development purposes. It's easiest to change all of them when needed, to keep them consistent, taking care not to unintentionally change standalone MPAS-seaice configurations. -**MPAS Framework** ------------------- +## MPAS Framework MPAS-seaice is built on the MPAS Framework. @@ -30,8 +27,7 @@ The framework code includes shared modules for fundamental model operation. Sign Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. -**Icepack** ------------ +## Icepack For changes to Icepack, please consult the [CICE Consortium's recommendations for code contributions](https://github.com/CICE-Consortium/About-Us/wiki/Contributing). @@ -39,12 +35,11 @@ To access the column physics in Icepack, MPAS-seaice uses methods defined in ``i Basic Icepack development can be done in standalone mode using Icepack's testing scripts, directly in the submodule branch in MPAS-seaice. **We recommend that Icepack developments be thoroughly tested within E3SM's coupled framework throughout the development process, including fully coupled simulations.** -**E3SM-Polar-Developer Script** -------------------------------- +## E3SM-Polar-Developer Script To accelerate early development stages, a script is available for configuring and testing MPAS-seaice (including the Icepack submodule) in D compsets, which have the sea ice component active and data models for the other components. -### View helpful information, including default values for duration, configuration, etc. +### View helpful information, including default values for duration, configuration, etc ```text git clone git@github.com:E3SM-Project/SimulationScripts.git @@ -176,8 +171,7 @@ Once the PR has been tested and merged into the main Icepack codebase, a new PR More extensive documentation of this workflow tool used for the Icepack merge project is available [here](https://acme-climate.atlassian.net/wiki/spaces/ICE/pages/3450339435/Project+Workflow). -**CICE-QC Quality Control Testing** ------------------------------------ +## CICE-QC Quality Control Testing Example to run a CICE-QC comparison between two E3SM simulations with changes to the sea ice component. diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index ec7e06fff23..7f0a2e4c940 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -1,8 +1,6 @@ -Technical Guide -=============== +# Technical Guide -**Primary documentation for MPAS-seaice** ------------------------------------------ +## Primary documentation for MPAS-seaice See complete citations in [References](../references.md). @@ -16,8 +14,7 @@ See complete citations in [References](../references.md). A comprehensive paper describing MPAS-seaice is in preparation. -**Meshes** ----------- +## Meshes MPAS-Seaice is the sea ice component of E3SMv1. MPAS-Seaice and MPAS-Ocean share identical meshes, but MPAS-Seaice uses B-grid discretizations (Arakawa & Lamb, 1977) with sea ice concentration, volume, and tracers defined at cell centers and velocity defined at cell vertices. @@ -25,8 +22,7 @@ The MPAS mesh system requires the definition of seven elements. These seven ele ![mesh](../figures/mesh.png) Figure: Sample from an MPAS mesh showing the primal mesh (solid lines), the dual mesh (dashed), and velocity components aligned with a locally Cartesian coordinate system (east/north). -**Velocity and Stresses** -------------------------- +## Velocity and Stresses Velocity components at cell vertices are not aligned with the mesh, as in sea ice models with structured meshes and quadrilateral cells. Instead, the velocity components are aligned with a spherical coordinate system that is locally Cartesian, eastwards (u) and northwards (v), irrespective of the orientation of edges joining that vertex. Such a definition, however, would result in a convergence of v components at the geographic North Pole and strong metric terms in the velocity solution. Consequently, in addition, these definitions of u and v are rotated so that their pole lies on the geographical equator at 0 deg longitude. @@ -40,8 +36,7 @@ Velocities are determined by solving the sea ice momentum equation (Hibler, 1979 Two schemes to calculate the strain rate tensor and the divergence of internal stress on MPAS meshes are implemented in MPAS-Seaice, a variational scheme based on that used in CICE (Hunke and Dukowicz, 2002), and a weak scheme that uses the line integral forms of the symmetric gradient and divergence operators. The variational scheme is based on the fact that over the entire domain, Ω, and ignoring boundary effects, the total work done by the internal stress is equal to the dissipation of mechanical energy. Instead of the bilinear basis functions used by CICE, MPAS-Seaice uses Wachspress basis functions (Dasgupta, 2003), which are integrated with the quadrature rules of Dunavant (1985). -**Horizontal Transport of Ice Area Fraction and Tracers** ---------------------------------------------------------- +## Horizontal Transport of Ice Area Fraction and Tracers Horizontal transport of ice concentration, volume, and tracers is achieved with an incremental remapping (IR) scheme similar to that described in Dukowicz and Baumgardner (2000), Lipscomb and Hunke (2004), and Lipscomb and Ringler (2005). For MPAS-Seaice the IR scheme was generalized to work on either the standard MPAS mesh (hexagons and other n-gons of varying sizes, with a vertex degree of 3, or a quadrilateral mesh with a vertex degree of 4 as in CICE. Since MPAS meshes are unstructured, the IR scheme had to be rewritten from scratch. Most of the code is mesh-agnostic, but a small amount of code is specific to quad meshes. The transport equations describe conservation of quantities such as volume and energy. Fractional ice area (also known as sea ice concentration) is a mass-like quantity whose transport equation forms the basis for all other transported quantities in the model. In particular, ice volume is the product of ice area and thickness; therefore thickness is treated as a tracer on ice area, transported with the continuity equation for conservation of volume. Likewise, snow depth is carried as a tracer on ice area via a conservation of snow volume equation. Ice thickness and snow depth are referred to as “type 1” tracers (carried directly on ice area). Ice and snow enthalpy in each vertical layer are type 2 tracers, carried on ice and snow volume. When run with advanced options (e.g., active melt ponds and biogeochemistry), MPAS-Seaice advects tracers up to type 3. Thus, the mass-like field (area) is the “parent field” for type 1 tracers; type 1 tracers are parents of type 2; and type 2 tracers are parents of type 3. Sources and sinks of mass and tracers (e.g., ice growth and melting) are treated separately from transport. @@ -57,8 +52,7 @@ Since all fields are transported by the same velocity field, the second step is With advanced physics and biogeochemistry (BGC) options, MPAS-Seaice can be configured to include numerous tracer fields, each of which is advected in every thickness category, and many of which are defined in each vertical ice or snow layer. In order to accommodate different tracer combinations and make it easy to add new tracers, the tracer fields are organized in a linked list that depends on which physics and BGC packages are active. The list is arranged with fractional ice area first, followed by the type 1 tracers, type 2 tracers, and finally type 3 tracers. In this way, values computed for parent tracers are always available when needed for computations involving child tracers. -**Column Physics** ------------------- +## Column Physics The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``config_column_physics_type = 'column_package'`` option is still available but is no longer being supported in MPAS-seaice. @@ -92,8 +86,7 @@ A paper describing the advanced snow physics is in preparation. This section is under construction, pending the full merge of BGC codes in Icepack and the older column physics package. -**Coupling of MPAS-seaice within E3SM** ---------------------------------------- +## Coupling of MPAS-seaice within E3SM This section is under construction. Current text is quoted from the v1 and v2 overview papers. diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index 1612252d1b0..19eba36a019 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -1,10 +1,8 @@ -User's Guide -============ +# User's Guide Guidance for using E3SM is available from [E3SM's public web site](). -**Configuring MPAS-seaice** ---------------------------- +## Configuring MPAS-seaice MPAS-seaice is controlled using namelist options. @@ -43,8 +41,7 @@ Related namelist variables are grouped according to their application. | ``diagnostics`` | diagnostic output | | ``prescribed_ice`` | for testing atmosphere simulations | -**Icepack** ------------ +## Icepack The Icepack software has replaced the original ``colpkg`` column physics code in MPAS-seaice. The ``column_package`` option is still available but is no longer being supported in MPAS-seaice. @@ -56,8 +53,7 @@ The MPAS-seaice driver for Icepack is and the mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in subroutine ``init_icepack_package_configs`` (see the argument list for ``call subroutine icepack_init_parameters`` and comments at the end of ``init_icepack_package_configs``. -**Configuring Model Input and Output** --------------------------------------- +## Configuring Model Input and Output The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream represents a fixed set of model fields, together with dimensions and attributes, that are all written or read together to or from the same file or set of files. Each MPAS model core may define its own set of default streams that it typically uses for reading initial conditions, for writing and reading restart fields, and for writing additional model history fields. Besides these default streams, users may define new streams to, e.g., write certain diagnostic fields at a higher temporal frequency than the usual model history fields. From 8ddcc91458f5c6d28313e553614753ed1b3d90c3 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Thu, 18 Apr 2024 10:57:26 -0700 Subject: [PATCH 188/310] Moves the ELM erosion test to E3SM integration testsuite The ELM erosion test takes more than 30mins to run on Mappy. Since, the ELM erosion physics is not turned on by default presently, this test is moved to the E3SM integration testsuite [BFB] --- cime_config/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index 3223ae10804..58b2e9a2266 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -55,7 +55,6 @@ "time" : "0:45:00", "tests" : ( "ERS_Ld20.f45_f45.IELMFATES.elm-fates", - "ERS.hcru_hcru.I20TRGSWCNPRDCTCBC.elm-erosion", "ERS.f09_g16.IELMBC.elm-simple_decomp", "ERS.hcru_hcru.IELM.elm-multi_inst", ) @@ -304,6 +303,7 @@ "SMS_Ln5.ne30pg2_ne30pg2.F2010-SCREAM-LR-DYAMOND2", "ERS_Ld3.ne30pg2_r05_IcoswISC30E3r5.WCYCL1850.allactive-nlmaps", "SMS_D_Ld1.ne30pg2_r05_IcoswISC30E3r5.CRYO1850-DISMF", + "ERS.hcru_hcru.I20TRGSWCNPRDCTCBC.elm-erosion", ) }, From 133dada3b533d1ce2f87e486d369e4ce9d12aa7a Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 18 Apr 2024 13:48:16 -0500 Subject: [PATCH 189/310] Add detail on Greenland 1-to-10km mesh being used. --- components/elm/bld/namelist_files/namelist_definition.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/elm/bld/namelist_files/namelist_definition.xml b/components/elm/bld/namelist_files/namelist_definition.xml index c8d22c054cd..4eef2fd8060 100644 --- a/components/elm/bld/namelist_files/namelist_definition.xml +++ b/components/elm/bld/namelist_files/namelist_definition.xml @@ -215,10 +215,11 @@ Normally this is ONLY used when running CESM with the active glacier model. + group="elm_inparm" valid_values="mpas.gis20km,mpas.gis1to10km,mpas.gis1to10kmR2" > Glacier model grid mpas.gis20km = Greenland at 20km resolution - mpas.gis1to10km = Greenland at variable resolution (1-to-10km) + mpas.gis1to10km = Greenland at 1-to-10km variable resolution (v1, kept for backwards compatibility) + mpas.gis1to10kmR2 = Greenland at 1-to-10km variable resolution (v2, improved init. cond., fewer total grid cells) Date: Thu, 18 Apr 2024 13:28:52 -0700 Subject: [PATCH 190/310] Adds initial information in ELM user guide --- components/elm/docs/user-guide/index.md | 92 ++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index 0ec3b413c3f..6159714db01 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -1 +1,91 @@ -start of the ELM User's Guide +# ELM User's Guide + +This User's Guide describes how to set up and run ELM. + +## Table of Conents + +1. [Steps to build and run ELM](#steps-to-build-and-run-elm) + 1. [Scientifically supported compsets](#scientifically-supported-compsets) + 2. [Supported grids](#supported-grid) + 3. [Model spin-up for pre-industrial condition](model-spin-up-for-pre-industrial-condition) +2. [Customizing runs](customizing-runs) + 1. [Changing monthly output file](changing-monthly-output-file) + 2. [Saving additional output files](saving-additional-output-files) + +## Steps to build and run ELM + +A step-by-step instruction on how to run fully coupled E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). Here we describe running ELM driven by atmospheric forcings provided via the data atmosphere (DATM) model for configurations that are used in the E3SM water cycle v3 campaign. + +The water cycle campaigns of E3SM v1 and v2 used ELM's satellite phenology mode (SP-mode) in which a prescribed leaf area index is used in ELM. However, the E3SM v3 water cycle campaign uses an interactive phenology by including an active biogeochemistry (BGC) cycle in ELM. Additionally, a parameterization of sub-grid topographical effects on solar radiation is included within ELM. + +### Scientifically supported compsets + +The land-only compsets are referred to as "I"-compset and are supported for the following time periods: pre-industrial (1850) and historical transient (20TR). Additionally, multiple atmospheric forcing datasets can be used to drive the ELM simulations. The supported compsets are: + +1. `I1850CNPRDCTCBCTOP`: Climatological pre-industrial using Qian atmospheric forcings +2. `I1850CRUCNPRDCTCBCTOP`: Climatological pre-industrial using CRUNCEP atmospheric forcings +3. `I1850GSWCNPRDCTCBCTOP`: Climatological pre-industrial using GSWP atmospheric forcings +4. `I20TRCNPRDCTCBCTOP`: Historical ELM simulation using Qian atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). +5. `I20TRCRUCNPRDCTCBCTOP`: Historical ELM simulation using CRUNCEP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). +6. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). + +***Should we limit the number of DATMs that are supported? What about SSP compsets? Need to make sure all the compset listed are included within E3SM master.*** + +### Supported grid + +The `r05_r05` is the supported grid resolution for performing offline ELM simulation. + +### Model spin-up for pre-industrial condition + +***Add notes on how to spin-up the model.*** + +## Customizing runs + +Few useful changes to `user_nl_elm` + +### Changing monthly output file + +ELM by default outputs monthly history file in `*elm.h0.**.nc` files +that include many variables (>200). At times, many of the default output +variables may not be of interest, thus one could remove all default variables +(via `hist_empty_htapes`) and only include select variables (via `hist_fincl1`) +to the monthly history files by + +```fortran + &elm_inparm + hist_empty_htapes = .true. + hist_fincl1 = 'TG', 'TV', 'FSA' + / +``` + +#### Saving additional output files + +ELM can output additional history files (such as `*elm.h1.*.nc`, `*elm.h2.*.nc`) +that have different temporal averaging (e.g. daily, hourly, every model timestep) via +`hist_nhtfrq` where + +- `-24` corresponds to daily average +- `-1` corresponds to hourly average +- `0` corresponds to monthly average +- `1` corresponds to each model time step + +The number of time slices in these additional files can be controlled +vai `hist_mfilt`. + +```fortran + &elm_inparm + hist_fincl2 = 'TG' + hist_fincl3 = 'TV' + hist_fincl4 = 'TG', 'TV', 'FSA' + hist_nhtfrq = 0, -24, -1, 1 + hist_mfilt = 12, 30, 24, 48 + / +``` + +Using the above-mentioned settings: + +- Each `*.elm.h1.*.nc` will include 30 daily average values of `TG` +- Each `*.elm.h2.*.nc` will include 24 hourly average values of `TV` +- Each `*.elm.h3.*.nc` will include 48 values of `TG`, `TV`, and `FSA` at + each model time step, which is typically is 30 min. + \ No newline at end of file From 39cdcc792a619043dce71054fdbd017abb020e16 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Fri, 19 Apr 2024 05:59:15 -0600 Subject: [PATCH 191/310] Update user guide re namelist and I/O --- components/mpas-seaice/docs/user-guide/index.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/components/mpas-seaice/docs/user-guide/index.md b/components/mpas-seaice/docs/user-guide/index.md index 19eba36a019..21fbca2c32d 100644 --- a/components/mpas-seaice/docs/user-guide/index.md +++ b/components/mpas-seaice/docs/user-guide/index.md @@ -11,6 +11,7 @@ MPAS-seaice is controlled using namelist options. - Namelist options are defined in ``E3SM/components/mpas-seaice/bld/namelist_files/namelist_definitions_mpassi.xml``, including type, category (``seaice_model``), group, valid values and a brief description. Each namelist variable is defined in an ``entry`` element. The content of the element is the documentation of how the variable is used. Other aspects of the variable's definition are expressed as attributes of the ``entry`` element. +- Users can change namelist options from defaults by entering ``[namelist option] = [changed value]`` as separate lines in the ``user_nl_mpassi`` file in the case directory. - Some namelist values or combinations are not allowed and will generate warnings and often abort the code. The consistency checks for using MPAS-seaice within E3SM are in ``mpas_seaice_initialize`` (subroutines ``seaice_check_configs_coupled``, ``seaice_check_constants_coupled``), and those specific to Icepack can be found in subroutine ``check_column_package_configs`` in ``mpas_seaice_icepack.F``. Related namelist variables are grouped according to their application. @@ -51,14 +52,14 @@ The MPAS-seaice driver for Icepack is ``E3SM/components/mpas-seaice/src/shared/mpas_seaice_icepack.f`` -and the mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in subroutine ``init_icepack_package_configs`` (see the argument list for ``call subroutine icepack_init_parameters`` and comments at the end of ``init_icepack_package_configs``. +and the mapping between the names of Icepack's namelist options and those in MPAS-seaice can be found in subroutine ``init_icepack_package_configs`` (see the argument list for calls to subroutine ``icepack_init_parameters`` and comments at the end of ``init_icepack_package_configs``. ## Configuring Model Input and Output -The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream represents a fixed set of model fields, together with dimensions and attributes, that are all written or read together to or from the same file or set of files. Each MPAS model core may define its own set of default streams that it typically uses for reading initial conditions, for writing and reading restart fields, and for writing additional model history fields. Besides these default streams, users may define new streams to, e.g., write certain diagnostic fields at a higher temporal frequency than the usual model history fields. +The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream represents a fixed set of model fields, together with dimensions and attributes, that are all written or read together to or from the same file or set of files. Besides these default streams, users may define new streams to, e.g., write certain diagnostic fields at a higher temporal frequency than the usual model history fields. -Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file is simply ‘streams.’ suffixed with the name of the core. For example, the streams for the sw (shallow-water) core are defined in a file named ‘streams.sw’. An XML stream file may further reference other text files that contain lists of the model fields that are read or written in each of the streams defined in the XML stream file. +Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file is simply ‘streams.’ suffixed with the name of the core. For example, the streams for the sea-ice core are defined in a file named ‘streams.seaice’. An XML stream file may further reference other text files that contain lists of the model fields that are read or written in each of the streams defined in the XML stream file. -Changes to the XML stream configuration file will take effect the next time an MPAS core is run; there is no need to re-compile after making modifications to the XML files. As described in the next section, it is therefore possible, e.g., to change the interval at which a stream is written, the template for the filenames associated with a stream, or the set of fields that are written to a stream, without the need to re-compile any code. +The stream file can be modified by copying the ``streams.seaice`` file (generated during ``./case.setup``) from the run directory to the case directory under ``SourceMods/src.mpassi/``, and making changes to the stream file there. Changes to the stream file will take effect on the next case submission. Alternatively, changes to the streams file can be made directly in the code in ``components/mpas-seaice/cime_config/buildnml``. Two classes of streams exist in MPAS: immutable streams and mutable streams. Immutable streams are those for which the set of fields that belong to the stream may not be modified at model run-time; however, it is possible to modify the interval at which the stream is read or written, the filename template describing the files containing the stream on disk, and several other parameters of the stream. In contrast, all aspects of mutable streams, including the set of fields that belong to the stream, may be modified at run-time. The motivation for the creation of two stream classes is the idea that an MPAS core may not function correctly if certain fields are not read in upon model start-up or written to restart files, and it is therefore not reasonable for users to modify this set of required fields at run-time. An MPAS core developer may choose to implement such streams as immutable streams. Since fields may not be added to an immutable stream at run-time, new immutable streams may not be defined at run-time, and the only type of new stream that may be defined at run-time is the mutable stream type. From 71db9232567efe9d4db079d0b6ce8856c41d0fed Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Fri, 19 Apr 2024 16:35:11 -0500 Subject: [PATCH 192/310] Turn off xpmem on Chrysalis Turn off xpmem in OpenMPI Add env var to turn off xpmem when using OpenMPI. Avoids leaving nodes in unkillable state. --- cime_config/machines/config_machines.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index f61948fb31d..03a29466822 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2622,6 +2622,7 @@ $SHELL{dirname $(dirname $(which nf-config))} $SHELL{dirname $(dirname $(which pnetcdf_version))} ^lockedfile,individual + ^xpmem 128M From 0e791262076004a07d826f0267cf222ae228226d Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 23 Apr 2024 06:26:00 -0700 Subject: [PATCH 193/310] Removes unsupported compsets --- components/elm/docs/user-guide/index.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index 6159714db01..b865790dab3 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -22,14 +22,8 @@ The water cycle campaigns of E3SM v1 and v2 used ELM's satellite phenology mode The land-only compsets are referred to as "I"-compset and are supported for the following time periods: pre-industrial (1850) and historical transient (20TR). Additionally, multiple atmospheric forcing datasets can be used to drive the ELM simulations. The supported compsets are: -1. `I1850CNPRDCTCBCTOP`: Climatological pre-industrial using Qian atmospheric forcings -2. `I1850CRUCNPRDCTCBCTOP`: Climatological pre-industrial using CRUNCEP atmospheric forcings -3. `I1850GSWCNPRDCTCBCTOP`: Climatological pre-industrial using GSWP atmospheric forcings -4. `I20TRCNPRDCTCBCTOP`: Historical ELM simulation using Qian atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). -5. `I20TRCRUCNPRDCTCBCTOP`: Historical ELM simulation using CRUNCEP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). -6. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). - -***Should we limit the number of DATMs that are supported? What about SSP compsets? Need to make sure all the compset listed are included within E3SM master.*** +1. `I1850GSWCNPRDCTCBCTOP`: Climatological pre-industrial using GSWP atmospheric forcings +2. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). ### Supported grid From 9fd5147421ec8627d6c87032d1c57deb8513a710 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 23 Apr 2024 09:12:46 -0700 Subject: [PATCH 194/310] Adds new I-Compsets that are consistent with WCv3 - Adds I-compsets that include active BGC (CNP+RD+CTC), black carbon (BC), and subgrid topographic parameterization for solar radiation (TOP) in ELM. - These I-Compsets use GSWP DATM forcing. - The compsets are for 1850, 20TR, and 2000. [BFB] --- components/elm/cime_config/config_compsets.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/components/elm/cime_config/config_compsets.xml b/components/elm/cime_config/config_compsets.xml index a473f2b4fed..4f7cb9007c2 100644 --- a/components/elm/cime_config/config_compsets.xml +++ b/components/elm/cime_config/config_compsets.xml @@ -537,6 +537,11 @@ 2000_DATM%GSWP3v1_ELM%CNPRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV + + IGSWCNPRDCTCBCTOP + 2000_DATM%GSWP3v1_ELM%CNPRDCTCBCTOP_SICE_SOCN_MOSART_SGLC_SWAV + + IGSWCNECACTCBC 2000_DATM%GSWP3v1_ELM%CNECACTCBC_SICE_SOCN_MOSART_SGLC_SWAV @@ -632,6 +637,11 @@ 1850_DATM%GSWP3v1_ELM%CNPRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV + + I1850GSWCNPRDCTCBCTOP + 1850_DATM%GSWP3v1_ELM%CNPRDCTCBCTOP_SICE_SOCN_MOSART_SGLC_SWAV + + I20TRGSWCNRDCTCBC 20TR_DATM%GSWP3v1_ELM%CNRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV @@ -642,6 +652,11 @@ 20TR_DATM%GSWP3v1_ELM%CNPRDCTCBC_SICE_SOCN_MOSART_SGLC_SWAV + + I20TRGSWCNPRDCTCBCTOP + 20TR_DATM%GSWP3v1_ELM%CNPRDCTCBCTOP_SICE_SOCN_MOSART_SGLC_SWAV + + From 31703ab1df9e87cf0e073cf9fcead6e7e776bb50 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 23 Apr 2024 14:57:06 -0600 Subject: [PATCH 195/310] misc bug fixes after PR changes --- .../generate_domain_files_E3SM.py | 69 ++++++++++--------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index 47ead5d4744..99e49a523d3 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -39,7 +39,7 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m to the atmosphere grid, this tool creates land and ocean domain files needed by data model components (ex. datm, dlnd, docn) - For "tr-grid" configurations of E3SM (land grid is different from atmos/ocn): + For "tri-grid" configurations of E3SM (land grid is different from atmos/ocn): In addition to running this tool with the ocn->atm map as above, a second iteration is needed with a similar ocn->lnd map. @@ -111,7 +111,7 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m (opts, args) = parser.parse_args() #--------------------------------------------------------------------------------------------------- def main(): - + global domain_a_grid_file, domain_b_grid_file, ocn_grid_file, atm_grid_file #------------------------------------------------------------------------------- # check for valid input arguments @@ -128,7 +128,7 @@ def main(): # Set date stamp for file name if opts.date_stamp is None: - cdate = datetime.datetime.utcnow().strftime('%Y%m%d') + cdate = datetime.datetime.now().strftime('%Y%m%d') else: cdate = opts.date_stamp @@ -160,11 +160,6 @@ def main(): #----------------------------------------------------------------------------- # read grid meta-data from map file - domain_a_grid_file = 'unknown' - domain_b_grid_file = 'unknown' - ocn_grid_file = 'unknown' - atm_grid_file = 'unknown' - if 'domain_a' in ds.attrs.keys(): domain_a_grid_file = ds.attrs['domain_a'] if 'domain_b' in ds.attrs.keys(): domain_b_grid_file = ds.attrs['domain_b'] @@ -238,8 +233,8 @@ def main(): # convert to land fraction lfrac_min = opts.fmaxval lfrac_max = opts.fminval - omask = xr.ones_like(ds['area_b'],dtype=int32) - lmask = xr.zeros_like(ds['area_b'],dtype=int32) + omask = xr.ones_like(ds['area_b'],dtype=np.int32) + lmask = xr.zeros_like(ds['area_b'],dtype=np.int32) lfrac = 1 - ofrac lfrac_min = lfrac.min().values lfrac_max = lfrac.max().values @@ -297,41 +292,42 @@ def main(): #--------------------------------------------------------------------------------------------------- def add_metadata(ds): - # add variable attirbutes - ds_out['xc'] = ds_out['xc'].assign_attrs({'long_name':'longitude of grid cell center'}) - ds_out['xc'] = ds_out['xc'].assign_attrs({'units':'degrees_east'}) - ds_out['xc'] = ds_out['xc'].assign_attrs({'bounds':'xv'}) + global domain_a_grid_file, domain_b_grid_file, ocn_grid_file, atm_grid_file + # add variable attributes + ds['xc'] = ds['xc'].assign_attrs({'long_name':'longitude of grid cell center'}) + ds['xc'] = ds['xc'].assign_attrs({'units':'degrees_east'}) + ds['xc'] = ds['xc'].assign_attrs({'bounds':'xv'}) - ds_out['yc'] = ds_out['yc'].assign_attrs({'long_name':'latitude of grid cell center'}) - ds_out['yc'] = ds_out['yc'].assign_attrs({'units':'degrees_north'}) - ds_out['yc'] = ds_out['yc'].assign_attrs({'bounds':'yv'}) + ds['yc'] = ds['yc'].assign_attrs({'long_name':'latitude of grid cell center'}) + ds['yc'] = ds['yc'].assign_attrs({'units':'degrees_north'}) + ds['yc'] = ds['yc'].assign_attrs({'bounds':'yv'}) - ds_out['xv'] = ds_out['xv'].assign_attrs({'long_name':'longitude of grid cell verticies'}) - ds_out['xv'] = ds_out['xv'].assign_attrs({'units':'degrees_east'}) + ds['xv'] = ds['xv'].assign_attrs({'long_name':'longitude of grid cell verticies'}) + ds['xv'] = ds['xv'].assign_attrs({'units':'degrees_east'}) - ds_out['yv'] = ds_out['yv'].assign_attrs({'long_name':'latitude of grid cell verticies'}) - ds_out['yv'] = ds_out['yv'].assign_attrs({'units':'degrees_north'}) + ds['yv'] = ds['yv'].assign_attrs({'long_name':'latitude of grid cell verticies'}) + ds['yv'] = ds['yv'].assign_attrs({'units':'degrees_north'}) - ds_out['area'] = ds_out['area'].assign_attrs({'long_name':'area of grid cell in radians squared'}) - ds_out['area'] = ds_out['area'].assign_attrs({'units':'radian2'}) - ds_out['area'] = ds_out['area'].assign_attrs({'coordinates':'xc yc'}) + ds['area'] = ds['area'].assign_attrs({'long_name':'area of grid cell in radians squared'}) + ds['area'] = ds['area'].assign_attrs({'units':'radian2'}) + ds['area'] = ds['area'].assign_attrs({'coordinates':'xc yc'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'long_name':'fraction of grid cell that is active'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'units':'unitless'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'coordinates':'xc yc'}) - ds_out['frac'] = ds_out['frac'].assign_attrs({'filter':f'limit frac to [fminval,fmaxval]; fminval={opts.fminval} fmaxval={opts.fmaxval}'}) + ds['frac'] = ds['frac'].assign_attrs({'long_name':'fraction of grid cell that is active'}) + ds['frac'] = ds['frac'].assign_attrs({'units':'unitless'}) + ds['frac'] = ds['frac'].assign_attrs({'coordinates':'xc yc'}) + ds['frac'] = ds['frac'].assign_attrs({'filter':f'limit frac to [fminval,fmaxval]; fminval={opts.fminval} fmaxval={opts.fmaxval}'}) - ds_out['mask'] = ds_out['mask'].assign_attrs({'long_name':'domain mask'}) - ds_out['mask'] = ds_out['mask'].assign_attrs({'units':'unitless'}) - ds_out['mask'] = ds_out['mask'].assign_attrs({'coordinates':'xc yc'}) - ds_out['mask'] = ds_out['mask'].assign_attrs({'comment':'0 value indicates cell is not active'}) + ds['mask'] = ds['mask'].assign_attrs({'long_name':'domain mask'}) + ds['mask'] = ds['mask'].assign_attrs({'units':'unitless'}) + ds['mask'] = ds['mask'].assign_attrs({'coordinates':'xc yc'}) + ds['mask'] = ds['mask'].assign_attrs({'comment':'0 value indicates cell is not active'}) # add global attributes ds.attrs['title'] = 'E3SM domain data' ds.attrs['Conventions'] = 'CF-1.0' ds.attrs['source_code'] = source_code_meta - ds.attrs['hostname'] = host - ds.attrs['history'] = f'created by {user}, '+datetime.datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S') + ds.attrs['hostname'] = str(host) + ds.attrs['history'] = f'created by {user}, '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') ds.attrs['source'] = opts.map_file ds.attrs['map_domain_a'] = domain_a_grid_file ds.attrs['map_domain_b'] = domain_b_grid_file @@ -356,6 +352,11 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): ofrac[row[k]] = ofrac[row[k]] + frac_a[col[k]] * S[k] return ofrac #--------------------------------------------------------------------------------------------------- +domain_a_grid_file = 'unknown' +domain_b_grid_file = 'unknown' +ocn_grid_file = 'unknown' +atm_grid_file = 'unknown' +#--------------------------------------------------------------------------------------------------- if __name__ == '__main__': main() #--------------------------------------------------------------------------------------------------- From 531043fcf55275c046e952ae9a0948dabc0d16f1 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 23 Apr 2024 15:38:48 -0600 Subject: [PATCH 196/310] cosmetic fix --- tools/generate_domain_files/generate_domain_files_E3SM.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index 99e49a523d3..a0076b77251 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -139,6 +139,11 @@ def main(): domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + # cosmetic clean up of file names + domain_file_ocn_on_ocn = domain_file_ocn_on_ocn.replace('//','/') + domain_file_lnd_on_atm = domain_file_lnd_on_atm.replace('//','/') + domain_file_ocn_on_atm = domain_file_ocn_on_atm.replace('//','/') + #----------------------------------------------------------------------------- # print some informative stuff From b2a5af7cf9b2dcc7d7ef29744fb0c10ed932aecd Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Tue, 23 Apr 2024 15:48:54 -0600 Subject: [PATCH 197/310] remove "test" prefix for output domain files --- tools/generate_domain_files/generate_domain_files_E3SM.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index a0076b77251..97e1a9ec1f4 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -135,9 +135,9 @@ def main(): #------------------------------------------------------------------------------- # specify output file names - domain_file_ocn_on_ocn = f'{opts.output_root}/test.domain.ocn.{opts.ocn_grid}.{cdate}.nc' - domain_file_lnd_on_atm = f'{opts.output_root}/test.domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' - domain_file_ocn_on_atm = f'{opts.output_root}/test.domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + domain_file_ocn_on_ocn = f'{opts.output_root}/domain.ocn.{opts.ocn_grid}.{cdate}.nc' + domain_file_lnd_on_atm = f'{opts.output_root}/domain.lnd.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' + domain_file_ocn_on_atm = f'{opts.output_root}/domain.ocn.{opts.lnd_grid}_{opts.ocn_grid}.{cdate}.nc' # cosmetic clean up of file names domain_file_ocn_on_ocn = domain_file_ocn_on_ocn.replace('//','/') From 6f1a75db08372557092e3190c0420496817c599f Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Tue, 23 Apr 2024 15:03:16 -0700 Subject: [PATCH 198/310] Add comment explaining overrideTimeLevels --- components/mpas-framework/src/framework/mpas_pool_routines.F | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/mpas-framework/src/framework/mpas_pool_routines.F b/components/mpas-framework/src/framework/mpas_pool_routines.F index 89a489ca308..7c01125bf7f 100644 --- a/components/mpas-framework/src/framework/mpas_pool_routines.F +++ b/components/mpas-framework/src/framework/mpas_pool_routines.F @@ -930,6 +930,8 @@ end subroutine mpas_pool_clone_pool!}}} !> \details !> This routine assumes srcPool and destPool have identical members. It will !> copy the data from the members of srcPool into the members of destPool. +!> The overrideTimeLevels argument enables a given time level of a srcPool +!> with >1 time level to be copied into a destPool with a single time level. ! !----------------------------------------------------------------------- recursive subroutine mpas_pool_copy_pool(srcPool, destPool, overrideTimeLevels)!{{{ From 5e2deeb22dee5fff66b2ed56ecf5c7a9347a8285 Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 23 Apr 2024 15:19:24 -0700 Subject: [PATCH 199/310] Add FATES markdown page with a description and links to the various documentation --- components/elm/docs/user-guide/fates.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 components/elm/docs/user-guide/fates.md diff --git a/components/elm/docs/user-guide/fates.md b/components/elm/docs/user-guide/fates.md new file mode 100644 index 00000000000..220af361db8 --- /dev/null +++ b/components/elm/docs/user-guide/fates.md @@ -0,0 +1,16 @@ +# FATES + +FATES (Functionally Assembled Terrestrial Ecosystem Simulator) is a numerical terrestrial ecosystem model that can be utilized as a component with various host land models such as ELM. It is incorporated as an external module, the development of which is primarily supported by the Department of Energy’s Office of Science, through the [Next Generation Ecosystem Experiment - Tropics (NGEE-T) project](https://ngee-tropics.lbl.gov/). + +The FATES code is hosted online through a github repository: https://github.com/NGEET/fates + +## Technical Document + +The full FATES documentation detailing the scientific underpinnings of the model can be found in the [FATES Technical Document](https://fates-users-guide.readthedocs.io/projects/tech-doc/en/stable/) hosted on ReadTheDocs. + +## User's and Developer's Guide + +The FATES team also provides a [User's guide](https://fates-users-guide.readthedocs.io/en/latest/user/users-guide.html) and a [Developer's guide](https://fates-users-guide.readthedocs.io/en/latest/developer/developer-guide.html) also hosted on ReadTheDocs. Both guides and the technical documentation can be reached from the top level [User's Guide](https://fates-users-guide.readthedocs.io/en/latest/index.html) + + + From 7800ebf7259d1d73147a37aceeb55ba4343b27ab Mon Sep 17 00:00:00 2001 From: Gregory Lemieux Date: Tue, 23 Apr 2024 15:31:21 -0700 Subject: [PATCH 200/310] update elm index doc with internal and external fates links --- components/elm/docs/user-guide/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index b865790dab3..b7720a6cfb8 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -11,6 +11,7 @@ This User's Guide describes how to set up and run ELM. 2. [Customizing runs](customizing-runs) 1. [Changing monthly output file](changing-monthly-output-file) 2. [Saving additional output files](saving-additional-output-files) +3. [Running with FATES (optional)](#running-with-fates) ## Steps to build and run ELM @@ -82,4 +83,7 @@ Using the above-mentioned settings: - Each `*.elm.h2.*.nc` will include 24 hourly average values of `TV` - Each `*.elm.h3.*.nc` will include 48 values of `TG`, `TV`, and `FSA` at each model time step, which is typically is 30 min. - \ No newline at end of file + +## Running with FATES + +[FATES](fates.md) can be run in various modes with ELM through the use of namelist settings. The [FATES User's Guide section on namelist options](https://fates-users-guide.readthedocs.io/en/latest/user/Namelist-Options-and-Run-Time-Modes.html) provides guidance on enabling these different FATES run modes. From 4debca56ce06c8e458ec7741c086da2b3b772d20 Mon Sep 17 00:00:00 2001 From: noel Date: Tue, 23 Apr 2024 16:57:05 -0700 Subject: [PATCH 201/310] for one fortran file, for pm-cpu, and for nvidia compiler only, disable a compiler flag to avoid Bus error --- cime_config/machines/Depends.pm-cpu.nvidia.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cime_config/machines/Depends.pm-cpu.nvidia.cmake b/cime_config/machines/Depends.pm-cpu.nvidia.cmake index 2947c73aacc..f3514d11880 100644 --- a/cime_config/machines/Depends.pm-cpu.nvidia.cmake +++ b/cime_config/machines/Depends.pm-cpu.nvidia.cmake @@ -10,6 +10,17 @@ if (NOT DEBUG) endforeach() endif() +list(APPEND NO_STACK_ARRAY_LIST + eam/src/physics/cam/phys_grid_ctem.F90 +) + +# Remove -Mstack_arrays for this one file to avoid error (likely compiler bug) +# As we can't remove flag, try adding -Mnostack_arrays https://github.com/E3SM-Project/E3SM/issues/6350 +# Tried with nvidia/22.7 and 23.9 on pm-cpu +foreach(ITEM IN LISTS NO_STACK_ARRAY_LIST) + e3sm_add_flags("${ITEM}" " -Mnostack_arrays") +endforeach() + # Use -O2 for a few files already found to benefit from increased optimization in Intel Depends file set(PERFOBJS homme/src/share/prim_advection_base.F90 From 2ccabdf88e9765d3455bfc81056f672641c693d0 Mon Sep 17 00:00:00 2001 From: Youngsung Kim Date: Fri, 19 Apr 2024 13:22:53 -0400 Subject: [PATCH 202/310] uses Fortran linker to support compiler dependent intrinsic functions --- cime_config/machines/cmake_macros/crayclang_frontier.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cime_config/machines/cmake_macros/crayclang_frontier.cmake b/cime_config/machines/cmake_macros/crayclang_frontier.cmake index 6bda90a4187..6c8d4164cb2 100644 --- a/cime_config/machines/cmake_macros/crayclang_frontier.cmake +++ b/cime_config/machines/cmake_macros/crayclang_frontier.cmake @@ -15,3 +15,6 @@ string(APPEND CMAKE_Fortran_FLAGS " -hipa0 -hzero") # -em -ef generates modulename.mod (lowercase files) to support # Scorpio installs string(APPEND CMAKE_Fortran_FLAGS " -em -ef") + +# to support Fortran specific compiler intrinsic functions +set(E3SM_LINK_WITH_FORTRAN "TRUE") From e56c1bc1be322f1e4a8ef526f3379b5422339e3f Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 24 Apr 2024 10:12:04 -0700 Subject: [PATCH 203/310] add opts.lnd_mask_threshold for new gen domain tool --- tools/generate_domain_files/generate_domain_files_E3SM.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index 97e1a9ec1f4..9af43909c48 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -99,6 +99,10 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m dest='fmaxval', default=1, help='Maximum allowable land fraction (reset to 1 above fmaxval)') +parser.add_option('--lfrac-threshold', + dest='lfrac_threshold', + default=1e-10, + help='land fraction threshold above which the land mask will be 1') parser.add_option('--set-omask', dest='set_omask', default=False, @@ -246,7 +250,7 @@ def main(): lfrac = xr.where( lfrac>opts.fmaxval, 1, lfrac ) lfrac = xr.where( lfracopts.lfrac_threshold, 1, lmask ) omask = xr.where( ofrac==0, 0, omask ) print(f''' @@ -360,7 +364,7 @@ def compute_ofrac_on_atm( n_s, ofrac, frac_a, S, row, col ): domain_a_grid_file = 'unknown' domain_b_grid_file = 'unknown' ocn_grid_file = 'unknown' -atm_grid_file = 'unknown' +atm_grid_file = 'unknown' #--------------------------------------------------------------------------------------------------- if __name__ == '__main__': main() From b66d43eccdce76fca439a4bda857745b43fa7a66 Mon Sep 17 00:00:00 2001 From: Walter Hannah Date: Wed, 24 Apr 2024 11:52:45 -0700 Subject: [PATCH 204/310] revert lfrac threshold and adjust default fminval --- .../generate_domain_files_E3SM.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tools/generate_domain_files/generate_domain_files_E3SM.py b/tools/generate_domain_files/generate_domain_files_E3SM.py index 9af43909c48..efaa7c60c15 100644 --- a/tools/generate_domain_files/generate_domain_files_E3SM.py +++ b/tools/generate_domain_files/generate_domain_files_E3SM.py @@ -93,16 +93,12 @@ class clr:END,RED,GREEN,MAGENTA,CYAN = '\033[0m','\033[31m','\033[32m','\033[35m help='Creation date stamp for domain files') parser.add_option('--fminval', dest='fminval', - default=0, + default=1e-3, help='Minimum allowable land fraction (reset to 0 below fminval)') parser.add_option('--fmaxval', dest='fmaxval', default=1, help='Maximum allowable land fraction (reset to 1 above fmaxval)') -parser.add_option('--lfrac-threshold', - dest='lfrac_threshold', - default=1e-10, - help='land fraction threshold above which the land mask will be 1') parser.add_option('--set-omask', dest='set_omask', default=False, @@ -250,15 +246,15 @@ def main(): lfrac = xr.where( lfrac>opts.fmaxval, 1, lfrac ) lfrac = xr.where( lfracopts.lfrac_threshold, 1, lmask ) + lmask = xr.where( lfrac!=0, 1, lmask ) omask = xr.where( ofrac==0, 0, omask ) print(f''' ------------------------------------------------------------------------------------------------ {clr.RED}IMPORTANT{clr.END}: note original min/max frac and decide if acceptable - lfrac clipped below / above : {opts.fminval :+8.4e} / {opts.fmaxval :+8.4f} - original lfrac min/max : {lfrac_min :+8.4e} / {lfrac_max :+8.4f} - final lfrac min/max : {lfrac.min().values:+8.4e} / {lfrac.max().values:+8.4f} + lfrac clipped below / above : {opts.fminval :+10.6e} / {opts.fmaxval :+10.6f} + original lfrac min/max : {lfrac_min :+10.6e} / {lfrac_max :+10.6f} + final lfrac min/max : {lfrac.min().values:+10.6e} / {lfrac.max().values:+10.6f} ------------------------------------------------------------------------------------------------ ''') From aca8a930d83fd254d17b50d893f85c38f3f194c7 Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Wed, 24 Apr 2024 17:53:29 -0500 Subject: [PATCH 205/310] Point to correct, updated glsmask file for GIS 20km configurations. Previously, this pointed to a mask where glc was allowed to be active everywhere. This change points to the correct mask and correct mask name that has been updated so that GIS footprint describing the mask was made from the current GIS 20km init. cond. file. Testing confirms the correct mask is pulled from the repo and the relevant test cases run to completion as expected when using this mask file. --- components/elm/bld/namelist_files/namelist_defaults.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/bld/namelist_files/namelist_defaults.xml b/components/elm/bld/namelist_files/namelist_defaults.xml index 90b9d047e17..e322b5feb30 100644 --- a/components/elm/bld/namelist_files/namelist_defaults.xml +++ b/components/elm/bld/namelist_files/namelist_defaults.xml @@ -579,7 +579,7 @@ this mask will have smb calculated over the entire global land surface glc/cism/griddata/glcmaskdata_0.9x1.25_Gland5km.nc lnd/clm2/griddata/glcmaskdata_0.9x1.25_60S.nc -lnd/clm2/griddata/glcmaskdata_0.5x0.5_everywhere.nc +lnd/clm2/griddata/glcmaskdata_0.5x0.5_GIS_AIS.nc lnd/clm2/griddata/glcmaskdata_0.5x0.5_GIS_AIS.nc lnd/clm2/griddata/glcmaskdata_r0125_GIS_AIS.210407.nc lnd/clm2/griddata/glcmaskdata_ne30pg2_GIS_AIS.210407.nc From 3306baeb3364dda29a265e1dd6e3d138de297a0a Mon Sep 17 00:00:00 2001 From: Stephen Price Date: Thu, 25 Apr 2024 12:21:17 -0500 Subject: [PATCH 206/310] Remove new landice devel tests from e3sm devel test suite. --- cime_config/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index b7373aaaeab..6a222f82a78 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -263,7 +263,7 @@ }, "e3sm_developer" : { - "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer", "e3sm_landice_developer"), + "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer"), "time" : "0:45:00", "tests" : ( "ERS.f19_g16_rx1.A", From 592df47ed3925d16e211f30d1458b5c201c95769 Mon Sep 17 00:00:00 2001 From: Iulian Grindeanu Date: Thu, 25 Apr 2024 13:14:12 -0500 Subject: [PATCH 207/310] move semoab_mod file to homme shared folder semoab_mod.F90 file is moved from components/eam/src/dynamics/se folder to components/homme/src/share folder. It belongs naturally there, as it involevs just grid routines from homme base code also, it should prepare for SCREAM-moab connection later on fix also some complaints about non-allocated arrays when there are no cells on some dynamic tasks (when number of tasks is larger than number of spectral cells in homme) --- .../se => homme/src/share}/semoab_mod.F90 | 81 ++++++++++--------- 1 file changed, 42 insertions(+), 39 deletions(-) rename components/{eam/src/dynamics/se => homme/src/share}/semoab_mod.F90 (92%) diff --git a/components/eam/src/dynamics/se/semoab_mod.F90 b/components/homme/src/share/semoab_mod.F90 similarity index 92% rename from components/eam/src/dynamics/se/semoab_mod.F90 rename to components/homme/src/share/semoab_mod.F90 index 984b9793df4..2d8bb099ade 100644 --- a/components/eam/src/dynamics/se/semoab_mod.F90 +++ b/components/homme/src/share/semoab_mod.F90 @@ -12,12 +12,10 @@ module semoab_mod use dimensions_mod, only: nelem, ne, np, nelemd, nlev use element_mod, only : element_t - use parallel_mod, only : parallel_t + use parallel_mod, only : parallel_t, abortmp use m_MergeSorts, only: IndexSet, IndexSort - use cam_grid_support, only: iMap - use cam_abortutils, only : endrun use edgetype_mod, only: edgedescriptor_t use gridgraph_mod, only: gridvertex_t @@ -209,8 +207,10 @@ subroutine create_moab_meshes(par, elem) if ( nelemd > 0 ) then allocate(moab_vert_coords(3*nverts) ) allocate(vdone(nverts)) - vdone = 0; + else + allocate(vdone(1)) ! will be passed to iMOAB_ResolveSharedEnts, and compilers are complaining about non-allocated arrays endif + vdone = 0; if ( nelemd > 0 ) currentval = gdofv( indx(1)) ! start over to identify coordinates of the vertices do ix=1,moab_dim_cquads @@ -251,7 +251,7 @@ subroutine create_moab_meshes(par, elem) if ( nelemd > 0 ) then ierr = iMOAB_CreateVertices(MHFID, dimcoord, dimen, moab_vert_coords) if (ierr > 0 ) & - call endrun('Error: fail to create MOAB vertices ') + call abortmp('Error: fail to create MOAB vertices ') endif !!num_el = nelemd2 mbtype = 3 ! quadrilateral @@ -261,7 +261,7 @@ subroutine create_moab_meshes(par, elem) if ( nelemd > 0 ) then ierr = iMOAB_CreateElements( MHFID, nelemd2, mbtype, nve, moabconn, block_ID ); if (ierr > 0 ) & - call endrun('Error: fail to create MOAB elements') + call abortmp('Error: fail to create MOAB elements') endif ! nverts: num vertices; vdone will store now the markers used in global resolve ! for this particular problem, markers are the global dofs at corner nodes @@ -272,18 +272,19 @@ subroutine create_moab_meshes(par, elem) numco = 1 ierr = iMOAB_DefineTagStorage(MHFID, tagname, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to retrieve global id tag') + call abortmp('Error: fail to retrieve global id tag') ! now set the values ent_type = 0 ! vertex type if ( nverts > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHFID, tagname, nverts , ent_type, vdone) if (ierr > 0 ) & - call endrun('Error: fail to set marker id tag for vertices') + call abortmp('Error: fail to set marker id tag for vertices') endif + ! we need to call this even when no mesh locally, it involves a collective ierr = iMOAB_ResolveSharedEntities( MHFID, nverts, vdone ); if (ierr > 0 ) & - call endrun('Error: fail to resolve shared entities') + call abortmp('Error: fail to resolve shared entities') if ( nelemd > 0) then vdone = -1 ! reuse vdone for the new tag, GLOBAL_ID (actual tag that we want to store global dof ) @@ -294,7 +295,7 @@ subroutine create_moab_meshes(par, elem) newtagg='GLOBAL_ID'//C_NULL_CHAR ierr = iMOAB_DefineTagStorage(MHFID, newtagg, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to create new GDOF tag') + call abortmp('Error: fail to create new GDOF tag') do ie=1,nelemd do ii=1,elem(ie)%idxp%NumUniquePts i=elem(ie)%idxp%ia(ii) @@ -310,19 +311,19 @@ subroutine create_moab_meshes(par, elem) if ( nverts > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHFID, newtagg, nverts , ent_type, vdone) if (ierr > 0 ) & - call endrun('Error: fail to set global dof tag for vertices') + call abortmp('Error: fail to set global dof tag for vertices') endif ierr = iMOAB_ReduceTagsMax ( MHFID, tagindex, ent_type) if (ierr > 0 ) & - call endrun('Error: fail to reduce max tag') + call abortmp('Error: fail to reduce max tag') ! set global id tag for elements ent_type = 1 ! now set the global id tag on elements if ( nelemd2 > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHFID, newtagg, nelemd2 , ent_type, elemids) if (ierr > 0 ) & - call endrun('Error: fail to set global id tag for elements') + call abortmp('Error: fail to set global id tag for elements') endif ! now, after reduction, we can get the actual global ids for each vertex in the fine mesh @@ -333,18 +334,18 @@ subroutine create_moab_meshes(par, elem) allocate(vgids(nverts)) ierr = iMOAB_GetIntTagStorage ( MHFID, newtagg, nverts , ent_type, vgids) if (ierr > 0 ) & - call endrun('Error: fail to retrieve GLOBAL ID on each task') + call abortmp('Error: fail to retrieve GLOBAL ID on each task') endif ierr = iMOAB_UpdateMeshInfo(MHFID) if (ierr > 0 ) & - call endrun('Error: fail to update mesh info') + call abortmp('Error: fail to update mesh info') #ifdef MOABDEBUG ! write out the mesh file to disk, in parallel outfile = 'wholeFineATM.h5m'//C_NULL_CHAR wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR ierr = iMOAB_WriteMesh(MHFID, outfile, wopts) if (ierr > 0 ) & - call endrun('Error: fail to write the mesh file') + call abortmp('Error: fail to write the mesh file') #endif @@ -422,7 +423,7 @@ subroutine create_moab_meshes(par, elem) if ( nverts_c > 0 ) then ierr = iMOAB_CreateVertices(MHID, dimcoord, dimen, moab_vert_coords) if (ierr > 0 ) & - call endrun('Error: fail to create MOAB vertices ') + call abortmp('Error: fail to create MOAB vertices ') endif ! num_el = nelemd mbtype = 3 ! quadrilateral @@ -432,7 +433,7 @@ subroutine create_moab_meshes(par, elem) if ( nelemd > 0 ) then ierr = iMOAB_CreateElements( MHID, nelemd, mbtype, nve, moabconn_c, block_ID ); if (ierr > 0 ) & - call endrun('Error: fail to create MOAB elements') + call abortmp('Error: fail to create MOAB elements') endif ! idx: num vertices; vdone will store now the markers used in global resolve ! for this particular problem, markers are the global dofs at corner nodes @@ -443,28 +444,28 @@ subroutine create_moab_meshes(par, elem) numco = 1 ierr = iMOAB_DefineTagStorage(MHID, tagname, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to retrieve GDOFV id tag') + call abortmp('Error: fail to retrieve GDOFV id tag') ierr = iMOAB_DefineTagStorage(MHID, newtagg, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to retrieve GLOBAL_ID tag on coarse mesh') + call abortmp('Error: fail to retrieve GLOBAL_ID tag on coarse mesh') ! now set the values ent_type = 0 ! vertex type if ( nverts_c > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHID, tagname, nverts_c , ent_type, vdone_c) if (ierr > 0 ) & - call endrun('Error: fail to set GDOFV tag for vertices') + call abortmp('Error: fail to set GDOFV tag for vertices') endif ! set global id tag for coarse elements, too; they will start at nets=1, end at nete=nelemd ent_type = 1 ! now set the global id tag on elements if ( nelemd > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHID, newtagg, nelemd , ent_type, elemids) if (ierr > 0 ) & - call endrun('Error: fail to set global id tag for vertices') + call abortmp('Error: fail to set global id tag for vertices') endif ierr = iMOAB_ResolveSharedEntities( MHID, idx, vdone_c ); if (ierr > 0 ) & - call endrun('Error: fail to resolve shared entities') + call abortmp('Error: fail to resolve shared entities') ! global dofs are the GLL points are set for each element tagname='GLOBAL_DOFS'//C_NULL_CHAR @@ -472,7 +473,7 @@ subroutine create_moab_meshes(par, elem) numco = np*np ! usually, it is 16; each element will have the dofs in order ierr = iMOAB_DefineTagStorage(MHID, tagname, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to create global DOFS tag') + call abortmp('Error: fail to create global DOFS tag') ! now set the values ! set global dofs tag for coarse elements, too; they will start at nets=1, end at nete=nelemd ent_type = 1 ! now set the global id tag on elements @@ -499,7 +500,7 @@ subroutine create_moab_meshes(par, elem) if ( nelemd > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHID, tagname, numvals, ent_type, gdofel) if (ierr > 0 ) & - call endrun('Error: fail to set globalDOFs tag for coarse elements') + call abortmp('Error: fail to set globalDOFs tag for coarse elements') endif ! set the global ids for coarse vertices the same as corresponding fine vertices @@ -507,19 +508,19 @@ subroutine create_moab_meshes(par, elem) if ( nverts_c > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHID, newtagg, nverts_c , ent_type, vdone_c) if (ierr > 0 ) & - call endrun('Error: fail to set GLOBAL_DOFS tag values') + call abortmp('Error: fail to set GLOBAL_DOFS tag values') endif ierr = iMOAB_UpdateMeshInfo(MHID) if (ierr > 0 ) & - call endrun('Error: fail to update mesh info') + call abortmp('Error: fail to update mesh info') #ifdef MOABDEBUG ! write out the mesh file to disk, in parallel outfile = 'wholeATM.h5m'//C_NULL_CHAR wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR ierr = iMOAB_WriteMesh(MHID, outfile, wopts) if (ierr > 0 ) & - call endrun('Error: fail to write the mesh file') + call abortmp('Error: fail to write the mesh file') #endif if (fv_nphys > 0 ) then @@ -629,6 +630,8 @@ subroutine create_moab_meshes(par, elem) ! reuse moab_vert_coords for coordinates of pg mesh ! the first nverts_c coords are the same as coarse mesh; but we do create new allocate(vdone_pg(nverts_pg)) + else + allocate(vdone_pg(1)) endif do iv = 1, nverts_c vdone_pg(iv) = vdone_c(iv) ! also the coordinates will be the same !! @@ -737,7 +740,7 @@ subroutine create_moab_meshes(par, elem) if ( nverts_pg > 0 ) then ierr = iMOAB_CreateVertices(MHPGID, dimcoord, dimen, moab_vert_coords) if (ierr > 0 ) & - call endrun('Error: fail to create MOAB vertices ') + call abortmp('Error: fail to create MOAB vertices ') endif ! num_el = nelem_pg * mbtype = 3 ! quadrilateral @@ -747,44 +750,45 @@ subroutine create_moab_meshes(par, elem) if ( nelem_pg > 0 ) then ierr = iMOAB_CreateElements( MHPGID, nelem_pg, mbtype, nve, moabconn_pg, block_ID ); if (ierr > 0 ) & - call endrun('Error: fail to create MOAB elements') + call abortmp('Error: fail to create MOAB elements') endif tagname='GLOBAL_ID'//C_NULL_CHAR tagtype = 0 ! dense, integer numco = 1 ierr = iMOAB_DefineTagStorage(MHPGID, tagname, tagtype, numco, tagindex ) if (ierr > 0 ) & - call endrun('Error: fail to retrieve GLOBAL id tag') + call abortmp('Error: fail to retrieve GLOBAL id tag') ! now set the values ent_type = 0 ! vertex type if ( nverts_pg > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHPGID, tagname, nverts_pg , ent_type, vdone_pg) if (ierr > 0 ) & - call endrun('Error: fail to set global id tag for vertices') + call abortmp('Error: fail to set global id tag for vertices') endif ! set global id tag for pg2 elements, too; they will start at nets=1, end at nete=nelemd*4 ent_type = 1 ! now set the global id tag on elements if ( nelem_pg > 0 ) then ierr = iMOAB_SetIntTagStorage ( MHPGID, tagname, nelem_pg , ent_type, elemids) if (ierr > 0 ) & - call endrun('Error: fail to set global id tag for edges') + call abortmp('Error: fail to set global id tag for edges') endif + ! this involves a collective, vdone_pg can be empty ierr = iMOAB_ResolveSharedEntities( MHPGID, nverts_pg, vdone_pg ); if (ierr > 0 ) & - call endrun('Error: fail to resolve shared ents for pg2 mesh') + call abortmp('Error: fail to resolve shared ents for pg2 mesh') ierr = iMOAB_UpdateMeshInfo(MHPGID) if (ierr > 0 ) & - call endrun('Error: fail to update mesh info for pg2 mesh') + call abortmp('Error: fail to update mesh info for pg2 mesh') #ifdef MOABDEBUG ! write out the mesh file to disk, in parallel outfile = 'wholeATM_PG2.h5m'//C_NULL_CHAR wopts = 'PARALLEL=WRITE_PART'//C_NULL_CHAR ierr = iMOAB_WriteMesh(MHPGID, outfile, wopts) if (ierr > 0 ) & - call endrun('Error: fail to write the mesh file') + call abortmp('Error: fail to write the mesh file') #endif endif ! only valid for pg == 2 if ( nelemd > 0 ) then @@ -792,16 +796,14 @@ subroutine create_moab_meshes(par, elem) deallocate (indx_cell) deallocate (edge) ! deallocate(moabconn_pg) ! connectivity - deallocate(vdone_pg) endif - + deallocate(vdone_pg) ! this is now always allocated/deallocated, even for no mesh here endif ! deallocate if ( nelemd > 0 ) then deallocate(moabvh) deallocate(moabconn) ! do not keep it anymore, we are not setting another tag on fine mesh - deallocate(vdone) deallocate(gdofel) deallocate(indx) deallocate(elemids) @@ -810,6 +812,7 @@ subroutine create_moab_meshes(par, elem) deallocate(moabconn_c) deallocate(vdone_c) endif + deallocate(vdone) ! we are always allocating this now ! end copy end subroutine create_moab_meshes From 62ba0f4fefc5e07cd872b909fe2448ec9d016b03 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 14:25:07 -0700 Subject: [PATCH 208/310] Update EKAT submodule, to get Kokkos 4.2 --- externals/ekat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/ekat b/externals/ekat index 69a7b84e396..44977d9eab5 160000 --- a/externals/ekat +++ b/externals/ekat @@ -1 +1 @@ -Subproject commit 69a7b84e39639aacb63f45861033d698b1cf085a +Subproject commit 44977d9eab51b812952b6bac7dfcb30aafdf7cb5 From bec0414c214579d88c4b14d0cfa0e5764c192a78 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 27 Sep 2023 09:52:18 -0600 Subject: [PATCH 209/310] HOMME: remove pointless lines in compose Besides doing nothing, InitArguments is deprecated in Kokkos 4.0 --- components/homme/src/share/compose/compose_slmm.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/homme/src/share/compose/compose_slmm.cpp b/components/homme/src/share/compose/compose_slmm.cpp index b8277b5423c..27ab1e1a7d0 100644 --- a/components/homme/src/share/compose/compose_slmm.cpp +++ b/components/homme/src/share/compose/compose_slmm.cpp @@ -276,8 +276,6 @@ extern "C" { // Interface for Homme, through compose_mod.F90. void kokkos_init () { amb::dev_init_threads(); - Kokkos::InitArguments args; - args.disable_warnings = true; initialize_kokkos(); // Test these initialize correctly. Kokkos::View v("hi"); From 980ef0381c8625469a436ad77b2479984a91fba0 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 27 Sep 2023 09:52:49 -0600 Subject: [PATCH 210/310] HOMME: remove volatile qualifier in custom reducer join method Kokkos 4.0 no longer allows use of volatile in this context --- components/homme/src/share/compose/compose_slmm_siqk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/homme/src/share/compose/compose_slmm_siqk.cpp b/components/homme/src/share/compose/compose_slmm_siqk.cpp index 5f8c4474df1..628c023090c 100644 --- a/components/homme/src/share/compose/compose_slmm_siqk.cpp +++ b/components/homme/src/share/compose/compose_slmm_siqk.cpp @@ -75,7 +75,7 @@ class TestSphereToRefKernel { } KOKKOS_INLINE_FUNCTION - void join (volatile value_type& dst, volatile value_type const& src) const { + void join (value_type& dst, value_type const& src) const { dst.max_nits = max(dst.max_nits, src.max_nits); dst.sum_nits += src.sum_nits; dst.nfails += src.nfails; From dc5cb8f1e82133c7c986ffe6751fad3a1e1fda11 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 10:57:03 -0700 Subject: [PATCH 211/310] HOMME: add missing iostream includes --- components/homme/src/share/compose/cedr_util.hpp | 5 +++-- .../homme/test_execs/preqx_kokkos_ut/remap_preqx_ut.cpp | 1 + .../test_execs/share_kokkos_ut/boundary_exchange_ut.cpp | 1 + .../homme/test_execs/share_kokkos_ut/col_ops_ut.cpp | 8 +++++--- .../homme/test_execs/share_kokkos_ut/ppm_remap_ut.cpp | 1 + .../homme/test_execs/share_kokkos_ut/sphere_op_ml.cpp | 1 + .../homme/test_execs/share_kokkos_ut/sphere_op_sl.cpp | 1 + .../homme/test_execs/thetal_kokkos_ut/elem_ops_ut.cpp | 7 ++++--- 8 files changed, 17 insertions(+), 8 deletions(-) diff --git a/components/homme/src/share/compose/cedr_util.hpp b/components/homme/src/share/compose/cedr_util.hpp index 52a1a4d77b5..6d5ca7fecf5 100644 --- a/components/homme/src/share/compose/cedr_util.hpp +++ b/components/homme/src/share/compose/cedr_util.hpp @@ -4,11 +4,12 @@ #ifndef INCLUDE_CEDR_UTIL_HPP #define INCLUDE_CEDR_UTIL_HPP -#include - #include "cedr_kokkos.hpp" #include "cedr_mpi.hpp" +#include // For std::stringstream +#include // For std::cerr + namespace cedr { namespace util { diff --git a/components/homme/test_execs/preqx_kokkos_ut/remap_preqx_ut.cpp b/components/homme/test_execs/preqx_kokkos_ut/remap_preqx_ut.cpp index 480c3782931..771376e959f 100644 --- a/components/homme/test_execs/preqx_kokkos_ut/remap_preqx_ut.cpp +++ b/components/homme/test_execs/preqx_kokkos_ut/remap_preqx_ut.cpp @@ -10,6 +10,7 @@ #include "utilities/TestUtils.hpp" #include +#include TEST_CASE("remap_interface", "vertical remap") { diff --git a/components/homme/test_execs/share_kokkos_ut/boundary_exchange_ut.cpp b/components/homme/test_execs/share_kokkos_ut/boundary_exchange_ut.cpp index 12a7e9a1673..ad15a1c10bd 100644 --- a/components/homme/test_execs/share_kokkos_ut/boundary_exchange_ut.cpp +++ b/components/homme/test_execs/share_kokkos_ut/boundary_exchange_ut.cpp @@ -11,6 +11,7 @@ #include #include +#include using namespace Homme; diff --git a/components/homme/test_execs/share_kokkos_ut/col_ops_ut.cpp b/components/homme/test_execs/share_kokkos_ut/col_ops_ut.cpp index b27b3f3281b..85368cd6ab0 100644 --- a/components/homme/test_execs/share_kokkos_ut/col_ops_ut.cpp +++ b/components/homme/test_execs/share_kokkos_ut/col_ops_ut.cpp @@ -1,15 +1,17 @@ #include -#include - #include "ColumnOps.hpp" -#include "Types.hpp" #include "utilities/TestUtils.hpp" #include "utilities/SubviewUtils.hpp" #include "utilities/SyncUtils.hpp" #include "utilities/ViewUtils.hpp" +#include "Types.hpp" + +#include +#include + using namespace Homme; diff --git a/components/homme/test_execs/share_kokkos_ut/ppm_remap_ut.cpp b/components/homme/test_execs/share_kokkos_ut/ppm_remap_ut.cpp index 5fe4a9c2163..401a029607f 100644 --- a/components/homme/test_execs/share_kokkos_ut/ppm_remap_ut.cpp +++ b/components/homme/test_execs/share_kokkos_ut/ppm_remap_ut.cpp @@ -8,6 +8,7 @@ #include "utilities/TestUtils.hpp" #include +#include using namespace Homme; diff --git a/components/homme/test_execs/share_kokkos_ut/sphere_op_ml.cpp b/components/homme/test_execs/share_kokkos_ut/sphere_op_ml.cpp index e4cbb4ec459..e261b60b390 100644 --- a/components/homme/test_execs/share_kokkos_ut/sphere_op_ml.cpp +++ b/components/homme/test_execs/share_kokkos_ut/sphere_op_ml.cpp @@ -13,6 +13,7 @@ #include #include #include +#include using namespace Homme; diff --git a/components/homme/test_execs/share_kokkos_ut/sphere_op_sl.cpp b/components/homme/test_execs/share_kokkos_ut/sphere_op_sl.cpp index 26cec000976..fd2f79fabae 100644 --- a/components/homme/test_execs/share_kokkos_ut/sphere_op_sl.cpp +++ b/components/homme/test_execs/share_kokkos_ut/sphere_op_sl.cpp @@ -13,6 +13,7 @@ #include #include #include +#include using namespace Homme; diff --git a/components/homme/test_execs/thetal_kokkos_ut/elem_ops_ut.cpp b/components/homme/test_execs/thetal_kokkos_ut/elem_ops_ut.cpp index 8cccddb5118..9627b0d6d61 100644 --- a/components/homme/test_execs/thetal_kokkos_ut/elem_ops_ut.cpp +++ b/components/homme/test_execs/thetal_kokkos_ut/elem_ops_ut.cpp @@ -1,14 +1,15 @@ #include -#include - #include "ElementOps.hpp" -#include "Types.hpp" #include "utilities/TestUtils.hpp" #include "utilities/SubviewUtils.hpp" #include "utilities/SyncUtils.hpp" #include "utilities/ViewUtils.hpp" +#include "Types.hpp" + +#include +#include using namespace Homme; From d7ae6786529c0e23b762c2ae17f2cc02c2d351c6 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 10:57:29 -0700 Subject: [PATCH 212/310] HOMME: fix Kokkos-related compilation error Some of the exec spaces static methods are no longer static --- components/homme/src/share/cxx/ExecSpaceDefs.hpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/components/homme/src/share/cxx/ExecSpaceDefs.hpp b/components/homme/src/share/cxx/ExecSpaceDefs.hpp index 8c18d8bcbb9..fbcd314cb2b 100644 --- a/components/homme/src/share/cxx/ExecSpaceDefs.hpp +++ b/components/homme/src/share/cxx/ExecSpaceDefs.hpp @@ -143,11 +143,7 @@ struct DefaultThreadsDistribution { team_num_threads_vectors(const int num_parallel_iterations, const ThreadPreferences tp = ThreadPreferences()) { return Parallel::team_num_threads_vectors_from_pool( -#ifdef KOKKOS_ENABLE_DEPRECATED_CODE - ExecSpaceType::thread_pool_size() -#else - ExecSpaceType::impl_thread_pool_size() -#endif + ExecSpaceType().impl_thread_pool_size() , num_parallel_iterations, tp); } }; From dabc215640119f6e1f2750dd35920e3055cd975e Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 17:00:06 -0600 Subject: [PATCH 213/310] HOMME: add missing cmakedefine to preqx config.h.cmake.in file The KOKKOS_TARGET macro prevents Kokkos::initialize to be called twice in kokkos targets. Kokkos 4.2 no longer tolerates double initialization, so we must prevent it. --- components/homme/src/preqx_kokkos/config.h.cmake.in | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/homme/src/preqx_kokkos/config.h.cmake.in b/components/homme/src/preqx_kokkos/config.h.cmake.in index c0bc4c311c3..119844f3def 100644 --- a/components/homme/src/preqx_kokkos/config.h.cmake.in +++ b/components/homme/src/preqx_kokkos/config.h.cmake.in @@ -58,9 +58,8 @@ /* ZOLTAN2 SUBPACKAGE OF TRILINOS library */ #cmakedefine01 TRILINOS_HAVE_ZOLTAN2 -/* When doing BFB testing, we occasionally must use modified code. */ -/* Use this flag to protect such code. */ -#cmakedefine HOMMEXX_BFB_TESTING +/* Detect whether this is a kokkos target */ +#cmakedefine01 KOKKOS_TARGET /* Whether to use OpenMP4 */ #cmakedefine OMP4 From 59ee13f3276f9bb1abbacc33bac4a51bbb412c8c Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 17:05:11 -0600 Subject: [PATCH 214/310] HOMME: add GllFvRemap cxx source files to preqx_kokkos sources --- components/homme/src/preqx_kokkos/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/homme/src/preqx_kokkos/CMakeLists.txt b/components/homme/src/preqx_kokkos/CMakeLists.txt index 425e7c34da7..dff42bb97c6 100644 --- a/components/homme/src/preqx_kokkos/CMakeLists.txt +++ b/components/homme/src/preqx_kokkos/CMakeLists.txt @@ -168,6 +168,8 @@ MACRO(PREQX_KOKKOS_SETUP) ${SRC_SHARE_DIR}/cxx/EulerStepFunctor.cpp ${SRC_SHARE_DIR}/cxx/ExecSpaceDefs.cpp ${SRC_SHARE_DIR}/cxx/FunctorsBuffersManager.cpp + ${SRC_SHARE_DIR}/cxx/GllFvRemap.cpp + ${SRC_SHARE_DIR}/cxx/GllFvRemapImpl.cpp ${SRC_SHARE_DIR}/cxx/Hommexx_Session.cpp ${SRC_SHARE_DIR}/cxx/HybridVCoord.cpp ${SRC_SHARE_DIR}/cxx/HyperviscosityFunctor.cpp From a863acb77f6cd873892578c01ce07b28f6a500d2 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 5 Dec 2023 17:16:09 -0600 Subject: [PATCH 215/310] HOMME: use new CMake syntax from EKAT to build kokkos --- components/homme/CMakeLists.txt | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/components/homme/CMakeLists.txt b/components/homme/CMakeLists.txt index c016182e3bf..fdb996fa17a 100644 --- a/components/homme/CMakeLists.txt +++ b/components/homme/CMakeLists.txt @@ -447,18 +447,22 @@ if(HOMME_BUILD_EXECS AND NOT BUILD_HOMME_WITHOUT_PIOLIBRARY) ENDIF () ENDIF () -# If we don't need kokkos we don't need EKAT, and if -# Homme is built in EAMxx EKAT is already built -IF (HOMME_USE_KOKKOS AND HOMME_STANDALONE) - # Add ekat's cmake/pkg_build folder to cmake path +IF (HOMME_USE_KOKKOS) + # Add ekat's cmake scripts folders to cmake path set (EKAT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../externals/ekat) set (EKAT_CMAKE_PATH ${EKAT_SOURCE_DIR}/cmake) list(APPEND CMAKE_MODULE_PATH - ${EKAT_CMAKE_PATH} - ${EKAT_CMAKE_PATH}/pkg_build - ${EKAT_CMAKE_PATH}/tpls + ${EKAT_CMAKE_PATH} + ${EKAT_CMAKE_PATH}/tpls ) - include (EkatBuildKokkos) + + # We first try to use find_package. If that doesn't work, build from EKAT's submodule + include (EkatFindKokkos) + if (NOT Kokkos_FOUND) + # The following script checks if Kokkos is already available as a target, and if so does nothing. + # For instance, if HOMME is built inside EAMxx, Kokkos will already be available + include (EkatBuildKokkos) + endif() ENDIF () # This folder contains the CMake macro used to build cxx unit tests From 389cd9fbd3747ac1842030889a9796d59351cfaf Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Fri, 12 Jan 2024 12:09:38 -0800 Subject: [PATCH 216/310] HOMME: do not set cxx standard. Kokkos will crap out anyways if c++17 is not supported --- components/homme/cmake/SetCompilerFlags.cmake | 6 ------ 1 file changed, 6 deletions(-) diff --git a/components/homme/cmake/SetCompilerFlags.cmake b/components/homme/cmake/SetCompilerFlags.cmake index 49e79a463c4..9a37c6a36bd 100644 --- a/components/homme/cmake/SetCompilerFlags.cmake +++ b/components/homme/cmake/SetCompilerFlags.cmake @@ -68,12 +68,6 @@ IF (${HOMME_USE_CXX}) SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") INCLUDE(CheckCXXCompilerFlag) - CHECK_CXX_COMPILER_FLAG("-std=c++14" CXX14_SUPPORTED) - IF (CXX14_SUPPORTED) - SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") - ELSEIF (${HOMME_USE_KOKKOS}) - MESSAGE (FATAL_ERROR "Kokkos needs C++14, but the C++ compiler does not support it.") - ENDIF () CHECK_CXX_COMPILER_FLAG("-cxxlib" CXXLIB_SUPPORTED) IF (CXXLIB_SUPPORTED) SET(CXXLIB_SUPPORTED_CACHE TRUE CACHE BOOL "") From db1a5b0b2a331b47271776e69e510f7e31c31043 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 23 Apr 2024 13:06:44 -0400 Subject: [PATCH 217/310] HOMME: fix scope of HIPTraits from kokkos --- components/homme/src/share/cxx/ExecSpaceDefs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/homme/src/share/cxx/ExecSpaceDefs.cpp b/components/homme/src/share/cxx/ExecSpaceDefs.cpp index 784d37b65d2..8d496bff5d1 100644 --- a/components/homme/src/share/cxx/ExecSpaceDefs.cpp +++ b/components/homme/src/share/cxx/ExecSpaceDefs.cpp @@ -187,7 +187,7 @@ team_num_threads_vectors (const int num_parallel_iterations, #elif defined(KOKKOS_ENABLE_HIP) // Use 64 wavefronts per CU and 120 CUs. const int num_warps_device = 120*64; // no such thing Kokkos::Impl::hip_internal_maximum_warp_count(); - const int num_threads_warp = Kokkos::Experimental::Impl::HIPTraits::WarpSize; + const int num_threads_warp = Kokkos::Impl::HIPTraits::WarpSize; #else // I want thread-distribution rules to be unit-testable even when GPU spaces // are off. Thus, make up a GPU-like machine: From 3160ec754839c5e200b632977545217f0e8c19f4 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 16 Jan 2024 10:39:03 -0800 Subject: [PATCH 218/310] EAMxx: add missing iostream include --- components/eamxx/src/share/util/scream_utils.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/components/eamxx/src/share/util/scream_utils.hpp b/components/eamxx/src/share/util/scream_utils.hpp index 6e4f08ffd22..b1771f3a1ae 100644 --- a/components/eamxx/src/share/util/scream_utils.hpp +++ b/components/eamxx/src/share/util/scream_utils.hpp @@ -11,6 +11,7 @@ #include #include #include +#include namespace scream { From 74611c98e87f4bea001de682d9751851763a52bb Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 25 Apr 2024 12:31:20 -0600 Subject: [PATCH 219/310] Disable OpenMP in Kokkos for frontier-scream-gpu machine --- .../cmake_macros/crayclang-scream_frontier-scream-gpu.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/machines/cmake_macros/crayclang-scream_frontier-scream-gpu.cmake b/cime_config/machines/cmake_macros/crayclang-scream_frontier-scream-gpu.cmake index 8cc85b92cc6..afcca8f479e 100644 --- a/cime_config/machines/cmake_macros/crayclang-scream_frontier-scream-gpu.cmake +++ b/cime_config/machines/cmake_macros/crayclang-scream_frontier-scream-gpu.cmake @@ -34,5 +34,5 @@ if (COMP_NAME STREQUAL gptl) endif() set(PIO_FILESYSTEM_HINTS "lustre") -string(APPEND KOKKOS_OPTIONS " -DKokkos_ENABLE_HIP=On -DKokkos_ARCH_VEGA90A=On -DCMAKE_CXX_FLAGS='-std=gnu++14'") +string(APPEND KOKKOS_OPTIONS " -DKokkos_ENABLE_HIP=On -DKokkos_ARCH_VEGA90A=On -DCMAKE_CXX_FLAGS='-std=gnu++14' -DKokkos_ENABLE_OPENMP=OFF") set(USE_HIP "TRUE") From d8e3c717bfaa1b7d329b731aca55105362f7b6c0 Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Thu, 25 Apr 2024 16:02:55 -0500 Subject: [PATCH 220/310] Remove SMS.f09_g16_a.IGELM_MLI from e3sm_developer suite --- cime_config/tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index 6a222f82a78..9f0daf247a9 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -276,7 +276,6 @@ "SMS_Ld1.T62_oQU240wLI.GMPAS-IAF-DISMF", "ERS.f09_g16_g.MALISIA", "SMS.T62_oQU120_ais20.MPAS_LISIO_TEST", - "SMS.f09_g16_a.IGELM_MLI", "SMS_P12x2.ne4_oQU240.WCYCL1850NS.allactive-mach_mods", "ERS_Ln9.ne4pg2_ne4pg2.F2010-MMF1.eam-mmf_crmout", ) From 4d2427b5b7810b0c3e80e3f6baca576575ae9563 Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Thu, 25 Apr 2024 17:14:56 -0500 Subject: [PATCH 221/310] Fix cut-and-paste error for TL319-gis1to10kmR2 --- cime_config/config_grids.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cime_config/config_grids.xml b/cime_config/config_grids.xml index ac3c4b2ddbf..2902358e84f 100755 --- a/cime_config/config_grids.xml +++ b/cime_config/config_grids.xml @@ -5005,10 +5005,10 @@ - cpl/gridmaps/TL319/map_TL319_to_gis20km_traave.20240404.nc - cpl/gridmaps/TL319/map_TL319_to_gis20km_trbilin.20240404.nc - cpl/gridmaps/mpas.gis1to10km/map_gis20km_to_TL319_traave.20240404.nc - cpl/gridmaps/mpas.gis1to10km/map_gis20km_to_TL319_traave.20240404.nc + cpl/gridmaps/TL319/map_TL319_to_gis1to10kmR2_traave.20240404.nc + cpl/gridmaps/TL319/map_TL319_to_gis1to10kmR2_trbilin.20240404.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_TL319_traave.20240404.nc + cpl/gridmaps/mpas.gis1to10km/map_gis1to10kmR2_to_TL319_traave.20240404.nc From de9686e5d4b78cccbf62d50e70927bd2721499b9 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 26 Apr 2024 10:50:57 -0700 Subject: [PATCH 222/310] Delete initializing tbot to posinf to allow info_dbug level 2 and above --- components/eam/src/physics/cam/physpkg.F90 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/eam/src/physics/cam/physpkg.F90 b/components/eam/src/physics/cam/physpkg.F90 index f711bc8eaa6..5ece6725279 100644 --- a/components/eam/src/physics/cam/physpkg.F90 +++ b/components/eam/src/physics/cam/physpkg.F90 @@ -526,10 +526,6 @@ subroutine phys_inidat( cam_out, pbuf2d ) end do deallocate(tptr) - do lchnk=begchunk,endchunk - cam_out(lchnk)%tbot(:) = posinf - end do - ! ! 3-D fields ! From 0a4237e7ef4e8eabe63e2ab640727ed9d3a0cd7d Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 28 Mar 2024 22:26:16 -0700 Subject: [PATCH 223/310] Add mkdocs extension to add tables in docs --- mkdocs.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yaml b/mkdocs.yaml index 2fe54bfee1b..7b7e88c62f8 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -48,6 +48,7 @@ markdown_extensions: - pymdownx.arithmatex: generic: true - md_in_html + - tables plugins: - monorepo From dc824f1b083d100e30dbf730da47eba14d172e30 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 28 Mar 2024 22:27:57 -0700 Subject: [PATCH 224/310] Add initial documentation to EAM users and tech guide --- components/eam/docs/tech-guide/armdiags.md | 47 +++++ .../eam/docs/tech-guide/chemUCIlinozv3.md | 28 +++ components/eam/docs/tech-guide/clubb.md | 16 ++ components/eam/docs/tech-guide/cosp.md | 29 +++ components/eam/docs/tech-guide/dust.md | 11 + components/eam/docs/tech-guide/index.md | 43 +++- components/eam/docs/tech-guide/mam4.md | 18 ++ components/eam/docs/tech-guide/mam5.md | 8 + components/eam/docs/tech-guide/p3.md | 26 +++ components/eam/docs/tech-guide/rrtmg.md | 17 ++ components/eam/docs/tech-guide/vbs.md | 5 + components/eam/docs/tech-guide/zm.md | 58 ++++++ .../eam/docs/user-guide/aerosol_phys_prop.md | 109 ++++++++++ .../docs/user-guide/emission_oxidant_files.md | 197 ++++++++++++++++++ components/eam/docs/user-guide/index.md | 129 +++++++++++- 15 files changed, 739 insertions(+), 2 deletions(-) create mode 100644 components/eam/docs/tech-guide/armdiags.md create mode 100644 components/eam/docs/tech-guide/chemUCIlinozv3.md create mode 100644 components/eam/docs/tech-guide/clubb.md create mode 100644 components/eam/docs/tech-guide/cosp.md create mode 100644 components/eam/docs/tech-guide/dust.md create mode 100644 components/eam/docs/tech-guide/mam4.md create mode 100644 components/eam/docs/tech-guide/mam5.md create mode 100644 components/eam/docs/tech-guide/p3.md create mode 100644 components/eam/docs/tech-guide/rrtmg.md create mode 100644 components/eam/docs/tech-guide/vbs.md create mode 100644 components/eam/docs/tech-guide/zm.md create mode 100644 components/eam/docs/user-guide/aerosol_phys_prop.md create mode 100644 components/eam/docs/user-guide/emission_oxidant_files.md diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md new file mode 100644 index 00000000000..e926159aae3 --- /dev/null +++ b/components/eam/docs/tech-guide/armdiags.md @@ -0,0 +1,47 @@ +# ARM diagnostics + +## Overview + +The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020). It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023; Emmenegger et al. 2022; Zhang et al. 2018). The Majority of ARM Diags sets are ported into E3SM Diags (Zhabg et al. 2022) for routine evaluation of the model. + +## To enable the use of ARM Diags + +To enable using ARM Diags for a simulation, often, a new tape that output at high-frequency over limited-area (nearest grid box to supported ARM site) needs to be included in the namelist file, an example as follows: + +``` +fincl7 = 'PS','Q','T','Z3','CLOUD','CONCLD','CLDICE','CLDLIQ','FREQR','REI','REL','PRECT','TMQ','PRECC','TREFHT','QREFHT','OMEGA','CLDTOT','LHFLX','SHFLX','FLDS','FSDS','FLNS','FSNS','FLNSC','FSDSC','FSNSC','AODVIS','AODABS','LS_FLXPRC','LS_FLXSNW','LS_REFFRAIN','ZMFLXPRC','ZMFLXSNW','CCN1','CCN2','CCN3','CCN4','CCN5','num_a1','num_a2','num_a3','num_a4','so4_a1','so4_a2','so4_a3','AREL','TGCLDLWP','AQRAIN','ANRAIN','FREQR','PRECL','RELHUM' +fincl7lonlat='262.5e_36.6n','204.6e_71.3n','147.4e_2.0s','166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' +``` + +Note that in this example fincl7 should set to write output at hourly (`nhtfrq = -1`). And here additional variables are included for ARM simulator analysis. The ARM site information is shown below: +``` + "sgpc1": ["97.5W 36.4N Oklahoma ARM"], + + "nsac1": ["156.6W 71.3N Barrow ARM"], + + "twpc1": "147.4E 2.1S Manus ARM"], + + "twpc2": ["166.9E 0.5S Nauru ARM"], + + "twpc3": ["130.9E 12.4S Darwin ARM"], + + "enac1": ["28.0E 39.1N Graciosa Island ARM"], +``` + + +## Diagnostics and metrics currently implemented in the ARM Diags + +| Statistical Metrics | Variables | Time sampling | +| ------------------------- | --------------------------------------------------------------- | ----------------- | +| Line plots and Taylor diagrams for annual cycle variability of each variable | Precipitation, column water vapor, surface energy budget components, near-surface temperature and specific humidity, surface pressure, total cloud fraction, and aerosol optical depth. | Monthly mean | +| Contour and vertical profiles of annual cycle and diurnal cycle of cloud fraction | Vertical profiles of cloud fraction | Hourly mean | +| Line and harmonic dial plots of diurnal cycle of precipitation | Surface precipitation rate | Hourly mean | +| Probability density function (PDF) plots of precipitation rate | Surface precipitation rate | Hourly mean | +| CCN Annual Cycles | CCN number concentrations at 0.1%, 0.2%, 0.5% and 1.0% supersaturation levels | Hourly mean | +| Aerosol Annual Cycles | Total aerosol number concentration | Hourly mean | +| Aerosol Chemical Annual Cycles | Organic, sulfate, nitrate, ammonium, chloride mass concentration | Hourly mean | + +| Process-oriented metrics | Variables | Time sampling | +| ------------------------- | ------------------------------------------------------------- | ----------------- | +| Convection Onset | 1. Surface precipitation rate
2. Column Precipitable Water Vapor | Hourly mean | +| Aerosol-CCN Activation | 1. Total aerosol number concentration
2. CCN number concentrations at different supersaturation levels (0.1%, 0.2%, 0.5% and 1.0) | Hourly mean | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/chemUCIlinozv3.md b/components/eam/docs/tech-guide/chemUCIlinozv3.md new file mode 100644 index 00000000000..89565630245 --- /dev/null +++ b/components/eam/docs/tech-guide/chemUCIlinozv3.md @@ -0,0 +1,28 @@ +# chemUCI and Linoz v3 + +## Overview + +Atmospheric interactive chemistry is handled by chemUCI (in the troposphere) and Linoz v3 (in the stratosphere). chemUCI consists of 28 advected tracers for the O3-CH4-HOx-NOx-NMVOCs chemistry. Compared to E3SMv2, the E3SMv3 linearized stratospheric chemistry scheme (Linoz v3) expends the interactive species to include O3, N2O, NOy, and CH4. The boundary between stratosphere and troposphere adopts the e90 tropopause algorithm. + +## Namelist parameters + +| Parameter | Description | Default value* | +| ---------------------------- | ------------------------------------------------------------------------ | ---------------------- | +| `airpl_emis_file` | Aviation emission | | +| `chlorine_loading_file` | Chlorine loading | | +| `chlorine_loading_fixed_ymd` | Directory of P3 look-up tables | | +| `chlorine_loading_type` | P3 look-up table Version | | +| `ext_frc_specifier` | 3-D emissions | | +| `ext_frc_cycle_yr` | Output of P3 microphysical process rates | | +| `ext_frc_type` | Tunable parameter for adjusting rain accretion efficiency | | +| `srf_emis_specifier` | Surface emissions | | +| `srf_emis_cycle_yr` | Radius of embryomic raindrops from auto-conversion | | +| `srf_emis_type` | Upper bound of mean raindrop diameter | | +| `linoz_data_file` | Linoz data file | | +| `linoz_data_cycle_yr` | Nc exponent in droplet auto-conversion | | +| `linoz_data_path` | Qc exponent in rain accretion | | +| `linoz_data_type` | Qc exponeent in droplet autoconversion | | +| `lght_no_prd_factor` | Lightning NOx emission factor | `5.0` | +| `fstrat_efold_list` | Tracer (from troposphere) list with e-folding decay in the stratosphere | | + +* Many of these namelist parameters specify input data files. Check the `atm_in` file for examples or refer to the [Users' Guide](../user-guide/index.md). \ No newline at end of file diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md new file mode 100644 index 00000000000..6f3dc31995a --- /dev/null +++ b/components/eam/docs/tech-guide/clubb.md @@ -0,0 +1,16 @@ +# Cloud Layers Unified By Binormals + +## Overview + +The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds. It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. + +## Namelist parameters + +| Parameter | Description | Default value | +| -------------- | ------------------------------------------------------------------------------------------- | -------------- | +| `gamma_coef` | Width of vertical velocity within a Gaussian PDF component at low skewness | `0.12` | +| `gamma_coefb` | Width of vertical velocity within a Gaussian PDF component at high skewness | `0.28` | +| `C8` | Coefficient of damping of third moment of vertical velocity, w’3 | `5.2` | +| `C1` | Coefficient of damping of second vertical moment of vertical velocity, w’2, at low skewness | `2.4` | +| `C14` | Coefficient of damping of second horizontal moments of vertical velocity, u’2 and v’2 | `2.0` | +| `c_k10` | Ratio of diffusivity of momentum to heat | `0.35` | diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md new file mode 100644 index 00000000000..9044c17a514 --- /dev/null +++ b/components/eam/docs/tech-guide/cosp.md @@ -0,0 +1,29 @@ +# Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package + +## Overview + +The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011; Swales et al., 2018) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. + +## To turn on COSP outputs + +Run (add to the run script) the following command before running `./case.setup` + +`./xmlchange --id CAM_CONFIG_OPTS --append --val='-cosp'` + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `cosp_lite` | This namelist sets cosp_ncolumns=10 and cosp_nradsteps=3 (appropriate for COSP statistics derived from seasonal averages), and runs MISR, ISCCP, MODIS, and CALIPSO lidar simulators (cosp_lmisr_sim=.true.,cosp_lisccp_sim=.true., cosp_lmodis_sim=.true.,cosp_llidar_sim=.true.). | `false` | + +| Related Outputs | Description | +| ------------------------- | ----------------------------------------------------------------- | +| `FISCCP1_COSP` | Grid-box fraction covered by each ISCCP D level cloud type | +| `CLMODIS` | MODIS Cloud Area Fraction | +| `CLD_MISR` | Cloud Fraction from MISR Simulator | +| `CLDTOT_CAL` | Calipso Total Cloud Fraction | +| `CLDHGH_CAL` | Calipso High-level Cloud Fraction | +| `CLDMED_CAL` | Calipso Mid-level Cloud Fraction | +| `CLDLOW_CAL` | Calipso Low-level Cloud Fraction | +| `CLD_CAL_TMPLIQ` | Calipso Liquid Cloud Fraction as a function of temperature | +| `CLD_CAL_TMPICE` | Calipso Ice Cloud Fraction as a function of temperature | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/dust.md b/components/eam/docs/tech-guide/dust.md new file mode 100644 index 00000000000..256180288ba --- /dev/null +++ b/components/eam/docs/tech-guide/dust.md @@ -0,0 +1,11 @@ +# Dust aerosol + +## Overview + +Dust-related processes are represented in the E3SM atmosphere and land model components. In E3SMv3, dust deposition will also be coupled with the sea ice and ocean biogeochemistry in the ocean model. Total emission fluxes of dust particles are calculated at each model time step. A new dust emission scheme following Kok et al. (2014) is implemented to E3SMv3, replacing the Zender scheme (Zender et al., 2003) in E3SMv1 and v2 as the default option. The new dust emission scheme includes a time-varying soil erodibility factor for dust mobilization, and includes dust sources in high latitudes (e.g., >60 degree N). A manuscript by Feng et al. is in prep to document the performance of the new emission scheme on dust life cycle and radiative effects in E3SMv3. Dust aerosol is represented in the accumulation and coarse aerosol modes of the MAM4 module following emission. Other dust properties such as optical properties and size distribution at emission are documented in Feng et al. (2022). + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------- | ---------------------------------------------- | ------------------------------------------------- | +| `dust_emis_scheme` | The v3 dust emission scheme (Kok et al., 2014) | `2`
(set to 1 to switch to the v1/v2 scheme) | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index 44a4f1921e2..e311ba038f4 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -1 +1,42 @@ -start of the EAM Technical Guide +This Technical Guide describes the physics of EAM. + +# Dynamics + +- [HOMME](homme.md): Dynamical core + +# Physics + +## Microphysics + +- [P3](p3.md): The stratiform cloud microphysics scheme in EAMv3. + +## Shallow convection / turbulence + +- [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. + +## Deep convection + +- [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. + +## Radiation + +- [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. + +## Aerosol + +- [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv3. + +- [MAM5](mam5.md): The parameterization scheme to represent stratospheric sulfate aerosols in EAMv3. + +- [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. + +- [Dust](dust.md): The parameterization of dust emissions in EAMv3. + +## Chemistry + +- [Chem UCI + Linozv3](chemUCIlinozv3.md): The parameterization of atmospheric chemistry in EAMv3. + +## Diagnostic outputs + +- [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. +- [ARM Diags](armdiags.md): Diagnostic package that allows the model output to be compared against ARM measurements in EAMv3. \ No newline at end of file diff --git a/components/eam/docs/tech-guide/mam4.md b/components/eam/docs/tech-guide/mam4.md new file mode 100644 index 00000000000..4dced1b74d1 --- /dev/null +++ b/components/eam/docs/tech-guide/mam4.md @@ -0,0 +1,18 @@ +# Four-mode Modal Aerosol Module + +## Overview + +The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. + + +### Sea salt + +In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) and Monahan et al. (1986), and then redistributed to the three MAM4 size modes. + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | +| `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | +| `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | +| `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/mam5.md b/components/eam/docs/tech-guide/mam5.md new file mode 100644 index 00000000000..0aafad7de0c --- /dev/null +++ b/components/eam/docs/tech-guide/mam5.md @@ -0,0 +1,8 @@ +# Five-mode Modal Aerosol Model + +## Overview + +Five-mode Modal Aerosol Model (MAM5) replaces the MAM4 used in E3SM-V1 and -V2 versions and adds stratospheric coarse mode (the fifth mode) to represent stratospheric sulfate aerosols mainly induced by volcanic eruption and DMS decomposition. The only spicies in this mode is sulfate aerosol with smaller standard deviation value 1.2. + +## Namelist parameters + diff --git a/components/eam/docs/tech-guide/p3.md b/components/eam/docs/tech-guide/p3.md new file mode 100644 index 00000000000..c9acb9f3e9d --- /dev/null +++ b/components/eam/docs/tech-guide/p3.md @@ -0,0 +1,26 @@ +# Predicted Particle Properties + +## Overview + +The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties (P3; Morrison & Milbrandt, 2015, Milbrandt & Morrison, 2016). P3 offers a new approach to representing the evolution of ice particles that is more physical than the traditional approach of using predefined ice categories. It has been implemented in E3SM (Wang et al., 2021) to address the limitations in the original microphysics scheme- the lack of riming particles and the artificial conversion between ice crystals and snow particles. The current version in E3SM is a two-moment scheme with a single ice category (Morrison & Milbrandt, 2015). In addition to the total ice number and mass mixing ratios, P3 prognoses the rimed mass and rimed volume mixing ratios, which allows for the prediction of the continuous evolution of the rime fraction and particle density. It is worth noting that the ice nucleation parameterizations are changed to be aerosol-dependent in this study, with the heterogenous ice nucleation parameterizations from the Classical Nucleation Theory (Liu et al., 2012) and the homogenous in-situ cirrus formation based on Liu and Penner (2005). This differs from the P3 used in WRF and that used in the E3SM v1 in Wang et al. (2021) where the heterogeneous ice nucleation parameterizations are temperature dependent only. + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `do_prescribed_ccn` | Turn on the prescribed CCN if true | `false` | +| `micro_aerosolactivation` | Turn on aerosol activation if true | `true` | +| `micro_p3_lookup_dir` | Directory of P3 look-up tables | `/lcrc/group/e3sm/data/inputdata/atm/cam/physprops` | +| `micro_p3_tableversion` | P3 look-up table Version | `4.1.2` | +| `micro_subgrid_cloud` | Sub-grid cloud properties | `true` | +| `micro_tend_output` | Output of P3 microphysical process rates | `false` | +| `p3_accret_coeff` | Tunable parameter for adjusting rain accretion efficiency | `117.25` | +| `p3_autocon_coeff` | Tunable parameter for adjusting droplet autoconversion efficiency | `30500` | +| `p3_embryonic_rain_size` | Radius of embryomic raindrops from auto-conversion | `0.000025` (m) | +| `p3_max_mean_rain_size` | Upper bound of mean raindrop diameter | `0.005` (m) | +| `p3_mincdnc` | Lower bound of droplet number concentration | `20.d6` (# m-3) | +| `p3_nc_autocon_expon` | Nc exponent in droplet auto-conversion | `-1.1` | +| `p3_qc_accret_expon` | Qc exponent in rain accretion | `1.15` | +| `p3_qc_autocon_expon` | Qc exponeent in droplet autoconversion | `3.19` | +| `p3_wbf_coeff` | Tunable parameter for adjusting WBF efficiency | `1.0` | +| `do_cooper_inp3` | Turn on Cooper ice nucleation scheme if true | `false` | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/rrtmg.md b/components/eam/docs/tech-guide/rrtmg.md new file mode 100644 index 00000000000..3f030d5c53a --- /dev/null +++ b/components/eam/docs/tech-guide/rrtmg.md @@ -0,0 +1,17 @@ +# Rapid Radiative Transfer Model for GCMs + +## Overview + +The calculation of radiative energy flux through the atmosphere is done using the RRTMG radiation package (Iacono et al., 2008; Mlawer et al., 1997). The details are consistent with the implementation in CAM5 described in Neale et al. 2010. Radiative fluxes are broadly split into shortwave and longwave and computed by separate codes. The shortwave solver uses the 2-stream approximation, while the longwave is an absorption/emission code. Both shortwave and longwave use the correlated k-distribution method for integration of fluxes. Subgrid cloud overlap is accounted for using the Monte Carlo Independent Column Approximation (MCICA; Pincus and Morcrette, 2003), assuming the cloudy portions of the column are maximally overlapped in vertically contiguous layers and randomly overlapped when two layers are separated by a completely clear layer. Cloud optics are parameterized as described in Neale et al.(2010). + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `iradsw` | Frequency for updating shortwave fluxes and heating rate; iradsw > 0 interpreted as number of timesteps, iradsw < 0 interpreted as hours; iradsw = 0 disables shortwave radiation entirely | `-1` | +| `iradlw` | Frequency for updating longwave fluxes and heating rate; iradlw > 0 interpreted as number of timesteps, iradlw < 0 interpreted as hours; iradlw = 0 disables longwave radiation entirely | `-1` | +| `irad_always` | Length of time in timesteps (irad_always > 0) or in hours (irad_always < 0) SW/LW radiation will be run continuously from the start of an initial or restart run | `0` | +| `use_rad_dt_cosz` | If true, use the radiation dt for all cosz calculations; calculates solar zenith angle averaged over a time step. In default model solar zenith angle is held constant over time | `.true.`
(set by namelist_defaults_eam.xml for default physics) | +| `spectralflux` | Calculate fluxes (up and down) per band | `.false.` | +| `liqcldoptics` | Choice of cloud optical property parameterization for liquid clouds. Valid options are ‘slingo’ or ‘gammadist’ | `gammadist` | +| `icecldoptics` | Choice of cloud optical property parameterization for ice clouds. Valid options are ‘ebertcurry’ or ‘mitchell’ | `mitchell` | \ No newline at end of file diff --git a/components/eam/docs/tech-guide/vbs.md b/components/eam/docs/tech-guide/vbs.md new file mode 100644 index 00000000000..728324e9311 --- /dev/null +++ b/components/eam/docs/tech-guide/vbs.md @@ -0,0 +1,5 @@ +# Volatility Basis Set (VBS) approach for SOA + +## Overview + +A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [Users's Guide](../user-guide/index.md). \ No newline at end of file diff --git a/components/eam/docs/tech-guide/zm.md b/components/eam/docs/tech-guide/zm.md new file mode 100644 index 00000000000..8c19322ec75 --- /dev/null +++ b/components/eam/docs/tech-guide/zm.md @@ -0,0 +1,58 @@ +# Zhang and McFarlane deep convection scheme + +## Overview + +The ZM scheme (Zhang and McFarlane 1995) used in E3SMv3 is a bulk mass flux-type scheme; it has three components: a trigger for convection initiation, a cloud model including both updrafts and downdrafts, and a closure. The original CAPE-based trigger for convection was replaced by a trigger function based on dynamic CAPE generation by Xie et al. (2019) (see dCAPE-ULL description below for more details). The closure predicts cloud base mass flux using dilute CAPE (Neale et al. 2008). The updraft model is a bulk entraining plume model. Both updrafts and downdrafts are assumed saturated, with downdraft mass flux at the downdraft initiation level set proportional to the updraft cloud base mass flux. The microphysical processes inside the updrafts are represented by a convective microphysics scheme (see ZM convective microphysics description below). An additional adjustment is made to cloud base mass flux to incorporate the effect of large-scale circulation (see mass flux adjustment description below). + +### dCAPE-ULL + +A notable update related to clouds and precipitation in E3SMv2 is the use of a new convective trigger function described by Xie et al. (2019) in ZM to improve the simulation of precipitation and its diurnal cycle. The new convective trigger named as dCAPE-ULL uses the dynamic CAPE (dCAPE) trigger developed by Xie and Zhang (2000) with an unrestricted air parcel launch level (ULL) approach used by Wang et al. (2015). It was designed to address the unrealistically strong coupling of convection to the surface heating in ZM that often results in unrealistically too active model convection during the day in summer season over lands and improve the model capability to capture mid-level convection for nocturnal precipitation. + +### ZM convective microphysics + +The convective microphysics scheme is based on the work of Song and Zhang (2011) to improve the representation of microphysical processes in convective clouds and their interaction with aerosol and stratiform clouds in GCMs. It explicitly treats the mass mixing ratio and number concentration of five hydrometeor species (cloud water, cloud ice, rain, snow, and graupel). The scheme is linked to stratiform cloud microphysics parameterization through convective detrainment of cloud liquid/ice water content and droplet/crystal number concentration, and to aerosols through cloud droplet activation and ice nucleation processes. Previous evaluations of the scheme showed that it improved the simulation of convective cloud properties and cloud hydrological cycle (Song et al. 2012, Storer et al. 2015). The assessment demonstrates that the convective microphysics scheme not only significantly improves the simulation of tropical variability across multiple scales but also enhances the simulation of climatological mean states. + +### Mass flux adjustment + +The convective mass flux adjustment (MAdj) is designed to represent the dynamical effects of large-scale vertical motion on convection. With MAdj, convection is enhanced (suppressed) when there is large-scale ascending (descending) motion at the planetary boundary layer top. The coupling of convection with the large-scale circulation significantly improves the simulation of climate variability across multiple scales from diurnal cycle, convectively coupled equatorial waves, to Madden-Julian oscillations (Song et al. 2023). + +### MCSP + +Due to inadequate model resolution, organized mesoscale convection cannot be resolved in general circulation models and thus needs to be parameterized. The Multiscale Coherent Structure Parameterization (MCSP) aims at representing the dynamical and physical effects of organized mesoscale convection. + +MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and momentum fields to represent the impact. Moncrieff et al. (2017) and Chen et al. (2021) have found that by adding MCSP, the both the representation of large-scale precipitation systems and the modes of variability from Tropical waves are improved. + +## Namelist parameters + +| ZM Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_ke` | Tunable evaporation efficiency in ZM deep convection scheme | `2.5E-6` | +| `zmconv_tau` | Relaxation time in ZM deep convection scheme | `3600` | +| `zmconv_dmpdz` | Parcel fractional mass entrainment rate | `-0.7E-3` | +| `zmconv_alfa` | Initial downdraft mass flux fraction | `0.14D0` | +| `zmconv_tiedke_add` | Temperature perturbation of an air parcel | `0.8D0` | +| `zmconv_cape_cin` | Number of negative buoyancy regions that are allowed | `1` | + +| dCAPE-ULL Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_trigdcape_ull` | DCAPE trigger along with unrestricted launching level for ZM deep convection scheme | `.true.` | +| `zmconv_trig_dcape_only` | DCAPE only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the dcape only trigger. | +| `zmconv_trig_ull_only` | Use unrestricted launching level (ULL) only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the ull only trigger. | + +| Conv. micro. Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_microp` | Convective microphysics option in ZM convection scheme | `true` | +| `zmconv_auto_fac` | Cloud droplet-rain autoconversion enhancement factor in the convective microphysics scheme | `7.0` | +| `zmconv_accr_fac` | Cloud droplet-rain accretion enhancement factor in the convective microphysics scheme | `1.5` | +| `zmconv_micro_dcs` | Autoconversion size threshold for cloud ice to snow (m) | `150.E-6` | + +| Mass flux adj. Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_clos_dyn_adj` | Apply mass flux adjustment to ZM convection scheme | `true` | + +| MCSP Parameters | Description | Default value | +| ---------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_mcsp_heat_coeff` | MCSP heating coefficient | `0.3` | +| `zmconv_mcsp_moisture_coeff` | MCSP moisture coefficient | `0.0` | +| `zmconv_mcsp_uwind_coeff` | MCSP zonal wind coefficient | `0.0` | +| `zmconv_mcsp_vwind_coeff` | MCSP meridional wind coefficient | `0.0` | \ No newline at end of file diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md new file mode 100644 index 00000000000..9cece436767 --- /dev/null +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -0,0 +1,109 @@ + +# Aerosol physical properties + +## Description + +Key information + +- Original physical properties of aerosols are documented in Liu et al. (2012). Detailed information is included in the supplement. + +- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020). + +- Marine organic aerosol properties are defined in Burrows et al. (2022). + +- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022). + +- BC and POM hygroscopicity values are updated by Shan et al. (2024). + +- Some description/reference about the 5th mode. + +## Included fields + +### Mode properties + +- Geometric standard deviation of each lognormal mode + +- Nominal geometric mean diameter and its lower/upper bound of values for each mode + +- Coefficients of polynomial expression (lookup-table) for extinction, absorption, and asymmetry parameter calculations. + +- Aerosol refractive index table needed for interpolation (lookup-table) calculation (for different wavelengths) + +- Crystalization and deliquesence relative humidity thresholds for aerosol wateruptake calculations + +### Species properties + +- Aerosol refractive index for each species + +- Density for each species + +- Aerosol hygroscopicity for each species + +- Note that some of variables in the species property file are for bulk aerosols, so we ignore the description for them. + +## Files + +``` +Species properties + +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/bcpho_rrtmg_c100508.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ssam_rrtmg_c100508.nc +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc + +Mode properties + +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', +/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' +``` + +## Namelist + +``` + mode_defs = 'mam5_mode1:accum:=', + 'A:num_a1:N:num_c1:num_mr:+', + 'A:so4_a1:N:so4_c1:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:pom_a1:N:pom_c1:p-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc:+', + 'A:soa_a1:N:soa_c1:s-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:bc_a1:N:bc_c1:black-c:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/bcpho_rrtmg_c100508.nc:+', + 'A:dst_a1:N:dst_c1:dust:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', + 'A:ncl_a1:N:ncl_c1:seasalt:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', + 'A:mom_a1:N:mom_c1:m-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc', + 'mam5_mode2:aitken:=', + 'A:num_a2:N:num_c2:num_mr:+', + 'A:so4_a2:N:so4_c2:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:soa_a2:N:soa_c2:s-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:ncl_a2:N:ncl_c2:seasalt:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', + 'A:mom_a2:N:mom_c2:m-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc', + 'mam5_mode3:coarse:=', + 'A:num_a3:N:num_c3:num_mr:+', + 'A:dst_a3:N:dst_c3:dust:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', + 'A:ncl_a3:N:ncl_c3:seasalt:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', + 'A:so4_a3:N:so4_c3:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:bc_a3:N:bc_c3:black-c:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/bcpho_rrtmg_c100508.nc:+', + 'A:pom_a3:N:pom_c3:p-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc:+', + 'A:soa_a3:N:soa_c3:s-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:mom_a3:N:mom_c3:m-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc', + 'mam5_mode4:primary_carbon:=', + 'A:num_a4:N:num_c4:num_mr:+', + 'A:pom_a4:N:pom_c4:p-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc:+', + 'A:bc_a4:N:bc_c4:black-c:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/bcpho_rrtmg_c100508.nc:+', + 'A:mom_a4:N:mom_c4:m-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc', + 'mam5_mode5:strat_coarse:=', + 'A:num_a5:N:num_c5:num_mr:+', + 'A:so4_a5:N:so4_c5:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc' + rad_climate = 'A:H2OLNZ:H2O', 'N:O2:O2','N:CO2:CO2', 'A:O3:O3', + 'A:N2OLNZ:N2O', 'A:CH4LNZ:CH4','N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam5_mode1:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode2:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', + 'M:mam5_mode3:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', + 'M:mam5_mode4:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', + 'M:mam5_mode5:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' + +``` \ No newline at end of file diff --git a/components/eam/docs/user-guide/emission_oxidant_files.md b/components/eam/docs/user-guide/emission_oxidant_files.md new file mode 100644 index 00000000000..db8bc08fb4b --- /dev/null +++ b/components/eam/docs/user-guide/emission_oxidant_files.md @@ -0,0 +1,197 @@ + +# Emission files for EAMv3 gas and aerosol species and oxidant file for VBS SOA and stratosphere sulfate formation + +## Overview + +This page documents emissions data for all required aerosols and precursor gases as well as oxidants input data for running EAMv3, mostly for the MAM4 aerosol scheme, from anthropogenic (i.e., industrial, energy, transportation, domestic, and agriculture activity sectors) and natural (i.e., sea spray, vegetation, fire smoke, volcano) sources. Sulfur from agriculture, domestic, transportation, waste, and shipping sectors is emitted at the surface while sulfur from energy and industry sectors is emitted at 100-300 m above the surface, and sulfur from forest fire and grass fire is emitted at higher elevations (0-6 km). POM and BC from forest fire and grass fire are emitted at 0-6 km, while those from other sources (domestic, energy, industry, transportation, waste, and shipping) are emitted at the surface. Injection height profiles for fire emissions are derived from the corresponding AeroCom profiles (Dentener et al., 2006), which give emissions in 6 altitude ranges (0-0.1, 0.1-0.5, 0.5-1, 1-2, 2-3, and 3-6 km). Otherwise, species emissions are assumed to be at the surface (bottom layer). Number emission fluxes each mode are calculated from mass emission fluxes based on AeroCom prescribed lognormal size distributions. + +## Aerosols and gas precursors (common for EAMv1/v2/v3) + +* Species: SO2, SOAG0, DMS, bc_a4, pom_a4, so4_a1, so4_a2, num_a1, num_a2, num_a4 +* Data sources + * Most of the original data are directly from input4MIPs with the following exceptions (E3SM specific treatments) + * SO2 takes 97.5% from the input4MIPs data (all SO2-em-anthro_input4MIPs sectors) + * SO4_a1 surf takes 2.5% from the corresponding surface sectors of input4MIPs data (SO2-em-anthro_input4MIPs sectors: AGR, SLV, WST, SHP) + * SO4_a2 surf takes 2.5% from the corresponding surface sectors of input4MIPs data (SO2-em-anthro_input4MIPs sectors: TRA, RCO) + * SO4_a1 elev takes 2.5% from the corresponding elevated sectors of input4MIPs data (SO2-em-anthro_input4MIPs sectors: ENE, IND) + * SO2 (97.5%) and SO4_a1 (2.5%) also take emissions from AR5 input file for sector contvolc (constant volcanic degassing) + * SOAG0 emissions are obtained by scaling OC (POM) emissions with a tunable factor. + * num_a1, num_a2 and num_a4 are determined by mass concentration of aerosols species in the corresponding sectors and modes. + +## Marine organic sea spray + +Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014; 2022). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998) and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004) were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014). The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). + +The file used as an input to E3SM is available here: + +https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc + +And is also published as a citeable dataset on Zenodo: + +Elliott, S. M., Maltrud, M., & Burrows, S. M. (2015). Macromolecule distributions input file for the OCEANFILMS parameterization (Version v1) [Data set]. [Zenodo](https://doi.org/10.5281/zenodo.6320812). + +## Oceanic dimethyl sulfide concentrations + +Dimethyl sulfide (DMS) fluxes to the atmosphere are calculated in E3SM as a function of prescribed surface oceanic DMS concentrations, and an air-sea flux piston velocity that is a function of wind speed. + +E3SM uses a DMS surface concentration dataset developed from a dynamic ocean biogeochemistry simulation; the methods and underlying assumptions used to produce this dataset are documented in Wang, et al. (2015). The resolution in the DMS dataset is 1.9x2.5 degrees. + +## New gas species for chemUCI in EAMv3 + +* Species: C2H4, C2H6, C3H8, CH2O, CH3CHO, CH3COCH3, CO, E90, ISOP, NO, NO2 +* Data sources + * anthropogenic, biomass burning, and aircraft emissions (NO2) are regridded from NCAR CESM2 emission files. They are time-dependent during historical period and in the future scenarios. + * biogenic emissions (C2H4, C2H6, C3H8, CH2O, CH3CHO, CH3COCH3, CO, ISOP) are from MEGAN-MACC offline data + * 1850-1979: monthly input cycled yearly from 30-year mean (1980-2009) + * 1980-2014: time-varying MEGAN-MACC data (historical) + * 2015-2100: monthly input cycled yearly from 30-year mean (1980-2009) + * natural emissions from oceans (C2H4, C2H6, C3H8, CO) and soil (NO) are regridded from NCAR CESM2 emission files. Just cycled yearly during the historical period and in the future scenarios. + * E90 emissions? + +## Oxidants file needed for VBS SOA and stratosphere sulfate formation + +* Species: prsd_O3, prsd_NO3, prsd_OH +* Data sources + * the file for historical simulation is the same as v1 and v2, inherited from CESM + * files for SSPs are regridded from NCAR CESM2 tracer files + + +## Namelist setting for emissions input + +### Historical (WCYCL20TR)/AMIP (F20TR) +``` + ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1850-2014_c180205_kzm_1850_2014_volcano.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_elev_1850-2014_1.9x2.5_c20230201.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_bc_a4_elev_1850-2014_c180205.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a1_elev_1850-2014_c180205.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a2_elev_1850-2014_c180205.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a4_elev_1850-2014_c180205.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_pom_a4_elev_1850-2014_c180205.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a1_elev_1850-2014_c180205.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a2_elev_1850-2014_c180205.nc' + + srf_emis_specifier = 'C10H16 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_MTERP_surface_1850-2014_1.9x2.5_c20230126.nc', + 'C2H4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C2H4_surface_1850-2014_1.9x2.5_c20210323.nc', + 'C2H6 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C2H6_surface_1850-2014_1.9x2.5_c20210323.nc', + 'C3H8 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C3H8_surface_1850-2014_1.9x2.5_c20210323.nc', + 'CH2O -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH2O_surface_1850-2014_1.9x2.5_c20210323.nc', + 'CH3CHO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH3CHO_surface_1850-2014_1.9x2.5_c20210323.nc', + 'CH3COCH3 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH3COCH3_surface_1850-2014_1.9x2.5_c20210323.nc', + 'CO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CO_surface_1850-2014_1.9x2.5_c20210323.nc', + 'DMS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc', + 'E90 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions_E90_surface_1750-2015_1.9x2.5_c20210408.nc', + 'ISOP -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_ISOP_surface_1850-2014_1.9x2.5_c20210323.nc', + 'ISOP_VBS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_ISOP_surface_1850-2014_1.9x2.5_c20210323.nc', + 'NO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_NO_surface_1850-2014_1.9x2.5_c20220425.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_surf_1850-2014_c180205.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_surf_1850-2014_1.9x2.5_c20230201.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_bc_a4_surf_1850-2014_c180205.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a1_surf_1850-2014_c180205.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a2_surf_1850-2014_c180205.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a4_surf_1850-2014_c180205.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_pom_a4_surf_1850-2014_c180205.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a1_surf_1850-2014_c180205.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a2_surf_1850-2014_c180205.nc' + + tracer_cnst_datapath = '\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid' + tracer_cnst_file = 'oxid_1.9x2.5_L26_1850-2015_c20181106.nc' + tracer_cnst_filelist = '' + tracer_cnst_specifier = 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' + tracer_cnst_type = 'INTERP_MISSING_MONTHS' +``` + +### F2010 + +``` + ext_frc_cycle_yr = 2010 + ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_2010_clim_1.9x2.5_c20230213.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1x1_2010_clim_c20190821.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_elev_2010_clim_1.9x2.5_c20230213.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_bc_a4_elev_1x1_2010_clim_c20190821.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a1_elev_1x1_2010_clim_c20190821.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a2_elev_1x1_2010_clim_c20190821.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a4_elev_1x1_2010_clim_c20190821.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_pom_a4_elev_1x1_2010_clim_c20190821.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a1_elev_1x1_2010_clim_c20190821.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a2_elev_1x1_2010_clim_c20190821.nc' + ext_frc_type = 'CYCLICAL' + + srf_emis_cycle_yr = 2010 + srf_emis_specifier = 'C10H16 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_MTERP_surface_2010_clim_1.9x2.5_c20230213.nc', + 'C2H4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C2H4_surface_2010_clim_1.9x2.5_c20230213.nc', + 'C2H6 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C2H6_surface_2010_clim_1.9x2.5_c20230213.nc', + 'C3H8 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_C3H8_surface_2010_clim_1.9x2.5_c20230213.nc', + 'CH2O -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH2O_surface_2010_clim_1.9x2.5_c20230213.nc', + 'CH3CHO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH3CHO_surface_2010_clim_1.9x2.5_c20230213.nc', + 'CH3COCH3 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CH3COCH3_surface_2010_clim_1.9x2.5_c20230213.nc', + 'CO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_CO_surface_2010_clim_1.9x2.5_c20230213.nc', + 'DMS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.2010.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20190220.nc', + 'E90 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions_E90_surface_2010_clim_1.9x2.5_c20230213.nc', + 'ISOP -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_ISOP_surface_2010_clim_1.9x2.5_c20230213.nc', + 'ISOP_VBS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_ISOP_surface_2010_clim_1.9x2.5_c20230213.nc', + 'NO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_e3sm_NO_surface_2010_clim_1.9x2.5_c20230213.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_surf_1x1_2010_clim_c20190821.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_surf_2010_clim_1.9x2.5_c20230213.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_bc_a4_surf_1x1_2010_clim_c20190821.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a1_surf_1x1_2010_clim_c20190821.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a2_surf_1x1_2010_clim_c20190821.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_num_a4_surf_1x1_2010_clim_c20190821.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_pom_a4_surf_1x1_2010_clim_c20190821.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a1_surf_1x1_2010_clim_c20190821.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so4_a2_surf_1x1_2010_clim_c20190821.nc' + srf_emis_type = 'CYCLICAL' + + tracer_cnst_cycle_yr = 2015 + tracer_cnst_datapath = '\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid' + tracer_cnst_file = 'oxid_1.9x2.5_L26_1850-2015_c20181106.nc' + tracer_cnst_filelist = '' + tracer_cnst_specifier = 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' + tracer_cnst_type = 'CYCLICAL' + ``` + +### Future Scenarios + +#### SSP370 + +``` +ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_elev_2015-2100_c210216.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_elev_2015-2100_c210216.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_elev_2015-2100_c210216.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_elev_2015-2100_c210216.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_elev_2015-2100_c210216.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_elev_2015-2100_c210216.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_elev_2015-2100_c210216.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_elev_2015-2100_c210216.nc' + +srf_emis_specifier = 'C10H16 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240208.nc', + 'C2H4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240208.nc', + 'C2H6 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240208.nc', + 'C3H8 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240208.nc', + 'CH2O -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240208.nc', + 'CH3CHO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240208.nc', + 'CH3COCH3 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240208.nc', + 'CO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CO_surface_2015-2100_1.9x2.5_c20240208.nc ', + 'DMS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc', + 'E90 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc', + 'ISOP -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc', + 'ISOP_VBS -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc', + 'NO -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO_surface_2015-2100_1.9x2.5_c20240208.nc', + 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_surf_2015-2100_c210216.nc', + 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240208.nc', + 'bc_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_surf_2015-2100_c210216.nc', + 'num_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_surf_2015-2100_c210216.nc', + 'num_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_surf_2015-2100_c210216.nc', + 'num_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_surf_2015-2100_c210216.nc', + 'pom_a4 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc', + 'so4_a1 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc', + 'so4_a2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc' + + tracer_cnst_datapath = '\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid' + tracer_cnst_file = 'oxid_SSP370_1.9x2.5_L70_1849-2101_c20240228.nc' + tracer_cnst_filelist = '' + tracer_cnst_specifier = 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' + tracer_cnst_type = 'INTERP_MISSING_MONTHS' +``` \ No newline at end of file diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 81084e869cd..b866d5cf338 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -1 +1,128 @@ -start of the EAM User's Guide + +# EAM Users's Guide + +This Users's Guide describes how to set up and run EAM. + +## Table of contents + +1. [Steps to build and run EAM](#steps-to-build-and-run-eam) +2. [Scientifically supported compsets and grids](#scientifically-supported-compsets-and-grids) + 1. [Compsets](#compsets) + 2. [Grids](#grids) +3. [Customizing runs](#customizing-runs) + 1. [Namelist changes](#namelist-changes) + 2. [Input datasets](#input-datasets) + 3. [Specifying output (history files)](#specifying-output-history-files) + +## Steps to build and run EAM + +A step-by-step instruction on how to run E3SM can be found here: https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536 + +The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to change the compset and grid. Certain namelist paramters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. + +## Scientifically supported compsets and grids + +### Compsets + +All of the compsets below run with the complete set of E3SM atmospheric configuration of EAMV3. For more information on the schemes in EAMv3, see the techguide. + +`F2010` - Climatological present day climate (year 2010) + +`F1850` - Climatological pre-industrial-day climate (year 1850) + +`F20TR` - Historical EAM simulation with time varying sea-surface temperatures, aerosol emissions, and greenhouse gas forcings (year 1850-2014) + +### Grids + +Need to check final v3 grid to be used for ne30 simulations + +`ne30pg2_r05_IcoswISC30E3r5` - ne30pg2 atmosphere, 0.5deg x 0.5deg land grid, and Icosahedral 30 km mesh with ice shelves cavities (wISC), E3SMv3 (E3) revision r5 + +## Customizing runs + +### Namelist changes + +Namelist parameters can be specified in the `user_nl_eam` file. While most can be added at run time, some need to be added before `./case.setup` to have the changes applied in the simulation. + +Refer to the individual schemes in the [tech-guide](../tech-guide/index.md) for a list of namelist parameters associated with each scheme in the atmosphere. + +### Input datasets + +#### Greenhouse gases (non-reacting) + +Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. + +``` +atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc +``` + +#### Aerosol physical properties + +The aerosol properties files provide aerosol refractive index, density, and aerosol hygroscopicty information for each aerosol species, as well as information about lognormal mode definition and lookup tables of polynomial expression coefficients for aerosol optics calculation for each mode. These aerosol physical and chemical properties are used by the radiation, aerosol microphysics and other related source and sink processes, and droplet activation/ice nucleation schemes. Detailed information on the files and related references can be found [here](aerosol_phys_prop.md). + +#### Aerosol and gas emission and oxidant files + +Details of the aerosol and gas emission and oxidant files used in various historical, present-day, and future scenario can be found [here](emission_oxidant_files.md). + +#### Linoz v3 input files + +Linozv3 uses the ozone tendency, (net production minus loss) calculated from its climatological mean state (function of month, latitude, altitude) and a first-order Taylor series expansion about the local ozone, temperature, and overhead ozone column. For historical simulation, Linozv3 uses the linozv3 data files with monthly resolution, spanning the dates 1849-01 -- 2014-12. + +##### Historical files + +``` + linoz_data_file = ‘linv3_1849-2101_CMIP6_Hist_10deg_58km_c20231207.nc’ + linoz_data_path = '/lcrc/group/e3sm/data/inputdata/atm/cam/chem/trop_mozart/ub' + linoz_data_type = 'INTERP_MISSING_MONTHS' +``` + +Refer to [this page](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3764486280/Production+of+the+Linoz+v3+data) for more details on Linoz v3 input files. + +#### Land + +- More info on rough topography +- More info on land-use land cover change / land surface data + +#### Ocean/sea ice + +- SST file +- Sea ice fraction + +#### Solar input + +As with greenhouse gas emissions, solar input files are taken from the input4MIPs data collection that were prepared for CMIP6 Forcing Datasets. + +``` +inputdata/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc +``` + +### Specifying output (history files) + +These are specified in the `user_nl_eam`. + +By default, EAM will output a set of monthly-averaged variables. Additional output files can be specified using the following flags: + +`finclX` - List of variables (in single quotes and separated by commas) that are added to tape X. + +`fexclX` - List of variables (in single quotes and separated by commas) that will be excluded in tape X. + +`nhtfrq` - List of write frequencies for each of the history files. A value of 0 denotes a monthly frequency. Negative values denote hourly frequencies (e.g., `-3` will write an output every 3 hours). Positive values denotes the frequency in model timesteps (e.g., `4` will write an output every 4 timesteps). + +`mfilt` - List that sets the number of timesteps to write in a single file before starting a new file. + +`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. + + +#### Example output specification: + +``` + nhtfrq = 0,-24,-6,-3 + mfilt = 1,30,120,24 + avgflag_pertape = 'A','A','A','I' + + fexcl1 = 'U10' # Removes U10 output from monthly files + fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', + 'TCO','SCO','TREFHTMN','TREFHTMX','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file + fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file + fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file + ``` \ No newline at end of file From 5394343b061d356e0c25aa373b487f3e4e5028eb Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 29 Mar 2024 10:11:45 -0700 Subject: [PATCH 225/310] Add bib file for references and HOMME description --- components/eam/docs/eam_refs.bib | 980 ++++++++++++++++++++++++ components/eam/docs/tech-guide/homme.md | 20 + components/eam/docs/tech-guide/index.md | 23 +- 3 files changed, 1012 insertions(+), 11 deletions(-) create mode 100644 components/eam/docs/eam_refs.bib create mode 100644 components/eam/docs/tech-guide/homme.md diff --git a/components/eam/docs/eam_refs.bib b/components/eam/docs/eam_refs.bib new file mode 100644 index 00000000000..aed89c434da --- /dev/null +++ b/components/eam/docs/eam_refs.bib @@ -0,0 +1,980 @@ + +@article{moncrieff_simulation_2017, + title = {Simulation, {Modeling}, and {Dynamically} {Based} {Parameterization} of {Organized} {Tropical} {Convection} for {Global} {Climate} {Models}}, + volume = {74}, + issn = {0022-4928, 1520-0469}, + url = {https://journals.ametsoc.org/view/journals/atsc/74/5/jas-d-16-0166.1.xml}, + doi = {10.1175/JAS-D-16-0166.1}, + language = {EN}, + number = {5}, + urldate = {2024-03-29}, + journal = {Journal of the Atmospheric Sciences}, + author = {Moncrieff, Mitchell W. and Liu, Changhai and Bogenschutz, Peter}, + month = may, + year = {2017}, + pages = {1363--1380}, +} + +@article{chen_effects_2021, + title = {Effects of {Organized} {Convection} {Parameterization} on the {MJO} and {Precipitation} in {E3SMv1}. {Part} {I}: {Mesoscale} {Heating}}, + volume = {13}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Effects of {Organized} {Convection} {Parameterization} on the {MJO} and {Precipitation} in {E3SMv1}. {Part} {I}}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020MS002401}, + doi = {10.1029/2020MS002401}, + language = {en}, + number = {6}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Chen, C.‐C. and Richter, J. H. and Liu, C. and Moncrieff, M. W. and Tang, Q. and Lin, W. and Xie, S. and Rasch, P. J.}, + month = jun, + year = {2021}, + pages = {e2020MS002401}, +} + +@article{morrison_parameterization_2015, + title = {Parameterization of {Cloud} {Microphysics} {Based} on the {Prediction} of {Bulk} {Ice} {Particle} {Properties}. {Part} {I}: {Scheme} {Description} and {Idealized} {Tests}}, + volume = {72}, + issn = {0022-4928, 1520-0469}, + shorttitle = {Parameterization of {Cloud} {Microphysics} {Based} on the {Prediction} of {Bulk} {Ice} {Particle} {Properties}. {Part} {I}}, + url = {https://journals.ametsoc.org/view/journals/atsc/72/1/jas-d-14-0065.1.xml}, + doi = {10.1175/JAS-D-14-0065.1}, + language = {EN}, + number = {1}, + urldate = {2024-03-29}, + journal = {Journal of the Atmospheric Sciences}, + author = {Morrison, Hugh and Milbrandt, Jason A.}, + month = jan, + year = {2015}, + pages = {287--311}, +} + +@article{milbrandt_parameterization_2016, + title = {Parameterization of {Cloud} {Microphysics} {Based} on the {Prediction} of {Bulk} {Ice} {Particle} {Properties}. {Part} {III}: {Introduction} of {Multiple} {Free} {Categories}}, + volume = {73}, + issn = {0022-4928, 1520-0469}, + shorttitle = {Parameterization of {Cloud} {Microphysics} {Based} on the {Prediction} of {Bulk} {Ice} {Particle} {Properties}. {Part} {III}}, + url = {https://journals.ametsoc.org/view/journals/atsc/73/3/jas-d-15-0204.1.xml}, + doi = {10.1175/JAS-D-15-0204.1}, + language = {EN}, + number = {3}, + urldate = {2024-03-29}, + journal = {Journal of the Atmospheric Sciences}, + author = {Milbrandt, J. A. and Morrison, H.}, + month = mar, + year = {2016}, + pages = {975--995}, +} + +@article{liu_toward_2012, + title = {Toward a minimal representation of aerosols in climate models: description and evaluation in the {Community} {Atmosphere} {Model} {CAM5}}, + volume = {5}, + issn = {1991-959X}, + shorttitle = {Toward a minimal representation of aerosols in climate models}, + url = {https://gmd.copernicus.org/articles/5/709/2012/}, + doi = {10.5194/gmd-5-709-2012}, + language = {English}, + number = {3}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Liu, X. and Easter, R. C. and Ghan, S. J. and Zaveri, R. and Rasch, P. and Shi, X. and Lamarque, J.-F. and Gettelman, A. and Morrison, H. and Vitt, F. and Conley, A. and Park, S. and Neale, R. and Hannay, C. and Ekman, A. M. L. and Hess, P. and Mahowald, N. and Collins, W. and Iacono, M. J. and Bretherton, C. S. and Flanner, M. G. and Mitchell, D.}, + month = may, + year = {2012}, + pages = {709--739}, +} + +@article{liu_ice_2005, + title = {Ice nucleation parameterization for global models}, + issn = {,}, + url = {https://www.schweizerbart.de/papers/metz/detail/14/54281/Ice_nucleation_parameterization_for_global_models}, + doi = {10.1127/0941-2948/2005/0059}, + language = {pt}, + urldate = {2024-03-29}, + journal = {Meteorologische Zeitschrift}, + author = {Liu, Xiaohong and Penner, Joyce E.}, + month = sep, + year = {2005}, + pages = {499--514}, +} + +@article{wang_impact_2021, + title = {Impact of a {New} {Cloud} {Microphysics} {Parameterization} on the {Simulations} of {Mesoscale} {Convective} {Systems} in {E3SM}}, + volume = {13}, + issn = {1942-2466, 1942-2466}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021MS002628}, + doi = {10.1029/2021MS002628}, + language = {en}, + number = {11}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Wang, Jingyu and Fan, Jiwen and Feng, Zhe and Zhang, Kai and Roesler, Erika and Hillman, Benjamin and Shpund, Jacob and Lin, Wuyin and Xie, Shaocheng}, + month = nov, + year = {2021}, + pages = {e2021MS002628}, +} + +@misc{larson_clubb-silhs:_2022, + title = {{CLUBB}-{SILHS}: {A} parameterization of subgrid variability in the atmosphere}, + shorttitle = {{CLUBB}-{SILHS}}, + url = {http://arxiv.org/abs/1711.03675}, + doi = {10.48550/arXiv.1711.03675}, + urldate = {2024-03-29}, + publisher = {arXiv}, + author = {Larson, Vincent E.}, + month = mar, + year = {2022}, + note = {arXiv:1711.03675 [physics]}, + keywords = {Physics - Atmospheric and Oceanic Physics}, +} + +@article{bogenschutz_path_2018, + title = {The path to {CAM6}: coupled simulations with {CAM5}.4 and {CAM5}.5}, + volume = {11}, + issn = {1991-959X}, + shorttitle = {The path to {CAM6}}, + url = {https://gmd.copernicus.org/articles/11/235/2018/}, + doi = {10.5194/gmd-11-235-2018}, + language = {English}, + number = {1}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Bogenschutz, Peter A. and Gettelman, Andrew and Hannay, Cecile and Larson, Vincent E. and Neale, Richard B. and Craig, Cheryl and Chen, Chih-Chieh}, + month = jan, + year = {2018}, + pages = {235--255}, +} + +@article{golaz_pdf-based_2002, + title = {A {PDF}-{Based} {Model} for {Boundary} {Layer} {Clouds}. {Part} {I}: {Method} and {Model} {Description}}, + volume = {59}, + issn = {0022-4928, 1520-0469}, + shorttitle = {A {PDF}-{Based} {Model} for {Boundary} {Layer} {Clouds}. {Part} {I}}, + url = {https://journals.ametsoc.org/view/journals/atsc/59/24/1520-0469_2002_059_3540_apbmfb_2.0.co_2.xml}, + doi = {10.1175/1520-0469(2002)059<3540:APBMFB>2.0.CO;2}, + language = {EN}, + number = {24}, + urldate = {2024-03-29}, + journal = {Journal of the Atmospheric Sciences}, + author = {Golaz, Jean-Christophe and Larson, Vincent E. and Cotton, William R.}, + month = dec, + year = {2002}, + pages = {3540--3551}, +} + +@article{larson_using_2005, + title = {Using {Probability} {Density} {Functions} to {Derive} {Consistent} {Closure} {Relationships} among {Higher}-{Order} {Moments}}, + volume = {133}, + issn = {1520-0493, 0027-0644}, + url = {https://journals.ametsoc.org/view/journals/mwre/133/4/mwr2902.1.xml}, + doi = {10.1175/MWR2902.1}, + language = {EN}, + number = {4}, + urldate = {2024-03-29}, + journal = {Monthly Weather Review}, + author = {Larson, Vincent E. and Golaz, Jean-Christophe}, + month = apr, + year = {2005}, + pages = {1023--1042}, +} + +@article{neale_impact_2008, + title = {The {Impact} of {Convection} on {ENSO}: {From} a {Delayed} {Oscillator} to a {Series} of {Events}}, + volume = {21}, + issn = {0894-8755, 1520-0442}, + shorttitle = {The {Impact} of {Convection} on {ENSO}}, + url = {https://journals.ametsoc.org/view/journals/clim/21/22/2008jcli2244.1.xml}, + doi = {10.1175/2008JCLI2244.1}, + language = {EN}, + number = {22}, + urldate = {2024-03-29}, + journal = {Journal of Climate}, + author = {Neale, Richard B. and Richter, Jadwiga H. and Jochum, Markus}, + month = nov, + year = {2008}, + pages = {5904--5924}, +} + +@article{zhang_sensitivity_1995, + title = {Sensitivity of climate simulations to the parameterization of cumulus convection in the {Canadian} climate centre general circulation model}, + volume = {33}, + issn = {0705-5900, 1480-9214}, + url = {http://www.tandfonline.com/doi/abs/10.1080/07055900.1995.9649539}, + doi = {10.1080/07055900.1995.9649539}, + language = {en}, + number = {3}, + urldate = {2024-03-29}, + journal = {Atmosphere-Ocean}, + author = {Zhang, G.J. and McFarlane, Norman A.}, + month = sep, + year = {1995}, + pages = {407--446}, +} + +@article{xie_improved_2019, + title = {Improved {Diurnal} {Cycle} of {Precipitation} in {E3SM} {With} a {Revised} {Convective} {Triggering} {Function}}, + volume = {11}, + issn = {1942-2466, 1942-2466}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001702}, + doi = {10.1029/2019MS001702}, + language = {en}, + number = {7}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Xie, Shaocheng and Wang, Yi‐Chi and Lin, Wuyin and Ma, Hsi‐Yen and Tang, Qi and Tang, Shuaiqi and Zheng, Xue and Golaz, Jean‐Christophe and Zhang, Guang J. and Zhang, Minghua}, + month = jul, + year = {2019}, + pages = {2290--2310}, +} + +@article{xie_impact_2000, + title = {Impact of the convection triggering function on single‐column model simulations}, + volume = {105}, + issn = {0148-0227}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2000JD900170}, + doi = {10.1029/2000JD900170}, + language = {en}, + number = {D11}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Xie, Shaocheng and Zhang, Minghua}, + month = jun, + year = {2000}, + pages = {14983--14996}, +} + +@article{wang_impacts_2015, + title = {Impacts of the triggering function of cumulus parameterization on warm-season diurnal rainfall cycles at the {Atmospheric} {Radiation} {Measurement} {Southern} {Great} {Plains} site: {CONVECTIVE} {TRIGGER} {ON} {SGP} {NOCTURNAL} {RAIN}}, + volume = {120}, + issn = {2169897X}, + shorttitle = {Impacts of the triggering function of cumulus parameterization on warm-season diurnal rainfall cycles at the {Atmospheric} {Radiation} {Measurement} {Southern} {Great} {Plains} site}, + url = {http://doi.wiley.com/10.1002/2015JD023337}, + doi = {10.1002/2015JD023337}, + language = {en}, + number = {20}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Wang, Yi-Chi and Pan, Hua-Lu and Hsu, Huang-Hsiung}, + month = oct, + year = {2015}, + pages = {10,681--10,702}, +} + +@article{song_microphysics_2011, + title = {Microphysics parameterization for convective clouds in a global climate model: {Description} and single-column model tests}, + volume = {116}, + issn = {0148-0227}, + shorttitle = {Microphysics parameterization for convective clouds in a global climate model}, + url = {http://doi.wiley.com/10.1029/2010JD014833}, + doi = {10.1029/2010JD014833}, + language = {en}, + number = {D2}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research}, + author = {Song, Xiaoliang and Zhang, Guang J.}, + month = jan, + year = {2011}, + pages = {D02201}, +} + +@article{song_evaluation_2012, + title = {Evaluation of {Microphysics} {Parameterization} for {Convective} {Clouds} in the {NCAR} {Community} {Atmosphere} {Model} {CAM5}}, + volume = {25}, + issn = {0894-8755, 1520-0442}, + url = {http://journals.ametsoc.org/doi/10.1175/JCLI-D-11-00563.1}, + doi = {10.1175/JCLI-D-11-00563.1}, + language = {en}, + number = {24}, + urldate = {2024-03-29}, + journal = {Journal of Climate}, + author = {Song, Xiaoliang and Zhang, Guang J. and Li, J.-L. F.}, + month = dec, + year = {2012}, + pages = {8568--8590}, +} + +@article{storer_effects_2015, + title = {Effects of {Convective} {Microphysics} {Parameterization} on {Large}-{Scale} {Cloud} {Hydrological} {Cycle} and {Radiative} {Budget} in {Tropical} and {Midlatitude} {Convective} {Regions}}, + volume = {28}, + issn = {0894-8755, 1520-0442}, + url = {https://journals.ametsoc.org/view/journals/clim/28/23/jcli-d-15-0064.1.xml}, + doi = {10.1175/JCLI-D-15-0064.1}, + language = {EN}, + number = {23}, + urldate = {2024-03-29}, + journal = {Journal of Climate}, + author = {Storer, Rachel L. and Zhang, Guang J. and Song, Xiaoliang}, + month = dec, + year = {2015}, + pages = {9277--9297}, +} + +@article{song_incorporating_2023, + title = {Incorporating the {Effect} of {Large}‐{Scale} {Vertical} {Motion} on {Convection} {Through} {Convective} {Mass} {Flux} {Adjustment} in {E3SMv2}}, + volume = {15}, + issn = {1942-2466, 1942-2466}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022MS003553}, + doi = {10.1029/2022MS003553}, + language = {en}, + number = {10}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Song, Xiaoliang and Zhang, Guang and Wan, Hui and Xie, Shaocheng}, + month = oct, + year = {2023}, + pages = {e2022MS003553}, +} + +@article{mlawer_radiative_1997, + title = {Radiative transfer for inhomogeneous atmospheres: {RRTM}, a validated correlated‐k model for the longwave}, + volume = {102}, + issn = {0148-0227}, + shorttitle = {Radiative transfer for inhomogeneous atmospheres}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/97JD00237}, + doi = {10.1029/97JD00237}, + language = {en}, + number = {D14}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Mlawer, Eli J. and Taubman, Steven J. and Brown, Patrick D. and Iacono, Michael J. and Clough, Shepard A.}, + month = jul, + year = {1997}, + pages = {16663--16682}, +} + +@article{iacono_radiative_2008, + title = {Radiative forcing by long‐lived greenhouse gases: {Calculations} with the {AER} radiative transfer models}, + volume = {113}, + issn = {0148-0227}, + shorttitle = {Radiative forcing by long‐lived greenhouse gases}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2008JD009944}, + doi = {10.1029/2008JD009944}, + language = {en}, + number = {D13}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Iacono, Michael J. and Delamere, Jennifer S. and Mlawer, Eli J. and Shephard, Mark W. and Clough, Shepard A. and Collins, William D.}, + month = jul, + year = {2008}, + pages = {2008JD009944}, +} + +@article{pincus_fast_2003, + title = {A fast, flexible, approximate technique for computing radiative transfer in inhomogeneous cloud fields}, + volume = {108}, + issn = {0148-0227}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2002JD003322}, + doi = {10.1029/2002JD003322}, + language = {en}, + number = {D13}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Pincus, Robert and Barker, Howard W. and Morcrette, Jean‐Jacques}, + month = jul, + year = {2003}, + pages = {2002JD003322}, +} + +@article{burrows_oceanfilms_2022, + title = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}: {Natural} {Films} and {Interfaces} via {Langmuir} {Molecular} {Surfactants}) sea spray organic aerosol emissions – implementation in a global climate model and impacts on clouds}, + volume = {22}, + issn = {1680-7324}, + shorttitle = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}}, + url = {https://acp.copernicus.org/articles/22/5223/2022/}, + doi = {10.5194/acp-22-5223-2022}, + language = {en}, + number = {8}, + urldate = {2024-03-29}, + journal = {Atmospheric Chemistry and Physics}, + author = {Burrows, Susannah M. and Easter, Richard C. and Liu, Xiaohong and Ma, Po-Lun and Wang, Hailong and Elliott, Scott M. and Singh, Balwinder and Zhang, Kai and Rasch, Philip J.}, + month = apr, + year = {2022}, + pages = {5223--5251}, +} + +@article{liu_description_2016, + title = {Description and evaluation of a new four-mode version of the {Modal} {Aerosol} {Module} ({MAM4}) within version 5.3 of the {Community} {Atmosphere} {Model}}, + volume = {9}, + issn = {1991-9603}, + url = {https://gmd.copernicus.org/articles/9/505/2016/}, + doi = {10.5194/gmd-9-505-2016}, + language = {en}, + number = {2}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Liu, X. and Ma, P.-L. and Wang, H. and Tilmes, S. and Singh, B. and Easter, R. C. and Ghan, S. J. and Rasch, P. J.}, + month = feb, + year = {2016}, + pages = {505--522}, +} + +@article{wang_aerosols_2020, + title = {Aerosols in the {E3SM} {Version} 1: {New} {Developments} and {Their} {Impacts} on {Radiative} {Forcing}}, + volume = {12}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Aerosols in the {E3SM} {Version} 1}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001851}, + doi = {10.1029/2019MS001851}, + language = {en}, + number = {1}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Wang, Hailong and Easter, Richard C. and Zhang, Rudong and Ma, Po‐Lun and Singh, Balwinder and Zhang, Kai and Ganguly, Dilip and Rasch, Philip J. and Burrows, Susannah M. and Ghan, Steven J. and Lou, Sijia and Qian, Yun and Yang, Yang and Feng, Yan and Flanner, Mark and Leung, L. Ruby and Liu, Xiaohong and Shrivastava, Manish and Sun, Jian and Tang, Qi and Xie, Shaocheng and Yoon, Jin‐Ho}, + month = jan, + year = {2020}, + pages = {e2019MS001851}, +} + +@article{wu_development_2022, + title = {Development and {Evaluation} of {E3SM}‐{MOSAIC}: {Spatial} {Distributions} and {Radiative} {Effects} of {Nitrate} {Aerosol}}, + volume = {14}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Development and {Evaluation} of {E3SM}‐{MOSAIC}}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2022MS003157}, + doi = {10.1029/2022MS003157}, + language = {en}, + number = {11}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Wu, Mingxuan and Wang, Hailong and Easter, Richard C. and Lu, Zheng and Liu, Xiaohong and Singh, Balwinder and Ma, Po‐Lun and Tang, Qi and Zaveri, Rahul A. and Ke, Ziming and Zhang, Rudong and Emmons, Louisa K. and Tilmes, Simone and Dibb, Jack E. and Zheng, Xue and Xie, Shaocheng and Leung, L. Ruby}, + month = nov, + year = {2022}, + pages = {e2022MS003157}, +} + +@article{lou_new_2020, + title = {New {SOA} {Treatments} {Within} the {Energy} {Exascale} {Earth} {System} {Model} ({E3SM}): {Strong} {Production} and {Sinks} {Govern} {Atmospheric} {SOA} {Distributions} and {Radiative} {Forcing}}, + volume = {12}, + issn = {1942-2466, 1942-2466}, + shorttitle = {New {SOA} {Treatments} {Within} the {Energy} {Exascale} {Earth} {System} {Model} ({E3SM})}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2020MS002266}, + doi = {10.1029/2020MS002266}, + language = {en}, + number = {12}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Lou, Sijia and Shrivastava, Manish and Easter, Richard C. and Yang, Yang and Ma, Po‐Lun and Wang, Hailong and Cubison, Michael J. and Campuzano‐Jost, Pedro and Jimenez, Jose L. and Zhang, Qi and Rasch, Philip J. and Shilling, John E. and Zelenyuk, Alla and Dubey, Manvendra and Cameron‐Smith, Philip and Martin, Scot T. and Schneider, Johannes and Schulz, Christiane}, + month = dec, + year = {2020}, + pages = {e2020MS002266}, +} + +@article{shrivastava_global_2015, + title = {Global transformation and fate of {SOA}: {Implications} of low‐volatility {SOA} and gas‐phase fragmentation reactions}, + volume = {120}, + issn = {2169-897X, 2169-8996}, + shorttitle = {Global transformation and fate of {SOA}}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2014JD022563}, + doi = {10.1002/2014JD022563}, + language = {en}, + number = {9}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Shrivastava, Manish and Easter, Richard C. and Liu, Xiaohong and Zelenyuk, Alla and Singh, Balwinder and Zhang, Kai and Ma, Po‐Lun and Chand, Duli and Ghan, Steven and Jimenez, Jose L. and Zhang, Qi and Fast, Jerome and Rasch, Philip J. and Tiitta, Petri}, + month = may, + year = {2015}, + pages = {4169--4195}, +} + + +@article{hodzic_rethinking_2016, + title = {Rethinking the global secondary organic aerosol ({SOA}) budget: stronger production, faster removal, shorter lifetime}, + volume = {16}, + issn = {1680-7316}, + shorttitle = {Rethinking the global secondary organic aerosol ({SOA}) budget}, + url = {https://acp.copernicus.org/articles/16/7917/2016/}, + doi = {10.5194/acp-16-7917-2016}, + language = {English}, + number = {12}, + urldate = {2024-03-29}, + journal = {Atmospheric Chemistry and Physics}, + author = {Hodzic, Alma and Kasibhatla, Prasad S. and Jo, Duseong S. and Cappa, Christopher D. and Jimenez, Jose L. and Madronich, Sasha and Park, Rokjin J.}, + month = jun, + year = {2016}, + pages = {7917--7941}, +} + +@article{feng_global_2022, + title = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1: {Impact} of {Increasing} {Model} {Resolution}}, + volume = {14}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021MS002909}, + doi = {10.1029/2021MS002909}, + language = {en}, + number = {7}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Feng, Y. and Wang, H. and Rasch, P. J. and Zhang, K. and Lin, W. and Tang, Q. and Xie, S. and Hamilton, D. S. and Mahowald, N. and Yu, H.}, + month = jul, + year = {2022}, + pages = {e2021MS002909}, +} + +@article{kok_improved_2014, + title = {An improved dust emission model – {Part} 1: {Model} description and comparison against measurements}, + volume = {14}, + issn = {1680-7316}, + shorttitle = {An improved dust emission model – {Part} 1}, + url = {https://acp.copernicus.org/articles/14/13023/2014/}, + doi = {10.5194/acp-14-13023-2014}, + language = {English}, + number = {23}, + urldate = {2024-03-29}, + journal = {Atmospheric Chemistry and Physics}, + author = {Kok, J. F. and Mahowald, N. M. and Fratini, G. and Gillies, J. A. and Ishizuka, M. and Leys, J. F. and Mikami, M. and Park, M.-S. and Park, S.-U. and Van Pelt, R. S. and Zobeck, T. M.}, + month = dec, + year = {2014}, + pages = {13023--13041}, +} + +@article{zender_mineral_2003, + title = {Mineral {Dust} {Entrainment} and {Deposition} ({DEAD}) model: {Description} and 1990s dust climatology}, + volume = {108}, + issn = {0148-0227}, + shorttitle = {Mineral {Dust} {Entrainment} and {Deposition} ({DEAD}) model}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2002JD002775}, + doi = {10.1029/2002JD002775}, + language = {en}, + number = {D14}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Zender, Charles S. and Bian, Huisheng and Newman, David}, + month = jul, + year = {2003}, + pages = {2002JD002775}, +} + +@article{martensson_laboratory_2003, + title = {Laboratory simulations and parameterization of the primary marine aerosol production}, + volume = {108}, + issn = {0148-0227}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2002JD002263}, + doi = {10.1029/2002JD002263}, + language = {en}, + number = {D9}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Mårtensson, E. M. and Nilsson, E. D. and De Leeuw, G. and Cohen, L. H. and Hansson, H.‐C.}, + month = may, + year = {2003}, + pages = {2002JD002263}, +} + +@incollection{monahan_model_1986, + address = {Dordrecht}, + title = {A {Model} of {Marine} {Aerosol} {Generation} {Via} {Whitecaps} and {Wave} {Disruption}}, + isbn = {9789400946682}, + url = {https://doi.org/10.1007/978-94-009-4668-2_16}, + language = {en}, + urldate = {2024-03-29}, + booktitle = {Oceanic {Whitecaps}: {And} {Their} {Role} in {Air}-{Sea} {Exchange} {Processes}}, + publisher = {Springer Netherlands}, + author = {Monahan, E. C. and Spiel, D. E. and Davidson, K. L.}, + editor = {Monahan, Edward C. and Niocaill, Gearóid Mac}, + year = {1986}, + doi = {10.1007/978-94-009-4668-2_16}, + keywords = {Wind Speed, Droplet Radius, Marine Aerosol, Aerosol Generation, Aerosol Droplet}, + pages = {167--174}, +} + +@article{lee_e3sm_2024, + title = {{E3SM} {Chemistry} {Diagnostics} {Package} ({ChemDyg}) {Version} 0.1.4}, + url = {https://gmd.copernicus.org/preprints/gmd-2023-203/}, + doi = {10.5194/gmd-2023-203}, + language = {English}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development Discussions}, + author = {Lee, Hsiang-He and Tang, Qi and Prather, Michael}, + month = jan, + year = {2024}, + pages = {1--46}, +} + +@article{hsu_global_2010, + title = {Global long‐lived chemical modes excited in a 3‐{D} chemistry transport model: {Stratospheric} {N} $_{\textrm{2}}$ {O}, {NO} $_{\textrm{ \textit{y} }}$ , {O} $_{\textrm{3}}$ and {CH} $_{\textrm{4}}$ chemistry}, + volume = {37}, + issn = {0094-8276, 1944-8007}, + shorttitle = {Global long‐lived chemical modes excited in a 3‐{D} chemistry transport model}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2009GL042243}, + doi = {10.1029/2009GL042243}, + language = {en}, + number = {7}, + urldate = {2024-03-29}, + journal = {Geophysical Research Letters}, + author = {Hsu, Juno and Prather, Michael J.}, + month = apr, + year = {2010}, + pages = {2009GL042243}, +} + +@article{tang_evaluation_2021, + title = {Evaluation of the interactive stratospheric ozone ({O3v2}) module in the {E3SM} version 1 {Earth} system model}, + volume = {14}, + issn = {1991-9603}, + url = {https://gmd.copernicus.org/articles/14/1219/2021/}, + doi = {10.5194/gmd-14-1219-2021}, + language = {en}, + number = {3}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Tang, Qi and Prather, Michael J. and Hsu, Juno and Ruiz, Daniel J. and Cameron-Smith, Philip J. and Xie, Shaocheng and Golaz, Jean-Christophe}, + month = mar, + year = {2021}, + pages = {1219--1236}, +} + +@article{zhang_understanding_2024, + title = {Understanding changes in cloud simulations from {E3SM} version 1 to version 2}, + volume = {17}, + issn = {1991-9603}, + url = {https://gmd.copernicus.org/articles/17/169/2024/}, + doi = {10.5194/gmd-17-169-2024}, + language = {en}, + number = {1}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Zhang, Yuying and Xie, Shaocheng and Qin, Yi and Lin, Wuyin and Golaz, Jean-Christophe and Zheng, Xue and Ma, Po-Lun and Qian, Yun and Tang, Qi and Terai, Christopher R. and Zhang, Meng}, + month = jan, + year = {2024}, + pages = {169--189}, +} + +@article{zhang_evaluation_2019, + title = {Evaluation of {Clouds} in {Version} 1 of the {E3SM} {Atmosphere} {Model} {With} {Satellite} {Simulators}}, + volume = {11}, + issn = {1942-2466, 1942-2466}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2018MS001562}, + doi = {10.1029/2018MS001562}, + language = {en}, + number = {5}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Zhang, Yuying and Xie, Shaocheng and Lin, Wuyin and Klein, Stephen A. and Zelinka, Mark and Ma, Po‐Lun and Rasch, Philip J. and Qian, Yun and Tang, Qi and Ma, Hsi‐Yen}, + month = may, + year = {2019}, + pages = {1253--1268}, +} + +@article{swales_cloud_2018, + title = {The {Cloud} {Feedback} {Model} {Intercomparison} {Project} {Observational} {Simulator} {Package}: {Version} 2}, + volume = {11}, + issn = {1991-9603}, + shorttitle = {The {Cloud} {Feedback} {Model} {Intercomparison} {Project} {Observational} {Simulator} {Package}}, + url = {https://gmd.copernicus.org/articles/11/77/2018/}, + doi = {10.5194/gmd-11-77-2018}, + language = {en}, + number = {1}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Swales, Dustin J. and Pincus, Robert and Bodas-Salcedo, Alejandro}, + month = jan, + year = {2018}, + pages = {77--81}, +} + +@article{bodas-salcedo_cosp:_2011, + title = {{COSP}: {Satellite} simulation software for model assessment}, + volume = {92}, + issn = {0003-0007, 1520-0477}, + shorttitle = {{COSP}}, + url = {https://journals.ametsoc.org/doi/10.1175/2011BAMS2856.1}, + doi = {10.1175/2011BAMS2856.1}, + language = {en}, + number = {8}, + urldate = {2024-03-29}, + journal = {Bulletin of the American Meteorological Society}, + author = {Bodas-Salcedo, A. and Webb, M. J. and Bony, S. and Chepfer, H. and Dufresne, J.-L. and Klein, S. A. and Zhang, Y. and Marchand, R. and Haynes, J. M. and Pincus, R. and John, V. O.}, + month = aug, + year = {2011}, + pages = {1023--1043}, +} + +@article{zhang_arm_2020, + title = {The {ARM} {Data}-{Oriented} {Metrics} and {Diagnostics} {Package} for {Climate} {Models}: {A} {New} {Tool} for {Evaluating} {Climate} {Models} with {Field} {Data}}, + volume = {101}, + issn = {0003-0007, 1520-0477}, + shorttitle = {The {ARM} {Data}-{Oriented} {Metrics} and {Diagnostics} {Package} for {Climate} {Models}}, + url = {https://journals.ametsoc.org/view/journals/bams/101/10/bamsD190282.xml}, + doi = {10.1175/BAMS-D-19-0282.1}, + language = {EN}, + number = {10}, + urldate = {2024-03-29}, + journal = {Bulletin of the American Meteorological Society}, + author = {Zhang, C. and Xie, S. and Tao, C. and Tang, S. and Emmenegger, T. and Neelin, J. D. and Schiro, K. A. and Lin, W. and Shaheen, Z.}, + month = oct, + year = {2020}, + pages = {E1619--E1627}, +} + +@article{zheng_assessment_2023, + title = {Assessment of {CMIP5} and {CMIP6} {AMIP} {Simulated} {Clouds} and {Surface} {Shortwave} {Radiation} {Using} {ARM} {Observations} over {Different} {Climate} {Regions}}, + volume = {36}, + issn = {0894-8755, 1520-0442}, + url = {https://journals.ametsoc.org/view/journals/clim/36/24/JCLI-D-23-0247.1.xml}, + doi = {10.1175/JCLI-D-23-0247.1}, + language = {EN}, + number = {24}, + urldate = {2024-03-29}, + journal = {Journal of Climate}, + author = {Zheng, Xiaojian and Tao, Cheng and Zhang, Chengzhu and Xie, Shaocheng and Zhang, Yuying and Xi, Baike and Dong, Xiquan}, + month = nov, + year = {2023}, + pages = {8475--8495}, +} + +@article{zhang_causes:_2018, + title = {{CAUSES}: {Diagnosis} of the {Summertime} {Warm} {Bias} in {CMIP5} {Climate} {Models} at the {ARM} {Southern} {Great} {Plains} {Site}}, + volume = {123}, + issn = {2169-897X, 2169-8996}, + shorttitle = {{CAUSES}}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2017JD027200}, + doi = {10.1002/2017JD027200}, + language = {en}, + number = {6}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Zhang, Chengzhu and Xie, Shaocheng and Klein, Stephen A. and Ma, Hsi‐yen and Tang, Shuaiqi and Van Weverberg, Kwinten and Morcrette, Cyril J. and Petch, Jon}, + month = mar, + year = {2018}, + pages = {2968--2992}, +} + +@article{emmenegger_evaluating_2022, + title = {Evaluating {Tropical} {Precipitation} {Relations} in {CMIP6} {Models} with {ARM} {Data}}, + volume = {35}, + issn = {0894-8755, 1520-0442}, + url = {https://journals.ametsoc.org/view/journals/clim/35/19/JCLI-D-21-0386.1.xml}, + doi = {10.1175/JCLI-D-21-0386.1}, + number = {19}, + urldate = {2024-03-29}, + journal = {Journal of Climate}, + author = {Emmenegger, Todd and Kuo, Yi-Hung and Xie, Shaocheng and Zhang, Chengzhu and Tao, Cheng and Neelin, J. David}, + month = oct, + year = {2022}, + pages = {6343--6360}, +} + +@article{zhang_e3sm_2022, + title = {The {E3SM} {Diagnostics} {Package} ({E3SM} {Diags} v2.7): a {Python}-based diagnostics package for {Earth} system model evaluation}, + volume = {15}, + issn = {1991-9603}, + shorttitle = {The {E3SM} {Diagnostics} {Package} ({E3SM} {Diags} v2.7)}, + url = {https://gmd.copernicus.org/articles/15/9031/2022/}, + doi = {10.5194/gmd-15-9031-2022}, + language = {en}, + number = {24}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Zhang, Chengzhu and Golaz, Jean-Christophe and Forsyth, Ryan and Vo, Tom and Xie, Shaocheng and Shaheen, Zeshawn and Potter, Gerald L. and Asay-Davis, Xylar S. and Zender, Charles S. and Lin, Wuyin and Chen, Chih-Chieh and Terai, Chris R. and Mahajan, Salil and Zhou, Tian and Balaguru, Karthik and Tang, Qi and Tao, Cheng and Zhang, Yuying and Emmenegger, Todd and Burrows, Susannah and Ullrich, Paul A.}, + month = dec, + year = {2022}, + pages = {9031--9056}, +} + + +@article{taylor_energy_2020, + title = {An {Energy} {Consistent} {Discretization} of the {Nonhydrostatic} {Equations} in {Primitive} {Variables}}, + volume = {12}, + issn = {1942-2466, 1942-2466}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001783}, + doi = {10.1029/2019MS001783}, + language = {en}, + number = {1}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Taylor, Mark A. and Guba, Oksana and Steyer, Andrew and Ullrich, Paul A. and Hall, David M. and Eldred, Christopher}, + month = jan, + year = {2020}, + pages = {e2019MS001783}, +} + +@article{bradley_islet:_2022, + title = {Islet: interpolation semi-{Lagrangian} element-based transport}, + volume = {15}, + issn = {1991-9603}, + shorttitle = {Islet}, + url = {https://gmd.copernicus.org/articles/15/6285/2022/}, + doi = {10.5194/gmd-15-6285-2022}, + language = {en}, + number = {16}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Bradley, Andrew M. and Bosler, Peter A. and Guba, Oksana}, + month = aug, + year = {2022}, + pages = {6285--6310}, +} + +@techreport{guba_spectral_2014, + type = {preprint}, + title = {The spectral element method on variable resolution grids: evaluating grid sensitivity and resolution-aware numerical viscosity}, + shorttitle = {The spectral element method on variable resolution grids}, + url = {https://gmd.copernicus.org/preprints/7/4081/2014/gmdd-7-4081-2014.pdf}, + urldate = {2024-03-29}, + institution = {Numerical Methods}, + author = {Guba, O. and Taylor, M. A. and Ullrich, P. A. and Overfelt, J. R. and Levy, M. N.}, + month = jun, + year = {2014}, + doi = {10.5194/gmdd-7-4081-2014}, +} + +@article{taylor_compatible_2010, + title = {A compatible and conservative spectral element method on unstructured grids}, + volume = {229}, + issn = {00219991}, + url = {https://linkinghub.elsevier.com/retrieve/pii/S0021999110001841}, + doi = {10.1016/j.jcp.2010.04.008}, + language = {en}, + number = {17}, + urldate = {2024-03-29}, + journal = {Journal of Computational Physics}, + author = {Taylor, Mark A. and Fournier, Aimé}, + month = aug, + year = {2010}, + pages = {5879--5895}, +} + +@misc{elliott_macromolecule_2015, + title = {Macromolecule distributions input file for the {OCEANFILMS} parameterization}, + copyright = {Creative Commons Attribution 4.0 International, Open Access}, + url = {https://zenodo.org/record/6320812}, + doi = {10.5281/ZENODO.6320812}, + urldate = {2024-03-29}, + publisher = {[object Object]}, + author = {Elliott, Scott M. and Maltrud, Mathew and Burrows, Susannah M.}, + month = nov, + year = {2015}, + keywords = {Sea spray organic matter, Emissions parameterization}, +} + +@article{wang_influence_2015, + title = {Influence of explicit \textit{{Phaeocystis}} parameterizations on the global distribution of marine dimethyl sulfide}, + volume = {120}, + issn = {2169-8953, 2169-8961}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2015JG003017}, + doi = {10.1002/2015JG003017}, + language = {en}, + number = {11}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Biogeosciences}, + author = {Wang, Shanlin and Elliott, Scott and Maltrud, Mathew and Cameron‐Smith, Philip}, + month = nov, + year = {2015}, + pages = {2158--2177}, +} + +@article{burrows_physically_2014, + title = {A physically based framework for modeling the organic fractionation of sea spray aerosol from bubble film {Langmuir} equilibria}, + volume = {14}, + issn = {1680-7316}, + url = {https://acp.copernicus.org/articles/14/13601/2014/}, + doi = {10.5194/acp-14-13601-2014}, + language = {English}, + number = {24}, + urldate = {2024-03-29}, + journal = {Atmospheric Chemistry and Physics}, + author = {Burrows, S. M. and Ogunro, O. and Frossard, A. A. and Russell, L. M. and Rasch, P. J. and Elliott, S. M.}, + month = dec, + year = {2014}, + pages = {13601--13629}, +} + +@article{burrows_oceanfilms_2022, + title = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}: {Natural} {Films} and {Interfaces} via {Langmuir} {Molecular} {Surfactants}) sea spray organic aerosol emissions – implementation in a global climate model and impacts on clouds}, + volume = {22}, + issn = {1680-7316}, + shorttitle = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}}, + url = {https://acp.copernicus.org/articles/22/5223/2022/}, + doi = {10.5194/acp-22-5223-2022}, + language = {English}, + number = {8}, + urldate = {2024-03-29}, + journal = {Atmospheric Chemistry and Physics}, + author = {Burrows, Susannah M. and Easter, Richard C. and Liu, Xiaohong and Ma, Po-Lun and Wang, Hailong and Elliott, Scott M. and Singh, Balwinder and Zhang, Kai and Rasch, Philip J.}, + month = apr, + year = {2022}, + pages = {5223--5251}, +} + +@article{maltrud_global_1998, + title = {Global eddy‐resolving ocean simulations driven by 1985–1995 atmospheric winds}, + volume = {103}, + issn = {0148-0227}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/1998JC900013}, + doi = {10.1029/1998JC900013}, + language = {en}, + number = {C13}, + urldate = {2024-03-29}, + journal = {Journal of Geophysical Research: Oceans}, + author = {Maltrud, Mathew E. and Smith, Richard D. and Semtner, Albert J. and Malone, Robert C.}, + month = dec, + year = {1998}, + pages = {30825--30853}, +} + +@article{moore_upper_2004, + title = {Upper ocean ecosystem dynamics and iron cycling in a global three‐dimensional model}, + volume = {18}, + issn = {0886-6236, 1944-9224}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2004GB002220}, + doi = {10.1029/2004GB002220}, + language = {en}, + number = {4}, + urldate = {2024-03-29}, + journal = {Global Biogeochemical Cycles}, + author = {Moore, J. Keith and Doney, Scott C. and Lindsay, Keith}, + month = dec, + year = {2004}, + pages = {2004GB002220}, +} + +@article{liu_toward_2012, + title = {Toward a minimal representation of aerosols in climate models: description and evaluation in the {Community} {Atmosphere} {Model} {CAM5}}, + volume = {5}, + issn = {1991-9603}, + shorttitle = {Toward a minimal representation of aerosols in climate models}, + url = {https://gmd.copernicus.org/articles/5/709/2012/}, + doi = {10.5194/gmd-5-709-2012}, + language = {en}, + number = {3}, + urldate = {2024-03-29}, + journal = {Geoscientific Model Development}, + author = {Liu, X. and Easter, R. C. and Ghan, S. J. and Zaveri, R. and Rasch, P. and Shi, X. and Lamarque, J.-F. and Gettelman, A. and Morrison, H. and Vitt, F. and Conley, A. and Park, S. and Neale, R. and Hannay, C. and Ekman, A. M. L. and Hess, P. and Mahowald, N. and Collins, W. and Iacono, M. J. and Bretherton, C. S. and Flanner, M. G. and Mitchell, D.}, + month = may, + year = {2012}, + pages = {709--739}, +} + +@article{wang_aerosols_2020, + title = {Aerosols in the {E3SM} {Version} 1: {New} {Developments} and {Their} {Impacts} on {Radiative} {Forcing}}, + volume = {12}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Aerosols in the {E3SM} {Version} 1}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001851}, + doi = {10.1029/2019MS001851}, + language = {en}, + number = {1}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Wang, Hailong and Easter, Richard C. and Zhang, Rudong and Ma, Po‐Lun and Singh, Balwinder and Zhang, Kai and Ganguly, Dilip and Rasch, Philip J. and Burrows, Susannah M. and Ghan, Steven J. and Lou, Sijia and Qian, Yun and Yang, Yang and Feng, Yan and Flanner, Mark and Leung, L. Ruby and Liu, Xiaohong and Shrivastava, Manish and Sun, Jian and Tang, Qi and Xie, Shaocheng and Yoon, Jin‐Ho}, + month = jan, + year = {2020}, + pages = {e2019MS001851}, +} + +@article{feng_global_2022, + title = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1: {Impact} of {Increasing} {Model} {Resolution}}, + volume = {14}, + issn = {1942-2466, 1942-2466}, + shorttitle = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021MS002909}, + doi = {10.1029/2021MS002909}, + language = {en}, + number = {7}, + urldate = {2024-03-29}, + journal = {Journal of Advances in Modeling Earth Systems}, + author = {Feng, Y. and Wang, H. and Rasch, P. J. and Zhang, K. and Lin, W. and Tang, Q. and Xie, S. and Hamilton, D. S. and Mahowald, N. and Yu, H.}, + month = jul, + year = {2022}, + pages = {e2021MS002909}, +} diff --git a/components/eam/docs/tech-guide/homme.md b/components/eam/docs/tech-guide/homme.md new file mode 100644 index 00000000000..72ac9987d1c --- /dev/null +++ b/components/eam/docs/tech-guide/homme.md @@ -0,0 +1,20 @@ +# High-Order Methods Modeling Environment + +## Overview + +EAM using the a dynamical core (dycore) from the High Order Method Modeling Environment (HOMME). The EAM dycore solves the atmospheric primitive equations governing the evolution of velocity, density, pressure and temperature, as well as the transport of water species and related hydrometers, aerosols and other atmospheric constituents. The governing equations are written in a vertically lagrangian terrain following mass coordinate. They are discretized with second order finite differences in the radial direction and spectral finite elements in the horizontal (surface of the sphere) directions, and advanced in time with a 3rd order accurate 5 stage Runge-Kutta method. Dissipation is added through the use of monotoncity contraints on some advectiion terms, explicitly added hyperviscosity, and a Laplacian-based sponge layer in the first few layers at the model top. The transported species makes use of an efficient interpolatory semi-Lagrangian method. EAMv3 uses 80 layers in the vertical. The use of the spectral finite element method allows EAMv3 to run on fully unstructured grids, including the cubed-sphere grid ([SE Atmosphere Grid Overview (EAM & CAM)](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/34113147)) which provides quasi-uniform resolution over the globe, and regionally refined meshes (RRM) which enhance horizontal resolution in regions of interest ([Library of Regionally-Refined Model (RRM) Grids](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3690397775)). + + +## Namelist parameters + +Many dynamical core parameters can not be changed independently. For example, increasing the hyperviscosity coefficient may require reducing the hyperviscosity timestep. Dycore timesteps are tuned for each resolution and the defaults are close to the CFL stability limit. For complete details, as well as their interactions, see [EAM's HOMME dycore](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1044644202/EAM+s+HOMME+dycore). + +| Parameter | Description | Default value | +| ---------------- | ------------------------------------------------------------------------------------------- | -------------- | +| `se_tstep` | Main dycore timestep. Additional parameters control the hyper viscsosity, trancer and vertical remap timesteps, which are derived from se_tstep.
units = seconds | Scales linearly with horizontal resolution.
NE30 default: `300` | +| `nu` | Tensor hyperviscosity coefficient, independent of spatial resolution.
units = 1/s | `3.4e-8` | +| `nu_top` | Scalar viscosity at model top.
units = m^2/s | Horizontal resolution dependent
NE30 default: `2.5e5` | +| `transport_alg` | Select between semi-lagrangian and Eulerian based transport schemes | `12` = semi-lagranian method with monotinicity and mass preservation | +| `statefreq` | print a varieity of dycore metrics to the atm.log file every “statefreq” timesteps | `480` | +| `vert_remap_alg` | Algorithm used to remap the vertically lagrangian levels back to the reference levels | `10` = strict monotonicity applied on top of a 2nd order accurate PPM method | +| `se_ftype` | Controls how physics tendencies are applied. 0=”dribbled” in during dynamics timesteps. 1=”hard adjustment” after each physics timestep. 2=hybrid approach: hard adjustment for tracers, dribbled for remaining tendencies | `2` | diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index e311ba038f4..aa5c48b3d1f 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -1,8 +1,8 @@ -This Technical Guide describes the physics of EAM. +This Technical Guide describes the physics of EAM. # Dynamics -- [HOMME](homme.md): Dynamical core +- [HOMME](homme.md): The dynamical core used in EAMv3. # Physics @@ -12,31 +12,32 @@ This Technical Guide describes the physics of EAM. ## Shallow convection / turbulence -- [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. +- [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. ## Deep convection -- [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. +- [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. ## Radiation -- [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. +- [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. ## Aerosol - [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv3. -- [MAM5](mam5.md): The parameterization scheme to represent stratospheric sulfate aerosols in EAMv3. +- [MAM5](mam5.md): The parameterization scheme to represent stratospheric sulfate aerosols in EAMv3. -- [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. +- [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. -- [Dust](dust.md): The parameterization of dust emissions in EAMv3. +- [Dust](dust.md): The parameterization of dust emissions in EAMv3. ## Chemistry -- [Chem UCI + Linozv3](chemUCIlinozv3.md): The parameterization of atmospheric chemistry in EAMv3. +- [chemUCI + Linoz v3](chemUCIlinozv3.md): The parameterization of interactive atmospheric chemistry in EAMv3. ## Diagnostic outputs -- [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. -- [ARM Diags](armdiags.md): Diagnostic package that allows the model output to be compared against ARM measurements in EAMv3. \ No newline at end of file +- [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. + +- [ARM Diags](armdiags.md): Diagnostic package that allows the model output to be compared against ARM measurements in EAMv3. From 2d8433114d27e2d29e751ffbc5cd445e2f79b88d Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 29 Mar 2024 11:56:37 -0700 Subject: [PATCH 226/310] Add information about the topography file --- components/eam/docs/user-guide/index.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index b866d5cf338..6fb9d135a2c 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -78,10 +78,22 @@ Linozv3 uses the ozone tendency, (net production minus loss) calculated from its Refer to [this page](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3764486280/Production+of+the+Linoz+v3+data) for more details on Linoz v3 input files. -#### Land +#### Topography +The global elevation on the atmosphere grid is a key input dataset. The dataset is grid dependent. It contains the geopotential data (on both the GLL dynamics and PG2 physics grids) and two surface roughness quantities, `SGH` and `SGH30`. -- More info on rough topography -- More info on land-use land cover change / land surface data +EAMv3 NE30 data: +``` +/lcrc/group/e3sm/data/inputdata/atm/cam/topo/USGS-gtopo30_ne30np4pg2_x6t-SGH.c20210614.nc' +``` + +This file is computed via a complex procedure that starts with high resolution dataset (for EAMv3, we use the GTOPO30, a 30 arc-second resolution data set on a lat-lon grid) that is then downsampled to a 3km cubed-sphere grid (cube3000) and then downsampled to the atmosphere grid on the (GLL nodes), and then smoothed with the same viscosity operator used by the dycore. The smoothed GLL topography is then mapped to the PG2 grid. Finally, two different surface roughness fields are computed: + +- `SGH30`: the variance between GTOPO30 and GTOPO30-downsampled-to-PG2 (independent of any dycore specific smoothing). (used by CLUBB, TMS, vertical_diffusion) +- `SGH`: the variance between the cube3000 data and the smoothed PG2 data. (used by GWD parameterizations) + +#### Land-use / land cover change + +- Info needed on land-use land cover change / land surface data #### Ocean/sea ice From 2708cfd2a832e59b1f054e5fb29ea75ffddf53b1 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 29 Mar 2024 16:06:35 -0700 Subject: [PATCH 227/310] Add documentation on OCEANFILMS and minor format fixes --- components/eam/docs/tech-guide/index.md | 2 ++ components/eam/docs/tech-guide/oceanfilms.md | 24 ++++++++++++++++++++ components/eam/docs/user-guide/index.md | 9 ++++---- 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 components/eam/docs/tech-guide/oceanfilms.md diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index aa5c48b3d1f..9131a1405c1 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -32,6 +32,8 @@ This Technical Guide describes the physics of EAM. - [Dust](dust.md): The parameterization of dust emissions in EAMv3. +- [OCEANFILMS](oceanfilms.md): The parameterization of sea soray irganic aerosol emissions in EAMv3. + ## Chemistry - [chemUCI + Linoz v3](chemUCIlinozv3.md): The parameterization of interactive atmospheric chemistry in EAMv3. diff --git a/components/eam/docs/tech-guide/oceanfilms.md b/components/eam/docs/tech-guide/oceanfilms.md new file mode 100644 index 00000000000..2dddae1e335 --- /dev/null +++ b/components/eam/docs/tech-guide/oceanfilms.md @@ -0,0 +1,24 @@ +# OCEANFILMS + +## Overview + +E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: Natural Films and Interfaces via Langmuir Molecular Surfactants) parameterization to represent sea spray organic aerosol emissions. OCEANFILMS is a physically based model that links sea spray chemistry with ocean biogeochemistry using a Langmuir partitioning approach. The underlying physical assumptions and parameterization are described in Burrows et al. (2014); the implementation in E3SM and impact on clouds and climate are documented in Burrows et al. (2022). + +## Namelist parameters + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `mam_mom_cycle_yr` | | `1` | +| `mam_mom_datapath` | Full pathname of the directory that contains the files specified in mam_mom_filelist | `'atm/cam/chem/trop_mam/marine_BGC/'` | +| `mam_mom_filename` | Filename of file that contains a sequence of filenames for prescribed marine organic matter ocean concentrations. The filenames in this file are relative to the directory specified by mam_mom_datapath.| `'monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc'` | +| `mam_mom_rmfile` | Remove the file containing prescribed aerosol deposition fluxes from local disk when no longer needed. | `FALSE` | +| `mam_mom_specifier` | Names of variables containing aerosol data in the prescribed aerosol datasets. | `'chla:CHL1','mpoly:TRUEPOLYC','mprot:TRUEPROTC','mlip:TRUELIPC'` | +| `mam_mom_datatype` | Type of time interpolation for data in mam_mom files. Can be set to `'CYCLICAL'`, `'SERIAL'`, `'INTERP_MISSING_MONTHS'`, or `'FIXED'`. | `'CYCLICAL'` | +| `mam_mom_cycle_yr` | The cycle year of the prescribed aerosol flux data if mam_mom_type is `'CYCLICAL'`. Format: YYYY | `1` | +| `mam_mom_fixed_ymd` | The date at which the prescribed aerosol flux data is fixed if mam_mom_type is `'FIXED'`. Format: YYYYMMDD | `0` | +| `mam_mom_fixed_tod` | The time of day (seconds) corresponding to mam_mom_fixed_ymd at which the prescribed aerosol flux data is fixed if mam_mom_type is 'FIXED'. | `0` | +| `mam_mom_bubble_thickness` | Bubble film thickness (in m) for marine organic aerosol emission mechanism. The physically reasonable range is approximately (0.1 - 1) x 10^ -6. | `0.1e-6` | +| `mam_mom_mixing_state` | Switch to select mixing state assumption in marine organic aerosol code. Currently implemented options: 0 : total external mixture, add to mass; 1 : total external mixture, replace mass; 2 : total internal mixture, add to mass; 3 : total internal mixture, replace mass. | `0` [Note: set to 3 in the atm_in namelist] | +| `mam_mom_parameterization` | Selection of alternate parameterizations for marine organic matter emissions. Set fmoa=1 for Burrows et al., 2014 parameterization; fmoa=2 for Gantt et al. (2011, ACP) parameterization; fmoa=3 for simple parameterization based on Quinn et al., 2014; fmoa=4 for +Rinaldi et al. (JGR, 2013).* | `1` | +*Note: non-default values have not been carefully tested and may not work as expected. \ No newline at end of file diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 6fb9d135a2c..a0f8e61314b 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -16,7 +16,7 @@ This Users's Guide describes how to set up and run EAM. ## Steps to build and run EAM -A step-by-step instruction on how to run E3SM can be found here: https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536 +A step-by-step instruction on how to run E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to change the compset and grid. Certain namelist paramters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. @@ -34,8 +34,6 @@ All of the compsets below run with the complete set of E3SM atmospheric configur ### Grids -Need to check final v3 grid to be used for ne30 simulations - `ne30pg2_r05_IcoswISC30E3r5` - ne30pg2 atmosphere, 0.5deg x 0.5deg land grid, and Icosahedral 30 km mesh with ice shelves cavities (wISC), E3SMv3 (E3) revision r5 ## Customizing runs @@ -134,7 +132,8 @@ By default, EAM will output a set of monthly-averaged variables. Additional outp fexcl1 = 'U10' # Removes U10 output from monthly files fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', - 'TCO','SCO','TREFHTMN','TREFHTMX','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file + 'TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file - ``` \ No newline at end of file + + ``` From 3986278ccdebc7cfb83fef3096d6dccb95572226 Mon Sep 17 00:00:00 2001 From: Ziming Ke Date: Fri, 29 Mar 2024 16:57:51 -0700 Subject: [PATCH 228/310] Update mam5.md --- components/eam/docs/tech-guide/mam5.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/components/eam/docs/tech-guide/mam5.md b/components/eam/docs/tech-guide/mam5.md index 0aafad7de0c..f58f79dd8df 100644 --- a/components/eam/docs/tech-guide/mam5.md +++ b/components/eam/docs/tech-guide/mam5.md @@ -2,7 +2,20 @@ ## Overview -Five-mode Modal Aerosol Model (MAM5) replaces the MAM4 used in E3SM-V1 and -V2 versions and adds stratospheric coarse mode (the fifth mode) to represent stratospheric sulfate aerosols mainly induced by volcanic eruption and DMS decomposition. The only spicies in this mode is sulfate aerosol with smaller standard deviation value 1.2. +The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2019; Liu et al., 2012). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). Volcanic eruptions derived from Neely and Schmidt (2016). -## Namelist parameters +Reference: + +Liu, X., Easter, R. C., Ghan, S. J., Zaveri, R., Rasch, P., Shi, X., ... & Mitchell, D. (2012). Toward a minimal representation of aerosols in climate models: Description and evaluation in the Community Atmosphere Model CAM5. Geoscientific Model Development, 5(3), 709-739. + +Mills, M. J., Schmidt, A., Easter, R., Solomon, S., Kinnison, D. E., Ghan, S. J., ... & Gettelman, A. (2016). Global volcanic aerosol properties derived from emissions, 1990–2014, using CESM1 (WACCM). Journal of Geophysical Research: Atmospheres, 121(5), 2332-2348. + +Neely III, R. R., & Schmidt, A. (2016). VolcanEESM: Global volcanic sulphur dioxide (SO2) emissions database from 1850 to present. +Visioni, D., Tilmes, S., Bardeen, C., Mills, M., MacMartin, D. G., Kravitz, B., & Richter, J. (2021). Potential limitations of using a modal aerosol approach for sulfate geoengineering applications in climate models. Atmospheric Chemistry & Physics Discussions. + +Wang, H., Easter, R. C., Zhang, R., Ma, P. L., Singh, B., Zhang, K., ... & Yoon, J. H. (2020). Aerosols in the E3SM Version 1: New developments and their impacts on radiative forcing. Journal of Advances in Modeling Earth Systems, 12(1), e2019MS001851. + +## Namelist parameters +is_output_interactive_volc = .true. +output stratospheric AOD flag, default value = .false. From 1689a8182451e56044bc683ace1104453a8f6975 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Wed, 24 Apr 2024 10:15:29 -0700 Subject: [PATCH 229/310] Fixes to EAM docs --- components/eam/docs/tech-guide/armdiags.md | 10 +++--- .../eam/docs/tech-guide/chemUCIlinozv3.md | 18 +++++----- components/eam/docs/tech-guide/index.md | 20 ++++++----- components/eam/docs/tech-guide/mam4.md | 5 ++- components/eam/docs/tech-guide/mam5.md | 3 +- .../eam/docs/user-guide/aerosol_phys_prop.md | 22 ++++++------ .../docs/user-guide/emission_oxidant_files.md | 11 +++--- components/eam/docs/user-guide/index.md | 34 +++++++++---------- 8 files changed, 62 insertions(+), 61 deletions(-) diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md index e926159aae3..852b1ff3090 100644 --- a/components/eam/docs/tech-guide/armdiags.md +++ b/components/eam/docs/tech-guide/armdiags.md @@ -2,7 +2,7 @@ ## Overview -The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020). It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023; Emmenegger et al. 2022; Zhang et al. 2018). The Majority of ARM Diags sets are ported into E3SM Diags (Zhabg et al. 2022) for routine evaluation of the model. +The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020). It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023; Emmenegger et al. 2022; Zhang et al. 2018). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al. 2022) for routine evaluation of the model. ## To enable the use of ARM Diags @@ -10,16 +10,17 @@ To enable using ARM Diags for a simulation, often, a new tape that output at hig ``` fincl7 = 'PS','Q','T','Z3','CLOUD','CONCLD','CLDICE','CLDLIQ','FREQR','REI','REL','PRECT','TMQ','PRECC','TREFHT','QREFHT','OMEGA','CLDTOT','LHFLX','SHFLX','FLDS','FSDS','FLNS','FSNS','FLNSC','FSDSC','FSNSC','AODVIS','AODABS','LS_FLXPRC','LS_FLXSNW','LS_REFFRAIN','ZMFLXPRC','ZMFLXSNW','CCN1','CCN2','CCN3','CCN4','CCN5','num_a1','num_a2','num_a3','num_a4','so4_a1','so4_a2','so4_a3','AREL','TGCLDLWP','AQRAIN','ANRAIN','FREQR','PRECL','RELHUM' -fincl7lonlat='262.5e_36.6n','204.6e_71.3n','147.4e_2.0s','166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' +fincl7lonlat='262.5e_36.6n','203.4e_71.3n','147.4e_2.0s','166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' ``` Note that in this example fincl7 should set to write output at hourly (`nhtfrq = -1`). And here additional variables are included for ARM simulator analysis. The ARM site information is shown below: + ``` "sgpc1": ["97.5W 36.4N Oklahoma ARM"], "nsac1": ["156.6W 71.3N Barrow ARM"], - "twpc1": "147.4E 2.1S Manus ARM"], + "twpc1": ["147.4E 2.1S Manus ARM"], "twpc2": ["166.9E 0.5S Nauru ARM"], @@ -28,7 +29,6 @@ Note that in this example fincl7 should set to write output at hourly (`nhtfrq = "enac1": ["28.0E 39.1N Graciosa Island ARM"], ``` - ## Diagnostics and metrics currently implemented in the ARM Diags | Statistical Metrics | Variables | Time sampling | @@ -44,4 +44,4 @@ Note that in this example fincl7 should set to write output at hourly (`nhtfrq = | Process-oriented metrics | Variables | Time sampling | | ------------------------- | ------------------------------------------------------------- | ----------------- | | Convection Onset | 1. Surface precipitation rate
2. Column Precipitable Water Vapor | Hourly mean | -| Aerosol-CCN Activation | 1. Total aerosol number concentration
2. CCN number concentrations at different supersaturation levels (0.1%, 0.2%, 0.5% and 1.0) | Hourly mean | \ No newline at end of file +| Aerosol-CCN Activation | 1. Total aerosol number concentration
2. CCN number concentrations at different supersaturation levels (0.1%, 0.2%, 0.5% and 1.0) | Hourly mean | diff --git a/components/eam/docs/tech-guide/chemUCIlinozv3.md b/components/eam/docs/tech-guide/chemUCIlinozv3.md index 89565630245..b47d2979e79 100644 --- a/components/eam/docs/tech-guide/chemUCIlinozv3.md +++ b/components/eam/docs/tech-guide/chemUCIlinozv3.md @@ -10,19 +10,19 @@ Atmospheric interactive chemistry is handled by chemUCI (in the troposphere) and | ---------------------------- | ------------------------------------------------------------------------ | ---------------------- | | `airpl_emis_file` | Aviation emission | | | `chlorine_loading_file` | Chlorine loading | | -| `chlorine_loading_fixed_ymd` | Directory of P3 look-up tables | | -| `chlorine_loading_type` | P3 look-up table Version | | +| `chlorine_loading_fixed_ymd` | | | +| `chlorine_loading_type` | | | | `ext_frc_specifier` | 3-D emissions | | -| `ext_frc_cycle_yr` | Output of P3 microphysical process rates | | -| `ext_frc_type` | Tunable parameter for adjusting rain accretion efficiency | | +| `ext_frc_cycle_yr` | | | +| `ext_frc_type` | | | | `srf_emis_specifier` | Surface emissions | | -| `srf_emis_cycle_yr` | Radius of embryomic raindrops from auto-conversion | | +| `srf_emis_cycle_yr` | | | | `srf_emis_type` | Upper bound of mean raindrop diameter | | | `linoz_data_file` | Linoz data file | | -| `linoz_data_cycle_yr` | Nc exponent in droplet auto-conversion | | -| `linoz_data_path` | Qc exponent in rain accretion | | -| `linoz_data_type` | Qc exponeent in droplet autoconversion | | +| `linoz_data_cycle_yr` | | | +| `linoz_data_path` | | | +| `linoz_data_type` | | | | `lght_no_prd_factor` | Lightning NOx emission factor | `5.0` | | `fstrat_efold_list` | Tracer (from troposphere) list with e-folding decay in the stratosphere | | -* Many of these namelist parameters specify input data files. Check the `atm_in` file for examples or refer to the [Users' Guide](../user-guide/index.md). \ No newline at end of file +* Many of these namelist parameters specify input data files. Check the `atm_in` file for examples or refer to the [Users' Guide](../user-guide/index.md). diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index 9131a1405c1..4006a9bd913 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -1,28 +1,30 @@ +# EAM Technical Guide + This Technical Guide describes the physics of EAM. -# Dynamics +## Dynamics - [HOMME](homme.md): The dynamical core used in EAMv3. -# Physics +## Physics ## Microphysics - [P3](p3.md): The stratiform cloud microphysics scheme in EAMv3. -## Shallow convection / turbulence +### Shallow convection / turbulence - [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. -## Deep convection +### Deep convection - [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. -## Radiation +### Radiation - [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. -## Aerosol +### Aerosol - [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv3. @@ -34,11 +36,11 @@ This Technical Guide describes the physics of EAM. - [OCEANFILMS](oceanfilms.md): The parameterization of sea soray irganic aerosol emissions in EAMv3. -## Chemistry +### Chemistry -- [chemUCI + Linoz v3](chemUCIlinozv3.md): The parameterization of interactive atmospheric chemistry in EAMv3. +- [chemUCI + Linoz v3](chemUCIlinozv3.md): The interactive atmospheric chemistry packages in EAMv3. -## Diagnostic outputs +### Diagnostic outputs - [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. diff --git a/components/eam/docs/tech-guide/mam4.md b/components/eam/docs/tech-guide/mam4.md index 4dced1b74d1..4973ff2d0ac 100644 --- a/components/eam/docs/tech-guide/mam4.md +++ b/components/eam/docs/tech-guide/mam4.md @@ -2,8 +2,7 @@ ## Overview -The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. - +The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. ### Sea salt @@ -15,4 +14,4 @@ In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse | ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | | `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | | `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | -| `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | \ No newline at end of file +| `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | diff --git a/components/eam/docs/tech-guide/mam5.md b/components/eam/docs/tech-guide/mam5.md index f58f79dd8df..acfa850fa23 100644 --- a/components/eam/docs/tech-guide/mam5.md +++ b/components/eam/docs/tech-guide/mam5.md @@ -17,5 +17,6 @@ Visioni, D., Tilmes, S., Bardeen, C., Mills, M., MacMartin, D. G., Kravitz, B., Wang, H., Easter, R. C., Zhang, R., Ma, P. L., Singh, B., Zhang, K., ... & Yoon, J. H. (2020). Aerosols in the E3SM Version 1: New developments and their impacts on radiative forcing. Journal of Advances in Modeling Earth Systems, 12(1), e2019MS001851. ## Namelist parameters + is_output_interactive_volc = .true. -output stratospheric AOD flag, default value = .false. +output stratospheric AOD flag, default value = .false. diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index 9cece436767..d52c98cbe8c 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -21,25 +21,25 @@ Key information ### Mode properties -- Geometric standard deviation of each lognormal mode +- Geometric standard deviation of each lognormal mode -- Nominal geometric mean diameter and its lower/upper bound of values for each mode +- Nominal geometric mean diameter and its lower/upper bound of values for each mode -- Coefficients of polynomial expression (lookup-table) for extinction, absorption, and asymmetry parameter calculations. +- Coefficients of polynomial expression (lookup-table) for extinction, absorption, and asymmetry parameter calculations. -- Aerosol refractive index table needed for interpolation (lookup-table) calculation (for different wavelengths) +- Aerosol refractive index table needed for interpolation (lookup-table) calculation (for different wavelengths) -- Crystalization and deliquesence relative humidity thresholds for aerosol wateruptake calculations +- Crystalization and deliquesence relative humidity thresholds for aerosol wateruptake calculations ### Species properties -- Aerosol refractive index for each species +- Aerosol refractive index for each species -- Density for each species +- Density for each species -- Aerosol hygroscopicity for each species +- Aerosol hygroscopicity for each species -- Note that some of variables in the species property file are for bulk aerosols, so we ignore the description for them. +- Note that some of variables in the species property file are for bulk aerosols, so we ignore the description for them. ## Files @@ -66,7 +66,7 @@ Mode properties ## Namelist ``` - mode_defs = 'mam5_mode1:accum:=', + mode_defs = 'mam5_mode1:accum:=', 'A:num_a1:N:num_c1:num_mr:+', 'A:so4_a1:N:so4_c1:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', 'A:pom_a1:N:pom_c1:p-organic:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc:+', @@ -106,4 +106,4 @@ Mode properties 'M:mam5_mode4:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', 'M:mam5_mode5:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam5_mode5_rrtmg_sig1.2_dgnl.40_c03072023.nc' -``` \ No newline at end of file +``` diff --git a/components/eam/docs/user-guide/emission_oxidant_files.md b/components/eam/docs/user-guide/emission_oxidant_files.md index db8bc08fb4b..b56986f1570 100644 --- a/components/eam/docs/user-guide/emission_oxidant_files.md +++ b/components/eam/docs/user-guide/emission_oxidant_files.md @@ -23,10 +23,9 @@ This page documents emissions data for all required aerosols and precursor gases Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014; 2022). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998) and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004) were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014). The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). The file used as an input to E3SM is available here: +[https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc](https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc) -https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc - -And is also published as a citeable dataset on Zenodo: +And is also published as a citeable dataset on Zenodo: Elliott, S. M., Maltrud, M., & Burrows, S. M. (2015). Macromolecule distributions input file for the OCEANFILMS parameterization (Version v1) [Data set]. [Zenodo](https://doi.org/10.5281/zenodo.6320812). @@ -45,7 +44,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio * 1850-1979: monthly input cycled yearly from 30-year mean (1980-2009) * 1980-2014: time-varying MEGAN-MACC data (historical) * 2015-2100: monthly input cycled yearly from 30-year mean (1980-2009) - * natural emissions from oceans (C2H4, C2H6, C3H8, CO) and soil (NO) are regridded from NCAR CESM2 emission files. Just cycled yearly during the historical period and in the future scenarios. + * natural emissions from oceans (C2H4, C2H6, C3H8, CO) and soil (NO) are regridded from NCAR CESM2 emission files. Just cycled yearly during the historical period and in the future scenarios. * E90 emissions? ## Oxidants file needed for VBS SOA and stratosphere sulfate formation @@ -55,10 +54,10 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio * the file for historical simulation is the same as v1 and v2, inherited from CESM * files for SSPs are regridded from NCAR CESM2 tracer files - ## Namelist setting for emissions input ### Historical (WCYCL20TR)/AMIP (F20TR) + ``` ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1850-2014_c180205_kzm_1850_2014_volcano.nc', @@ -194,4 +193,4 @@ srf_emis_specifier = 'C10H16 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_moz tracer_cnst_filelist = '' tracer_cnst_specifier = 'prsd_O3:O3','prsd_NO3:NO3','prsd_OH:OH' tracer_cnst_type = 'INTERP_MISSING_MONTHS' -``` \ No newline at end of file +``` diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index a0f8e61314b..d7eeae116a8 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -40,15 +40,15 @@ All of the compsets below run with the complete set of E3SM atmospheric configur ### Namelist changes -Namelist parameters can be specified in the `user_nl_eam` file. While most can be added at run time, some need to be added before `./case.setup` to have the changes applied in the simulation. +Namelist parameters can be specified in the `user_nl_eam` file. While most can be added at run time, some need to be added before `./case.setup` to have the changes applied in the simulation. -Refer to the individual schemes in the [tech-guide](../tech-guide/index.md) for a list of namelist parameters associated with each scheme in the atmosphere. +Refer to the following page for a table of namelist parameters and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. ### Input datasets #### Greenhouse gases (non-reacting) -Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. +Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. ``` atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc @@ -74,12 +74,14 @@ Linozv3 uses the ozone tendency, (net production minus loss) calculated from its linoz_data_type = 'INTERP_MISSING_MONTHS' ``` -Refer to [this page](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3764486280/Production+of+the+Linoz+v3+data) for more details on Linoz v3 input files. +Refer to [this page](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3764486280/Production+of+the+Linoz+v3+data) for more details on Linoz v3 input files. #### Topography + The global elevation on the atmosphere grid is a key input dataset. The dataset is grid dependent. It contains the geopotential data (on both the GLL dynamics and PG2 physics grids) and two surface roughness quantities, `SGH` and `SGH30`. -EAMv3 NE30 data: +EAMv3 NE30 data: + ``` /lcrc/group/e3sm/data/inputdata/atm/cam/topo/USGS-gtopo30_ne30np4pg2_x6t-SGH.c20210614.nc' ``` @@ -108,7 +110,7 @@ inputdata/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc ### Specifying output (history files) -These are specified in the `user_nl_eam`. +These are specified in the `user_nl_eam`. By default, EAM will output a set of monthly-averaged variables. Additional output files can be specified using the following flags: @@ -120,20 +122,18 @@ By default, EAM will output a set of monthly-averaged variables. Additional outp `mfilt` - List that sets the number of timesteps to write in a single file before starting a new file. -`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. - +`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. #### Example output specification: ``` - nhtfrq = 0,-24,-6,-3 - mfilt = 1,30,120,24 - avgflag_pertape = 'A','A','A','I' +nhtfrq = 0,-24,-6,-3 +mfilt = 1,30,120,24 +avgflag_pertape = 'A','A','A','I' - fexcl1 = 'U10' # Removes U10 output from monthly files - fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', +fexcl1 = 'U10' # Removes U10 output from monthly files +fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', 'TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file - fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file - fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file - - ``` +fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file +fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file +``` From e6a2375a06fdf12bcdb7d3a70ebcac32ccb53c2d Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 25 Apr 2024 12:28:54 -0700 Subject: [PATCH 230/310] Updates to EAM docs to add citation and namelist parameters in user guide --- components/eam/docs/eam_refs.bib | 132 +++++++++++++- components/eam/docs/tech-guide/armdiags.md | 8 +- components/eam/docs/tech-guide/clubb.md | 7 + components/eam/docs/tech-guide/cosp.md | 9 +- components/eam/docs/tech-guide/dust.md | 6 +- components/eam/docs/tech-guide/homme.md | 12 +- components/eam/docs/tech-guide/mam4.md | 6 +- components/eam/docs/tech-guide/mam5.md | 19 +- components/eam/docs/tech-guide/oceanfilms.md | 8 +- components/eam/docs/tech-guide/p3.md | 6 +- components/eam/docs/tech-guide/rrtmg.md | 6 +- components/eam/docs/tech-guide/vbs.md | 2 +- components/eam/docs/tech-guide/zm.md | 16 +- .../eam/docs/user-guide/aerosol_phys_prop.md | 14 +- .../docs/user-guide/emission_oxidant_files.md | 10 +- components/eam/docs/user-guide/index.md | 51 ++++-- .../docs/user-guide/namelist_parameters.md | 163 ++++++++++++++++++ 17 files changed, 398 insertions(+), 77 deletions(-) create mode 100644 components/eam/docs/user-guide/namelist_parameters.md diff --git a/components/eam/docs/eam_refs.bib b/components/eam/docs/eam_refs.bib index aed89c434da..667b6c8f608 100644 --- a/components/eam/docs/eam_refs.bib +++ b/components/eam/docs/eam_refs.bib @@ -113,7 +113,7 @@ @article{wang_impact_2021 pages = {e2021MS002628}, } -@misc{larson_clubb-silhs:_2022, +@misc{larson_clubb-silhs_2022, title = {{CLUBB}-{SILHS}: {A} parameterization of subgrid variability in the atmosphere}, shorttitle = {{CLUBB}-{SILHS}}, url = {http://arxiv.org/abs/1711.03675}, @@ -672,7 +672,7 @@ @article{swales_cloud_2018 pages = {77--81}, } -@article{bodas-salcedo_cosp:_2011, +@article{bodas-salcedo_cosp_2011, title = {{COSP}: {Satellite} simulation software for model assessment}, volume = {92}, issn = {0003-0007, 1520-0477}, @@ -722,7 +722,7 @@ @article{zheng_assessment_2023 pages = {8475--8495}, } -@article{zhang_causes:_2018, +@article{zhang_causes_2018, title = {{CAUSES}: {Diagnosis} of the {Summertime} {Warm} {Bias} in {CMIP5} {Climate} {Models} at the {ARM} {Southern} {Great} {Plains} {Site}}, volume = {123}, issn = {2169-897X, 2169-8996}, @@ -788,7 +788,7 @@ @article{taylor_energy_2020 pages = {e2019MS001783}, } -@article{bradley_islet:_2022, +@article{bradley_islet_2022, title = {Islet: interpolation semi-{Lagrangian} element-based transport}, volume = {15}, issn = {1991-9603}, @@ -978,3 +978,127 @@ @article{feng_global_2022 year = {2022}, pages = {e2021MS002909}, } + +@article{dentener_emissions_2006, + title = {Emissions of primary aerosol and precursor gases in the years 2000 and 1750 prescribed data-sets for {AeroCom}}, + volume = {6}, + issn = {1680-7316}, + url = {https://acp.copernicus.org/articles/6/4321/2006/acp-6-4321-2006.html}, + doi = {10.5194/acp-6-4321-2006}, + language = {English}, + number = {12}, + urldate = {2024-04-24}, + journal = {Atmospheric Chemistry and Physics}, + author = {Dentener, F. and Kinne, S. and Bond, T. and Boucher, O. and Cofala, J. and Generoso, S. and Ginoux, P. and Gong, S. and Hoelzemann, J. J. and Ito, A. and Marelli, L. and Penner, J. E. and Putaud, J.-P. and Textor, C. and Schulz, M. and van der Werf, G. R. and Wilson, J.}, + year = {2006}, + pages = {4321--4344}, +} + +@article{visioni_limitations_2022, + title = {Limitations of assuming internal mixing between different aerosol species: a case study with sulfate geoengineering simulations}, + volume = {22}, + issn = {1680-7316}, + shorttitle = {Limitations of assuming internal mixing between different aerosol species}, + url = {https://acp.copernicus.org/articles/22/1739/2022/}, + doi = {10.5194/acp-22-1739-2022}, + language = {English}, + number = {3}, + urldate = {2024-04-25}, + journal = {Atmospheric Chemistry and Physics}, + author = {Visioni, Daniele and Tilmes, Simone and Bardeen, Charles and Mills, Michael and MacMartin, Douglas G. and Kravitz, Ben and Richter, Jadwiga H.}, + month = feb, + year = {2022}, + pages = {1739--1756}, +} + +@misc{neely_iii_volcaneesm_2016, + title = {{VolcanEESM}: {Global} volcanic sulphur dioxide ({SO2}) emissions database from 1850 to present - {Version} 1.0}, + shorttitle = {{VolcanEESM}}, + url = {https://catalogue.ceda.ac.uk/uuid/a8a7e52b299a46c9b09d8e56b283d385}, + doi = {10.5285/76EBDC0B-0EED-4F70-B89E-55E606BCD568}, + language = {en}, + urldate = {2024-04-25}, + publisher = {[object Object]}, + author = {Neely III, R. R. and Schmidt, A.}, + year = {2016}, + keywords = {Atmospheric Sciences, FOS: Earth and related environmental sciences}, +} + +@article{mills_global_2016, + title = {Global volcanic aerosol properties derived from emissions, 1990–2014, using {CESM1}({WACCM})}, + volume = {121}, + copyright = {http://onlinelibrary.wiley.com/termsAndConditions\#am}, + issn = {2169-897X, 2169-8996}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1002/2015JD024290}, + doi = {10.1002/2015JD024290}, + language = {en}, + number = {5}, + urldate = {2024-04-25}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Mills, Michael J. and Schmidt, Anja and Easter, Richard and Solomon, Susan and Kinnison, Douglas E. and Ghan, Steven J. and Neely, Ryan R. and Marsh, Daniel R. and Conley, Andrew and Bardeen, Charles G. and Gettelman, Andrew}, + month = mar, + year = {2016}, + pages = {2332--2348}, +} + + +@article{rinaldi_is_2013, + title = {Is chlorophyll‐ \textit{a} the best surrogate for organic matter enrichment in submicron primary marine aerosol?}, + volume = {118}, + copyright = {http://onlinelibrary.wiley.com/termsAndConditions\#vor}, + issn = {2169-897X, 2169-8996}, + url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1002/jgrd.50417}, + doi = {10.1002/jgrd.50417}, + language = {en}, + number = {10}, + urldate = {2024-04-25}, + journal = {Journal of Geophysical Research: Atmospheres}, + author = {Rinaldi, Matteo and Fuzzi, Sandro and Decesari, Stefano and Marullo, Salvatore and Santoleri, Rosalia and Provenzale, Antonello and Von Hardenberg, Jost and Ceburnis, Darius and Vaishya, Aditya and O'Dowd, Colin D. and Facchini, Maria Cristina}, + month = may, + year = {2013}, + pages = {4964--4973}, +} + +@article{gantt_wind_2011, + title = {Wind speed dependent size-resolved parameterization for the organic mass fraction of sea spray aerosol}, + volume = {11}, + issn = {1680-7316}, + url = {https://acp.copernicus.org/articles/11/8777/2011/acp-11-8777-2011.html}, + doi = {10.5194/acp-11-8777-2011}, + language = {English}, + number = {16}, + urldate = {2024-04-25}, + journal = {Atmospheric Chemistry and Physics}, + author = {Gantt, B. and Meskhidze, N. and Facchini, M. C. and Rinaldi, M. and Ceburnis, D. and O'Dowd, C. D.}, + month = aug, + year = {2011}, + pages = {8777--8790}, +} + +@article{quinn_contribution_2014, + title = {Contribution of sea surface carbon pool to organic matter enrichment in sea spray aerosol}, + volume = {7}, + copyright = {2014 Springer Nature Limited}, + issn = {1752-0908}, + url = {https://www.nature.com/articles/ngeo2092}, + doi = {10.1038/ngeo2092}, + language = {en}, + number = {3}, + urldate = {2024-04-25}, + journal = {Nature Geoscience}, + author = {Quinn, Patricia K. and Bates, Timothy S. and Schulz, Kristen S. and Coffman, D. J. and Frossard, A. A. and Russell, L. M. and Keene, W. C. and Kieber, D. J.}, + month = mar, + year = {2014}, + keywords = {Atmospheric chemistry, Marine biology, Marine chemistry}, + pages = {228--232}, +} + +@article{neale_description_2012, + title = {Description of the {NCAR} {Community} {Atmosphere} {Model} ({CAM} 5.0)}, + url = {https://opensky.ucar.edu/islandora/object/technotes%3A594/}, + doi = {10.5065/wgtk-4g06}, + language = {en}, + urldate = {2024-04-25}, + author = {Neale, Richard B. and Gettelman, Andrew and Park, Sungsu and Chen, Chih-Chieh and Lauritzen, Peter H. and Williamson, David L. and Conley, Andrew J. and Kinnison, Doug and Marsh, Dan and Smith, Anne K. and Vitt, Francis M. and Garcia, Rolando and Lamarque, Jean-Francois and Mills, Michael J. and Tilmes, Simone and Morrison, Hugh and Cameron-Smith, Philip and Collins, William D. and Iacono, Michael J. and Easter, Richard C. and Liu, Xiaohong and Ghan, Steven J. and Rasch, Philip J. and Taylor, Mark A.}, + year = {2012}, +} diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md index 852b1ff3090..0447092d663 100644 --- a/components/eam/docs/tech-guide/armdiags.md +++ b/components/eam/docs/tech-guide/armdiags.md @@ -2,20 +2,20 @@ ## Overview -The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020). It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023; Emmenegger et al. 2022; Zhang et al. 2018). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al. 2022) for routine evaluation of the model. +The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020) [@zhang_arm_2020]. It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023 [@zheng_assessment_2023]; Emmenegger et al. 2022 [@emmenegger_evaluating_2022]; Zhang et al. 2018 [@zhang_causes_2018]). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al. 2022) [@zhang_e3sm_2022] for routine evaluation of the model. ## To enable the use of ARM Diags To enable using ARM Diags for a simulation, often, a new tape that output at high-frequency over limited-area (nearest grid box to supported ARM site) needs to be included in the namelist file, an example as follows: -``` +```text fincl7 = 'PS','Q','T','Z3','CLOUD','CONCLD','CLDICE','CLDLIQ','FREQR','REI','REL','PRECT','TMQ','PRECC','TREFHT','QREFHT','OMEGA','CLDTOT','LHFLX','SHFLX','FLDS','FSDS','FLNS','FSNS','FLNSC','FSDSC','FSNSC','AODVIS','AODABS','LS_FLXPRC','LS_FLXSNW','LS_REFFRAIN','ZMFLXPRC','ZMFLXSNW','CCN1','CCN2','CCN3','CCN4','CCN5','num_a1','num_a2','num_a3','num_a4','so4_a1','so4_a2','so4_a3','AREL','TGCLDLWP','AQRAIN','ANRAIN','FREQR','PRECL','RELHUM' fincl7lonlat='262.5e_36.6n','203.4e_71.3n','147.4e_2.0s','166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' ``` Note that in this example fincl7 should set to write output at hourly (`nhtfrq = -1`). And here additional variables are included for ARM simulator analysis. The ARM site information is shown below: -``` +```text "sgpc1": ["97.5W 36.4N Oklahoma ARM"], "nsac1": ["156.6W 71.3N Barrow ARM"], @@ -43,5 +43,5 @@ Note that in this example fincl7 should set to write output at hourly (`nhtfrq = | Process-oriented metrics | Variables | Time sampling | | ------------------------- | ------------------------------------------------------------- | ----------------- | -| Convection Onset | 1. Surface precipitation rate
2. Column Precipitable Water Vapor | Hourly mean | +| Convection Onset | 1. Surface precipitation rate
2. Column Precipitable Water Vapor | Hourly mean | | Aerosol-CCN Activation | 1. Total aerosol number concentration
2. CCN number concentrations at different supersaturation levels (0.1%, 0.2%, 0.5% and 1.0) | Hourly mean | diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md index 6f3dc31995a..7d979dbf900 100644 --- a/components/eam/docs/tech-guide/clubb.md +++ b/components/eam/docs/tech-guide/clubb.md @@ -4,6 +4,13 @@ The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds. It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. +### References + +Larson (2022) [@larson_clubb-silhs_2022] +Bogenschutz et al. (2018) [@bogenschutz_path_2018] +Larson and Golaz (2005) [@larson_using_2005] +Golaz et al. (2002) [@golaz_pdf-based_2002] + ## Namelist parameters | Parameter | Description | Default value | diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md index 9044c17a514..3fee6bb6a15 100644 --- a/components/eam/docs/tech-guide/cosp.md +++ b/components/eam/docs/tech-guide/cosp.md @@ -4,6 +4,13 @@ The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011; Swales et al., 2018) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. +### References + +Zhang et al. (2024) [@zhang_understanding_2024] +Zhang et al. (2019) [@zhang_evaluation_2019] +Swales et al. (2018) [@swales_cloud_2018] +Bodas-Salcedo et al. (2011) [@bodas-salcedo_cosp_2011] + ## To turn on COSP outputs Run (add to the run script) the following command before running `./case.setup` @@ -26,4 +33,4 @@ Run (add to the run script) the following command before running `./case.setup` | `CLDMED_CAL` | Calipso Mid-level Cloud Fraction | | `CLDLOW_CAL` | Calipso Low-level Cloud Fraction | | `CLD_CAL_TMPLIQ` | Calipso Liquid Cloud Fraction as a function of temperature | -| `CLD_CAL_TMPICE` | Calipso Ice Cloud Fraction as a function of temperature | \ No newline at end of file +| `CLD_CAL_TMPICE` | Calipso Ice Cloud Fraction as a function of temperature | diff --git a/components/eam/docs/tech-guide/dust.md b/components/eam/docs/tech-guide/dust.md index 256180288ba..aa389841b0c 100644 --- a/components/eam/docs/tech-guide/dust.md +++ b/components/eam/docs/tech-guide/dust.md @@ -2,10 +2,12 @@ ## Overview -Dust-related processes are represented in the E3SM atmosphere and land model components. In E3SMv3, dust deposition will also be coupled with the sea ice and ocean biogeochemistry in the ocean model. Total emission fluxes of dust particles are calculated at each model time step. A new dust emission scheme following Kok et al. (2014) is implemented to E3SMv3, replacing the Zender scheme (Zender et al., 2003) in E3SMv1 and v2 as the default option. The new dust emission scheme includes a time-varying soil erodibility factor for dust mobilization, and includes dust sources in high latitudes (e.g., >60 degree N). A manuscript by Feng et al. is in prep to document the performance of the new emission scheme on dust life cycle and radiative effects in E3SMv3. Dust aerosol is represented in the accumulation and coarse aerosol modes of the MAM4 module following emission. Other dust properties such as optical properties and size distribution at emission are documented in Feng et al. (2022). +Dust-related processes are represented in the E3SM atmosphere and land model components. In E3SMv3, dust deposition will also be coupled with the sea ice and ocean biogeochemistry in the ocean model. Total emission fluxes of dust particles are calculated at each model time step. A new dust emission scheme following Kok et al. (2014) [@kok_improved_2014] is implemented to E3SMv3, replacing the Zender scheme (Zender et al., 2003) [@zender_mineral_2003] in E3SMv1 and v2 as the default option. The new dust emission scheme includes a time-varying soil erodibility factor for dust mobilization, and includes dust sources in high latitudes (e.g., >60 degree N). A manuscript by Feng et al. is in prep to document the performance of the new emission scheme on dust life cycle and radiative effects in E3SMv3. Dust aerosol is represented in the accumulation and coarse aerosol modes of the MAM4 module following emission. Other dust properties such as optical properties and size distribution at emission are documented in Feng et al. (2022). [@feng_global_2022] ## Namelist parameters | Parameter | Description | Default value | | ------------------------- | ---------------------------------------------- | ------------------------------------------------- | -| `dust_emis_scheme` | The v3 dust emission scheme (Kok et al., 2014) | `2`
(set to 1 to switch to the v1/v2 scheme) | \ No newline at end of file +| `dust_emis_scheme`* | The v3 dust emission scheme (Kok et al., 2014) | `2`
(set to 1 to switch to the v1/v2 scheme) | + +*This parameter is set in `user_nl_drv` diff --git a/components/eam/docs/tech-guide/homme.md b/components/eam/docs/tech-guide/homme.md index 72ac9987d1c..7c9923f3f20 100644 --- a/components/eam/docs/tech-guide/homme.md +++ b/components/eam/docs/tech-guide/homme.md @@ -2,8 +2,14 @@ ## Overview -EAM using the a dynamical core (dycore) from the High Order Method Modeling Environment (HOMME). The EAM dycore solves the atmospheric primitive equations governing the evolution of velocity, density, pressure and temperature, as well as the transport of water species and related hydrometers, aerosols and other atmospheric constituents. The governing equations are written in a vertically lagrangian terrain following mass coordinate. They are discretized with second order finite differences in the radial direction and spectral finite elements in the horizontal (surface of the sphere) directions, and advanced in time with a 3rd order accurate 5 stage Runge-Kutta method. Dissipation is added through the use of monotoncity contraints on some advectiion terms, explicitly added hyperviscosity, and a Laplacian-based sponge layer in the first few layers at the model top. The transported species makes use of an efficient interpolatory semi-Lagrangian method. EAMv3 uses 80 layers in the vertical. The use of the spectral finite element method allows EAMv3 to run on fully unstructured grids, including the cubed-sphere grid ([SE Atmosphere Grid Overview (EAM & CAM)](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/34113147)) which provides quasi-uniform resolution over the globe, and regionally refined meshes (RRM) which enhance horizontal resolution in regions of interest ([Library of Regionally-Refined Model (RRM) Grids](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3690397775)). - +EAM using the a dynamical core (dycore) from the High Order Method Modeling Environment (HOMME). The EAM dycore solves the atmospheric primitive equations governing the evolution of velocity, density, pressure and temperature, as well as the transport of water species and related hydrometers, aerosols and other atmospheric constituents. The governing equations are written in a vertically lagrangian terrain following mass coordinate. They are discretized with second order finite differences in the radial direction and spectral finite elements in the horizontal (surface of the sphere) directions, and advanced in time with a 3rd order accurate 5 stage Runge-Kutta method. Dissipation is added through the use of monotoncity contraints on some advectiion terms, explicitly added hyperviscosity, and a Laplacian-based sponge layer in the first few layers at the model top. The transported species makes use of an efficient interpolatory semi-Lagrangian method. EAMv3 uses 80 layers in the vertical. The use of the spectral finite element method allows EAMv3 to run on fully unstructured grids, including the cubed-sphere grid ([SE Atmosphere Grid Overview (EAM & CAM)](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/34113147)) which provides quasi-uniform resolution over the globe, and regionally refined meshes (RRM) which enhance horizontal resolution in regions of interest ([Library of Regionally-Refined Model (RRM) Grids](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3690397775)). + +### References + +Taylor et al. (2020) [@taylor_energy_2020] +Bradley et al. (2022) [@bradley_islet_2022] +Guba et al. (2014) [@guba_spectral_2014] +Taylor and Fournier (2010) [@taylor_compatible_2010] ## Namelist parameters @@ -11,7 +17,7 @@ Many dynamical core parameters can not be changed independently. For example, i | Parameter | Description | Default value | | ---------------- | ------------------------------------------------------------------------------------------- | -------------- | -| `se_tstep` | Main dycore timestep. Additional parameters control the hyper viscsosity, trancer and vertical remap timesteps, which are derived from se_tstep.
units = seconds | Scales linearly with horizontal resolution.
NE30 default: `300` | +| `se_tstep` | Main dycore timestep. Additional parameters control the hyper viscsosity, trancer and vertical remap timesteps, which are derived from se_tstep.
units = seconds | Scales linearly with horizontal resolution.
NE30 default: `300` | | `nu` | Tensor hyperviscosity coefficient, independent of spatial resolution.
units = 1/s | `3.4e-8` | | `nu_top` | Scalar viscosity at model top.
units = m^2/s | Horizontal resolution dependent
NE30 default: `2.5e5` | | `transport_alg` | Select between semi-lagrangian and Eulerian based transport schemes | `12` = semi-lagranian method with monotinicity and mass preservation | diff --git a/components/eam/docs/tech-guide/mam4.md b/components/eam/docs/tech-guide/mam4.md index 4973ff2d0ac..9120413c5dc 100644 --- a/components/eam/docs/tech-guide/mam4.md +++ b/components/eam/docs/tech-guide/mam4.md @@ -2,16 +2,16 @@ ## Overview -The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. +The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). [@liu_description_2016] It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) [@liu_description_2016] include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), [@wang_aerosols_2020] the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). [@burrows_oceanfilms_2022] In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), [@wu_development_2022] as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. ### Sea salt -In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) and Monahan et al. (1986), and then redistributed to the three MAM4 size modes. +In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) [@martensson_laboratory_2003] and Monahan et al. (1986), [@monahan_model_1986] and then redistributed to the three MAM4 size modes. ## Namelist parameters | Parameter | Description | Default value | | ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | -| `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | +| `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | | `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | | `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | diff --git a/components/eam/docs/tech-guide/mam5.md b/components/eam/docs/tech-guide/mam5.md index acfa850fa23..8415f9b9a0e 100644 --- a/components/eam/docs/tech-guide/mam5.md +++ b/components/eam/docs/tech-guide/mam5.md @@ -2,21 +2,10 @@ ## Overview -The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2019; Liu et al., 2012). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). Volcanic eruptions derived from Neely and Schmidt (2016). - -Reference: - -Liu, X., Easter, R. C., Ghan, S. J., Zaveri, R., Rasch, P., Shi, X., ... & Mitchell, D. (2012). Toward a minimal representation of aerosols in climate models: Description and evaluation in the Community Atmosphere Model CAM5. Geoscientific Model Development, 5(3), 709-739. - -Mills, M. J., Schmidt, A., Easter, R., Solomon, S., Kinnison, D. E., Ghan, S. J., ... & Gettelman, A. (2016). Global volcanic aerosol properties derived from emissions, 1990–2014, using CESM1 (WACCM). Journal of Geophysical Research: Atmospheres, 121(5), 2332-2348. - -Neely III, R. R., & Schmidt, A. (2016). VolcanEESM: Global volcanic sulphur dioxide (SO2) emissions database from 1850 to present. - -Visioni, D., Tilmes, S., Bardeen, C., Mills, M., MacMartin, D. G., Kravitz, B., & Richter, J. (2021). Potential limitations of using a modal aerosol approach for sulfate geoengineering applications in climate models. Atmospheric Chemistry & Physics Discussions. - -Wang, H., Easter, R. C., Zhang, R., Ma, P. L., Singh, B., Zhang, K., ... & Yoon, J. H. (2020). Aerosols in the E3SM Version 1: New developments and their impacts on radiative forcing. Journal of Advances in Modeling Earth Systems, 12(1), e2019MS001851. +The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020; [@wang_aerosols_2020] Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021 [@visioni_limitations_2022]). Volcanic eruptions derived from Neely and Schmidt (2016) [@neely_iii_volcaneesm_2016]. ## Namelist parameters -is_output_interactive_volc = .true. -output stratospheric AOD flag, default value = .false. +| Parameter | Description | Default value | +| ------------------------------- | ----------------------------------------------------------------------------------- | --------------------------- | +| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | diff --git a/components/eam/docs/tech-guide/oceanfilms.md b/components/eam/docs/tech-guide/oceanfilms.md index 2dddae1e335..c48bf91a496 100644 --- a/components/eam/docs/tech-guide/oceanfilms.md +++ b/components/eam/docs/tech-guide/oceanfilms.md @@ -2,7 +2,7 @@ ## Overview -E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: Natural Films and Interfaces via Langmuir Molecular Surfactants) parameterization to represent sea spray organic aerosol emissions. OCEANFILMS is a physically based model that links sea spray chemistry with ocean biogeochemistry using a Langmuir partitioning approach. The underlying physical assumptions and parameterization are described in Burrows et al. (2014); the implementation in E3SM and impact on clouds and climate are documented in Burrows et al. (2022). +E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: Natural Films and Interfaces via Langmuir Molecular Surfactants) parameterization to represent sea spray organic aerosol emissions. OCEANFILMS is a physically based model that links sea spray chemistry with ocean biogeochemistry using a Langmuir partitioning approach. The underlying physical assumptions and parameterization are described in Burrows et al. (2014); [@burrows_physically_2014] the implementation in E3SM and impact on clouds and climate are documented in Burrows et al. (2022). [@burrows_oceanfilms_2022] ## Namelist parameters @@ -19,6 +19,6 @@ E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: | `mam_mom_fixed_tod` | The time of day (seconds) corresponding to mam_mom_fixed_ymd at which the prescribed aerosol flux data is fixed if mam_mom_type is 'FIXED'. | `0` | | `mam_mom_bubble_thickness` | Bubble film thickness (in m) for marine organic aerosol emission mechanism. The physically reasonable range is approximately (0.1 - 1) x 10^ -6. | `0.1e-6` | | `mam_mom_mixing_state` | Switch to select mixing state assumption in marine organic aerosol code. Currently implemented options: 0 : total external mixture, add to mass; 1 : total external mixture, replace mass; 2 : total internal mixture, add to mass; 3 : total internal mixture, replace mass. | `0` [Note: set to 3 in the atm_in namelist] | -| `mam_mom_parameterization` | Selection of alternate parameterizations for marine organic matter emissions. Set fmoa=1 for Burrows et al., 2014 parameterization; fmoa=2 for Gantt et al. (2011, ACP) parameterization; fmoa=3 for simple parameterization based on Quinn et al., 2014; fmoa=4 for -Rinaldi et al. (JGR, 2013).* | `1` | -*Note: non-default values have not been carefully tested and may not work as expected. \ No newline at end of file +| `mam_mom_parameterization` | Selection of alternate parameterizations for marine organic matter emissions. Set fmoa=1 for Burrows et al. (2014) [@burrows_physically_2014] parameterization; fmoa=2 for Gantt et al. (2011) [@gantt_wind_2011] parameterization; fmoa=3 for simple parameterization based on Quinn et al., 2014; [@quinn_contribution_2014] fmoa=4 for Rinaldi et al. (JGR, 2013).* [@rinaldi_is_2013] | `1` | + +*Note: non-default values have not been carefully tested and may not work as expected. diff --git a/components/eam/docs/tech-guide/p3.md b/components/eam/docs/tech-guide/p3.md index c9acb9f3e9d..4617c1892bc 100644 --- a/components/eam/docs/tech-guide/p3.md +++ b/components/eam/docs/tech-guide/p3.md @@ -2,7 +2,7 @@ ## Overview -The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties (P3; Morrison & Milbrandt, 2015, Milbrandt & Morrison, 2016). P3 offers a new approach to representing the evolution of ice particles that is more physical than the traditional approach of using predefined ice categories. It has been implemented in E3SM (Wang et al., 2021) to address the limitations in the original microphysics scheme- the lack of riming particles and the artificial conversion between ice crystals and snow particles. The current version in E3SM is a two-moment scheme with a single ice category (Morrison & Milbrandt, 2015). In addition to the total ice number and mass mixing ratios, P3 prognoses the rimed mass and rimed volume mixing ratios, which allows for the prediction of the continuous evolution of the rime fraction and particle density. It is worth noting that the ice nucleation parameterizations are changed to be aerosol-dependent in this study, with the heterogenous ice nucleation parameterizations from the Classical Nucleation Theory (Liu et al., 2012) and the homogenous in-situ cirrus formation based on Liu and Penner (2005). This differs from the P3 used in WRF and that used in the E3SM v1 in Wang et al. (2021) where the heterogeneous ice nucleation parameterizations are temperature dependent only. +The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties (P3; Morrison & Milbrandt, 2015; [@morrison_parameterization_2015] Milbrandt & Morrison, 2016 [@milbrandt_parameterization_2016]). P3 offers a new approach to representing the evolution of ice particles that is more physical than the traditional approach of using predefined ice categories. It has been implemented in E3SM (Wang et al., 2021) [@wang_impact_2021] to address the limitations in the original microphysics scheme- the lack of riming particles and the artificial conversion between ice crystals and snow particles. The current version in E3SM is a two-moment scheme with a single ice category (Morrison & Milbrandt, 2015). [@morrison_parameterization_2015] In addition to the total ice number and mass mixing ratios, P3 prognoses the rimed mass and rimed volume mixing ratios, which allows for the prediction of the continuous evolution of the rime fraction and particle density. It is worth noting that the ice nucleation parameterizations are changed to be aerosol-dependent in this study, with the heterogenous ice nucleation parameterizations from the Classical Nucleation Theory (Liu et al., 2012) [@liu_toward_2012] and the homogenous in-situ cirrus formation based on Liu and Penner (2005). [@liu_ice_2005] This differs from the P3 used in WRF and that used in the E3SM v1 in Wang et al. (2021) [@wang_impact_2021] where the heterogeneous ice nucleation parameterizations are temperature dependent only. ## Namelist parameters @@ -10,7 +10,7 @@ The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties | ------------------------- | ----------------------------------------------------------------- | ---------------------- | | `do_prescribed_ccn` | Turn on the prescribed CCN if true | `false` | | `micro_aerosolactivation` | Turn on aerosol activation if true | `true` | -| `micro_p3_lookup_dir` | Directory of P3 look-up tables | `/lcrc/group/e3sm/data/inputdata/atm/cam/physprops` | +| `micro_p3_lookup_dir` | Directory of P3 look-up tables | `inputdata/atm/cam/physprops` | | `micro_p3_tableversion` | P3 look-up table Version | `4.1.2` | | `micro_subgrid_cloud` | Sub-grid cloud properties | `true` | | `micro_tend_output` | Output of P3 microphysical process rates | `false` | @@ -23,4 +23,4 @@ The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties | `p3_qc_accret_expon` | Qc exponent in rain accretion | `1.15` | | `p3_qc_autocon_expon` | Qc exponeent in droplet autoconversion | `3.19` | | `p3_wbf_coeff` | Tunable parameter for adjusting WBF efficiency | `1.0` | -| `do_cooper_inp3` | Turn on Cooper ice nucleation scheme if true | `false` | \ No newline at end of file +| `do_cooper_inp3` | Turn on Cooper ice nucleation scheme if true | `false` | diff --git a/components/eam/docs/tech-guide/rrtmg.md b/components/eam/docs/tech-guide/rrtmg.md index 3f030d5c53a..80b577b31cf 100644 --- a/components/eam/docs/tech-guide/rrtmg.md +++ b/components/eam/docs/tech-guide/rrtmg.md @@ -2,7 +2,7 @@ ## Overview -The calculation of radiative energy flux through the atmosphere is done using the RRTMG radiation package (Iacono et al., 2008; Mlawer et al., 1997). The details are consistent with the implementation in CAM5 described in Neale et al. 2010. Radiative fluxes are broadly split into shortwave and longwave and computed by separate codes. The shortwave solver uses the 2-stream approximation, while the longwave is an absorption/emission code. Both shortwave and longwave use the correlated k-distribution method for integration of fluxes. Subgrid cloud overlap is accounted for using the Monte Carlo Independent Column Approximation (MCICA; Pincus and Morcrette, 2003), assuming the cloudy portions of the column are maximally overlapped in vertically contiguous layers and randomly overlapped when two layers are separated by a completely clear layer. Cloud optics are parameterized as described in Neale et al.(2010). +The calculation of radiative energy flux through the atmosphere is done using the RRTMG radiation package (Iacono et al., 2008; [@iacono_radiative_2008] Mlawer et al., 1997 [@mlawer_radiative_1997]). The details are consistent with the implementation in CAM5 described in Neale et al. (2012). [@neale_description_2012] Radiative fluxes are broadly split into shortwave and longwave and computed by separate codes. The shortwave solver uses the 2-stream approximation, while the longwave is an absorption/emission code. Both shortwave and longwave use the correlated k-distribution method for integration of fluxes. Subgrid cloud overlap is accounted for using the Monte Carlo Independent Column Approximation (MCICA; Pincus and Morcrette, 2003), [@pincus_fast_2003] assuming the cloudy portions of the column are maximally overlapped in vertically contiguous layers and randomly overlapped when two layers are separated by a completely clear layer. Cloud optics are parameterized as described in Neale et al.(2010). [@neale_description_2012] ## Namelist parameters @@ -11,7 +11,7 @@ The calculation of radiative energy flux through the atmosphere is done using th | `iradsw` | Frequency for updating shortwave fluxes and heating rate; iradsw > 0 interpreted as number of timesteps, iradsw < 0 interpreted as hours; iradsw = 0 disables shortwave radiation entirely | `-1` | | `iradlw` | Frequency for updating longwave fluxes and heating rate; iradlw > 0 interpreted as number of timesteps, iradlw < 0 interpreted as hours; iradlw = 0 disables longwave radiation entirely | `-1` | | `irad_always` | Length of time in timesteps (irad_always > 0) or in hours (irad_always < 0) SW/LW radiation will be run continuously from the start of an initial or restart run | `0` | -| `use_rad_dt_cosz` | If true, use the radiation dt for all cosz calculations; calculates solar zenith angle averaged over a time step. In default model solar zenith angle is held constant over time | `.true.`
(set by namelist_defaults_eam.xml for default physics) | +| `use_rad_dt_cosz` | If true, use the radiation dt for all cosz calculations; calculates solar zenith angle averaged over a time step. In default model solar zenith angle is held constant over time | `.true.`
(set by namelist_defaults_eam.xml for default physics) | | `spectralflux` | Calculate fluxes (up and down) per band | `.false.` | | `liqcldoptics` | Choice of cloud optical property parameterization for liquid clouds. Valid options are ‘slingo’ or ‘gammadist’ | `gammadist` | -| `icecldoptics` | Choice of cloud optical property parameterization for ice clouds. Valid options are ‘ebertcurry’ or ‘mitchell’ | `mitchell` | \ No newline at end of file +| `icecldoptics` | Choice of cloud optical property parameterization for ice clouds. Valid options are ‘ebertcurry’ or ‘mitchell’ | `mitchell` | diff --git a/components/eam/docs/tech-guide/vbs.md b/components/eam/docs/tech-guide/vbs.md index 728324e9311..77e5a479767 100644 --- a/components/eam/docs/tech-guide/vbs.md +++ b/components/eam/docs/tech-guide/vbs.md @@ -2,4 +2,4 @@ ## Overview -A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [Users's Guide](../user-guide/index.md). \ No newline at end of file +A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). [@shrivastava_global_2015] It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). [@hodzic_rethinking_2016] The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [Users's Guide](../user-guide/index.md). diff --git a/components/eam/docs/tech-guide/zm.md b/components/eam/docs/tech-guide/zm.md index 8c19322ec75..3dc0cc1717b 100644 --- a/components/eam/docs/tech-guide/zm.md +++ b/components/eam/docs/tech-guide/zm.md @@ -2,25 +2,25 @@ ## Overview -The ZM scheme (Zhang and McFarlane 1995) used in E3SMv3 is a bulk mass flux-type scheme; it has three components: a trigger for convection initiation, a cloud model including both updrafts and downdrafts, and a closure. The original CAPE-based trigger for convection was replaced by a trigger function based on dynamic CAPE generation by Xie et al. (2019) (see dCAPE-ULL description below for more details). The closure predicts cloud base mass flux using dilute CAPE (Neale et al. 2008). The updraft model is a bulk entraining plume model. Both updrafts and downdrafts are assumed saturated, with downdraft mass flux at the downdraft initiation level set proportional to the updraft cloud base mass flux. The microphysical processes inside the updrafts are represented by a convective microphysics scheme (see ZM convective microphysics description below). An additional adjustment is made to cloud base mass flux to incorporate the effect of large-scale circulation (see mass flux adjustment description below). +The ZM scheme (Zhang and McFarlane 1995) used in E3SMv3 is a bulk mass flux-type scheme; it has three components: a trigger for convection initiation, a cloud model including both updrafts and downdrafts, and a closure. The original CAPE-based trigger for convection was replaced by a trigger function based on dynamic CAPE generation by Xie et al. (2019) [@xie_improved_2019] (see dCAPE-ULL description below for more details). The closure predicts cloud base mass flux using dilute CAPE (Neale et al., 2008). [@neale_impact_2008] The updraft model is a bulk entraining plume model. Both updrafts and downdrafts are assumed saturated, with downdraft mass flux at the downdraft initiation level set proportional to the updraft cloud base mass flux. The microphysical processes inside the updrafts are represented by a convective microphysics scheme (see ZM convective microphysics description below). An additional adjustment is made to cloud base mass flux to incorporate the effect of large-scale circulation (see mass flux adjustment description below). ### dCAPE-ULL -A notable update related to clouds and precipitation in E3SMv2 is the use of a new convective trigger function described by Xie et al. (2019) in ZM to improve the simulation of precipitation and its diurnal cycle. The new convective trigger named as dCAPE-ULL uses the dynamic CAPE (dCAPE) trigger developed by Xie and Zhang (2000) with an unrestricted air parcel launch level (ULL) approach used by Wang et al. (2015). It was designed to address the unrealistically strong coupling of convection to the surface heating in ZM that often results in unrealistically too active model convection during the day in summer season over lands and improve the model capability to capture mid-level convection for nocturnal precipitation. +A notable update related to clouds and precipitation in E3SMv2 is the use of a new convective trigger function described by Xie et al. (2019) [@xie_improved_2019] in ZM to improve the simulation of precipitation and its diurnal cycle. The new convective trigger named as dCAPE-ULL uses the dynamic CAPE (dCAPE) trigger developed by Xie and Zhang (2000) [@xie_impact_2000] with an unrestricted air parcel launch level (ULL) approach used by Wang et al. (2015). [@wang_impacts_2015] It was designed to address the unrealistically strong coupling of convection to the surface heating in ZM that often results in unrealistically too active model convection during the day in summer season over lands and improve the model capability to capture mid-level convection for nocturnal precipitation. ### ZM convective microphysics -The convective microphysics scheme is based on the work of Song and Zhang (2011) to improve the representation of microphysical processes in convective clouds and their interaction with aerosol and stratiform clouds in GCMs. It explicitly treats the mass mixing ratio and number concentration of five hydrometeor species (cloud water, cloud ice, rain, snow, and graupel). The scheme is linked to stratiform cloud microphysics parameterization through convective detrainment of cloud liquid/ice water content and droplet/crystal number concentration, and to aerosols through cloud droplet activation and ice nucleation processes. Previous evaluations of the scheme showed that it improved the simulation of convective cloud properties and cloud hydrological cycle (Song et al. 2012, Storer et al. 2015). The assessment demonstrates that the convective microphysics scheme not only significantly improves the simulation of tropical variability across multiple scales but also enhances the simulation of climatological mean states. +The convective microphysics scheme is based on the work of Song and Zhang (2011) [@song_microphysics_2011] to improve the representation of microphysical processes in convective clouds and their interaction with aerosol and stratiform clouds in GCMs. It explicitly treats the mass mixing ratio and number concentration of five hydrometeor species (cloud water, cloud ice, rain, snow, and graupel). The scheme is linked to stratiform cloud microphysics parameterization through convective detrainment of cloud liquid/ice water content and droplet/crystal number concentration, and to aerosols through cloud droplet activation and ice nucleation processes. Previous evaluations of the scheme showed that it improved the simulation of convective cloud properties and cloud hydrological cycle (Song et al., 2012; [@song_evaluation_2012] Storer et al., 2015 [@storer_effects_2015]). The assessment demonstrates that the convective microphysics scheme not only significantly improves the simulation of tropical variability across multiple scales but also enhances the simulation of climatological mean states. ### Mass flux adjustment -The convective mass flux adjustment (MAdj) is designed to represent the dynamical effects of large-scale vertical motion on convection. With MAdj, convection is enhanced (suppressed) when there is large-scale ascending (descending) motion at the planetary boundary layer top. The coupling of convection with the large-scale circulation significantly improves the simulation of climate variability across multiple scales from diurnal cycle, convectively coupled equatorial waves, to Madden-Julian oscillations (Song et al. 2023). +The convective mass flux adjustment (MAdj) is designed to represent the dynamical effects of large-scale vertical motion on convection. With MAdj, convection is enhanced (suppressed) when there is large-scale ascending (descending) motion at the planetary boundary layer top. The coupling of convection with the large-scale circulation significantly improves the simulation of climate variability across multiple scales from diurnal cycle, convectively coupled equatorial waves, to Madden-Julian oscillations (Song et al., 2023). [@song_incorporating_2023] ### MCSP Due to inadequate model resolution, organized mesoscale convection cannot be resolved in general circulation models and thus needs to be parameterized. The Multiscale Coherent Structure Parameterization (MCSP) aims at representing the dynamical and physical effects of organized mesoscale convection. -MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and momentum fields to represent the impact. Moncrieff et al. (2017) and Chen et al. (2021) have found that by adding MCSP, the both the representation of large-scale precipitation systems and the modes of variability from Tropical waves are improved. +MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and momentum fields to represent the impact. Moncrieff et al. (2017) [@moncrieff_simulation_2017] and Chen et al. (2021) [@chen_effects_2021] have found that by adding MCSP, the both the representation of large-scale precipitation systems and the modes of variability from Tropical waves are improved. ## Namelist parameters @@ -36,8 +36,8 @@ MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and m | dCAPE-ULL Parameters | Description | Default value | | ------------------------- | ----------------------------------------------------------------- | ---------------------- | | `zmconv_trigdcape_ull` | DCAPE trigger along with unrestricted launching level for ZM deep convection scheme | `.true.` | -| `zmconv_trig_dcape_only` | DCAPE only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the dcape only trigger. | -| `zmconv_trig_ull_only` | Use unrestricted launching level (ULL) only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the ull only trigger. | +| `zmconv_trig_dcape_only` | DCAPE only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the dcape only trigger. | +| `zmconv_trig_ull_only` | Use unrestricted launching level (ULL) only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the ull only trigger. | | Conv. micro. Parameters | Description | Default value | | ------------------------- | ----------------------------------------------------------------- | ---------------------- | @@ -55,4 +55,4 @@ MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and m | `zmconv_mcsp_heat_coeff` | MCSP heating coefficient | `0.3` | | `zmconv_mcsp_moisture_coeff` | MCSP moisture coefficient | `0.0` | | `zmconv_mcsp_uwind_coeff` | MCSP zonal wind coefficient | `0.0` | -| `zmconv_mcsp_vwind_coeff` | MCSP meridional wind coefficient | `0.0` | \ No newline at end of file +| `zmconv_mcsp_vwind_coeff` | MCSP meridional wind coefficient | `0.0` | diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index d52c98cbe8c..d8791a7e14b 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -5,13 +5,13 @@ Key information -- Original physical properties of aerosols are documented in Liu et al. (2012). Detailed information is included in the supplement. +- Original physical properties of aerosols are documented in Liu et al. (2012) [@liu_toward_2012]. Detailed information is included in the supplement. -- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020). +- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020) [@wang_aerosols_2020]. -- Marine organic aerosol properties are defined in Burrows et al. (2022). +- Marine organic aerosol properties are defined in Burrows et al. (2022) [@burrows_oceanfilms_2022]. -- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022). +- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022) [@feng_global_2022]. - BC and POM hygroscopicity values are updated by Shan et al. (2024). @@ -43,9 +43,9 @@ Key information ## Files -``` Species properties +```text /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc @@ -53,9 +53,11 @@ Species properties /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ssam_rrtmg_c100508.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/poly_rrtmg_c130816.nc +``` Mode properties +```text /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', @@ -65,7 +67,7 @@ Mode properties ## Namelist -``` +```text mode_defs = 'mam5_mode1:accum:=', 'A:num_a1:N:num_c1:num_mr:+', 'A:so4_a1:N:so4_c1:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', diff --git a/components/eam/docs/user-guide/emission_oxidant_files.md b/components/eam/docs/user-guide/emission_oxidant_files.md index b56986f1570..cf1e8dc7897 100644 --- a/components/eam/docs/user-guide/emission_oxidant_files.md +++ b/components/eam/docs/user-guide/emission_oxidant_files.md @@ -3,7 +3,7 @@ ## Overview -This page documents emissions data for all required aerosols and precursor gases as well as oxidants input data for running EAMv3, mostly for the MAM4 aerosol scheme, from anthropogenic (i.e., industrial, energy, transportation, domestic, and agriculture activity sectors) and natural (i.e., sea spray, vegetation, fire smoke, volcano) sources. Sulfur from agriculture, domestic, transportation, waste, and shipping sectors is emitted at the surface while sulfur from energy and industry sectors is emitted at 100-300 m above the surface, and sulfur from forest fire and grass fire is emitted at higher elevations (0-6 km). POM and BC from forest fire and grass fire are emitted at 0-6 km, while those from other sources (domestic, energy, industry, transportation, waste, and shipping) are emitted at the surface. Injection height profiles for fire emissions are derived from the corresponding AeroCom profiles (Dentener et al., 2006), which give emissions in 6 altitude ranges (0-0.1, 0.1-0.5, 0.5-1, 1-2, 2-3, and 3-6 km). Otherwise, species emissions are assumed to be at the surface (bottom layer). Number emission fluxes each mode are calculated from mass emission fluxes based on AeroCom prescribed lognormal size distributions. +This page documents emissions data for all required aerosols and precursor gases as well as oxidants input data for running EAMv3, mostly for the MAM4 aerosol scheme, from anthropogenic (i.e., industrial, energy, transportation, domestic, and agriculture activity sectors) and natural (i.e., sea spray, vegetation, fire smoke, volcano) sources. Sulfur from agriculture, domestic, transportation, waste, and shipping sectors is emitted at the surface while sulfur from energy and industry sectors is emitted at 100-300 m above the surface, and sulfur from forest fire and grass fire is emitted at higher elevations (0-6 km). POM and BC from forest fire and grass fire are emitted at 0-6 km, while those from other sources (domestic, energy, industry, transportation, waste, and shipping) are emitted at the surface. Injection height profiles for fire emissions are derived from the corresponding AeroCom profiles (Dentener et al., 2006) [@dentener_emissions_2006], which give emissions in 6 altitude ranges (0-0.1, 0.1-0.5, 0.5-1, 1-2, 2-3, and 3-6 km). Otherwise, species emissions are assumed to be at the surface (bottom layer). Number emission fluxes each mode are calculated from mass emission fluxes based on AeroCom prescribed lognormal size distributions. ## Aerosols and gas precursors (common for EAMv1/v2/v3) @@ -20,7 +20,7 @@ This page documents emissions data for all required aerosols and precursor gases ## Marine organic sea spray -Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014; 2022). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998) and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004) were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014). The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). +Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014; [@burrows_physically_2014] 2022 [@burrows_oceanfilms_2022]). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998) [@maltrud_global_1998] and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004) [@moore_upper_2004] were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014) [@burrows_physically_2014]. The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). The file used as an input to E3SM is available here: [https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc](https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc) @@ -58,7 +58,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio ### Historical (WCYCL20TR)/AMIP (F20TR) -``` +```text ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1850-2014_c180205_kzm_1850_2014_volcano.nc', 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_elev_1850-2014_1.9x2.5_c20230201.nc', @@ -102,7 +102,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio ### F2010 -``` +```text ext_frc_cycle_yr = 2010 ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_2010_clim_1.9x2.5_c20230213.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1x1_2010_clim_c20190821.nc', @@ -153,7 +153,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio #### SSP370 -``` +```text ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_elev_2015-2100_c210216.nc', 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc', diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index d7eeae116a8..679372bd676 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -18,7 +18,7 @@ This Users's Guide describes how to set up and run EAM. A step-by-step instruction on how to run E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). -The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to change the compset and grid. Certain namelist paramters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. +The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to change the compset and grid. Certain namelist paramters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. ## Scientifically supported compsets and grids @@ -40,9 +40,9 @@ All of the compsets below run with the complete set of E3SM atmospheric configur ### Namelist changes -Namelist parameters can be specified in the `user_nl_eam` file. While most can be added at run time, some need to be added before `./case.setup` to have the changes applied in the simulation. +Namelist parameters can be specified in the `user_nl_eam` file and unless otherwise noted can be specified at run time. -Refer to the following page for a table of namelist parameters and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. +Refer to the following page for a [table](namelist_parameters.md) of namelist parameters and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. ### Input datasets @@ -50,15 +50,15 @@ Refer to the following page for a table of namelist parameters and the [tech-gui Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. -``` -atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc +```text +inputdata/atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc ``` #### Aerosol physical properties The aerosol properties files provide aerosol refractive index, density, and aerosol hygroscopicty information for each aerosol species, as well as information about lognormal mode definition and lookup tables of polynomial expression coefficients for aerosol optics calculation for each mode. These aerosol physical and chemical properties are used by the radiation, aerosol microphysics and other related source and sink processes, and droplet activation/ice nucleation schemes. Detailed information on the files and related references can be found [here](aerosol_phys_prop.md). -#### Aerosol and gas emission and oxidant files +#### Aerosol and gas emission and oxidant files Details of the aerosol and gas emission and oxidant files used in various historical, present-day, and future scenario can be found [here](emission_oxidant_files.md). @@ -68,7 +68,7 @@ Linozv3 uses the ozone tendency, (net production minus loss) calculated from its ##### Historical files -``` +```text linoz_data_file = ‘linv3_1849-2101_CMIP6_Hist_10deg_58km_c20231207.nc’ linoz_data_path = '/lcrc/group/e3sm/data/inputdata/atm/cam/chem/trop_mozart/ub' linoz_data_type = 'INTERP_MISSING_MONTHS' @@ -82,8 +82,8 @@ The global elevation on the atmosphere grid is a key input dataset. The dataset EAMv3 NE30 data: -``` -/lcrc/group/e3sm/data/inputdata/atm/cam/topo/USGS-gtopo30_ne30np4pg2_x6t-SGH.c20210614.nc' +```text +inputdata/atm/cam/topo/USGS-gtopo30_ne30np4pg2_x6t-SGH.c20210614.nc' ``` This file is computed via a complex procedure that starts with high resolution dataset (for EAMv3, we use the GTOPO30, a 30 arc-second resolution data set on a lat-lon grid) that is then downsampled to a 3km cubed-sphere grid (cube3000) and then downsampled to the atmosphere grid on the (GLL nodes), and then smoothed with the same viscosity operator used by the dycore. The smoothed GLL topography is then mapped to the PG2 grid. Finally, two different surface roughness fields are computed: @@ -93,18 +93,39 @@ This file is computed via a complex procedure that starts with high resolution d #### Land-use / land cover change -- Info needed on land-use land cover change / land surface data +Info needed on land-use land cover change / land surface data + +Refer to [ELM documentation](../../../elm/docs/index.md). #### Ocean/sea ice -- SST file -- Sea ice fraction +The sea surface temperature and sea-ice coverage data used in F-case simulations are based on CMIP6 Forcing Datasets provided from the input4MIPs data collection. The file for the `F2010` compset is created from taking a monthly climatology of years 2005-2014. The file for the `F1850` compset is created from taking a monthly climatology of years 1870-1879.* + +*[Provenenance for F1850 file](https://acme-climate.atlassian.net/wiki/spaces/ATM/pages/201525378/Provenance+for+CMIP6+DECK+SST+Sea-Ice+input+data+for+E3SM) + +`F20TR` + +```text +inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_c20180213.nc +``` + +`F2010` + +```text +inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_2010_clim_c20190821.nc +``` + +`F1850` + +```text +inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_1850_clim_c20190125.nc +``` #### Solar input As with greenhouse gas emissions, solar input files are taken from the input4MIPs data collection that were prepared for CMIP6 Forcing Datasets. -``` +```text inputdata/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc ``` @@ -124,9 +145,9 @@ By default, EAM will output a set of monthly-averaged variables. Additional outp `avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. -#### Example output specification: +#### Example output specification -``` +```text nhtfrq = 0,-24,-6,-3 mfilt = 1,30,120,24 avgflag_pertape = 'A','A','A','I' diff --git a/components/eam/docs/user-guide/namelist_parameters.md b/components/eam/docs/user-guide/namelist_parameters.md new file mode 100644 index 00000000000..b5ef1201897 --- /dev/null +++ b/components/eam/docs/user-guide/namelist_parameters.md @@ -0,0 +1,163 @@ + +# Namelist parameters associated with atmosphere schemes + +## chemUCI and Linoz v3 + +| Parameter | Description | Default value* | +| ---------------------------- | ------------------------------------------------------------------------ | ---------------------- | +| `airpl_emis_file` | Aviation emission | | +| `chlorine_loading_file` | Chlorine loading | | +| `chlorine_loading_fixed_ymd` | | | +| `chlorine_loading_type` | | | +| `ext_frc_specifier` | 3-D emissions | | +| `ext_frc_cycle_yr` | | | +| `ext_frc_type` | | | +| `srf_emis_specifier` | Surface emissions | | +| `srf_emis_cycle_yr` | | | +| `srf_emis_type` | Upper bound of mean raindrop diameter | | +| `linoz_data_file` | Linoz data file | | +| `linoz_data_cycle_yr` | | | +| `linoz_data_path` | | | +| `linoz_data_type` | | | +| `lght_no_prd_factor` | Lightning NOx emission factor | `5.0` | +| `fstrat_efold_list` | Tracer (from troposphere) list with e-folding decay in the stratosphere | | + +* Many of these namelist parameters specify input data files. Check the `atm_in` file for examples or refer to the [Users' Guide](../user-guide/index.md). + +## Cloud Layers Unified By Binormals + +| Parameter | Description | Default value | +| -------------- | ------------------------------------------------------------------------------------------- | -------------- | +| `gamma_coef` | Width of vertical velocity within a Gaussian PDF component at low skewness | `0.12` | +| `gamma_coefb` | Width of vertical velocity within a Gaussian PDF component at high skewness | `0.28` | +| `C8` | Coefficient of damping of third moment of vertical velocity, w’3 | `5.2` | +| `C1` | Coefficient of damping of second vertical moment of vertical velocity, w’2, at low skewness | `2.4` | +| `C14` | Coefficient of damping of second horizontal moments of vertical velocity, u’2 and v’2 | `2.0` | +| `c_k10` | Ratio of diffusivity of momentum to heat | `0.35` | + +## Dust aerosol + +| Parameter | Description | Default value | +| ------------------------- | ---------------------------------------------- | ------------------------------------------------- | +| `dust_emis_scheme`* | The v3 dust emission scheme (Kok et al., 2014) | `2`
(set to 1 to switch to the v1/v2 scheme) | + +*This parameter is set in `user_nl_drv` + +## HOMME + +| Parameter | Description | Default value | +| ---------------- | ------------------------------------------------------------------------------------------- | -------------- | +| `se_tstep` | Main dycore timestep. Additional parameters control the hyper viscsosity, trancer and vertical remap timesteps, which are derived from se_tstep.
units = seconds | Scales linearly with horizontal resolution.
NE30 default: `300` | +| `nu` | Tensor hyperviscosity coefficient, independent of spatial resolution.
units = 1/s | `3.4e-8` | +| `nu_top` | Scalar viscosity at model top.
units = m^2/s | Horizontal resolution dependent
NE30 default: `2.5e5` | +| `transport_alg` | Select between semi-lagrangian and Eulerian based transport schemes | `12` = semi-lagranian method with monotinicity and mass preservation | +| `statefreq` | print a varieity of dycore metrics to the atm.log file every “statefreq” timesteps | `480` | +| `vert_remap_alg` | Algorithm used to remap the vertically lagrangian levels back to the reference levels | `10` = strict monotonicity applied on top of a 2nd order accurate PPM method | +| `se_ftype` | Controls how physics tendencies are applied. 0=”dribbled” in during dynamics timesteps. 1=”hard adjustment” after each physics timestep. 2=hybrid approach: hard adjustment for tracers, dribbled for remaining tendencies | `2` | + +## Four-mode Modal Aerosol Module + +| Parameter | Description | Default value | +| ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | +| `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | +| `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | +| `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | + +## OCEANFILMS + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `mam_mom_cycle_yr` | | `1` | +| `mam_mom_datapath` | Full pathname of the directory that contains the files specified in mam_mom_filelist | `'atm/cam/chem/trop_mam/marine_BGC/'` | +| `mam_mom_filename` | Filename of file that contains a sequence of filenames for prescribed marine organic matter ocean concentrations. The filenames in this file are relative to the directory specified by mam_mom_datapath.| `'monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc'` | +| `mam_mom_rmfile` | Remove the file containing prescribed aerosol deposition fluxes from local disk when no longer needed. | `FALSE` | +| `mam_mom_specifier` | Names of variables containing aerosol data in the prescribed aerosol datasets. | `'chla:CHL1','mpoly:TRUEPOLYC','mprot:TRUEPROTC','mlip:TRUELIPC'` | +| `mam_mom_datatype` | Type of time interpolation for data in mam_mom files. Can be set to `'CYCLICAL'`, `'SERIAL'`, `'INTERP_MISSING_MONTHS'`, or `'FIXED'`. | `'CYCLICAL'` | +| `mam_mom_cycle_yr` | The cycle year of the prescribed aerosol flux data if mam_mom_type is `'CYCLICAL'`. Format: YYYY | `1` | +| `mam_mom_fixed_ymd` | The date at which the prescribed aerosol flux data is fixed if mam_mom_type is `'FIXED'`. Format: YYYYMMDD | `0` | +| `mam_mom_fixed_tod` | The time of day (seconds) corresponding to mam_mom_fixed_ymd at which the prescribed aerosol flux data is fixed if mam_mom_type is 'FIXED'. | `0` | +| `mam_mom_bubble_thickness` | Bubble film thickness (in m) for marine organic aerosol emission mechanism. The physically reasonable range is approximately (0.1 - 1) x 10^ -6. | `0.1e-6` | +| `mam_mom_mixing_state` | Switch to select mixing state assumption in marine organic aerosol code. Currently implemented options: 0 : total external mixture, add to mass; 1 : total external mixture, replace mass; 2 : total internal mixture, add to mass; 3 : total internal mixture, replace mass. | `0` [Note: set to 3 in the atm_in namelist] | +| `mam_mom_parameterization` | Selection of alternate parameterizations for marine organic matter emissions. Set fmoa=1 for Burrows et al. (2014) [@burrows_physically_2014] parameterization; fmoa=2 for Gantt et al. (2011) [@gantt_wind_2011] parameterization; fmoa=3 for simple parameterization based on Quinn et al., 2014; [@quinn_contribution_2014] fmoa=4 for Rinaldi et al. (JGR, 2013).* [@rinaldi_is_2013] | `1` | + +*Note: non-default values have not been carefully tested and may not work as expected. + +## Five-mode Modal Aerosol Model + +| Parameter | Description | Default value | +| ------------------------------- | ----------------------------------------------------------------------------------- | --------------------------- | +| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | + +## Predicted Particle Properties + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `do_prescribed_ccn` | Turn on the prescribed CCN if true | `false` | +| `micro_aerosolactivation` | Turn on aerosol activation if true | `true` | +| `micro_p3_lookup_dir` | Directory of P3 look-up tables | `inputdata/atm/cam/physprops` | +| `micro_p3_tableversion` | P3 look-up table Version | `4.1.2` | +| `micro_subgrid_cloud` | Sub-grid cloud properties | `true` | +| `micro_tend_output` | Output of P3 microphysical process rates | `false` | +| `p3_accret_coeff` | Tunable parameter for adjusting rain accretion efficiency | `117.25` | +| `p3_autocon_coeff` | Tunable parameter for adjusting droplet autoconversion efficiency | `30500` | +| `p3_embryonic_rain_size` | Radius of embryomic raindrops from auto-conversion | `0.000025` (m) | +| `p3_max_mean_rain_size` | Upper bound of mean raindrop diameter | `0.005` (m) | +| `p3_mincdnc` | Lower bound of droplet number concentration | `20.d6` (# m-3) | +| `p3_nc_autocon_expon` | Nc exponent in droplet auto-conversion | `-1.1` | +| `p3_qc_accret_expon` | Qc exponent in rain accretion | `1.15` | +| `p3_qc_autocon_expon` | Qc exponeent in droplet autoconversion | `3.19` | +| `p3_wbf_coeff` | Tunable parameter for adjusting WBF efficiency | `1.0` | +| `do_cooper_inp3` | Turn on Cooper ice nucleation scheme if true | `false` | + +## Rapid Radiative Transfer Model for GCMs + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `iradsw` | Frequency for updating shortwave fluxes and heating rate; iradsw > 0 interpreted as number of timesteps, iradsw < 0 interpreted as hours; iradsw = 0 disables shortwave radiation entirely | `-1` | +| `iradlw` | Frequency for updating longwave fluxes and heating rate; iradlw > 0 interpreted as number of timesteps, iradlw < 0 interpreted as hours; iradlw = 0 disables longwave radiation entirely | `-1` | +| `irad_always` | Length of time in timesteps (irad_always > 0) or in hours (irad_always < 0) SW/LW radiation will be run continuously from the start of an initial or restart run | `0` | +| `use_rad_dt_cosz` | If true, use the radiation dt for all cosz calculations; calculates solar zenith angle averaged over a time step. In default model solar zenith angle is held constant over time | `.true.`
(set by namelist_defaults_eam.xml for default physics) | +| `spectralflux` | Calculate fluxes (up and down) per band | `.false.` | +| `liqcldoptics` | Choice of cloud optical property parameterization for liquid clouds. Valid options are ‘slingo’ or ‘gammadist’ | `gammadist` | +| `icecldoptics` | Choice of cloud optical property parameterization for ice clouds. Valid options are ‘ebertcurry’ or ‘mitchell’ | `mitchell` | + +## Zhang and McFarlane deep convection scheme + +| ZM Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_ke` | Tunable evaporation efficiency in ZM deep convection scheme | `2.5E-6` | +| `zmconv_tau` | Relaxation time in ZM deep convection scheme | `3600` | +| `zmconv_dmpdz` | Parcel fractional mass entrainment rate | `-0.7E-3` | +| `zmconv_alfa` | Initial downdraft mass flux fraction | `0.14D0` | +| `zmconv_tiedke_add` | Temperature perturbation of an air parcel | `0.8D0` | +| `zmconv_cape_cin` | Number of negative buoyancy regions that are allowed | `1` | + +| dCAPE-ULL Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_trigdcape_ull` | DCAPE trigger along with unrestricted launching level for ZM deep convection scheme | `.true.` | +| `zmconv_trig_dcape_only` | DCAPE only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the dcape only trigger. | +| `zmconv_trig_ull_only` | Use unrestricted launching level (ULL) only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the ull only trigger. | + +| Conv. micro. Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_microp` | Convective microphysics option in ZM convection scheme | `true` | +| `zmconv_auto_fac` | Cloud droplet-rain autoconversion enhancement factor in the convective microphysics scheme | `7.0` | +| `zmconv_accr_fac` | Cloud droplet-rain accretion enhancement factor in the convective microphysics scheme | `1.5` | +| `zmconv_micro_dcs` | Autoconversion size threshold for cloud ice to snow (m) | `150.E-6` | + +| Mass flux adj. Parameters | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_clos_dyn_adj` | Apply mass flux adjustment to ZM convection scheme | `true` | + +| MCSP Parameters | Description | Default value | +| ---------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `zmconv_mcsp_heat_coeff` | MCSP heating coefficient | `0.3` | +| `zmconv_mcsp_moisture_coeff` | MCSP moisture coefficient | `0.0` | +| `zmconv_mcsp_uwind_coeff` | MCSP zonal wind coefficient | `0.0` | +| `zmconv_mcsp_vwind_coeff` | MCSP meridional wind coefficient | `0.0` | + +## Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package + +| Parameter | Description | Default value | +| ------------------------- | ----------------------------------------------------------------- | ---------------------- | +| `cosp_lite` | This namelist sets cosp_ncolumns=10 and cosp_nradsteps=3 (appropriate for COSP statistics derived from seasonal averages), and runs MISR, ISCCP, MODIS, and CALIPSO lidar simulators (cosp_lmisr_sim=.true.,cosp_lisccp_sim=.true., cosp_lmodis_sim=.true.,cosp_llidar_sim=.true.). | `false` | From f8c1ba51ea633bb799d19cf289624bc12cd560ca Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 26 Apr 2024 10:23:18 -0700 Subject: [PATCH 231/310] Small fix for formatting of EAM docs --- components/eam/docs/user-guide/aerosol_phys_prop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index d8791a7e14b..90a84d1cfba 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -15,7 +15,7 @@ Key information - BC and POM hygroscopicity values are updated by Shan et al. (2024). -- Some description/reference about the 5th mode. +- Some description/reference about the 5th mode. ## Included fields From 82c3169de22c5e9c57798eafdd8f4ae84a9649b4 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 26 Apr 2024 10:38:40 -0700 Subject: [PATCH 232/310] Add MAM5 aerosol properties citation in EAM docs --- components/eam/docs/user-guide/aerosol_phys_prop.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index 90a84d1cfba..70fb59907ff 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -5,17 +5,17 @@ Key information -- Original physical properties of aerosols are documented in Liu et al. (2012) [@liu_toward_2012]. Detailed information is included in the supplement. +- Original physical properties of aerosols are documented in Liu et al. (2012). [@liu_toward_2012] Detailed information is included in the supplement. -- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020) [@wang_aerosols_2020]. +- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020). [@wang_aerosols_2020] -- Marine organic aerosol properties are defined in Burrows et al. (2022) [@burrows_oceanfilms_2022]. +- Marine organic aerosol properties are defined in Burrows et al. (2022). [@burrows_oceanfilms_2022] -- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022) [@feng_global_2022]. +- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022). [@feng_global_2022] - BC and POM hygroscopicity values are updated by Shan et al. (2024). -- Some description/reference about the 5th mode. +- Physical properties of the fifth mode aerosols are documented by Ke et al. (2024). ## Included fields @@ -25,7 +25,7 @@ Key information - Nominal geometric mean diameter and its lower/upper bound of values for each mode -- Coefficients of polynomial expression (lookup-table) for extinction, absorption, and asymmetry parameter calculations. +- Coefficients of polynomial expression (lookup-table) for extinction, absorption, and asymmetry parameter calculations - Aerosol refractive index table needed for interpolation (lookup-table) calculation (for different wavelengths) From e2bcd99028bef6287f67aad530afeb9d750969b5 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 26 Apr 2024 11:25:42 -0700 Subject: [PATCH 233/310] Fix reference to ELM docs in EAM docs --- components/eam/docs/user-guide/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 679372bd676..4be8471cbb6 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -95,7 +95,7 @@ This file is computed via a complex procedure that starts with high resolution d Info needed on land-use land cover change / land surface data -Refer to [ELM documentation](../../../elm/docs/index.md). +Refer to [ELM documentation](https://docs.e3sm.org/E3SM/ELM/). #### Ocean/sea ice From 7b44cd89dc3ad0d0c6f28202edc68ac887a165d2 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Fri, 26 Apr 2024 11:57:23 -0700 Subject: [PATCH 234/310] Fix top-level description of MAM4 and MAM5 in EAM docs --- components/eam/docs/tech-guide/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index 4006a9bd913..7897d53c358 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -26,9 +26,9 @@ This Technical Guide describes the physics of EAM. ### Aerosol -- [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv3. +- [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv1 and EAMv2. It has been updated to MAM5 with the inclusion of the coarse-mode stratospheric aerosols in EAMv3. -- [MAM5](mam5.md): The parameterization scheme to represent stratospheric sulfate aerosols in EAMv3. +- [MAM5](mam5.md): The primary parameterization scheme to represent aerosols in EAMv3. The fifth mode is the stratospheric aerosols mode, which added upon previous MAM4 (above) to represent sulfate aerosols in the stratosphere. - [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. From e029dcea6b4311260cb8c688652863ad3978d436 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sat, 27 Apr 2024 11:15:00 -0400 Subject: [PATCH 235/310] fixing bib linking --- .../docs/eam_refs.bib => docs/refs/eam.bib | 69 +------------------ .../elm/docs/refs.bib => docs/refs/elm.bib | 0 mkdocs.yaml | 2 +- 3 files changed, 2 insertions(+), 69 deletions(-) rename components/eam/docs/eam_refs.bib => docs/refs/eam.bib (92%) rename components/elm/docs/refs.bib => docs/refs/elm.bib (100%) diff --git a/components/eam/docs/eam_refs.bib b/docs/refs/eam.bib similarity index 92% rename from components/eam/docs/eam_refs.bib rename to docs/refs/eam.bib index 667b6c8f608..ff4415a519b 100644 --- a/components/eam/docs/eam_refs.bib +++ b/docs/refs/eam.bib @@ -66,23 +66,6 @@ @article{milbrandt_parameterization_2016 pages = {975--995}, } -@article{liu_toward_2012, - title = {Toward a minimal representation of aerosols in climate models: description and evaluation in the {Community} {Atmosphere} {Model} {CAM5}}, - volume = {5}, - issn = {1991-959X}, - shorttitle = {Toward a minimal representation of aerosols in climate models}, - url = {https://gmd.copernicus.org/articles/5/709/2012/}, - doi = {10.5194/gmd-5-709-2012}, - language = {English}, - number = {3}, - urldate = {2024-03-29}, - journal = {Geoscientific Model Development}, - author = {Liu, X. and Easter, R. C. and Ghan, S. J. and Zaveri, R. and Rasch, P. and Shi, X. and Lamarque, J.-F. and Gettelman, A. and Morrison, H. and Vitt, F. and Conley, A. and Park, S. and Neale, R. and Hannay, C. and Ekman, A. M. L. and Hess, P. and Mahowald, N. and Collins, W. and Iacono, M. J. and Bretherton, C. S. and Flanner, M. G. and Mitchell, D.}, - month = may, - year = {2012}, - pages = {709--739}, -} - @article{liu_ice_2005, title = {Ice nucleation parameterization for global models}, issn = {,}, @@ -374,23 +357,6 @@ @article{pincus_fast_2003 pages = {2002JD003322}, } -@article{burrows_oceanfilms_2022, - title = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}: {Natural} {Films} and {Interfaces} via {Langmuir} {Molecular} {Surfactants}) sea spray organic aerosol emissions – implementation in a global climate model and impacts on clouds}, - volume = {22}, - issn = {1680-7324}, - shorttitle = {{OCEANFILMS} ({Organic} {Compounds} from {Ecosystems} to {Aerosols}}, - url = {https://acp.copernicus.org/articles/22/5223/2022/}, - doi = {10.5194/acp-22-5223-2022}, - language = {en}, - number = {8}, - urldate = {2024-03-29}, - journal = {Atmospheric Chemistry and Physics}, - author = {Burrows, Susannah M. and Easter, Richard C. and Liu, Xiaohong and Ma, Po-Lun and Wang, Hailong and Elliott, Scott M. and Singh, Balwinder and Zhang, Kai and Rasch, Philip J.}, - month = apr, - year = {2022}, - pages = {5223--5251}, -} - @article{liu_description_2016, title = {Description and evaluation of a new four-mode version of the {Modal} {Aerosol} {Module} ({MAM4}) within version 5.3 of the {Community} {Atmosphere} {Model}}, volume = {9}, @@ -407,23 +373,6 @@ @article{liu_description_2016 pages = {505--522}, } -@article{wang_aerosols_2020, - title = {Aerosols in the {E3SM} {Version} 1: {New} {Developments} and {Their} {Impacts} on {Radiative} {Forcing}}, - volume = {12}, - issn = {1942-2466, 1942-2466}, - shorttitle = {Aerosols in the {E3SM} {Version} 1}, - url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2019MS001851}, - doi = {10.1029/2019MS001851}, - language = {en}, - number = {1}, - urldate = {2024-03-29}, - journal = {Journal of Advances in Modeling Earth Systems}, - author = {Wang, Hailong and Easter, Richard C. and Zhang, Rudong and Ma, Po‐Lun and Singh, Balwinder and Zhang, Kai and Ganguly, Dilip and Rasch, Philip J. and Burrows, Susannah M. and Ghan, Steven J. and Lou, Sijia and Qian, Yun and Yang, Yang and Feng, Yan and Flanner, Mark and Leung, L. Ruby and Liu, Xiaohong and Shrivastava, Manish and Sun, Jian and Tang, Qi and Xie, Shaocheng and Yoon, Jin‐Ho}, - month = jan, - year = {2020}, - pages = {e2019MS001851}, -} - @article{wu_development_2022, title = {Development and {Evaluation} of {E3SM}‐{MOSAIC}: {Spatial} {Distributions} and {Radiative} {Effects} of {Nitrate} {Aerosol}}, volume = {14}, @@ -493,23 +442,6 @@ @article{hodzic_rethinking_2016 pages = {7917--7941}, } -@article{feng_global_2022, - title = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1: {Impact} of {Increasing} {Model} {Resolution}}, - volume = {14}, - issn = {1942-2466, 1942-2466}, - shorttitle = {Global {Dust} {Cycle} and {Direct} {Radiative} {Effect} in {E3SM} {Version} 1}, - url = {https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2021MS002909}, - doi = {10.1029/2021MS002909}, - language = {en}, - number = {7}, - urldate = {2024-03-29}, - journal = {Journal of Advances in Modeling Earth Systems}, - author = {Feng, Y. and Wang, H. and Rasch, P. J. and Zhang, K. and Lin, W. and Tang, Q. and Xie, S. and Hamilton, D. S. and Mahowald, N. and Yu, H.}, - month = jul, - year = {2022}, - pages = {e2021MS002909}, -} - @article{kok_improved_2014, title = {An improved dust emission model – {Part} 1: {Model} description and comparison against measurements}, volume = {14}, @@ -1100,5 +1032,6 @@ @article{neale_description_2012 language = {en}, urldate = {2024-04-25}, author = {Neale, Richard B. and Gettelman, Andrew and Park, Sungsu and Chen, Chih-Chieh and Lauritzen, Peter H. and Williamson, David L. and Conley, Andrew J. and Kinnison, Doug and Marsh, Dan and Smith, Anne K. and Vitt, Francis M. and Garcia, Rolando and Lamarque, Jean-Francois and Mills, Michael J. and Tilmes, Simone and Morrison, Hugh and Cameron-Smith, Philip and Collins, William D. and Iacono, Michael J. and Easter, Richard C. and Liu, Xiaohong and Ghan, Steven J. and Rasch, Philip J. and Taylor, Mark A.}, + journal = {UNKNOWN}, year = {2012}, } diff --git a/components/elm/docs/refs.bib b/docs/refs/elm.bib similarity index 100% rename from components/elm/docs/refs.bib rename to docs/refs/elm.bib diff --git a/mkdocs.yaml b/mkdocs.yaml index 7b7e88c62f8..f5b4bb37446 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -53,8 +53,8 @@ markdown_extensions: plugins: - monorepo - bibtex: - bib_file: components/elm/docs/refs.bib - search + bib_dir: docs/refs extra_javascript: - javascript/mathjax.js From 7aff0dcf420d30f19323181552975c6c95c4d05e Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sat, 27 Apr 2024 11:21:26 -0400 Subject: [PATCH 236/310] fix misplaced search entry in plugins --- mkdocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yaml b/mkdocs.yaml index f5b4bb37446..94d9d26027c 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -52,8 +52,8 @@ markdown_extensions: plugins: - monorepo - - bibtex: - search + - bibtex: bib_dir: docs/refs extra_javascript: From 3701a6f6e4252b3c6c86f0a64bd7639075d9abb9 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sat, 27 Apr 2024 11:29:08 -0400 Subject: [PATCH 237/310] make reference lists into lists and fix typos --- components/eam/docs/tech-guide/clubb.md | 8 ++++---- components/eam/docs/tech-guide/cosp.md | 8 ++++---- components/eam/docs/tech-guide/homme.md | 8 ++++---- components/eam/docs/tech-guide/vbs.md | 2 +- components/eam/docs/user-guide/index.md | 4 ++-- components/eam/mkdocs.yml | 4 ++-- components/elm/mkdocs.yml | 4 ++-- components/mosart/mkdocs.yml | 4 ++-- 8 files changed, 21 insertions(+), 21 deletions(-) diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md index 7d979dbf900..49f66cde31a 100644 --- a/components/eam/docs/tech-guide/clubb.md +++ b/components/eam/docs/tech-guide/clubb.md @@ -6,10 +6,10 @@ The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameteriza ### References -Larson (2022) [@larson_clubb-silhs_2022] -Bogenschutz et al. (2018) [@bogenschutz_path_2018] -Larson and Golaz (2005) [@larson_using_2005] -Golaz et al. (2002) [@golaz_pdf-based_2002] +- Larson (2022) [@larson_clubb-silhs_2022] +- Bogenschutz et al. (2018) [@bogenschutz_path_2018] +- Larson and Golaz (2005) [@larson_using_2005] +- Golaz et al. (2002) [@golaz_pdf-based_2002] ## Namelist parameters diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md index 3fee6bb6a15..8cd1db8379d 100644 --- a/components/eam/docs/tech-guide/cosp.md +++ b/components/eam/docs/tech-guide/cosp.md @@ -6,10 +6,10 @@ The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator P ### References -Zhang et al. (2024) [@zhang_understanding_2024] -Zhang et al. (2019) [@zhang_evaluation_2019] -Swales et al. (2018) [@swales_cloud_2018] -Bodas-Salcedo et al. (2011) [@bodas-salcedo_cosp_2011] +- Zhang et al. (2024) [@zhang_understanding_2024] +- Zhang et al. (2019) [@zhang_evaluation_2019] +- Swales et al. (2018) [@swales_cloud_2018] +- Bodas-Salcedo et al. (2011) [@bodas-salcedo_cosp_2011] ## To turn on COSP outputs diff --git a/components/eam/docs/tech-guide/homme.md b/components/eam/docs/tech-guide/homme.md index 7c9923f3f20..48c693a1dfe 100644 --- a/components/eam/docs/tech-guide/homme.md +++ b/components/eam/docs/tech-guide/homme.md @@ -6,10 +6,10 @@ EAM using the a dynamical core (dycore) from the High Order Method Modeling Env ### References -Taylor et al. (2020) [@taylor_energy_2020] -Bradley et al. (2022) [@bradley_islet_2022] -Guba et al. (2014) [@guba_spectral_2014] -Taylor and Fournier (2010) [@taylor_compatible_2010] +- Taylor et al. (2020) [@taylor_energy_2020] +- Bradley et al. (2022) [@bradley_islet_2022] +- Guba et al. (2014) [@guba_spectral_2014] +- Taylor and Fournier (2010) [@taylor_compatible_2010] ## Namelist parameters diff --git a/components/eam/docs/tech-guide/vbs.md b/components/eam/docs/tech-guide/vbs.md index 77e5a479767..23979470596 100644 --- a/components/eam/docs/tech-guide/vbs.md +++ b/components/eam/docs/tech-guide/vbs.md @@ -2,4 +2,4 @@ ## Overview -A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). [@shrivastava_global_2015] It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). [@hodzic_rethinking_2016] The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [Users's Guide](../user-guide/index.md). +A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). [@shrivastava_global_2015] It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). [@hodzic_rethinking_2016] The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [User Guide](../user-guide/index.md). diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 4be8471cbb6..53ba7e8b64f 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -1,7 +1,7 @@ -# EAM Users's Guide +# EAM User Guide -This Users's Guide describes how to set up and run EAM. +This User Guide describes how to set up and run EAM. ## Table of contents diff --git a/components/eam/mkdocs.yml b/components/eam/mkdocs.yml index f64ab33620f..d5a055da150 100644 --- a/components/eam/mkdocs.yml +++ b/components/eam/mkdocs.yml @@ -2,6 +2,6 @@ site_name: EAM nav: - Introduction: 'index.md' - - Users's Guide: user-guide/index.md - - Developers's Guide: dev-guide/index.md + - User Guide: user-guide/index.md + - Developer Guide: dev-guide/index.md - Technical Guide: tech-guide/index.md diff --git a/components/elm/mkdocs.yml b/components/elm/mkdocs.yml index 900934e3494..55a1c82b2a4 100644 --- a/components/elm/mkdocs.yml +++ b/components/elm/mkdocs.yml @@ -2,6 +2,6 @@ site_name: ELM nav: - Introduction: 'index.md' - - Users's Guide: user-guide/index.md - - Developers's Guide: dev-guide/index.md + - User Guide: user-guide/index.md + - Developer Guide: dev-guide/index.md - Technical Guide: tech-guide/index.md diff --git a/components/mosart/mkdocs.yml b/components/mosart/mkdocs.yml index 6d80ef7c93d..cae190f0302 100644 --- a/components/mosart/mkdocs.yml +++ b/components/mosart/mkdocs.yml @@ -2,6 +2,6 @@ site_name: MOSART nav: - Introduction: 'index.md' - - Users's Guide: user-guide/index.md - - Developers's Guide: dev-guide/index.md + - User Guide: user-guide/index.md + - Developer Guide: dev-guide/index.md - Technical Guide: tech-guide/index.md From efdf1e53166e47b0c0eed9f1dd8bfb316dda5315 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sat, 27 Apr 2024 11:31:56 -0400 Subject: [PATCH 238/310] unify how we say developer/user/technical guide --- components/eam/docs/dev-guide/index.md | 2 +- components/eam/docs/index.md | 6 +++--- components/elm/docs/index.md | 6 +++--- components/mosart/docs/index.md | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/eam/docs/dev-guide/index.md b/components/eam/docs/dev-guide/index.md index 553bf5f3697..5376c6aad5b 100644 --- a/components/eam/docs/dev-guide/index.md +++ b/components/eam/docs/dev-guide/index.md @@ -1 +1 @@ -start of the EAM Developer's Guide +start of the EAM Developer Guide diff --git a/components/eam/docs/index.md b/components/eam/docs/index.md index 6632c22ca62..100b8edb3f1 100644 --- a/components/eam/docs/index.md +++ b/components/eam/docs/index.md @@ -2,6 +2,6 @@ Some introductory text here -* The [EAM User's Guide](user-guide/index.md) explains how to control EAM when its running within E3SM. -* The [EAM Developer's Guide](dev-guide/index.md) explains EAM data structures and how to write new code. -* The [EAM Techincal Guide](tech-guide/index.md) explains the science behind EAM's code +* The [EAM User Guide](user-guide/index.md) explains how to control EAM when its running within E3SM. +* The [EAM Developer Guide](dev-guide/index.md) explains EAM data structures and how to write new code. +* The [EAM Technical Guide](tech-guide/index.md) explains the science behind EAM's code diff --git a/components/elm/docs/index.md b/components/elm/docs/index.md index 27c44c3cac1..3c9b7edd07b 100644 --- a/components/elm/docs/index.md +++ b/components/elm/docs/index.md @@ -2,6 +2,6 @@ Some introductory text here -* The [ELM User's Guide](user-guide/index.md) explains how to control ELM when its running within E3SM and how to run in Coupler-bypass mode -* The [ELM Developer's Guide](dev-guide/index.md) explains ELM data structures and how to develop new code. -* The [ELM Techincal Guide](tech-guide/index.md) explains the science behind ELM's code +* The [ELM User Guide](user-guide/index.md) explains how to control ELM when its running within E3SM and how to run in Coupler-bypass mode +* The [ELM Developer Guide](dev-guide/index.md) explains ELM data structures and how to develop new code. +* The [ELM Technical Guide](tech-guide/index.md) explains the science behind ELM's code diff --git a/components/mosart/docs/index.md b/components/mosart/docs/index.md index c1ac0ac3b47..acd5e539181 100644 --- a/components/mosart/docs/index.md +++ b/components/mosart/docs/index.md @@ -2,6 +2,6 @@ Some introductory text here -* The [MOSART User's Guide](user-guide/index.md) explains how to control MOSART when its running within E3SM -* The [MOSART Developer's Guide](dev-guide/index.md) explains MOSART data structures and how to develop new code. -* The [MOSART Techincal Guide](tech-guide/index.md) explains the science behind MOSART's code +* The [MOSART User Guide](user-guide/index.md) explains how to control MOSART when its running within E3SM +* The [MOSART Developer Guide](dev-guide/index.md) explains MOSART data structures and how to develop new code. +* The [MOSART Technical Guide](tech-guide/index.md) explains the science behind MOSART's code From 10e0130a0d12b7c9e0d1167f07645902846fe156 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sat, 27 Apr 2024 11:36:57 -0400 Subject: [PATCH 239/310] fix linting errors --- components/eam/docs/dev-guide/index.md | 4 +++- components/mosart/docs/index.md | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/eam/docs/dev-guide/index.md b/components/eam/docs/dev-guide/index.md index 5376c6aad5b..6879c32cbe3 100644 --- a/components/eam/docs/dev-guide/index.md +++ b/components/eam/docs/dev-guide/index.md @@ -1 +1,3 @@ -start of the EAM Developer Guide +# EAM Developer Guide + +coming soon. diff --git a/components/mosart/docs/index.md b/components/mosart/docs/index.md index acd5e539181..9b670f9a3de 100644 --- a/components/mosart/docs/index.md +++ b/components/mosart/docs/index.md @@ -1,4 +1,4 @@ -#Model for Scale Adaptive River Transport (MOSART) +# Model for Scale Adaptive River Transport (MOSART) Some introductory text here From 432757a4ad3632925f2d34b6eafc4a38c7e183cd Mon Sep 17 00:00:00 2001 From: Hsiang-He Lee Date: Mon, 29 Apr 2024 13:40:15 -0500 Subject: [PATCH 240/310] skip gas_ac calculation when nstep=0 --- .../eam/src/chemistry/mozart/chemistry.F90 | 84 +++++++++++-------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/components/eam/src/chemistry/mozart/chemistry.F90 b/components/eam/src/chemistry/mozart/chemistry.F90 index 57412d8f818..f9679f619f4 100644 --- a/components/eam/src/chemistry/mozart/chemistry.F90 +++ b/components/eam/src/chemistry/mozart/chemistry.F90 @@ -1574,38 +1574,43 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o, f end if ! HHLEE 20210923 if (history_gaschmbudget_2D_levels .or. history_chemdyg_summary) then - ftem_layers = 0.0_r8 - gas_ac_layers = 0.0_r8 + if( nstep == 0 ) then + ftem_layers = 0.0_r8 + gas_ac_layers = 0.0_r8 + else + ftem_layers = 0.0_r8 + gas_ac_layers = 0.0_r8 - gas_ac_idx = pbuf_get_index(gas_ac_name(n)) - call pbuf_get_field(pbuf, gas_ac_idx, gas_ac ) + gas_ac_idx = pbuf_get_index(gas_ac_name(n)) + call pbuf_get_field(pbuf, gas_ac_idx, gas_ac ) - if (gaschmbudget_2D_L1_e .lt. gaschmbudget_2D_L1_s .or. gaschmbudget_2D_L2_e .lt. gaschmbudget_2D_L2_s .or. & - gaschmbudget_2D_L3_e .lt. gaschmbudget_2D_L3_s .or. gaschmbudget_2D_L4_e .lt. gaschmbudget_2D_L4_s ) then - call endrun('chem_readnl: ERROR 2D chem diags layers, layer ending index is less than starting index') - end if + if (gaschmbudget_2D_L1_e .lt. gaschmbudget_2D_L1_s .or. gaschmbudget_2D_L2_e .lt. gaschmbudget_2D_L2_s .or. & + gaschmbudget_2D_L3_e .lt. gaschmbudget_2D_L3_s .or. gaschmbudget_2D_L4_e .lt. gaschmbudget_2D_L4_s ) then + call endrun('chem_readnl: ERROR 2D chem diags layers, layer ending index is less than starting index') + end if - do k= gaschmbudget_2D_L1_s, gaschmbudget_2D_L1_e ! 0-90 hPa - ftem_layers(:ncol,1) = ftem_layers(:ncol,1) + ftem(:ncol,k) - gas_ac_layers(:ncol,1) = gas_ac_layers(:ncol,1) + gas_ac(:ncol,k) - end do - do k= gaschmbudget_2D_L2_s, gaschmbudget_2D_L2_e ! 90-300 hPa - ftem_layers(:ncol,2) = ftem_layers(:ncol,2) + ftem(:ncol,k) - gas_ac_layers(:ncol,2) = gas_ac_layers(:ncol,2) + gas_ac(:ncol,k) - end do - do k= gaschmbudget_2D_L3_s, gaschmbudget_2D_L3_e ! 300-850 hPa - ftem_layers(:ncol,3) = ftem_layers(:ncol,3) + ftem(:ncol,k) - gas_ac_layers(:ncol,3) = gas_ac_layers(:ncol,3) + gas_ac(:ncol,k) - end do - do k= gaschmbudget_2D_L4_s, gaschmbudget_2D_L4_e ! 850 hPa - surface - ftem_layers(:ncol,4) = ftem_layers(:ncol,4) + ftem(:ncol,k) - gas_ac_layers(:ncol,4) = gas_ac_layers(:ncol,4) + gas_ac(:ncol,k) - end do - if (history_gaschmbudget_2D_levels ) then - call outfld(trim(solsym(n))//'_2DMSB_L1', ftem_layers(:ncol,1), pcols, lchnk) - call outfld(trim(solsym(n))//'_2DMSB_L2', ftem_layers(:ncol,2), pcols, lchnk) - call outfld(trim(solsym(n))//'_2DMSB_L3', ftem_layers(:ncol,3), pcols, lchnk) - call outfld(trim(solsym(n))//'_2DMSB_L4', ftem_layers(:ncol,4), pcols, lchnk) + do k= gaschmbudget_2D_L1_s, gaschmbudget_2D_L1_e ! 0-90 hPa + ftem_layers(:ncol,1) = ftem_layers(:ncol,1) + ftem(:ncol,k) + gas_ac_layers(:ncol,1) = gas_ac_layers(:ncol,1) + gas_ac(:ncol,k) + end do + do k= gaschmbudget_2D_L2_s, gaschmbudget_2D_L2_e ! 90-300 hPa + ftem_layers(:ncol,2) = ftem_layers(:ncol,2) + ftem(:ncol,k) + gas_ac_layers(:ncol,2) = gas_ac_layers(:ncol,2) + gas_ac(:ncol,k) + end do + do k= gaschmbudget_2D_L3_s, gaschmbudget_2D_L3_e ! 300-850 hPa + ftem_layers(:ncol,3) = ftem_layers(:ncol,3) + ftem(:ncol,k) + gas_ac_layers(:ncol,3) = gas_ac_layers(:ncol,3) + gas_ac(:ncol,k) + end do + do k= gaschmbudget_2D_L4_s, gaschmbudget_2D_L4_e ! 850 hPa - surface + ftem_layers(:ncol,4) = ftem_layers(:ncol,4) + ftem(:ncol,k) + gas_ac_layers(:ncol,4) = gas_ac_layers(:ncol,4) + gas_ac(:ncol,k) + end do + if (history_gaschmbudget_2D_levels ) then + call outfld(trim(solsym(n))//'_2DMSB_L1', ftem_layers(:ncol,1), pcols, lchnk) + call outfld(trim(solsym(n))//'_2DMSB_L2', ftem_layers(:ncol,2), pcols, lchnk) + call outfld(trim(solsym(n))//'_2DMSB_L3', ftem_layers(:ncol,3), pcols, lchnk) + call outfld(trim(solsym(n))//'_2DMSB_L4', ftem_layers(:ncol,4), pcols, lchnk) + endif endif if( nstep == 0 ) then @@ -1627,14 +1632,19 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o, f ! for the tropospheric budget diagnostics if (trim(solsym(n))=='O3' .or. trim(solsym(n))=='O3LNZ' .or. & trim(solsym(n))=='N2OLNZ' .or. trim(solsym(n))=='CH4LNZ') then - ftem_layers = 0.0_r8 - gas_ac_layers = 0.0_r8 - do k=1,pver - ftem_layers(:ncol,1) = ftem_layers(:ncol,1) + ftem(:ncol,k) * tropFlagInt(:ncol,k) - gas_ac_layers(:ncol,1) = gas_ac_layers(:ncol,1) + gas_ac(:ncol,k) * tropFlagInt(:ncol,k) - end do - if (history_gaschmbudget_2D_levels ) then - call outfld(trim(solsym(n))//'_2DMSB_trop', ftem_layers(:ncol,1), pcols, lchnk ) + if( nstep == 0 ) then + ftem_layers = 0.0_r8 + gas_ac_layers = 0.0_r8 + else + ftem_layers = 0.0_r8 + gas_ac_layers = 0.0_r8 + do k=1,pver + ftem_layers(:ncol,1) = ftem_layers(:ncol,1) + ftem(:ncol,k) * tropFlagInt(:ncol,k) + gas_ac_layers(:ncol,1) = gas_ac_layers(:ncol,1) + gas_ac(:ncol,k) * tropFlagInt(:ncol,k) + end do + if (history_gaschmbudget_2D_levels ) then + call outfld(trim(solsym(n))//'_2DMSB_trop', ftem_layers(:ncol,1), pcols, lchnk ) + endif endif if( nstep == 0 ) then From f0a9b5d54061ee3ce07be5fd6e59c95304a83159 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Mon, 29 Apr 2024 13:26:53 -0700 Subject: [PATCH 241/310] Combine MAM4 and MAM5 description in EAM docs --- components/eam/docs/tech-guide/index.md | 22 +++---------------- .../eam/docs/tech-guide/{mam4.md => mam.md} | 13 +++++++---- components/eam/docs/tech-guide/mam5.md | 11 ---------- .../docs/user-guide/namelist_parameters.md | 9 ++------ 4 files changed, 14 insertions(+), 41 deletions(-) rename components/eam/docs/tech-guide/{mam4.md => mam.md} (64%) delete mode 100644 components/eam/docs/tech-guide/mam5.md diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index 7897d53c358..aeb7e96bbbd 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -2,33 +2,19 @@ This Technical Guide describes the physics of EAM. -## Dynamics +## Dynamics and Physics - [HOMME](homme.md): The dynamical core used in EAMv3. -## Physics - -## Microphysics - - [P3](p3.md): The stratiform cloud microphysics scheme in EAMv3. -### Shallow convection / turbulence - - [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. -### Deep convection - - [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. -### Radiation - - [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. -### Aerosol - -- [MAM4](mam4.md): The primary parameterization scheme of aerosols in EAMv1 and EAMv2. It has been updated to MAM5 with the inclusion of the coarse-mode stratospheric aerosols in EAMv3. - -- [MAM5](mam5.md): The primary parameterization scheme to represent aerosols in EAMv3. The fifth mode is the stratospheric aerosols mode, which added upon previous MAM4 (above) to represent sulfate aerosols in the stratosphere. +- [MAM](mam.md): The primary parameterization schemes used to represent aerosols in EAMv3, consisting of the fifth mode in the stratospheric aerosols (MAM5), which was added on top of existing MAM4 schemes in EAMv1 and v2. - [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. @@ -36,11 +22,9 @@ This Technical Guide describes the physics of EAM. - [OCEANFILMS](oceanfilms.md): The parameterization of sea soray irganic aerosol emissions in EAMv3. -### Chemistry - - [chemUCI + Linoz v3](chemUCIlinozv3.md): The interactive atmospheric chemistry packages in EAMv3. -### Diagnostic outputs +## Diagnostic outputs - [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. diff --git a/components/eam/docs/tech-guide/mam4.md b/components/eam/docs/tech-guide/mam.md similarity index 64% rename from components/eam/docs/tech-guide/mam4.md rename to components/eam/docs/tech-guide/mam.md index 9120413c5dc..644d4b3af51 100644 --- a/components/eam/docs/tech-guide/mam4.md +++ b/components/eam/docs/tech-guide/mam.md @@ -1,17 +1,22 @@ -# Four-mode Modal Aerosol Module +# Modal Aerosol Module -## Overview +## MAM5 Overview -The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). [@liu_description_2016] It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) [@liu_description_2016] include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), [@wang_aerosols_2020] the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). [@burrows_oceanfilms_2022] In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), [@wu_development_2022] as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes . All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. +The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020; [@wang_aerosols_2020] Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). [@visioni_limitations_2022] Volcanic eruptions derived from Neely and Schmidt (2016). [@neely_iii_volcaneesm_2016] + +## MAM4 Overview + +The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). [@liu_description_2016] It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) [@liu_description_2016] include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), [@wang_aerosols_2020] the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). [@burrows_oceanfilms_2022] In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), [@wu_development_2022] as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes. All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. ### Sea salt In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) [@martensson_laboratory_2003] and Monahan et al. (1986), [@monahan_model_1986] and then redistributed to the three MAM4 size modes. -## Namelist parameters +## MAM Namelist parameters | Parameter | Description | Default value | | ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | +| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | | `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | | `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | | `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | diff --git a/components/eam/docs/tech-guide/mam5.md b/components/eam/docs/tech-guide/mam5.md deleted file mode 100644 index 8415f9b9a0e..00000000000 --- a/components/eam/docs/tech-guide/mam5.md +++ /dev/null @@ -1,11 +0,0 @@ -# Five-mode Modal Aerosol Model - -## Overview - -The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020; [@wang_aerosols_2020] Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021 [@visioni_limitations_2022]). Volcanic eruptions derived from Neely and Schmidt (2016) [@neely_iii_volcaneesm_2016]. - -## Namelist parameters - -| Parameter | Description | Default value | -| ------------------------------- | ----------------------------------------------------------------------------------- | --------------------------- | -| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | diff --git a/components/eam/docs/user-guide/namelist_parameters.md b/components/eam/docs/user-guide/namelist_parameters.md index b5ef1201897..b09e8c44ffd 100644 --- a/components/eam/docs/user-guide/namelist_parameters.md +++ b/components/eam/docs/user-guide/namelist_parameters.md @@ -55,10 +55,11 @@ | `vert_remap_alg` | Algorithm used to remap the vertically lagrangian levels back to the reference levels | `10` = strict monotonicity applied on top of a 2nd order accurate PPM method | | `se_ftype` | Controls how physics tendencies are applied. 0=”dribbled” in during dynamics timesteps. 1=”hard adjustment” after each physics timestep. 2=hybrid approach: hard adjustment for tracers, dribbled for remaining tendencies | `2` | -## Four-mode Modal Aerosol Module +## Modal Aerosol Module | Parameter | Description | Default value | | ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | +| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | | `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | | `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | | `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | @@ -82,12 +83,6 @@ *Note: non-default values have not been carefully tested and may not work as expected. -## Five-mode Modal Aerosol Model - -| Parameter | Description | Default value | -| ------------------------------- | ----------------------------------------------------------------------------------- | --------------------------- | -| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | - ## Predicted Particle Properties | Parameter | Description | Default value | From b11528d045a8d6817eb15797133c914de6aa9f46 Mon Sep 17 00:00:00 2001 From: Mauro Perego Date: Mon, 29 Apr 2024 14:35:24 -0600 Subject: [PATCH 242/310] Fix environment variables in config machine file --- cime_config/machines/config_machines.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 92bbe8ac77a..0b1a60d5302 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -263,9 +263,6 @@ /global/cfs/cdirs/e3sm/perl/lib/perl5-only-switch software MPI_Bcast - $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc-cmake-fix; else echo "$Albany_ROOT"; fi} - $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Trilinos_ROOT"; fi} - $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} $ENV{CRAY_NETCDF_HDF5PARALLEL_PREFIX} $ENV{CRAY_PARALLEL_NETCDF_PREFIX} 4000MB @@ -276,6 +273,9 @@ $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /global/cfs/cdirs/e3sm/3rdparty/adios2/2.9.1/cray-mpich-8.1.25/gcc-11.2.0; else echo "$ADIOS2_ROOT"; fi} Generic + $SHELL{if [ -z "$Albany_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/albany-e3sm-serial-release-gcc-cmake-fix; else echo "$Albany_ROOT"; fi} + $SHELL{if [ -z "$Trilinos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Trilinos_ROOT"; fi} + $SHELL{if [ -z "$Kokkos_ROOT" ]; then echo /global/common/software/e3sm/mali_tpls/trilinos-e3sm-serial-release-gcc; else echo "$Kokkos_ROOT"; fi} $SHELL{if [ -z "$ADIOS2_ROOT" ]; then echo /global/cfs/cdirs/e3sm/3rdparty/adios2/2.9.1/cray-mpich-8.1.25/nvidia-22.7; else echo "$ADIOS2_ROOT"; fi} From 8e8872b1b6d17b95e0ad62b5f212aed6a49ed8a5 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Mon, 29 Apr 2024 13:38:50 -0700 Subject: [PATCH 243/310] Fix code block formatting in EAM docs --- components/eam/docs/tech-guide/armdiags.md | 17 ++++++++++--- .../eam/docs/user-guide/aerosol_phys_prop.md | 6 ++--- .../docs/user-guide/emission_oxidant_files.md | 6 ++--- components/eam/docs/user-guide/index.md | 25 +++++++++++-------- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md index 0447092d663..6fe1f86817e 100644 --- a/components/eam/docs/tech-guide/armdiags.md +++ b/components/eam/docs/tech-guide/armdiags.md @@ -8,14 +8,23 @@ The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed To enable using ARM Diags for a simulation, often, a new tape that output at high-frequency over limited-area (nearest grid box to supported ARM site) needs to be included in the namelist file, an example as follows: -```text -fincl7 = 'PS','Q','T','Z3','CLOUD','CONCLD','CLDICE','CLDLIQ','FREQR','REI','REL','PRECT','TMQ','PRECC','TREFHT','QREFHT','OMEGA','CLDTOT','LHFLX','SHFLX','FLDS','FSDS','FLNS','FSNS','FLNSC','FSDSC','FSNSC','AODVIS','AODABS','LS_FLXPRC','LS_FLXSNW','LS_REFFRAIN','ZMFLXPRC','ZMFLXSNW','CCN1','CCN2','CCN3','CCN4','CCN5','num_a1','num_a2','num_a3','num_a4','so4_a1','so4_a2','so4_a3','AREL','TGCLDLWP','AQRAIN','ANRAIN','FREQR','PRECL','RELHUM' -fincl7lonlat='262.5e_36.6n','203.4e_71.3n','147.4e_2.0s','166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' +```fortran +fincl7 = 'PS','Q','T','Z3','CLOUD','CONCLD','CLDICE', + 'CLDLIQ','FREQR','REI','REL','PRECT','TMQ','PRECC', + 'TREFHT','QREFHT','OMEGA','CLDTOT','LHFLX','SHFLX', + 'FLDS','FSDS','FLNS','FSNS','FLNSC','FSDSC','FSNSC', + 'AODVIS','AODABS','LS_FLXPRC','LS_FLXSNW', + 'LS_REFFRAIN','ZMFLXPRC','ZMFLXSNW','CCN1','CCN2', + 'CCN3','CCN4','CCN5','num_a1','num_a2','num_a3', + 'num_a4','so4_a1','so4_a2','so4_a3','AREL','TGCLDLWP', + 'AQRAIN','ANRAIN','FREQR','PRECL','RELHUM' +fincl7lonlat='262.5e_36.6n','203.4e_71.3n','147.4e_2.0s', + '166.9e_0.5s','130.9e_12.4s','331.97e_39.09n' ``` Note that in this example fincl7 should set to write output at hourly (`nhtfrq = -1`). And here additional variables are included for ARM simulator analysis. The ARM site information is shown below: -```text +```fortran "sgpc1": ["97.5W 36.4N Oklahoma ARM"], "nsac1": ["156.6W 71.3N Barrow ARM"], diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index 70fb59907ff..13c93f985c5 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -45,7 +45,7 @@ Key information Species properties -```text +```fortran /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocpho_rrtmg_c130709_kPOM0.04.nc /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/ocphi_rrtmg_c100508.nc @@ -57,7 +57,7 @@ Species properties Mode properties -```text +```fortran /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_c141106.nc', /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode2_rrtmg_c130628.nc', /lcrc/group/e3sm/data/inputdata/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_c141106.nc', @@ -67,7 +67,7 @@ Mode properties ## Namelist -```text +```fortran mode_defs = 'mam5_mode1:accum:=', 'A:num_a1:N:num_c1:num_mr:+', 'A:so4_a1:N:so4_c1:sulfate:/lcrc/group/e3sm/data/inputdata/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', diff --git a/components/eam/docs/user-guide/emission_oxidant_files.md b/components/eam/docs/user-guide/emission_oxidant_files.md index cf1e8dc7897..e287b438646 100644 --- a/components/eam/docs/user-guide/emission_oxidant_files.md +++ b/components/eam/docs/user-guide/emission_oxidant_files.md @@ -58,7 +58,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio ### Historical (WCYCL20TR)/AMIP (F20TR) -```text +```fortran ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_1750-2015_1.9x2.5_c20170608.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1850-2014_c180205_kzm_1850_2014_volcano.nc', 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/emissions-cmip6_e3sm_SOAG0_elev_1850-2014_1.9x2.5_c20230201.nc', @@ -102,7 +102,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio ### F2010 -```text +```fortran ext_frc_cycle_yr = 2010 ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/chem_gases/2degrees/emissions-cmip6_NO2_aircraft_vertical_2010_clim_1.9x2.5_c20230213.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DECK_ne30/cmip6_mam4_so2_elev_1x1_2010_clim_c20190821.nc', @@ -153,7 +153,7 @@ E3SM uses a DMS surface concentration dataset developed from a dynamic ocean bio #### SSP370 -```text +```fortran ext_frc_specifier = 'NO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc', 'SO2 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_elev_2015-2100_c210216.nc', 'SOAG0 -> \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc', diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 53ba7e8b64f..84d7dfe733f 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -50,7 +50,7 @@ Refer to the following page for a [table](namelist_parameters.md) of namelist pa Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. -```text +```fortran inputdata/atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc ``` @@ -68,7 +68,7 @@ Linozv3 uses the ozone tendency, (net production minus loss) calculated from its ##### Historical files -```text +```fortran linoz_data_file = ‘linv3_1849-2101_CMIP6_Hist_10deg_58km_c20231207.nc’ linoz_data_path = '/lcrc/group/e3sm/data/inputdata/atm/cam/chem/trop_mozart/ub' linoz_data_type = 'INTERP_MISSING_MONTHS' @@ -82,7 +82,7 @@ The global elevation on the atmosphere grid is a key input dataset. The dataset EAMv3 NE30 data: -```text +```fortran inputdata/atm/cam/topo/USGS-gtopo30_ne30np4pg2_x6t-SGH.c20210614.nc' ``` @@ -105,19 +105,19 @@ The sea surface temperature and sea-ice coverage data used in F-case simulations `F20TR` -```text +```fortran inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_c20180213.nc ``` `F2010` -```text +```fortran inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_2010_clim_c20190821.nc ``` `F1850` -```text +```fortran inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_1850_clim_c20190125.nc ``` @@ -125,7 +125,7 @@ inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_1850_clim_c20190125.nc As with greenhouse gas emissions, solar input files are taken from the input4MIPs data collection that were prepared for CMIP6 Forcing Datasets. -```text +```fortran inputdata/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc ``` @@ -147,14 +147,17 @@ By default, EAM will output a set of monthly-averaged variables. Additional outp #### Example output specification -```text +```fortran nhtfrq = 0,-24,-6,-3 mfilt = 1,30,120,24 avgflag_pertape = 'A','A','A','I' fexcl1 = 'U10' # Removes U10 output from monthly files -fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', - 'TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file -fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file +fincl2 = 'PS','FLUT','PRECT','U200','V200','U850', + 'V850','TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file +fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT', + 'VBOT','TREFHT','FLUT','OMEGA500','TBOT', + 'U850','V850','U200','V200','T200','T500', + 'Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file ``` From 7b7f79a2571f15bcc71e20f4557e80af450d3745 Mon Sep 17 00:00:00 2001 From: dqwu Date: Mon, 29 Apr 2024 15:53:45 -0500 Subject: [PATCH 244/310] Adding more nodes using Ubuntu 22.04 for machine anlgce-ub22 Update the existing machine named anlgce-ub22 to include additional nodes that have recently been upgraded to Ubuntu 22.04. --- cime_config/machines/config_machines.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 486948892aa..a682aca9660 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -2064,7 +2064,7 @@ ANL CELS General Computing Environment (Linux) workstation (Ubuntu 22.04) - compute-386-01|compute-386-02 + compute-386-(01|02|03|05|07|08)|compute-240-(15) LINUX gnu mpich,openmpi From dca254a032408091dbf86e45d079f40432378019 Mon Sep 17 00:00:00 2001 From: Darin Comeau Date: Mon, 29 Apr 2024 18:14:00 -0500 Subject: [PATCH 245/310] Changing datestamp on JRA v1.5 runoff files to corrected versions --- .../data_comps/drof/cime_config/namelist_definition_drof.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/data_comps/drof/cime_config/namelist_definition_drof.xml b/components/data_comps/drof/cime_config/namelist_definition_drof.xml index 369e2396518..c4139552c70 100644 --- a/components/data_comps/drof/cime_config/namelist_definition_drof.xml +++ b/components/data_comps/drof/cime_config/namelist_definition_drof.xml @@ -205,10 +205,10 @@ RAF_9091.JRA.v1.3.runoff.180404.nc RAF_0304.JRA.v1.3.runoff.180404.nc - JRA.v1.5.runoff.%y.no_rofi_no_rofl.210505.nc + JRA.v1.5.runoff.%y.no_rofi_no_rofl.240411.nc - JRA.v1.5.runoff.%y.210505.nc + JRA.v1.5.runoff.%y.240411.nc JRA.v1.4.runoff.%y.no_rofi.190214.nc From 8c3fc18e9afd44bf4683e818d91114dce1f872b4 Mon Sep 17 00:00:00 2001 From: Elizabeth Hunke Date: Tue, 30 Apr 2024 18:41:56 -0600 Subject: [PATCH 246/310] Added/edited coupling information; added MPAS-Analysis scripts for QC comparisons --- .../docs/dev-guide/MPAS-Analysis_scripts.zip | Bin 0 -> 9198 bytes components/mpas-seaice/docs/dev-guide/index.md | 13 ++++++++++--- components/mpas-seaice/docs/tech-guide/index.md | 6 ++---- 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 components/mpas-seaice/docs/dev-guide/MPAS-Analysis_scripts.zip diff --git a/components/mpas-seaice/docs/dev-guide/MPAS-Analysis_scripts.zip b/components/mpas-seaice/docs/dev-guide/MPAS-Analysis_scripts.zip new file mode 100644 index 0000000000000000000000000000000000000000..7db9d8ca7cca4c93423358adf0e60fefd29691c9 GIT binary patch literal 9198 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 literal 0 HcmV?d00001 diff --git a/components/mpas-seaice/docs/dev-guide/index.md b/components/mpas-seaice/docs/dev-guide/index.md index 24fabfa73ac..be53365c8a0 100644 --- a/components/mpas-seaice/docs/dev-guide/index.md +++ b/components/mpas-seaice/docs/dev-guide/index.md @@ -27,6 +27,13 @@ The framework code includes shared modules for fundamental model operation. Sign Additionally, a number of shared operators exist to perform common operations on model data. These include geometric operations (e.g., length, area, and angle operations on the sphere or the plane), interpolation (linear, barycentric, Wachspress, radial basis functions, spline), vector and tensor operations (e.g., cross products, divergence), and vector reconstruction (e.g., interpolating from cell edges to cell centers). Most operators work on both spherical and planar meshes. +## Coupling of MPAS-seaice within E3SM + +Several files within MPAS-SI control the coupling of fields between MPAS-SI and other E3SM components via the coupler. A list of all variables being passed to and from MPAS-SI can be found in ``components/mpas-seaice/driver/mpassi_cpl_indices.F``. +Variables named with the prefix ``x2i`` are passed from the coupler to MPAS-SI, variables with the prefix ``i2x`` are passed from MPAS-SI to the coupler. +For example, all coupled variables are named with the following convention: +``index_i2x_Si_ithick`` refers to a state variable of ice (``Si``) that gets passed from MPAS-SI to the coupler (``i2x``) for the ice thickness (``ithick``). ``index_x2i_So_t`` refers to an ocean state variable (``So``) passed from the the coupler to MPAS-SI (``x2i``) for ocean temperature (``t``). + ## Icepack For changes to Icepack, please consult the [CICE Consortium's recommendations for code contributions](https://github.com/CICE-Consortium/About-Us/wiki/Contributing). @@ -313,11 +320,11 @@ $ ./E3SM-Polar-Developer.sh -s qcbaseline -k qcbase.nlk -e -d60 -a D12.qcbase.em To generate MPAS-Analysis plots from the CICE-QC runs and compare: -Copy the scripts in the file above to anvil or chrysalis - PROVIDE FILE +Copy the scripts in the file [MPAS-Analysis_scripts.zip](./MPAS-Analysis_scripts.zip) to anvil or chrysalis. -Edit each script for your run names, directories, etc (search for 'echmod' to find settings used for the qcPR19 comparison above) +Edit each script for your run names, directories, etc (search for 'echmod' to find settings used for a QC comparison) Edit and submit (on chrysalis) the job script 3 times, once for icepack, once for column, and finally for the comparison. -Browse the html output, e.g. navigate to +Browse the html output by navigating to the location indicated by ``htmlSubdirectory`` in the comparison script, e.g. ``https://web.lcrc.anl.gov/public/e3sm/diagnostic_output/ac.eclare/icepack-testing/D12.qcPR19.emc.qcPR19.snicar_active.eclare108213.anvil/mpas_analysis_output/`` diff --git a/components/mpas-seaice/docs/tech-guide/index.md b/components/mpas-seaice/docs/tech-guide/index.md index 7f0a2e4c940..3d6d4a1786d 100644 --- a/components/mpas-seaice/docs/tech-guide/index.md +++ b/components/mpas-seaice/docs/tech-guide/index.md @@ -88,11 +88,9 @@ This section is under construction, pending the full merge of BGC codes in Icepa ## Coupling of MPAS-seaice within E3SM -This section is under construction. Current text is quoted from the v1 and v2 overview papers. +This description is taken from the v1 overview paper (Golaz et al. 2019). Refer to that paper for further information. Coupling of the sea ice component to the ocean takes advantage of z star ocean coordinates and is a departure from the coupling of CICE and POP (Parallel Ocean Program) in CESM1. The weight of sea ice contributes to the ocean's barotropic mode, notably affecting the free surface over continental shelves. In shallow water depths at or less than the floating ice draft, the weight passed to the ocean model is limited to prevent evacuation of the underlying liquid column. When frazil ice forms in the ocean model, the volume of newly formed crystals is passed to the sea ice model with a fixed salinity of 4 PSU, rather than exchanging a freezing potential as in other models. Future versions of E3SM will permit progressive brine drainage to the ocean from the mushy layer physics used in MPAS-Seaice. For E3SMv1, brine drainage occurs internally in MPAS-Seaice for thermodynamic calculations, but for the sake of freshwater coupling, the ocean model only receives mass fluxes back from melted sea ice at the fixed salinity that it originally passed to its cryospheric counterpart (4 PSU). The ocean temperature immediately under the ice is the same as the liquid phase in the lowest layer of the sea ice model and is not fixed at −1.8 ◦C as is typical of previous generation coupled models. For the current version, we have addressed these long-standing ocean-ice coupling issues identified by the modeling community: explicit sea ice mass and salt exchange, a pressure force of the ice on the ocean, a basal sea ice temperature consistent with the ocean model's equation of state, and resolved inertial oscillations. -v1: Coupling of the sea ice component to the ocean takes advantage of z star ocean coordinates as described by Campin et al. (2008) and is a departure from the coupling of CICE and POP (Parallel Ocean Program) in CESM1. The weight of sea ice contributes to the ocean's barotropic mode, notably affecting the free surface over continental shelves. In shallow water depths at or less than the floating ice draft, the weight passed to the ocean model is limited to prevent evacuation of the underlying liquid column. When frazil ice forms in the ocean model, the volume of newly formed crystals is passed to the sea ice model with a fixed salinity of 4 PSU, rather than exchanging a freezing potential as in other models. Future versions of E3SM will permit progressive brine drainage to the ocean from the mushy layer physics used in MPAS-Seaice (Turner & Hunke, 2015). For E3SMv1, brine drainage occurs internally in MPAS-Seaice for thermodynamic calculations, but for the sake of freshwater coupling, the ocean model only receives mass fluxes back from melted sea ice at the fixed salinity that it originally passed to its cryospheric counterpart (4 PSU). The ocean temperature immediately under the ice is the same as the liquid phase in the lowest layer of the sea ice model and is not fixed at −1.8 ◦C as is typical of previous generation coupled models (Naughten et al., 2017). For the current version, we have addressed these long-standing ocean-ice coupling issues identified by the modeling community: explicit sea ice mass and salt exchange, a pressure force of the ice on the ocean, a basal sea ice temperature consistent with the ocean model's equation of state, and resolved inertial oscillations (Hibler et al., 2006; Lique et al., 2016; Schmidt et al., 2004). - -v2: The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content  assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conserva tion between sea ice and ocean models, this improvement greatly reduces a negative sea  ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model as described by Campin et al. (2008). 
Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. +This paragraph, taken from the v2 overview paper (Golaz et al. 2022), describes changes since v1. The most significant improvement to the sea ice climate since E3SMv1 was achieved with coupling changes associated with mushy-layer thermodynamics. Whereas the basal temperature of the ice was held fixed at -1.8◦C in E3SMv1, the new version of the model assumes the mushy liquidus basal temperature from the sea ice as described by Turner & Hunke (2015). Conversion of frazil ice from MPAS-Ocean with a fixed reference salinity of 4 PSU to the mushy layer now conserves to computational accuracy over a 500-year control integration. This was achieved by exchanging additional mass between the upper ocean and sea ice model to accommodate an assumed 25% mushy liquid content, assumed from heat and mass transferred adiabatically from the MPAS-Ocean frazil scheme active from a depth of 100 m. In addition to achieving perfect heat and mass conservation between sea ice and ocean models, this improvement greatly reduces a negative sea ice thickness bias in the summer Arctic reported by Golaz et al. (2019) for E3SMv1; it only minimally impacts Southern Ocean sea ice mass that was better simulated as compared to northern hemisphere sea ice in E3SMv1. Note that E3SM does not use virtual ice-ocean fluxes, but instead full mass and heat flux exchange consistent with a Boussinesq ocean model. Radiative coupling with the atmosphere still integrates across just two bands (visible and NIR) separated at 700nm, which does not fully exploit the five-band capability available in the delta-Eddington scheme. ### Prescribed Ice Mode From e5753f320a270d1263b90662179c52a6cf672b21 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 30 Apr 2024 22:21:37 -0500 Subject: [PATCH 247/310] Remove v3 refs from tech guide. --- .../eam/docs/tech-guide/chemUCIlinozv3.md | 2 +- components/eam/docs/tech-guide/index.md | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/components/eam/docs/tech-guide/chemUCIlinozv3.md b/components/eam/docs/tech-guide/chemUCIlinozv3.md index b47d2979e79..f60f85edfcf 100644 --- a/components/eam/docs/tech-guide/chemUCIlinozv3.md +++ b/components/eam/docs/tech-guide/chemUCIlinozv3.md @@ -1,4 +1,4 @@ -# chemUCI and Linoz v3 +# chemUCI and Linoz ## Overview diff --git a/components/eam/docs/tech-guide/index.md b/components/eam/docs/tech-guide/index.md index aeb7e96bbbd..437f5636edf 100644 --- a/components/eam/docs/tech-guide/index.md +++ b/components/eam/docs/tech-guide/index.md @@ -1,31 +1,31 @@ # EAM Technical Guide -This Technical Guide describes the physics of EAM. +This Technical Guide describes the physics of version 3 of the E3SM Atmospheric Model ## Dynamics and Physics -- [HOMME](homme.md): The dynamical core used in EAMv3. +- [HOMME](homme.md): Dynamical core. -- [P3](p3.md): The stratiform cloud microphysics scheme in EAMv3. +- [P3](p3.md): Stratiform cloud microphysics scheme. -- [CLUBB](clubb.md): The parameterization of subgrid-scale turbulence and clouds in EAMv3. +- [CLUBB](clubb.md): Parameterization of subgrid-scale turbulence and clouds. -- [Zhang-McFarlane](zm.md): The deep convection parameterization in EAMv3. +- [Zhang-McFarlane](zm.md): Deep convection parameterization. -- [RRTMG](rrtmg.md): The parameterization of radiation in EAMv3. +- [RRTMG](rrtmg.md): Parameterization of radiation. -- [MAM](mam.md): The primary parameterization schemes used to represent aerosols in EAMv3, consisting of the fifth mode in the stratospheric aerosols (MAM5), which was added on top of existing MAM4 schemes in EAMv1 and v2. +- [MAM](mam.md): Primary parameterization schemes used to represent aerosols. -- [VBS](vbs.md): The parameterization of secondary organic aerosols in EAMv3. +- [VBS](vbs.md): Parameterization of secondary organic aerosols. -- [Dust](dust.md): The parameterization of dust emissions in EAMv3. +- [Dust](dust.md): Parameterization of dust emissions. -- [OCEANFILMS](oceanfilms.md): The parameterization of sea soray irganic aerosol emissions in EAMv3. +- [OCEANFILMS](oceanfilms.md): Parameterization of sea soray irganic aerosol emissions. -- [chemUCI + Linoz v3](chemUCIlinozv3.md): The interactive atmospheric chemistry packages in EAMv3. +- [chemUCI + Linoz v3](chemUCIlinozv3.md): Interactive atmospheric chemistry packages. ## Diagnostic outputs -- [COSP](cosp.md): The scheme that allows the model to output satellite simulator output in EAMv3. +- [COSP](cosp.md): Scheme that allows the model to output satellite simulator output. -- [ARM Diags](armdiags.md): Diagnostic package that allows the model output to be compared against ARM measurements in EAMv3. +- [ARM Diags](armdiags.md): Diagnostic package that allows the model output to be compared against ARM measurements. From fced4010d5907228d04dabab31d85fb82ca98492 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 30 Apr 2024 22:22:01 -0500 Subject: [PATCH 248/310] Add more eam docs to navigation --- components/eam/mkdocs.yml | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/components/eam/mkdocs.yml b/components/eam/mkdocs.yml index d5a055da150..c310e410285 100644 --- a/components/eam/mkdocs.yml +++ b/components/eam/mkdocs.yml @@ -2,6 +2,23 @@ site_name: EAM nav: - Introduction: 'index.md' - - User Guide: user-guide/index.md + - User Guide: + - user-guide/index.md + - Namelist Parameters: user-guide/namelist_parameters.md + - Aerosol Properties: user-guide/aerosol_phys_prop.md + - Emission Oxidants: user-guide/emission_oxidant_files.md - Developer Guide: dev-guide/index.md - - Technical Guide: tech-guide/index.md + - Technical Guide: + - tech-guide/index.md + - tech-guide/homme.md + - tech-guide/p3.md + - tech-guide/clubb.md + - tech-guide/zm.md + - RRTMG: tech-guide/rrtmg.md + - tech-guide/mam.md + - tech-guide/vbs.md + - tech-guide/dust.md + - tech-guide/oceanfilms.md + - tech-guide/chemUCIlinozv3.md + - COSP: tech-guide/cosp.md + - tech-guide/armdiags.md From 8d0a7170a5edfb71c2aece7b0ec1f9181ca48037 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 30 Apr 2024 22:24:50 -0500 Subject: [PATCH 249/310] Clean up users guide Clean up users guide removing the in-page TOC and add bigger links to other files. Link to CIME --- components/eam/docs/user-guide/index.md | 51 +++++++++++++++---------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 84d7dfe733f..6d6ad03d8cd 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -3,28 +3,25 @@ This User Guide describes how to set up and run EAM. -## Table of contents - -1. [Steps to build and run EAM](#steps-to-build-and-run-eam) -2. [Scientifically supported compsets and grids](#scientifically-supported-compsets-and-grids) - 1. [Compsets](#compsets) - 2. [Grids](#grids) -3. [Customizing runs](#customizing-runs) - 1. [Namelist changes](#namelist-changes) - 2. [Input datasets](#input-datasets) - 3. [Specifying output (history files)](#specifying-output-history-files) - ## Steps to build and run EAM -A step-by-step instruction on how to run E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). +EAM is not available as a standalone model. Instead, EAM can be run in an atmosphere-only configuration. +The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to +change the *compset* and *grid*. +See the +[Case Control System Basic Usage](https://esmci.github.io/cime/versions/master/html/users_guide/index.html#case-control-system-part-1-basic-usage) for general descriptions of compsets and grids. -The difference when running in atmosphere-only mode (without an interactive ocean or sea-ice) would be to change the compset and grid. Certain namelist paramters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. +Certain namelist paramaters, input data files, and output file specifcations can also be modified. +These are described below as ways to customize runs. + +Step-by-step instructions on how to run and analyze E3SM with a script can be found at +[E3SM step-by-step guide](https://docs.e3sm.org/running-e3sm-guide/) ## Scientifically supported compsets and grids ### Compsets -All of the compsets below run with the complete set of E3SM atmospheric configuration of EAMV3. For more information on the schemes in EAMv3, see the techguide. +All of the compsets below run with the complete set of E3SM atmospheric configuration of EAMV3. For more information on the schemes in EAMv3, see the [Technical Guide](../tech-guide/index.md) `F2010` - Climatological present day climate (year 2010) @@ -34,15 +31,25 @@ All of the compsets below run with the complete set of E3SM atmospheric configur ### Grids +Only one grid combination is currently supported for the above compsets: + `ne30pg2_r05_IcoswISC30E3r5` - ne30pg2 atmosphere, 0.5deg x 0.5deg land grid, and Icosahedral 30 km mesh with ice shelves cavities (wISC), E3SMv3 (E3) revision r5 ## Customizing runs -### Namelist changes +### Compile-time options + +Some customizations require making changes before the model is built. + +### Run-time options + +Run-time customization is enabled by a Fortran namelist. Namelist parameters can be specified in the `user_nl_eam` file and unless otherwise noted can be specified at run time. -Refer to the following page for a [table](namelist_parameters.md) of namelist parameters and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. +#### [Tabe of Namelist Parameters](namelist_parameters.md) + +Refer to the above table and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. ### Input datasets @@ -54,13 +61,17 @@ Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 inputdata/atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc ``` -#### Aerosol physical properties +#### [Aerosol physical properties](aerosol_phys_prop.md) -The aerosol properties files provide aerosol refractive index, density, and aerosol hygroscopicty information for each aerosol species, as well as information about lognormal mode definition and lookup tables of polynomial expression coefficients for aerosol optics calculation for each mode. These aerosol physical and chemical properties are used by the radiation, aerosol microphysics and other related source and sink processes, and droplet activation/ice nucleation schemes. Detailed information on the files and related references can be found [here](aerosol_phys_prop.md). +The aerosol properties files provide aerosol refractive index, density, and aerosol hygroscopicty information for +each aerosol species, as well as information about lognormal mode definition and lookup tables of polynomial +expression coefficients for aerosol optics calculation for each mode. These aerosol physical and chemical properties +are used by the radiation, aerosol microphysics and other related source and sink processes, and droplet +activation/ice nucleation schemes. -#### Aerosol and gas emission and oxidant files +#### [Aerosol and gas emission and oxidant files](emission_oxidant_files.md) -Details of the aerosol and gas emission and oxidant files used in various historical, present-day, and future scenario can be found [here](emission_oxidant_files.md). +Details of the aerosol and gas emission and oxidant files used in various historical, present-day, and future scenarios. #### Linoz v3 input files From e1d902eb1c6b698e92ec89622ea40a6321240b6d Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Tue, 30 Apr 2024 22:52:36 -0500 Subject: [PATCH 250/310] Additional re-org of eam user guide content Move the history file example up with other namelist mentions. Make input data its own section instead of part of customization. --- components/eam/docs/user-guide/index.md | 93 +++++++++++++------------ 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 6d6ad03d8cd..2380268ebbc 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -45,15 +45,49 @@ Some customizations require making changes before the model is built. Run-time customization is enabled by a Fortran namelist. -Namelist parameters can be specified in the `user_nl_eam` file and unless otherwise noted can be specified at run time. +Namelist parameters can be changed from default values by putting them in the `user_nl_eam` file in the case directory +with the desired new value. -#### [Tabe of Namelist Parameters](namelist_parameters.md) +This [Table of Namelist Parameters](namelist_parameters.md) includes many of the paramaters that control +physics schemes described in the [tech-guide](../tech-guide/index.md) -Refer to the above table and the [tech-guide](../tech-guide/index.md) for a description of the atmosphere schemes for which the namelist parameters correspond to. +#### History File Namelist Parameters -### Input datasets +By default, EAM will output a set of monthly-averaged variables. Additional output files can be specified using the following flags in the `user_nl_eam` file: -#### Greenhouse gases (non-reacting) +`finclX` - List of variables (in single quotes and separated by commas) that are added to tape X. + +`fexclX` - List of variables (in single quotes and separated by commas) that will be excluded in tape X. + +`nhtfrq` - List of write frequencies for each of the history files. A value of 0 denotes a monthly frequency. Negative values denote hourly frequencies (e.g., `-3` will write an output every 3 hours). Positive values denotes the frequency in model timesteps (e.g., `4` will write an output every 4 timesteps). + +`mfilt` - List that sets the number of timesteps to write in a single file before starting a new file. + +`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. + +#### Example output specification + +```fortran +nhtfrq = 0,-24,-6,-3 +mfilt = 1,30,120,24 +avgflag_pertape = 'A','A','A','I' + +fexcl1 = 'U10' # Removes U10 output from monthly files +fincl2 = 'PS','FLUT','PRECT','U200','V200','U850', + 'V850','TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file +fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT', + 'VBOT','TREFHT','FLUT','OMEGA500','TBOT', + 'U850','V850','U200','V200','T200','T500', + 'Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file +fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file +``` + +## Input datasets + +Many properties of the simulated atmosphere are controlled by data sets read in by the model during initialization. +Changing the content of these files is another way to customize a run. + +### Greenhouse gases (non-reacting) Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 Forcing Datasets provided from the input4MIPs data collection. In addition to what is provided by the input4MIPS, 2015 and 2016 have been added by extrapolating from 2013 and 2014. @@ -61,7 +95,7 @@ Greenhouse gas concentration inputs of non-reacting species are taken from CMIP6 inputdata/atm/cam/ggas/GHG_CMIP-1-2-0_Annual_Global_0000-2014_c20180105.nc ``` -#### [Aerosol physical properties](aerosol_phys_prop.md) +### [Aerosol physical properties](aerosol_phys_prop.md) The aerosol properties files provide aerosol refractive index, density, and aerosol hygroscopicty information for each aerosol species, as well as information about lognormal mode definition and lookup tables of polynomial @@ -69,15 +103,15 @@ expression coefficients for aerosol optics calculation for each mode. These aero are used by the radiation, aerosol microphysics and other related source and sink processes, and droplet activation/ice nucleation schemes. -#### [Aerosol and gas emission and oxidant files](emission_oxidant_files.md) +### [Aerosol and gas emission and oxidant files](emission_oxidant_files.md) Details of the aerosol and gas emission and oxidant files used in various historical, present-day, and future scenarios. -#### Linoz v3 input files +### Linoz v3 input files Linozv3 uses the ozone tendency, (net production minus loss) calculated from its climatological mean state (function of month, latitude, altitude) and a first-order Taylor series expansion about the local ozone, temperature, and overhead ozone column. For historical simulation, Linozv3 uses the linozv3 data files with monthly resolution, spanning the dates 1849-01 -- 2014-12. -##### Historical files +#### Historical files ```fortran linoz_data_file = ‘linv3_1849-2101_CMIP6_Hist_10deg_58km_c20231207.nc’ @@ -87,7 +121,7 @@ Linozv3 uses the ozone tendency, (net production minus loss) calculated from its Refer to [this page](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3764486280/Production+of+the+Linoz+v3+data) for more details on Linoz v3 input files. -#### Topography +### Topography The global elevation on the atmosphere grid is a key input dataset. The dataset is grid dependent. It contains the geopotential data (on both the GLL dynamics and PG2 physics grids) and two surface roughness quantities, `SGH` and `SGH30`. @@ -102,13 +136,13 @@ This file is computed via a complex procedure that starts with high resolution d - `SGH30`: the variance between GTOPO30 and GTOPO30-downsampled-to-PG2 (independent of any dycore specific smoothing). (used by CLUBB, TMS, vertical_diffusion) - `SGH`: the variance between the cube3000 data and the smoothed PG2 data. (used by GWD parameterizations) -#### Land-use / land cover change +### Land-use / land cover change Info needed on land-use land cover change / land surface data Refer to [ELM documentation](https://docs.e3sm.org/E3SM/ELM/). -#### Ocean/sea ice +### Ocean/sea ice The sea surface temperature and sea-ice coverage data used in F-case simulations are based on CMIP6 Forcing Datasets provided from the input4MIPs data collection. The file for the `F2010` compset is created from taking a monthly climatology of years 2005-2014. The file for the `F1850` compset is created from taking a monthly climatology of years 1870-1879.* @@ -132,43 +166,10 @@ inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_2010_clim_c20190821.nc inputdata/ocn/docn7/SSTDATA/sst_ice_CMIP6_DECK_E3SM_1x1_1850_clim_c20190125.nc ``` -#### Solar input +### Solar input As with greenhouse gas emissions, solar input files are taken from the input4MIPs data collection that were prepared for CMIP6 Forcing Datasets. ```fortran inputdata/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc ``` - -### Specifying output (history files) - -These are specified in the `user_nl_eam`. - -By default, EAM will output a set of monthly-averaged variables. Additional output files can be specified using the following flags: - -`finclX` - List of variables (in single quotes and separated by commas) that are added to tape X. - -`fexclX` - List of variables (in single quotes and separated by commas) that will be excluded in tape X. - -`nhtfrq` - List of write frequencies for each of the history files. A value of 0 denotes a monthly frequency. Negative values denote hourly frequencies (e.g., `-3` will write an output every 3 hours). Positive values denotes the frequency in model timesteps (e.g., `4` will write an output every 4 timesteps). - -`mfilt` - List that sets the number of timesteps to write in a single file before starting a new file. - -`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. - -#### Example output specification - -```fortran -nhtfrq = 0,-24,-6,-3 -mfilt = 1,30,120,24 -avgflag_pertape = 'A','A','A','I' - -fexcl1 = 'U10' # Removes U10 output from monthly files -fincl2 = 'PS','FLUT','PRECT','U200','V200','U850', - 'V850','TCO','SCO','TREFHT','QREFHT' # Output files of daily-averaged output, which includes 30 days of output in each file -fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT', - 'VBOT','TREFHT','FLUT','OMEGA500','TBOT', - 'U850','V850','U200','V200','T200','T500', - 'Z700' # Output files of 6-hour-averaged output, which includes 30 days of output in each file -fincl4 = 'PRECT' # Output files of 3-hourly output with 3 days of output in every file -``` From 7f5de8b8866eaaa434b4e7c27200bec5320ae609 Mon Sep 17 00:00:00 2001 From: jayeshkrishna Date: Wed, 1 May 2024 12:19:34 -0500 Subject: [PATCH 251/310] Updating to SCORPIO v1.6.3 SCORPIO v1.6.3 includes the following fixes, * Fix for build issues with the Intel compiler * Fix for issues writing/reading ADIOS string attributes * Misc bug fixes --- externals/scorpio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/externals/scorpio b/externals/scorpio index dc6f1eb24f3..cdd541e0cd7 160000 --- a/externals/scorpio +++ b/externals/scorpio @@ -1 +1 @@ -Subproject commit dc6f1eb24f3dae1dcb0ebb13130c4941dc9bd445 +Subproject commit cdd541e0cd708bece13b1f3ee42f66dfd6440aa7 From 3446d839074e2a75e095330396dc90d8a8c8318c Mon Sep 17 00:00:00 2001 From: Hsiang-He Lee Date: Wed, 1 May 2024 17:00:04 -0500 Subject: [PATCH 252/310] reorder if statement when nstep=0 --- .../eam/src/chemistry/mozart/chemistry.F90 | 37 +++++++------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/components/eam/src/chemistry/mozart/chemistry.F90 b/components/eam/src/chemistry/mozart/chemistry.F90 index f9679f619f4..f78ceda1dea 100644 --- a/components/eam/src/chemistry/mozart/chemistry.F90 +++ b/components/eam/src/chemistry/mozart/chemistry.F90 @@ -1574,13 +1574,9 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o, f end if ! HHLEE 20210923 if (history_gaschmbudget_2D_levels .or. history_chemdyg_summary) then - if( nstep == 0 ) then - ftem_layers = 0.0_r8 - gas_ac_layers = 0.0_r8 - else ftem_layers = 0.0_r8 gas_ac_layers = 0.0_r8 - + if( nstep /= 0 ) then gas_ac_idx = pbuf_get_index(gas_ac_name(n)) call pbuf_get_field(pbuf, gas_ac_idx, gas_ac ) @@ -1605,18 +1601,16 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o, f ftem_layers(:ncol,4) = ftem_layers(:ncol,4) + ftem(:ncol,k) gas_ac_layers(:ncol,4) = gas_ac_layers(:ncol,4) + gas_ac(:ncol,k) end do - if (history_gaschmbudget_2D_levels ) then + endif + if (history_gaschmbudget_2D_levels ) then call outfld(trim(solsym(n))//'_2DMSB_L1', ftem_layers(:ncol,1), pcols, lchnk) call outfld(trim(solsym(n))//'_2DMSB_L2', ftem_layers(:ncol,2), pcols, lchnk) call outfld(trim(solsym(n))//'_2DMSB_L3', ftem_layers(:ncol,3), pcols, lchnk) call outfld(trim(solsym(n))//'_2DMSB_L4', ftem_layers(:ncol,4), pcols, lchnk) - endif endif - if( nstep == 0 ) then - Diff_layers(:ncol,:) = 0.0_r8 - else - Diff_layers(:ncol,:) = 0.0_r8 + Diff_layers(:ncol,:) = 0.0_r8 + if( nstep /= 0 ) then Diff_layers(:ncol,1) = (ftem_layers(:ncol,1) - gas_ac_layers(:ncol,1))/dt Diff_layers(:ncol,2) = (ftem_layers(:ncol,2) - gas_ac_layers(:ncol,2))/dt Diff_layers(:ncol,3) = (ftem_layers(:ncol,3) - gas_ac_layers(:ncol,3))/dt @@ -1632,25 +1626,20 @@ subroutine chem_timestep_tend( state, ptend, cam_in, cam_out, dt, pbuf, fh2o, f ! for the tropospheric budget diagnostics if (trim(solsym(n))=='O3' .or. trim(solsym(n))=='O3LNZ' .or. & trim(solsym(n))=='N2OLNZ' .or. trim(solsym(n))=='CH4LNZ') then - if( nstep == 0 ) then - ftem_layers = 0.0_r8 - gas_ac_layers = 0.0_r8 - else - ftem_layers = 0.0_r8 - gas_ac_layers = 0.0_r8 + ftem_layers = 0.0_r8 + gas_ac_layers = 0.0_r8 + if( nstep /= 0 ) then do k=1,pver ftem_layers(:ncol,1) = ftem_layers(:ncol,1) + ftem(:ncol,k) * tropFlagInt(:ncol,k) gas_ac_layers(:ncol,1) = gas_ac_layers(:ncol,1) + gas_ac(:ncol,k) * tropFlagInt(:ncol,k) end do - if (history_gaschmbudget_2D_levels ) then + endif + if (history_gaschmbudget_2D_levels ) then call outfld(trim(solsym(n))//'_2DMSB_trop', ftem_layers(:ncol,1), pcols, lchnk ) - endif endif - - if( nstep == 0 ) then - Diff_layers(:ncol,:) = 0.0_r8 - else - Diff_layers(:ncol,:) = 0.0_r8 + + Diff_layers(:ncol,:) = 0.0_r8 + if( nstep /= 0 ) then Diff_layers(:ncol,1) = (ftem_layers(:ncol,1) - gas_ac_layers(:ncol,1))/dt end if From 3238b7b9fe2d43269e2b1d17b2e35596d71fac1b Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Wed, 1 May 2024 20:08:59 -0500 Subject: [PATCH 253/310] Update the SSP testmod --- .../testmods_dirs/allactive/wcprodssp/README | 2 +- .../allactive/wcprodssp/shell_commands | 6 +- .../allactive/wcprodssp/user_nl_eam | 73 +++++++++++++++---- .../allactive/wcprodssp/user_nl_elm | 40 +++++++++- 4 files changed, 98 insertions(+), 23 deletions(-) diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/README b/cime_config/testmods_dirs/allactive/wcprodssp/README index fe36669a02a..66e4a6d06ea 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/README +++ b/cime_config/testmods_dirs/allactive/wcprodssp/README @@ -1,5 +1,5 @@ Modifications (in shell_commands) to enable a hybrid run for SSP compsets -(e.g., SSp370 or SSP585), starting from v3 long spinup. +(e.g., SSP370 or SSP585), starting from end of v3 historical run Other modifications (same as for wcprod) should result in a case that has the same namelist settings as the water cycle production sims diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/shell_commands b/cime_config/testmods_dirs/allactive/wcprodssp/shell_commands index 1cb8644c617..91b8f207046 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/shell_commands +++ b/cime_config/testmods_dirs/allactive/wcprodssp/shell_commands @@ -6,9 +6,9 @@ ./xmlchange RUN_TYPE="hybrid" ./xmlchange GET_REFCASE="TRUE" - ./xmlchange RUN_REFCASE="20231209.v3.LR.piControl-spinup.chrysalis" - ./xmlchange RUN_REFDATE="1801-01-01" - ./xmlchange RUN_REFDIR=${INPUTDATA_ROOT}"/e3sm_init/V3.SSP370_SSP585.ne30pg2_r05_IcoswISC30E3r5/v3.LR.piControl-spinup/1801-01-01-00000" + ./xmlchange RUN_REFCASE="v3.LR.historical_0101" + ./xmlchange RUN_REFDATE="2015-01-01" + ./xmlchange RUN_REFDIR=${INPUTDATA_ROOT}"/e3sm_init/v3.SSP.ne30pg2_r05_IcoswISC30E3r5/v3.LR.historical_0101/2015-01-01-00000" exit diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam index b83a8c6ca22..95c1b4a0f92 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam +++ b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam @@ -1,16 +1,59 @@ - nhtfrq = -24,-24,-6,-6,-3,-24,-24 - mfilt = 1,30,120,120,240,30,1 - avgflag_pertape = 'A','A','I','A','A','A','I' -!temporarily remove LINOZ O3 related fields from the list until updated linoz v3 style inputdata is ready -!fexcl1 = 'CFAD_SR532_CAL', 'LINOZ_DO3', 'LINOZ_DO3_PSC', 'LINOZ_O3CLIM', 'LINOZ_O3COL', 'LINOZ_SSO3', 'hstobie_linoz' - fexcl1 = 'CFAD_SR532_CAL', 'hstobie_linoz' - fincl1 = 'extinct_sw_inp','extinct_lw_bnd7','extinct_lw_inp','CLD_CAL', 'TREFMNAV', 'TREFMXAV' - fincl2 = 'FLUT','PRECT','U200','V200','U850','V850','Z500','OMEGA500','UBOT','VBOT','TREFHT','TREFHTMN:M','TREFHTMX:X','QREFHT','TS','PS','TMQ','TUQ','TVQ','TOZ', 'FLDS', 'FLNS', 'FSDS', 'FSNS', 'SHFLX', 'LHFLX', 'TGCLDCWP', 'TGCLDIWP', 'TGCLDLWP', 'CLDTOT', 'T250', 'T200', 'T150', 'T100', 'T050', 'T025', 'T010', 'T005', 'T002', 'T001', 'TTOP', 'U250', 'U150', 'U100', 'U050', 'U025', 'U010', 'U005', 'U002', 'U001', 'UTOP', 'FSNT', 'FLNT' - fincl3 = 'PSL','T200','T500','U850','V850','UBOT','VBOT','TREFHT', 'Z700', 'TBOT:M' - fincl4 = 'FLUT','U200','U850','PRECT','OMEGA500' - fincl5 = 'PRECT','PRECC','TUQ','TVQ','QFLX','SHFLX','U90M','V90M' - fincl6 = 'CLDTOT_ISCCP','MEANCLDALB_ISCCP','MEANTAU_ISCCP','MEANPTOP_ISCCP','MEANTB_ISCCP','CLDTOT_CAL','CLDTOT_CAL_LIQ','CLDTOT_CAL_ICE','CLDTOT_CAL_UN','CLDHGH_CAL','CLDHGH_CAL_LIQ','CLDHGH_CAL_ICE','CLDHGH_CAL_UN','CLDMED_CAL','CLDMED_CAL_LIQ','CLDMED_CAL_ICE','CLDMED_CAL_UN','CLDLOW_CAL','CLDLOW_CAL_LIQ','CLDLOW_CAL_ICE','CLDLOW_CAL_UN' - fincl7 = 'O3', 'PS', 'TROP_P' + cosp_lite = .true. -! Specify an L80 IC to override eam.i from reference case, which is still for L72 - ncdata = '$DIN_LOC_ROOT/atm/cam/inic/homme/eami_mam4_Linoz_ne30np4_L80_c20231010.nc' + empty_htapes = .true. + + avgflag_pertape = 'A','A','A','A','I','I' + nhtfrq = 0,-24,-6,-3,-1,0 + mfilt = 1,30,120,240,720,1 + + fincl1 = 'AODALL','AODBC','AODDUST','AODPOM','AODSO4','AODSOA','AODSS','AODVIS', + 'CLDLOW','CLDMED','CLDHGH','CLDTOT', + 'CLDHGH_CAL','CLDLOW_CAL','CLDMED_CAL','CLD_MISR','CLDTOT_CAL', + 'CLMODIS','FISCCP1_COSP','FLDS','FLNS','FLNSC','FLNT','FLUT', + 'FLUTC','FSDS','FSDSC','FSNS','FSNSC','FSNT','FSNTOA','FSNTOAC','FSNTC', + 'ICEFRAC','LANDFRAC','LWCF','OCNFRAC','OMEGA','PRECC','PRECL','PRECSC','PRECSL','PS','PSL','Q', + 'QFLX','QREFHT','RELHUM','SCO','SHFLX','SOLIN','SWCF','T','TAUX','TAUY','TCO', + 'TGCLDLWP','TMQ','TREFHT','TREFMNAV','TREFMXAV','TS','U','U10','V','Z3', + 'dst_a1DDF','dst_a3DDF','dst_c1DDF','dst_c3DDF','dst_a1SFWET','dst_a3SFWET','dst_c1SFWET','dst_c3SFWET', + 'O3','LHFLX', + 'O3_2DTDA_trop','O3_2DTDB_trop','O3_2DTDD_trop','O3_2DTDE_trop','O3_2DTDI_trop','O3_2DTDL_trop', + 'O3_2DTDN_trop','O3_2DTDO_trop','O3_2DTDS_trop','O3_2DTDU_trop','O3_2DTRE_trop','O3_2DTRI_trop', + 'O3_SRF','NO_2DTDS','NO_TDLgt','NO2_2DTDD','NO2_2DTDS','NO2_TDAcf','CO_SRF','TROPE3D_P','TROP_P', + 'CDNUMC','SFDMS','so4_a1_sfgaex1','so4_a2_sfgaex1','so4_a3_sfgaex1','so4_a5_sfgaex1','soa_a1_sfgaex1', + 'soa_a2_sfgaex1','soa_a3_sfgaex1','GS_soa_a1','GS_soa_a2','GS_soa_a3','AQSO4_H2O2','AQSO4_O3', + 'SFSO2','SO2_CLXF','SO2','DF_SO2','AQ_SO2','GS_SO2','WD_SO2','ABURDENSO4_STR','ABURDENSO4_TRO', + 'ABURDENSO4','ABURDENBC','ABURDENDUST','ABURDENMOM','ABURDENPOM','ABURDENSEASALT', + 'ABURDENSOA','AODSO4_STR','AODSO4_TRO', + 'EXTINCT','AODABS','AODABSBC','CLDICE','CLDLIQ','CLD_CAL_TMPLIQ','CLD_CAL_TMPICE','Mass_bc_srf', + 'Mass_dst_srf','Mass_mom_srf','Mass_ncl_srf','Mass_pom_srf','Mass_so4_srf','Mass_soa_srf','Mass_bc_850', + 'Mass_dst_850','Mass_mom_850','Mass_ncl_850','Mass_pom_850','Mass_so4_850','Mass_soa_850','Mass_bc_500', + 'Mass_dst_500','Mass_mom_500','Mass_ncl_500','Mass_pom_500','Mass_so4_500','Mass_soa_500','Mass_bc_330', + 'Mass_dst_330','Mass_mom_330','Mass_ncl_330','Mass_pom_330','Mass_so4_330','Mass_soa_330','Mass_bc_200', + 'Mass_dst_200','Mass_mom_200','Mass_ncl_200','Mass_pom_200','Mass_so4_200','Mass_soa_200', + 'O3_2DTDD','O3_2DCIP','O3_2DCIL','CO_2DTDS','CO_2DTDD','CO_2DCEP','CO_2DCEL','NO_2DTDD', + 'FLNTC','SAODVIS', + 'H2OLNZ', + 'dst_a1SF','dst_a3SF', + 'PHIS','CLOUD','TGCLDIWP','TGCLDCWP','AREL', + 'CLDTOT_ISCCP','MEANCLDALB_ISCCP','MEANPTOP_ISCCP','CLD_CAL', + 'CLDTOT_CAL_LIQ','CLDTOT_CAL_ICE','CLDTOT_CAL_UN', + 'CLDHGH_CAL_LIQ','CLDHGH_CAL_ICE','CLDHGH_CAL_UN', + 'CLDMED_CAL_LIQ','CLDMED_CAL_ICE','CLDMED_CAL_UN', + 'CLDLOW_CAL_LIQ','CLDLOW_CAL_ICE','CLDLOW_CAL_UN', + 'CLWMODIS','CLIMODIS' + + fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', + 'TCO','SCO','TREFHTMN:M','TREFHTMX:X','TREFHT','QREFHT' + fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' + fincl4 = 'PRECT' + fincl5 = 'O3_SRF' + fincl6 = 'CO_2DMSD','NO2_2DMSD','NO_2DMSD','O3_2DMSD','O3_2DMSD_trop' + + ! -- chemUCI settings ------------------ + history_chemdyg_summary = .true. + history_gaschmbudget_2D = .false. + history_gaschmbudget_2D_levels = .false. + history_gaschmbudget_num = 6 !! no impact if history_gaschmbudget_2D = .false. + + ! -- MAM5 settings ------------------ + is_output_interactive_volc = .true. diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm index 80bd35a81f0..e83a2b08a8b 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm +++ b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm @@ -2,13 +2,45 @@ CHECK_FINIDAT_FSURDAT_CONSISTENCY = .false. -! flanduse_timeseries not ready for v3.LR.SSP production grid, set not to do transient_pft tentatively until SSP compset fully ready - - do_transient_pfts = .false. hist_dov2xy = .true.,.true. + hist_fexcl1 = 'AGWDNPP','ALTMAX_LASTYEAR','AVAIL_RETRANSP','AVAILC','BAF_CROP', + 'BAF_PEATF','BIOCHEM_PMIN_TO_PLANT','CH4_SURF_AERE_SAT','CH4_SURF_AERE_UNSAT','CH4_SURF_DIFF_SAT', + 'CH4_SURF_DIFF_UNSAT','CH4_SURF_EBUL_SAT','CH4_SURF_EBUL_UNSAT','CMASS_BALANCE_ERROR','cn_scalar', + 'COL_PTRUNC','CONC_CH4_SAT','CONC_CH4_UNSAT','CONC_O2_SAT','CONC_O2_UNSAT', + 'cp_scalar','CWDC_HR','CWDC_LOSS','CWDC_TO_LITR2C','CWDC_TO_LITR3C', + 'CWDC_vr','CWDN_TO_LITR2N','CWDN_TO_LITR3N','CWDN_vr','CWDP_TO_LITR2P', + 'CWDP_TO_LITR3P','CWDP_vr','DWT_CONV_CFLUX_DRIBBLED','F_CO2_SOIL','F_CO2_SOIL_vr', + 'F_DENIT_vr','F_N2O_DENIT','F_N2O_NIT','F_NIT_vr','FCH4_DFSAT', + 'FINUNDATED_LAG','FPI_P_vr','FPI_vr','FROOTC_LOSS','HR_vr', + 'LABILEP_TO_SECONDP','LABILEP_vr','LAND_UPTAKE','LEAF_MR','leaf_npimbalance', + 'LEAFC_LOSS','LEAFC_TO_LITTER','LFC2','LITR1_HR','LITR1C_TO_SOIL1C', + 'LITR1C_vr','LITR1N_TNDNCY_VERT_TRANS','LITR1N_TO_SOIL1N','LITR1N_vr','LITR1P_TNDNCY_VERT_TRANS', + 'LITR1P_TO_SOIL1P','LITR1P_vr','LITR2_HR','LITR2C_TO_SOIL2C','LITR2C_vr', + 'LITR2N_TNDNCY_VERT_TRANS','LITR2N_TO_SOIL2N','LITR2N_vr','LITR2P_TNDNCY_VERT_TRANS','LITR2P_TO_SOIL2P', + 'LITR2P_vr','LITR3_HR','LITR3C_TO_SOIL3C','LITR3C_vr','LITR3N_TNDNCY_VERT_TRANS', + 'LITR3N_TO_SOIL3N','LITR3N_vr','LITR3P_TNDNCY_VERT_TRANS','LITR3P_TO_SOIL3P','LITR3P_vr', + 'M_LITR1C_TO_LEACHING','M_LITR2C_TO_LEACHING','M_LITR3C_TO_LEACHING','M_SOIL1C_TO_LEACHING','M_SOIL2C_TO_LEACHING', + 'M_SOIL3C_TO_LEACHING','M_SOIL4C_TO_LEACHING','NDEPLOY','NEM','nlim_m', + 'o2_decomp_depth_unsat','OCCLP_vr','PDEPLOY','PLANT_CALLOC','PLANT_NDEMAND', + 'PLANT_NDEMAND_COL','PLANT_PALLOC','PLANT_PDEMAND','PLANT_PDEMAND_COL','plim_m', + 'POT_F_DENIT','POT_F_NIT','POTENTIAL_IMMOB','POTENTIAL_IMMOB_P','PRIMP_TO_LABILEP', + 'PRIMP_vr','PROD1P_LOSS','QOVER_LAG','RETRANSN_TO_NPOOL','RETRANSP_TO_PPOOL', + 'SCALARAVG_vr','SECONDP_TO_LABILEP','SECONDP_TO_OCCLP','SECONDP_vr','SMIN_NH4_vr', + 'SMIN_NO3_vr','SMINN_TO_SOIL1N_L1','SMINN_TO_SOIL2N_L2','SMINN_TO_SOIL2N_S1','SMINN_TO_SOIL3N_L3', + 'SMINN_TO_SOIL3N_S2','SMINN_TO_SOIL4N_S3','SMINP_TO_SOIL1P_L1','SMINP_TO_SOIL2P_L2','SMINP_TO_SOIL2P_S1', + 'SMINP_TO_SOIL3P_L3','SMINP_TO_SOIL3P_S2','SMINP_TO_SOIL4P_S3','SMINP_vr','SOIL1_HR','SOIL1C_TO_SOIL2C','SOIL1C_vr','SOIL1N_TNDNCY_VERT_TRANS','SOIL1N_TO_SOIL2N','SOIL1N_vr', + 'SOIL1P_TNDNCY_VERT_TRANS','SOIL1P_TO_SOIL2P','SOIL1P_vr','SOIL2_HR','SOIL2C_TO_SOIL3C', + 'SOIL2C_vr','SOIL2N_TNDNCY_VERT_TRANS','SOIL2N_TO_SOIL3N','SOIL2N_vr','SOIL2P_TNDNCY_VERT_TRANS', + 'SOIL2P_TO_SOIL3P','SOIL2P_vr','SOIL3_HR','SOIL3C_TO_SOIL4C','SOIL3C_vr', + 'SOIL3N_TNDNCY_VERT_TRANS','SOIL3N_TO_SOIL4N','SOIL3N_vr','SOIL3P_TNDNCY_VERT_TRANS','SOIL3P_TO_SOIL4P', + 'SOIL3P_vr','SOIL4_HR','SOIL4C_vr','SOIL4N_TNDNCY_VERT_TRANS','SOIL4N_TO_SMINN', + 'SOIL4N_vr','SOIL4P_TNDNCY_VERT_TRANS','SOIL4P_TO_SMINP','SOIL4P_vr','SOLUTIONP_vr', + 'TCS_MONTH_BEGIN','TCS_MONTH_END','TOTCOLCH4','water_scalar','WF', + 'wlim_m','WOODC_LOSS','WTGQ' + hist_fincl1 = 'SNOWDP','COL_FIRE_CLOSS','NPOOL','PPOOL','TOTPRODC' hist_fincl2 = 'H2OSNO', 'FSNO', 'QRUNOFF', 'QSNOMELT', 'FSNO_EFF', 'SNORDSL', 'SNOW', 'FSDS', 'FSR', 'FLDS', 'FIRE', 'FIRA' hist_mfilt = 1,365 - hist_nhtfrq = -24,-24 + hist_nhtfrq = 0,-24 hist_avgflag_pertape = 'A','A' From f535848b6208131e6475fc4a9c03ba2778f3dddc Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Wed, 1 May 2024 20:54:44 -0500 Subject: [PATCH 254/310] Update SSP use_case files with transient BGC land mode settings --- .../namelist_files/use_cases/2015-2100_SSP245_transient.xml | 5 ++--- .../namelist_files/use_cases/2015-2100_SSP370_transient.xml | 5 ++--- .../namelist_files/use_cases/2015-2100_SSP585_transient.xml | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml index ba255f3dc29..e313dab6b16 100755 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP245_transient.xml @@ -15,7 +15,8 @@ flanduse_timeseries - + 1850 2005 1850 @@ -27,8 +28,6 @@ 1850 2010 1850 ---> - diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml index 44b6fdb35cb..0e8415d3c1a 100755 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP370_transient.xml @@ -15,7 +15,8 @@ flanduse_timeseries - + 1850 2005 1850 @@ -27,8 +28,6 @@ 1850 2010 1850 ---> - diff --git a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml index 66a50136c5f..2db3549ce5f 100644 --- a/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml +++ b/components/elm/bld/namelist_files/use_cases/2015-2100_SSP585_transient.xml @@ -15,7 +15,8 @@ flanduse_timeseries - + 1850 2005 1850 @@ -27,8 +28,6 @@ 1850 2010 1850 ---> - From 9311a73cdf4e64ac2c20e7a4dfd09263c78cc0d2 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Thu, 2 May 2024 07:10:23 -0500 Subject: [PATCH 255/310] Set SSP245 default STARTDATE --- cime_config/allactive/config_compsets.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/cime_config/allactive/config_compsets.xml b/cime_config/allactive/config_compsets.xml index 439854c75b2..c423ac6c979 100755 --- a/cime_config/allactive/config_compsets.xml +++ b/cime_config/allactive/config_compsets.xml @@ -448,6 +448,7 @@ 1850-01-01 2015-01-01 2015-01-01 + 2015-01-01 From 27fde25edb2c9ba913cf79ff772cb365393fa2cf Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Wed, 24 Aug 2022 16:11:11 -0400 Subject: [PATCH 256/310] Add subgrid corrections and init mode test cases --- components/mpas-ocean/src/Registry.xml | 87 ++ .../src/driver/mpas_ocn_core_interface.F | 11 + .../src/mode_forward/mpas_ocn_forward_mode.F | 3 + .../mpas_ocn_time_integration_rk4.F | 24 +- components/mpas-ocean/src/mode_init/Makefile | 9 +- .../mpas-ocean/src/mode_init/Registry.xml | 1 + .../src/mode_init/Registry_buttermilk_bay.xml | 58 ++ .../src/mode_init/Registry_parabolic_bowl.xml | 22 +- .../mode_init/mpas_ocn_init_buttermilk_bay.F | 906 +++++++++++++++++ .../src/mode_init/mpas_ocn_init_mode.F | 5 +- .../mode_init/mpas_ocn_init_parabolic_bowl.F | 324 +++--- .../src/mode_init/mpas_ocn_init_subgrid.F | 941 ++++++++++++++++++ components/mpas-ocean/src/shared/Makefile | 7 +- .../src/shared/mpas_ocn_diagnostics.F | 140 ++- .../shared/mpas_ocn_diagnostics_variables.F | 9 + .../mpas-ocean/src/shared/mpas_ocn_mesh.F | 2 +- .../mpas-ocean/src/shared/mpas_ocn_subgrid.F | 589 +++++++++++ .../src/shared/mpas_ocn_tidal_forcing.F | 7 +- .../src/shared/mpas_ocn_vel_pressure_grad.F | 26 +- .../src/shared/mpas_ocn_wetting_drying.F | 232 ++++- 20 files changed, 3172 insertions(+), 231 deletions(-) create mode 100644 components/mpas-ocean/src/mode_init/Registry_buttermilk_bay.xml create mode 100644 components/mpas-ocean/src/mode_init/mpas_ocn_init_buttermilk_bay.F create mode 100644 components/mpas-ocean/src/mode_init/mpas_ocn_init_subgrid.F create mode 100644 components/mpas-ocean/src/shared/mpas_ocn_subgrid.F diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml index 905343f3e40..5268b9598d3 100644 --- a/components/mpas-ocean/src/Registry.xml +++ b/components/mpas-ocean/src/Registry.xml @@ -110,6 +110,9 @@ description="Number of wavenumbers used to reconstruct Stokes drift depth profile" definition="6" /> + @@ -1183,6 +1186,14 @@ description="Safety factor on minimum cell height to ensure the minimum height is not violated due to round-off." possible_values="Real value greater or equal to 0." /> + + + + + @@ -1637,6 +1654,7 @@ + @@ -2612,6 +2630,67 @@ + + + + + + + + + + + + + + + + + + +-1 + .true. .true. diff --git a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml index e01c2b9716f..4be3335c7aa 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml @@ -2640,6 +2640,17 @@ Default: Defined in namelist_defaults.xml + + + +Number of levels in subgrid lookup tables + +Valid values: Any positive non-zero integer. A value of -1 causes this to be overwritten with the configurations subgrid table levels definition. +Default: Defined in namelist_defaults.xml + + + Date: Thu, 25 Apr 2024 13:59:48 -0700 Subject: [PATCH 267/310] Add MPAS-Ocean documentation These were all squashed to remove the added pdf file. first draft of mpas-o quick start guide updated streams description added C-case and G-case runscript examples linting and minor corrections Apply suggestions from code review (1) Co-authored-by: Mark Petersen Apply suggestions from code review (2) Add dev and tech guides. linter correction Apply suggestions from code review small edit Co-authored-by: Xylar Asay-Davis Apply suggestions from code review zenodo link Apply suggestions from code review zenodo remove tech-guide/mpas_ocean_users_guide.pdf --- .../docs/ccase.template.v3LR.anvil.sh | 498 ++++++++++++++++++ components/mpas-ocean/docs/dev-guide/index.md | 5 + .../docs/gcase.template.v3LR.chrysalis.sh | 498 ++++++++++++++++++ components/mpas-ocean/docs/index.md | 7 + .../mpas-ocean/docs/tech-guide/index.md | 29 + .../mpas-ocean/docs/user-guide/index.md | 210 ++++++++ 6 files changed, 1247 insertions(+) create mode 100755 components/mpas-ocean/docs/ccase.template.v3LR.anvil.sh create mode 100644 components/mpas-ocean/docs/dev-guide/index.md create mode 100755 components/mpas-ocean/docs/gcase.template.v3LR.chrysalis.sh create mode 100644 components/mpas-ocean/docs/index.md create mode 100644 components/mpas-ocean/docs/tech-guide/index.md create mode 100644 components/mpas-ocean/docs/user-guide/index.md diff --git a/components/mpas-ocean/docs/ccase.template.v3LR.anvil.sh b/components/mpas-ocean/docs/ccase.template.v3LR.anvil.sh new file mode 100755 index 00000000000..ed9af711058 --- /dev/null +++ b/components/mpas-ocean/docs/ccase.template.v3LR.anvil.sh @@ -0,0 +1,498 @@ +#!/bin/bash -fe + +# E3SM Coupled Model Group run_e3sm script template. +# +# Bash coding style inspired by: +# http://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming + +main() { + +# For debugging, uncomment libe below +#set -x + +# --- Configuration flags ---- + +# Machine and project +readonly MACHINE=anvil +readonly PROJECT="condo" + +# Simulation +readonly COMPSET="CMPASO-JRA1p4" +readonly RESOLUTION="TL319_IcoswISC30E3r5" +readonly CASE_NAME="test.CMPAS-JRA.TL319_IcoswISC30E3r5.anvil" # MODIFY +#readonly CASE_GROUP="" + +# Code and compilation +readonly CHECKOUT="20240304" +readonly BRANCH="399d430" # master as of 2024-03-04 E3Sm v3.0.0 tag +#readonly CHERRY=() +readonly DEBUG_COMPILE=false + +# Run options +readonly MODEL_START_TYPE="initial" # 'initial', 'continue', 'branch', 'hybrid' +readonly START_DATE="0001-01-01" + +# Additional options for 'branch' and 'hybrid' +# readonly GET_REFCASE=TRUE +# readonly RUN_REFDIR="" +# readonly RUN_REFCASE="" +# readonly RUN_REFDATE="0301-01-01" + +# Set paths +readonly CODE_ROOT="/lcrc/group/e3sm/${USER}/E3SM/code/${CHECKOUT}" +readonly CASE_ROOT="/lcrc/group/e3sm/${USER}/e3sm_scratch/${MACHINE}/${CASE_NAME}" + +# Sub-directories +readonly CASE_BUILD_DIR=${CASE_ROOT}/build +readonly CASE_ARCHIVE_DIR=${CASE_ROOT}/archive + +# Define type of run +# short tests: 'S_2x5_ndays', 'M_1x10_ndays', 'M80_1x10_ndays' +# or 'production' for full simulation + +#readonly run='S_1x1_nmonth' +readonly run='production' +if [ "${run}" != "production" ]; then + + # Short test simulations + tmp=($(echo $run | tr "_" " ")) + layout=${tmp[0]} + units=${tmp[2]} + resubmit=$(( ${tmp[1]%%x*} -1 )) + length=${tmp[1]##*x} + + readonly CASE_SCRIPTS_DIR=${CASE_ROOT}/tests/${run}/case_scripts + readonly CASE_RUN_DIR=${CASE_ROOT}/tests/${run}/run + readonly PELAYOUT=${layout} + readonly WALLTIME="2:00:00" + readonly STOP_OPTION=${units} + readonly STOP_N=${length} + readonly REST_OPTION=${STOP_OPTION} + readonly REST_N=${STOP_N} + readonly RESUBMIT=${resubmit} + readonly DO_SHORT_TERM_ARCHIVING=false + +else + + # Production simulation + readonly CASE_SCRIPTS_DIR=${CASE_ROOT}/case_scripts + readonly CASE_RUN_DIR=${CASE_ROOT}/run + readonly PELAYOUT="L" + readonly WALLTIME="02:00:00" + readonly STOP_OPTION="nmonths" + readonly STOP_N="1" + readonly REST_OPTION="nmonths" + readonly REST_N="1" + readonly RESUBMIT="0" + readonly DO_SHORT_TERM_ARCHIVING=false +fi + +# Coupler history +readonly HIST_OPTION="nmonths" +readonly HIST_N="1" + +# Leave empty (unless you understand what it does) +readonly OLD_EXECUTABLE="" + +# --- Toggle flags for what to do ---- +do_fetch_code=false +do_create_newcase=true +do_modify_pelayout=false +do_case_setup=true +do_case_build=true +do_case_submit=true + +# --- Now, do the work --- + +# Make directories created by this script world-readable +umask 022 + +# Fetch code from Github +fetch_code + +# Create case +create_newcase + +# Custom PE layout +modify_pelayout + +# Setup +case_setup + +# Build +case_build + +# Configure runtime options +runtime_options + +# Copy script into case_script directory for provenance +copy_script + +# Submit +case_submit + +# All done +echo $'\n----- All done -----\n' + +} + +# ======================= +# Custom user_nl settings +# ======================= + +user_nl() { + +cat << EOF >> user_nl_eam +EOF + +cat << EOF >> user_nl_elm +EOF + +cat << EOF >> user_nl_mpaso +EOF + +cat << EOF >> user_nl_mpassi +EOF + +} + +# ===================================== +# Customize MPAS stream files if needed +# ===================================== + +patch_mpas_streams() { + +echo + +} + +# ===================================================== +# Custom PE layout: +# ===================================================== + +modify_pelayout() { + + if [ "${do_modify_pelayout,,}" != "true" ]; then + echo $'\n----- Skipping changing PE-layout -----\n' + return + fi + + echo $'\n----- changing PE layout to custom -----\n' + pushd ${CASE_SCRIPTS_DIR} + + ./xmlchange MAX_MPITASKS_PER_NODE=32 + ./xmlchange MAX_TASKS_PER_NODE=256 + ./xmlchange NTASKS_ATM=1024 + ./xmlchange NTASKS_CPL=1024 + ./xmlchange NTASKS_OCN=1024 + ./xmlchange NTASKS_WAV=1024 + ./xmlchange NTASKS_GLC=1024 + ./xmlchange NTASKS_ICE=1024 + ./xmlchange NTASKS_ROF=1024 + ./xmlchange NTASKS_LND=1024 + ./xmlchange NTASKS_ESP=1 + ./xmlchange NTASKS_IAC=1 + + ./xmlchange NTHRDS_ATM=8 + ./xmlchange NTHRDS_CPL=8 + ./xmlchange NTHRDS_OCN=8 + ./xmlchange NTHRDS_WAV=8 + ./xmlchange NTHRDS_GLC=1 + ./xmlchange NTHRDS_ICE=8 + ./xmlchange NTHRDS_ROF=8 + ./xmlchange NTHRDS_LND=8 + ./xmlchange NTHRDS_ESP=1 + ./xmlchange NTHRDS_IAC=1 + + ./xmlchange ROOTPE_ATM=0 + ./xmlchange ROOTPE_CPL=0 + ./xmlchange ROOTPE_OCN=0 + ./xmlchange ROOTPE_WAV=0 + ./xmlchange ROOTPE_GLC=0 + ./xmlchange ROOTPE_ICE=0 + ./xmlchange ROOTPE_ROF=0 + ./xmlchange ROOTPE_LND=0 + ./xmlchange ROOTPE_ESP=0 + ./xmlchange ROOTPE_IAC=0 + + popd + + } +###################################################### +### Most users won't need to change anything below ### +###################################################### + +#----------------------------------------------------- +fetch_code() { + + if [ "${do_fetch_code,,}" != "true" ]; then + echo $'\n----- Skipping fetch_code -----\n' + return + fi + + echo $'\n----- Starting fetch_code -----\n' + local path=${CODE_ROOT} + local repo=E3SM + + echo "Cloning $repo repository branch $BRANCH under $path" + if [ -d "${path}" ]; then + echo "ERROR: Directory already exists. Not overwriting" + exit 20 + fi + mkdir -p ${path} + pushd ${path} + + # This will put repository, with all code + git clone git@github.com:E3SM-Project/${repo}.git . + + # Check out desired branch + git checkout ${BRANCH} + + # Custom addition + if [ "${CHERRY}" != "" ]; then + echo ----- WARNING: adding git cherry-pick ----- + for commit in "${CHERRY[@]}" + do + echo ${commit} + git cherry-pick ${commit} + done + echo ------------------------------------------- + fi + + # Bring in all submodule components + git submodule update --init --recursive + + popd +} + +#----------------------------------------------------- +create_newcase() { + + if [ "${do_create_newcase,,}" != "true" ]; then + echo $'\n----- Skipping create_newcase -----\n' + return + fi + + echo $'\n----- Starting create_newcase -----\n' + + if [[ ${PELAYOUT} == custom-* ]]; + then + layout="M" # temporary placeholder for create_newcase + else + layout=${PELAYOUT} + + fi + ${CODE_ROOT}/cime/scripts/create_newcase \ + --case ${CASE_NAME} \ + --output-root ${CASE_ROOT} \ + --script-root ${CASE_SCRIPTS_DIR} \ + --handle-preexisting-dirs u \ + --compset ${COMPSET} \ + --res ${RESOLUTION} \ + --machine ${MACHINE} ${COMPILER} \ + --project ${PROJECT} \ + --walltime ${WALLTIME} \ + --pecount ${layout} \ + + if [ $? != 0 ]; then + echo $'\nNote: if create_newcase failed because sub-directory already exists:' + echo $' * delete old case_script sub-directory' + echo $' * or set do_newcase=false\n' + exit 35 + fi + +} + +#----------------------------------------------------- +case_setup() { + + if [ "${do_case_setup,,}" != "true" ]; then + echo $'\n----- Skipping case_setup -----\n' + return + fi + + echo $'\n----- Starting case_setup -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Setup some CIME directories + ./xmlchange EXEROOT=${CASE_BUILD_DIR} + ./xmlchange RUNDIR=${CASE_RUN_DIR} + + # Short term archiving + ./xmlchange DOUT_S=${DO_SHORT_TERM_ARCHIVING^^} + ./xmlchange DOUT_S_ROOT=${CASE_ARCHIVE_DIR} + + # Build with COSP, except for a data atmosphere (datm) + if [ `./xmlquery --value COMP_ATM` == "datm" ]; then + echo $'\nThe specified configuration uses a data atmosphere, so cannot activate COSP simulator\n' + else + echo $'\nConfiguring E3SM to use the COSP simulator\n' + ./xmlchange --id CAM_CONFIG_OPTS --append --val='-cosp' + fi + + # Extracts input_data_dir in case it is needed for user edits to the namelist later + local input_data_dir=`./xmlquery DIN_LOC_ROOT --value` + + # Custom user_nl + user_nl + + # Finally, run CIME case.setup + ./case.setup --reset + + popd +} + +#----------------------------------------------------- +case_build() { + + pushd ${CASE_SCRIPTS_DIR} + + # do_case_build = false + if [ "${do_case_build,,}" != "true" ]; then + + echo $'\n----- case_build -----\n' + + if [ "${OLD_EXECUTABLE}" == "" ]; then + # Ues previously built executable, make sure it exists + if [ -x ${CASE_BUILD_DIR}/e3sm.exe ]; then + echo 'Skipping build because $do_case_build = '${do_case_build} + else + echo 'ERROR: $do_case_build = '${do_case_build}' but no executable exists for this case.' + exit 297 + fi + else + # If absolute pathname exists and is executable, reuse pre-exiting executable + if [ -x ${OLD_EXECUTABLE} ]; then + echo 'Using $OLD_EXECUTABLE = '${OLD_EXECUTABLE} + cp -fp ${OLD_EXECUTABLE} ${CASE_BUILD_DIR}/ + else + echo 'ERROR: $OLD_EXECUTABLE = '$OLD_EXECUTABLE' does not exist or is not an executable file.' + exit 297 + fi + fi + echo 'WARNING: Setting BUILD_COMPLETE = TRUE. This is a little risky, but trusting the user.' + ./xmlchange BUILD_COMPLETE=TRUE + + # do_case_build = true + else + + echo $'\n----- Starting case_build -----\n' + + # Turn on debug compilation option if requested + if [ "${DEBUG_COMPILE^^}" == "TRUE" ]; then + ./xmlchange DEBUG=${DEBUG_COMPILE^^} + fi + + # Run CIME case.build + ./case.build + + fi + + # Some user_nl settings won't be updated to *_in files under the run directory + # Call preview_namelists to make sure *_in and user_nl files are consistent. + echo $'\n----- Preview namelists -----\n' + ./preview_namelists + + popd +} + +#----------------------------------------------------- +runtime_options() { + + echo $'\n----- Starting runtime_options -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Set simulation start date + ./xmlchange RUN_STARTDATE=${START_DATE} + + # Segment length + ./xmlchange STOP_OPTION=${STOP_OPTION,,},STOP_N=${STOP_N} + + # Restart frequency + ./xmlchange REST_OPTION=${REST_OPTION,,},REST_N=${REST_N} + + # Coupler history + ./xmlchange HIST_OPTION=${HIST_OPTION,,},HIST_N=${HIST_N} + + # Coupler budgets (always on) + ./xmlchange BUDGETS=TRUE + + # Set resubmissions + if (( RESUBMIT > 0 )); then + ./xmlchange RESUBMIT=${RESUBMIT} + fi + + # Run type + # Start from default of user-specified initial conditions + if [ "${MODEL_START_TYPE,,}" == "initial" ]; then + ./xmlchange RUN_TYPE="startup" + ./xmlchange CONTINUE_RUN="FALSE" + + # Continue existing run + elif [ "${MODEL_START_TYPE,,}" == "continue" ]; then + ./xmlchange CONTINUE_RUN="TRUE" + + elif [ "${MODEL_START_TYPE,,}" == "branch" ] || [ "${MODEL_START_TYPE,,}" == "hybrid" ]; then + ./xmlchange RUN_TYPE=${MODEL_START_TYPE,,} + ./xmlchange GET_REFCASE=${GET_REFCASE} + ./xmlchange RUN_REFDIR=${RUN_REFDIR} + ./xmlchange RUN_REFCASE=${RUN_REFCASE} + ./xmlchange RUN_REFDATE=${RUN_REFDATE} + echo 'Warning: $MODEL_START_TYPE = '${MODEL_START_TYPE} + echo '$RUN_REFDIR = '${RUN_REFDIR} + echo '$RUN_REFCASE = '${RUN_REFCASE} + echo '$RUN_REFDATE = '${START_DATE} + else + echo 'ERROR: $MODEL_START_TYPE = '${MODEL_START_TYPE}' is unrecognized. Exiting.' + exit 380 + fi + + # Patch mpas streams files + patch_mpas_streams + + popd +} + +#----------------------------------------------------- +case_submit() { + + if [ "${do_case_submit,,}" != "true" ]; then + echo $'\n----- Skipping case_submit -----\n' + return + fi + + echo $'\n----- Starting case_submit -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Run CIME case.submit + ./case.submit + + popd +} + +#----------------------------------------------------- +copy_script() { + + echo $'\n----- Saving run script for provenance -----\n' + + local script_provenance_dir=${CASE_SCRIPTS_DIR}/run_script_provenance + mkdir -p ${script_provenance_dir} + local this_script_name=`basename $0` + local script_provenance_name=${this_script_name}.`date +%Y%m%d-%H%M%S` + cp -vp ${this_script_name} ${script_provenance_dir}/${script_provenance_name} + +} + +#----------------------------------------------------- +# Silent versions of popd and pushd +pushd() { + command pushd "$@" > /dev/null +} +popd() { + command popd "$@" > /dev/null +} + +# Now, actually run the script +#----------------------------------------------------- +main + diff --git a/components/mpas-ocean/docs/dev-guide/index.md b/components/mpas-ocean/docs/dev-guide/index.md new file mode 100644 index 00000000000..c7665da944c --- /dev/null +++ b/components/mpas-ocean/docs/dev-guide/index.md @@ -0,0 +1,5 @@ +# MPAS-Ocean Developer Guide + +The E3SM developer guide may be found at [https://e3sm.org/model/running-e3sm/developing-e3sm/](https://e3sm.org/model/running-e3sm/developing-e3sm/). + +The MPAS developers guide is at [https://mpas-dev.github.io/files/documents/MPAS-DevelopersGuide.pdf](https://mpas-dev.github.io/files/documents/MPAS-DevelopersGuide.pdf). diff --git a/components/mpas-ocean/docs/gcase.template.v3LR.chrysalis.sh b/components/mpas-ocean/docs/gcase.template.v3LR.chrysalis.sh new file mode 100755 index 00000000000..b9fff6197f8 --- /dev/null +++ b/components/mpas-ocean/docs/gcase.template.v3LR.chrysalis.sh @@ -0,0 +1,498 @@ +#!/bin/bash -fe + +# E3SM Coupled Model Group run_e3sm script template. +# +# Bash coding style inspired by: +# http://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming + +main() { + +# For debugging, uncomment libe below +#set -x + +# --- Configuration flags ---- + +# Machine and project +readonly MACHINE=chrysalis +readonly PROJECT="e3sm" + +# Simulation +readonly COMPSET="GMPAS-JRA1p5" +readonly RESOLUTION="TL319_IcoswISC30E3r5" +readonly CASE_NAME="test4.GMPAS-JRA.TL319_IcoswISC30E3r5.chrysalis" # MODIFY +#readonly CASE_GROUP="" + +# Code and compilation +readonly CHECKOUT="20240304" +readonly BRANCH="399d430" # master as of 2024-03-04 E3Sm v3.0.0 tag +#readonly CHERRY=() +readonly DEBUG_COMPILE=false + +# Run options +readonly MODEL_START_TYPE="initial" # 'initial', 'continue', 'branch', 'hybrid' +readonly START_DATE="0001-01-01" + +# Additional options for 'branch' and 'hybrid' +# readonly GET_REFCASE=TRUE +# readonly RUN_REFDIR="" +# readonly RUN_REFCASE="" +# readonly RUN_REFDATE="0301-01-01" + +# Set paths +readonly CODE_ROOT="/lcrc/group/e3sm/${USER}/E3SM/code/${CHECKOUT}" +readonly CASE_ROOT="/lcrc/group/e3sm/${USER}/e3sm_scratch/${MACHINE}/${CASE_NAME}" + +# Sub-directories +readonly CASE_BUILD_DIR=${CASE_ROOT}/build +readonly CASE_ARCHIVE_DIR=${CASE_ROOT}/archive + +# Define type of run +# short tests: 'S_2x5_ndays', 'M_1x10_ndays', 'M80_1x10_ndays' +# or 'production' for full simulation + +#readonly run='S_1x1_nmonth' +readonly run='production' +if [ "${run}" != "production" ]; then + + # Short test simulations + tmp=($(echo $run | tr "_" " ")) + layout=${tmp[0]} + units=${tmp[2]} + resubmit=$(( ${tmp[1]%%x*} -1 )) + length=${tmp[1]##*x} + + readonly CASE_SCRIPTS_DIR=${CASE_ROOT}/tests/${run}/case_scripts + readonly CASE_RUN_DIR=${CASE_ROOT}/tests/${run}/run + readonly PELAYOUT=${layout} + readonly WALLTIME="2:00:00" + readonly STOP_OPTION=${units} + readonly STOP_N=${length} + readonly REST_OPTION=${STOP_OPTION} + readonly REST_N=${STOP_N} + readonly RESUBMIT=${resubmit} + readonly DO_SHORT_TERM_ARCHIVING=false + +else + + # Production simulation + readonly CASE_SCRIPTS_DIR=${CASE_ROOT}/case_scripts + readonly CASE_RUN_DIR=${CASE_ROOT}/run + readonly PELAYOUT="L" + readonly WALLTIME="02:00:00" + readonly STOP_OPTION="nmonths" + readonly STOP_N="1" + readonly REST_OPTION="nmonths" + readonly REST_N="1" + readonly RESUBMIT="0" + readonly DO_SHORT_TERM_ARCHIVING=false +fi + +# Coupler history +readonly HIST_OPTION="nmonths" +readonly HIST_N="1" + +# Leave empty (unless you understand what it does) +readonly OLD_EXECUTABLE="" + +# --- Toggle flags for what to do ---- +do_fetch_code=false +do_create_newcase=true +do_modify_pelayout=false +do_case_setup=true +do_case_build=true +do_case_submit=true + +# --- Now, do the work --- + +# Make directories created by this script world-readable +umask 022 + +# Fetch code from Github +fetch_code + +# Create case +create_newcase + +# Custom PE layout +modify_pelayout + +# Setup +case_setup + +# Build +case_build + +# Configure runtime options +runtime_options + +# Copy script into case_script directory for provenance +copy_script + +# Submit +case_submit + +# All done +echo $'\n----- All done -----\n' + +} + +# ======================= +# Custom user_nl settings +# ======================= + +user_nl() { + +cat << EOF >> user_nl_eam +EOF + +cat << EOF >> user_nl_elm +EOF + +cat << EOF >> user_nl_mpaso +EOF + +cat << EOF >> user_nl_mpassi +EOF + +} + +# ===================================== +# Customize MPAS stream files if needed +# ===================================== + +patch_mpas_streams() { + +echo + +} + +# ===================================================== +# Custom PE layout: +# ===================================================== + +modify_pelayout() { + + if [ "${do_modify_pelayout,,}" != "true" ]; then + echo $'\n----- Skipping changing PE-layout -----\n' + return + fi + + echo $'\n----- changing PE layout to custom -----\n' + pushd ${CASE_SCRIPTS_DIR} + + ./xmlchange MAX_MPITASKS_PER_NODE=32 + ./xmlchange MAX_TASKS_PER_NODE=256 + ./xmlchange NTASKS_ATM=1024 + ./xmlchange NTASKS_CPL=1024 + ./xmlchange NTASKS_OCN=1024 + ./xmlchange NTASKS_WAV=1024 + ./xmlchange NTASKS_GLC=1024 + ./xmlchange NTASKS_ICE=1024 + ./xmlchange NTASKS_ROF=1024 + ./xmlchange NTASKS_LND=1024 + ./xmlchange NTASKS_ESP=1 + ./xmlchange NTASKS_IAC=1 + + ./xmlchange NTHRDS_ATM=8 + ./xmlchange NTHRDS_CPL=8 + ./xmlchange NTHRDS_OCN=8 + ./xmlchange NTHRDS_WAV=8 + ./xmlchange NTHRDS_GLC=1 + ./xmlchange NTHRDS_ICE=8 + ./xmlchange NTHRDS_ROF=8 + ./xmlchange NTHRDS_LND=8 + ./xmlchange NTHRDS_ESP=1 + ./xmlchange NTHRDS_IAC=1 + + ./xmlchange ROOTPE_ATM=0 + ./xmlchange ROOTPE_CPL=0 + ./xmlchange ROOTPE_OCN=0 + ./xmlchange ROOTPE_WAV=0 + ./xmlchange ROOTPE_GLC=0 + ./xmlchange ROOTPE_ICE=0 + ./xmlchange ROOTPE_ROF=0 + ./xmlchange ROOTPE_LND=0 + ./xmlchange ROOTPE_ESP=0 + ./xmlchange ROOTPE_IAC=0 + + popd + + } +###################################################### +### Most users won't need to change anything below ### +###################################################### + +#----------------------------------------------------- +fetch_code() { + + if [ "${do_fetch_code,,}" != "true" ]; then + echo $'\n----- Skipping fetch_code -----\n' + return + fi + + echo $'\n----- Starting fetch_code -----\n' + local path=${CODE_ROOT} + local repo=E3SM + + echo "Cloning $repo repository branch $BRANCH under $path" + if [ -d "${path}" ]; then + echo "ERROR: Directory already exists. Not overwriting" + exit 20 + fi + mkdir -p ${path} + pushd ${path} + + # This will put repository, with all code + git clone git@github.com:E3SM-Project/${repo}.git . + + # Check out desired branch + git checkout ${BRANCH} + + # Custom addition + if [ "${CHERRY}" != "" ]; then + echo ----- WARNING: adding git cherry-pick ----- + for commit in "${CHERRY[@]}" + do + echo ${commit} + git cherry-pick ${commit} + done + echo ------------------------------------------- + fi + + # Bring in all submodule components + git submodule update --init --recursive + + popd +} + +#----------------------------------------------------- +create_newcase() { + + if [ "${do_create_newcase,,}" != "true" ]; then + echo $'\n----- Skipping create_newcase -----\n' + return + fi + + echo $'\n----- Starting create_newcase -----\n' + + if [[ ${PELAYOUT} == custom-* ]]; + then + layout="M" # temporary placeholder for create_newcase + else + layout=${PELAYOUT} + + fi + ${CODE_ROOT}/cime/scripts/create_newcase \ + --case ${CASE_NAME} \ + --output-root ${CASE_ROOT} \ + --script-root ${CASE_SCRIPTS_DIR} \ + --handle-preexisting-dirs u \ + --compset ${COMPSET} \ + --res ${RESOLUTION} \ + --machine ${MACHINE} ${COMPILER} \ + --project ${PROJECT} \ + --walltime ${WALLTIME} \ + --pecount ${layout} \ + + if [ $? != 0 ]; then + echo $'\nNote: if create_newcase failed because sub-directory already exists:' + echo $' * delete old case_script sub-directory' + echo $' * or set do_newcase=false\n' + exit 35 + fi + +} + +#----------------------------------------------------- +case_setup() { + + if [ "${do_case_setup,,}" != "true" ]; then + echo $'\n----- Skipping case_setup -----\n' + return + fi + + echo $'\n----- Starting case_setup -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Setup some CIME directories + ./xmlchange EXEROOT=${CASE_BUILD_DIR} + ./xmlchange RUNDIR=${CASE_RUN_DIR} + + # Short term archiving + ./xmlchange DOUT_S=${DO_SHORT_TERM_ARCHIVING^^} + ./xmlchange DOUT_S_ROOT=${CASE_ARCHIVE_DIR} + + # Build with COSP, except for a data atmosphere (datm) + if [ `./xmlquery --value COMP_ATM` == "datm" ]; then + echo $'\nThe specified configuration uses a data atmosphere, so cannot activate COSP simulator\n' + else + echo $'\nConfiguring E3SM to use the COSP simulator\n' + ./xmlchange --id CAM_CONFIG_OPTS --append --val='-cosp' + fi + + # Extracts input_data_dir in case it is needed for user edits to the namelist later + local input_data_dir=`./xmlquery DIN_LOC_ROOT --value` + + # Custom user_nl + user_nl + + # Finally, run CIME case.setup + ./case.setup --reset + + popd +} + +#----------------------------------------------------- +case_build() { + + pushd ${CASE_SCRIPTS_DIR} + + # do_case_build = false + if [ "${do_case_build,,}" != "true" ]; then + + echo $'\n----- case_build -----\n' + + if [ "${OLD_EXECUTABLE}" == "" ]; then + # Ues previously built executable, make sure it exists + if [ -x ${CASE_BUILD_DIR}/e3sm.exe ]; then + echo 'Skipping build because $do_case_build = '${do_case_build} + else + echo 'ERROR: $do_case_build = '${do_case_build}' but no executable exists for this case.' + exit 297 + fi + else + # If absolute pathname exists and is executable, reuse pre-exiting executable + if [ -x ${OLD_EXECUTABLE} ]; then + echo 'Using $OLD_EXECUTABLE = '${OLD_EXECUTABLE} + cp -fp ${OLD_EXECUTABLE} ${CASE_BUILD_DIR}/ + else + echo 'ERROR: $OLD_EXECUTABLE = '$OLD_EXECUTABLE' does not exist or is not an executable file.' + exit 297 + fi + fi + echo 'WARNING: Setting BUILD_COMPLETE = TRUE. This is a little risky, but trusting the user.' + ./xmlchange BUILD_COMPLETE=TRUE + + # do_case_build = true + else + + echo $'\n----- Starting case_build -----\n' + + # Turn on debug compilation option if requested + if [ "${DEBUG_COMPILE^^}" == "TRUE" ]; then + ./xmlchange DEBUG=${DEBUG_COMPILE^^} + fi + + # Run CIME case.build + ./case.build + + fi + + # Some user_nl settings won't be updated to *_in files under the run directory + # Call preview_namelists to make sure *_in and user_nl files are consistent. + echo $'\n----- Preview namelists -----\n' + ./preview_namelists + + popd +} + +#----------------------------------------------------- +runtime_options() { + + echo $'\n----- Starting runtime_options -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Set simulation start date + ./xmlchange RUN_STARTDATE=${START_DATE} + + # Segment length + ./xmlchange STOP_OPTION=${STOP_OPTION,,},STOP_N=${STOP_N} + + # Restart frequency + ./xmlchange REST_OPTION=${REST_OPTION,,},REST_N=${REST_N} + + # Coupler history + ./xmlchange HIST_OPTION=${HIST_OPTION,,},HIST_N=${HIST_N} + + # Coupler budgets (always on) + ./xmlchange BUDGETS=TRUE + + # Set resubmissions + if (( RESUBMIT > 0 )); then + ./xmlchange RESUBMIT=${RESUBMIT} + fi + + # Run type + # Start from default of user-specified initial conditions + if [ "${MODEL_START_TYPE,,}" == "initial" ]; then + ./xmlchange RUN_TYPE="startup" + ./xmlchange CONTINUE_RUN="FALSE" + + # Continue existing run + elif [ "${MODEL_START_TYPE,,}" == "continue" ]; then + ./xmlchange CONTINUE_RUN="TRUE" + + elif [ "${MODEL_START_TYPE,,}" == "branch" ] || [ "${MODEL_START_TYPE,,}" == "hybrid" ]; then + ./xmlchange RUN_TYPE=${MODEL_START_TYPE,,} + ./xmlchange GET_REFCASE=${GET_REFCASE} + ./xmlchange RUN_REFDIR=${RUN_REFDIR} + ./xmlchange RUN_REFCASE=${RUN_REFCASE} + ./xmlchange RUN_REFDATE=${RUN_REFDATE} + echo 'Warning: $MODEL_START_TYPE = '${MODEL_START_TYPE} + echo '$RUN_REFDIR = '${RUN_REFDIR} + echo '$RUN_REFCASE = '${RUN_REFCASE} + echo '$RUN_REFDATE = '${START_DATE} + else + echo 'ERROR: $MODEL_START_TYPE = '${MODEL_START_TYPE}' is unrecognized. Exiting.' + exit 380 + fi + + # Patch mpas streams files + patch_mpas_streams + + popd +} + +#----------------------------------------------------- +case_submit() { + + if [ "${do_case_submit,,}" != "true" ]; then + echo $'\n----- Skipping case_submit -----\n' + return + fi + + echo $'\n----- Starting case_submit -----\n' + pushd ${CASE_SCRIPTS_DIR} + + # Run CIME case.submit + ./case.submit + + popd +} + +#----------------------------------------------------- +copy_script() { + + echo $'\n----- Saving run script for provenance -----\n' + + local script_provenance_dir=${CASE_SCRIPTS_DIR}/run_script_provenance + mkdir -p ${script_provenance_dir} + local this_script_name=`basename $0` + local script_provenance_name=${this_script_name}.`date +%Y%m%d-%H%M%S` + cp -vp ${this_script_name} ${script_provenance_dir}/${script_provenance_name} + +} + +#----------------------------------------------------- +# Silent versions of popd and pushd +pushd() { + command pushd "$@" > /dev/null +} +popd() { + command popd "$@" > /dev/null +} + +# Now, actually run the script +#----------------------------------------------------- +main + diff --git a/components/mpas-ocean/docs/index.md b/components/mpas-ocean/docs/index.md new file mode 100644 index 00000000000..4e75ec0f8e8 --- /dev/null +++ b/components/mpas-ocean/docs/index.md @@ -0,0 +1,7 @@ +# Model for Prediction Across Scales-Ocean + +The Model for Prediction Across Scales-Ocean (MPAS-Ocean) is the ocean component of the Energy Exascale Earth System Model (E3SM), developed by the U.S. Department of Energy. + +* The [MPAS-Ocean User Guide](user-guide/index.md) explains how to run and customize MPAS-Ocean within E3SM. +* The [MPAS-Ocean Developer Guide](dev-guide/index.md) explains MPAS-Ocean data structures and how to write new code. +* The [MPAS-Ocean Technical Guide](tech-guide/index.md) explains the science behind MPAS-Ocean. diff --git a/components/mpas-ocean/docs/tech-guide/index.md b/components/mpas-ocean/docs/tech-guide/index.md new file mode 100644 index 00000000000..beb4d1e9e7a --- /dev/null +++ b/components/mpas-ocean/docs/tech-guide/index.md @@ -0,0 +1,29 @@ +# MPAS-Ocean Technical Guide + +This Technical Guide describes the governing equations, physics, and numerical discretizations of MPAS-Ocean. + +## Guides, Design Documents, and documentation + +MPAS-Ocean may be run as either a stand-alone model, or within the E3SM coupled climate model. +The MPAS-Ocean code for both stand-alone and coupled is housed in the repository [https://github.com/E3SM-Project/E3SM](https://github.com/E3SM-Project/E3SM) within the directory `components/mpas-ocean`. The stand-alone executable may be built within that directory using the make command with the required libraries, as described in Chapter 1 of the [User's Guide](https://zenodo.org/records/11098080). + +The [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080) provides a description of the MPAS Framework in Part I, the Governing equations for MPAS-Ocean in Chapter 8, and describes the physics behind each term and parameterization in chapter 11. + +All new features are created with design documents. The location of these documents have moved over the years, but can still be found in these locations: + +1. [MPAS Documents repository](https://github.com/MPAS-Dev/MPAS-Documents/tree/master/ocean) +2. [E3SM repository MPAS-Ocean docs](https://github.com/E3SM-Project/E3SM/tree/master/components/mpas-ocean/docs/design_docs) +3. Documents for the new Omega model are similar to MPAS-Ocean and may be found in the [Omega documentation](https://docs.e3sm.org/Omega/develop/index.html). + +All test cases are housed in the [Compass repository](https://github.com/MPAS-Dev/compass) and, more recently, the [Polaris repository](https://github.com/E3SM-Project/polaris). The corresponding documentation is housed in the [Compass docs](https://mpas-dev.github.io/compass/latest/) and [Polaris docs](http://docs.e3sm.org/polaris/main/) pages. + +## Publications + +Beyond the documentation, there are many publications that describe the inner workings of MPAS-Ocean: + +Ringler, T., Petersen, M., Higdon, R.L., Jacobsen, D., Jones, P.W., Maltrud, M., 2013. +[A multi-resolution approach to global ocean modeling](https://doi.org/10.1016/j.ocemod.2013.04.010). Ocean Modelling 69, 211-232. + +Petersen, M.R., D.W. Jacobsen, T.D. Ringler, M.W. Hecht, M.E. Maltrud, [Evaluation of the arbitrary Lagrangian–Eulerian vertical coordinate method in the MPAS-Ocean model](http://dx.doi.org/10.1016/j.ocemod.2014.12.004), Ocean Modelling, Volume 86, February 2015, Pages 93-113, ISSN 1463-5003. + +Petersen, M. R., Asay‐Davis, X. S., Berres, A. S., Chen, Q., Feige, N., Hoffman, M. J., et al. (2019). [An evaluation of the ocean and sea ice climate of E3SM using MPAS and interannual CORE‐II forcing](https://doi.org/10.1029/2018MS001373). Journal of Advances in Modeling Earth Systems, 11, 1438– 1458. diff --git a/components/mpas-ocean/docs/user-guide/index.md b/components/mpas-ocean/docs/user-guide/index.md new file mode 100644 index 00000000000..5877ed29aad --- /dev/null +++ b/components/mpas-ocean/docs/user-guide/index.md @@ -0,0 +1,210 @@ + +# MPAS-Ocean Quick Start + +This MPAS-Ocean Quick Start Guide describes how to set up and run MPAS-Ocean within E3SM. More details can be found in the [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080), as well as instructions on running the stand-alone ocean model. + +## Table of contents + +1. [Steps to build and run MPAS-Ocean](#steps-to-build-and-run-mpas-ocean) +2. [Scientifically supported compsets and meshes](#scientifically-supported-compsets-and-meshes) + 1. [Compsets](#compsets) + 2. [Meshes](#meshes) +3. [Customizing runs](#customizing-runs) + 1. [Namelist changes](#namelist-changes) + 2. [Configuring input and output for MPAS-Ocean](#configuring-input-and-output-for-mpas-ocean) + +## Steps to build and run MPAS-Ocean + +Step-by-step instructions on how to run E3SM can be found at [https://docs.e3sm.org/running-e3sm-guide](https://docs.e3sm.org/running-e3sm-guide). + +This MPAS-Ocean Quick Start guide provides the additional information to run configurations that are not fully-coupled (e.g. C-case: active ocean only; G-case: active ocean and sea ice) within E3SM. This is done by changing the compset. Certain parameters, including the mesh, namelist parameters, input data files, and output file specifcations can also be modified. These are described below as ways to customize runs. + +Templates of 1-month example E3SM run-scripts for a [G-case](../gcase.template.v3LR.chrysalis.sh) and [C-case](../ccase.template.v3LR.anvil.sh) are provided. Key information for the user to modify includes: + +- `MACHINE` and `PROJECT` if applicable +- Paths for code repository in `CODE_ROOT` and case directory in `CASE_ROOT`, which includes the run directory for output. +- Simulation compsets, resolution and name (see below) +- Wallclock duration in `WALLTIME` and simulation duration with `STOP_OPTION` and `STOP_N`. + +Additional runscript examples can be found [here](https://github.com/E3SM-Project/SimulationScripts/tree/master/archive/CoupledGroup/v3.LR) for v3.LR. + +## Scientifically supported compsets and meshes + +### Compsets + +The compsets below are typical ocean and sea ice-focused compsets supported by E3SM: + +`GMPAS-JRA1p5` - Active ocean-sea ice configuration forced by data atmosphere based on JRA55 v1.5 (covers 63 years, 1958-2020) + +`GMPAS-IAF` - Active ocean-sea ice configuration forced by data atmosphere based on CORE-II (covers 62 years, 1948-2009) + +`GMPAS-JRA1p5-DIB-DISMF` - Active ocean-sea ice configuration forced by JRA55 v1.5 atmosphere (as above), with data iceberg and data ice-shelf melt + +`GMPAS-JRA1p5-DIB-PISMF` - Active ocean-sea ice configuration forced by JRA55 v1.5 atmosphere (as above), with data iceberg and prognostic ice-shelf melt + +`CMPASO-JRA1p4` - Active ocean configuration forced by data atmosphere based on JRA55 v1.4 (covers 61 years, 1958-2018) + +`CMPASO-IAF` - Active ocean configuration forced by data atmosphere based on CORE-II (covers 62 years, 1948-2009) + +Additional compsets can be found in the [mpas-ocean `config_compsets.xml`](https://github.com/E3SM-Project/E3SM/blob/master/components/mpas-ocean/cime_config/config_compsets.xml). Note that the fully coupled compsets and their aliases can be found in the [cime allactive `config_compsets.xml`](https://github.com/E3SM-Project/E3SM/blob/master/cime_config/allactive/config_compsets.xml). +For more information on the schemes used within MPAS-Ocean, refer to the [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080). + +A full list of Compsets in the current repository can be listed using + +```text +cd cime/scripts +./query_config --compsets +``` + +### Meshes + +Some supported meshes for G- and C-cases include: + +`TL319_IcoswISC30E3r5` - Icosahedral 30 km mesh with ice shelves cavities (wISC), E3SMv3 (E3) revision r5, TL319 is the grid for JRA. + +`T62_IcoswISC30E3r5` - Icosahedral 30 km mesh with ice shelves cavities (wISC), E3SMv3 (E3) revision r5, T62 is the grid for CORE-II. + +`T62_oQU240` - Quasi uniform 2-degree ocean mesh, to be used with CORE-II only. Good for rapid testing, used in nightly testing **not** production runs. This grid is not scientifically validated . + +Note: the mesh should be consistent with the compset (e.g. JRA vs CORE). Additional mesh information can be found [here](https://github.com/E3SM-Project/E3SM/blob/master/cime_config/config_grids.xml). + +A full list of Meshes in the current repository can be listed using + +```text +cd cime/scripts +./query_config --grids +``` + +## Customizing runs + +### Namelist changes + +Without additional input, E3SM will generate the namelist file `mpaso_in` in the run directory using the default values for the compset and mesh requested. +Namelist parameters can be changed from default values by modifying the `user_nl_mpaso` file, found in the `case_scripts` directory. This is done by entering ``[namelist option] = [changed value]`` as separate lines in the ``user_nl_mpaso`` file. All other options will remain defaults. These changes can be added at run time and will take effect in the next submission. + +Refer to the [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080) (Chapter 10) for a comprehensive description of the namelist parameters and the options that they correspond to. Namelist options may also be found in the code repository in the file `components/mpas-ocean/src/Registry.xml` for general flags, `components/mpas-ocean/src/tracer_groups/Registry_*.xml` for specific tracer group flags, and `components/mpas-ocean/src/analysis_members/Registry_*.xml` for analysis member flags. + +#### Example of a namelist change via `user_nl_mpaso` + +```text + config_GM_closure = 'constant' + config_gm_constant_kappa = 900 + config_time_integrator = 'split_explicit' + config_am_timeseriesstatsmonthly_compute_interval = '00-00-01_00:00:00' +``` + +In this example, the namelist changes include changing the eddy closure (first 2 options for the type of closure and a parameter value), switching the time integration scheme, and modifying an analysis member (in this case, the interval from which the monthly analysis member is computed). + +Reminder: `user_nl_mpaso` can be empty. All options not specified are defaults (given the compset and mesh). Some options (like interior restoring) require extra fields to be present in the input file. + +### Configuring input and output for MPAS-Ocean + +The reading and writing of model fields in MPAS is handled by user-configurable streams. A stream +represents a fixed set of model fields, together with dimensions and attributes, that are all written +or read together to or from the same file or set of files. They are used for reading initial conditions, for writing and reading restart fields, and for writing additional model history fields. +Streams are defined in XML configuration files that are created at build time for each model core. The name of this XML file for the ocean core is `streams.ocean` (the sea ice has a similar `streams.seaice`). Importantly, the stream file is generated in the run directory during the ``./case.setup`` step, but **changes made into the run directory will not take effect**. To make changes to the output fields, **copy the `streams.ocean` file from the run directory into the``case_scripts/SourceMods/src.mpaso/`` directory**. Changes to the stream file made into the ``SourceMods`` sub-directory will take effect on the next case submission (there is no need to re-compile after making modifications to the XML file). Alternatively, changes to the streams file can be made directly in the code in ``components/mpas-ocean/cime_config/buildnml``. + +#### Checking initial conditions + +Key information to check regarding the input data typically include: + +```text + + +``` + +The `mesh` filename points to the mesh file used. The `input` filename points to the file containing the ocean initial conditions (if the run type is `initial`). +The streams file can be large, it is often useful to rely on the search function to navigate it. For larger meshes (millions of horizontal cells) the flag `io_type="pnetcdf"` must be changed to `io_type="pnetcdf,cdf5"`. + +#### Checking and modifying the output data + +By default, MPAS-Ocean will output a set of monthly-averaged variables. The streams file can be modified to include additional variables in the existing output files, produce additional output files, or change the output frequency (e.g. high frequency files shifting between daily or 5-daily frequencies). + +The XML file is organized into blocks describing each stream. Typical streams for output include: + +`timeSeriesStatsMonthlyOutput` - monthly averaged output + +`highFrequencyOutput` - high frequency snapshots (not averaged) output with frequency `output_interval` + +Under each block header is the list of variables (individual variables, variable structure, or variable arrays) that will be output within the relevant stream. + +##### Example workflow for modifying the output fields + +- copy the `streams.ocean` file from the run directory to the `SourceMods` directory (see above) +- identify the variable name for the variable of interest. You can find the variable name by searching the ocean Registry.xml (in the `src` directory) or Registry_package.xml in the `tracer` and `analysis_member` sub-directories. Note whether the variable of interest is included within a `var_array` or a `var_struct`. +- identify the output stream of interest (e.g. monthly averages, high frequency, others). You can search for a stream name, known output filename, or output interval. +- check whether the variable of interest is included in the `streams.ocean` file. Search for the `var name`, or the `var_array` and `var_struct` if applicable. If it is, copy the variable line from other streams into the stream of interest. If it is not included, copy it from the Registry.xml. +- check whether the relevant stream is turned on. This includes checking that `output_interval` in the stream header is not `None`. +- make further modifications: e.g. you can modify the `output_interval` for the high-frequency stream. If you are turning on a new stream, remove unnecessary variables from the stream. + +##### Excerpts from a `streams.ocean` file + +```text + + + + + + + + + + +... + +``` + +```text + + + + + + + + + + + + + + + + + + + + + +``` + +A more comprehensive description of the streams options can be found in Chapter 6 of the [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080). From eb559837a3ad57dfcb01f42e88b398c341dc5a70 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 2 May 2024 13:24:40 -0700 Subject: [PATCH 268/310] Fix the citations format in EAM docs --- components/eam/docs/tech-guide/armdiags.md | 2 +- components/eam/docs/tech-guide/clubb.md | 9 +-------- components/eam/docs/tech-guide/cosp.md | 9 +-------- components/eam/docs/tech-guide/homme.md | 9 +-------- components/eam/docs/tech-guide/mam.md | 2 +- 5 files changed, 5 insertions(+), 26 deletions(-) diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md index 6fe1f86817e..fa21f87ae3e 100644 --- a/components/eam/docs/tech-guide/armdiags.md +++ b/components/eam/docs/tech-guide/armdiags.md @@ -2,7 +2,7 @@ ## Overview -The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al. 2020) [@zhang_arm_2020]. It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al. 2023 [@zheng_assessment_2023]; Emmenegger et al. 2022 [@emmenegger_evaluating_2022]; Zhang et al. 2018 [@zhang_causes_2018]). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al. 2022) [@zhang_e3sm_2022] for routine evaluation of the model. +The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al., 2020) [@zhang_arm_2020]. It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al., 2023 [@zheng_assessment_2023]; Emmenegger et al., 2022 [@emmenegger_evaluating_2022]; Zhang et al., 2018 [@zhang_causes_2018]). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al., 2022) [@zhang_e3sm_2022] for routine evaluation of the model. ## To enable the use of ARM Diags diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md index 49f66cde31a..7b7fcc413bd 100644 --- a/components/eam/docs/tech-guide/clubb.md +++ b/components/eam/docs/tech-guide/clubb.md @@ -2,14 +2,7 @@ ## Overview -The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds. It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. - -### References - -- Larson (2022) [@larson_clubb-silhs_2022] -- Bogenschutz et al. (2018) [@bogenschutz_path_2018] -- Larson and Golaz (2005) [@larson_using_2005] -- Golaz et al. (2002) [@golaz_pdf-based_2002] +The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds. [@larson_clubb-silhs_2022,@bogenschutz_path_2018,@larson_using_2005,@golaz_pdf-based_2002] It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. ## Namelist parameters diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md index 8cd1db8379d..1c54bb37235 100644 --- a/components/eam/docs/tech-guide/cosp.md +++ b/components/eam/docs/tech-guide/cosp.md @@ -2,14 +2,7 @@ ## Overview -The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011; Swales et al., 2018) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. - -### References - -- Zhang et al. (2024) [@zhang_understanding_2024] -- Zhang et al. (2019) [@zhang_evaluation_2019] -- Swales et al. (2018) [@swales_cloud_2018] -- Bodas-Salcedo et al. (2011) [@bodas-salcedo_cosp_2011] +The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011 [@bodas-salcedo_cosp_2011]; Swales et al., 2018 [@swales_cloud_2018]; Zhang et al., 2019 [@zhang_evaluation_2019]; Zhang et al., 2024 [@zhang_understanding_2024]) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. ## To turn on COSP outputs diff --git a/components/eam/docs/tech-guide/homme.md b/components/eam/docs/tech-guide/homme.md index 48c693a1dfe..e7a6e4c5850 100644 --- a/components/eam/docs/tech-guide/homme.md +++ b/components/eam/docs/tech-guide/homme.md @@ -2,14 +2,7 @@ ## Overview -EAM using the a dynamical core (dycore) from the High Order Method Modeling Environment (HOMME). The EAM dycore solves the atmospheric primitive equations governing the evolution of velocity, density, pressure and temperature, as well as the transport of water species and related hydrometers, aerosols and other atmospheric constituents. The governing equations are written in a vertically lagrangian terrain following mass coordinate. They are discretized with second order finite differences in the radial direction and spectral finite elements in the horizontal (surface of the sphere) directions, and advanced in time with a 3rd order accurate 5 stage Runge-Kutta method. Dissipation is added through the use of monotoncity contraints on some advectiion terms, explicitly added hyperviscosity, and a Laplacian-based sponge layer in the first few layers at the model top. The transported species makes use of an efficient interpolatory semi-Lagrangian method. EAMv3 uses 80 layers in the vertical. The use of the spectral finite element method allows EAMv3 to run on fully unstructured grids, including the cubed-sphere grid ([SE Atmosphere Grid Overview (EAM & CAM)](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/34113147)) which provides quasi-uniform resolution over the globe, and regionally refined meshes (RRM) which enhance horizontal resolution in regions of interest ([Library of Regionally-Refined Model (RRM) Grids](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3690397775)). - -### References - -- Taylor et al. (2020) [@taylor_energy_2020] -- Bradley et al. (2022) [@bradley_islet_2022] -- Guba et al. (2014) [@guba_spectral_2014] -- Taylor and Fournier (2010) [@taylor_compatible_2010] +EAM uses the a dynamical core (dycore) from the High Order Method Modeling Environment (HOMME).[@taylor_compatible_2010,@guba_spectral_2014,@taylor_energy_2020] The EAM dycore solves the atmospheric primitive equations governing the evolution of velocity, density, pressure and temperature, as well as the transport of water species and related hydrometers, aerosols and other atmospheric constituents. The governing equations are written in a vertically lagrangian terrain following mass coordinate. They are discretized with second order finite differences in the radial direction and spectral finite elements in the horizontal (surface of the sphere) directions, and advanced in time with a 3rd order accurate 5 stage Runge-Kutta method. Dissipation is added through the use of monotoncity contraints on some advectiion terms, explicitly added hyperviscosity, and a Laplacian-based sponge layer in the first few layers at the model top. The transported species makes use of an efficient interpolatory semi-Lagrangian method. EAMv3 uses 80 layers in the vertical. The use of the spectral finite element method allows EAMv3 to run on fully unstructured grids, including the cubed-sphere grid ([SE Atmosphere Grid Overview (EAM & CAM)](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/34113147)) which provides quasi-uniform resolution over the globe, and regionally refined meshes (RRM) which enhance horizontal resolution in regions of interest ([Library of Regionally-Refined Model (RRM) Grids](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3690397775)). ## Namelist parameters diff --git a/components/eam/docs/tech-guide/mam.md b/components/eam/docs/tech-guide/mam.md index 644d4b3af51..3d63cc38b54 100644 --- a/components/eam/docs/tech-guide/mam.md +++ b/components/eam/docs/tech-guide/mam.md @@ -2,7 +2,7 @@ ## MAM5 Overview -The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020; [@wang_aerosols_2020] Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). [@visioni_limitations_2022] Volcanic eruptions derived from Neely and Schmidt (2016). [@neely_iii_volcaneesm_2016] +The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020 [@wang_aerosols_2020]; Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). [@visioni_limitations_2022] Volcanic eruptions derived from Neely and Schmidt (2016). [@neely_iii_volcaneesm_2016] ## MAM4 Overview From b0b532eb1daac7c451c6bee9e3bdcd685abee3e7 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 2 May 2024 13:48:01 -0700 Subject: [PATCH 269/310] Link all namelist parameters to single source in EAM docs --- .../eam/docs/tech-guide/chemUCIlinozv3.md | 21 +----------- components/eam/docs/tech-guide/clubb.md | 9 +---- components/eam/docs/tech-guide/cosp.md | 10 +++--- components/eam/docs/tech-guide/dust.md | 6 +--- components/eam/docs/tech-guide/homme.md | 10 +----- components/eam/docs/tech-guide/mam.md | 11 ++----- components/eam/docs/tech-guide/oceanfilms.md | 17 +--------- components/eam/docs/tech-guide/p3.md | 19 +---------- components/eam/docs/tech-guide/rrtmg.md | 10 +----- components/eam/docs/tech-guide/zm.md | 33 +------------------ 10 files changed, 15 insertions(+), 131 deletions(-) diff --git a/components/eam/docs/tech-guide/chemUCIlinozv3.md b/components/eam/docs/tech-guide/chemUCIlinozv3.md index f60f85edfcf..b6b202c00f8 100644 --- a/components/eam/docs/tech-guide/chemUCIlinozv3.md +++ b/components/eam/docs/tech-guide/chemUCIlinozv3.md @@ -6,23 +6,4 @@ Atmospheric interactive chemistry is handled by chemUCI (in the troposphere) and ## Namelist parameters -| Parameter | Description | Default value* | -| ---------------------------- | ------------------------------------------------------------------------ | ---------------------- | -| `airpl_emis_file` | Aviation emission | | -| `chlorine_loading_file` | Chlorine loading | | -| `chlorine_loading_fixed_ymd` | | | -| `chlorine_loading_type` | | | -| `ext_frc_specifier` | 3-D emissions | | -| `ext_frc_cycle_yr` | | | -| `ext_frc_type` | | | -| `srf_emis_specifier` | Surface emissions | | -| `srf_emis_cycle_yr` | | | -| `srf_emis_type` | Upper bound of mean raindrop diameter | | -| `linoz_data_file` | Linoz data file | | -| `linoz_data_cycle_yr` | | | -| `linoz_data_path` | | | -| `linoz_data_type` | | | -| `lght_no_prd_factor` | Lightning NOx emission factor | `5.0` | -| `fstrat_efold_list` | Tracer (from troposphere) list with e-folding decay in the stratosphere | | - -* Many of these namelist parameters specify input data files. Check the `atm_in` file for examples or refer to the [Users' Guide](../user-guide/index.md). +[chemUCI and Linoz Namelist Parameters](../user-guide/namelist_parameters.md#chemuci-and-linoz-v3) diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md index 7b7fcc413bd..8fa9cf772c0 100644 --- a/components/eam/docs/tech-guide/clubb.md +++ b/components/eam/docs/tech-guide/clubb.md @@ -6,11 +6,4 @@ The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameteriza ## Namelist parameters -| Parameter | Description | Default value | -| -------------- | ------------------------------------------------------------------------------------------- | -------------- | -| `gamma_coef` | Width of vertical velocity within a Gaussian PDF component at low skewness | `0.12` | -| `gamma_coefb` | Width of vertical velocity within a Gaussian PDF component at high skewness | `0.28` | -| `C8` | Coefficient of damping of third moment of vertical velocity, w’3 | `5.2` | -| `C1` | Coefficient of damping of second vertical moment of vertical velocity, w’2, at low skewness | `2.4` | -| `C14` | Coefficient of damping of second horizontal moments of vertical velocity, u’2 and v’2 | `2.0` | -| `c_k10` | Ratio of diffusivity of momentum to heat | `0.35` | +[CLUBB Namelist Parameters](../user-guide/namelist_parameters.md#cloud-layers-unified-by-binormals) diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md index 1c54bb37235..05e40591e7e 100644 --- a/components/eam/docs/tech-guide/cosp.md +++ b/components/eam/docs/tech-guide/cosp.md @@ -4,18 +4,16 @@ The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011 [@bodas-salcedo_cosp_2011]; Swales et al., 2018 [@swales_cloud_2018]; Zhang et al., 2019 [@zhang_evaluation_2019]; Zhang et al., 2024 [@zhang_understanding_2024]) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. +## Namelist parameters + +[COSP Namelist Parameters](../user-guide/namelist_parameters.md#cloud-feedback-model-intercomparison-project-cfmip-observation-simulator-package) + ## To turn on COSP outputs Run (add to the run script) the following command before running `./case.setup` `./xmlchange --id CAM_CONFIG_OPTS --append --val='-cosp'` -## Namelist parameters - -| Parameter | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `cosp_lite` | This namelist sets cosp_ncolumns=10 and cosp_nradsteps=3 (appropriate for COSP statistics derived from seasonal averages), and runs MISR, ISCCP, MODIS, and CALIPSO lidar simulators (cosp_lmisr_sim=.true.,cosp_lisccp_sim=.true., cosp_lmodis_sim=.true.,cosp_llidar_sim=.true.). | `false` | - | Related Outputs | Description | | ------------------------- | ----------------------------------------------------------------- | | `FISCCP1_COSP` | Grid-box fraction covered by each ISCCP D level cloud type | diff --git a/components/eam/docs/tech-guide/dust.md b/components/eam/docs/tech-guide/dust.md index aa389841b0c..1ed5092e3f2 100644 --- a/components/eam/docs/tech-guide/dust.md +++ b/components/eam/docs/tech-guide/dust.md @@ -6,8 +6,4 @@ Dust-related processes are represented in the E3SM atmosphere and land model com ## Namelist parameters -| Parameter | Description | Default value | -| ------------------------- | ---------------------------------------------- | ------------------------------------------------- | -| `dust_emis_scheme`* | The v3 dust emission scheme (Kok et al., 2014) | `2`
(set to 1 to switch to the v1/v2 scheme) | - -*This parameter is set in `user_nl_drv` +[Dust Namelist Parameters](../user-guide/namelist_parameters.md#dust-aerosol) diff --git a/components/eam/docs/tech-guide/homme.md b/components/eam/docs/tech-guide/homme.md index e7a6e4c5850..42561abde98 100644 --- a/components/eam/docs/tech-guide/homme.md +++ b/components/eam/docs/tech-guide/homme.md @@ -8,12 +8,4 @@ EAM uses the a dynamical core (dycore) from the High Order Method Modeling Envir Many dynamical core parameters can not be changed independently. For example, increasing the hyperviscosity coefficient may require reducing the hyperviscosity timestep. Dycore timesteps are tuned for each resolution and the defaults are close to the CFL stability limit. For complete details, as well as their interactions, see [EAM's HOMME dycore](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1044644202/EAM+s+HOMME+dycore). -| Parameter | Description | Default value | -| ---------------- | ------------------------------------------------------------------------------------------- | -------------- | -| `se_tstep` | Main dycore timestep. Additional parameters control the hyper viscsosity, trancer and vertical remap timesteps, which are derived from se_tstep.
units = seconds | Scales linearly with horizontal resolution.
NE30 default: `300` | -| `nu` | Tensor hyperviscosity coefficient, independent of spatial resolution.
units = 1/s | `3.4e-8` | -| `nu_top` | Scalar viscosity at model top.
units = m^2/s | Horizontal resolution dependent
NE30 default: `2.5e5` | -| `transport_alg` | Select between semi-lagrangian and Eulerian based transport schemes | `12` = semi-lagranian method with monotinicity and mass preservation | -| `statefreq` | print a varieity of dycore metrics to the atm.log file every “statefreq” timesteps | `480` | -| `vert_remap_alg` | Algorithm used to remap the vertically lagrangian levels back to the reference levels | `10` = strict monotonicity applied on top of a 2nd order accurate PPM method | -| `se_ftype` | Controls how physics tendencies are applied. 0=”dribbled” in during dynamics timesteps. 1=”hard adjustment” after each physics timestep. 2=hybrid approach: hard adjustment for tracers, dribbled for remaining tendencies | `2` | +[HOMME Namelist Parameters](../user-guide/namelist_parameters.md#homme) diff --git a/components/eam/docs/tech-guide/mam.md b/components/eam/docs/tech-guide/mam.md index 3d63cc38b54..3a677a96c87 100644 --- a/components/eam/docs/tech-guide/mam.md +++ b/components/eam/docs/tech-guide/mam.md @@ -12,11 +12,6 @@ The representation of atmospheric aerosols and their roles in the Earth system b In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) [@martensson_laboratory_2003] and Monahan et al. (1986), [@monahan_model_1986] and then redistributed to the three MAM4 size modes. -## MAM Namelist parameters - -| Parameter | Description | Default value | -| ------------------------ | ----------------------------------------------------------------------------------- | --------------------------- | -| `is_output_interactive_volc` | Switch for diagnostic output of the stratospheric aerosol optics | `.false.` | -| `mam_amicphys_optaa` | Recommended option of the new time-splitting treatment of H2SO4 production and loss | `1`
(0 to turn it off) | -| `n_so4_monolayers_pcage` | Number of monolayers required to age primary-carbon mode particles | `3` | -| `seasalt_emis_scale` | Tuning parameter for sea salt emission | `0.55` | +## Namelist parameters + +[MAM Namelist Parameters](../user-guide/namelist_parameters.md#modal-aerosol-module) diff --git a/components/eam/docs/tech-guide/oceanfilms.md b/components/eam/docs/tech-guide/oceanfilms.md index c48bf91a496..13210f88b71 100644 --- a/components/eam/docs/tech-guide/oceanfilms.md +++ b/components/eam/docs/tech-guide/oceanfilms.md @@ -6,19 +6,4 @@ E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: ## Namelist parameters -| Parameter | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `mam_mom_cycle_yr` | | `1` | -| `mam_mom_datapath` | Full pathname of the directory that contains the files specified in mam_mom_filelist | `'atm/cam/chem/trop_mam/marine_BGC/'` | -| `mam_mom_filename` | Filename of file that contains a sequence of filenames for prescribed marine organic matter ocean concentrations. The filenames in this file are relative to the directory specified by mam_mom_datapath.| `'monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc'` | -| `mam_mom_rmfile` | Remove the file containing prescribed aerosol deposition fluxes from local disk when no longer needed. | `FALSE` | -| `mam_mom_specifier` | Names of variables containing aerosol data in the prescribed aerosol datasets. | `'chla:CHL1','mpoly:TRUEPOLYC','mprot:TRUEPROTC','mlip:TRUELIPC'` | -| `mam_mom_datatype` | Type of time interpolation for data in mam_mom files. Can be set to `'CYCLICAL'`, `'SERIAL'`, `'INTERP_MISSING_MONTHS'`, or `'FIXED'`. | `'CYCLICAL'` | -| `mam_mom_cycle_yr` | The cycle year of the prescribed aerosol flux data if mam_mom_type is `'CYCLICAL'`. Format: YYYY | `1` | -| `mam_mom_fixed_ymd` | The date at which the prescribed aerosol flux data is fixed if mam_mom_type is `'FIXED'`. Format: YYYYMMDD | `0` | -| `mam_mom_fixed_tod` | The time of day (seconds) corresponding to mam_mom_fixed_ymd at which the prescribed aerosol flux data is fixed if mam_mom_type is 'FIXED'. | `0` | -| `mam_mom_bubble_thickness` | Bubble film thickness (in m) for marine organic aerosol emission mechanism. The physically reasonable range is approximately (0.1 - 1) x 10^ -6. | `0.1e-6` | -| `mam_mom_mixing_state` | Switch to select mixing state assumption in marine organic aerosol code. Currently implemented options: 0 : total external mixture, add to mass; 1 : total external mixture, replace mass; 2 : total internal mixture, add to mass; 3 : total internal mixture, replace mass. | `0` [Note: set to 3 in the atm_in namelist] | -| `mam_mom_parameterization` | Selection of alternate parameterizations for marine organic matter emissions. Set fmoa=1 for Burrows et al. (2014) [@burrows_physically_2014] parameterization; fmoa=2 for Gantt et al. (2011) [@gantt_wind_2011] parameterization; fmoa=3 for simple parameterization based on Quinn et al., 2014; [@quinn_contribution_2014] fmoa=4 for Rinaldi et al. (JGR, 2013).* [@rinaldi_is_2013] | `1` | - -*Note: non-default values have not been carefully tested and may not work as expected. +[OCEANFILMS Namelist Parameters](../user-guide/namelist_parameters.md#oceanfilms) diff --git a/components/eam/docs/tech-guide/p3.md b/components/eam/docs/tech-guide/p3.md index 4617c1892bc..71ee41c6492 100644 --- a/components/eam/docs/tech-guide/p3.md +++ b/components/eam/docs/tech-guide/p3.md @@ -6,21 +6,4 @@ The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties ## Namelist parameters -| Parameter | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `do_prescribed_ccn` | Turn on the prescribed CCN if true | `false` | -| `micro_aerosolactivation` | Turn on aerosol activation if true | `true` | -| `micro_p3_lookup_dir` | Directory of P3 look-up tables | `inputdata/atm/cam/physprops` | -| `micro_p3_tableversion` | P3 look-up table Version | `4.1.2` | -| `micro_subgrid_cloud` | Sub-grid cloud properties | `true` | -| `micro_tend_output` | Output of P3 microphysical process rates | `false` | -| `p3_accret_coeff` | Tunable parameter for adjusting rain accretion efficiency | `117.25` | -| `p3_autocon_coeff` | Tunable parameter for adjusting droplet autoconversion efficiency | `30500` | -| `p3_embryonic_rain_size` | Radius of embryomic raindrops from auto-conversion | `0.000025` (m) | -| `p3_max_mean_rain_size` | Upper bound of mean raindrop diameter | `0.005` (m) | -| `p3_mincdnc` | Lower bound of droplet number concentration | `20.d6` (# m-3) | -| `p3_nc_autocon_expon` | Nc exponent in droplet auto-conversion | `-1.1` | -| `p3_qc_accret_expon` | Qc exponent in rain accretion | `1.15` | -| `p3_qc_autocon_expon` | Qc exponeent in droplet autoconversion | `3.19` | -| `p3_wbf_coeff` | Tunable parameter for adjusting WBF efficiency | `1.0` | -| `do_cooper_inp3` | Turn on Cooper ice nucleation scheme if true | `false` | +[P3 Namelist Parameters](../user-guide/namelist_parameters.md#predicted-particle-properties) diff --git a/components/eam/docs/tech-guide/rrtmg.md b/components/eam/docs/tech-guide/rrtmg.md index 80b577b31cf..36f676a6e2b 100644 --- a/components/eam/docs/tech-guide/rrtmg.md +++ b/components/eam/docs/tech-guide/rrtmg.md @@ -6,12 +6,4 @@ The calculation of radiative energy flux through the atmosphere is done using th ## Namelist parameters -| Parameter | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `iradsw` | Frequency for updating shortwave fluxes and heating rate; iradsw > 0 interpreted as number of timesteps, iradsw < 0 interpreted as hours; iradsw = 0 disables shortwave radiation entirely | `-1` | -| `iradlw` | Frequency for updating longwave fluxes and heating rate; iradlw > 0 interpreted as number of timesteps, iradlw < 0 interpreted as hours; iradlw = 0 disables longwave radiation entirely | `-1` | -| `irad_always` | Length of time in timesteps (irad_always > 0) or in hours (irad_always < 0) SW/LW radiation will be run continuously from the start of an initial or restart run | `0` | -| `use_rad_dt_cosz` | If true, use the radiation dt for all cosz calculations; calculates solar zenith angle averaged over a time step. In default model solar zenith angle is held constant over time | `.true.`
(set by namelist_defaults_eam.xml for default physics) | -| `spectralflux` | Calculate fluxes (up and down) per band | `.false.` | -| `liqcldoptics` | Choice of cloud optical property parameterization for liquid clouds. Valid options are ‘slingo’ or ‘gammadist’ | `gammadist` | -| `icecldoptics` | Choice of cloud optical property parameterization for ice clouds. Valid options are ‘ebertcurry’ or ‘mitchell’ | `mitchell` | +[RRTMG Namelist Parameters](../user-guide/namelist_parameters.md#rapid-radiative-transfer-model-for-gcms) diff --git a/components/eam/docs/tech-guide/zm.md b/components/eam/docs/tech-guide/zm.md index 3dc0cc1717b..c8ed2d0e43a 100644 --- a/components/eam/docs/tech-guide/zm.md +++ b/components/eam/docs/tech-guide/zm.md @@ -24,35 +24,4 @@ MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and m ## Namelist parameters -| ZM Parameters | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `zmconv_ke` | Tunable evaporation efficiency in ZM deep convection scheme | `2.5E-6` | -| `zmconv_tau` | Relaxation time in ZM deep convection scheme | `3600` | -| `zmconv_dmpdz` | Parcel fractional mass entrainment rate | `-0.7E-3` | -| `zmconv_alfa` | Initial downdraft mass flux fraction | `0.14D0` | -| `zmconv_tiedke_add` | Temperature perturbation of an air parcel | `0.8D0` | -| `zmconv_cape_cin` | Number of negative buoyancy regions that are allowed | `1` | - -| dCAPE-ULL Parameters | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `zmconv_trigdcape_ull` | DCAPE trigger along with unrestricted launching level for ZM deep convection scheme | `.true.` | -| `zmconv_trig_dcape_only` | DCAPE only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the dcape only trigger. | -| `zmconv_trig_ull_only` | Use unrestricted launching level (ULL) only trigger for ZM deep convection scheme | `.false.`
If true, zmconv_trigdcape_ull must be false to use the ull only trigger. | - -| Conv. micro. Parameters | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `zmconv_microp` | Convective microphysics option in ZM convection scheme | `true` | -| `zmconv_auto_fac` | Cloud droplet-rain autoconversion enhancement factor in the convective microphysics scheme | `7.0` | -| `zmconv_accr_fac` | Cloud droplet-rain accretion enhancement factor in the convective microphysics scheme | `1.5` | -| `zmconv_micro_dcs` | Autoconversion size threshold for cloud ice to snow (m) | `150.E-6` | - -| Mass flux adj. Parameters | Description | Default value | -| ------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `zmconv_clos_dyn_adj` | Apply mass flux adjustment to ZM convection scheme | `true` | - -| MCSP Parameters | Description | Default value | -| ---------------------------- | ----------------------------------------------------------------- | ---------------------- | -| `zmconv_mcsp_heat_coeff` | MCSP heating coefficient | `0.3` | -| `zmconv_mcsp_moisture_coeff` | MCSP moisture coefficient | `0.0` | -| `zmconv_mcsp_uwind_coeff` | MCSP zonal wind coefficient | `0.0` | -| `zmconv_mcsp_vwind_coeff` | MCSP meridional wind coefficient | `0.0` | +[ZM Namelist Parameters](../user-guide/namelist_parameters.md#zhang-and-mcfarlane-deep-convection-scheme) From 2e951c6813cc9334e9109111c3780502ced4fd2a Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 2 May 2024 14:00:34 -0700 Subject: [PATCH 270/310] Update the citation format in EAM docs --- components/eam/docs/tech-guide/armdiags.md | 2 +- components/eam/docs/tech-guide/clubb.md | 2 +- components/eam/docs/tech-guide/cosp.md | 2 +- components/eam/docs/tech-guide/dust.md | 2 +- components/eam/docs/tech-guide/mam.md | 6 +++--- components/eam/docs/tech-guide/oceanfilms.md | 2 +- components/eam/docs/tech-guide/p3.md | 2 +- components/eam/docs/tech-guide/rrtmg.md | 2 +- components/eam/docs/tech-guide/vbs.md | 2 +- components/eam/docs/tech-guide/zm.md | 10 +++++----- components/eam/docs/user-guide/aerosol_phys_prop.md | 8 ++++---- .../eam/docs/user-guide/emission_oxidant_files.md | 4 ++-- 12 files changed, 22 insertions(+), 22 deletions(-) diff --git a/components/eam/docs/tech-guide/armdiags.md b/components/eam/docs/tech-guide/armdiags.md index fa21f87ae3e..47266db48f2 100644 --- a/components/eam/docs/tech-guide/armdiags.md +++ b/components/eam/docs/tech-guide/armdiags.md @@ -2,7 +2,7 @@ ## Overview -The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al., 2020) [@zhang_arm_2020]. It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al., 2023 [@zheng_assessment_2023]; Emmenegger et al., 2022 [@emmenegger_evaluating_2022]; Zhang et al., 2018 [@zhang_causes_2018]). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al., 2022) [@zhang_e3sm_2022] for routine evaluation of the model. +The ARM data-oriented metrics and diagnostics package (ARM Diags) was developed to facilitate the use of ARM data in climate model evaluation and model intercomparison (Zhang et al., 2020)[@zhang_arm_2020]. It includes ARM data sets, compiled from multiple ARM data products, and a Python-based analysis toolkit for computation ad visualization. It also includes simulation data from models participating the CMIP, which allows climate-modeling groups to compare a new, candidate version of their model to existing CMIP models. The ARM Diags has been applied in several model evaluation studies to help address a range of issues in climate models (Zheng et al., 2023;[@zheng_assessment_2023] Emmenegger et al., 2022;[@emmenegger_evaluating_2022] Zhang et al., 2018[@zhang_causes_2018]). The Majority of ARM Diags sets are ported into E3SM Diags (Zhang et al., 2022)[@zhang_e3sm_2022] for routine evaluation of the model. ## To enable the use of ARM Diags diff --git a/components/eam/docs/tech-guide/clubb.md b/components/eam/docs/tech-guide/clubb.md index 8fa9cf772c0..2737f753850 100644 --- a/components/eam/docs/tech-guide/clubb.md +++ b/components/eam/docs/tech-guide/clubb.md @@ -2,7 +2,7 @@ ## Overview -The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds. [@larson_clubb-silhs_2022,@bogenschutz_path_2018,@larson_using_2005,@golaz_pdf-based_2002] It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. +The Cloud Layers Unified By Binormals (CLUBB) parameterization is a parameterization of subgrid-scale turbulence and clouds.[@larson_clubb-silhs_2022,@bogenschutz_path_2018,@larson_using_2005,@golaz_pdf-based_2002] It prognoses turbulent fluxes of heat, moisture, and momentum, and it diagnoses the liquid cloud fraction and liquid water mixing ratio. To do so, it prognoses higher-order turbulence moments and closes those prognostic equations by use of an assumed double-Gaussian shape of the subgrid probability density function. CLUBB operates throughout the troposphere, but it contributes especially to the planetary boundary layer and low-cloud regimes, including stratocumulus and shallow cumulus regimes. ## Namelist parameters diff --git a/components/eam/docs/tech-guide/cosp.md b/components/eam/docs/tech-guide/cosp.md index 05e40591e7e..ef724b12a9f 100644 --- a/components/eam/docs/tech-guide/cosp.md +++ b/components/eam/docs/tech-guide/cosp.md @@ -2,7 +2,7 @@ ## Overview -The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011 [@bodas-salcedo_cosp_2011]; Swales et al., 2018 [@swales_cloud_2018]; Zhang et al., 2019 [@zhang_evaluation_2019]; Zhang et al., 2024 [@zhang_understanding_2024]) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. +The Cloud Feedback Model Intercomparison Project (CFMIP) Observation Simulator Package (COSP; Bodas-Salcedo et al., 2011;[@bodas-salcedo_cosp_2011] Swales et al., 2018;[@swales_cloud_2018] Zhang et al., 2019;[@zhang_evaluation_2019] Zhang et al., 2024[@zhang_understanding_2024]) was developed to improve the consistency between model clouds and satellite observations. COSP contains several independent satellite simulators for better comparing model clouds with satellite measurements collected by the International Satellite Cloud Climatology Project (ISCCP), the Moderate Resolution Imaging Spectroradiometer (MODIS), the Multi-angle Imaging SpectroRadiometer (MISR), Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO), and CloudSat. The use of satellite simulators will not only make a fairer comparison between model clouds and satellite data but also allow a more in-depth analysis of clouds. For example, clouds can be assessed in terms of their optical properties and vertical location, which dictate their radiative effects. ## Namelist parameters diff --git a/components/eam/docs/tech-guide/dust.md b/components/eam/docs/tech-guide/dust.md index 1ed5092e3f2..59f7cc3a966 100644 --- a/components/eam/docs/tech-guide/dust.md +++ b/components/eam/docs/tech-guide/dust.md @@ -2,7 +2,7 @@ ## Overview -Dust-related processes are represented in the E3SM atmosphere and land model components. In E3SMv3, dust deposition will also be coupled with the sea ice and ocean biogeochemistry in the ocean model. Total emission fluxes of dust particles are calculated at each model time step. A new dust emission scheme following Kok et al. (2014) [@kok_improved_2014] is implemented to E3SMv3, replacing the Zender scheme (Zender et al., 2003) [@zender_mineral_2003] in E3SMv1 and v2 as the default option. The new dust emission scheme includes a time-varying soil erodibility factor for dust mobilization, and includes dust sources in high latitudes (e.g., >60 degree N). A manuscript by Feng et al. is in prep to document the performance of the new emission scheme on dust life cycle and radiative effects in E3SMv3. Dust aerosol is represented in the accumulation and coarse aerosol modes of the MAM4 module following emission. Other dust properties such as optical properties and size distribution at emission are documented in Feng et al. (2022). [@feng_global_2022] +Dust-related processes are represented in the E3SM atmosphere and land model components. In E3SMv3, dust deposition will also be coupled with the sea ice and ocean biogeochemistry in the ocean model. Total emission fluxes of dust particles are calculated at each model time step. A new dust emission scheme following Kok et al. (2014)[@kok_improved_2014] is implemented to E3SMv3, replacing the Zender scheme (Zender et al., 2003)[@zender_mineral_2003] in E3SMv1 and v2 as the default option. The new dust emission scheme includes a time-varying soil erodibility factor for dust mobilization, and includes dust sources in high latitudes (e.g., >60 degree N). A manuscript by Feng et al. is in prep to document the performance of the new emission scheme on dust life cycle and radiative effects in E3SMv3. Dust aerosol is represented in the accumulation and coarse aerosol modes of the MAM4 module following emission. Other dust properties such as optical properties and size distribution at emission are documented in Feng et al. (2022).[@feng_global_2022] ## Namelist parameters diff --git a/components/eam/docs/tech-guide/mam.md b/components/eam/docs/tech-guide/mam.md index 3a677a96c87..99886682f46 100644 --- a/components/eam/docs/tech-guide/mam.md +++ b/components/eam/docs/tech-guide/mam.md @@ -2,15 +2,15 @@ ## MAM5 Overview -The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020 [@wang_aerosols_2020]; Liu et al., 2012 [@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016). [@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021). [@visioni_limitations_2022] Volcanic eruptions derived from Neely and Schmidt (2016). [@neely_iii_volcaneesm_2016] +The Five-mode Modal Aerosol Model (MAM5) supersedes the MAM4 utilized in previous iterations of E3SM (E3SM-V1 and -V2). MAM5 introduces a fifth mode, specifically designed to represent stratospheric coarse mode aerosols, primarily originating from volcanic eruptions and DMS decomposition. This mode exclusively comprises sulfate aerosols, characterized by a smaller standard deviation (STD) value of 1.2. The STD value denotes the width of the aerosol mode, where a higher STD implies a greater gravitational settling effect (Wang et al., 2020;[@wang_aerosols_2020] Liu et al., 2012[@liu_toward_2012]). By setting the STD to 1.2, the simulated properties of volcanic aerosols align closely with observational findings (Mills et al., 2016).[@mills_global_2016] MAM5 represents a pioneering aerosol model, effectively segregating tropospheric and stratospheric aerosols (Ke et al., in preparation), thereby mitigating the risk of overestimating dust and sea salt aerosols within the stratosphere in previous MAM4 (Visioni et al., 2021).[@visioni_limitations_2022] Volcanic eruptions derived from Neely and Schmidt (2016).[@neely_iii_volcaneesm_2016] ## MAM4 Overview -The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016). [@liu_description_2016] It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016) [@liu_description_2016] include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020), [@wang_aerosols_2020] the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022). [@burrows_oceanfilms_2022] In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022), [@wu_development_2022] as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes. All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. +The representation of atmospheric aerosols and their roles in the Earth system by EAMv1/v2/v3 was inherited from the global aerosol-climate model EAMv0 and its four-mode modal aerosol module (MAM4), including Aitken, primary-carbon, accumulation, and coarse modes (Liu et al., 2016).[@liu_description_2016] It treats a combination of processes, controlling the evolution of aerosols that are either directly emitted or converted from precursor gases from a variety of natural and anthropogenic sources. The processes include transport (by grid-scale wind, subgrid turbulence, convection, and sedimentation), aerosol microphysics (i.e., particle nucleation, condensation/evaporation of trace gases, aging, and coagulation), cloud processing (i.e., aqueous chemistry, scavenging by hydrometeors, resuspension from evaporating hydrometeors, and wet deposition), and dry deposition. Aerosol species in the original MAM4 (Liu et al., 2016)[@liu_description_2016] include sulfate, primary organic aerosol (POA) or particulate organic matter (POM), secondary organic aerosol (SOA), black carbon (BC), sea salt, and mineral dust. As described by Wang et al. (2020),[@wang_aerosols_2020] the enhanced MAM4 in EAMv1/v2 added marine organic aerosol (MOA) to all four modes (Burrows et al., 2022).[@burrows_oceanfilms_2022] In MAM4 of EAMv3, the Aitken mode has sulfate, sea salt, SOA and MOA; the primary-carbon mode has BC, POA and MOA; the accumulation and coarse modes include all seven species. Ammonium (NH4) and nitrate (NO3) aerosols are also explicitly treated in EAMv3 (Wu et al., 2022),[@wu_development_2022] as an optional feature for research, in which new species (NH4, NO3, Ca, CO3, Na, Cl) are introduced to the Aitken, accumulation and coarse modes. All aerosol species within each of the four individual modes the MAM4 is assumed to be internally mixed and represented by a single number concentration, while particles are externally mixed among the different modes. ### Sea salt -In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003) [@martensson_laboratory_2003] and Monahan et al. (1986), [@monahan_model_1986] and then redistributed to the three MAM4 size modes. +In MAM4, sea salt aerosol is represented in the Aitken, accumulation, and coarse mode with particle emission size (diameter) ranges of 0.02-0.08, 0.08-1.0, and 1.0-10.0 μm, respectively. The emission flux of natural sea salt is first divided into 31 size bins, following the parameterization of Mårtensson et al. (2003)[@martensson_laboratory_2003] and Monahan et al. (1986),[@monahan_model_1986] and then redistributed to the three MAM4 size modes. ## Namelist parameters diff --git a/components/eam/docs/tech-guide/oceanfilms.md b/components/eam/docs/tech-guide/oceanfilms.md index 13210f88b71..1ac45cfd799 100644 --- a/components/eam/docs/tech-guide/oceanfilms.md +++ b/components/eam/docs/tech-guide/oceanfilms.md @@ -2,7 +2,7 @@ ## Overview -E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: Natural Films and Interfaces via Langmuir Molecular Surfactants) parameterization to represent sea spray organic aerosol emissions. OCEANFILMS is a physically based model that links sea spray chemistry with ocean biogeochemistry using a Langmuir partitioning approach. The underlying physical assumptions and parameterization are described in Burrows et al. (2014); [@burrows_physically_2014] the implementation in E3SM and impact on clouds and climate are documented in Burrows et al. (2022). [@burrows_oceanfilms_2022] +E3SM (v1-v3) uses the OCEANFILMS (Organic Compounds from Ecosystems to Aerosols: Natural Films and Interfaces via Langmuir Molecular Surfactants) parameterization to represent sea spray organic aerosol emissions. OCEANFILMS is a physically based model that links sea spray chemistry with ocean biogeochemistry using a Langmuir partitioning approach. The underlying physical assumptions and parameterization are described in Burrows et al. (2014);[@burrows_physically_2014] the implementation in E3SM and impact on clouds and climate are documented in Burrows et al. (2022).[@burrows_oceanfilms_2022] ## Namelist parameters diff --git a/components/eam/docs/tech-guide/p3.md b/components/eam/docs/tech-guide/p3.md index 71ee41c6492..af06aaa6aab 100644 --- a/components/eam/docs/tech-guide/p3.md +++ b/components/eam/docs/tech-guide/p3.md @@ -2,7 +2,7 @@ ## Overview -The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties (P3; Morrison & Milbrandt, 2015; [@morrison_parameterization_2015] Milbrandt & Morrison, 2016 [@milbrandt_parameterization_2016]). P3 offers a new approach to representing the evolution of ice particles that is more physical than the traditional approach of using predefined ice categories. It has been implemented in E3SM (Wang et al., 2021) [@wang_impact_2021] to address the limitations in the original microphysics scheme- the lack of riming particles and the artificial conversion between ice crystals and snow particles. The current version in E3SM is a two-moment scheme with a single ice category (Morrison & Milbrandt, 2015). [@morrison_parameterization_2015] In addition to the total ice number and mass mixing ratios, P3 prognoses the rimed mass and rimed volume mixing ratios, which allows for the prediction of the continuous evolution of the rime fraction and particle density. It is worth noting that the ice nucleation parameterizations are changed to be aerosol-dependent in this study, with the heterogenous ice nucleation parameterizations from the Classical Nucleation Theory (Liu et al., 2012) [@liu_toward_2012] and the homogenous in-situ cirrus formation based on Liu and Penner (2005). [@liu_ice_2005] This differs from the P3 used in WRF and that used in the E3SM v1 in Wang et al. (2021) [@wang_impact_2021] where the heterogeneous ice nucleation parameterizations are temperature dependent only. +The stratiform cloud microphysics scheme in v3 is Predicted Particle Properties (P3; Morrison & Milbrandt, 2015;[@morrison_parameterization_2015] Milbrandt & Morrison, 2016[@milbrandt_parameterization_2016]). P3 offers a new approach to representing the evolution of ice particles that is more physical than the traditional approach of using predefined ice categories. It has been implemented in E3SM (Wang et al., 2021)[@wang_impact_2021] to address the limitations in the original microphysics scheme- the lack of riming particles and the artificial conversion between ice crystals and snow particles. The current version in E3SM is a two-moment scheme with a single ice category (Morrison & Milbrandt, 2015).[@morrison_parameterization_2015] In addition to the total ice number and mass mixing ratios, P3 prognoses the rimed mass and rimed volume mixing ratios, which allows for the prediction of the continuous evolution of the rime fraction and particle density. It is worth noting that the ice nucleation parameterizations are changed to be aerosol-dependent in this study, with the heterogenous ice nucleation parameterizations from the Classical Nucleation Theory (Liu et al., 2012)[@liu_toward_2012] and the homogenous in-situ cirrus formation based on Liu and Penner (2005).[@liu_ice_2005] This differs from the P3 used in WRF and that used in the E3SM v1 in Wang et al. (2021)[@wang_impact_2021] where the heterogeneous ice nucleation parameterizations are temperature dependent only. ## Namelist parameters diff --git a/components/eam/docs/tech-guide/rrtmg.md b/components/eam/docs/tech-guide/rrtmg.md index 36f676a6e2b..7afa8df6122 100644 --- a/components/eam/docs/tech-guide/rrtmg.md +++ b/components/eam/docs/tech-guide/rrtmg.md @@ -2,7 +2,7 @@ ## Overview -The calculation of radiative energy flux through the atmosphere is done using the RRTMG radiation package (Iacono et al., 2008; [@iacono_radiative_2008] Mlawer et al., 1997 [@mlawer_radiative_1997]). The details are consistent with the implementation in CAM5 described in Neale et al. (2012). [@neale_description_2012] Radiative fluxes are broadly split into shortwave and longwave and computed by separate codes. The shortwave solver uses the 2-stream approximation, while the longwave is an absorption/emission code. Both shortwave and longwave use the correlated k-distribution method for integration of fluxes. Subgrid cloud overlap is accounted for using the Monte Carlo Independent Column Approximation (MCICA; Pincus and Morcrette, 2003), [@pincus_fast_2003] assuming the cloudy portions of the column are maximally overlapped in vertically contiguous layers and randomly overlapped when two layers are separated by a completely clear layer. Cloud optics are parameterized as described in Neale et al.(2010). [@neale_description_2012] +The calculation of radiative energy flux through the atmosphere is done using the RRTMG radiation package (Iacono et al., 2008;[@iacono_radiative_2008] Mlawer et al., 1997[@mlawer_radiative_1997]). The details are consistent with the implementation in CAM5 described in Neale et al. (2012).[@neale_description_2012] Radiative fluxes are broadly split into shortwave and longwave and computed by separate codes. The shortwave solver uses the 2-stream approximation, while the longwave is an absorption/emission code. Both shortwave and longwave use the correlated k-distribution method for integration of fluxes. Subgrid cloud overlap is accounted for using the Monte Carlo Independent Column Approximation (MCICA; Pincus and Morcrette, 2003),[@pincus_fast_2003] assuming the cloudy portions of the column are maximally overlapped in vertically contiguous layers and randomly overlapped when two layers are separated by a completely clear layer. Cloud optics are parameterized as described in Neale et al.(2010).[@neale_description_2012] ## Namelist parameters diff --git a/components/eam/docs/tech-guide/vbs.md b/components/eam/docs/tech-guide/vbs.md index 23979470596..26535a89308 100644 --- a/components/eam/docs/tech-guide/vbs.md +++ b/components/eam/docs/tech-guide/vbs.md @@ -2,4 +2,4 @@ ## Overview -A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015). [@shrivastava_global_2015] It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016). [@hodzic_rethinking_2016] The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [User Guide](../user-guide/index.md). +A modified volatility basis set (VBS) approach is used for both SOA precursor gases and particulate SOA that includes gas‐phase functionalization/fragmentation and particle‐phase oligomerization similar to FragNVSOA configuration of Shrivastava et al. (2015).[@shrivastava_global_2015] It includes a detailed treatment of SOA precursor gas chemistry including multigenerational aging via fragmentation and functionalization reactions, particle‐phase oligomerization that generates low “effective volatility” SOA, and particle‐phase loss by photolysis. The sources of SOA include natural biogenic, anthropogenic and biomass burning organic gases that are oxidized to form lower volatility species and undergo dynamic gas-particle partitioning to form SOA. Biogenic SOA is formed by oxidation of isoprene (ISOP_VBS) and monoterpene (C10H16) volatile organic compounds (VOCs). Emissions of anthropogenic and biomass burning organic gases in the range of intermediate volatility organics (IVOCs, referred to as SOAG0) are estimated as total primary organic matter (POM) emitted from these sources multiplied by specified tunable factors. IVOCs undergo multigenerational aging with OH radicals forming SOA corresponding to anthropogenic and biomass burning sources. Photolysis of SOA is included as a chemical sink in the particle phase, in addition to dry and wet removal sinks. The photolysis rate constant of particle-phase SOA is assumed to be 0.04% of typical NO2 photolysis frequencies following Hodzic et al. (2016).[@hodzic_rethinking_2016] The emissions of VBS SOA related gas species and oxidants (prescribed) read from a file are documented in the [User Guide](../user-guide/index.md). diff --git a/components/eam/docs/tech-guide/zm.md b/components/eam/docs/tech-guide/zm.md index c8ed2d0e43a..2e3c5b9b607 100644 --- a/components/eam/docs/tech-guide/zm.md +++ b/components/eam/docs/tech-guide/zm.md @@ -2,25 +2,25 @@ ## Overview -The ZM scheme (Zhang and McFarlane 1995) used in E3SMv3 is a bulk mass flux-type scheme; it has three components: a trigger for convection initiation, a cloud model including both updrafts and downdrafts, and a closure. The original CAPE-based trigger for convection was replaced by a trigger function based on dynamic CAPE generation by Xie et al. (2019) [@xie_improved_2019] (see dCAPE-ULL description below for more details). The closure predicts cloud base mass flux using dilute CAPE (Neale et al., 2008). [@neale_impact_2008] The updraft model is a bulk entraining plume model. Both updrafts and downdrafts are assumed saturated, with downdraft mass flux at the downdraft initiation level set proportional to the updraft cloud base mass flux. The microphysical processes inside the updrafts are represented by a convective microphysics scheme (see ZM convective microphysics description below). An additional adjustment is made to cloud base mass flux to incorporate the effect of large-scale circulation (see mass flux adjustment description below). +The ZM scheme (Zhang and McFarlane, 1995)[@zhang_sensitivity_1995] used in E3SMv3 is a bulk mass flux-type scheme; it has three components: a trigger for convection initiation, a cloud model including both updrafts and downdrafts, and a closure. The original CAPE-based trigger for convection was replaced by a trigger function based on dynamic CAPE generation by Xie et al. (2019)[@xie_improved_2019] (see dCAPE-ULL description below for more details). The closure predicts cloud base mass flux using dilute CAPE (Neale et al., 2008).[@neale_impact_2008] The updraft model is a bulk entraining plume model. Both updrafts and downdrafts are assumed saturated, with downdraft mass flux at the downdraft initiation level set proportional to the updraft cloud base mass flux. The microphysical processes inside the updrafts are represented by a convective microphysics scheme (see ZM convective microphysics description below). An additional adjustment is made to cloud base mass flux to incorporate the effect of large-scale circulation (see mass flux adjustment description below). ### dCAPE-ULL -A notable update related to clouds and precipitation in E3SMv2 is the use of a new convective trigger function described by Xie et al. (2019) [@xie_improved_2019] in ZM to improve the simulation of precipitation and its diurnal cycle. The new convective trigger named as dCAPE-ULL uses the dynamic CAPE (dCAPE) trigger developed by Xie and Zhang (2000) [@xie_impact_2000] with an unrestricted air parcel launch level (ULL) approach used by Wang et al. (2015). [@wang_impacts_2015] It was designed to address the unrealistically strong coupling of convection to the surface heating in ZM that often results in unrealistically too active model convection during the day in summer season over lands and improve the model capability to capture mid-level convection for nocturnal precipitation. +A notable update related to clouds and precipitation in E3SMv2 is the use of a new convective trigger function described by Xie et al. (2019)[@xie_improved_2019] in ZM to improve the simulation of precipitation and its diurnal cycle. The new convective trigger named as dCAPE-ULL uses the dynamic CAPE (dCAPE) trigger developed by Xie and Zhang (2000)[@xie_impact_2000] with an unrestricted air parcel launch level (ULL) approach used by Wang et al. (2015).[@wang_impacts_2015] It was designed to address the unrealistically strong coupling of convection to the surface heating in ZM that often results in unrealistically too active model convection during the day in summer season over lands and improve the model capability to capture mid-level convection for nocturnal precipitation. ### ZM convective microphysics -The convective microphysics scheme is based on the work of Song and Zhang (2011) [@song_microphysics_2011] to improve the representation of microphysical processes in convective clouds and their interaction with aerosol and stratiform clouds in GCMs. It explicitly treats the mass mixing ratio and number concentration of five hydrometeor species (cloud water, cloud ice, rain, snow, and graupel). The scheme is linked to stratiform cloud microphysics parameterization through convective detrainment of cloud liquid/ice water content and droplet/crystal number concentration, and to aerosols through cloud droplet activation and ice nucleation processes. Previous evaluations of the scheme showed that it improved the simulation of convective cloud properties and cloud hydrological cycle (Song et al., 2012; [@song_evaluation_2012] Storer et al., 2015 [@storer_effects_2015]). The assessment demonstrates that the convective microphysics scheme not only significantly improves the simulation of tropical variability across multiple scales but also enhances the simulation of climatological mean states. +The convective microphysics scheme is based on the work of Song and Zhang (2011)[@song_microphysics_2011] to improve the representation of microphysical processes in convective clouds and their interaction with aerosol and stratiform clouds in GCMs. It explicitly treats the mass mixing ratio and number concentration of five hydrometeor species (cloud water, cloud ice, rain, snow, and graupel). The scheme is linked to stratiform cloud microphysics parameterization through convective detrainment of cloud liquid/ice water content and droplet/crystal number concentration, and to aerosols through cloud droplet activation and ice nucleation processes. Previous evaluations of the scheme showed that it improved the simulation of convective cloud properties and cloud hydrological cycle (Song et al., 2012;[@song_evaluation_2012] Storer et al., 2015[@storer_effects_2015]). The assessment demonstrates that the convective microphysics scheme not only significantly improves the simulation of tropical variability across multiple scales but also enhances the simulation of climatological mean states. ### Mass flux adjustment -The convective mass flux adjustment (MAdj) is designed to represent the dynamical effects of large-scale vertical motion on convection. With MAdj, convection is enhanced (suppressed) when there is large-scale ascending (descending) motion at the planetary boundary layer top. The coupling of convection with the large-scale circulation significantly improves the simulation of climate variability across multiple scales from diurnal cycle, convectively coupled equatorial waves, to Madden-Julian oscillations (Song et al., 2023). [@song_incorporating_2023] +The convective mass flux adjustment (MAdj) is designed to represent the dynamical effects of large-scale vertical motion on convection. With MAdj, convection is enhanced (suppressed) when there is large-scale ascending (descending) motion at the planetary boundary layer top. The coupling of convection with the large-scale circulation significantly improves the simulation of climate variability across multiple scales from diurnal cycle, convectively coupled equatorial waves, to Madden-Julian oscillations (Song et al., 2023).[@song_incorporating_2023] ### MCSP Due to inadequate model resolution, organized mesoscale convection cannot be resolved in general circulation models and thus needs to be parameterized. The Multiscale Coherent Structure Parameterization (MCSP) aims at representing the dynamical and physical effects of organized mesoscale convection. -MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and momentum fields to represent the impact. Moncrieff et al. (2017) [@moncrieff_simulation_2017] and Chen et al. (2021) [@chen_effects_2021] have found that by adding MCSP, the both the representation of large-scale precipitation systems and the modes of variability from Tropical waves are improved. +MCSP applies a sinusoidal baroclinic profile in the temperature, moisture, and momentum fields to represent the impact. Moncrieff et al. (2017)[@moncrieff_simulation_2017] and Chen et al. (2021)[@chen_effects_2021] have found that by adding MCSP, the both the representation of large-scale precipitation systems and the modes of variability from Tropical waves are improved. ## Namelist parameters diff --git a/components/eam/docs/user-guide/aerosol_phys_prop.md b/components/eam/docs/user-guide/aerosol_phys_prop.md index 13c93f985c5..6d80565d971 100644 --- a/components/eam/docs/user-guide/aerosol_phys_prop.md +++ b/components/eam/docs/user-guide/aerosol_phys_prop.md @@ -5,13 +5,13 @@ Key information -- Original physical properties of aerosols are documented in Liu et al. (2012). [@liu_toward_2012] Detailed information is included in the supplement. +- Original physical properties of aerosols are documented in Liu et al. (2012).[@liu_toward_2012] Detailed information is included in the supplement. -- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020). [@wang_aerosols_2020] +- Physical properties of aerosols used in E3SMv1 are documented in Wang et al. (2020).[@wang_aerosols_2020] -- Marine organic aerosol properties are defined in Burrows et al. (2022). [@burrows_oceanfilms_2022] +- Marine organic aerosol properties are defined in Burrows et al. (2022).[@burrows_oceanfilms_2022] -- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022). [@feng_global_2022] +- Dust refractive index and longwave absorption coefficients are updated by Feng et al. (2022).[@feng_global_2022] - BC and POM hygroscopicity values are updated by Shan et al. (2024). diff --git a/components/eam/docs/user-guide/emission_oxidant_files.md b/components/eam/docs/user-guide/emission_oxidant_files.md index e287b438646..72868b6b845 100644 --- a/components/eam/docs/user-guide/emission_oxidant_files.md +++ b/components/eam/docs/user-guide/emission_oxidant_files.md @@ -3,7 +3,7 @@ ## Overview -This page documents emissions data for all required aerosols and precursor gases as well as oxidants input data for running EAMv3, mostly for the MAM4 aerosol scheme, from anthropogenic (i.e., industrial, energy, transportation, domestic, and agriculture activity sectors) and natural (i.e., sea spray, vegetation, fire smoke, volcano) sources. Sulfur from agriculture, domestic, transportation, waste, and shipping sectors is emitted at the surface while sulfur from energy and industry sectors is emitted at 100-300 m above the surface, and sulfur from forest fire and grass fire is emitted at higher elevations (0-6 km). POM and BC from forest fire and grass fire are emitted at 0-6 km, while those from other sources (domestic, energy, industry, transportation, waste, and shipping) are emitted at the surface. Injection height profiles for fire emissions are derived from the corresponding AeroCom profiles (Dentener et al., 2006) [@dentener_emissions_2006], which give emissions in 6 altitude ranges (0-0.1, 0.1-0.5, 0.5-1, 1-2, 2-3, and 3-6 km). Otherwise, species emissions are assumed to be at the surface (bottom layer). Number emission fluxes each mode are calculated from mass emission fluxes based on AeroCom prescribed lognormal size distributions. +This page documents emissions data for all required aerosols and precursor gases as well as oxidants input data for running EAMv3, mostly for the MAM4 aerosol scheme, from anthropogenic (i.e., industrial, energy, transportation, domestic, and agriculture activity sectors) and natural (i.e., sea spray, vegetation, fire smoke, volcano) sources. Sulfur from agriculture, domestic, transportation, waste, and shipping sectors is emitted at the surface while sulfur from energy and industry sectors is emitted at 100-300 m above the surface, and sulfur from forest fire and grass fire is emitted at higher elevations (0-6 km). POM and BC from forest fire and grass fire are emitted at 0-6 km, while those from other sources (domestic, energy, industry, transportation, waste, and shipping) are emitted at the surface. Injection height profiles for fire emissions are derived from the corresponding AeroCom profiles (Dentener et al., 2006)[@dentener_emissions_2006], which give emissions in 6 altitude ranges (0-0.1, 0.1-0.5, 0.5-1, 1-2, 2-3, and 3-6 km). Otherwise, species emissions are assumed to be at the surface (bottom layer). Number emission fluxes each mode are calculated from mass emission fluxes based on AeroCom prescribed lognormal size distributions. ## Aerosols and gas precursors (common for EAMv1/v2/v3) @@ -20,7 +20,7 @@ This page documents emissions data for all required aerosols and precursor gases ## Marine organic sea spray -Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014; [@burrows_physically_2014] 2022 [@burrows_oceanfilms_2022]). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998) [@maltrud_global_1998] and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004) [@moore_upper_2004] were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014) [@burrows_physically_2014]. The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). +Marine organic sea spray aerosol contributions are parameterized following the OCEANFILMS parameterization (E3SMv1; Burrows et al., 2014;[@burrows_physically_2014] 2022[@burrows_oceanfilms_2022]). The input file for this parameterization provides a climatology of the ocean surface concentrations of several groups of organic macromolecules. Briefly, the Parallel Ocean Program (POP; Maltrud et al., 1998)[@maltrud_global_1998] and its biogeochemical elemental cycling (BEC) routines (Moore et al., 2004)[@moore_upper_2004] were used to simulate marine biogeochemistry fields, including particulate organic matter (POC), chlorophyll, and zooplankton concentrations; these fields were used to generate maps of the estimated surface distributions of classes of macromolecules following the methods described in Burrows et al. (2014).[@burrows_physically_2014] The scripts used to accomplish this translation are available [here](https://github.com/E3SM-Project/PreAndPostProcessingScripts/blob/devel/prepare_model_inputfiles/emis/marine_organic_aerosol/JAN_1850_MASTERLANG.jnl). The file used as an input to E3SM is available here: [https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc](https://web.lcrc.anl.gov/public/e3sm/inputdata/atm/cam/chem/trop_mam/marine_BGC/monthly_macromolecules_0.1deg_bilinear_latlon_year01_merge_date.nc) From 9decc8b3b854dd9ec81851803f828309a10e2582 Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 2 May 2024 14:04:49 -0700 Subject: [PATCH 271/310] Add top level description of EAM in docs --- components/eam/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/docs/index.md b/components/eam/docs/index.md index 100b8edb3f1..55870e3778d 100644 --- a/components/eam/docs/index.md +++ b/components/eam/docs/index.md @@ -1,6 +1,6 @@ # The E3SM Atmosphere Model (EAM) -Some introductory text here +EAM is the state-of-the-art atmospheric component of the E3SM model that uses a Spectral Element Dynamical Core and a suite of parameterizations to represent a range of atmospheric processes, which are described in the Technical Guide (see below). Its nominal resolution is roughly 100km in the horizontal, with a model time step of 1800 seconds, and runs with 80 layers in the vertical (model top of 60km). * The [EAM User Guide](user-guide/index.md) explains how to control EAM when its running within E3SM. * The [EAM Developer Guide](dev-guide/index.md) explains EAM data structures and how to write new code. From e89e44067c617a1ebdb10581316ff38087fe7cfd Mon Sep 17 00:00:00 2001 From: Chris Terai Date: Thu, 2 May 2024 14:09:44 -0700 Subject: [PATCH 272/310] Fix output labels in EAM docs --- components/eam/docs/user-guide/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/docs/user-guide/index.md b/components/eam/docs/user-guide/index.md index 2380268ebbc..c2bd7f06538 100644 --- a/components/eam/docs/user-guide/index.md +++ b/components/eam/docs/user-guide/index.md @@ -63,7 +63,7 @@ By default, EAM will output a set of monthly-averaged variables. Additional outp `mfilt` - List that sets the number of timesteps to write in a single file before starting a new file. -`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'MIN'` for time-minimum output, and `'MAX'` for time-maximum output. +`avgflag_pertape` - List that sets the type of output to write. Choices are `'A'` for time-averaged output, `'A'` for instantaneous output, `'M'` for time-minimum output, and `'X'` for time-maximum output. #### Example output specification From b2306ef35ae071b8a5c820b54e5dbe1ed7c5a903 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Thu, 2 May 2024 17:17:21 -0400 Subject: [PATCH 273/310] don't bother linting reversed links due to its need by the bib extention --- docs/.markdownlint.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/.markdownlint.json b/docs/.markdownlint.json index feec355226e..23e8b392689 100644 --- a/docs/.markdownlint.json +++ b/docs/.markdownlint.json @@ -1,3 +1,4 @@ { - "line-length": false + "line-length": false, + "no-reversed-links": false } From 21f2c5956a61b518ea46123fe45f42449b434762 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Sun, 28 Apr 2024 21:18:21 -0500 Subject: [PATCH 274/310] Add top level E3SM guides Add top level E3SM guides and add to global navigation. --- docs/development.md | 1 + docs/index.md | 10 +++++++++- docs/installation.md | 15 +++++++++++++++ docs/usage.md | 18 ++++++++++++++++++ mkdocs.yaml | 10 +++++++--- 5 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 docs/development.md create mode 100644 docs/installation.md create mode 100644 docs/usage.md diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 00000000000..79a9975b03a --- /dev/null +++ b/docs/development.md @@ -0,0 +1 @@ +# Development Guide diff --git a/docs/index.md b/docs/index.md index 4d484b4e048..f9f1f1dfc35 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,14 @@ # The Energy Exascale Earth System Model (E3SM) -The E3SM documentation is organized into sections for each component model and additional sections for shared tools and general guides. +E3SM is a state-of-the-art fully coupled model of the Earth's climate including important biogeochemical +and cryospheric processes. It is intended to address the most challenging and demanding climate-change +research problems and Department of Energy mission needs while efficiently using DOE Leadership Computing Facilities. + +## E3SM Basics + +- [Installation](installation.md) +- [Usage](usage.md) +- [Development](development.md) ## Component Models diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000000..e41eaf0356b --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,15 @@ +# Installation Guide + +E3SM is not available as a pre-compiled binary. You install +E3SM by cloning the source code and building the executable on your local +platform. + +It is recommended that you install E3SM on a supported platform. +(See [Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration)) + +The E3SM Project can not assist with installation on an un-supported platform but can point you in the right direction. +If you wish to port E3SM to your machine, first check that you have +the software prerequisites detailed in +[Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration#Software-prerequisites). +Then proceed to the [CIME Porting Guide](https://esmci.github.io/cime/versions/master/html/users_guide/porting-cime.html). E3SM +uses the CIME Case Control System to configure and build the executable. diff --git a/docs/usage.md b/docs/usage.md new file mode 100644 index 00000000000..6c8672e0622 --- /dev/null +++ b/docs/usage.md @@ -0,0 +1,18 @@ +# Usage Guide + +E3SM is not just one climate model but a modeling system that allows +many different configurations of atmopshere, ocean, land and other +components with both full model and data model options. Some configurations +can run easily on a laptop. Other's require the most powerful +supercomputers. + +Using the model requires fist deciding what configuration to use. +The configuration options are managed by the Case Control System (CCS) +within the +[Community Infrastructure for Modeling the Earth](https://esmci.github.io/cime/versions/master/html/what_cime/index.html) (CIME). + +Start with the basic concepts and commands at +[Case Control System Basic Usage](https://esmci.github.io/cime/versions/master/html/users_guide/index.html#case-control-system-part-1-basic-usage) + +A [step-by-step guide](https://docs.e3sm.org/running-e3sm-guide/) for running E3SM with a run script +is available. diff --git a/mkdocs.yaml b/mkdocs.yaml index abc76718aa9..8650e954b3d 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,8 +1,13 @@ site_name: E3SM nav: - - Introduction: 'index.md' - - 'Developing Docs': 'https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/3924787306/Developing+Documentation' + - 'E3SM-Project' : 'http://docs.e3sm.org' + - 'e3sm.org' : 'http://e3sm.org' + - Home: 'index.md' + - E3SM Basics: + - Installation: 'installation.md' + - Usage: 'usage.md' + - Development: 'development.md' - Components: '*include ./components/*/mkdocs.yml' - Tools: '*include ./tools/*/mkdocs.yml' @@ -35,7 +40,6 @@ theme: - search.share - content.code.select - content.code.copy - - content.action.edit - content.action.view - content.tooltips From 3b45719dd320d7158a09fdd197c05b01d4343c69 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Mon, 29 Apr 2024 18:42:14 -0500 Subject: [PATCH 275/310] Don't run coupled case CI for doc-only Add mkdocs.yaml as a file that can change without triggering a run of CI with fully coupled cases. --- .github/workflows/e3sm-gh-ci-w-cime-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/e3sm-gh-ci-w-cime-tests.yml b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml index 7d31767b11c..595518c326d 100644 --- a/.github/workflows/e3sm-gh-ci-w-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-w-cime-tests.yml @@ -4,6 +4,7 @@ on: pull_request: branches: [ master ] paths-ignore: + - 'mkdocs.yaml' - 'docs/**' - 'components/*/docs/**' - 'components/*/mkdocs.yml' From 849951a9e2efb48e25ceb0a4ad40b1500fec78fb Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Mon, 29 Apr 2024 18:57:57 -0500 Subject: [PATCH 276/310] Add content, change global nav --- docs/installation.md | 8 +++++--- docs/usage.md | 11 +++++++---- mkdocs.yaml | 5 +++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index e41eaf0356b..6c15c17cba3 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -8,8 +8,10 @@ It is recommended that you install E3SM on a supported platform. (See [Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration)) The E3SM Project can not assist with installation on an un-supported platform but can point you in the right direction. -If you wish to port E3SM to your machine, first check that you have +If you wish to port E3SM to your machine, first check that the target machine has the software prerequisites detailed in [Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration#Software-prerequisites). -Then proceed to the [CIME Porting Guide](https://esmci.github.io/cime/versions/master/html/users_guide/porting-cime.html). E3SM -uses the CIME Case Control System to configure and build the executable. + +E3SM uses the CIME Case Control System (CCS) and the machines must be described to the CCS +in order to build and run E3SM. See the +[CIME Porting Guide](https://esmci.github.io/cime/versions/master/html/users_guide/porting-cime.html). diff --git a/docs/usage.md b/docs/usage.md index 6c8672e0622..ae472632dcd 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,17 +1,20 @@ # Usage Guide E3SM is not just one climate model but a modeling system that allows -many different configurations of atmopshere, ocean, land and other -components with both full model and data model options. Some configurations +many different configurations of atmosphere, ocean, land and other +components with both full model and data model options. Also, the configurations of model +components can run at different resolutions. Some configurations can run easily on a laptop. Other's require the most powerful supercomputers. -Using the model requires fist deciding what configuration to use. +Using the model requires fist deciding what configuration to use and creating +a case with that configuration. The configuration options are managed by the Case Control System (CCS) within the [Community Infrastructure for Modeling the Earth](https://esmci.github.io/cime/versions/master/html/what_cime/index.html) (CIME). -Start with the basic concepts and commands at +Before reading the rest of this guide, you should become familiar with +cases, compsets and grids by reading the [Case Control System Basic Usage](https://esmci.github.io/cime/versions/master/html/users_guide/index.html#case-control-system-part-1-basic-usage) A [step-by-step guide](https://docs.e3sm.org/running-e3sm-guide/) for running E3SM with a run script diff --git a/mkdocs.yaml b/mkdocs.yaml index 8650e954b3d..3f66381734a 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -1,8 +1,6 @@ site_name: E3SM nav: - - 'E3SM-Project' : 'http://docs.e3sm.org' - - 'e3sm.org' : 'http://e3sm.org' - Home: 'index.md' - E3SM Basics: - Installation: 'installation.md' @@ -10,6 +8,9 @@ nav: - Development: 'development.md' - Components: '*include ./components/*/mkdocs.yml' - Tools: '*include ./tools/*/mkdocs.yml' + - More Information: + - 'E3SM-Project' : 'http://docs.e3sm.org' + - 'e3sm.org' : 'http://e3sm.org' repo_name: E3SM-Project/E3SM repo_url: https://github.com/E3SM-Project/E3SM From 20dc41fd26d429bcf08f14e1054374bedf5277f8 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Thu, 2 May 2024 16:31:08 -0500 Subject: [PATCH 277/310] Update top level docs and add extension Create a user-guide subdir for more content. Move current guide there and add coupled compset/grid info. Update index.md with new location Add basic installation and development info Add mkdocs admonition extension Adjust global nav for new location of user guide --- docs/development.md | 12 +++++++++++ docs/index.md | 7 +++++- docs/installation.md | 12 ++++++++--- docs/usage.md | 21 ------------------ docs/user-guide/index.md | 46 ++++++++++++++++++++++++++++++++++++++++ mkdocs.yaml | 8 ++++++- 6 files changed, 80 insertions(+), 26 deletions(-) delete mode 100644 docs/usage.md create mode 100644 docs/user-guide/index.md diff --git a/docs/development.md b/docs/development.md index 79a9975b03a..9b1e171a972 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1 +1,13 @@ # Development Guide + +Development of E3SM is carefully planned and tied to goals in the proposals that fund +work on E3SM. + +Most development occurs within one component and developers should consult the +relevant component's development guide. + +More information + ++ [Development Big Picture](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/7997024/Development+Big+Picture) ++ [Getting Started](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide) ++ [Development Reference](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2523163/Development+Reference) diff --git a/docs/index.md b/docs/index.md index f9f1f1dfc35..ed45487d2a5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,10 +4,15 @@ E3SM is a state-of-the-art fully coupled model of the Earth's climate including and cryospheric processes. It is intended to address the most challenging and demanding climate-change research problems and Department of Energy mission needs while efficiently using DOE Leadership Computing Facilities. +!!! note + This is the future home for all documentation specific to E3SM and its components. Until complete, + some documentation will be found at the project's + [Confluence wiki](https://acme-climate.atlassian.net/wiki/spaces/DOC/overview) + ## E3SM Basics - [Installation](installation.md) -- [Usage](usage.md) +- [User Guide](user-guide/index.md) - [Development](development.md) ## Component Models diff --git a/docs/installation.md b/docs/installation.md index 6c15c17cba3..38b725e9f95 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,8 +1,9 @@ # Installation Guide E3SM is not available as a pre-compiled binary. You install -E3SM by cloning the source code and building the executable on your local -platform. +E3SM by cloning the source code using [git](https://git-scm.com/) +and building the executable on your local platform after making some +choices on model configuration (addressed in the [User Guide](user-guide/index.md)). It is recommended that you install E3SM on a supported platform. (See [Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration)) @@ -12,6 +13,11 @@ If you wish to port E3SM to your machine, first check that the target machine ha the software prerequisites detailed in [Hardware/Software Configuration](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/4116447351/Hardware+Software+Configuration#Software-prerequisites). -E3SM uses the CIME Case Control System (CCS) and the machines must be described to the CCS +E3SM uses the CIME Case Control System (CCS) and a machine must be described to the CCS in order to build and run E3SM. See the [CIME Porting Guide](https://esmci.github.io/cime/versions/master/html/users_guide/porting-cime.html). + +Once you are on a supported machine, clone the source code by following the first steps (2-4 and 6) +in the [Development Getting Started Guide](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/1868455/Development+Getting+Started+Guide). + +To start configuration cases and building the model, see the User Guide diff --git a/docs/usage.md b/docs/usage.md deleted file mode 100644 index ae472632dcd..00000000000 --- a/docs/usage.md +++ /dev/null @@ -1,21 +0,0 @@ -# Usage Guide - -E3SM is not just one climate model but a modeling system that allows -many different configurations of atmosphere, ocean, land and other -components with both full model and data model options. Also, the configurations of model -components can run at different resolutions. Some configurations -can run easily on a laptop. Other's require the most powerful -supercomputers. - -Using the model requires fist deciding what configuration to use and creating -a case with that configuration. -The configuration options are managed by the Case Control System (CCS) -within the -[Community Infrastructure for Modeling the Earth](https://esmci.github.io/cime/versions/master/html/what_cime/index.html) (CIME). - -Before reading the rest of this guide, you should become familiar with -cases, compsets and grids by reading the -[Case Control System Basic Usage](https://esmci.github.io/cime/versions/master/html/users_guide/index.html#case-control-system-part-1-basic-usage) - -A [step-by-step guide](https://docs.e3sm.org/running-e3sm-guide/) for running E3SM with a run script -is available. diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md new file mode 100644 index 00000000000..a3df3077165 --- /dev/null +++ b/docs/user-guide/index.md @@ -0,0 +1,46 @@ +# User Guide + +E3SM is not just one climate model but a modeling system that allows +many different configurations of atmosphere, ocean, land and other +components with both full model and data model options. Also, the configurations of model +components can run at different resolutions. Some configurations +can run easily on a laptop. Other's require the most powerful +supercomputers. + +Using the model requires fist deciding what configuration to use and creating +a case with that configuration. +The configuration options are managed by the Case Control System (CCS) +within the +[Community Infrastructure for Modeling the Earth](https://esmci.github.io/cime/versions/master/html/what_cime/index.html) (CIME). + +Before reading the rest of this guide, you should become familiar with +cases, compsets and grids by reading the +[Case Control System Basic Usage](https://esmci.github.io/cime/versions/master/html/users_guide/index.html#case-control-system-part-1-basic-usage) + +A [step-by-step guide](https://docs.e3sm.org/running-e3sm-guide/) for running E3SM with a run script +is available. + +## Supported Coupled Compsets + +A *fully coupled* compset is one which has active components for at least the atmosphere, ocean, land surface, ocean and +sea-ice all interacting. The fully coupled compsets supported in this version of E3SM are: + +| Compset Alias | TIME | ATM | LND | Sea ice | Ocean | River | +| -------- | ---- | --- | --- | --------- | ------ | ----- | +|WCYCL1850 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1850-1pcCO2 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1850-4xCO2 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL20TR | 20TRSOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1950 | 1950SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | + +Additional compsets are available for the component models. See the User Guides for the components for more information. + +## Supported resolution + +Only one grid set is supported for the above compsets. + +`ne30pg2_r05_IcoswISC30E3r5` - For this grid set, the atmosphere is on the ne30pg2 cubed-sphere mesh with approximately 100km +resolution, the land and river +are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km +resolution icosohedral mesh with ice shelf cavities (wISC) around Antarctica. + diff --git a/mkdocs.yaml b/mkdocs.yaml index 3f66381734a..3d4813a4750 100644 --- a/mkdocs.yaml +++ b/mkdocs.yaml @@ -3,8 +3,9 @@ site_name: E3SM nav: - Home: 'index.md' - E3SM Basics: + - 'index.md' - Installation: 'installation.md' - - Usage: 'usage.md' + - User Guide: 'user-guide/index.md' - Development: 'development.md' - Components: '*include ./components/*/mkdocs.yml' - Tools: '*include ./tools/*/mkdocs.yml' @@ -28,6 +29,9 @@ theme: toggle: icon: material/weather-night name: Switch to light mode + icon: + admonition: + note: octicons/tag-16 features: - navigation.indexes - navigation.instant @@ -46,7 +50,9 @@ theme: markdown_extensions: + - admonition - footnotes + - pymdownx.details - pymdownx.highlight - pymdownx.superfences - pymdownx.tabbed: From f081275301648a3fae37e13fdc8981a552508412 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Thu, 2 May 2024 16:33:07 -0500 Subject: [PATCH 278/310] Add to gitignore Ignore DS_Store and .vscode --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index c4d2a64bc99..8c1fa12b87c 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,13 @@ site # Ignore emacs backup files *~ +#Ignore Mac folder files +.DS_Store + +#Ignore vscode dir +.vscode + + # Ignore mkdocs site-generated files in eamxx components/eamxx/site/* # Ignore auto-generated eamxx_params.md file From 21038fb51826a1349b14028680b1703b98b09b55 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Thu, 2 May 2024 16:41:26 -0500 Subject: [PATCH 279/310] Add link to MPAS-Ocean docs Add link to new MPAS-Ocean docs --- docs/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.md b/docs/index.md index ed45487d2a5..b130b5b613b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,6 +21,7 @@ research problems and Department of Energy mission needs while efficiently using - [EAMxx](./EAMxx/index.md) - [ELM](./ELM/index.md) - [MOSART](./MOSART/index.md) +- [MPAS-Ocean](./MPAS-Ocean/index.md) ## Tools From 685af9576024a825fd208f883f314952a52d1b6e Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Thu, 2 May 2024 16:43:06 -0500 Subject: [PATCH 280/310] Add mkdocs.yml to mpas-ocean Add mkdocs.yml to mpas-ocean for monorepo to include its docs. Remove inline TOC from user's guide. --- components/mpas-ocean/docs/user-guide/index.md | 10 ---------- components/mpas-ocean/mkdocs.yml | 7 +++++++ 2 files changed, 7 insertions(+), 10 deletions(-) create mode 100644 components/mpas-ocean/mkdocs.yml diff --git a/components/mpas-ocean/docs/user-guide/index.md b/components/mpas-ocean/docs/user-guide/index.md index 5877ed29aad..0bc14046db0 100644 --- a/components/mpas-ocean/docs/user-guide/index.md +++ b/components/mpas-ocean/docs/user-guide/index.md @@ -3,16 +3,6 @@ This MPAS-Ocean Quick Start Guide describes how to set up and run MPAS-Ocean within E3SM. More details can be found in the [MPAS-Ocean User's Guide](https://zenodo.org/records/11098080), as well as instructions on running the stand-alone ocean model. -## Table of contents - -1. [Steps to build and run MPAS-Ocean](#steps-to-build-and-run-mpas-ocean) -2. [Scientifically supported compsets and meshes](#scientifically-supported-compsets-and-meshes) - 1. [Compsets](#compsets) - 2. [Meshes](#meshes) -3. [Customizing runs](#customizing-runs) - 1. [Namelist changes](#namelist-changes) - 2. [Configuring input and output for MPAS-Ocean](#configuring-input-and-output-for-mpas-ocean) - ## Steps to build and run MPAS-Ocean Step-by-step instructions on how to run E3SM can be found at [https://docs.e3sm.org/running-e3sm-guide](https://docs.e3sm.org/running-e3sm-guide). diff --git a/components/mpas-ocean/mkdocs.yml b/components/mpas-ocean/mkdocs.yml new file mode 100644 index 00000000000..3e250057929 --- /dev/null +++ b/components/mpas-ocean/mkdocs.yml @@ -0,0 +1,7 @@ +site_name: MPAS-Ocean + +nav: + - Introduction: 'index.md' + - Users's Guide: user-guide/index.md + - Developers's Guide: dev-guide/index.md + - Technical Guide: tech-guide/index.md From d2d725191a6dbd8612531f5828993435347078fe Mon Sep 17 00:00:00 2001 From: donghuix Date: Thu, 2 May 2024 14:44:47 -0700 Subject: [PATCH 281/310] change the grid to r05_r05 for lnd_rof_two_way test --- cime_config/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index 0ead7c13bcb..9e61f055362 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -91,7 +91,7 @@ "SMS_Ly2_P1x1.1x1_smallvilleIA.IELMCNCROP.elm-fan", "SMS.r05_r05.IELM.elm-topounit", "ERS.ELM_USRDAT.I1850ELM.elm-usrdat", - "ERS.f09_f09.IELM.elm-lnd_rof_2way", + "ERS.r05_r05.IELM.elm-lnd_rof_2way", "ERS.r05_r05.IELM.elm-V2_ELM_MOSART_features", "ERS.ELM_USRDAT.IELM.elm-surface_water_dynamics" ) From 15b7d32fd6899f272b41d068b1675aa7f05ff885 Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Thu, 2 May 2024 16:51:20 -0500 Subject: [PATCH 282/310] Fix lint error --- docs/user-guide/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index a3df3077165..95bcb30e93d 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -43,4 +43,3 @@ Only one grid set is supported for the above compsets. resolution, the land and river are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km resolution icosohedral mesh with ice shelf cavities (wISC) around Antarctica. - From a59296353c84640ecd5a4b2eecce79e7e5d612ce Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Thu, 2 May 2024 17:36:49 -0500 Subject: [PATCH 283/310] Change h0 tapes output frequency for the SSP testmod --- cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam | 2 +- cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam index 95c1b4a0f92..7ef3e3782a3 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam +++ b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_eam @@ -3,7 +3,7 @@ empty_htapes = .true. avgflag_pertape = 'A','A','A','A','I','I' - nhtfrq = 0,-24,-6,-3,-1,0 + nhtfrq = -24,-24,-6,-3,-1,0 mfilt = 1,30,120,240,720,1 fincl1 = 'AODALL','AODBC','AODDUST','AODPOM','AODSO4','AODSOA','AODSS','AODVIS', diff --git a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm index e83a2b08a8b..7bfdbac5c84 100644 --- a/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm +++ b/cime_config/testmods_dirs/allactive/wcprodssp/user_nl_elm @@ -41,6 +41,6 @@ hist_fincl1 = 'SNOWDP','COL_FIRE_CLOSS','NPOOL','PPOOL','TOTPRODC' hist_fincl2 = 'H2OSNO', 'FSNO', 'QRUNOFF', 'QSNOMELT', 'FSNO_EFF', 'SNORDSL', 'SNOW', 'FSDS', 'FSR', 'FLDS', 'FIRE', 'FIRA' hist_mfilt = 1,365 - hist_nhtfrq = 0,-24 + hist_nhtfrq = -24,-24 hist_avgflag_pertape = 'A','A' From a61d1a09af3930489ed623115523ba5aabfddeb1 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 2 May 2024 19:37:19 -0400 Subject: [PATCH 284/310] remove eamxx from e3sm docs for now --- components/eamxx/{mkdocs.yml => mkdocs.yaml} | 0 docs/index.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename components/eamxx/{mkdocs.yml => mkdocs.yaml} (100%) diff --git a/components/eamxx/mkdocs.yml b/components/eamxx/mkdocs.yaml similarity index 100% rename from components/eamxx/mkdocs.yml rename to components/eamxx/mkdocs.yaml diff --git a/docs/index.md b/docs/index.md index 4d484b4e048..421bbe91d42 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ The E3SM documentation is organized into sections for each component model and a ## Component Models - [EAM](./EAM/index.md) -- [EAMxx](./EAMxx/index.md) +- [EAMxx](https://E3SM-project.github.io/scream) - [ELM](./ELM/index.md) - [MOSART](./MOSART/index.md) From cdc1f482168019004fde741f1188b2e4d1d6b106 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 09:09:31 -0500 Subject: [PATCH 285/310] Restore config settings for idealized CO2 compsets --- components/eam/cime_config/config_component.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/eam/cime_config/config_component.xml b/components/eam/cime_config/config_component.xml index f25727162cc..3e7508e2149 100755 --- a/components/eam/cime_config/config_component.xml +++ b/components/eam/cime_config/config_component.xml @@ -51,6 +51,8 @@ -mach $MACH -phys default + &eamv3_phys_defaults; &eamv3_chem_defaults; + &eamv3_phys_defaults; &eamv3_chem_defaults; &eamv3_phys_defaults; &eamv3_chem_defaults; -bc_dep_to_snow_updates -co2_cycle From 5757225cb89cb5bc04f23ec6c968b95ba6b2ebec Mon Sep 17 00:00:00 2001 From: Steven Brus Date: Thu, 2 May 2024 09:59:58 -0700 Subject: [PATCH 286/310] Fix issues in namelist files --- .../src/mode_init/Registry_buttermilk_bay.xml | 18 +++++++++--------- .../src/mode_init/Registry_parabolic_bowl.xml | 17 ++++++----------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/components/mpas-ocean/src/mode_init/Registry_buttermilk_bay.xml b/components/mpas-ocean/src/mode_init/Registry_buttermilk_bay.xml index 7bcd5915443..09754d2a7d4 100644 --- a/components/mpas-ocean/src/mode_init/Registry_buttermilk_bay.xml +++ b/components/mpas-ocean/src/mode_init/Registry_buttermilk_bay.xml @@ -1,4 +1,4 @@ - + - - + + + - + - - @@ -23,7 +23,7 @@ description="Gravitational accerlation" possible_values="Any real number" /> - @@ -44,8 +44,3 @@ possible_values=".true. or .false." /> - - - - - From 5f13df21aa54d961969dd54cb8ac136727f76c58 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 10:36:36 -0700 Subject: [PATCH 287/310] Add additional docs for running coupled e3sm --- docs/user-guide/index.md | 53 +++++++++++++++++------ docs/user-guide/ssp245-forcings.md | 68 ++++++++++++++++++++++++++++++ docs/user-guide/ssp370-forcings.md | 68 ++++++++++++++++++++++++++++++ docs/user-guide/ssp585-forcings.md | 68 ++++++++++++++++++++++++++++++ 4 files changed, 244 insertions(+), 13 deletions(-) create mode 100644 docs/user-guide/ssp245-forcings.md create mode 100644 docs/user-guide/ssp370-forcings.md create mode 100644 docs/user-guide/ssp585-forcings.md diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 95bcb30e93d..8abf17066b2 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -7,7 +7,7 @@ components can run at different resolutions. Some configurations can run easily on a laptop. Other's require the most powerful supercomputers. -Using the model requires fist deciding what configuration to use and creating +Using the model requires first deciding what configuration to use and creating a case with that configuration. The configuration options are managed by the Case Control System (CCS) within the @@ -23,23 +23,50 @@ is available. ## Supported Coupled Compsets A *fully coupled* compset is one which has active components for at least the atmosphere, ocean, land surface, ocean and -sea-ice all interacting. The fully coupled compsets supported in this version of E3SM are: +sea-ice all interacting. Each compset is associated with a specific forcing condition (time period). +The fully coupled compsets supported in this version of E3SM are: | Compset Alias | TIME | ATM | LND | Sea ice | Ocean | River | | -------- | ---- | --- | --- | --------- | ------ | ----- | -|WCYCL1850 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1850-1pcCO2 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1850-4xCO2 | 1850SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL20TR | 20TRSOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1950 | 1950SOI | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1850 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1850-1pcCO2 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1850-4xCO2 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL1950 | 1950 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCL20TR | 20TR | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCLSSP245 | SSP245 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCLSSP370 | SSP370 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | +|WCYCLSSP585 | SSP585 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -Additional compsets are available for the component models. See the User Guides for the components for more information. +Coupled compsets in E3SM are developed for three science-driven simulation campaigns: `water cycle change and impacts`, `human-earth system feedbacks`, and `polar processes, sea-level rise and coastal impacts`. The above compsets with prognostic atmosphere, land, river, ocean and sea-ice components form the base physical +coupled system and are mainly designed for `water cycle change and impacts` simulation campaign. The compsets for the other two science simulation campaigns +are being finalized, with additional components and/or features. The compset naming follows the same convention, e.g., `CRYO1850` and `CRYO1850-4xCO2` are with prognostic ice-shelf melt fluxes for the `polar processes` simulation campaign. + +Compsets are also available for standalone component model configurations, See the User Guides for the components for more information. ## Supported resolution -Only one grid set is supported for the above compsets. +Currently two grid sets are supported for the above compsets, including a nominal low-resosluton confiuguration and one regionally refined mesh. Additional regionally refined meshes and a high-resolution grid will become available in the near future. + +| Grid Alias | Description | +| ----------- | ------------ | +|ne30pg2_r05_IcoswISC30E3r5 | For this grid set, the atmosphere is on the ne30pg2 cubed-sphere mesh with approximately 100km +resolution, the land and river are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km +resolution icosahedral mesh with ice shelf cavities (wISC) around Antarctica.| +|northamericax4v1pg2_r025_IcoswISC30E3r5 | The atmosphere for this grid set uses North America regionally refined mesh from about 110 km down to 25 km over the refined region. The land and river are on 0.25deg x 0.25deg structured grid. The ocean and sea ice are on the same icosahedral mesh as for `ne30pg2_r05_IcoswISC30E3r5`.| + +## Input data + +Inputdata for coupled compsets at component model levels are the same as for the standalone compnent configurations +for a given forcing scenario (e.g., `1850` for the pre-industrial period, `20TR` for the historical period, `2010` +for present-day condition, and `SSPs` for Shared Socioeconomic Pathways of climate change scenarios). +Between the coupled compsets, the differences are in the prescribed solar forcing, volcanic emissions, +atmospheric forcing data, and land use and land cover. The required inputdata for the pre-industrial and the historical periods +as well as the present-day condition are described in [the EAM User's Guide](https://e3sm-project.github.io/E3SM/EAM) and +[the ELM's User's Guide](https://e3sm-project.github.io/E3SM/ELM). Below are the prescribed forcing data for the SSP scenarios. + +### [SSP245 forcing data](ssp245-forcings.md) + +### [SSP370 forcing data](ssp370-forcings.md) + +### [SSP585 forcing data](ssp585-forcings.md) -`ne30pg2_r05_IcoswISC30E3r5` - For this grid set, the atmosphere is on the ne30pg2 cubed-sphere mesh with approximately 100km -resolution, the land and river -are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km -resolution icosohedral mesh with ice shelf cavities (wISC) around Antarctica. diff --git a/docs/user-guide/ssp245-forcings.md b/docs/user-guide/ssp245-forcings.md new file mode 100644 index 00000000000..9b101acb7b0 --- /dev/null +++ b/docs/user-guide/ssp245-forcings.md @@ -0,0 +1,68 @@ +# SSP245 Forcing data + +These are the prescribed inputdata specifically for the SSP245 scenario, in place of the files for the historical period. + +## Solar constant + +`\$DIN_LOC_ROOT/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc` + +## Greenhouse gas concentrations + +`\$DIN_LOC_ROOT/atm/cam/ggas/GHG_CMIP_SSP245-1-2-1_Annual_Global_2015-2500_c20200807.nc` + +## Elevated external forcings + +```fortran +no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240219.nc +so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_volc_elev_2015-2100_c240331.nc +soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240219.nc +bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_elev_2015-2100_c200716.nc +mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_elev_2015-2100_c200716.nc +num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_elev_2015-2100_c200716.nc +mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_elev_2015-2100_c200716.nc +pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_elev_2015-2100_c200716.nc +so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_elev_2015-2100_c200716.nc +so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_elev_2015-2100_c200716.nc +``` + +## Surface emissions + +```fortran +c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240219.nc +c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240219.nc +c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240219.nc +ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240219.nc +ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240219.nc +ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240219.nc +co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CO_surface_2015-2100_1.9x2.5_c20240219.nc +isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240219.nc +nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO_surface_2015-2100_1.9x2.5_c20240219.nc +dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_surf_2015-2100_c200716.nc +soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240219.nc +bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_surf_2015-2100_c200716.nc +mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_surf_2015-2100_c200716.nc +num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_surf_2015-2100_c200716.nc +mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_surf_2015-2100_c200716.nc +pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_surf_2015-2100_c200716.nc +so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_surf_2015-2100_c200716.nc +so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_surf_2015-2100_c200716.nc +e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +``` + +## Prescribed oxidant for aerosol chemistry + +`$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid/oxid_SSP245_1.9x2.5_L70_1849-2101_c20240228.nc` + +## Stratospheric ozone (linoz) and chlorine loading data + +```fortran +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/Linoz_Chlorine_Loading_CMIP6_Hist_SSP245_0003-2503_c20200808.nc +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/linv3_1849-2101_CMIP6_Hist_SSP245_10deg_58km_c20230705.nc +``` + +## Land use and land cover + +`\$DIN_LOC_ROOT/lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp2_rcp45_simyr2015-2100_c240408.nc` diff --git a/docs/user-guide/ssp370-forcings.md b/docs/user-guide/ssp370-forcings.md new file mode 100644 index 00000000000..ddf83930085 --- /dev/null +++ b/docs/user-guide/ssp370-forcings.md @@ -0,0 +1,68 @@ +# SSP370 Forcing data + +These are the prescribed inputdata specifically for the SSP370 scenario, in place of the files for the historical period. + +## Solar constant + +`\$DIN_LOC_ROOT/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc` + +## Greenhouse gas concentrations + +`\$DIN_LOC_ROOT/atm/cam/ggas/GHG_CMIP_SSP370-1-2-1_Annual_Global_2015-2500_c20210509.nc` + +## Elevated external forcings + +```fortran +no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc +so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_volc_elev_2015-2100_c240331.nc +soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc +bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_elev_2015-2100_c210216.nc +mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_elev_2015-2100_c210216.nc +num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_elev_2015-2100_c210216.nc +mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_elev_2015-2100_c210216.nc +pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_elev_2015-2100_c210216.nc +so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_elev_2015-2100_c210216.nc +so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_elev_2015-2100_c210216.nc +``` + +## Surface emissions + +```fortran +c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240208.nc +c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240208.nc +c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240208.nc +ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240208.nc +ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240208.nc +ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240208.nc +co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CO_surface_2015-2100_1.9x2.5_c20240208.nc +isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240208.nc +nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO_surface_2015-2100_1.9x2.5_c20240208.nc +dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_surf_2015-2100_c210216.nc +soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240208.nc +bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_surf_2015-2100_c210216.nc +mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_surf_2015-2100_c210216.nc +num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_surf_2015-2100_c210216.nc +mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_surf_2015-2100_c210216.nc +pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc +so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc +so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc +e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +``` + +## Prescribed oxidant for aerosol chemistry + +`\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid/oxid_SSP370_1.9x2.5_L70_1849-2101_c20240228.nc` + +## Stratospheric ozone (linoz) and chlorine loading data + +```fortran +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/Linoz_Chlorine_Loading_CMIP6_Hist_SSP370_0003-2503_c20210202.nc +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/linv3_1849-2101_CMIP6_Hist_SSP370_10deg_58km_c20230705.nc +``` + +## Land use and land cover + +`\$DIN_LOC_ROOT/lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp3_rcp70_simyr2015-2100_c240308.nc` diff --git a/docs/user-guide/ssp585-forcings.md b/docs/user-guide/ssp585-forcings.md new file mode 100644 index 00000000000..813f2eae0f5 --- /dev/null +++ b/docs/user-guide/ssp585-forcings.md @@ -0,0 +1,68 @@ +# SSP585 Forcing data + +These are the prescribed inputdata specifically for the SSP585 scenario, in place of the files for the historical period. + +## Solar constant + +`\$DIN_LOC_ROOT/atm/cam/solar/Solar_1850-2299_input4MIPS_c20181106.nc` + +## Greenhouse gas concentrations + +`\$DIN_LOC_ROOT/atm/cam/ggas/GHG_CMIP_SSP585-1-2-1_Annual_Global_2015-2500_c20190310.nc` + +## Elevated external forcings + +```fortran +no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240304.nc +so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_volc_elev_2015-2100_c240331.nc +soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240304.nc +bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_elev_2015-2100_c190828.nc +mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_elev_2015-2100_c190828.nc +num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_elev_2015-2100_c190828.nc +mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_elev_2015-2100_c190828.nc +pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_elev_2015-2100_c190828.nc +so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_elev_2015-2100_c190828.nc +so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_elev_2015-2100_c190828.nc +``` + +## Surface emissions + +```fortran +c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240304.nc +c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240304.nc +c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240304.nc +ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240304.nc +ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240304.nc +ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240304.nc +co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CO_surface_2015-2100_1.9x2.5_c20240304.nc +isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240304.nc +nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO_surface_2015-2100_1.9x2.5_c20240304.nc +dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_surf_2015-2100_c190828.nc +soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240304.nc +bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_surf_2015-2100_c190828.nc +mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_surf_2015-2100_c190828.nc +num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_surf_2015-2100_c190828.nc +mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_surf_2015-2100_c190828.nc +pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_surf_2015-2100_c190828.nc +so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_surf_2015-2100_c190828.nc +so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_surf_2015-2100_c190828.nc +e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +``` + +## Prescribed oxidant for aerosol chemistry + +`\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/oxid/oxid_SSP585_1.9x2.5_L70_2014-2101_c20240228.nc` + +## Stratospheric ozone (linoz) and chlorine loading data + +```fortran +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/Linoz_Chlorine_Loading_CMIP6_Hist_SSP585_0003-2503_c20190414.nc +\$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/linv3_1849-2101_CMIP6_Hist_SSP585_10deg_58km_c20230705.nc +``` + +## Land use and land cover + +`\$DIN_LOC_ROOT/lnd/clm2/surfdata_map/landuse.timeseries_0.5x0.5_ssp5_rcp85_simyr2015-2100_c240408.nc` From 8b9ed5418b90aa80ff9ca3302148d47aef945e9f Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 10:49:14 -0700 Subject: [PATCH 288/310] Revise description for the supported coupled compsets --- docs/user-guide/index.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 8abf17066b2..55e8758f163 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -23,23 +23,23 @@ is available. ## Supported Coupled Compsets A *fully coupled* compset is one which has active components for at least the atmosphere, ocean, land surface, ocean and -sea-ice all interacting. Each compset is associated with a specific forcing condition (time period). -The fully coupled compsets supported in this version of E3SM are: - -| Compset Alias | TIME | ATM | LND | Sea ice | Ocean | River | -| -------- | ---- | --- | --- | --------- | ------ | ----- | -|WCYCL1850 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1850-1pcCO2 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1850-4xCO2 | 1850 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL1950 | 1950 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCL20TR | 20TR | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCLSSP245 | SSP245 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCLSSP370 | SSP370 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | -|WCYCLSSP585 | SSP585 | EAM | ELM | MPAS-Seaice | MPAS-Ocean | MOSART | - -Coupled compsets in E3SM are developed for three science-driven simulation campaigns: `water cycle change and impacts`, `human-earth system feedbacks`, and `polar processes, sea-level rise and coastal impacts`. The above compsets with prognostic atmosphere, land, river, ocean and sea-ice components form the base physical -coupled system and are mainly designed for `water cycle change and impacts` simulation campaign. The compsets for the other two science simulation campaigns -are being finalized, with additional components and/or features. The compset naming follows the same convention, e.g., `CRYO1850` and `CRYO1850-4xCO2` are with prognostic ice-shelf melt fluxes for the `polar processes` simulation campaign. +sea-ice all interacting. Each compset is associated with a specific forcing condition. +Coupled compsets in E3SM are developed for three science-driven simulation campaigns: `water cycle change and impacts`, `human-earth system feedbacks`, and `polar processes, sea-level rise and coastal impacts`. The standard coupled configurations -- which consist of prognostic atmosphere, land, river, ocean and sea-ice components -- form the base physical coupled system and are mainly designed for `water cycle change and impacts` simulation campaign. +Below list the standard configuration compsets supported in the current version of E3SM: + +|Compset alias | Description | +|:----------- |:----------- | +|`WCYCL1850` | Standard configuration with pre-industrial climatological forcings | +|`WCYCL1850-4xCO2` | Same as `WCYCL1850` except with abrupt (then persistent) 4xCO2 forcing. | +|`WCYCL1850-1pctCO2` | Same as `WCYCL1850` except with 1 percent per year increase of CO2 concentration | +|`WCYCL1950` | Standard configuration with perpetual 1950 forcings | +|`WCYCL20TR` | Standard configuration with prescribed transient forcings over the historical period (1850-2014) | +|`WCYCLSSP245` | Standard configuration with prescribed SSP-245 forcings | +|`WCYCLSSP370` | Standard configuration with prescribed SSP-370 forcings | +|`WCYCLSSP585` | Standard configuration with prescribed SSP-585 forcings | + +The compsets for the other two science simulation campaigns are being finalized, with additional components and/or features. +The compset naming follows the same convention, e.g., `CRYO1850` and `CRYO1850-4xCO2` are with prognostic ice-shelf melt fluxes for the `polar processes` simulation campaign. Compsets are also available for standalone component model configurations, See the User Guides for the components for more information. @@ -56,7 +56,7 @@ resolution icosahedral mesh with ice shelf cavities (wISC) around Antarctica.| ## Input data -Inputdata for coupled compsets at component model levels are the same as for the standalone compnent configurations +Inputdata for coupled compsets at component model levels are the same as for the standalone component configurations for a given forcing scenario (e.g., `1850` for the pre-industrial period, `20TR` for the historical period, `2010` for present-day condition, and `SSPs` for Shared Socioeconomic Pathways of climate change scenarios). Between the coupled compsets, the differences are in the prescribed solar forcing, volcanic emissions, From 1ba9ab47d0399d167a1dea98bd6263e3376d3f3a Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Fri, 3 May 2024 13:50:11 -0400 Subject: [PATCH 289/310] indicate that EAMxx is not yet supported explicitly Co-authored-by: Robert Jacob --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 421bbe91d42..5b5fc7b98b4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,7 +5,7 @@ The E3SM documentation is organized into sections for each component model and a ## Component Models - [EAM](./EAM/index.md) -- [EAMxx](https://E3SM-project.github.io/scream) +- EAMxx — not yet supported. - [ELM](./ELM/index.md) - [MOSART](./MOSART/index.md) From 41ff71df5c34e14d5e3fd3d641825e93875b499b Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 11:06:43 -0700 Subject: [PATCH 290/310] Fix table format --- docs/user-guide/index.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 55e8758f163..70972f9476b 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -38,7 +38,7 @@ Below list the standard configuration compsets supported in the current version |`WCYCLSSP370` | Standard configuration with prescribed SSP-370 forcings | |`WCYCLSSP585` | Standard configuration with prescribed SSP-585 forcings | -The compsets for the other two science simulation campaigns are being finalized, with additional components and/or features. +The compsets for the other two science simulation campaigns are being finalized, with additional components and/or features. The compset naming follows the same convention, e.g., `CRYO1850` and `CRYO1850-4xCO2` are with prognostic ice-shelf melt fluxes for the `polar processes` simulation campaign. Compsets are also available for standalone component model configurations, See the User Guides for the components for more information. @@ -49,9 +49,7 @@ Currently two grid sets are supported for the above compsets, including a nomina | Grid Alias | Description | | ----------- | ------------ | -|ne30pg2_r05_IcoswISC30E3r5 | For this grid set, the atmosphere is on the ne30pg2 cubed-sphere mesh with approximately 100km -resolution, the land and river are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km -resolution icosahedral mesh with ice shelf cavities (wISC) around Antarctica.| +|ne30pg2_r05_IcoswISC30E3r5 | For this grid set, the atmosphere is on the ne30pg2 cubed-sphere mesh with approximately 100km resolution, the land and river are on a 0.5deg x 0.5deg structured grid, and the ocean and sea ice are on a hexagonal mesh dervied from the dual of a 30km resolution icosahedral mesh with ice shelf cavities (wISC) around Antarctica.| |northamericax4v1pg2_r025_IcoswISC30E3r5 | The atmosphere for this grid set uses North America regionally refined mesh from about 110 km down to 25 km over the refined region. The land and river are on 0.25deg x 0.25deg structured grid. The ocean and sea ice are on the same icosahedral mesh as for `ne30pg2_r05_IcoswISC30E3r5`.| ## Input data From 8c2893edef62840288793af81e9baee36fce6a0e Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 11:11:02 -0700 Subject: [PATCH 291/310] Remove extra blank line --- docs/user-guide/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 70972f9476b..c2daf519a42 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -67,4 +67,3 @@ as well as the present-day condition are described in [the EAM User's Guide](htt ### [SSP370 forcing data](ssp370-forcings.md) ### [SSP585 forcing data](ssp585-forcings.md) - From d3c7f86e5e89c90a7d090780e133226382fd3fe4 Mon Sep 17 00:00:00 2001 From: Wuyin Lin Date: Fri, 3 May 2024 15:57:29 -0700 Subject: [PATCH 292/310] Change to use actual pointer names for SSP aerosol forcing species --- docs/user-guide/ssp245-forcings.md | 64 +++++++++++++++--------------- docs/user-guide/ssp370-forcings.md | 64 +++++++++++++++--------------- docs/user-guide/ssp585-forcings.md | 64 +++++++++++++++--------------- 3 files changed, 96 insertions(+), 96 deletions(-) diff --git a/docs/user-guide/ssp245-forcings.md b/docs/user-guide/ssp245-forcings.md index 9b101acb7b0..d4cbded160e 100644 --- a/docs/user-guide/ssp245-forcings.md +++ b/docs/user-guide/ssp245-forcings.md @@ -13,43 +13,43 @@ These are the prescribed inputdata specifically for the SSP245 scenario, in plac ## Elevated external forcings ```fortran -no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240219.nc -so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_volc_elev_2015-2100_c240331.nc -soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240219.nc -bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_elev_2015-2100_c200716.nc -mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_elev_2015-2100_c200716.nc -num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_elev_2015-2100_c200716.nc -mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_elev_2015-2100_c200716.nc -pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_elev_2015-2100_c200716.nc -so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_elev_2015-2100_c200716.nc -so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_elev_2015-2100_c200716.nc +NO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240219.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_volc_elev_2015-2100_c240331.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240219.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_elev_2015-2100_c200716.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_elev_2015-2100_c200716.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_elev_2015-2100_c200716.nc +num_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_elev_2015-2100_c200716.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_elev_2015-2100_c200716.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_elev_2015-2100_c200716.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_elev_2015-2100_c200716.nc ``` ## Surface emissions ```fortran -c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240219.nc -c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240219.nc -c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240219.nc -ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240219.nc -ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240219.nc -ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240219.nc -co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CO_surface_2015-2100_1.9x2.5_c20240219.nc -isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc -isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc -c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240219.nc -nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO_surface_2015-2100_1.9x2.5_c20240219.nc -dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc -so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_surf_2015-2100_c200716.nc -soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240219.nc -bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_surf_2015-2100_c200716.nc -mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_surf_2015-2100_c200716.nc -num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_surf_2015-2100_c200716.nc -mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_surf_2015-2100_c200716.nc -pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_surf_2015-2100_c200716.nc -so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_surf_2015-2100_c200716.nc -so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_surf_2015-2100_c200716.nc -e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +C2H4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240219.nc +C2H6 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240219.nc +C3H8 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240219.nc +CH2O \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240219.nc +CH3CHO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240219.nc +CH3COCH3 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240219.nc +CO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_CO_surface_2015-2100_1.9x2.5_c20240219.nc +ISOP \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +ISOP_VBS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240219.nc +C10H16 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240219.nc +NOX \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_NO_surface_2015-2100_1.9x2.5_c20240219.nc +DMS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so2_surf_2015-2100_c200716.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/emissions-cmip6_ssp245_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240219.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_bc_a4_surf_2015-2100_c200716.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a1_surf_2015-2100_c200716.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a2_surf_2015-2100_c200716.nc +num_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_num_a4_surf_2015-2100_c200716.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_pom_a4_surf_2015-2100_c200716.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a1_surf_2015-2100_c200716.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP245_ne30/cmip6_ssp245_mam4_so4_a2_surf_2015-2100_c200716.nc +E90 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc ``` ## Prescribed oxidant for aerosol chemistry diff --git a/docs/user-guide/ssp370-forcings.md b/docs/user-guide/ssp370-forcings.md index ddf83930085..29477a5d179 100644 --- a/docs/user-guide/ssp370-forcings.md +++ b/docs/user-guide/ssp370-forcings.md @@ -13,43 +13,43 @@ These are the prescribed inputdata specifically for the SSP370 scenario, in plac ## Elevated external forcings ```fortran -no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc -so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_volc_elev_2015-2100_c240331.nc -soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc -bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_elev_2015-2100_c210216.nc -mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_elev_2015-2100_c210216.nc -num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_elev_2015-2100_c210216.nc -mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_elev_2015-2100_c210216.nc -pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_elev_2015-2100_c210216.nc -so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_elev_2015-2100_c210216.nc -so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_elev_2015-2100_c210216.nc +NO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240208.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_volc_elev_2015-2100_c240331.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240208.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_elev_2015-2100_c210216.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_elev_2015-2100_c210216.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_elev_2015-2100_c210216.nc +num_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_elev_2015-2100_c210216.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_elev_2015-2100_c210216.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_elev_2015-2100_c210216.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_elev_2015-2100_c210216.nc ``` ## Surface emissions ```fortran -c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240208.nc -c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240208.nc -c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240208.nc -ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240208.nc -ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240208.nc -ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240208.nc -co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CO_surface_2015-2100_1.9x2.5_c20240208.nc -isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc -isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc -c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240208.nc -nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO_surface_2015-2100_1.9x2.5_c20240208.nc -dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc -so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_surf_2015-2100_c210216.nc -soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240208.nc -bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_surf_2015-2100_c210216.nc -mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_surf_2015-2100_c210216.nc -num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_surf_2015-2100_c210216.nc -mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_surf_2015-2100_c210216.nc -pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc -so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc -so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc -e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +C2H4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240208.nc +C2H6 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240208.nc +C3H8 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240208.nc +CH2O \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240208.nc +CH3CHO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240208.nc +CH3COCH3 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240208.nc +CO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_CO_surface_2015-2100_1.9x2.5_c20240208.nc +ISOP \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +ISOP_VBS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240208.nc +C10H16 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240208.nc +NOX \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_NO_surface_2015-2100_1.9x2.5_c20240208.nc +DMS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so2_surf_2015-2100_c210216.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/emissions-cmip6_ssp370_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240208.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_bc_a4_surf_2015-2100_c210216.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a1_surf_2015-2100_c210216.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a2_surf_2015-2100_c210216.nc +num_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_num_a4_surf_2015-2100_c210216.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_pom_a4_surf_2015-2100_c210216.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a1_surf_2015-2100_c210216.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP370_ne30/cmip6_ssp370_mam4_so4_a2_surf_2015-2100_c210216.nc +E90 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc ``` ## Prescribed oxidant for aerosol chemistry diff --git a/docs/user-guide/ssp585-forcings.md b/docs/user-guide/ssp585-forcings.md index 813f2eae0f5..2c5b6ec2649 100644 --- a/docs/user-guide/ssp585-forcings.md +++ b/docs/user-guide/ssp585-forcings.md @@ -13,43 +13,43 @@ These are the prescribed inputdata specifically for the SSP585 scenario, in plac ## Elevated external forcings ```fortran -no2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240304.nc -so2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_volc_elev_2015-2100_c240331.nc -soag0_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240304.nc -bc_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_elev_2015-2100_c190828.nc -mam7_num_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_elev_2015-2100_c190828.nc -num_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_elev_2015-2100_c190828.nc -mam7_num_a3_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_elev_2015-2100_c190828.nc -pom_a4_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_elev_2015-2100_c190828.nc -so4_a1_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_elev_2015-2100_c190828.nc -so4_a2_ext_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_elev_2015-2100_c190828.nc +NO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO2_aircraft_vertical_2015-2100_1.9x2.5_c20240304.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_volc_elev_2015-2100_c240331.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_elev_2015-2100_1.9x2.5_c20240304.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_elev_2015-2100_c190828.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_elev_2015-2100_c190828.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_elev_2015-2100_c190828.nc +num_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_elev_2015-2100_c190828.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_elev_2015-2100_c190828.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_elev_2015-2100_c190828.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_elev_2015-2100_c190828.nc ``` ## Surface emissions ```fortran -c2h4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240304.nc -c2h6_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240304.nc -c3h8_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240304.nc -ch2o_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240304.nc -ch3cho_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240304.nc -ch3coch3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240304.nc -co_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CO_surface_2015-2100_1.9x2.5_c20240304.nc -isop_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc -isop_vbs_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc -c10h16_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240304.nc -nox_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO_surface_2015-2100_1.9x2.5_c20240304.nc -dms_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc -so2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_surf_2015-2100_c190828.nc -soag0_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240304.nc -bc_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_surf_2015-2100_c190828.nc -mam7_num_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_surf_2015-2100_c190828.nc -num_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_surf_2015-2100_c190828.nc -mam7_num_a3_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_surf_2015-2100_c190828.nc -pom_a4_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_surf_2015-2100_c190828.nc -so4_a1_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_surf_2015-2100_c190828.nc -so4_a2_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_surf_2015-2100_c190828.nc -e90_emis_file \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc +C2H4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H4_surface_2015-2100_1.9x2.5_c20240304.nc +C2H6 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C2H6_surface_2015-2100_1.9x2.5_c20240304.nc +C3H8 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_C3H8_surface_2015-2100_1.9x2.5_c20240304.nc +CH2O \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH2O_surface_2015-2100_1.9x2.5_c20240304.nc +CH3CHO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3CHO_surface_2015-2100_1.9x2.5_c20240304.nc +CH3COCH3 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CH3COCH3_surface_2015-2100_1.9x2.5_c20240304.nc +CO \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_CO_surface_2015-2100_1.9x2.5_c20240304.nc +ISOP \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +ISOP_VBS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_ISOP_surface_2015-2100_1.9x2.5_c20240304.nc +C10H16 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_MTERP_surface_2015-2100_1.9x2.5_c20240304.nc +NOX \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_NO_surface_2015-2100_1.9x2.5_c20240304.nc +DMS \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/DMSflux.1850-2100.1deg_latlon_conserv.POPmonthlyClimFromACES4BGC_c20160727.nc +SO2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so2_surf_2015-2100_c190828.nc +SOAG0 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/emissions-cmip6_ssp585_e3sm_SOAG0_surf_2015-2100_1.9x2.5_c20240304.nc +bc_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_bc_a4_surf_2015-2100_c190828.nc +num_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a1_surf_2015-2100_c190828.nc +num_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a2_surf_2015-2100_c190828.nc +num_a3 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_num_a4_surf_2015-2100_c190828.nc +pom_a4 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_pom_a4_surf_2015-2100_c190828.nc +so4_a1 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a1_surf_2015-2100_c190828.nc +so4_a2 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart_aero/emis/CMIP6_SSP585_ne30/cmip6_ssp585_mam4_so4_a2_surf_2015-2100_c190828.nc +E90 \$DIN_LOC_ROOT/atm/cam/chem/trop_mozart/ub/emissions_E90_surface_1750-2101_1.9x2.5_c20231222.nc ``` ## Prescribed oxidant for aerosol chemistry From 86a901fdcba596fe419bb3d5d6303356b6a8d2f3 Mon Sep 17 00:00:00 2001 From: noel Date: Fri, 3 May 2024 16:59:22 -0700 Subject: [PATCH 293/310] unload matlab --- cime_config/machines/config_machines.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cime_config/machines/config_machines.xml b/cime_config/machines/config_machines.xml index 0688ab75b7d..e219d49b598 100644 --- a/cime_config/machines/config_machines.xml +++ b/cime_config/machines/config_machines.xml @@ -206,6 +206,7 @@ aocc cudatoolkit climate-utils + matlab craype-accel-nvidia80 craype-accel-host perftools-base @@ -368,6 +369,7 @@ aocc cudatoolkit climate-utils + matlab craype-accel-nvidia80 craype-accel-host perftools-base @@ -511,6 +513,7 @@ aocc cudatoolkit climate-utils + matlab craype-accel-nvidia80 craype-accel-host perftools-base @@ -673,6 +676,7 @@ aocc cudatoolkit climate-utils + matlab craype-accel-nvidia80 craype-accel-host perftools-base @@ -824,6 +828,7 @@ aocc cudatoolkit climate-utils + matlab craype-accel-nvidia80 craype-accel-host perftools-base From c70608a4982263fa3f582303d86d9af18d4403dc Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Thu, 4 Apr 2024 05:51:38 -0500 Subject: [PATCH 294/310] Add Paolo DISMF file for oQU240wLI --- components/mpas-ocean/cime_config/buildnml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/mpas-ocean/cime_config/buildnml b/components/mpas-ocean/cime_config/buildnml index e276df0a3f5..47076dee726 100755 --- a/components/mpas-ocean/cime_config/buildnml +++ b/components/mpas-ocean/cime_config/buildnml @@ -134,6 +134,8 @@ def buildnml(case, caseroot, compname): if ocn_ic_mode == 'spunup': logger.warning("WARNING: The specified compset is requesting ocean ICs spunup from a G-case") logger.warning(" But no file available for this grid.") + if ocn_ismf == 'data': + data_ismf_file = 'prescribed_ismf_paolo2023.oQU240wLI.20240404.nc' elif ocn_grid == 'oQU120': decomp_date = '230424' From 962e20b12edd6a903839d98333b0505a82f07178 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Thu, 4 Apr 2024 05:52:15 -0500 Subject: [PATCH 295/310] Add Merino DIB file for oQU240wLI --- components/mpas-seaice/cime_config/buildnml | 1 + 1 file changed, 1 insertion(+) diff --git a/components/mpas-seaice/cime_config/buildnml b/components/mpas-seaice/cime_config/buildnml index feecb0c6987..2e602311033 100755 --- a/components/mpas-seaice/cime_config/buildnml +++ b/components/mpas-seaice/cime_config/buildnml @@ -129,6 +129,7 @@ def buildnml(case, caseroot, compname): decomp_prefix = 'partitions/mpas-seaice.graph.info.' grid_date = '160929' grid_prefix = 'cice.QU240wLI' + data_iceberg_file = 'Iceberg_Climatology_Merino.oQU240wLI.20240404.nc' if ice_ic_mode == 'spunup': logger.warning("WARNING: The specified compset is requesting seaice ICs spunup from a G-case") logger.warning(" But no file available for this grid.") From 08750d072ee14736a8e51f844acc6f6362392691 Mon Sep 17 00:00:00 2001 From: Xylar Asay-Davis Date: Thu, 4 Apr 2024 06:36:49 -0500 Subject: [PATCH 296/310] Add e3sm_cryo_developer test suite --- cime_config/tests.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index 0ead7c13bcb..0b36e7c94d0 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -120,6 +120,18 @@ ) }, + "e3sm_cryo_developer" : { + "tests" : ( + "SMS_D_Ld1.TL319_IcoswISC30E3r5.GMPAS-JRA1p5-DIB-PISMF.mpaso-jra_1958", + "ERS_Ld5.T62_oQU240wLI.GMPAS-DIB-IAF-PISMF", + "PEM_Ln5.T62_oQU240wLI.GMPAS-DIB-IAF-PISMF", + "PET_Ln5.T62_oQU240wLI.GMPAS-DIB-IAF-PISMF", + "ERS_Ld5.T62_oQU240wLI.GMPAS-DIB-IAF-DISMF", + "PEM_Ln5.T62_oQU240wLI.GMPAS-DIB-IAF-DISMF", + "PET_Ln5.T62_oQU240wLI.GMPAS-DIB-IAF-DISMF", + ) + }, + "e3sm_landice_developer" : { "tests" : ( "SMS.ne30pg2_r05_EC30to60E2r2_gis20.IGELM_MLI.elm-gis20kmSMS", @@ -274,7 +286,7 @@ }, "e3sm_developer" : { - "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer"), + "inherit" : ("e3sm_land_developer", "e3sm_atm_developer", "e3sm_ice_developer", "e3sm_cryo_developer"), "time" : "0:45:00", "tests" : ( "ERS.f19_g16_rx1.A", @@ -284,7 +296,6 @@ "NCK.f19_g16_rx1.A", "SMS.ne30_f19_g16_rx1.A", "ERS_Ld5.T62_oQU120.CMPASO-NYF", - "SMS_Ld1.T62_oQU240wLI.GMPAS-IAF-DISMF", "ERS.f09_g16_g.MALISIA", "SMS.T62_oQU120_ais20.MPAS_LISIO_TEST", "SMS_P12x2.ne4pg2_oQU480.WCYCL1850NS.allactive-mach_mods", From a4116893b4c981ebdcd9be7374d1b56c382c532f Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Sat, 4 May 2024 09:35:56 -0700 Subject: [PATCH 297/310] Removes TOC and fixes errors --- components/elm/docs/user-guide/fates.md | 19 ++++++++++++------- components/elm/docs/user-guide/index.md | 17 ++++------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/components/elm/docs/user-guide/fates.md b/components/elm/docs/user-guide/fates.md index 220af361db8..390f714ee0c 100644 --- a/components/elm/docs/user-guide/fates.md +++ b/components/elm/docs/user-guide/fates.md @@ -1,16 +1,21 @@ # FATES -FATES (Functionally Assembled Terrestrial Ecosystem Simulator) is a numerical terrestrial ecosystem model that can be utilized as a component with various host land models such as ELM. It is incorporated as an external module, the development of which is primarily supported by the Department of Energy’s Office of Science, through the [Next Generation Ecosystem Experiment - Tropics (NGEE-T) project](https://ngee-tropics.lbl.gov/). +FATES (Functionally Assembled Terrestrial Ecosystem Simulator) is a numerical terrestrial ecosystem model +hat can be utilized as a component with various host land models such as ELM. It is incorporated as an +external module, the development of which is primarily supported by the Department of Energy’s Office of +Science, through the [Next Generation Ecosystem Experiment - Tropics (NGEE-T) project](https://ngee-tropics.lbl.gov/). -The FATES code is hosted online through a github repository: https://github.com/NGEET/fates +The FATES code is hosted online through a github repository at [https://github.com/NGEET/fates](https://github.com/NGEET/fates). ## Technical Document -The full FATES documentation detailing the scientific underpinnings of the model can be found in the [FATES Technical Document](https://fates-users-guide.readthedocs.io/projects/tech-doc/en/stable/) hosted on ReadTheDocs. +The full FATES documentation detailing the scientific underpinnings of the model can be found in the +[FATES Technical Document](https://fates-users-guide.readthedocs.io/projects/tech-doc/en/stable/) +hosted on ReadTheDocs. ## User's and Developer's Guide -The FATES team also provides a [User's guide](https://fates-users-guide.readthedocs.io/en/latest/user/users-guide.html) and a [Developer's guide](https://fates-users-guide.readthedocs.io/en/latest/developer/developer-guide.html) also hosted on ReadTheDocs. Both guides and the technical documentation can be reached from the top level [User's Guide](https://fates-users-guide.readthedocs.io/en/latest/index.html) - - - +The FATES team also provides a [User's guide](https://fates-users-guide.readthedocs.io/en/latest/user/users-guide.html) +and a [Developer's guide](https://fates-users-guide.readthedocs.io/en/latest/developer/developer-guide.html) +also hosted on ReadTheDocs. Both guides and the technical documentation can be reached from the top level +[User's Guide](https://fates-users-guide.readthedocs.io/en/latest/index.html) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index b7720a6cfb8..3f386420895 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -2,17 +2,6 @@ This User's Guide describes how to set up and run ELM. -## Table of Conents - -1. [Steps to build and run ELM](#steps-to-build-and-run-elm) - 1. [Scientifically supported compsets](#scientifically-supported-compsets) - 2. [Supported grids](#supported-grid) - 3. [Model spin-up for pre-industrial condition](model-spin-up-for-pre-industrial-condition) -2. [Customizing runs](customizing-runs) - 1. [Changing monthly output file](changing-monthly-output-file) - 2. [Saving additional output files](saving-additional-output-files) -3. [Running with FATES (optional)](#running-with-fates) - ## Steps to build and run ELM A step-by-step instruction on how to run fully coupled E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). Here we describe running ELM driven by atmospheric forcings provided via the data atmosphere (DATM) model for configurations that are used in the E3SM water cycle v3 campaign. @@ -83,7 +72,9 @@ Using the above-mentioned settings: - Each `*.elm.h2.*.nc` will include 24 hourly average values of `TV` - Each `*.elm.h3.*.nc` will include 48 values of `TG`, `TV`, and `FSA` at each model time step, which is typically is 30 min. - + ## Running with FATES -[FATES](fates.md) can be run in various modes with ELM through the use of namelist settings. The [FATES User's Guide section on namelist options](https://fates-users-guide.readthedocs.io/en/latest/user/Namelist-Options-and-Run-Time-Modes.html) provides guidance on enabling these different FATES run modes. +[FATES](fates.md) can be run in various modes with ELM through the use of namelist settings. +The [FATES User's Guide section on namelist options](https://fates-users-guide.readthedocs.io/en/latest/user/Namelist-Options-and-Run-Time-Modes.html) +provides guidance on enabling these different FATES run modes. From a77f1ee7630db6a2863fdd47b5c82d7ce5cd99d8 Mon Sep 17 00:00:00 2001 From: hydrotian Date: Mon, 29 Apr 2024 16:47:12 -0700 Subject: [PATCH 298/310] MOSART guide initial draft --- components/mosart/docs/dev-guide/index.md | 6 +- .../mosart/docs/figures/mosart_concept.png | Bin 0 -> 212280 bytes components/mosart/docs/index.md | 2 +- components/mosart/docs/tech-guide/index.md | 48 ++++++- components/mosart/docs/user-guide/index.md | 129 +++++++++++++++++- 5 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 components/mosart/docs/figures/mosart_concept.png diff --git a/components/mosart/docs/dev-guide/index.md b/components/mosart/docs/dev-guide/index.md index 82f7444f45f..5d490290063 100644 --- a/components/mosart/docs/dev-guide/index.md +++ b/components/mosart/docs/dev-guide/index.md @@ -1 +1,5 @@ -Please refer to the [ELM's Developer Guide](../../ELM/dev-guide/index.md) for MOSART development. +# MOSART Developer's Guide + +This guide provides MOSART data structures and how to develop new code for MOSART. + +Coming soon... diff --git a/components/mosart/docs/figures/mosart_concept.png b/components/mosart/docs/figures/mosart_concept.png new file mode 100644 index 0000000000000000000000000000000000000000..beeb742ca4a7a717d6a0583b5b6e65d59fbd2491 GIT binary patch literal 212280 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

;gTV{K|CZX6&W_QeH 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�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%0D1q?r28ZZidBY1dyQ2bP`p6m#ig8v)m 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 LRbZ9UZ$JJIZ)`RL literal 0 HcmV?d00001 diff --git a/components/mosart/docs/index.md b/components/mosart/docs/index.md index c1ac0ac3b47..69ac68fca2e 100644 --- a/components/mosart/docs/index.md +++ b/components/mosart/docs/index.md @@ -1,6 +1,6 @@ #Model for Scale Adaptive River Transport (MOSART) -Some introductory text here +MOSART is the river model of E3SM. It routes the runoff genrated by ELM and provides freshwater input to the ocean model. * The [MOSART User's Guide](user-guide/index.md) explains how to control MOSART when its running within E3SM * The [MOSART Developer's Guide](dev-guide/index.md) explains MOSART data structures and how to develop new code. diff --git a/components/mosart/docs/tech-guide/index.md b/components/mosart/docs/tech-guide/index.md index ff73bc070c0..73903f405de 100644 --- a/components/mosart/docs/tech-guide/index.md +++ b/components/mosart/docs/tech-guide/index.md @@ -1 +1,47 @@ -start of the MOSART Technical Guide +# MOSART Technical Guide + +This guide provides scientific and technical details about MOSART. + +## Physics + +MOSART is a one-dimension river transport model that is designed for river routing at local, regional, and global scales ([Li et al., 2013](https://doi.org/10.1175/JHM-D-12-015.1)). Its primary function is to supply freshwater inputs to ocean models within coupled Earth System Models. + +MOSART divides each spatial unit, such as a latitude/longitude grid or a sub-basin, into three hydrologic categories: hillslopes, tributaries, and a main channel (see figure below). The hillslopes receive runoff and send into tributaries, which then converge into a single main channel. This main channel connects adjacent upstream and downstream units through the river network. MOSART simplifies the multiple tributaries within a spatial unit into a single hypothetical sub-network channel, which has a transport capacity equivalent to all combined tributaries. + +![alt text](../figures/mosart_concept.png) + +- Hillslope Routing: Within each spatial unit, surface runoff is directed as overland flow to the sub-network channel, while subsurface runoff enters the sub-network channel directly. + +- Sub-network Channel Routing: This channel aggregates water from the hillslopes, routes it through the channel system, and discharges it into the main channel. + +- Main Channel Routing: The main channel collects water from the sub-network channel and any inflow from upstream spatial units, eventually discharging the accumulated water downstream to the next spatial unit or directly to the ocean. + +## Parameters + +### Main parameters required in the MOSART parameter file + +| Variable Name | Description [unit] | +|-------------------|--------------------------------------------------------------------------------| +| fdir | Flow direction [unitless] | +| lat | Latitude at cell center [degree] | +| lon | Longitude at cell center [degree] | +| frac | fraction of the unit draining to the outlet [0-1] | +| rslp | main channel slope [unitless] | +| rlen | main channel length [m] | +| tslp | mean tributary channel slope averaged through the unit [unitless] | +| area | local drainage area [m^2] | +| areaTotal | total upstream drainage area, local unit included; multi flow direction [m^2] | +| areaTotal2 | total upstream drainage area, local unit included; single flow direction [m^2] | +| rdep | bankfull depth of main channel [m] | +| rwid | bankfull width of main channel [m] | +| rwid0 | floodplain width linked to main channel [m] | +| gxr | drainage density [m^-1] | +| hslp | topographic slope [unitless] | +| twid | bankfull width of local tributaries [m] | +| nr | Manning''s roughness coefficient for main channel flow [unitless] | +| nt | Manning''s roughness coefficient for tributary channel flow [unitless] | +| nh | Manning''s roughness coefficient for overland flow [unitless] | + +### Parameters required by additional MOSART features + +Coming soon. diff --git a/components/mosart/docs/user-guide/index.md b/components/mosart/docs/user-guide/index.md index 858bd73b9a4..f6098382728 100644 --- a/components/mosart/docs/user-guide/index.md +++ b/components/mosart/docs/user-guide/index.md @@ -1 +1,128 @@ -start of the MOSART User's Guide +# MOSART User's Guide + +This guide describes how to set up and run MOSART. + +## Steps to build and run MOSART + +A step-by-step instruction on how to run fully coupled E3SM can be found [here](https://acme-climate.atlassian.net/wiki/spaces/DOC/pages/2309226536). Here we describe running MOSART driven by runoff forcings provided via the data land mode(DLND). Although the default runoff forcing is predefined by the DLND compsets, the users is able to use other runoff forcing to drive MOSART. + +MOSART in the water cycle campaigns of E3SM v1, v2, and v3 was. + +### Scientifically supported compsets + +The mosart-only compsets are supported for multiple runoff forcing datasets that covers different domains and time periods: + +1. `RMOSQIAN`: A 57-year (1948-2004, no leap year) global Qian runoff forcings. The native resolutions are 192*288 at daily time scale. The path to the stream file is `$input_data_dir/lnd/dlnd7/hcru_hcru/QIAN.daily.1948-2004.nc` +2. `RMOSGPCC`: A one-year (1979) global GPCC runoff forcing. The native resoultions are 192*288 at daily time scale. The path to the stream file is `$input_data_dir/lnd/dlnd7/hcru_hcru/GPCC.daily.nc` +3. `RMOSNLDAS`: A one-year (1975) CLM runoff forcing for [NLDAS](https://ldas.gsfc.nasa.gov/nldas) domain (North America between 25N and 53N) and spatial resolution (1/8th degree). The time scale is 3-hourly. The path to the stream file is `$input_data_dir/lnd/dlnd7/NLDAS/mosart_nldas_hist_1975.clm2.h1.1975-01-01-00000.nc`. + +### Supported grid + +The `r05_r05`, `NLDAS_NLDAS`, and `MOS_USRDAT` are the supported grid resolutions for performing offline MOSART simulations. + +### User-defined runoff forcing + +Once the case is created based on the above compsets. The users can create a `user_dlnd.streams.txt` file in the `case_scripts` directory following the format below: + +```xml + + + + GENERIC + + + + time time + lon lon + lat lat + + + /path/to/forcing/file + + + Runoff_forcing.nc + + + + + QDRAI rofsub + QOVER rofsur + + + /path/to/forcing/file + + + Runoff_forcing.nc + + + 0 + + + +``` + +## Customizing runs + +For default river routing simulation in MOSART (i.e. natural flow routing), one [parameter file](../tech-guide/index.md#parameters) defined by `frivinp_rtm` is required. The geographic domain and spatial resolution must match the domain defined in the simulation case. Additional parameter/input files will be needed for some extra features. + +### Output variables and frequency + +MOSART by default outputs monthly history file in `*mosart.h0.**.nc` files that include all key variables. User could choose to output additional history files (such as `*mosart.h1.*.nc`, `*mosart.h2.*.nc`) that have different temporal averaging (e.g. daily, hourly, every model timestep) via `rtmhist_nhtfrq` where + +- `-24` corresponds to daily average +- `-1` corresponds to hourly average +- `0` corresponds to monthly average +- `1` corresponds to each model time step + +The number of time slices in these additional files can be controlled +vai `rtmhist_mfilt`. + +```fortran + &mosart_inparm + rtmhist_fincl2 = 'FLOODPLAIN_FRACTION' + rtmhist_fincl3 = 'RIVER_DISCHARGE_OVER_LAND_LIQ' + rtmhist_nhtfrq = 0, -24, -1 + rtmhist_mfilt = 12, 30, 24 + / +``` + +Using the above-mentioned settings: + +- Each `*.mosart.h1.*.nc` will include 30 daily average values of `FLOODPLAIN_FRACTION` +- Each `*.mosart.h2.*.nc` will include 24 hourly average values of `RIVER_DISCHARGE_OVER_LAND_LIQ` + +### Additional options + +The table below lists avaiable options defined by users through `user_nl_mosart`. + +| Flag Name | Description | +|-------------------|---------------------------------------------------------------------------------------| +| `routingmethod` | `1` for kenematic wave routing (default); `2` for diffusion wave routing | +| `wrmflag` | `.true.` for active water management; `.false.` for no water management (default) | +| `inundflag` | `.true.` for active flood inundation; `.false.` for no flood inundation (default) | +| `sediflag` | `.true.` for active sediment transport; `.false.` for no sediment transport (default) | +| `heatflag` | `.true.` for active heat transport; `.false.` for no heat transport (default) | + +## Additional MOSART features + +There are some options only made available for specific features. They can be defined through `user_nl_mosart`. + +### Water management + +- Parameter file: when water management is active, one additional parameter file `parafile` is required. This file defines the location and specifics for the dams/reservoirs simulated in this scheme. + +- `damconstructionflag`: `0` - dam always exist; `1` - dam construction year is considered. + +- `externaldemandflag`: `0` - no external water demand for the WM scheme; `1` - external water demand files are required. + + - Note if `externaldemandflag` is set to `1`, paths to monthly water demand files are requried in the `usr_nl_mosart` file through `demandpath = '/path/to/demand/files/`. + +### Flood inundation + +- `opt_eleprof`: `1` - use actural elevation profiles derived from DEM; `2` - use hypothetical elevation profile. + + - Note if `opt_eleprof` is set to `1`, the elevation profile data must be included in the MOSART parameter file. + +### Sediment transport + +- If sediment feature is activated, D50 data must be included in the MOSART parameter file. In addition, `rof_sed = .true.` has to be defined in `./user_nl_cpl` to allow sediment flux passing into the river model through the coupler. From d2e52eae91e2105b85d373bbf2bce62bce7d5836 Mon Sep 17 00:00:00 2001 From: Peter Thornton Date: Sun, 5 May 2024 14:47:17 -0400 Subject: [PATCH 299/310] Add reference to offline compset using cpl output --- components/elm/docs/user-guide/index.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index 3f386420895..4c33807f793 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -12,8 +12,11 @@ The water cycle campaigns of E3SM v1 and v2 used ELM's satellite phenology mode The land-only compsets are referred to as "I"-compset and are supported for the following time periods: pre-industrial (1850) and historical transient (20TR). Additionally, multiple atmospheric forcing datasets can be used to drive the ELM simulations. The supported compsets are: -1. `I1850GSWCNPRDCTCBCTOP`: Climatological pre-industrial using GSWP atmospheric forcings +1. `I1850GSWCNPRDCTCBCTOP`: Pre-industrial ELM simulation using atmospheric forcings from GSWP3 reanalysis dataset 2. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). +3. `I1850E3SMCNP`: Pre-industrial ELM simulation using atmospheric forcings from E3SM coupler output + +The E3SM coupler output forcings are most commonly used as an offline land model spinup step, in preparation for a fully-coupled E3SM experiment. ### Supported grid From 250a7294f86ecf61144dc7b5c3fe9e35fe72c44e Mon Sep 17 00:00:00 2001 From: Peter Thornton Date: Sun, 5 May 2024 15:07:11 -0400 Subject: [PATCH 300/310] Fixed a md whitespace error --- components/elm/docs/user-guide/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index 4c33807f793..bdb48ac73f0 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -16,7 +16,7 @@ The land-only compsets are referred to as "I"-compset and are supported for the 2. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). 3. `I1850E3SMCNP`: Pre-industrial ELM simulation using atmospheric forcings from E3SM coupler output -The E3SM coupler output forcings are most commonly used as an offline land model spinup step, in preparation for a fully-coupled E3SM experiment. +The E3SM coupler output forcings are most commonly used as an offline land model spinup step, in preparation for a fully-coupled E3SM experiment. ### Supported grid From 0a020e622a0e61ee3da7fb86a00e8e6d038fc2b2 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 7 May 2024 06:12:47 -0700 Subject: [PATCH 301/310] Removes a compset definition --- components/elm/docs/user-guide/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index bdb48ac73f0..d2b8c7c7ad2 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -14,7 +14,6 @@ The land-only compsets are referred to as "I"-compset and are supported for the 1. `I1850GSWCNPRDCTCBCTOP`: Pre-industrial ELM simulation using atmospheric forcings from GSWP3 reanalysis dataset 2. `I20TRGSWCNPRDCTCBCTOP`: Historical ELM simulation using GSWP atmospheric forcings with time varying greenhouse gas forcing and land use, land cover dataset (year 1850-2014). -3. `I1850E3SMCNP`: Pre-industrial ELM simulation using atmospheric forcings from E3SM coupler output The E3SM coupler output forcings are most commonly used as an offline land model spinup step, in preparation for a fully-coupled E3SM experiment. From 36957445e7965776b83e601a5d3d4a9dee9e68dc Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 7 May 2024 06:15:56 -0700 Subject: [PATCH 302/310] Removes an incomplete section --- components/elm/docs/user-guide/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/components/elm/docs/user-guide/index.md b/components/elm/docs/user-guide/index.md index d2b8c7c7ad2..7995e54acb3 100644 --- a/components/elm/docs/user-guide/index.md +++ b/components/elm/docs/user-guide/index.md @@ -21,10 +21,6 @@ The E3SM coupler output forcings are most commonly used as an offline land model The `r05_r05` is the supported grid resolution for performing offline ELM simulation. -### Model spin-up for pre-industrial condition - -***Add notes on how to spin-up the model.*** - ## Customizing runs Few useful changes to `user_nl_elm` From 24b1d23fd9f83e8f4d5074e02d316a228bc66521 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Tue, 7 May 2024 14:00:11 -0700 Subject: [PATCH 303/310] Sets path to inputdata via shell_commands --- .../testdefs/testmods_dirs/elm/era5/shell_commands | 3 +++ .../testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m | 4 ++-- .../testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr | 4 ++-- .../elm/era5/user_datm.streams.txt.ELMERA5.mlspr | 4 ++-- .../elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf | 4 ++-- .../elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf | 4 ++-- .../elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf | 4 ++-- .../testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp | 4 ++-- .../testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m | 4 ++-- .../testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 | 4 ++-- .../testdefs/testmods_dirs/elm/era56hr/shell_commands | 3 ++- .../elm/era56hr/user_datm.streams.txt.ERA56HR.d2m | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.sp | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.t2m | 4 ++-- .../elm/era56hr/user_datm.streams.txt.ERA56HR.w10 | 4 ++-- 20 files changed, 41 insertions(+), 37 deletions(-) diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands index b69b9cd6ee9..53c5c100b14 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands @@ -1,3 +1,6 @@ CASEDIR=`./xmlquery CASEROOT --value` SRCROOT=`./xmlquery SRCROOT --value` +DIN_LOC_ROOT=`./xmlquery DIN_LOC_ROOT --value` cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.* $CASEDIR +sed 's@DIN_LOC_ROOT@'"$DIN_LOC_ROOT"'@' -i $CASEDIR/user_datm.* + diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m index bae3cf6a147..3f331cf216d 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ d2m tdew - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr index 5413ff5ccbd..3028cb27112 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ mcpr precc - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr index 9696d75511e..a9a4f014844 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ mlspr precl - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf index 8229e921e0c..cbedbd08f6e 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdfswrf swdndf - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf index 42ec79040ca..f90c2c6fc11 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdrswrf swdndr - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf index e4aa32907a0..cb5992f8169 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdwlwrf lwdn - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp index dec0ed40e09..b602e1e9655 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ sp pbot - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot elmforc.ERA5.c2018.0.25d.sp.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m index c65b62c9399..bfc76ea762f 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ t2m tbot - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 index e66da30e438..d092de0d3fc 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ w10 wind - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind elmforc.ERA5.c2018.0.25d.w10.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands index 13c1a77803f..22b319b7d41 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands @@ -1,4 +1,5 @@ CASEDIR=`./xmlquery CASEROOT --value` SRCROOT=`./xmlquery SRCROOT --value` +DIN_LOC_ROOT=`./xmlquery DIN_LOC_ROOT --value` cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.* $CASEDIR - +sed 's@DIN_LOC_ROOT@'"$DIN_LOC_ROOT"'@' -i $CASEDIR/user_datm.* diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m index b40af4edcd5..4d14c34beaa 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ d2m tdew - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr index 697ac03f515..dada0aef8f0 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ mcpr precc - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr index f0f622cb54b..e420db6cec0 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ mlspr precl - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf index 78391fe9729..a47e9c05de5 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdfswrf swdndf - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf index e49c036d486..f1c068c0d32 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdrswrf swdndr - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf index cfff16d580d..e9ec034d30c 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ msdwlwrf lwdn - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp index 692b57e1b02..6d5052e9e57 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ sp pbot - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot elmforc.ERA5.c2018.0.25d.sp.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m index f214f84e2a5..3478f76bae1 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ t2m tbot - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 index 42cbd413863..7410a658e39 100644 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 +++ b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 @@ -12,7 +12,7 @@ mask mask - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc @@ -23,7 +23,7 @@ w10 wind - /lcrc/group/e3sm/data/inputdata/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind + DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind elmforc.ERA5.c2018.0.25d.w10.1979-01.nc From 046d478d7877b9c689ba44e68a1e8cf389b295ec Mon Sep 17 00:00:00 2001 From: noel Date: Tue, 7 May 2024 16:29:17 -0700 Subject: [PATCH 304/310] for all machines using nersc_slurm settings, remove `exclusive` batch directive. ie, pm-cpu, pm-gpu, etc --- cime_config/machines/config_batch.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/cime_config/machines/config_batch.xml b/cime_config/machines/config_batch.xml index 33bd48494a4..5ba8e38f2e7 100644 --- a/cime_config/machines/config_batch.xml +++ b/cime_config/machines/config_batch.xml @@ -291,7 +291,6 @@ --job-name={{ job_id }} --nodes={{ num_nodes }} --output={{ job_id }}.%j - --exclusive From 382c586c7a67b2db8f3b25e64ebaf2a5dea80327 Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Wed, 8 May 2024 08:56:55 -0700 Subject: [PATCH 305/310] Fixes the testmod name --- cime_config/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index e8baefad2eb..c132a165dac 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -49,7 +49,7 @@ "ERS.f19_g16.I20TRGSWCNPECACNTBC.elm-eca_f19_g16_I20TRGSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPRDCTCBC.elm-ctc_f19_g16_I20TRGSWCNPRDCTCBC", "ERS.f19_g16.IERA5ELM.elm-era5", - "ERS.f19_g16.IERA56HRELM.elm-er56hr", + "ERS.f19_g16.IERA56HRELM.elm-era56hr", ) }, From 5c6fdd5928874825ea15f870314fb1a77e58decf Mon Sep 17 00:00:00 2001 From: Mathew Maltrud Date: Wed, 8 May 2024 12:01:12 -0500 Subject: [PATCH 306/310] added explicit k-loop for calculating vertDiffPassive --- .../mpas-ocean/src/shared/mpas_ocn_vmix.F | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/components/mpas-ocean/src/shared/mpas_ocn_vmix.F b/components/mpas-ocean/src/shared/mpas_ocn_vmix.F index 4c96c6e952d..5eefa945a68 100644 --- a/components/mpas-ocean/src/shared/mpas_ocn_vmix.F +++ b/components/mpas-ocean/src/shared/mpas_ocn_vmix.F @@ -1585,15 +1585,33 @@ subroutine ocn_vmix_implicit(dt, meshPool, statePool, forcingPool, scratchPool, if (trim(groupItr % memberName) /= 'activeTracers' .and. & config_cvmix_background_diffusion_passive_enable) then - vertDiffPassiveTopOfCell = vertDiffTopOfCell - & + + +#ifdef MPAS_OPENACC + !$acc parallel loop gang vector collapse(3) present(vertDiffPassiveTopOfCell, vertDiffTopOfCell) +#else + !$omp parallel + !$omp do schedule(runtime) private(k, iTracer) +#endif + do iCell = 1, nCellsOwned + do k = 2, maxLevelCell(iCell) + vertDiffPassiveTopOfCell(k,iCell) = vertDiffTopOfCell(k,iCell) - & config_cvmix_background_diffusion + config_cvmix_background_diffusion_passive + end do + end do +#ifndef MPAS_OPENACC + !$omp end do + !$omp end parallel +#endif + + + + + + #ifdef MPAS_OPENACC !$acc update host (vertDiffPassiveTopOfCell) #endif -!maltrud debug - do k = 1, maxLevelCell(1) - write(*,*)' DEBUG01: ',k,vertDiffPassiveTopOfCell(k,1) - enddo call ocn_tracer_vmix_tend_implicit(dt, vertDiffPassiveTopOfCell, layerThickness, tracersGroup, & vertNonLocalFlux, tracerGroupSurfaceFlux, & From cfa3463c99b7a0c40631e62a1697a7bb94d92bdf Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Thu, 9 May 2024 12:12:33 -0700 Subject: [PATCH 307/310] Moves the new tests to a different testsuite --- cime_config/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cime_config/tests.py b/cime_config/tests.py index c132a165dac..cbc76c5d055 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -48,14 +48,14 @@ "ERS.f19_g16.I1850GSWCNPECACNTBC.elm-eca_f19_g16_I1850GSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPECACNTBC.elm-eca_f19_g16_I20TRGSWCNPECACNTBC", "ERS.f19_g16.I20TRGSWCNPRDCTCBC.elm-ctc_f19_g16_I20TRGSWCNPRDCTCBC", - "ERS.f19_g16.IERA5ELM.elm-era5", - "ERS.f19_g16.IERA56HRELM.elm-era56hr", ) }, "e3sm_land_exenoshare" : { "time" : "0:45:00", "tests" : ( + "ERS.f19_g16.IERA5ELM.elm-era5", + "ERS.f19_g16.IERA56HRELM.elm-era56hr", "ERS_Ld20.f45_f45.IELMFATES.elm-fates", "ERS.hcru_hcru.I20TRGSWCNPRDCTCBC.elm-erosion", "ERS.f09_g16.IELMBC.elm-simple_decomp", From b25883b1fec41c95bc5bd095afd3b023d89a108c Mon Sep 17 00:00:00 2001 From: Jon Wolfe Date: Thu, 9 May 2024 15:21:41 -0500 Subject: [PATCH 308/310] Make bld files consistent with mpaso Registry using automated scripts --- components/mpas-ocean/bld/build-namelist | 4 ++-- components/mpas-ocean/bld/build-namelist-section | 4 +++- .../bld/namelist_files/namelist_defaults_mpaso.xml | 8 ++------ .../namelist_files/namelist_definition_mpaso.xml | 14 +++++++------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/components/mpas-ocean/bld/build-namelist b/components/mpas-ocean/bld/build-namelist index 238af2be2ab..99bbb8c68ed 100755 --- a/components/mpas-ocean/bld/build-namelist +++ b/components/mpas-ocean/bld/build-namelist @@ -557,9 +557,9 @@ add_default($nl, 'config_Redi_constant_kappa'); add_default($nl, 'config_Redi_maximum_slope'); add_default($nl, 'config_Redi_use_slope_taper'); add_default($nl, 'config_Redi_use_surface_taper'); +add_default($nl, 'config_Redi_limit_term1'); add_default($nl, 'config_Redi_use_quasi_monotone_limiter'); add_default($nl, 'config_Redi_quasi_monotone_safety_factor'); -add_default($nl, 'config_Redi_limit_term1'); add_default($nl, 'config_Redi_min_layers_diag_terms'); add_default($nl, 'config_Redi_horizontal_taper'); add_default($nl, 'config_Redi_horizontal_ramp_min'); @@ -616,8 +616,8 @@ add_default($nl, 'config_use_cvmix'); add_default($nl, 'config_cvmix_prandtl_number'); add_default($nl, 'config_cvmix_background_scheme'); add_default($nl, 'config_cvmix_background_diffusion'); -add_default($nl, 'config_cvmix_background_diffusion_passive_enable'); add_default($nl, 'config_cvmix_background_diffusion_passive'); +add_default($nl, 'config_cvmix_background_diffusion_passive_enable'); add_default($nl, 'config_cvmix_background_viscosity'); add_default($nl, 'config_cvmix_BryanLewis_bl1'); add_default($nl, 'config_cvmix_BryanLewis_bl2'); diff --git a/components/mpas-ocean/bld/build-namelist-section b/components/mpas-ocean/bld/build-namelist-section index 28030392442..bebd11c72b3 100644 --- a/components/mpas-ocean/bld/build-namelist-section +++ b/components/mpas-ocean/bld/build-namelist-section @@ -96,9 +96,9 @@ add_default($nl, 'config_Redi_constant_kappa'); add_default($nl, 'config_Redi_maximum_slope'); add_default($nl, 'config_Redi_use_slope_taper'); add_default($nl, 'config_Redi_use_surface_taper'); +add_default($nl, 'config_Redi_limit_term1'); add_default($nl, 'config_Redi_use_quasi_monotone_limiter'); add_default($nl, 'config_Redi_quasi_monotone_safety_factor'); -add_default($nl, 'config_Redi_limit_term1'); add_default($nl, 'config_Redi_min_layers_diag_terms'); add_default($nl, 'config_Redi_horizontal_taper'); add_default($nl, 'config_Redi_horizontal_ramp_min'); @@ -155,6 +155,8 @@ add_default($nl, 'config_use_cvmix'); add_default($nl, 'config_cvmix_prandtl_number'); add_default($nl, 'config_cvmix_background_scheme'); add_default($nl, 'config_cvmix_background_diffusion'); +add_default($nl, 'config_cvmix_background_diffusion_passive'); +add_default($nl, 'config_cvmix_background_diffusion_passive_enable'); add_default($nl, 'config_cvmix_background_viscosity'); add_default($nl, 'config_cvmix_BryanLewis_bl1'); add_default($nl, 'config_cvmix_BryanLewis_bl2'); diff --git a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml index d7e0485168c..8d7c8cdce7a 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_defaults_mpaso.xml @@ -146,15 +146,14 @@ 0.01 .true. .true. +.true. .true. 0.9 -.true. 0 15 'ramp' 'RossbyRadius' 'RossbyRadius' - 'ramp' 20e3 30e3 @@ -180,7 +179,6 @@ 'constant' 'N2_dependent' 'N2_dependent' - 'constant' 900.0 600.0 @@ -198,7 +196,6 @@ 3.0 1.0 1.0 - 3.0 0.13 1000.0 @@ -209,7 +206,6 @@ 'ramp' 'RossbyRadius' 'RossbyRadius' - 'ramp' 20e3 30e3 @@ -229,8 +225,8 @@ 1.0 'constant' 0.0 -.false. 0.0 +.false. 1.0e-4 8.0e-5 1.05E-4 diff --git a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml index 6b1026ea4d1..c2fac6fc35c 100644 --- a/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml +++ b/components/mpas-ocean/bld/namelist_files/namelist_definition_mpaso.xml @@ -747,19 +747,19 @@ Valid values: Any positive real value. Default: Defined in namelist_defaults.xml - -Enable different background vertical diffusion value for passive tracer quantities +Background vertical diffusion applied to passive tracer quantities -Valid values: .true. or .false. +Valid values: Any positive real value. Default: Defined in namelist_defaults.xml - -Background vertical diffusion applied to passive tracer quantities if enabled +flag to enable using a different background vertical diffusion for passive tracers -Valid values: Any positive real value. +Valid values: .true. or .false. Default: Defined in namelist_defaults.xml @@ -2054,7 +2054,7 @@ Default: Defined in namelist_defaults.xml -number of large iterations over stages 1-3 +number of large iterations over stages 1-3; For the split_explicit_ab2 time integrator, this value only affects the first time step when it is not a restart run. For restart runs, this value has no effect on the split_explicit_ab2 time integrator. Valid values: any positive integer, but typically 1, 2, or 3 Default: Defined in namelist_defaults.xml From 52643ff7f473a4c069d4b2ae1dc4697b1d50601d Mon Sep 17 00:00:00 2001 From: Gautam Bisht Date: Sat, 11 May 2024 12:57:37 -0700 Subject: [PATCH 309/310] Updates the tests to not use use testmods --- cime_config/tests.py | 4 +-- .../testmods_dirs/elm/era5/shell_commands | 6 ---- .../era5/user_datm.streams.txt.ELMERA5.d2m | 35 ------------------- .../era5/user_datm.streams.txt.ELMERA5.mcpr | 35 ------------------- .../era5/user_datm.streams.txt.ELMERA5.mlspr | 35 ------------------- .../user_datm.streams.txt.ELMERA5.msdfswrf | 35 ------------------- .../user_datm.streams.txt.ELMERA5.msdrswrf | 35 ------------------- .../user_datm.streams.txt.ELMERA5.msdwlwrf | 35 ------------------- .../elm/era5/user_datm.streams.txt.ELMERA5.sp | 35 ------------------- .../era5/user_datm.streams.txt.ELMERA5.t2m | 35 ------------------- .../era5/user_datm.streams.txt.ELMERA5.w10 | 35 ------------------- .../testmods_dirs/elm/era56hr/shell_commands | 5 --- .../era56hr/user_datm.streams.txt.ERA56HR.d2m | 35 ------------------- .../user_datm.streams.txt.ERA56HR.mcpr | 35 ------------------- .../user_datm.streams.txt.ERA56HR.mlspr | 35 ------------------- .../user_datm.streams.txt.ERA56HR.msdfswrf | 35 ------------------- .../user_datm.streams.txt.ERA56HR.msdrswrf | 35 ------------------- .../user_datm.streams.txt.ERA56HR.msdwlwrf | 35 ------------------- .../era56hr/user_datm.streams.txt.ERA56HR.sp | 35 ------------------- .../era56hr/user_datm.streams.txt.ERA56HR.t2m | 35 ------------------- .../era56hr/user_datm.streams.txt.ERA56HR.w10 | 35 ------------------- 21 files changed, 2 insertions(+), 643 deletions(-) delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m delete mode 100644 components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 diff --git a/cime_config/tests.py b/cime_config/tests.py index cbc76c5d055..8a4d5e6568a 100644 --- a/cime_config/tests.py +++ b/cime_config/tests.py @@ -54,8 +54,8 @@ "e3sm_land_exenoshare" : { "time" : "0:45:00", "tests" : ( - "ERS.f19_g16.IERA5ELM.elm-era5", - "ERS.f19_g16.IERA56HRELM.elm-era56hr", + "ERS.f19_g16.IERA5ELM", + "ERS.f19_g16.IERA56HRELM", "ERS_Ld20.f45_f45.IELMFATES.elm-fates", "ERS.hcru_hcru.I20TRGSWCNPRDCTCBC.elm-erosion", "ERS.f09_g16.IELMBC.elm-simple_decomp", diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands deleted file mode 100644 index 53c5c100b14..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/shell_commands +++ /dev/null @@ -1,6 +0,0 @@ -CASEDIR=`./xmlquery CASEROOT --value` -SRCROOT=`./xmlquery SRCROOT --value` -DIN_LOC_ROOT=`./xmlquery DIN_LOC_ROOT --value` -cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.* $CASEDIR -sed 's@DIN_LOC_ROOT@'"$DIN_LOC_ROOT"'@' -i $CASEDIR/user_datm.* - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m deleted file mode 100644 index 3f331cf216d..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.d2m +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - d2m tdew - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tdew - - - elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr deleted file mode 100644 index 3028cb27112..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mcpr +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - mcpr precc - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec - - - elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr deleted file mode 100644 index a9a4f014844..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.mlspr +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - mlspr precl - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/prec - - - elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf deleted file mode 100644 index cbedbd08f6e..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdfswrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdfswrf swdndf - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn - - - elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc - - - -3600 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf deleted file mode 100644 index f90c2c6fc11..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdrswrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdrswrf swdndr - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/swdn - - - elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc - - - -3600 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf deleted file mode 100644 index cb5992f8169..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.msdwlwrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdwlwrf lwdn - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/lwdn - - - elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp deleted file mode 100644 index b602e1e9655..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.sp +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - sp pbot - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/pbot - - - elmforc.ERA5.c2018.0.25d.sp.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m deleted file mode 100644 index bfc76ea762f..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.t2m +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - t2m tbot - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/tbot - - - elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 deleted file mode 100644 index d092de0d3fc..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era5/user_datm.streams.txt.ELMERA5.w10 +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - w10 wind - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.0.25d.v5.c180614/wind - - - elmforc.ERA5.c2018.0.25d.w10.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands deleted file mode 100644 index 22b319b7d41..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/shell_commands +++ /dev/null @@ -1,5 +0,0 @@ -CASEDIR=`./xmlquery CASEROOT --value` -SRCROOT=`./xmlquery SRCROOT --value` -DIN_LOC_ROOT=`./xmlquery DIN_LOC_ROOT --value` -cp $SRCROOT/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.* $CASEDIR -sed 's@DIN_LOC_ROOT@'"$DIN_LOC_ROOT"'@' -i $CASEDIR/user_datm.* diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m deleted file mode 100644 index 4d14c34beaa..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.d2m +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - d2m tdew - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tdew - - - elmforc.ERA5.c2018.0.25d.d2m.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr deleted file mode 100644 index dada0aef8f0..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mcpr +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - mcpr precc - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec - - - elmforc.ERA5.c2018.0.25d.mcpr.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr deleted file mode 100644 index e420db6cec0..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.mlspr +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - mlspr precl - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/prec - - - elmforc.ERA5.c2018.0.25d.mlspr.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf deleted file mode 100644 index a47e9c05de5..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdfswrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdfswrf swdndf - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn - - - elmforc.ERA5.c2018.0.25d.msdfswrf.1979-01.nc - - - -21600 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf deleted file mode 100644 index f1c068c0d32..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdrswrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdrswrf swdndr - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/swdn - - - elmforc.ERA5.c2018.0.25d.msdrswrf.1979-01.nc - - - -21600 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf deleted file mode 100644 index e9ec034d30c..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.msdwlwrf +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - msdwlwrf lwdn - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/lwdn - - - elmforc.ERA5.c2018.0.25d.msdwlwrf.1979-01.nc - - - -60 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp deleted file mode 100644 index 6d5052e9e57..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.sp +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - sp pbot - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/pbot - - - elmforc.ERA5.c2018.0.25d.sp.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m deleted file mode 100644 index 3478f76bae1..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.t2m +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - t2m tbot - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/tbot - - - elmforc.ERA5.c2018.0.25d.t2m.1979-01.nc - - - 0 - - - diff --git a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 b/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 deleted file mode 100644 index 7410a658e39..00000000000 --- a/components/elm/cime_config/testdefs/testmods_dirs/elm/era56hr/user_datm.streams.txt.ERA56HR.w10 +++ /dev/null @@ -1,35 +0,0 @@ - - - - GENERIC - - - - time time - xc lon - yc lat - area area - mask mask - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614 - - - domain.lnd.era5_721x1440_rdrlat_EC30to60E2r2.221115.nc - - - - - w10 wind - - - DIN_LOC_ROOT/atm/datm7/atm_forcing.datm7.ERA.6HRLY.0.25d.v5.c180614/wind - - - elmforc.ERA5.c2018.0.25d.w10.1979-01.nc - - - 0 - - - From 7387fe260400e005ff2b997db37632b6b89b719a Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 15 May 2024 17:50:59 -0600 Subject: [PATCH 310/310] EAMxx: fix usage of ekat's Units --- .../eamxx/src/share/atm_process/atmosphere_process_dag.cpp | 2 +- components/eamxx/src/share/field/field_identifier.cpp | 2 +- components/eamxx/src/share/io/scorpio_output.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/eamxx/src/share/atm_process/atmosphere_process_dag.cpp b/components/eamxx/src/share/atm_process/atmosphere_process_dag.cpp index a77dd6e4c56..7b6fc218a0b 100644 --- a/components/eamxx/src/share/atm_process/atmosphere_process_dag.cpp +++ b/components/eamxx/src/share/atm_process/atmosphere_process_dag.cpp @@ -146,7 +146,7 @@ void AtmProcDAG::write_dag (const std::string& fname, const int verbosity) const s.back() = ')'; if (verbosity>2) { - s += " [" + fid.get_units().get_string() + "]"; + s += " [" + fid.get_units().to_string() + "]"; } } return s; diff --git a/components/eamxx/src/share/field/field_identifier.cpp b/components/eamxx/src/share/field/field_identifier.cpp index 56974aa0696..7430ffa892e 100644 --- a/components/eamxx/src/share/field/field_identifier.cpp +++ b/components/eamxx/src/share/field/field_identifier.cpp @@ -48,7 +48,7 @@ void FieldIdentifier::update_identifier () { m_identifier += ">"; m_identifier += "(" + ekat::join(m_layout.dims(),",") + ")"; - m_identifier += " [" + m_units.get_string() + "]"; + m_identifier += " [" + m_units.to_string() + "]"; } // Free functions for identifiers comparison diff --git a/components/eamxx/src/share/io/scorpio_output.cpp b/components/eamxx/src/share/io/scorpio_output.cpp index 3db201f424b..1852785eeac 100644 --- a/components/eamxx/src/share/io/scorpio_output.cpp +++ b/components/eamxx/src/share/io/scorpio_output.cpp @@ -953,7 +953,7 @@ register_variables(const std::string& filename, // in the simulation and not the one used in the output file. const auto& layout = fid.get_layout(); auto vec_of_dims = set_vec_of_dims(layout); - std::string units = fid.get_units().get_string(); + std::string units = fid.get_units().to_string(); // Gather longname auto longname = m_longnames.get_longname(name);