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