diff --git a/src/core_landice/Registry.xml b/src/core_landice/Registry.xml index ec1c2a015a..625a3e5ce5 100644 --- a/src/core_landice/Registry.xml +++ b/src/core_landice/Registry.xml @@ -941,7 +941,7 @@ is the value of that variable from the *previous* time level! - + + diff --git a/src/core_landice/analysis_members/mpas_li_global_stats.F b/src/core_landice/analysis_members/mpas_li_global_stats.F index 41ddc9aebd..b367875979 100644 --- a/src/core_landice/analysis_members/mpas_li_global_stats.F +++ b/src/core_landice/analysis_members/mpas_li_global_stats.F @@ -283,7 +283,7 @@ subroutine li_compute_global_stats(domain, memberName, timeLevel, err) call mpas_pool_get_array(meshPool, 'dvEdge', dvEdge) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel=1) call mpas_pool_get_array(geometryPool, 'sfcMassBalApplied', sfcMassBalApplied) call mpas_pool_get_array(geometryPool, 'groundedSfcMassBalApplied', groundedSfcMassBalApplied) call mpas_pool_get_array(geometryPool, 'basalMassBal', basalMassBal) diff --git a/src/core_landice/analysis_members/mpas_li_regional_stats.F b/src/core_landice/analysis_members/mpas_li_regional_stats.F index 0e0543df57..4c6df7def9 100644 --- a/src/core_landice/analysis_members/mpas_li_regional_stats.F +++ b/src/core_landice/analysis_members/mpas_li_regional_stats.F @@ -275,7 +275,7 @@ subroutine li_compute_regional_stats(domain, memberName, timeLevel, err) call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel=1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) call mpas_pool_get_array(geometryPool, 'sfcMassBalApplied', sfcMassBalApplied) call mpas_pool_get_array(geometryPool, 'groundedSfcMassBalApplied', groundedSfcMassBalApplied) diff --git a/src/core_landice/mode_forward/mpas_li_advection.F b/src/core_landice/mode_forward/mpas_li_advection.F index 7dad2e6cb3..fbd80d0afd 100644 --- a/src/core_landice/mode_forward/mpas_li_advection.F +++ b/src/core_landice/mode_forward/mpas_li_advection.F @@ -257,7 +257,7 @@ subroutine li_advection_thickness_tracers(& call mpas_pool_get_array(geometryPool, 'floatingBasalMassBal', floatingBasalMassBal) call mpas_pool_get_array(geometryPool, 'layerThickness', layerThickness) call mpas_pool_get_array(geometryPool, 'layerThicknessEdge', layerThicknessEdge) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) call mpas_pool_get_array(geometryPool, 'dynamicThickening', dynamicThickening) call mpas_pool_get_array(geometryPool, 'groundedToFloatingThickness', groundedToFloatingThickness) @@ -630,7 +630,7 @@ subroutine li_update_geometry(geometryPool) call mpas_pool_get_dimension(geometryPool, 'nCells', nCells) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'upperSurface', upperSurface) call mpas_pool_get_array(geometryPool, 'lowerSurface', lowerSurface) diff --git a/src/core_landice/mode_forward/mpas_li_calving.F b/src/core_landice/mode_forward/mpas_li_calving.F index 91146b7c05..6dff0a04dc 100644 --- a/src/core_landice/mode_forward/mpas_li_calving.F +++ b/src/core_landice/mode_forward/mpas_li_calving.F @@ -402,7 +402,7 @@ subroutine li_restore_calving_front(domain, err) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'restoreThickness', restoreThickness) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) ! get required fields from the thermal pool call mpas_pool_get_array(thermalPool, 'temperature', temperature) @@ -870,7 +870,7 @@ subroutine floating_calving(domain, calvingFraction, err) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'thickness', thickness) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) calvingThickness = 0.0_RKIND @@ -929,7 +929,7 @@ subroutine remove_small_islands(meshPool, geometryPool) call mpas_pool_get_array(meshPool, 'nEdgesOnCell', nEdgesOnCell) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'thickness', thickness) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) do iCell = 1, nCellsSolve @@ -1039,7 +1039,7 @@ subroutine topographic_calving(domain, calvingFraction, err) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) calvingThickness = 0.0_RKIND @@ -1152,7 +1152,7 @@ subroutine eigencalving(domain, err) call mpas_pool_get_array(meshPool, 'cellsOnCell', cellsOnCell) call mpas_pool_get_array(meshPool, 'dvEdge', dvEdge) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) call mpas_pool_get_array(geometryPool, 'eigencalvingParameter', eigencalvingParameter) @@ -1336,7 +1336,7 @@ subroutine distribute_calving_flux(meshPool, geometryPool, scratchPool, calvingF ! get fields call mpas_pool_get_dimension(meshPool, 'nCells', nCells) call mpas_pool_get_array(meshPool, 'deltat', deltat) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'requiredCalvingVolumeRate', requiredCalvingVolumeRate) @@ -1566,7 +1566,7 @@ subroutine calculate_calving_front_mask(meshPool, geometryPool, calvingFrontMask call mpas_pool_get_dimension(meshPool, 'nCells', nCells) call mpas_pool_get_array(meshPool, 'nEdgesOnCell', nEdgesOnCell) call mpas_pool_get_array(meshPool, 'cellsOnCell', cellsOnCell) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) calvingFrontMask = 0 !initialize @@ -1656,7 +1656,7 @@ subroutine remove_icebergs(domain) call mpas_pool_get_subpool(block % structs, 'geometry', geometryPool) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_subpool(block % structs, 'velocity', velocityPool) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'contiguousDynamicIce', contiguousDynamicIce) call mpas_pool_get_dimension(meshPool, 'nCells', nCells) call mpas_pool_get_dimension(geometryPool, 'nCellsSolve', nCellsSolve) @@ -1710,7 +1710,7 @@ subroutine remove_icebergs(domain) call mpas_pool_get_subpool(block % structs, 'geometry', geometryPool) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_subpool(block % structs, 'velocity', velocityPool) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'contiguousDynamicIce', contiguousDynamicIce) call mpas_pool_get_array(geometryPool, 'contiguousDynamicIceOld', contiguousDynamicIceOld) call mpas_pool_get_dimension(meshPool, 'nCells', nCells) @@ -1765,7 +1765,7 @@ subroutine remove_icebergs(domain) block => domain % blocklist do while (associated(block)) call mpas_pool_get_subpool(block % structs, 'geometry', geometryPool) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'contiguousDynamicIce', contiguousDynamicIce) diff --git a/src/core_landice/mode_forward/mpas_li_diagnostic_vars.F b/src/core_landice/mode_forward/mpas_li_diagnostic_vars.F index ab47f0d226..a8f2664137 100644 --- a/src/core_landice/mode_forward/mpas_li_diagnostic_vars.F +++ b/src/core_landice/mode_forward/mpas_li_diagnostic_vars.F @@ -258,10 +258,9 @@ subroutine li_calculate_apparent_diffusivity(meshPool, velocityPool, scratchPool call mpas_pool_get_array(geometryPool, 'thickness', thickness, timeLevel=1) call mpas_pool_get_array(geometryPool, 'layerThickness', layerThickness, timeLevel=1) call mpas_pool_get_array(geometryPool, 'apparentDiffusivity', apparentDiffusivity) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(velocityPool, 'uReconstructZonal', uReconstructAxis1) call mpas_pool_get_array(velocityPool, 'uReconstructMeridional', uReconstructAxis2) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) call mpas_pool_get_field(scratchPool, 'workCell', slopeReconstructXField) call mpas_allocate_scratch_field(slopeReconstructXField, .true.) call mpas_pool_get_field(scratchPool, 'workCell2', slopeReconstructYField) diff --git a/src/core_landice/mode_forward/mpas_li_iceshelf_melt.F b/src/core_landice/mode_forward/mpas_li_iceshelf_melt.F index 95f6716fa8..0b99e9d843 100644 --- a/src/core_landice/mode_forward/mpas_li_iceshelf_melt.F +++ b/src/core_landice/mode_forward/mpas_li_iceshelf_melt.F @@ -247,7 +247,7 @@ subroutine li_basal_melt_floating_ice(domain, err) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'lowerSurface', lowerSurface) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'floatingBasalMassBal', floatingBasalMassBal) ! get fields from the scratch pool @@ -853,7 +853,7 @@ subroutine calc_iceshelf_draft_info(domain, GLdepth, CFdepth, err) call mpas_pool_get_subpool(block % structs, 'geometry', geometryPool) call mpas_pool_get_subpool(block % structs, 'mesh', meshPool) call mpas_pool_get_array(geometryPool, 'lowerSurface', lowerSurface) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(meshPool, 'nEdgesOnCell', nEdgesOnCell) call mpas_pool_get_array(meshPool, 'cellsOnCell', cellsOnCell) call mpas_pool_get_array(meshPool, 'areaCell', areaCell) diff --git a/src/core_landice/mode_forward/mpas_li_sia.F b/src/core_landice/mode_forward/mpas_li_sia.F index b22001c4f2..d400c12e35 100644 --- a/src/core_landice/mode_forward/mpas_li_sia.F +++ b/src/core_landice/mode_forward/mpas_li_sia.F @@ -316,7 +316,7 @@ subroutine li_sia_solve(meshPool, geometryPool, thermalPool, velocityPool, err) call mpas_pool_get_array(velocityPool, 'flowParamA', flowParamA) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'slopeEdge', slopeEdge) call mpas_pool_get_array(geometryPool, 'normalSlopeEdge', normalSlopeEdge) call mpas_pool_get_array(thermalPool, 'temperature', temperature) diff --git a/src/core_landice/mode_forward/mpas_li_statistics.F b/src/core_landice/mode_forward/mpas_li_statistics.F index 47a7be44e8..99de7c4939 100644 --- a/src/core_landice/mode_forward/mpas_li_statistics.F +++ b/src/core_landice/mode_forward/mpas_li_statistics.F @@ -235,7 +235,7 @@ subroutine li_compute_statistics(domain, itimestep) ! Geometry arrays call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) call mpas_pool_get_array(geometryPool, 'sfcMassBal', sfcMassBal) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) call mpas_pool_get_array(geometryPool, 'thickness', thickness, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'layerThickness', layerThickness, timeLevel = 1) diff --git a/src/core_landice/mode_forward/mpas_li_subglacial_hydro.F b/src/core_landice/mode_forward/mpas_li_subglacial_hydro.F index 9e2e4f79ca..596119d01c 100644 --- a/src/core_landice/mode_forward/mpas_li_subglacial_hydro.F +++ b/src/core_landice/mode_forward/mpas_li_subglacial_hydro.F @@ -163,7 +163,7 @@ subroutine li_SGH_init(domain, err) waterPressure = max(0.0_RKIND, waterPressure) waterPressure = min(waterPressure, rhoi * gravity * thickness) ! set pressure correctly under floating ice and open ocean - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) where ( (li_mask_is_floating_ice(cellMask)) .or. & ( (.not. li_mask_is_ice(cellMask)) .and. (bedTopography < config_sea_level) ) ) @@ -379,7 +379,7 @@ subroutine li_SGH_solve(domain, err) call mpas_pool_get_array(hydroPool, 'deltatSGH', deltatSGH) call mpas_pool_get_array(hydroPool, 'basalMeltInput', basalMeltInput) call mpas_pool_get_array(hydroPool, 'externalWaterInput', externalWaterInput) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) WtillOld = Wtill Wtill = Wtill + deltatSGH * ( (basalMeltInput + externalWaterInput) / rho_water - Cd) @@ -420,7 +420,7 @@ subroutine li_SGH_solve(domain, err) call mpas_pool_get_array(hydroPool, 'waterVelocity', waterVelocity) call mpas_pool_get_array(hydroPool, 'waterVelocityCellX', waterVelocityCellX) call mpas_pool_get_array(hydroPool, 'waterVelocityCellY', waterVelocityCellY) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) allocate(cellJunk(nCells+1)) call mpas_reconstruct(meshPool, waterVelocity, waterVelocityCellX, waterVelocityCellY, & cellJunk, cellJunk, cellJunk) @@ -476,7 +476,7 @@ subroutine li_SGH_solve(domain, err) call mpas_pool_get_array(meshPool, 'edgesOnCell', edgesOnCell) call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge) call mpas_pool_get_array(meshPool, 'edgeSignOnCell', edgeSignOnCell) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) divergence(:) = 0.0_RKIND ! zero div before starting ! loop over locally owned cells @@ -551,7 +551,7 @@ subroutine li_SGH_solve(domain, err) call mpas_pool_get_array(hydroPool, 'divergence', divergence) call mpas_pool_get_array(hydroPool, 'divergenceChannel', divergenceChannel) call mpas_pool_get_array(hydroPool, 'channelAreaChangeCell', channelAreaChangeCell) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) waterThicknessOld = waterThickness waterThickness = waterThicknessOld + deltatSGH * ( (basalMeltInput + externalWaterInput) / rho_water - divergence & @@ -755,7 +755,7 @@ subroutine calc_edge_quantities(block, err) call mpas_pool_get_array(hydroPool, 'hydropotentialBaseSlopeNormal', hydropotentialBaseSlopeNormal) call mpas_pool_get_array(hydroPool, 'waterPressureSlopeNormal', waterPressureSlopeNormal) call mpas_pool_get_array(meshPool, 'dcEdge', dcEdge) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge) call mpas_pool_get_array(meshPool, 'edgeSignOnCell', edgeSignOnCell) call mpas_pool_get_array(hydroPool, 'hydropotentialBaseSlopeTangent', hydropotentialBaseSlopeTangent) @@ -1217,7 +1217,7 @@ subroutine calc_pressure(block, err) call mpas_pool_get_array(velocityPool, 'basalSpeed', basalSpeed) call mpas_pool_get_array(velocityPool, 'flowParamA', flowParamA) call mpas_pool_get_array(geometryPool, 'thickness', thickness) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'bedTopography', bedTopography) openingRate(:) = bedRough * basalSpeed(:) * (bedRoughMax - waterThickness(:)) @@ -1338,7 +1338,7 @@ subroutine calc_pressure_diag_vars(block, err) call mpas_pool_get_array(hydroPool, 'hydropotentialBase', hydropotentialBase) call mpas_pool_get_array(hydroPool, 'waterThickness', waterThickness) call mpas_pool_get_array(hydroPool, 'hydropotential', hydropotential) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) effectivePressure = rhoi * gravity * thickness - waterPressure ! < this should evalute to 0 for floating ice if Pw set correctly there. diff --git a/src/core_landice/mode_forward/mpas_li_thermal.F b/src/core_landice/mode_forward/mpas_li_thermal.F index 5bceb3c9d2..296d5070c6 100644 --- a/src/core_landice/mode_forward/mpas_li_thermal.F +++ b/src/core_landice/mode_forward/mpas_li_thermal.F @@ -820,7 +820,7 @@ subroutine li_thermal_solver(domain, err) ! get fields from the geometry pool call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'upperSurface', upperSurface) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'groundedBasalMassBal', groundedBasalMassBal) call mpas_pool_get_array(geometryPool, 'floatingBasalMassBal', floatingBasalMassBal) call mpas_pool_get_array(geometryPool, 'basalWaterThickness', basalWaterThickness) diff --git a/src/core_landice/mode_forward/mpas_li_velocity.F b/src/core_landice/mode_forward/mpas_li_velocity.F index e1e543e929..3bd6541abe 100644 --- a/src/core_landice/mode_forward/mpas_li_velocity.F +++ b/src/core_landice/mode_forward/mpas_li_velocity.F @@ -269,8 +269,9 @@ subroutine li_velocity_solve(domain, solveVelo, err) integer, pointer :: nEdges integer, pointer :: nVertInterfaces integer, pointer :: nCells - integer, dimension(:), pointer :: edgeMask, cellMask, vertexMask, vertexMaskOld + integer, dimension(:), pointer :: edgeMask, cellMask, cellMaskOld, vertexMask, vertexMaskOld integer, dimension(:,:), pointer :: dirichletVelocityMaskOld, dirichletVelocityMaskNew + integer, dimension(:), pointer :: floatingEdgesOld, floatingEdgesNew real (kind=RKIND), dimension(:,:), pointer :: normalVelocity, normalVelocityInitial real (kind=RKIND), dimension(:,:), pointer :: uReconstructX, uReconstructY, uReconstructZ, & uReconstructZonal, uReconstructMeridional @@ -288,7 +289,9 @@ subroutine li_velocity_solve(domain, solveVelo, err) real (kind=RKIND), dimension(:), pointer :: upperSurface integer, dimension(:), pointer :: indexToEdgeID integer, pointer :: anyDynamicVertexMaskChanged + integer, pointer :: cellIceMaskChanged integer, pointer :: dirichletMaskChanged + integer, pointer :: floatingEdgesChanged ! truly local variables integer :: cell1, cell2 integer :: cell3, cell4, thisCell @@ -301,7 +304,9 @@ subroutine li_velocity_solve(domain, solveVelo, err) real (kind=RKIND) :: maxThicknessOnProc, maxThicknessAllProcs real (kind=RKIND) :: xVelEdge, yVelEdge integer :: blockDynamicVertexMaskChanged, procDynamicVertexMaskChanged + integer :: blockCellIceMaskChanged, procCellIceMaskChanged integer :: blockDirichletMaskChanged, procDirichletMaskChanged + integer :: blockFloatingEdgesChanged, procFloatingEdgesChanged call mpas_timer_start("velocity solve") @@ -386,7 +391,9 @@ subroutine li_velocity_solve(domain, solveVelo, err) ! Don't bother checking this with SIA because it requires an extra global reduce maxThicknessOnProc = 0.0_RKIND ! initialize to procDynamicVertexMaskChanged = 0 + procCellIceMaskChanged = 0 procDirichletMaskChanged = 0 + procFloatingEdgesChanged = 0 block => domain % blocklist do while (associated(block)) @@ -398,7 +405,7 @@ subroutine li_velocity_solve(domain, solveVelo, err) maxThicknessOnProc = max(maxThicknessOnProc, maxval(thickness)) ! The interface expects an array where 1's are floating edges and 0's are non-floating edges. - call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges) + call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) floatingEdges = li_mask_is_floating_ice_int(edgeMask) call mpas_pool_get_array(geometryPool, 'vertexMask', vertexMask, timeLevel=1) @@ -408,7 +415,7 @@ subroutine li_velocity_solve(domain, solveVelo, err) ! TODO: There may be some aspects of the mask that are ok change for external dycores, ! but for now just check the whole thing. call mpas_pool_get_array(geometryPool, 'vertexMask', vertexMaskOld, timeLevel=2) - if ( sum(li_mask_is_dynamic_ice_int(vertexMask) - li_mask_is_dynamic_ice_int(vertexMaskOld)) /= 0 ) then + if ( sum(abs(li_mask_is_dynamic_ice_int(vertexMask) - li_mask_is_dynamic_ice_int(vertexMaskOld))) /= 0 ) then blockDynamicVertexMaskChanged = 1 else blockDynamicVertexMaskChanged = 0 @@ -417,11 +424,26 @@ subroutine li_velocity_solve(domain, solveVelo, err) ! Determine if any blocks on this processor had a change to the vertex mask procDynamicVertexMaskChanged = max(procDynamicVertexMaskChanged, blockDynamicVertexMaskChanged) !print *,'procVertexMaskChanged', procVertexMaskChanged + + ! Determine if the cell mask changed during this time step for this block (needed for external dycores) + ! TODO: There may be some aspects of the mask that are ok change for external dycores, + ! but for now just check the whole thing. + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel=1) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMaskOld, timeLevel=2) + if (( sum(abs(li_mask_is_dynamic_ice_int(cellMask) - li_mask_is_dynamic_ice_int(cellMaskOld))) /= 0 ) .or. & + ( sum(abs(li_mask_is_ice_int(cellMask) - li_mask_is_ice_int(cellMaskOld))) /= 0 )) then + blockCellIceMaskChanged = 1 + else + blockCellIceMaskChanged = 0 + endif + + ! Determine if any blocks on this processor had a change to the cell mask + procCellIceMaskChanged = max(procCellIceMaskChanged, blockCellIceMaskChanged) - ! Also check to see if the Dirichlet b.c. mask has changed + ! Check to see if the Dirichlet b.c. mask has changed call mpas_pool_get_array(velocityPool, 'dirichletVelocityMask', dirichletVelocityMaskOld, timeLevel=2) call mpas_pool_get_array(velocityPool, 'dirichletVelocityMask', dirichletVelocityMaskNew, timeLevel=1) - if ( sum(dirichletVelocityMaskNew - dirichletVelocityMaskOld) /= 0 ) then + if ( sum(abs(dirichletVelocityMaskNew - dirichletVelocityMaskOld)) /= 0 ) then blockDirichletMaskChanged = 1 else blockDirichletMaskChanged = 0 @@ -429,6 +451,17 @@ subroutine li_velocity_solve(domain, solveVelo, err) ! Determine if any blocks on this processor had a change to the vertex mask procDirichletMaskChanged = max(procDirichletMaskChanged, blockDirichletMaskChanged) + ! Check to see if the Floating Edges Ids have changed + call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdgesOld, timeLevel=2) + call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdgesNew, timeLevel=1) + if ( sum(abs(floatingEdgesNew - floatingEdgesOld)) /= 0 ) then + blockFloatingEdgesChanged = 1 + else + blockFloatingEdgesChanged = 0 + endif + ! Determine if any blocks on this processor had a change to the vertex mask + procFloatingEdgesChanged = max(procFloatingEdgesChanged, blockFloatingEdgesChanged) + ! Set beta for solver to use ! (this could potentially be applied to an SIA solver, so it is calculated in this module) call calculate_beta(block, err_tmp) @@ -452,10 +485,16 @@ subroutine li_velocity_solve(domain, solveVelo, err) call mpas_pool_get_array(velocityPool, 'anyDynamicVertexMaskChanged', anyDynamicVertexMaskChanged) call mpas_dmpar_max_int(domain % dminfo, procDynamicVertexMaskChanged, anyDynamicVertexMaskChanged) !print *,'anyDynamicVertexMaskChanged', anyDynamicVertexMaskChanged + ! Do the same for the cell mask + call mpas_pool_get_array(velocityPool, 'cellIceMaskChanged', cellIceMaskChanged) + call mpas_dmpar_max_int(domain % dminfo, procCellIceMaskChanged, cellIceMaskChanged) ! Do the same for the Dirichlet b.c. mask call mpas_pool_get_array(velocityPool, 'dirichletMaskChanged', dirichletMaskChanged) call mpas_dmpar_max_int(domain % dminfo, procDirichletMaskChanged, dirichletMaskChanged) - !print *,'dirichletMaskChanged', dirichletMaskChanged + ! Do the same for the Floating edges + call mpas_pool_get_array(velocityPool, 'floatingEdgesChanged', floatingEdgesChanged) + call mpas_dmpar_max_int(domain % dminfo, procFloatingEdgesChanged, floatingEdgesChanged) + !print *,'floatingEdgesChanged', floatingEdgesChanged endif @@ -479,7 +518,7 @@ subroutine li_velocity_solve(domain, solveVelo, err) call mpas_pool_get_array(meshPool, 'cellsOnEdge', cellsOnEdge) call mpas_pool_get_array(meshPool, 'cellsOnVertex', cellsOnVertex) call mpas_pool_get_array(meshPool, 'verticesOnEdge', verticesOnEdge) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'upperSurface', upperSurface) @@ -844,7 +883,7 @@ subroutine calculate_beta(block, err) call mpas_pool_get_array(velocityPool, 'betaSolve', betaSolve) call mpas_pool_get_array(velocityPool, 'beta', beta) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) betaSolve = beta @@ -1028,7 +1067,7 @@ subroutine remove_fast_ice(meshPool, uReconstructX, uReconstructY, normalVelocit call mpas_pool_get_dimension(meshPool, 'nCells', nCells) call mpas_pool_get_array(meshPool, 'nEdgesOnCell', nEdgesOnCell) call mpas_pool_get_array(meshPool, 'edgesOnCell', edgesOnCell) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'thickness', thickness) call mpas_pool_get_array(geometryPool, 'calvingThickness', calvingThickness) call mpas_pool_get_array(geometryPool, 'upperSurface', upperSurface) diff --git a/src/core_landice/mode_forward/mpas_li_velocity_external.F b/src/core_landice/mode_forward/mpas_li_velocity_external.F index 53a8e32e17..f1fa8bd529 100644 --- a/src/core_landice/mode_forward/mpas_li_velocity_external.F +++ b/src/core_landice/mode_forward/mpas_li_velocity_external.F @@ -452,7 +452,9 @@ subroutine li_velocity_external_solve(meshPool, geometryPool, thermalPool, hydro logical, pointer :: config_output_external_velocity_solver_data real (kind=RKIND), pointer :: config_ice_density integer, pointer :: anyDynamicVertexMaskChanged + integer, pointer :: cellIceMaskChanged integer, pointer :: dirichletMaskChanged + integer, pointer :: floatingEdgesChanged integer, pointer :: nEdges integer, pointer :: nVertLevels integer, pointer :: timestepNumber @@ -486,7 +488,7 @@ subroutine li_velocity_external_solve(meshPool, geometryPool, thermalPool, hydro call mpas_pool_get_array(geometryPool, 'lowerSurface', lowerSurface) call mpas_pool_get_array(geometryPool, 'upperSurface', upperSurface) call mpas_pool_get_array(geometryPool, 'vertexMask', vertexMask, timeLevel = 1) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) call mpas_pool_get_array(geometryPool, 'sfcMassBal', sfcMassBal) @@ -501,9 +503,11 @@ subroutine li_velocity_external_solve(meshPool, geometryPool, thermalPool, hydro call mpas_pool_get_array(velocityPool, 'uReconstructZ', uReconstructZ) call mpas_pool_get_array(velocityPool, 'betaSolve', betaSolve) call mpas_pool_get_array(velocityPool, 'anyDynamicVertexMaskChanged', anyDynamicVertexMaskChanged) + call mpas_pool_get_array(velocityPool, 'cellIceMaskChanged', cellIceMaskChanged) call mpas_pool_get_array(velocityPool, 'dirichletMaskChanged', dirichletMaskChanged) call mpas_pool_get_array(velocityPool, 'dirichletVelocityMask', dirichletVelocityMask, timeLevel = 1) - call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges) + call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges, timeLevel = 1) + call mpas_pool_get_array(velocityPool, 'floatingEdgesChanged', floatingEdgesChanged) call mpas_pool_get_array(velocityPool, 'stiffnessFactor', stiffnessFactor) ! Hydro variables @@ -521,7 +525,7 @@ subroutine li_velocity_external_solve(meshPool, geometryPool, thermalPool, hydro ! Note these functions will always be called on the first solve because we ! initialize vertexMask to garbage which sets anyDynamicVertexMaskChanged to 1. if ((anyDynamicVertexMaskChanged == 1) .or. (config_always_compute_fem_grid) .or. & - (dirichletMaskChanged == 1) ) then + (dirichletMaskChanged == 1) .or. (floatingEdgesChanged == 1) .or. (cellIceMaskChanged == 1)) then call mpas_log_write("Generating new external velocity solver FEM grid.", flushNow=.true.) call generate_fem_grid(config_velocity_solver, vertexMask, cellMask, dirichletVelocityMask, & floatingEdges, layerThicknessFractions, lowerSurface, thickness, err) @@ -805,13 +809,13 @@ subroutine li_velocity_external_write_albany_mesh(domain) call mpas_pool_get_array(geometryPool, 'sfcMassBal', sfcMassBal) call mpas_pool_get_array(geometryPool, 'floatingBasalMassBal', floatingBasalMassBal) call mpas_pool_get_array(geometryPool, 'vertexMask', vertexMask, timeLevel = 1) - call mpas_pool_get_array(geometryPool, 'cellMask', cellMask) + call mpas_pool_get_array(geometryPool, 'cellMask', cellMask, timeLevel = 1) call mpas_pool_get_array(geometryPool, 'edgeMask', edgeMask) call mpas_pool_get_array(geometryPool, 'layerThickness', layerThickness) ! Velocity variables call mpas_pool_get_array(velocityPool, 'beta', beta) - call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges) + call mpas_pool_get_array(velocityPool, 'floatingEdges', floatingEdges, timeLevel = 1) call mpas_pool_get_array(velocityPool, 'dirichletVelocityMask', dirichletVelocityMask, timeLevel = 1) call mpas_pool_get_array(velocityPool, 'stiffnessFactor', stiffnessFactor)