From 10cb7fceda46d4826cd8419716967c6e66dac711 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Tue, 6 Feb 2024 15:53:58 -0800 Subject: [PATCH 01/26] Add basal melt draft dependence subroutine --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index 53281228e76f..178793465831 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -583,6 +583,117 @@ end subroutine li_basal_melt_floating_ice !*********************************************************************** +!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +! +! ! routine basal_melt_draft_dependence +! +!> \brief Calculate ice shelf melt rate from depth param. +!> \author Shivaprakash Muruganandham +!> \date February 2024 +!> \details +!> Melt rate parameterization from: +!> Seroussi, H., Y. Nakayama, E. Larour, D. Menemenlis, M. Morlighem, E. Rignot, and A. Khazendar (2017), +!> Continued retreat of Thwaites Glacier, West Antarctica, controlled by bed topography and ocean circulation, +!> Geophys. Res. Lett., 1-9, doi:10.1002/2017GL072910. +!> for Thwaites Glacier. +!> Specifically, this is similar to the linear fit of melt with shelf draft from the Supplemental Information, Figure S1. +!> The linear relation is modified by a: +!> * depth above which there is no melt (Antarctic Surface Water saturation) +!> * a maximum melt rate (Circumpolar Deep Water saturation) +!> * a depth below which melt stops increasing (minimum sill height) + +!----------------------------------------------------------------------- + + subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, lowerSurface, cellMask, & + config_sea_level, config_ice_density, nCellsSolve, err) + + !----------------------------------------------------------------- + ! input variables + !----------------------------------------------------------------- + !real(kind=RKIND), pointer, intent(in) :: daysSinceStart + !real (kind=RKIND), dimension(:), pointer, intent(in) :: lowerSurface !< lower surface elevation (m) + !integer, dimension(:), pointer, intent(in) :: & + ! cellMask !< bit mask describing whether ice is floating, dynamically active, etc. + !real(kind=RKIND), pointer, intent(in) :: & + ! config_sea_level !< sea level (m) relative to z = 0 + !real (kind=RKIND), pointer, intent(in) :: config_ice_density !< ice density + !integer, pointer :: & + ! nCellsSolve !< number of locally owned cells + + !----------------------------------------------------------------- + ! input/output variables + !----------------------------------------------------------------- + + !----------------------------------------------------------------- + ! output variables + !----------------------------------------------------------------- + !real (kind=RKIND), dimension(:), pointer, intent(out) :: & + ! floatingBasalMassBal !< basal mass balance for floating ice + !integer, intent(out) :: err !< Output: error flag + + !----------------------------------------------------------------- + ! local variables + !----------------------------------------------------------------- + !real (kind=RKIND) :: slopeSer ! slope of relation between depth and melt rate + !real (kind=RKIND) :: interceptSer ! depth at which melting goes to 0 + !real (kind=RKIND) :: maxMeltSer ! maximum allowable melt rate + !real (kind=RKIND) :: sillDepth ! depth below which melt rate no longer increases + !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_amplitude + !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_period + !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_phase + !real(kind=RKIND) :: hCavity ! depth of ice cavity beneath floating ice (m) + !real(kind=RKIND) :: zDraft ! draft of floating ice (m below sea level) + !integer :: iCell + + + !err = 0 + + !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_amplitude', & + ! config_basal_mass_bal_seroussi_amplitude) ! meters + !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_period', & + ! config_basal_mass_bal_seroussi_period) ! years + !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_phase', & + ! config_basal_mass_bal_seroussi_phase) ! cycles + + !slopeSer = 0.088_RKIND ! slope of relation between depth and melt rate (melt (m/yr) per depth (m)) + !interceptSer = -100.0_RKIND ! depth (m) at which melting goes to 0 (negative meaning below sea level) + !maxMeltSer = 50.0_RKIND ! maximum allowable melt rate (m/yr) (positive meaning melting) + !sillDepth = -650.0_RKIND ! depth below which melt stops increasing (m) (negative meaning below sea level) + + !if (config_basal_mass_bal_seroussi_period <= 0.0_RKIND) then + ! call mpas_log_write("Value for config_basal_mass_bal_seroussi_period has to be a positive real value.", MPAS_LOG_ERR) + ! err = ior(err, 1) + !endif + + ! Modify intercept height for variability parameters + !interceptSer = interceptSer + config_basal_mass_bal_seroussi_amplitude * & + ! sin( (2.0_RKIND * pii / config_basal_mass_bal_seroussi_period) * (daysSinceStart/365.0_RKIND) & + ! + 2.0_RKIND * pii * config_basal_mass_bal_seroussi_phase) + + ! Initialize before computing + !floatingBasalMassBal(:) = 0.0_RKIND + + !do iCell = 1, nCellsSolve + + ! Shut off melt at an arbitrary shallow depth to discourage ice from disappearing. + !if ( (li_mask_is_floating_ice(cellMask(iCell))) .and. (lowerSurface(iCell) < -10.0_RKIND) ) then + ! ice is present and floating + + !zDraft = lowerSurface(iCell) - config_sea_level + ! Coefficients for m/yr melt rate (in units of Seroussi figure but without negative meaning melting) + !floatingBasalMassBal(iCell) = max(-1.0_RKIND * maxMeltSer, min(0.0_RKIND, slopeSer * & + ! (max(zDraft, sillDepth) - interceptSer))) + + !endif ! ice is present + !enddo ! iCell + + ! change units from m/yr to kg/m2/s + !floatingBasalMassBal(:) = floatingBasalMassBal(:) * config_ice_density / scyr + + + end subroutine basal_melt_draft_dependence +!----------------------------------------------------------------------- + !||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ! From d95b39c7d39a7335e4428c49371d3502c3838504 Mon Sep 17 00:00:00 2001 From: Matthew Hoffman Date: Wed, 7 Feb 2024 14:50:19 -0800 Subject: [PATCH 02/26] add driver changes for calculate_aislens_melt_variability_adjustment Add Registry and ice shelf melt driver changes to support new calculate_aislens_melt_variability_adjustment subroutine call --- .../mpas-albany-landice/src/Registry.xml | 11 ++- .../src/mode_forward/mpas_li_iceshelf_melt.F | 94 +++++++++++++------ 2 files changed, 75 insertions(+), 30 deletions(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index 06bf6c6c9399..71006d2635e5 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -370,7 +370,11 @@ description="Selection of the method for computing the basal mass balance of floating ice. 'none' sets the basalMassBal field to 0 everywhere. 'file' uses without modification whatever value was read in through an input or forcing file or the value set by an ESM coupler. 'constant', 'mismip', 'seroussi' use hardcoded fields defined in the code applicable to Thwaites Glacier. 'temperature_profile' generates a depth-melt relation based on an ocean temperature profile and sill depth. ISMIP6 is the method prescribed by ISMIP6." possible_values="'none', 'file', 'constant', 'mismip', 'seroussi', 'temperature_profile', 'ismip6'" /> - + @@ -1301,7 +1305,10 @@ is the value of that variable from the *previous* time level! - + domain % blocklist + do while (associated(block)) + + ! get pools + call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) + call mpas_pool_get_subpool(block % structs, 'geometry', geometryPool) + + ! get dimensions + call mpas_pool_get_dimension(meshPool, 'nCellsSolve', nCellsSolve) + + ! get fields from the mesh pool + call mpas_pool_get_array(meshPool, 'daysSinceStart',daysSinceStart) + + ! get fields from the geometry pool + call mpas_pool_get_array(geometryPool, 'thickness', thickness) + call mpas_pool_get_array(geometryPool, 'lowerSurface', lowerSurface) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'floatingBasalMassBal', floatingBasalMassBal) + call mpas_pool_get_array(geometryPool, 'floatingBasalMassBalAdjustment', floatingBasalMassBalAdjustment) + + call mpas_pool_get_config(liConfigs, 'config_bmlt_variability_modifier', config_bmlt_variability_modifier) + if (config_bmlt_variability_modifier) then + call calculate_aislens_melt_variability_adjustment( & + nCellsSolve, & + config_sea_level, config_ice_density, & + daysSinceStart, & + lowerSurface, cellMask, & + floatingBasalMassBalAdjustment, err) + endif + + floatingBasalMassBal(:) = floatingBasalMassBal(:) + floatingBasalMassBalAdjustment(:) + + block => block % next + enddo ! associated(block) + + ! Allocate scratch fields for flood-fill ! Note: This only supports one block per processor call mpas_pool_get_subpool(domain % blocklist % structs, 'scratch', scratchPool) @@ -585,40 +628,35 @@ end subroutine li_basal_melt_floating_ice !||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ! -! ! routine basal_melt_draft_dependence +! ! routine calculate_aislens_melt_variability_adjustment ! !> \brief Calculate ice shelf melt rate from depth param. !> \author Shivaprakash Muruganandham !> \date February 2024 !> \details -!> Melt rate parameterization from: -!> Seroussi, H., Y. Nakayama, E. Larour, D. Menemenlis, M. Morlighem, E. Rignot, and A. Khazendar (2017), -!> Continued retreat of Thwaites Glacier, West Antarctica, controlled by bed topography and ocean circulation, -!> Geophys. Res. Lett., 1-9, doi:10.1002/2017GL072910. -!> for Thwaites Glacier. -!> Specifically, this is similar to the linear fit of melt with shelf draft from the Supplemental Information, Figure S1. -!> The linear relation is modified by a: -!> * depth above which there is no melt (Antarctic Surface Water saturation) -!> * a maximum melt rate (Circumpolar Deep Water saturation) -!> * a depth below which melt stops increasing (minimum sill height) - +!> !----------------------------------------------------------------------- - subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, lowerSurface, cellMask, & - config_sea_level, config_ice_density, nCellsSolve, err) + subroutine calculate_aislens_melt_variability_adjustment( & + nCellsSolve, & + config_sea_level, config_ice_density, & + daysSinceStart, & + lowerSurface, cellMask, & + floatingBasalMassBalAdjustment, & + err) !----------------------------------------------------------------- ! input variables !----------------------------------------------------------------- - !real(kind=RKIND), pointer, intent(in) :: daysSinceStart - !real (kind=RKIND), dimension(:), pointer, intent(in) :: lowerSurface !< lower surface elevation (m) - !integer, dimension(:), pointer, intent(in) :: & - ! cellMask !< bit mask describing whether ice is floating, dynamically active, etc. - !real(kind=RKIND), pointer, intent(in) :: & - ! config_sea_level !< sea level (m) relative to z = 0 - !real (kind=RKIND), pointer, intent(in) :: config_ice_density !< ice density - !integer, pointer :: & - ! nCellsSolve !< number of locally owned cells + real(kind=RKIND), pointer, intent(in) :: daysSinceStart + real (kind=RKIND), dimension(:), pointer, intent(in) :: lowerSurface !< lower surface elevation (m) + integer, dimension(:), pointer, intent(in) :: & + cellMask !< bit mask describing whether ice is floating, dynamically active, etc. + real(kind=RKIND), pointer, intent(in) :: & + config_sea_level !< sea level (m) relative to z = 0 + real (kind=RKIND), pointer, intent(in) :: config_ice_density !< ice density + integer, pointer :: & + nCellsSolve !< number of locally owned cells !----------------------------------------------------------------- ! input/output variables @@ -627,9 +665,9 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low !----------------------------------------------------------------- ! output variables !----------------------------------------------------------------- - !real (kind=RKIND), dimension(:), pointer, intent(out) :: & - ! floatingBasalMassBal !< basal mass balance for floating ice - !integer, intent(out) :: err !< Output: error flag + real (kind=RKIND), dimension(:), pointer, intent(out) :: & + floatingBasalMassBalAdjustment !< basal mass balance adjustment + integer, intent(out) :: err !< Output: error flag !----------------------------------------------------------------- ! local variables @@ -646,7 +684,7 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low !integer :: iCell - !err = 0 + err = 0 !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_amplitude', & ! config_basal_mass_bal_seroussi_amplitude) ! meters @@ -691,7 +729,7 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low !floatingBasalMassBal(:) = floatingBasalMassBal(:) * config_ice_density / scyr - end subroutine basal_melt_draft_dependence + end subroutine calculate_aislens_melt_variability_adjustment !----------------------------------------------------------------------- From 645cb06edf8b17f5fe2d4fe52abee8f156def24e Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 15 Feb 2024 08:09:09 -0800 Subject: [PATCH 03/26] Define draft dependence function for basal melt adjustment Add linear draft-dependent (spatial dependence) basal melt adjustment for AISLENS generator. --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index ea1c3eff6427..89f33d7fc32f 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -630,10 +630,16 @@ end subroutine li_basal_melt_floating_ice ! ! ! routine calculate_aislens_melt_variability_adjustment ! -!> \brief Calculate ice shelf melt rate from depth param. +!> \brief Calculate the draft dependent ice shelf melt rate component +! from the draft params. !> \author Shivaprakash Muruganandham !> \date February 2024 -!> \details +!> \details A melt rate parameterization with a linear melt rate - draft +! relationship. In the variability ensemble generator workflow, +! this adjustment is the F_d(x_0) term in Eqn 1, from +! Muruganandham, S., Robel, A. A., Hoffman, M. J., & Price, S. (2023). +! Statistical Generation of Ocean Forcing With Spatiotemporal Variability for Ice Sheet Models. +! Computing in Science & Engineering. !> !----------------------------------------------------------------------- @@ -672,20 +678,37 @@ subroutine calculate_aislens_melt_variability_adjustment( & !----------------------------------------------------------------- ! local variables !----------------------------------------------------------------- - !real (kind=RKIND) :: slopeSer ! slope of relation between depth and melt rate - !real (kind=RKIND) :: interceptSer ! depth at which melting goes to 0 + + ! slopeSer and interceptSer variables: should they be defined as + ! input or local variables for this subroutine? + + real (kind=RKIND) :: slopeSer ! slope of relation between depth and melt rate + real (kind=RKIND) :: interceptSer ! depth at which melting goes to 0 !real (kind=RKIND) :: maxMeltSer ! maximum allowable melt rate !real (kind=RKIND) :: sillDepth ! depth below which melt rate no longer increases !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_amplitude !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_period !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_phase !real(kind=RKIND) :: hCavity ! depth of ice cavity beneath floating ice (m) - !real(kind=RKIND) :: zDraft ! draft of floating ice (m below sea level) + real(kind=RKIND) :: zDraft ! draft of floating ice (m below sea level) !integer :: iCell err = 0 + + !Input field values for slopeSer(iCell) and interceptSer(iCell) + !from file + + do iCell = 1, nCellsSolve + zDraft(iCell) = lowerSurface(iCell) - config_sea_level + floatingBasalMassBalAdjustment(iCell) = interceptSer(iCell) + & + zDraft(iCell) * slopeSer(iCell) + enddo ! iCell + + ! Optional if below is required within subroutine: + ! floatingBasalMassBalAdjustment(:) = floatingBasalMassBalAdjustment(:) * config_ice_density / scyr + !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_amplitude', & ! config_basal_mass_bal_seroussi_amplitude) ! meters !call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_seroussi_period', & @@ -703,6 +726,7 @@ subroutine calculate_aislens_melt_variability_adjustment( & ! err = ior(err, 1) !endif + ! Modify intercept height for variability parameters !interceptSer = interceptSer + config_basal_mass_bal_seroussi_amplitude * & ! sin( (2.0_RKIND * pii / config_basal_mass_bal_seroussi_period) * (daysSinceStart/365.0_RKIND) & From 423292d80da3a3e816ce597df9b6dfd7e7b453ac Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 15 Feb 2024 09:06:20 -0800 Subject: [PATCH 04/26] Update draft dependence function for basalMassBalAdjustment Add slopeGen and interceptGen coefficients for the draft dependence --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index 89f33d7fc32f..72af17b168ea 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -682,8 +682,8 @@ subroutine calculate_aislens_melt_variability_adjustment( & ! slopeSer and interceptSer variables: should they be defined as ! input or local variables for this subroutine? - real (kind=RKIND) :: slopeSer ! slope of relation between depth and melt rate - real (kind=RKIND) :: interceptSer ! depth at which melting goes to 0 + real (kind=RKIND), pointer :: config_basal_mass_bal_adj_aislens_slopeGen ! slope of relation between depth and melt rate + real (kind=RKIND), pointer :: config_basal_mass_bal_adj_aislens_interceptGen ! intercept for draft dependence parameterization of basal melt melting !real (kind=RKIND) :: maxMeltSer ! maximum allowable melt rate !real (kind=RKIND) :: sillDepth ! depth below which melt rate no longer increases !real (kind=RKIND), pointer :: config_basal_mass_bal_seroussi_amplitude @@ -699,11 +699,16 @@ subroutine calculate_aislens_melt_variability_adjustment( & !Input field values for slopeSer(iCell) and interceptSer(iCell) !from file + call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_adj_aislens_slopeGen') !, & + !config_basal_mass_bal_seroussi_amplitude) ! meters + call mpas_pool_get_config(liConfigs, 'config_basal_mass_bal_adj_aislens_interceptGen') !, & + ! config_basal_mass_bal_seroussi_period + do iCell = 1, nCellsSolve zDraft(iCell) = lowerSurface(iCell) - config_sea_level - floatingBasalMassBalAdjustment(iCell) = interceptSer(iCell) + & - zDraft(iCell) * slopeSer(iCell) + floatingBasalMassBalAdjustment(iCell) = config_basal_mass_bal_adj_aislens_interceptGen(iCell) + & + zDraft(iCell) * config_basal_mass_bal_adj_aislens_slopeGen(iCell) enddo ! iCell ! Optional if below is required within subroutine: From 86c68d25e240e48e7978accb46d0039085433b41 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 15 Feb 2024 16:08:23 -0800 Subject: [PATCH 05/26] Add draft dependent co-efficient variables for the aislens ice shelf melt generator Define draft dependence function variables for calculating floatingBasalMassBalAdjustment in aislens basalMassBal adjustment subroutine --- components/mpas-albany-landice/src/Registry.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index 71006d2635e5..6f3384488a44 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -856,6 +856,9 @@ + + + - - + + + + - + @@ -859,10 +843,9 @@ - - + + - - + From 860da877857b23478bdb51a26cbfad7b39e08d98 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Fri, 8 Mar 2024 07:44:31 -0800 Subject: [PATCH 11/26] Cleanup comments --- components/mpas-albany-landice/src/Registry.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index fec4359ebc24..004c6bdd61e4 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -845,8 +845,6 @@ - - - - + + + + + + @@ -1296,11 +1301,11 @@ is the value of that variable from the *previous* time level! - - Date: Fri, 8 Mar 2024 10:13:18 -0800 Subject: [PATCH 14/26] Remove package assignment for floatingBasalMassBalAdjustment --- components/mpas-albany-landice/src/Registry.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index c2ac406c7e87..e1fa6fc8e3b3 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -843,10 +843,10 @@ - + - + - + From 0881254908b5f306723b1a29e9830e196897ae87 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Mon, 18 Mar 2024 11:49:00 -0400 Subject: [PATCH 15/26] Clean up draft_dependence ice shelf basal melt method Delete stray comments from previously defined seroussi method Co-authored-by: Trevor Hillebrand --- .../mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F | 1 - 1 file changed, 1 deletion(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index fb08dbb9b731..e24c2ef55818 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -663,7 +663,6 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low floatingBasalMassBal(:) = 0.0_RKIND do iCell = 1, nCellsSolve - ! Shut off melt at an arbitrary shallow depth to discourage ice from disappearing. if ( li_mask_is_floating_ice(cellMask(iCell))) then ! ice is present and floating From 52e9091666753a8f1860a706a31aac2287b8beea Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Mon, 18 Mar 2024 11:49:53 -0400 Subject: [PATCH 16/26] Clean up draft_dependence ice shelf basal melt method Co-authored-by: Trevor Hillebrand --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index e24c2ef55818..0d8a9f54ebcb 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -480,7 +480,7 @@ subroutine li_basal_melt_floating_ice(domain, err) ! change units from m/s to kg/m2/s floatingBasalMassBal(:) = floatingBasalMassBal(:) * config_ice_density - elseif (trim(config_basal_mass_bal_float) =='draft_dependence') then + elseif (trim(config_basal_mass_bal_float) == 'draft_dependence') then call mpas_pool_get_array(geometryPool, 'draftDepenBasalMeltAlpha1', draftDepenBasalMeltAlpha1) call mpas_pool_get_array(geometryPool, 'draftDepenBasalMeltAlpha0', draftDepenBasalMeltAlpha0) From 1c6788940ac56f264c88f8c709487ca357910f4d Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Tue, 16 Jul 2024 11:01:17 -0400 Subject: [PATCH 17/26] Update floatingBasalMassBal calculation for consistent SI units Update components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F Co-authored-by: Trevor Hillebrand --- .../mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F | 1 - 1 file changed, 1 deletion(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index 0d8a9f54ebcb..ca2d19e3a5a6 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -672,7 +672,6 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low enddo ! iCell ! change units from m/yr to kg/m2/s - floatingBasalMassBal(:) = floatingBasalMassBal(:) * config_ice_density / scyr end subroutine basal_melt_draft_dependence From 6eccc97ff045fab1994061ea74489447ffd484a4 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Mon, 21 Jul 2025 14:49:18 -0400 Subject: [PATCH 18/26] Add minDraft variable description to draft_dependence parameterization package --- components/mpas-albany-landice/src/Registry.xml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index e1fa6fc8e3b3..d5e703d23d59 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -367,9 +367,9 @@ + description="Selection of the method for computing the basal mass balance of floating ice. 'none' sets the basalMassBal field to 0 everywhere. 'file' uses without modification whatever value was read in through an input or forcing file or the value set by an ESM coupler. 'constant' uses the constant value defined by the heat flux config_bmlt_float_flux and restricted to the region of the domain defined by config_bmlt_float_xlimit. 'mismip' uses the method prescribed for MISMIP+. 'draft_dependence' calculates draft dependent floatingBasalMassBal using draftDepenBasalMelt_minDraft, draftDepenBasalMeltAlpha1 and draftDepenBasalMeltAlpha0. 'temperature_profile' generates a depth-melt relation based on an ocean temperature profile and sill depth. ISMIP6 is the method prescribed by ISMIP6." + possible_values="'none', 'file', 'constant', 'mismip', 'draft_dependence', 'temperature_profile', 'ismip6'" + /> + @@ -956,6 +957,7 @@ + @@ -1301,6 +1303,9 @@ is the value of that variable from the *previous* time level! + From 0a9f3dd17ddd9b17d1dc0c2826f425106ab4dd12 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Mon, 21 Jul 2025 15:30:51 -0400 Subject: [PATCH 19/26] Add minimum draft threshold to draft-dependent basal melt calculation - Introduce new parameter: draftDepenBasalMelt_minDraft - Linear draft dependence (alpha0 + alpha1 * zDraft) is now only applied when zDraft >= minDraft - For zDraft < minDraft, basal melt is set to alpha0 only (no dependence on draft) --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index ca2d19e3a5a6..1d0dce43316c 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -279,7 +279,7 @@ subroutine li_basal_melt_floating_ice(domain, err) bedTopography ! bed topography (m; negative below sea level) real (kind=RKIND), dimension(:), pointer :: & - draftDepenBasalMeltAlpha0, draftDepenBasalMeltAlpha1 ! variables used for basal melt draft dependence + draftDepenBasalMelt_minDraft, draftDepenBasalMeltAlpha0, draftDepenBasalMeltAlpha1 ! variables used for basal melt draft dependence real(kind=RKIND), pointer :: daysSinceStart @@ -484,8 +484,9 @@ subroutine li_basal_melt_floating_ice(domain, err) call mpas_pool_get_array(geometryPool, 'draftDepenBasalMeltAlpha1', draftDepenBasalMeltAlpha1) call mpas_pool_get_array(geometryPool, 'draftDepenBasalMeltAlpha0', draftDepenBasalMeltAlpha0) + call mpas_pool_get_array(geometryPool, 'draftDepenBasalMelt_minDraft', draftDepenBasalMelt_minDraft) call basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, lowerSurface, cellMask, & - config_sea_level, config_ice_density, nCellsSolve, draftDepenBasalMeltAlpha1, draftDepenBasalMeltAlpha0, err_tmp) + config_sea_level, config_ice_density, nCellsSolve, draftDepenBasalMeltAlpha1, draftDepenBasalMeltAlpha0, draftDepenBasalMelt_minDraft, err_tmp) err = ior(err, err_tmp) elseif (trim(config_basal_mass_bal_float) == 'temperature_profile') then @@ -620,11 +621,13 @@ end subroutine li_basal_melt_floating_ice !> In its current form, this is a linear function form, with the draft !> dependent melt component calculated as: !> melt = alpha0 + (draft * alpha1) +!> The linear relationship is modified by: +!> * minDraft: a depth upto which melt is a constant minimum (=alpha0) !----------------------------------------------------------------------- subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, lowerSurface, cellMask, & - config_sea_level, config_ice_density, nCellsSolve, draftDepenBasalMeltAlpha0, draftDepenBasalMeltAlpha1, err) + config_sea_level, config_ice_density, nCellsSolve, draftDepenBasalMeltAlpha0, draftDepenBasalMeltAlpha1, draftDepenBasalMelt_minDraft, err) !----------------------------------------------------------------- ! input variables @@ -640,6 +643,7 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low nCellsSolve !< number of locally owned cells real (kind=RKIND), dimension(:), pointer :: draftDepenBasalMeltAlpha1 ! slope for (linear) draft dependent parameterization of basal melt real (kind=RKIND), dimension(:), pointer :: draftDepenBasalMeltAlpha0 ! intercept for (linear) draft dependent parameterization of basal melt + real (kind=RKIND), dimension(:), pointer :: draftDepenBasalMelt_minDraft ! min draft at which (linear) draft dependent parameterization of basal melt is valid !----------------------------------------------------------------- ! input/output variables !----------------------------------------------------------------- @@ -665,9 +669,15 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low do iCell = 1, nCellsSolve if ( li_mask_is_floating_ice(cellMask(iCell))) then ! ice is present and floating - zDraft = lowerSurface(iCell) - config_sea_level - floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + zDraft * draftDepenBasalMeltAlpha1(iCell) + ! If the draft is deeper than or equal to the minimum threshold, apply linear draft dependence + if (zDraft >= draftDepenBasalMelt_minDraft(iCell)) then + ! Linear draft dependence: melt = alpha0 + alpha1 * draft + floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + zDraft * draftDepenBasalMeltAlpha1(iCell) + else + ! For shallower draft, use only the intercept (alpha0) + floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + end if ! linear dependence cutoff draft endif ! ice is floating enddo ! iCell From 7fbc8e0d7721ade472227f3fa07b51a89f51f9bf Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 31 Jul 2025 17:56:36 -0400 Subject: [PATCH 20/26] Update draft dependence function to be piecewise continuous --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index 1d0dce43316c..e8c79cb66e21 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -675,8 +675,9 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low ! Linear draft dependence: melt = alpha0 + alpha1 * draft floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + zDraft * draftDepenBasalMeltAlpha1(iCell) else - ! For shallower draft, use only the intercept (alpha0) - floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + ! For shallower draft, use a melt rate calculated for the + ! minDraft threshold + floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + draftDepenBasalMelt_minDraft(iCell) * draftDepenBasalMeltAlpha1(iCell) end if ! linear dependence cutoff draft endif ! ice is floating enddo ! iCell From df2a475b7f8cd30d0850308a9a1a6ab1c35eda69 Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 31 Jul 2025 18:03:57 -0400 Subject: [PATCH 21/26] Update draft dependence subroutine --- .../src/mode_forward/mpas_li_iceshelf_melt.F | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F index e8c79cb66e21..76705759a954 100644 --- a/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F +++ b/components/mpas-albany-landice/src/mode_forward/mpas_li_iceshelf_melt.F @@ -675,8 +675,8 @@ subroutine basal_melt_draft_dependence(floatingBasalMassBal, daysSinceStart, low ! Linear draft dependence: melt = alpha0 + alpha1 * draft floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + zDraft * draftDepenBasalMeltAlpha1(iCell) else - ! For shallower draft, use a melt rate calculated for the - ! minDraft threshold + ! For shallower draft, use a melt rate calculated for the minDraft threshold + ! TODO: Add options for shallow draft melt rate to be set to constant values (0,or ice shelf mean melt rates) floatingBasalMassBal(iCell) = draftDepenBasalMeltAlpha0(iCell) + draftDepenBasalMelt_minDraft(iCell) * draftDepenBasalMeltAlpha1(iCell) end if ! linear dependence cutoff draft endif ! ice is floating From 8f0a51d1790e9522e15d0b5cc88e4f3b52da576c Mon Sep 17 00:00:00 2001 From: Shivaprakash Muruganandham Date: Thu, 31 Jul 2025 18:41:00 -0400 Subject: [PATCH 22/26] Update draft_dependence variable descriptions --- components/mpas-albany-landice/src/Registry.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index d5e703d23d59..f120af3bc6ea 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -1303,7 +1303,7 @@ is the value of that variable from the *previous* time level! - Date: Sat, 2 Aug 2025 21:03:20 -0400 Subject: [PATCH 23/26] Update draft dependence subroutine (add selector and constant melt value fields) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This scheme allows each floating cell to use a different functional form for mean basal melt as a function of draft: - Linear: paramType=0 uses Alpha0 + Alpha1 * max(zDraft, minDraft). - Constant: paramType=1 uses value from the constantValue field. For zero melt, set constantValue=0.0. - Assign parameterization type and corresponding coefficients/value for each shelf/cell. - The physical units are currently NOT converted from m/yr to kg/m²/s in the subroutine, the input fields are to be in SI Units. - Time-dependent variability should be applied via `floatingBasalMassBalAdjustment` after this mean is computed. --- .../mpas-albany-landice/src/Registry.xml | 10 ++++++ .../src/mode_forward/mpas_li_iceshelf_melt.F | 36 +++++++++++++------ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml index f120af3bc6ea..fcac4ae5712d 100644 --- a/components/mpas-albany-landice/src/Registry.xml +++ b/components/mpas-albany-landice/src/Registry.xml @@ -846,6 +846,8 @@ + +