Skip to content

Commit

Permalink
New options to force retreat, remove isthmuses, and expand calving mask
Browse files Browse the repository at this point in the history
I added several options to support ISMIP6-based Antarctic experiments with ice-shelf collapse.

First, I modified the force_retreat option, which uses a real mask with values in the range [0,1]
to force ice to thin or retreat.  Previously, force_retreat was a logical option (T or F).
Now, it is an integer option (0, 1, or 2).

Option 0 => no forced retreat
Option 1 => Ice is thinned or removed wherever ice_fraction_retreat_mask > 0.
Option 2 => Floating ice is removed in cells with ice_fraction_retreat_mask exceeding
            a threshold value (0.01 by default), provided these cells are connected to the ocean
            through other cells with ice_fraction_retreat_mask above the threshold.
            Grounded ice is unaffected.

Option 1 is the same as the old option force_retreat = T, used for ISMIP6 Greenland experiments
with forced retreat of the calving front.  However, the old convention was to remove ice from
cells with a mask value < 1; the new convention is to remove ice from cells with a mask value > 0.

The new option 2 is appropriate for ISMIP6 Antarctic experiments in which a hydrofracture mask
is read in as a forcing file.

Initial experiments using a retreat mask from CESM2 21st century simulations showed that several shelves
become unstable, for example when a shelf is divided into two regions connected by a narrow isthmus
one cell wide.  I addressed this problem by adding an option to remove ice isthmuses.

An isthmus is define as a floating or weakly grounded cell with either ice-free ocean or thin floating ice
on each side: e.g. if cell(i,j) is bordered by open ocean in cells (i-1,j) and (i+1,j).
When isthmus cells are removed after applying the retreat mask, a potentially unstable shelf is divided
into two separate regions.  Subroutine remove_icebergs then removes the unstable region downstream,
leaving the more stable region upstream.

Also, I added a new logical option 'expand_calving_mask', to be used in conjunction with the calving_mask option.
If the new option is set to true, then calving_mask is expanded at model initialization to include
all floating ice in selected basins.  This floating ice will then calve immediately, leading to
acceleration of grounded ice.

By default, this option is applied to 13 of the 16 ISMIP6 Antarctic basins.  It is not applied to
the three basins that include most of the Ross, Filchner-Ronne and Amery ice shelves.
To change the basins where floating ice is calved, the user must insert basin numbers by hand.

Note that this option differs from the ABUMIP float-kill option, in that all ice is calved in cells
that are initially filled with floating ice, but not in cells where the ice subsequently floats.

In multi-century transient experiments at 8 km and 4 km, I found that when forcing retreat using
the ISMIP6 shelf-collapse mask, velocities can reach several tens of km/yr, but usually return to
reasonble values of < 10 km/yr after a time step or two.

In experiments using the expanded calving mask, ice speeds in the first few years can exceed 100 km/yr.
These usually return to realistic values within a few simulation years, but sometimes the simulation
can crash.  More work would be needed to make this option truly robust.

This commit is BFB except when using the new options.
For earlier experiments with force_retreat = T in the config file, we will need to set
force_retreat = 1 and replace ice_fraction_retreat_mask with (1 - ice_fraction_retreat_mask)
to reproduce the results.
  • Loading branch information
whlipscomb committed Sep 11, 2020
1 parent db18175 commit c1319da
Show file tree
Hide file tree
Showing 5 changed files with 599 additions and 44 deletions.
38 changes: 30 additions & 8 deletions libglide/glide_setup.F90
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,8 @@ subroutine handle_options(section, model)
call GetValue(section,'calving_domain',model%options%calving_domain)
call GetValue(section,'apply_calving_mask', model%options%apply_calving_mask)
call GetValue(section,'remove_icebergs', model%options%remove_icebergs)
call GetValue(section,'remove_isthmuses', model%options%remove_isthmuses)
call GetValue(section,'expand_calving_mask', model%options%expand_calving_mask)
call GetValue(section,'limit_marine_cliffs', model%options%limit_marine_cliffs)
call GetValue(section,'cull_calving_front', model%options%cull_calving_front)
call GetValue(section,'adjust_input_thickness', model%options%adjust_input_thickness)
Expand Down Expand Up @@ -1347,7 +1349,24 @@ subroutine print_options(model)
else
call write_log(' Icebergs will not be removed')
endif

if (model%options%remove_isthmuses) then
if (.not.model%options%remove_icebergs) then
model%options%remove_icebergs = .true.
write(message,*) ' Setting remove_icebergs = T for stability when remove_isthmuses = T'
call write_log(message)
endif
call write_log(' Isthmuses will be removed')
endif

if (model%options%expand_calving_mask) then
if (model%options%whichcalving == CALVING_GRID_MASK .or. model%options%apply_calving_mask) then
call write_log(' The calving mask will be expanded to include floating ice in select basins')
else
call write_log(' Not using a calving_mask; expand_calving_mask = T will be ignored')
endif
endif

if (model%options%limit_marine_cliffs) then
call write_log(' The thickness of marine ice cliffs will be limited')
call write_log(message)
Expand Down Expand Up @@ -1883,20 +1902,23 @@ subroutine print_options(model)

if (model%options%block_inception) then
write(message,*) 'Inception outside the main ice sheet will be blocked'
else
write(message,*) 'Inception outside the main ice sheet is allowed'
call write_log(message)
endif

if (model%options%remove_ice_caps) then
write(message,*) 'Ice caps will be removed and added to the calving flux'
else
write(message,*) 'Ice caps will not be removed'
call write_log(message)
endif

if (model%options%force_retreat) then
if (model%options%force_retreat == FORCE_RETREAT_ALL_ICE) then
write(message,*) 'Ice retreat will be forced using ice_fraction_retreat_mask'
else
write(message,*) 'Ice retreat will not be forced'
call write_log(message)
elseif (model%options%force_retreat == FORCE_RETREAT_FLOATING_ICE) then
write(message,*) 'Floating ice retreat will be forced using ice_fraction_retreat_mask'
call write_log(message)
if (.not.model%options%remove_isthmuses) then
call write_log(' Warning: Can be unstable when remove_isthmuses = F')
endif
endif

write(message,*) 'ho_whichice_age : ',model%options%which_ho_ice_age, &
Expand Down Expand Up @@ -3238,7 +3260,7 @@ subroutine define_glide_restart_variables(options)

! If forcing ice retreat, then we need ice_fraction_retreat_mask (which specifies the cells where retreat is forced)
! and reference_thck (which sets up an upper thickness limit for partly retreating cells)
if (options%force_retreat) then
if (options%force_retreat /= FORCE_RETREAT_NONE) then
call glide_add_to_restart_variable_list('ice_fraction_retreat_mask')
call glide_add_to_restart_variable_list('reference_thck')
endif
Expand Down
15 changes: 14 additions & 1 deletion libglide/glide_types.F90
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,10 @@ module glide_types
integer, parameter :: CALVING_DOMAIN_OCEAN_EDGE = 0
integer, parameter :: CALVING_DOMAIN_EVERYWHERE = 1

integer, parameter :: FORCE_RETREAT_NONE = 0
integer, parameter :: FORCE_RETREAT_ALL_ICE = 1
integer, parameter :: FORCE_RETREAT_FLOATING_ICE = 2

integer, parameter :: VERTINT_STANDARD = 0
integer, parameter :: VERTINT_KINEMATIC_BC = 1

Expand Down Expand Up @@ -634,6 +638,15 @@ module glide_types
!> These are connected regions with zero basal traction and no connection to grounded ice.
!> Safer to make it true, but not necessary for all applications

logical :: remove_isthmuses = .false.
!> if true, then identify and remove ice isthmuses after calving
!> These are narrow bridges connecting two regions of floating ice.
!> False by default, but may need to be true for the FORCE_RETREAT_FLOATING_ICE option.

logical :: expand_calving_mask = .false.
!> if true, then expand the calving mask to include all ice that is floating at initialization
!> Note: By default, this is done for a hardwired set of ISMIP6 basins, excluding large shelves

logical :: limit_marine_cliffs = .false.
!> if true, then thin marine-based cliffs based on a thickness threshold

Expand Down Expand Up @@ -1011,7 +1024,7 @@ module glide_types
logical :: remove_ice_caps = .false.
!> Flag that indicates whether ice caps are removed and added to the calving flux

logical :: force_retreat = .false.
integer :: force_retreat = 0
!> Flag that indicates whether retreat is forced using ice_fraction_retreat_mask

integer :: which_ho_ice_age = 1
Expand Down
Loading

0 comments on commit c1319da

Please sign in to comment.