Skip to content

Add hydrofracture vulnerability gating for mask calving - #187

Merged
matthewhoffman merged 2 commits into
MALI-Dev:developfrom
trhille:mali/hydrofracture_when_stresses_are_extensional
Sep 16, 2026
Merged

matthewhoffman merged 2 commits into
MALI-Dev:developfrom
trhille:mali/hydrofracture_when_stresses_are_extensional

Conversation

@trhille

@trhille trhille commented Aug 27, 2026 •

Copy link
Copy Markdown

Add a fracture-toughness-based vulnerability criterion to MALI mask calving so the ISMIP7 Path C shelf-collapse mask only removes floating ice that is also vulnerable to hydrofracture per Lai et al. (2020) / Reynolds and Nowicki (2026, eqs 4-8).

A cell is vulnerable where the resistive stress R_xx = 2*tauMax + tauMin exceeds a thickness-independent threshold that depends on ice fracture toughness. This merge also requires that cells marked with calvingMask are contiguous with the marine margin before being removed. New namelist options:

  • config_require_extensional_stresses_for_mask_calving (logical)
  • config_calving_fracture_toughness (real, default 2e5 Pa m^0.5) The LEFM functions f=1.068 and F=1.122 are hardcoded.

Also add diagnostic field hydrofractureVulnerabilityMask (computed for all floating ice) and write it to the output stream.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The new Fortran constants fFactor and FFactor differ only by case, which will cause a duplicate-symbol compilation error in Fortran.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR adds a fracture-toughness-based hydrofracture vulnerability criterion to MALI mask calving, so the ISMIP7 Path C shelf-collapse mask only removes floating ice where extensional stresses indicate vulnerability. It also introduces a diagnostic mask field to expose vulnerability in outputs and wires new configuration options through the namelist/registry plumbing.

Changes:

  • Add two new namelist options to gate mask calving by hydrofracture vulnerability and to set fracture toughness.
  • Compute and store hydrofractureVulnerabilityMask for floating cells during mask calving and use it to conditionally apply calving.
  • Register and output the new diagnostic field via the MPAS registry and streams.
File summaries
File Description
components/mpas-albany-landice/src/Registry.xml Adds new namelist options and registers/streams the hydrofractureVulnerabilityMask diagnostic field.
components/mpas-albany-landice/src/mode_forward/mpas_li_calving.F Implements the stress-threshold vulnerability criterion and gating logic in mask_calving.
components/mpas-albany-landice/bld/namelist_files/namelist_definition_mali.xml Documents the two new namelist entries for MALI.
components/mpas-albany-landice/bld/namelist_files/namelist_defaults_mali.xml Provides default values for the new namelist options.
components/mpas-albany-landice/bld/build-namelist-section Ensures new options are included in namelist section defaults.
components/mpas-albany-landice/bld/build-namelist Ensures new options are included in the overall build-namelist defaults.
Review details
  • Files reviewed: 6/6 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Add a fracture-toughness-based vulnerability criterion to MALI mask
calving so the ISMIP7 Path C shelf-collapse mask only removes floating
ice that is also vulnerable to hydrofracture per Lai et al. (2020) /
Reynolds and Nowicki (2026, eqs 4-8).

A cell is vulnerable where the resistive stress R_xx = 2*tauMax + tauMin
exceeds a thickness-independent threshold that depends on ice fracture
toughness. New namelist options:
  - config_require_extensional_stresses_for_mask_calving (logical)
  - config_calving_fracture_toughness (real, default 2e5 Pa m^0.5)
The LEFM functions f=1.068 and F=1.122 are hardcoded.

Also add diagnostic field hydrofractureVulnerabilityMask (computed for
all floating ice) and write it to the output stream.
@trhille
trhille force-pushed the mali/hydrofracture_when_stresses_are_extensional branch from b5375ca to 03b3970 Compare September 4, 2026 16:35
@matthewhoffman matthewhoffman added this to the ISMIP7 milestone Sep 12, 2026
@matthewhoffman

Copy link
Copy Markdown

Testing

All tests pass except for the recently added RC and DF tests, which is expected because the base of this branch is too old to support them. I have not tested the added functionality, but this confirms that these changes do not break existing tests.

Mask calving now uses flood-fill algorithm to ensure that vulnerable ice
shelf areas are only calved when connected to the marine margin (calving
front). This prevents unphysical calving in the interior of ice shelves.

The implementation creates a marine dynamic margin mask by identifying
cells at the dynamic margin adjacent to open ocean or nondynamic floating
ice connected to open ocean. Flood-fill then propagates from these seed
cells through contiguous vulnerable floating ice that meets the calving
criteria. Only ice connected to the marine margin is removed.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@trhille

trhille commented Sep 16, 2026 •

Copy link
Copy Markdown
Author

Testing

I tested this on a CESM2-WACCM SSP585 ISMIP7 run set up using MPAS-Dev/compass#989. I started the run in 2250 (just using the c. 2008 initial condition for testing), with the following relevant namelist settings:

&calving
    config_calving = 'none'
    config_apply_calving_mask = .true.
    config_require_extensional_stresses_for_mask_calving = .true.
    config_calving_fracture_toughness = 2.0e5
    config_restore_calving = .false.

The maps below confirm that calving only occurs where calvingMask = 1 and hydrofractureVulnerabilityMask = 1. The white contours on the lefthand plot show calvingMask, and the black contours show hydrofractureVulnerabilityMask. This testing doesn't prove that hydrofractureVulnerabilityMask, but that calculation is simple enough to review by inspection. Additionally, I confirmed that commit 50ae68e stops calving opening up holes in the middle of the ice shelf, where the vulnerable region does not connect to the marine margin, but I don't have a plot to show that.

2250-01-01:
image

2252-01-01:
image

2254-01-01:
image

@matthewhoffman matthewhoffman left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@trhille , this is exciting to have this working. I made a few comments for minor changes, but given the deadline we are working under and the marginal impact of them, I'm fine with merging this as-is, so I'm approving now.

<var name="upperSurface"/>
<var name="temperature"/>
<var name="cellMask"/>
<var name="hydrofractureVulnerabilityMask"/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it makes sense to have this in the default output stream. But given the default output stream already has sort of random fields in it, and we never actually use it, it's fine to leave it in, and we can make a more intentional choice about cleaning this up at a later point.

endif
enddo

! create mask of cells that are on the dynamic **marine** margin

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally we'd move this to a shared routine that can be called from here and from damage calving.

call mpas_pool_get_config(liConfigs, 'config_calving_fracture_toughness', config_calving_fracture_toughness)
call mpas_pool_get_config(liConfigs, 'config_ice_density', config_ice_density)

! Threshold resistive stress for hydrofracture vulnerability, eq. 8 of Reynolds and Nowicki (2026)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice to gate this to only be calculated if needed.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is just a scalar calculation, so evaluating an if-statement would probably be more expensive.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants