diff --git a/components/mpas-ocean/src/Registry.xml b/components/mpas-ocean/src/Registry.xml
index dd218f789e4f..b5ca6388df9b 100644
--- a/components/mpas-ocean/src/Registry.xml
+++ b/components/mpas-ocean/src/Registry.xml
@@ -1339,6 +1339,10 @@
description="If true, use take into account the ssh gradient across previously flux-limited edges in the wetting and drying algorithm"
possible_values=".true. or .false."
/>
+
0
+ ssh_land_ice_adjustment(iCell) = landIceMask(iCell) * &
+ min(ssh_floatation(iCell) - ssh_crit, 0.0_RKIND)
+ end do
+ !$omp end do
+ !$omp end parallel
+
+ end subroutine ocn_compute_land_ice_ssh_adjustment
+
!***********************************************************************
!
! routine ocn_wetting_drying_verify
@@ -237,26 +353,32 @@ subroutine ocn_prevent_drying_rk4(domain, block, dt, rkSubstepWeight, config_zer
!-----------------------------------------------------------------
- type (mpas_pool_type), pointer :: tendPool
- type (mpas_pool_type), pointer :: statePool
- type (mpas_pool_type), pointer :: provisStatePool
- real (kind=RKIND), dimension(:, :), pointer :: layerThicknessCur
- real (kind=RKIND), dimension(:, :), pointer :: layerThicknessProvis
- real (kind=RKIND), dimension(:, :), pointer :: normalVelocity
+ type (mpas_pool_type), pointer :: tendPool
+ type (mpas_pool_type), pointer :: statePool
+ type (mpas_pool_type), pointer :: provisStatePool
+ type (mpas_pool_type), pointer :: forcingPool
+ real (kind=RKIND), dimension(:), pointer :: landIcePressure, landIceDraft
+ integer, dimension(:), pointer :: landIceMask
+ real (kind=RKIND), dimension(:, :), pointer :: layerThicknessCur
+ real (kind=RKIND), dimension(:, :), pointer :: layerThicknessProvis
+ real (kind=RKIND), dimension(:, :), pointer :: normalVelocity
- integer :: iEdge, k
+ integer :: iEdge, k
- err = 0
+ err = 0
call mpas_pool_get_subpool(block % structs, 'tend', tendPool)
call mpas_pool_get_subpool(block % structs, 'state', statePool)
call mpas_pool_get_subpool(block % structs, 'provis_state', provisStatePool)
+ call mpas_pool_get_subpool(block % structs, 'forcing', forcingPool)
call mpas_pool_get_array(statePool, 'normalVelocity', normalVelocity, 1)
! use thickness at n because constraint is h_n + dt*T_h > h_min
call mpas_pool_get_array(statePool, 'layerThickness', layerThicknessCur, 1)
call mpas_pool_get_array(provisStatePool, 'layerThickness', layerThicknessProvis, 1)
-
+ call mpas_pool_get_array(forcingPool, 'landIceMask', landIceMask)
+ call mpas_pool_get_array(forcingPool, 'landIceDraft', landIceDraft)
+ call mpas_pool_get_array(forcingPool, 'landIcePressure', landIcePressure)
!$omp parallel
!$omp do schedule(runtime)
@@ -269,8 +391,10 @@ subroutine ocn_prevent_drying_rk4(domain, block, dt, rkSubstepWeight, config_zer
! ensure cells stay wet by selectively damping cells with a damping tendency to make
! sure tendency doesn't dry cells
- call ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerThicknessCur, layerThicknessProvis, &
- normalTransportVelocity, rkSubstepWeight, wettingVelocityFactor, err)
+ call ocn_wetting_drying_wettingVelocity( &
+ domain, layerThickEdgeFlux, layerThicknessCur, layerThicknessProvis, &
+ normalTransportVelocity, rkSubstepWeight, &
+ landIceMask, landIcePressure, landIceDraft, wettingVelocityFactor, err)
! prevent drying from happening with selective wettingVelocityFactor
if (config_zero_drying_velocity) then
@@ -309,7 +433,8 @@ end subroutine ocn_prevent_drying_rk4 !}}}
!-----------------------------------------------------------------------
subroutine ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerThicknessCur, layerThicknessProvis, &
- normalVelocity, dt, wettingVelocityFactor, err)!{{{
+ normalVelocity, dt, landIceMask, landIcePressure, landIceDraft, &
+ wettingVelocityFactor, err)!{{{
!-----------------------------------------------------------------
!
@@ -332,6 +457,11 @@ subroutine ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerT
real (kind=RKIND), intent(in) :: &
dt !< Input: time step
+ integer, dimension(:), intent(in) :: landIceMask
+
+ real (kind=RKIND), dimension(:), intent(in) :: &
+ landIcePressure, landIceDraft
+
!-----------------------------------------------------------------
!
! input/output variables
@@ -367,10 +497,14 @@ subroutine ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerT
character (len=100) :: log_string
- integer:: cellDummy(2), cellCur, CellNei
+ integer:: cellDummy(2), cellCur, CellNei, nVertLevelsCell
real (kind=RKIND) :: sshCur, sshNei
real (kind=RKIND), dimension(:), pointer :: sshCell
real (kind=RKIND), dimension(:, :), pointer :: layerThicknessCell
+ real (kind=RKIND), dimension(:), allocatable :: sshLandIceAdjustment
+ !< amount by which to adjust ssh related to
+ !< the initial adjustment of land ice pressure
+ !< effects on ssh
err = 0
@@ -409,6 +543,22 @@ subroutine ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerT
end do
layerThicknessCell(k, iCell) = min(layerThicknessProvis(k, iCell), layerThicknessCur(k, iCell)) + dt * divOutFlux
+ end do
+ end do
+ !$omp end do
+ !$omp end parallel
+
+ allocate(sshLandIceAdjustment(nCellsAll))
+ sshLandIceAdjustment(:) = 0.0_RKIND
+ call ocn_compute_land_ice_ssh_adjustment(landIcePressure, landIceMask, sshLandIceAdjustment, err)
+
+ !$omp parallel
+ !$omp do schedule(runtime) private(k, nVertLevelsCell)
+ do iCell = 1, nCellsAll
+ nVertLevelsCell = maxLevelCell(iCell) - minLevelCell(iCell) + 1
+ do k = minLevelCell(iCell), maxLevelCell(iCell)
+ layerThicknessCell(k, iCell) = layerThicknessCell(k, iCell) + &
+ sshLandIceAdjustment(iCell) / nVertLevelsCell
if ( .not. config_use_ssh_gradient_wetting_drying ) then
call ocn_wetting_velocity_factor_on_cell_edges( &
wettingVelocityFactor, layerThicknessCell(k, iCell), normalVelocity, iCell, k)
@@ -458,7 +608,7 @@ subroutine ocn_wetting_drying_wettingVelocity(domain, layerThickEdgeFlux, layerT
do k = minLevelCell(iCell), maxLevelCell(iCell)
columnThickness = columnThickness + layerThicknessCell(k, iCell)
enddo
- sshCell(iCell) = columnThickness - bottomDepth(iCell)
+ sshCell(iCell) = columnThickness - bottomDepth(iCell) - sshLandIceAdjustment(iCell)
enddo
!$omp end do
!$omp end parallel