From 661d40573823b3fbaa5b6e02f914a017aede6bd0 Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Mon, 14 Sep 2026 15:40:30 -0700 Subject: [PATCH 1/7] ismip7_run: consume fracture shelf-collapse calvingMask (Path C) - Fix ismip7_forcing fracture output paths (excess_melt, lake_properties, shelf_collapse) to use {model}_{scenario}/{category}/ layout, matching atmosphere and ocean_thermal_forcing outputs. - ismip7_ais: optionally apply the Path C calvingMask via a new fracture_basepath cfg option, enabling mask calving and the hydrofracture vulnerability gating added in MALI PR #187 (config_require_extensional_stresses_for_mask_calving, config_calving_fracture_toughness). Disabled by default and per experiment when no mask file is found (e.g. ctrl, ocx). --- .../fracture/process_excess_melt.py | 4 +- .../fracture/process_lake_properties.py | 4 +- .../fracture/process_shelf_collapse.py | 4 +- .../ismip7_run/ismip7_ais/ismip7_ais.cfg | 10 +++++ .../ismip7_ais/set_up_experiment.py | 45 +++++++++++++++++++ .../ismip7_ais/streams.landice.template | 2 + .../ismip7_ais/streams.mask_calving | 13 ++++++ 7 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving diff --git a/compass/landice/tests/ismip7_forcing/fracture/process_excess_melt.py b/compass/landice/tests/ismip7_forcing/fracture/process_excess_melt.py index 8a9275c962..8d6d5ed452 100644 --- a/compass/landice/tests/ismip7_forcing/fracture/process_excess_melt.py +++ b/compass/landice/tests/ismip7_forcing/fracture/process_excess_melt.py @@ -146,8 +146,8 @@ def run(self): os.remove(f) # Place output in the appropriate directory - output_path = os.path.join(output_base_path, "excess_melt", - f"{model}_{scenario}") + output_path = os.path.join(output_base_path, f"{model}_{scenario}", + "excess_melt") if not os.path.exists(output_path): os.makedirs(output_path) diff --git a/compass/landice/tests/ismip7_forcing/fracture/process_lake_properties.py b/compass/landice/tests/ismip7_forcing/fracture/process_lake_properties.py index 6867f20735..59c7718808 100644 --- a/compass/landice/tests/ismip7_forcing/fracture/process_lake_properties.py +++ b/compass/landice/tests/ismip7_forcing/fracture/process_lake_properties.py @@ -148,8 +148,8 @@ def run(self): os.remove(f) # Place output in the appropriate directory - output_path = os.path.join(output_base_path, "lake_properties", - f"{model}_{scenario}") + output_path = os.path.join(output_base_path, f"{model}_{scenario}", + "lake_properties") if not os.path.exists(output_path): os.makedirs(output_path) diff --git a/compass/landice/tests/ismip7_forcing/fracture/process_shelf_collapse.py b/compass/landice/tests/ismip7_forcing/fracture/process_shelf_collapse.py index e9a8e1cfb5..effb6ea5a3 100644 --- a/compass/landice/tests/ismip7_forcing/fracture/process_shelf_collapse.py +++ b/compass/landice/tests/ismip7_forcing/fracture/process_shelf_collapse.py @@ -127,8 +127,8 @@ def run(self): os.remove(remapped_file) # Place output in the appropriate directory - output_path = os.path.join(output_base_path, "shelf_collapse", - f"{model}_{scenario}") + output_path = os.path.join(output_base_path, f"{model}_{scenario}", + "shelf_collapse") if not os.path.exists(output_path): os.makedirs(output_path) diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg b/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg index 745e4c89f7..3270e165d9 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg +++ b/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg @@ -59,6 +59,16 @@ calving_method = restore # Only required if calving_method is set to 'von_mises'. von_mises_parameter_path = NotAvailable +# Base path to ismip7_forcing fracture (Path C) output, with layout +# {fracture_basepath}/{model}_{scenario}/shelf_collapse/*.nc +# Set to NotAvailable to disable mask calving / hydrofracture gating. +fracture_basepath = NotAvailable + +# Ice fracture toughness (K_IC, Pa m^0.5) used in the hydrofracture +# vulnerability criterion gating mask calving. Only used if a shelf +# collapse mask file is found via fracture_basepath. +calving_fracture_toughness = 2.0e5 + # True if running coupled MALI-sea level model simulation sea_level_model = false diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py index 98d59d4c40..e8f566a1aa 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py +++ b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py @@ -63,6 +63,9 @@ def setup(self): # noqa: C901 reference_surface_path = section.get('reference_surface_path') reference_surface_fname = os.path.split(reference_surface_path)[-1] calving_method = section.get('calving_method') + fracture_basepath = section.get('fracture_basepath') + calving_fracture_toughness = section.get( + 'calving_fracture_toughness') sea_level_model = section.getboolean('sea_level_model') exp_info = self.exp_info @@ -229,6 +232,26 @@ def setup(self): # noqa: C901 sys.exit(f"ERROR: Expected 1 TF file at {tf_search}, " f"found {len(tf_list)}: {tf_list}") + # --- Find shelf collapse (calving) mask from ismip7_forcing + # fracture Path C, if provided --- + useCalvingMask = False + if (fracture_basepath != 'NotAvailable' and + scenario not in ('ctrl', 'ocx')): + mask_search = os.path.join( + fracture_basepath, f"{model}_{scenario}", 'shelf_collapse', + '*ice_shelf_collapse_mask_*.nc') + mask_list = glob.glob(mask_search) + if len(mask_list) == 1: + mask_fname = os.path.split(mask_list[0])[-1] + os.symlink(mask_list[0], + os.path.join(self.work_dir, mask_fname)) + useCalvingMask = True + elif len(mask_list) > 1: + sys.exit(f"ERROR: Expected at most 1 shelf collapse mask " + f"file at {mask_search}, found {len(mask_list)}: " + f"{mask_list}") + # else: no mask for this experiment; leave mask calving off + # --- Set up streams --- # Determine forcing interval if scenario == 'ctrl': @@ -266,6 +289,14 @@ def setup(self): # noqa: C901 out_name='streams.landice', template_replacements=stream_replacements) + if useCalvingMask: + mask_stream_replacements = { + 'input_file_calving_mask_forcing_name': mask_fname} + self.add_streams_file( + resource_location, 'streams.mask_calving', + out_name='streams.landice', + template_replacements=mask_stream_replacements) + # --- Set up namelist --- self.add_namelist_file( resource_location, 'namelist.landice', @@ -307,6 +338,20 @@ def setup(self): # noqa: C901 out_name='streams.landice', template_replacements=vM_stream_replacements) + # Mask calving options (ismip7_forcing fracture Path C), gated by + # hydrofracture vulnerability (MALI PR #187) + if useCalvingMask: + options = { + 'config_calving': "'none'", + 'config_apply_calving_mask': ".true.", + 'config_restore_calving_front': ".false.", + 'config_require_extensional_stresses_for_mask_calving': + ".true.", + 'config_calving_fracture_toughness': + f'{calving_fracture_toughness}'} + self.add_namelist_options(options=options, + out_name='namelist.landice') + # Sea-level model options if sea_level_model: slm_input_ice = section.get('slm_input_ice') diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template b/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template index 5465926fb8..9a256a64e9 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template +++ b/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template @@ -128,6 +128,8 @@ + + diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving b/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving new file mode 100644 index 0000000000..278af616b0 --- /dev/null +++ b/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving @@ -0,0 +1,13 @@ + + + + + + + From a71dc04268f9790e1f56f5eef5b27fa0b6e0dc0f Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Mon, 14 Sep 2026 19:15:30 -0700 Subject: [PATCH 2/7] docs: document fracture path layout fix and mask calving in ismip7_run - users_guide/ismip7_forcing: fix fracture output path examples to the corrected {model}_{scenario}/{category}/ layout; document it in the Output Layout section. - users_guide/ismip7_run: document fracture_basepath and calving_fracture_toughness config options, the shelf_collapse forcing directory, and add a Mask Calving (Path C) section describing the hydrofracture vulnerability gating from MALI PR #187. - developers_guide/ismip7_run: note the new mask calving setup step in SetUpExperiment. --- .../landice/test_groups/ismip7_run.rst | 23 ++++++--- .../landice/test_groups/ismip7_forcing.rst | 9 ++-- .../landice/test_groups/ismip7_run.rst | 51 +++++++++++++++++-- 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/docs/developers_guide/landice/test_groups/ismip7_run.rst b/docs/developers_guide/landice/test_groups/ismip7_run.rst index 46b1c81541..a699c9f3a8 100644 --- a/docs/developers_guide/landice/test_groups/ismip7_run.rst +++ b/docs/developers_guide/landice/test_groups/ismip7_run.rst @@ -75,16 +75,25 @@ The ``setup`` method sets up the experiment directory by: and restart frequency. 5. Adding calving-specific streams (face melting, von Mises params) if configured. -6. Creating a restart symlink for projection experiments pointing to +6. If ``fracture_basepath`` is set and a matching Path C + ``ice_shelf_collapse_mask_*.nc`` file is found for the experiment's + ``{model}_{scenario}`` (from :ref:`landice_ismip7_forcing_fracture`), + symlinking it in, adding the ``streams.mask_calving`` stream, and + setting ``config_calving``, ``config_apply_calving_mask``, + ``config_restore_calving_front``, + ``config_require_extensional_stresses_for_mask_calving``, and + ``config_calving_fracture_toughness`` accordingly. This is skipped for + ``ctrl`` and ``ocx`` experiments and when no mask file is found. +7. Creating a restart symlink for projection experiments pointing to the corresponding ESM's historical restart (``../historical_{model}/rst.2015-01-01.nc``). -7. Setting up CTRL2015 experiments with constant-climate forcing +8. Setting up CTRL2015 experiments with constant-climate forcing (``initial_only`` intervals). -8. Setting up the OCX experiment with reanalysis-based forcing. -9. If SLM coupling is enabled, adding a ``CreateSlmMappingFiles`` step - and writing the SLM namelist from the Jinja2 template. -10. Generating a ``graph.info`` file and a SLURM job script. -11. Symlinking the compass load script into the run directory. +9. Setting up the OCX experiment with reanalysis-based forcing. +10. If SLM coupling is enabled, adding a ``CreateSlmMappingFiles`` step + and writing the SLM namelist from the Jinja2 template. +11. Generating a ``graph.info`` file and a SLURM job script. +12. Symlinking the compass load script into the run directory. The ``run`` method executes MALI for the given experiment. diff --git a/docs/users_guide/landice/test_groups/ismip7_forcing.rst b/docs/users_guide/landice/test_groups/ismip7_forcing.rst index 417e3552c0..4a5ca9ea82 100644 --- a/docs/users_guide/landice/test_groups/ismip7_forcing.rst +++ b/docs/users_guide/landice/test_groups/ismip7_forcing.rst @@ -91,6 +91,9 @@ Processed forcing is written under ``output_base_path`` in a layout that the {output_base_path}/{group}/atmosphere/{mesh}_temperature_{source}_{scenario}_{years}.nc {output_base_path}/{group}/atmosphere/{mesh}_runoff_... (and the two gradients) {output_base_path}/{group}/ocean_thermal_forcing/{mesh}_thermal_forcing_{source}_{scenario}_{years}.nc + {output_base_path}/{group}/shelf_collapse/{mesh}_ice_shelf_collapse_mask_*.nc + {output_base_path}/{group}/excess_melt/{mesh}_excess_melt_*.nc + {output_base_path}/{group}/lake_properties/{mesh}_lake_properties_*.nc The ``group`` directory is ``{model}_{scenario}`` for ESM scenarios and ``OCX`` for GrIS OCX. AIS OCX writes one group per selected ocean product, @@ -365,7 +368,7 @@ is useful when only some of the pathway source files are available. (melt + rain after firn air content depletion), matching ``excess_melt_*.nc``. The output variable is ``ismip7ExcessMelt`` (converted from mm w.e. yr-1 to SI units of kg m-2 s-1) and is written to - ``{output_base_path}/excess_melt/{model}_{scenario}/``. Conservative + ``{output_base_path}/{model}_{scenario}/excess_melt/``. Conservative remapping is used by default since this is a flux. This source file has no ``x``/``y`` coordinate variables and its array is flipped along the y axis relative to the other fracture files, so the step reconstructs the source @@ -376,7 +379,7 @@ is useful when only some of the pathway source files are available. depth and area fraction from the Grau et al. (2025) parameterization, matching ``lake_properties_*.nc``. The output variables are ``ismip7LakeDepth`` (m) and ``ismip7LakeAreaFraction`` (unitless), written - to ``{output_base_path}/lake_properties/{model}_{scenario}/``. Bilinear + to ``{output_base_path}/{model}_{scenario}/lake_properties/``. Bilinear remapping is used by default. * **process_shelf_collapse** (Path C): Remaps the annual ice shelf collapse @@ -389,7 +392,7 @@ is useful when only some of the pathway source files are available. that the 0/1 mask values are preserved, and the remapped mask is rounded to 0/1. The output variable is ``calvingMask`` with an accompanying ``xtime`` variable, and the result is written to - ``{output_base_path}/shelf_collapse/{model}_{scenario}/``. + ``{output_base_path}/{model}_{scenario}/shelf_collapse/``. All three pathways produce continuous fields (Paths A and B) or a discrete mask (Path C) with an accompanying ``xtime`` variable. The output variable diff --git a/docs/users_guide/landice/test_groups/ismip7_run.rst b/docs/users_guide/landice/test_groups/ismip7_run.rst index 1d418eb849..6bd93a6900 100644 --- a/docs/users_guide/landice/test_groups/ismip7_run.rst +++ b/docs/users_guide/landice/test_groups/ismip7_run.rst @@ -113,13 +113,20 @@ Usage ├── CESM2-WACCM_historical/ │ ├── atmosphere/ │ │ └── {mesh}_smb_CESM2-WACCM_historical_*.nc - │ └── ocean_thermal_forcing/ - │ └── {mesh}_thermal_forcing_CESM2-WACCM_historical_*.nc + │ ├── ocean_thermal_forcing/ + │ │ └── {mesh}_thermal_forcing_CESM2-WACCM_historical_*.nc + │ └── shelf_collapse/ + │ └── {mesh}_ice_shelf_collapse_mask_*.nc ├── CESM2-WACCM_ssp585/ │ ├── atmosphere/ - │ └── ocean_thermal_forcing/ + │ ├── ocean_thermal_forcing/ + │ └── shelf_collapse/ └── ... + The ``shelf_collapse`` subdirectory (ISMIP7 Path C ice shelf collapse + mask, produced by :ref:`landice_ismip7_forcing_fracture`) is optional; + see :ref:`landice_ismip7_run_mask_calving` below. + 3. Create a user config file overriding the ``NotAvailable`` paths. 4. Set up and run:: @@ -168,6 +175,16 @@ All config options should be reviewed and altered as needed. calving_method = restore von_mises_parameter_path = NotAvailable + # Base path to ismip7_forcing fracture (Path C) output; layout + # {fracture_basepath}/{model}_{scenario}/shelf_collapse/*.nc + # Leave as NotAvailable to disable mask calving. + fracture_basepath = NotAvailable + + # Ice fracture toughness (Pa m^0.5) for the hydrofracture vulnerability + # criterion gating mask calving, used only when a shelf collapse mask + # is found via fracture_basepath. + calving_fracture_toughness = 2.0e5 + # Face melting use_face_melting = false @@ -211,6 +228,34 @@ ISMIP7 uses more forcing fields than ISMIP6, at mixed temporal resolutions: For CTRL2015 experiments, all forcing intervals are set to ``initial_only`` (constant climate). +.. _landice_ismip7_run_mask_calving: + +Mask Calving (Path C) +---------------------- + +``ismip7_ais`` can optionally apply the ISMIP7 Path C ice shelf collapse +mask produced by :ref:`landice_ismip7_forcing_fracture`. If +``fracture_basepath`` is set (not ``NotAvailable``), each historical/SSP +experiment looks for a single +``{fracture_basepath}/{model}_{scenario}/shelf_collapse/*ice_shelf_collapse_mask_*.nc`` +file. ``ctrl`` and ``ocx`` experiments do not use this pathway. + +When a mask file is found, it is symlinked into the run directory and used +to force calving: + +* ``config_calving`` is set to ``'none'`` +* ``config_apply_calving_mask`` is set to ``.true.`` +* ``config_restore_calving_front`` is set to ``.false.`` +* ``config_require_extensional_stresses_for_mask_calving`` is set to + ``.true.``, so the mask only removes floating ice that is also vulnerable + to hydrofracture per the fracture-toughness criterion of Lai et al. + (2020) / Reynolds and Nowicki (2026). The threshold depends on + ``config_calving_fracture_toughness``. + +If ``fracture_basepath`` is ``NotAvailable``, or no mask file is found for a +given experiment, mask calving and the hydrofracture gating stay off and +the experiment uses its normal ``calving_method`` configuration instead. + .. _landice_ismip7_run_ais: ismip7_ais From d06cf61413d1fa4d93d8eb3fa52c775ce205bdd2 Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Mon, 14 Sep 2026 19:43:13 -0700 Subject: [PATCH 3/7] ismip7_run: look up fracture mask under forcing_basepath, add use_hydrofracture_forcing - Remove the separate fracture_basepath cfg option; the Path C shelf collapse mask is now looked up at {forcing_basepath}/{model}_{scenario}/shelf_collapse/, the same tree used for atmosphere/ocean forcing. - Add use_hydrofracture_forcing (default true) to toggle mask calving. historical, ctrl, and ocx scenarios never use hydrofracture forcing regardless of this setting. - When use_hydrofracture_forcing is true for any other scenario, the mask file is now required: setup fails with an error if it is missing, instead of silently leaving mask calving off. - Update users_guide/ismip7_run, users_guide/ismip7_forcing, and developers_guide/ismip7_run docs to match. --- .../ismip7_run/ismip7_ais/ismip7_ais.cfg | 14 +++--- .../ismip7_ais/set_up_experiment.py | 26 ++++++----- .../landice/test_groups/ismip7_run.rst | 18 ++++---- .../landice/test_groups/ismip7_run.rst | 44 +++++++++++-------- 4 files changed, 57 insertions(+), 45 deletions(-) diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg b/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg index 3270e165d9..bfada238b8 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg +++ b/compass/landice/tests/ismip7_run/ismip7_ais/ismip7_ais.cfg @@ -59,14 +59,16 @@ calving_method = restore # Only required if calving_method is set to 'von_mises'. von_mises_parameter_path = NotAvailable -# Base path to ismip7_forcing fracture (Path C) output, with layout -# {fracture_basepath}/{model}_{scenario}/shelf_collapse/*.nc -# Set to NotAvailable to disable mask calving / hydrofracture gating. -fracture_basepath = NotAvailable +# Whether to apply the ISMIP7 Path C ice shelf collapse mask (from +# ismip7_forcing fracture) as hydrofracture-gated mask calving. Expected +# layout: {forcing_basepath}/{model}_{scenario}/shelf_collapse/*.nc +# Not used for historical, ctrl, or ocx experiments. If true and the mask +# file is missing for an experiment that should have one, setup fails. +use_hydrofracture_forcing = true # Ice fracture toughness (K_IC, Pa m^0.5) used in the hydrofracture -# vulnerability criterion gating mask calving. Only used if a shelf -# collapse mask file is found via fracture_basepath. +# vulnerability criterion gating mask calving. Only used when +# use_hydrofracture_forcing is true. calving_fracture_toughness = 2.0e5 # True if running coupled MALI-sea level model simulation diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py index e8f566a1aa..0a4e9aa413 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py +++ b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py @@ -63,7 +63,8 @@ def setup(self): # noqa: C901 reference_surface_path = section.get('reference_surface_path') reference_surface_fname = os.path.split(reference_surface_path)[-1] calving_method = section.get('calving_method') - fracture_basepath = section.get('fracture_basepath') + use_hydrofracture_forcing = section.getboolean( + 'use_hydrofracture_forcing') calving_fracture_toughness = section.get( 'calving_fracture_toughness') sea_level_model = section.getboolean('sea_level_model') @@ -233,24 +234,25 @@ def setup(self): # noqa: C901 f"found {len(tf_list)}: {tf_list}") # --- Find shelf collapse (calving) mask from ismip7_forcing - # fracture Path C, if provided --- + # fracture Path C, if requested --- + # historical, ctrl, and ocx experiments never use hydrofracture + # forcing, regardless of use_hydrofracture_forcing. useCalvingMask = False - if (fracture_basepath != 'NotAvailable' and - scenario not in ('ctrl', 'ocx')): - mask_search = os.path.join( - fracture_basepath, f"{model}_{scenario}", 'shelf_collapse', - '*ice_shelf_collapse_mask_*.nc') + if (use_hydrofracture_forcing and + scenario not in ('historical', 'ctrl', 'ocx')): + mask_search = os.path.join(forcing_dir, 'shelf_collapse', + '*ice_shelf_collapse_mask_*.nc') mask_list = glob.glob(mask_search) if len(mask_list) == 1: mask_fname = os.path.split(mask_list[0])[-1] os.symlink(mask_list[0], os.path.join(self.work_dir, mask_fname)) useCalvingMask = True - elif len(mask_list) > 1: - sys.exit(f"ERROR: Expected at most 1 shelf collapse mask " - f"file at {mask_search}, found {len(mask_list)}: " - f"{mask_list}") - # else: no mask for this experiment; leave mask calving off + else: + sys.exit( + f"ERROR: use_hydrofracture_forcing is True but did not " + f"find exactly 1 shelf collapse mask file at " + f"{mask_search}: {mask_list}") # --- Set up streams --- # Determine forcing interval diff --git a/docs/developers_guide/landice/test_groups/ismip7_run.rst b/docs/developers_guide/landice/test_groups/ismip7_run.rst index a699c9f3a8..a6ec06793d 100644 --- a/docs/developers_guide/landice/test_groups/ismip7_run.rst +++ b/docs/developers_guide/landice/test_groups/ismip7_run.rst @@ -75,15 +75,17 @@ The ``setup`` method sets up the experiment directory by: and restart frequency. 5. Adding calving-specific streams (face melting, von Mises params) if configured. -6. If ``fracture_basepath`` is set and a matching Path C - ``ice_shelf_collapse_mask_*.nc`` file is found for the experiment's - ``{model}_{scenario}`` (from :ref:`landice_ismip7_forcing_fracture`), - symlinking it in, adding the ``streams.mask_calving`` stream, and - setting ``config_calving``, ``config_apply_calving_mask``, - ``config_restore_calving_front``, +6. If ``use_hydrofracture_forcing`` is true and the experiment's scenario + is not ``historical``, ``ctrl``, or ``ocx``, looking for a single Path C + ``ice_shelf_collapse_mask_*.nc`` file under + ``{forcing_basepath}/{model}_{scenario}/shelf_collapse/`` (from + :ref:`landice_ismip7_forcing_fracture`). If found, it is symlinked in, + the ``streams.mask_calving`` stream is added, and ``config_calving``, + ``config_apply_calving_mask``, ``config_restore_calving_front``, ``config_require_extensional_stresses_for_mask_calving``, and - ``config_calving_fracture_toughness`` accordingly. This is skipped for - ``ctrl`` and ``ocx`` experiments and when no mask file is found. + ``config_calving_fracture_toughness`` are set accordingly. If not + found, setup fails with an error, since the mask is required whenever + ``use_hydrofracture_forcing`` is true for that scenario. 7. Creating a restart symlink for projection experiments pointing to the corresponding ESM's historical restart (``../historical_{model}/rst.2015-01-01.nc``). diff --git a/docs/users_guide/landice/test_groups/ismip7_run.rst b/docs/users_guide/landice/test_groups/ismip7_run.rst index 6bd93a6900..97e2f2454b 100644 --- a/docs/users_guide/landice/test_groups/ismip7_run.rst +++ b/docs/users_guide/landice/test_groups/ismip7_run.rst @@ -124,8 +124,9 @@ Usage └── ... The ``shelf_collapse`` subdirectory (ISMIP7 Path C ice shelf collapse - mask, produced by :ref:`landice_ismip7_forcing_fracture`) is optional; - see :ref:`landice_ismip7_run_mask_calving` below. + mask, produced by :ref:`landice_ismip7_forcing_fracture`) is required + for ``ssp*`` experiments unless ``use_hydrofracture_forcing`` is set to + ``false``; see :ref:`landice_ismip7_run_mask_calving` below. 3. Create a user config file overriding the ``NotAvailable`` paths. @@ -175,14 +176,15 @@ All config options should be reviewed and altered as needed. calving_method = restore von_mises_parameter_path = NotAvailable - # Base path to ismip7_forcing fracture (Path C) output; layout - # {fracture_basepath}/{model}_{scenario}/shelf_collapse/*.nc - # Leave as NotAvailable to disable mask calving. - fracture_basepath = NotAvailable + # Whether to apply the ISMIP7 Path C ice shelf collapse mask as + # hydrofracture-gated mask calving (not used for historical, ctrl, or + # ocx experiments). If true, setup fails when the mask file is missing + # for an experiment that should have one. + use_hydrofracture_forcing = true # Ice fracture toughness (Pa m^0.5) for the hydrofracture vulnerability - # criterion gating mask calving, used only when a shelf collapse mask - # is found via fracture_basepath. + # criterion gating mask calving, used only when use_hydrofracture_forcing + # is true. calving_fracture_toughness = 2.0e5 # Face melting @@ -234,14 +236,18 @@ Mask Calving (Path C) ---------------------- ``ismip7_ais`` can optionally apply the ISMIP7 Path C ice shelf collapse -mask produced by :ref:`landice_ismip7_forcing_fracture`. If -``fracture_basepath`` is set (not ``NotAvailable``), each historical/SSP -experiment looks for a single -``{fracture_basepath}/{model}_{scenario}/shelf_collapse/*ice_shelf_collapse_mask_*.nc`` -file. ``ctrl`` and ``ocx`` experiments do not use this pathway. - -When a mask file is found, it is symlinked into the run directory and used -to force calving: +mask produced by :ref:`landice_ismip7_forcing_fracture`. The mask is looked +up under the same ``forcing_basepath`` used for the atmosphere/ocean +forcing, at +``{forcing_basepath}/{model}_{scenario}/shelf_collapse/*ice_shelf_collapse_mask_*.nc``. +``historical``, ``ctrl``, and ``ocx`` experiments never use this pathway, +regardless of ``use_hydrofracture_forcing``. + +When ``use_hydrofracture_forcing`` is ``true`` (the default) for any other +experiment (e.g. ``ssp126``, ``ssp370``, ``ssp585``), a matching mask file +is required: if it is missing, ``compass setup`` fails with an error rather +than silently skipping mask calving. When found, the mask is symlinked into +the run directory and used to force calving: * ``config_calving`` is set to ``'none'`` * ``config_apply_calving_mask`` is set to ``.true.`` @@ -252,9 +258,9 @@ to force calving: (2020) / Reynolds and Nowicki (2026). The threshold depends on ``config_calving_fracture_toughness``. -If ``fracture_basepath`` is ``NotAvailable``, or no mask file is found for a -given experiment, mask calving and the hydrofracture gating stay off and -the experiment uses its normal ``calving_method`` configuration instead. +Set ``use_hydrofracture_forcing = false`` to disable mask calving and the +hydrofracture gating entirely; experiments then use their normal +``calving_method`` configuration instead. .. _landice_ismip7_run_ais: From 48099b849036f39de8022ef7838ff30398a74c8d Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Tue, 15 Sep 2026 21:30:30 -0700 Subject: [PATCH 4/7] ismip7_run: update start times, FEM extension method, mask stream - historical/ocx experiments now start in 2007/2008 instead of 1990/2000. - Add config_fem_extension_method = 'ismip7-era' to AIS and GrIS namelists. - Drop mode="forward;analysis" from the mask_calving stream. --- compass/landice/tests/ismip7_run/ismip7_ais/__init__.py | 6 +++--- .../landice/tests/ismip7_run/ismip7_ais/namelist.landice | 1 + .../tests/ismip7_run/ismip7_ais/streams.mask_calving | 1 - compass/landice/tests/ismip7_run/ismip7_gris/__init__.py | 2 +- .../landice/tests/ismip7_run/ismip7_gris/namelist.landice | 1 + 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/__init__.py b/compass/landice/tests/ismip7_run/ismip7_ais/__init__.py index c6e3a41c94..7e234b6a5c 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/__init__.py +++ b/compass/landice/tests/ismip7_run/ismip7_ais/__init__.py @@ -12,12 +12,12 @@ EXPERIMENTS = { 'historical_CESM2-WACCM': { 'scenario': 'historical', 'model': 'CESM2-WACCM', - 'start_time': '2000-01-01_00:00:00', + 'start_time': '2008-01-01_00:00:00', 'stop_time': '2015-01-01_00:00:00', 'is_historical': True}, 'historical_MRI-ESM2-0': { 'scenario': 'historical', 'model': 'MRI-ESM2-0', - 'start_time': '2000-01-01_00:00:00', + 'start_time': '2008-01-01_00:00:00', 'stop_time': '2015-01-01_00:00:00', 'is_historical': True}, 'ssp370_CESM2-WACCM': { @@ -62,7 +62,7 @@ 'is_historical': False}, 'ocx': { 'scenario': 'ocx', 'model': None, - 'start_time': '1990-01-01_00:00:00', + 'start_time': '2008-01-01_00:00:00', 'stop_time': '2026-01-01_00:00:00', 'is_historical': True}, } diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/namelist.landice b/compass/landice/tests/ismip7_run/ismip7_ais/namelist.landice index 165f9611f6..f505ef541f 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/namelist.landice +++ b/compass/landice/tests/ismip7_run/ismip7_ais/namelist.landice @@ -1,4 +1,5 @@ config_velocity_solver = 'FO' + config_fem_extension_method = 'ismip7-era' config_do_velocity_reconstruction_for_external_dycore = .false. config_unrealistic_velocity = 00.00159 config_nonconvergence_error = .false. diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving b/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving index 278af616b0..c885b4da76 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving +++ b/compass/landice/tests/ismip7_run/ismip7_ais/streams.mask_calving @@ -2,7 +2,6 @@ Date: Mon, 21 Sep 2026 10:40:02 -0600 Subject: [PATCH 5/7] Remove config_calving = 'none' setting Remove a hard-coded setting of config_calving = 'none' when using mask calving. We want to be able to use both internal stress-based calving laws and mask-calving simultaneously. --- compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py | 1 - 1 file changed, 1 deletion(-) diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py index 0a4e9aa413..7545ba7448 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py +++ b/compass/landice/tests/ismip7_run/ismip7_ais/set_up_experiment.py @@ -344,7 +344,6 @@ def setup(self): # noqa: C901 # hydrofracture vulnerability (MALI PR #187) if useCalvingMask: options = { - 'config_calving': "'none'", 'config_apply_calving_mask': ".true.", 'config_restore_calving_front': ".false.", 'config_require_extensional_stresses_for_mask_calving': From 4f672442461c50c4cc34e89c609565eb7b66afd5 Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Mon, 21 Sep 2026 10:43:18 -0600 Subject: [PATCH 6/7] Update docs for mask calving Update docs to remove statements that `config_calving` is set to `'none'` when using mask calving. Co-authored-by: Trevor Hillebrand --- docs/developers_guide/landice/test_groups/ismip7_run.rst | 2 +- docs/users_guide/landice/test_groups/ismip7_run.rst | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/developers_guide/landice/test_groups/ismip7_run.rst b/docs/developers_guide/landice/test_groups/ismip7_run.rst index a6ec06793d..edbab77740 100644 --- a/docs/developers_guide/landice/test_groups/ismip7_run.rst +++ b/docs/developers_guide/landice/test_groups/ismip7_run.rst @@ -80,7 +80,7 @@ The ``setup`` method sets up the experiment directory by: ``ice_shelf_collapse_mask_*.nc`` file under ``{forcing_basepath}/{model}_{scenario}/shelf_collapse/`` (from :ref:`landice_ismip7_forcing_fracture`). If found, it is symlinked in, - the ``streams.mask_calving`` stream is added, and ``config_calving``, + the ``streams.mask_calving`` stream is added, and ``config_apply_calving_mask``, ``config_restore_calving_front``, ``config_require_extensional_stresses_for_mask_calving``, and ``config_calving_fracture_toughness`` are set accordingly. If not diff --git a/docs/users_guide/landice/test_groups/ismip7_run.rst b/docs/users_guide/landice/test_groups/ismip7_run.rst index 97e2f2454b..97501104d7 100644 --- a/docs/users_guide/landice/test_groups/ismip7_run.rst +++ b/docs/users_guide/landice/test_groups/ismip7_run.rst @@ -249,7 +249,6 @@ is required: if it is missing, ``compass setup`` fails with an error rather than silently skipping mask calving. When found, the mask is symlinked into the run directory and used to force calving: -* ``config_calving`` is set to ``'none'`` * ``config_apply_calving_mask`` is set to ``.true.`` * ``config_restore_calving_front`` is set to ``.false.`` * ``config_require_extensional_stresses_for_mask_calving`` is set to From d1cad65d0b25c3a13515dd1d76b22dd990c5ac1d Mon Sep 17 00:00:00 2001 From: Trevor Hillebrand Date: Mon, 21 Sep 2026 10:48:02 -0600 Subject: [PATCH 7/7] Change basicmesh to minmesh for annual output Change basicmesh to minmesh to reduce file size. --- .../tests/ismip7_run/ismip7_ais/streams.landice.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template b/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template index 9a256a64e9..03de43b3db 100644 --- a/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template +++ b/compass/landice/tests/ismip7_run/ismip7_ais/streams.landice.template @@ -108,7 +108,7 @@ filename_template="output/output_2d_$Y.nc" type="output"> - +