Skip to content

Commit

Permalink
Calving of icebergs based on ice shelf flux through static ice front
Browse files Browse the repository at this point in the history
-This commit is the coupler contribution to calving of icebergs based
on the ice-shelf flux through a static ice-shelf front. This flux is
passed from MOM6 --> coupler --> SIS2 --> icebergs.
-To use, simply add calve_ice_shelf_bergs=True to the coupler nml (and
use the SIS2 and MOM6 commits that include ice-shelf calving).
-"Calving" based on frozen discharge from the land model can also be
used simultaneously, as long no cell has both nonzero
frozen-discharge-based and ice-shelf calving. For example,
land-discharge-based calving can be used for Greenland (without an
ice-sheet component) and ice-shelf calving for Antarctica
(with an ice-sheet component).
-Note that the data_override variable for ice-shelf calving is
Ocean_Ice_boundary%IS_calving to differentiate from the land-model
discharge-calving override Land_Ice_Boundary%calving.
  • Loading branch information
alex-huth committed May 6, 2024
1 parent 4dc9b0f commit 3e80bbc
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
17 changes: 15 additions & 2 deletions full/coupler_main.F90
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ program coupler_main
use ice_model_mod, only: ice_data_type_chksum, ocn_ice_bnd_type_chksum
use ice_model_mod, only: atm_ice_bnd_type_chksum, lnd_ice_bnd_type_chksum
use ice_model_mod, only: unpack_ocean_ice_boundary, exchange_slow_to_fast_ice
use ice_model_mod, only: unpack_ocean_ice_boundary_calved_shelf_bergs
use ice_model_mod, only: ice_model_fast_cleanup, unpack_land_ice_boundary
use ice_model_mod, only: exchange_fast_to_slow_ice, update_ice_model_slow

Expand Down Expand Up @@ -512,6 +513,8 @@ program coupler_main
logical :: do_debug=.FALSE. !< If .TRUE. print additional debugging messages.
integer :: check_stocks = 0 ! -1: never 0: at end of run only n>0: every n coupled steps
logical :: use_hyper_thread = .false.
logical :: calve_ice_shelf_bergs = .false. !< If true, flux through a static ice front is converted
!!to point bergs

namelist /coupler_nml/ current_date, calendar, force_date_from_namelist, &
months, days, hours, minutes, seconds, dt_cpld, dt_atmos, &
Expand All @@ -521,7 +524,8 @@ program coupler_main
concurrent, do_concurrent_radiation, use_lag_fluxes, &
check_stocks, restart_interval, do_debug, do_chksum, &
use_hyper_thread, concurrent_ice, slow_ice_with_ocean, &
do_endpoint_chksum, combined_ice_and_ocean
do_endpoint_chksum, combined_ice_and_ocean, &
calve_ice_shelf_bergs

integer :: initClock, mainClock, termClock

Expand Down Expand Up @@ -751,6 +755,10 @@ program coupler_main
call fms_mpp_clock_begin(newClock10e)
call exchange_fast_to_slow_ice(Ice)
call fms_mpp_clock_end(newClock10e)
call fms_mpp_clock_begin(newClock10f)
if (Ice%slow_ice_pe .and. calve_ice_shelf_bergs) &
call unpack_ocean_ice_boundary_calved_shelf_bergs(Ice, Ocean_ice_boundary)
call fms_mpp_clock_end(newClock10f)
endif

if (Ice%fast_ice_pe) then
Expand Down Expand Up @@ -1004,6 +1012,10 @@ program coupler_main
call fms_mpp_clock_begin(newClock10e)
call exchange_fast_to_slow_ice(Ice)
call fms_mpp_clock_end(newClock10e)
call fms_mpp_clock_begin(newClock10f)
if (Ice%slow_ice_pe .and. calve_ice_shelf_bergs) &
call unpack_ocean_ice_boundary_calved_shelf_bergs(Ice, Ocean_ice_boundary)
call fms_mpp_clock_end(newClock10f)
endif

! ------ slow-ice model ------
Expand Down Expand Up @@ -1800,7 +1812,8 @@ subroutine coupler_init
endif
call fms_mpp_clock_begin(id_ocean_model_init)
call ocean_model_init( Ocean, Ocean_state, Time_init, Time, &
gas_fields_ocn=gas_fields_ocn )
gas_fields_ocn=gas_fields_ocn, &
calve_ice_shelf_bergs=calve_ice_shelf_bergs)
call fms_mpp_clock_end(id_ocean_model_init)

if (concurrent) then
Expand Down
59 changes: 57 additions & 2 deletions full/ice_ocean_flux_exchange.F90
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,17 @@ subroutine ice_ocean_flux_exchange_init(Time, Ice, Ocean, Ocean_state, ice_ocean
!frazil and sea_level are optional, if not present they should be nullified
allocate( ocean_ice_boundary%frazil(is:ie,js:je) )
allocate( ocean_ice_boundary%sea_level(is:ie,js:je) )
allocate( ocean_ice_boundary%calving(is:ie,js:je) )
allocate( ocean_ice_boundary%calving_hflx(is:ie,js:je) )
! initialize boundary fields for override experiments (mjh)
ocean_ice_boundary%u=0.0
ocean_ice_boundary%v=0.0
ocean_ice_boundary%t=273.0
ocean_ice_boundary%s=0.0
ocean_ice_boundary%frazil=0.0
ocean_ice_boundary%sea_level=0.0
ocean_ice_boundary%calving=0.0
ocean_ice_boundary%calving_hflx=0.0

! allocate fields for extra tracers in ocean_ice_boundary
if (.not.fms_coupler_type_initialized(ocean_ice_boundary%fields)) &
Expand Down Expand Up @@ -221,7 +225,7 @@ end subroutine ice_ocean_flux_exchange_init
!! fprec = mass of frozen precipitation since last
!! time step (Kg/m2)
!! runoff = mass of runoff since last time step (Kg/m2)
!! runoff = mass of calving since last time step (Kg/m2)
!! calving = mass of calving since last time step (Kg/m2)
!! p_surf = surface pressure (Pa)
!! </pre>
subroutine flux_ice_to_ocean ( Time, Ice, Ocean, Ice_Ocean_Boundary )
Expand Down Expand Up @@ -371,7 +375,9 @@ end subroutine flux_ice_to_ocean_finish
!! u_surf = zonal ocean current/ice motion (m/s)
!! v_surf = meridional ocean current/ice motion (m/s)
!! v_surf = meridional ocean current/ice motion (m/s)
!! sea_lev = sea level used to drive ice accelerations (m)
!! sea_lev = sea level used to drive ice accelerations (m)
!! calving = ice-sheet calving flux to ocean (kg m-2 s-1)
!! calving_hflx = heat flux associated with ice-sheet calving (W/m2)
!! </pre>
!!
!! \throw FATAL, "Ocean_Ice_Boundary%xtype must be DIRECT or REDIST."
Expand Down Expand Up @@ -408,6 +414,23 @@ subroutine flux_ocean_to_ice ( Time, Ocean, Ice, Ocean_Ice_Boundary )
endif
endif

if( ASSOCIATED(Ocean_Ice_Boundary%calving) ) then
if(do_area_weighted_flux) then
Ocean_Ice_Boundary%calving = Ocean%calving * Ocean%area
call divide_by_area(data=Ocean_Ice_Boundary%calving, area=Ice%area)
else
Ocean_Ice_Boundary%calving = Ocean%calving
endif
endif
if( ASSOCIATED(Ocean_Ice_Boundary%calving_hflx) ) then
if(do_area_weighted_flux) then
Ocean_Ice_Boundary%calving_hflx = Ocean%calving_hflx * Ocean%area
call divide_by_area(data=Ocean_Ice_Boundary%calving_hflx, area=Ice%area)
else
Ocean_Ice_Boundary%calving_hflx = Ocean%calving_hflx
endif
endif

! Extra fluxes
call fms_coupler_type_copy_data(Ocean%fields, Ocean_Ice_Boundary%fields)

Expand Down Expand Up @@ -438,6 +461,35 @@ subroutine flux_ocean_to_ice ( Time, Ocean, Ice, Ocean_Ice_Boundary )
else
call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%frazil, Ice%slow_Domain_NH, Ocean_Ice_Boundary%frazil)
endif
endif

if( ASSOCIATED(Ocean_Ice_Boundary%calving) ) then
if(do_area_weighted_flux) then
if (Ocean%is_ocean_pe) then
allocate(tmp(size(Ocean%area,1), size(Ocean%area,2)))
tmp(:,:) = Ocean%calving(:,:) * Ocean%area(:,:)
endif
call fms_mpp_domains_redistribute( Ocean%Domain, tmp, Ice%slow_Domain_NH, Ocean_Ice_Boundary%calving)
if (Ice%slow_ice_pe) &
call divide_by_area(data=Ocean_Ice_Boundary%calving, area=Ice%area)
if (Ocean%is_ocean_pe) deallocate(tmp)
else
call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%calving, Ice%slow_Domain_NH, Ocean_Ice_Boundary%calving)
endif
endif
if( ASSOCIATED(Ocean_Ice_Boundary%calving_hflx) ) then
if(do_area_weighted_flux) then
if (Ocean%is_ocean_pe) then
allocate(tmp(size(Ocean%area,1), size(Ocean%area,2)))
tmp(:,:) = Ocean%calving_hflx(:,:) * Ocean%area(:,:)
endif
call fms_mpp_domains_redistribute( Ocean%Domain, tmp, Ice%slow_Domain_NH, Ocean_Ice_Boundary%calving_hflx)
if (Ice%slow_ice_pe) &
call divide_by_area(data=Ocean_Ice_Boundary%calving_hflx, area=Ice%area)
if (Ocean%is_ocean_pe) deallocate(tmp)
else
call fms_mpp_domains_redistribute(Ocean%Domain, Ocean%calving_hflx, Ice%slow_Domain_NH, Ocean_Ice_Boundary%calving_hflx)
endif
endif

! Extra fluxes
Expand Down Expand Up @@ -469,6 +521,9 @@ subroutine flux_ocean_to_ice_finish( Time, Ice, Ocean_Ice_Boundary )
call fms_data_override('ICE', 's', Ocean_Ice_Boundary%s, Time)
call fms_data_override('ICE', 'frazil', Ocean_Ice_Boundary%frazil, Time)
call fms_data_override('ICE', 'sea_level', Ocean_Ice_Boundary%sea_level, Time)
!Ice-shelf calving
call fms_data_override('ICE', 'IS_calving', Ocean_Ice_Boundary%calving, Time)
call fms_data_override('ICE', 'IS_calving_hflx', Ocean_Ice_Boundary%calving_hflx, Time)
call fms_coupler_type_data_override('ICE', Ocean_Ice_Boundary%fields, Time)

! Perform diagnostic output for the ocean_ice_boundary fields
Expand Down

0 comments on commit 3e80bbc

Please sign in to comment.