Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Glads gl #648

Open
wants to merge 69 commits into
base: devel
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
5162ce5
Adding routine for calculating GlaDS cross GL flux (total from both
RupertGladstone Jan 31, 2024
c26a49d
Renamed "workvar" to human readable names
RupertGladstone Jan 31, 2024
e3ea43f
tidying up "cycelement" decisions
RupertGladstone Jan 31, 2024
53ba4c7
Adding new switches (not active yet)...
RupertGladstone Jan 31, 2024
c9f2a19
New switches implemented for "calving", and masking code moved to fun…
RupertGladstone Feb 5, 2024
9b4e66b
Fixed null pointer to solverparams
RupertGladstone Feb 5, 2024
22e8c7e
Minor bug fixes re indexing
RupertGladstone Feb 19, 2024
a7a789c
Merge branch 'elmerice' into glads_gl
RupertGladstone Mar 26, 2024
db92053
updating grounded melt solver for GlaDS
RupertGladstone Apr 24, 2024
34ebbca
Adding option to not scale As according to effective pressure when co…
RupertGladstone Apr 24, 2024
9815eab
Merge branch 'elmerice' into glads_gl
RupertGladstone Apr 24, 2024
c5aee30
reduce output print in GroundedSolver
chekki2mo May 2, 2024
7119b72
bug fix for nonlinear Budd sliding in SSA
RupertGladstone May 4, 2024
c9d7f45
Add hybrid (between Schoof/Gag and Joughin versions) regularised coul…
RupertGladstone May 8, 2024
f66e2af
Integrated GMvalid with GroundedSolver.
RupertGladstone Jun 5, 2024
186f498
Bug fix 'SSA Friction need N' info statement
RupertGladstone Jun 16, 2024
9289819
updated info message from GroundedSolver
RupertGladstone Jun 17, 2024
ee11e86
Merge branch 'elmerice' into glads_gl
RupertGladstone Jun 17, 2024
0839761
Modifying GlaDS to use specified mask instead of compbined hard coded
RupertGladstone Jun 18, 2024
c3e49a6
Documentation Covariance Utils
fgillet Jun 20, 2024
957e54c
documentation
fgillet Jun 24, 2024
5673efa
add header to solver files
fgillet Jun 24, 2024
677c476
Add test cases for CovarianceVectorMutliply
fgillet Jun 24, 2024
d4e5860
add test BackgroundErrorCostSolver
fgillet Jun 24, 2024
c0c4b80
improve documentation
fgillet Jul 3, 2024
bd1dc91
updating GlaDS masking to optionally use the connectivity mask or gro…
RupertGladstone Jul 3, 2024
c1714a7
A selection of updates to get the calving-hydrology coupled model up-…
Morlocke Jul 3, 2024
9bd1878
Resolve merge conflict - we already get SolverParams before the First…
Morlocke Jul 3, 2024
9a39e40
Update Documentation
fgillet Jul 3, 2024
e5d05db
Update documentation
fgillet Jul 4, 2024
600e768
Further changes to make the calving-hydrology coupling work again - m…
Morlocke Jul 5, 2024
3a7e65e
Add max N to SSA sliding laws
RupertGladstone Jul 5, 2024
6b3d11d
Merge branch 'elmerice' into glads_gl
RupertGladstone Jul 5, 2024
f1bfbe1
tidying glads GL flux calcs
RupertGladstone Jul 15, 2024
77bbe42
Merge branch 'devel' into elmerice
tzwinger Jul 15, 2024
b77bd36
fix a bug in my earlier modifications based on Samuel's "calving" option
RupertGladstone Jul 17, 2024
b101091
GlaDSCoupledSolver: Bug fix to the looping for averaging the contribu…
RupertGladstone Jul 18, 2024
3bfb36c
Merge branch 'elmerice' into glads_gl
RupertGladstone Jul 18, 2024
e6a3590
(attempted to) fix calculation of GlaDS sheet contribution to flow ac…
RupertGladstone Jul 19, 2024
ad89e80
Allow both min and max coupled iterations to be specified for GlaDSCo…
RupertGladstone Jul 26, 2024
ab286f7
Adding connectivity option for grounded mask to remove isolated groun…
RupertGladstone Aug 8, 2024
0516cc9
updating connectivity mask options to allow for removal of isolated
RupertGladstone Aug 9, 2024
203f4e3
Updates to PlumeSolver to fix a case where a plume actually has a co-…
Morlocke Aug 14, 2024
66182aa
Now with all that old code taken out!
Morlocke Aug 14, 2024
c91ae73
Minor tweak to GlaDS and PlumeSolver to allow the plumes to use the n…
Morlocke Aug 16, 2024
e0e220d
Added user option to define mask name for SSA sliding (default still …
RupertGladstone Sep 25, 2024
9a05add
Additional hybrid RC sliding parameterisation for SSA
RupertGladstone Sep 25, 2024
6aa7bc7
Merge branch 'devel' into elmerice
tzwinger Sep 25, 2024
8938d56
Report SSA friction mask name at info level 5
RupertGladstone Sep 26, 2024
613c35d
Merge branch 'elmerice' into glads_gl
RupertGladstone Sep 26, 2024
ee057a9
Allow SSA code to use a different grounded mask by setting
RupertGladstone Oct 4, 2024
b1e79a0
Merge branch 'devel' into elmerice
RupertGladstone Oct 16, 2024
85ff151
Max sheet thickness for GlaDS applied after sheet thickness update.
RupertGladstone Oct 16, 2024
1bd4a7b
Merge branch 'elmerice' into glads_gl
RupertGladstone Oct 16, 2024
d0891c6
Allow 3D velocity for calculting sliding speed in grounded melt solver
RupertGladstone Oct 30, 2024
03c0035
tweaking adaptive timestepping info statements
RupertGladstone Oct 30, 2024
797cae6
reduced info level of adaptivity info from 12 to 7
RupertGladstone Nov 13, 2024
97773a1
Merge branch 'devel' into elmerice
RupertGladstone Nov 13, 2024
d5e3329
Merge branch 'elmerice' into glads_gl
RupertGladstone Nov 13, 2024
1ef1cce
Allow 4D flow solution to be passed to grounded melt solver (ignores …
RupertGladstone Nov 13, 2024
7cd61d8
Committing Yu Wang's option to use regularised Coulomb sliding in SSA…
RupertGladstone Nov 13, 2024
5c94823
Merge branch 'devel' into elmerice
RupertGladstone Dec 23, 2024
522baf2
Merge branch 'elmerice' into glads_gl
RupertGladstone Dec 23, 2024
d5f1b20
resolve minor merge error in GroundedSolver.F90
RupertGladstone Dec 23, 2024
2141fad
Merge branch 'devel' into glads_gl
RupertGladstone Feb 5, 2025
25fff6c
Debug MeshUtils change re InDofs.
RupertGladstone Feb 6, 2025
4190773
Additional optional hydrology-based checks for calculating grounded melt
RupertGladstone Feb 12, 2025
67ce4d8
Merge branch 'devel' into glads_gl
RupertGladstone Feb 18, 2025
5fac6cd
Merge branch 'devel' into glads_gl
RupertGladstone Feb 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions elmerice/Solvers/AdjointSSA/AdjointSSA_GradientSolver.F90
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ SUBROUTINE AdjointSSA_GradientSolver( Model,Solver,dt,TransientSimulation )
NodalEtaDer(:),NodalBetaDer(:)

INTEGER :: iFriction
REAL(KIND=dp) :: fm
REAL(KIND=dp) :: fm,U0
CHARACTER(LEN=MAX_NAME_LEN) :: Friction
CHARACTER(LEN=MAX_NAME_LEN) :: SolverName='AdjointSSA_GradientSolver'
#ifdef USE_ISO_C_BINDINGS
Expand Down Expand Up @@ -406,8 +406,10 @@ SUBROUTINE AdjointSSA_GradientSolver( Model,Solver,dt,TransientSimulation )
fm = 1.0_dp
CASE('weertman')
iFriction = 2
CASE('regularized coulomb')
iFriction = 3
CASE DEFAULT
CALL FATAL(SolverName,'Friction should be linear or Weertman')
CALL FATAL(SolverName,'Friction should be linear or Weertman or regularized coulomb')
END SELECT


Expand All @@ -420,6 +422,11 @@ SUBROUTINE AdjointSSA_GradientSolver( Model,Solver,dt,TransientSimulation )
LocalLinVelo(1:n) = ListGetReal(Material, 'SSA Friction Linear Velocity', n, NodeIndexes,UnFoundFatal=.TRUE.)
END IF

IF (iFriction == 3) THEN
U0 = ListGetConstReal( Material, 'SSA Friction Threshold Velocity', Found, UnFoundFatal=.TRUE.)
END IF


IF (SEP) THEN
NodalGM(1:n)=GMSol%Values(GMSol%Perm(NodeIndexes(1:n)))
NodalBed(1:n)=BedrockSol%Values(BedrockSol%Perm(NodeIndexes(1:n)))
Expand Down Expand Up @@ -689,7 +696,7 @@ SUBROUTINE LocalMatrixUVSSA( STIFF, FORCE, Element, n, Nodes, gravity, &
END DO !i
END DO !p

IF ((iFriction == 2).AND.(fm==1.0_dp)) iFriction=1
IF ((iFriction == 2).AND.(fm==1.0_dp)) iFriction=1 !linear
IF (iFriction > 1) THEN
LinVelo = SUM( LocalLinVelo(1:n) * Basis(1:n) )
Velo = 0.0_dp
Expand All @@ -699,7 +706,11 @@ SUBROUTINE LocalMatrixUVSSA( STIFF, FORCE, Element, n, Nodes, gravity, &
IF (ub < LinVelo) then
ub = LinVelo
ENDIF
betab = betab * ub**(fm-1.0_dp)
IF (iFriction == 2) THEN !Weertman
betab = betab * ub**(fm-1.0_dp)
ELSE IF (iFriction == 3) THEN !regularized coulomb
betab = betab * ub**(fm-1.0_dp) / (ub + U0)**fm
END IF
END IF

IF (SEP) THEN
Expand Down Expand Up @@ -833,5 +844,4 @@ SUBROUTINE LocalMatrixBCSSA( STIFF, FORCE, Element, n, ENodes, Density, &
!------------------------------------------------------------------------------
END SUBROUTINE LocalMatrixBCSSA

END SUBROUTINE AdjointSSA_GradientSolver

END SUBROUTINE AdjointSSA_GradientSolver
68 changes: 34 additions & 34 deletions elmerice/Solvers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@ SET(WITH_ScatteredDataInterpolator FALSE CACHE BOOL "Include ElmerIce ScatteredD
MARK_AS_ADVANCED(WITH_ScatteredDataInterpolator)

# ---------------------- #
# -- netCDF libraries -- #
# -- NetCDF libraries -- #
#----------------------- #
MESSAGE(STATUS "------------------------------------------------")
MESSAGE(STATUS "Elmer/Ice package: Looking for [netCDF] & [netCDF Fortran] libraries")
MESSAGE(STATUS "Elmer/Ice package: Looking for [NetCDF] & [NetCDF Fortran] libraries")

FIND_PACKAGE(NETCDF MODULE)
FIND_PACKAGE(NetCDF)

IF(NETCDF_FOUND)
IF(NetCDF_FOUND)

SET(HAVE_NETCDF TRUE)
MARK_AS_ADVANCED(HAVE_NETCDF)
INCLUDE_DIRECTORIES(${NETCDF_INCLUDE_DIR})
INCLUDE_DIRECTORIES(${NetCDF_INCLUDE_DIR})
ADD_DEFINITIONS(-DHAVE_NETCDF)

MESSAGE(STATUS " netCDF: " "${NETCDF_FOUND}")
MESSAGE(STATUS " netCDF_INC: " "${NETCDF_INCLUDE_DIR}")
MESSAGE(STATUS " netCDF_LIBS: " "${NETCDF_LIBRARIES}")
MESSAGE(STATUS " NetCDF: " "${NetCDF_FOUND}")
MESSAGE(STATUS " NetCDF_INC: " "${NetCDF_INCLUDE_DIR}")
MESSAGE(STATUS " NetCDF_LIBS: " "${NetCDF_LIBRARIES}")
ELSE()
MESSAGE(STATUS "Library not found: netCDF ")
MESSAGE(WARNING " \n Missing: <NETCDF_INCLUDE_DIR> , <NETCDF_LIBRARY>, <NETCDFF_LIBRARY> \n some functionalities will be disabled")
ENDIF()
MESSAGE(STATUS "Library not found: >NetCDF_FOUND< ")
MESSAGE(WARNING " \n Missing: >NetCDF_INCLUDE_DIR< , >NetCDF_LIBRARY<, >NetCDFF_LIBRARY< \n some functionalities will be disabled")
ENDIF(NetCDF_FOUND)

# ---------------------- #
# -- HDF5 libraries -- #
Expand Down Expand Up @@ -60,40 +60,40 @@ ENDIF()
SET(CMAKE_Fortran_MODULE_DIRECTORY
${PROJECT_BINARY_DIR}/fmodules CACHE PATH "Directory for Fortran modules")

SET(ElmerIce_SRC ElmerIceUtils.F90 AIFlowSolve_nlD2.F90 AIFlowSolve_nlS2.F90
CaffeSolver.F90 ComputeDevStress.F90 ComputeEigenValues.F90
ComputeNormal.F90 ComputeStrainRate.F90 DeformationalHeat.F90
EPLSolver.F90 FabricSolve.F90 Flowdepth.F90
ForceToStress.F90 GetHydrostaticLoads.F90 GolfLaw.F90
GroundedSolver.F90 IntegratedVelocity.F90 IDSSolver.F90
PorousSolve.F90 pointwise.F90 SIASolver.F90 SSASolver.F90
ThicknessSolver.F90 TemperateIce.F90 ExportVertically.F90
AdjointSolver.F90 DJDBeta_Adjoint.F90 DJDmu_Adjoint.F90
CostSolver_Adjoint.F90 DJDBeta_Robin.F90 DJDmu_Robin.F90
CostSolver_Robin.F90 m1qn3.F Grid2DInterpolator.F90
SET(ElmerIce_SRC ElmerIceUtils.F90 AIFlowSolve_nlD2.F90 AIFlowSolve_nlS2.F90
CaffeSolver.F90 ComputeDevStress.F90 ComputeEigenValues.F90
ComputeNormal.F90 ComputeStrainRate.F90 DeformationalHeat.F90
EPLSolver.F90 FabricSolve.F90 Flowdepth.F90
ForceToStress.F90 GetHydrostaticLoads.F90 GolfLaw.F90
GroundedSolver.F90 IntegratedVelocity.F90 IDSSolver.F90
PorousSolve.F90 pointwise.F90 SIASolver.F90 SSASolver.F90
ThicknessSolver.F90 TemperateIce.F90 ExportVertically.F90
AdjointSolver.F90 DJDBeta_Adjoint.F90 DJDmu_Adjoint.F90
CostSolver_Adjoint.F90 DJDBeta_Robin.F90 DJDmu_Robin.F90
CostSolver_Robin.F90 m1qn3.F Grid2DInterpolator.F90
Optimize_m1qn3Parallel.F90 OutputStrainHeating.F90 UpdateExport.F90
IntegrateVertically.F90 EnthalpySolver.F90 SubShelfMelt.F90
./Adjoint/Adjoint_LinearSolver.F90 ./Adjoint/Adjoint_CostDiscSolver.F90
./Adjoint/Adjoint_CostContSolver.F90 ./Adjoint/Adjoint_CostRegSolver.F90
./Adjoint/Adjoint_CostContSolver.F90 ./Adjoint/Adjoint_CostRegSolver.F90
./Adjoint/Adjoint_GradientValidation.F90
./AdjointStokes/AdjointStokes_GradientMu.F90
./AdjointStokes/AdjointStokes_GradientBetaSolver.F90
./AdjointStokes/AdjointStokes_GradientMu.F90
./AdjointStokes/AdjointStokes_GradientBetaSolver.F90
./AdjointSSA/AdjointSSA_AdjointSolver.F90 ./AdjointSSA/AdjointSSA_CostDiscSolver.F90
./AdjointSSA/AdjointSSA_CostRegSolver.F90 ./AdjointSSA/AdjointSSA_SSASolver.F90
./AdjointSSA/AdjointSSA_CostContSolver.F90 ./AdjointSSA/AdjointSSA_CostFluxDivSolver.F90
./AdjointSSA/AdjointSSA_CostTaubSolver.F90
./AdjointSSA/AdjointSSA_GradientSolver.F90
./AdjointSSA/AdjointSSA_GradientSolver.F90
./AdjointThickness/AdjointThickness_GradientSolver.F90 ./AdjointThickness/AdjointThickness_ThicknessSolver.F90
./Permafrost/PermafrostMaterials.F90 ./Permafrost/Permafrost_Utils.F90 ./Permafrost/Permafrost_HTEQ.F90
./Permafrost/Permafrost_Darcy.F90 ./Permafrost/Permafrost_solute.F90 ./Permafrost/Permafrost_solid.F90
SurfaceBoundaryEnthalpy.F90
Calving.F90 FrontDisplacement.F90
TwoMeshes.F90 ProjectCalving.F90 ComputeCalvingNormal.F90
Calving.F90 FrontDisplacement.F90
TwoMeshes.F90 ProjectCalving.F90 ComputeCalvingNormal.F90
CalvingGeometry.F90 Calving3D.F90 Calving3D_lset.F90 CalvingGlacierAdvance3D.F90 CalvingRemesh.F90
CalvingFrontAdvance3D.F90 Emergence.F90 SSAmask.F90
CalvingFrontAdvance3D.F90 Emergence.F90 SSAmask.F90
GlaDSCoupledSolver.F90 GlaDSchannelSolver.F90 Flotation.F90
BasalMelt3D.F90 CalvingHydroInterp.F90 HydroRestart.F90
GMValid.F90 Scalar_OUTPUT_Glacier.F90 IcyMaskSolver.F90
BasalMelt3D.F90 CalvingHydroInterp.F90 HydroRestart.F90
Scalar_OUTPUT_Glacier.F90 IcyMaskSolver.F90
Weertman2Coulomb.F90)

SET(ElmerIce_SRC ${ElmerIce_SRC} ./Covarianceutils/CovarianceUtils.F90 ./Covarianceutils/BackgroundErrorCostSolver.F90 ./Covarianceutils/CovarianceVectorMultiplySolver.F90 ./Covarianceutils/GaussianSimulationSolver.F90)
Expand Down Expand Up @@ -123,7 +123,7 @@ ENDIF()
ADD_LIBRARY(ElmerIceSolvers SHARED ${ElmerIce_SRC})

# Library object
SET_TARGET_PROPERTIES(ElmerIceSolvers PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES(ElmerIceSolvers PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES(ElmerIceSolvers PROPERTIES
LINKER_LANGUAGE Fortran
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/fem/src/modules
Expand All @@ -137,7 +137,7 @@ ENDIF()
TARGET_LINK_LIBRARIES(ElmerIceSolvers Elmer::MPI_Fortran elmersolver ElmerIceUtils)

IF(HAVE_NETCDF)
TARGET_LINK_LIBRARIES(ElmerIceSolvers ${NETCDF_LIBRARIES})
TARGET_LINK_LIBRARIES(ElmerIceSolvers ${NETCDF_LIBRARIES})
ENDIF()
IF(HAVE_HDF5)
TARGET_LINK_LIBRARIES(ElmerIceSolvers ${PHDF5_LIBRARIES})
Expand All @@ -164,6 +164,6 @@ INSTALL(TARGETS ElmerIceSolvers LIBRARY DESTINATION "share/elmersolver/lib"
IF(HAVE_NETCDF)
ADD_SUBDIRECTORY(GridDataReader)
ENDIF()
IF(WITH_ScatteredDataInterpolator)
IF(WITH_ScatteredDataInterpolator)
ADD_SUBDIRECTORY(ScatteredDataInterpolator)
ENDIF()
9 changes: 9 additions & 0 deletions elmerice/Solvers/Calving3D.F90
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,13 @@ SUBROUTINE Find_Calving3D ( Model, Solver, dt, TransientSimulation )
END DO
END IF

IF(.NOT. Boss) THEN
ALLOCATE(FaceNodesT % x(1), FaceNodesT % y(1), FaceNodesT % z (1))
FaceNodesT % x(1) = 0
FaceNodesT % y(1) = 0
FaceNodesT % z(1) = 0
END IF

!Global NodeNumbers
CALL MPI_GATHERV(Mesh % ParallelInfo % GlobalDOFs(MyFaceNodeNums),&
FaceNodeCount,MPI_INTEGER,&
Expand Down Expand Up @@ -826,6 +833,7 @@ SUBROUTINE Find_Calving3D ( Model, Solver, dt, TransientSimulation )

CrevVar => VariableGet(PlaneMesh % Variables, "ave_cindex", .TRUE.)
PCSolver % Variable => CrevVar
PCSolver % Variable % Values => CrevVar % Values
PCSolver % Matrix % Perm => CrevVar % Perm

!----------------------------------------------------
Expand Down Expand Up @@ -1728,6 +1736,7 @@ SUBROUTINE Find_Calving3D ( Model, Solver, dt, TransientSimulation )

FirstTime = .FALSE.

PCSolver % Variable % Values => NULL()
PCSolver % Variable => NULL()
PCSolver % Matrix % Perm => NULL()
CALL FreeMatrix(PCSolver % Matrix)
Expand Down
75 changes: 54 additions & 21 deletions elmerice/Solvers/CalvingGeometry.F90
Original file line number Diff line number Diff line change
Expand Up @@ -458,15 +458,19 @@ SUBROUTINE CheckCrevasseNodes(Mesh, CrevassePaths, Onleft, OnRight)
DO i=1,Mesh % NumberOfBulkElements
DO j=1,SIZE(Mesh % Elements(i) % NodeIndexes)
IF(RemoveNode(Mesh % Elements(i) % NodeIndexes(j))) THEN
IF(PRESENT(OnLeft) .AND. OnLeft(Mesh % Elements(i) % NodeIndexes(j))) THEN
OnLeft(Mesh % Elements(i) % NodeIndexes(j)) = .FALSE.
OnLeft(ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))) = .TRUE.
IF(PRESENT(OnLeft)) THEN
IF(OnLeft(Mesh % Elements(i) % NodeIndexes(j))) THEN
OnLeft(Mesh % Elements(i) % NodeIndexes(j)) = .FALSE.
OnLeft(ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))) = .TRUE.
END IF
END IF
IF(PRESENT(OnRight) .AND. OnRight(Mesh % Elements(i) % NodeIndexes(j))) THEN
PRINT*, 'replace', Mesh % Elements(i) % NodeIndexes(j),&
ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))
OnRight(Mesh % Elements(i) % NodeIndexes(j)) = .FALSE.
OnRight(ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))) = .TRUE.
IF(PRESENT(OnRight)) THEN
IF(OnRight(Mesh % Elements(i) % NodeIndexes(j))) THEN
PRINT*, 'replace', Mesh % Elements(i) % NodeIndexes(j),&
ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))
OnRight(Mesh % Elements(i) % NodeIndexes(j)) = .FALSE.
OnRight(ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))) = .TRUE.
END IF
END IF
Mesh % Elements(i) % NodeIndexes(j) = &
ReplaceWithNode(Mesh % Elements(i) % NodeIndexes(j))
Expand Down Expand Up @@ -1499,41 +1503,62 @@ END SUBROUTINE ZeroPolygon
! Constructs groups of nodes which fall below a given threshold for some variable
! Used with the result of ProjectCalving, it groups nodes which have crevasse
! penetration beyond the threshold.
!
! Added August 2024 ([email protected]):
! Default is that valid mask values are only below the given threshold (e.g. shelf
! only). New logical optional argument AboveThreshold_Optional allows this to be
! reversed such that valid mask values are above the threshold (e.g. grounded)
!-----------------------------------------------------------------------------
SUBROUTINE FindCrevasseGroups(Mesh, Variable, Neighbours, Threshold, Groups)
SUBROUTINE FindCrevasseGroups(Mesh, Variable, Neighbours, Threshold, Groups, AboveThreshold_Optional)
IMPLICIT NONE

TYPE(Mesh_t), POINTER :: Mesh
TYPE(Variable_t), POINTER :: Variable
INTEGER, POINTER :: Neighbours(:,:)
TYPE(CrevasseGroup3D_t), POINTER :: Groups, CurrentGroup
REAL(KIND=dp) :: Threshold
TYPE(Mesh_t), POINTER :: Mesh
TYPE(Variable_t), POINTER :: Variable
INTEGER, POINTER :: Neighbours(:,:)
TYPE(CrevasseGroup3D_t), POINTER :: Groups
REAL(KIND=dp), INTENT(IN) :: Threshold
LOGICAL, INTENT(IN),OPTIONAL :: AboveThreshold_Optional
!---------------------------------------
TYPE(CrevasseGroup3D_t), POINTER :: CurrentGroup
INTEGER :: i, ID
REAL(KIND=dp), POINTER :: Values(:)
INTEGER, POINTER :: VPerm(:)
INTEGER, ALLOCATABLE :: WorkInt(:)
LOGICAL, ALLOCATABLE :: Condition(:)
LOGICAL :: First, Debug
LOGICAL :: First, Debug, AboveThreshold

Debug = .FALSE.

IF (PRESENT(AboveThreshold_Optional)) THEN
AboveThreshold = AboveThreshold_Optional
ELSE
AboveThreshold = .FALSE.
END IF

Values => Variable % Values
VPerm => Variable % Perm

ALLOCATE(Condition(Mesh % NumberOfNodes))
DO i=1, Mesh % NumberOfNodes

IF(VPerm(i) <= 0) THEN
Condition(i) = .FALSE.
ELSE IF(Values(VPerm(i)) < Threshold) THEN
Condition(i) = .TRUE.
ELSE
Condition(i) = .FALSE.
IF (AboveThreshold) THEN
IF (Values(VPerm(i)) .GT. Threshold) THEN
Condition(i) = .TRUE.
ELSE
Condition(i) = .FALSE.
END IF
ELSE
IF (Values(VPerm(i)) .LT. Threshold) THEN
Condition(i) = .TRUE.
ELSE
Condition(i) = .FALSE.
END IF
END IF
END IF

END DO

First = .TRUE.
ID = 1
DO i=1,Mesh % NumberOfNodes
Expand Down Expand Up @@ -2407,8 +2432,16 @@ SUBROUTINE GetDomainEdge(Model, Mesh, TopPerm, OrderedNodes, OrderedNodeNums, Pa
! Gather node coords from all partitions
! Note, they're going into 'UnorderedNodes': though they are ordered
! within their partition, the partitions aren't ordered...
! For some reason, need to allocate coord lists in non-boss PEs
!-----------------------------------------------------------

IF(.NOT. Boss) THEN
ALLOCATE(UnorderedNodes % x(1), UnorderedNodes % y(1), UnorderedNodes % z(1))
UnorderedNodes % x(1) = 0
UnorderedNodes % y(1) = 0
UnorderedNodes % z(1) = 0
END IF

!Global Node Numbers
CALL MPI_GATHERV(Mesh % ParallelInfo % GlobalDOFs(OrderedNodeNums),&
NoNodesOnEdge,MPI_INTEGER,&
Expand Down
Loading
Loading