Skip to content

Commit f76f99f

Browse files
Merge branch 'devel' into yac-coupling
2 parents df4bd30 + 85e16d0 commit f76f99f

23 files changed

+1169
-139
lines changed

CMakeLists.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ SET(WITH_CONTRIB FALSE CACHE BOOL "Include contributed solvers")
106106

107107
SET(WITH_LUA FALSE CACHE BOOL "Include LUA extensions.")
108108
SET(WITH_MMG FALSE CACHE BOOL "Compile with MMG library.")
109+
SET(WITH_PARMMG FALSE CACHE BOOL "Compile with PARMMG library.")
109110
SET(WITH_ROCALUTION FALSE CACHE BOOL "Compile with Rocalution library.")
110111

111112
SET(WITH_Zoltan FALSE CACHE BOOL "Link in Zoltan mesh repartitioning library.")
@@ -463,6 +464,7 @@ IF(WITH_MMG)
463464
MESSAGE(STATUS "------------------------------------------------")
464465

465466
ELSE()
467+
SET(HAVE_MMG FALSE)
466468
MESSAGE(STATUS " Library not found: >MMG_FOUND< ")
467469
MESSAGE(STATUS " Missing: >MMG_INCLUDE_DIR< , >MMG_LIBRARY<, to compile MMG3DSolver")
468470
ENDIF(MMG_FOUND)
@@ -487,11 +489,13 @@ IF(WITH_MMG)
487489
INCLUDE_DIRECTORIES(${PARMMG_INCLUDE_DIR})
488490
MESSAGE(STATUS "------------------------------------------------")
489491
ELSE()
492+
SET(HAVE_PARMMG FALSE)
490493
MESSAGE(STATUS " Library not found: >PARMMG_FOUND< ")
491494
MESSAGE(STATUS " Missing: >PARMMG_INCLUDE_DIR< , >PARMMG_LIBRARY<, to compile PARMMGSolver")
492495
ENDIF(PARMMG_FOUND)
493496
ELSE()
494497
SET(PARMMG_FOUND FALSE)
498+
SET(HAVE_PARMMG FALSE)
495499
MESSAGE(STATUS " Skipping ParMMG")
496500
# INCLUDE("cmake/Modules/FindParMMG.cmake")
497501
# INCLUDE_DIRECTORIES(${PARMMG_INCLUDE_DIR})
@@ -544,6 +548,27 @@ IF (WITH_XIOS)
544548
MESSAGE(STATUS "------------------------------------------------")
545549
ENDIF()
546550

551+
# Set environment variable ADIOS2_ROOT to point installation directory of adios (e.g. "/opt/adios/2.11")
552+
IF(WITH_ADIOS2)
553+
MESSAGE(STATUS "------------------------------------------------")
554+
MESSAGE(STATUS " Looking for ADIOS2")
555+
FIND_PACKAGE(ADIOS2 REQUIRED Fortran)
556+
IF(ADIOS2_FOUND)
557+
GET_TARGET_PROPERTY(ADIOS2_MOD_DIR adios2::fortran INTERFACE_INCLUDE_DIRECTORIES)
558+
INCLUDE_DIRECTORIES(${ADIOS2_MOD_DIR})
559+
SET(HAVE_ADIOS2 TRUE)
560+
MESSAGE(STATUS "------------------------------------------------")
561+
MESSAGE(STATUS " ADIOS2_FOUND: ${ADIOS2_FOUND}")
562+
MESSAGE(STATUS " ADIOS2_INCLUDE_DIR: ${ADIOS2_MOD_DIR}")
563+
MESSAGE(STATUS " ADIOS2_LIBRARIES: ${ADIOS2_LIBRARIES}")
564+
MESSAGE(STATUS "------------------------------------------------")
565+
ENDIF(ADIOS2_FOUND)
566+
567+
ENDIF(WITH_ADIOS2)
568+
569+
MESSAGE(STATUS "------------------------------------------------")
570+
ENDIF()
571+
547572
# YAC
548573
IF (WITH_YAC)
549574
MESSAGE(STATUS "------------------------------------------------")

elmergrid/src/egmesh.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7332,8 +7332,15 @@ void ElementsToBoundaryConditions(struct FemType *data,
73327332
sprintf(data->boundaryname[material],"body%d",material);
73337333
}
73347334
}
7335-
if(!strncmp(data->boundaryname[material],"body",4)) {
7336-
strncpy(data->boundaryname[material],"bnry",4);
7335+
7336+
if(material < MAXBCS ) {
7337+
if(!data->boundaryname[material]) data->boundaryname[material] = Cvector(0,MAXNAMESIZE);
7338+
if(!strncmp(data->boundaryname[material],"body",4)) {
7339+
strncpy(data->boundaryname[material],"bnry",4);
7340+
}
7341+
}
7342+
else {
7343+
printf("Boundary index %d exceeds the maximum allocated space for names %d\n",material,MAXBCS);
73377344
}
73387345
}
73397346

elmerice/Solvers/Flotation.F90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ SUBROUTINE Flotation( Model,Solver,dt,Transient )
284284
IF (.NOT.Gotit) &
285285
MinH = ListGetConstReal(Material,'Min '//TRIM(HName), Gotit)
286286
IF (.NOT.GotIt) CALL FATAL(SolverName,TRIM(HName)//" not found...but was supposed to be limited")
287-
IF (ALL((NodalH(1:n)-MinH(1:n)) < EPS)) IceFree=.TRUE.
287+
IF (ALL((NodalH(1:n)-MinH(1:n)) <= EPS)) IceFree=.TRUE.
288288
END IF
289289

290290
Density(1:n) = ListGetReal( Material, 'SSA Mean Density',n, NodeIndexes,UnFoundFatal=.TRUE.)
@@ -299,7 +299,7 @@ SUBROUTINE Flotation( Model,Solver,dt,Transient )
299299
! if bedrock defined check flotation criterion
300300
IF(ASSOCIATED(BedVar)) THEN
301301
bedrock=BedVar%Values(BedVar%Perm(NodeIndexes(i)))
302-
IF (zb < bedrock) THEN
302+
IF (zb <= bedrock) THEN
303303
zb=bedrock
304304
GL(i)=1
305305
GroundedNode=GroundedNode+1

elmerice/Solvers/GroundedSolver.F90

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ SUBROUTINE GroundedSolver( Model,Solver,dt,TransientSimulation )
8282
LOGICAL :: AllocationsDone = .FALSE., GotIt, stat,UnFoundFatal=.TRUE.,&
8383
AllGrounded = .FALSE., useLSvar = .FALSE., Active
8484

85-
INTEGER :: i, mn, n, t, Nn, istat, DIM, MSum, ZSum, bedrockSource
85+
INTEGER :: i, mn, n, t, Nn, istat, DIM, MSum, ZSum, bedrockSource, k
8686
INTEGER, POINTER :: Permutation(:), bedrockPerm(:), LSvarPerm(:)
8787

8888
REAL(KIND=dp), POINTER :: VariableValues(:)
@@ -105,6 +105,14 @@ SUBROUTINE GroundedSolver( Model,Solver,dt,TransientSimulation )
105105

106106
Active = ANY(Permutation > 0)
107107

108+
! Initialize GroundedMask for all active DOFs.
109+
! This avoids leaving halo/ghost nodes with default value 0
110+
IF (Active) THEN
111+
DO k = 1, SIZE(VariableValues)
112+
IF (Permutation(k) > 0) VariableValues(Permutation(k)) = 1.0_dp
113+
END DO
114+
END IF
115+
108116
CALL INFO(SolverName, 'Computing grounded mask from geometry', level=3)
109117

110118
!--------------------------------------------------------------

elmerice/Solvers/SSASolver.F90

Lines changed: 41 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,10 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
156156
END IF
157157

158158
sealevel = ListGetCReal( Model % Constants, 'Sea Level', Found )
159-
If (.NOT.Found) Then
160-
WRITE(Message,'(A)') 'Constant >Sea Level< not found. &
161-
&Setting to 0.0'
162-
CALL INFO(SolverName, Message, level=20)
163-
sealevel=0.0_dp
164-
End if
159+
IF (.NOT.Found) THEN
160+
WRITE(Message,'(A)') 'Constant >Sea Level< not found. Setting to zero.'
161+
CALL INFO(SolverName, Message, level=20)
162+
END IF
165163

166164
!--------------------------------------------------------------
167165
!Allocate some permanent storage, this is done first time only:
@@ -171,10 +169,9 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
171169
! Get some constants
172170
rhow = ListGetConstReal( Model % Constants, 'Water Density', Found)
173171
If (.NOT.Found) Then
174-
WRITE(Message,'(A)') 'Constant Water Density not found. &
175-
&Setting to 1.03225e-18'
176-
CALL INFO(SolverName, Message, level=20)
177172
rhow = 1.03225e-18_dp
173+
WRITE(Message,*) 'Constant Water Density not found. Setting to: ',rhow
174+
CALL INFO(SolverName, Message, level=20)
178175
End if
179176

180177
! Allocate
@@ -183,9 +180,8 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
183180
M = Model % Mesh % NumberOfNodes
184181
IF (AllocationsDone) DEALLOCATE(FORCE, LOAD, STIFF, NodalGravity, &
185182
NodalViscosity, NodalDensity, &
186-
NodalZb, NodalZs, NodalU, NodalV, &
187-
ElementNodes % x, &
188-
ElementNodes % y, ElementNodes % z ,Basis)
183+
NodalZb, NodalZs, NodalU, NodalV, &
184+
ElementNodes % x, ElementNodes % y, ElementNodes % z ,Basis)
189185

190186
ALLOCATE( FORCE(STDOFs*N), LOAD(N), STIFF(STDOFs*N,STDOFs*N), &
191187
NodalGravity(N), NodalDensity(N), NodalViscosity(N), &
@@ -214,7 +210,6 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
214210

215211
NonlinearIter = GetInteger( Solver % Values, &
216212
'Nonlinear System Max Iterations',GotIt )
217-
218213
IF ( .NOT.GotIt ) NonlinearIter = 1
219214

220215
NewtonTol = ListGetConstReal( Solver % Values, &
@@ -356,7 +351,6 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
356351
IF (.NOT.ASSOCIATED( BC ) ) CYCLE
357352

358353
! Find the nodes for which 'Calving Front' = True
359-
CalvingFront=.False.
360354
CalvingFront = ListGetLogical( BC, 'Calving Front', GotIt )
361355
IF (CalvingFront) THEN
362356

@@ -396,7 +390,7 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
396390
UnFoundFatal=UnFoundFatal)
397391

398392
MinH = ListGetConstReal( Material, 'SSA Critical Thickness',Found)
399-
If (.NOT.Found) MinH=EPSILON(MinH)
393+
If (.NOT.Found) MinH = EPSILON(MinH)
400394

401395
NodalGravity = 0.0_dp
402396
IF ( ASSOCIATED( BodyForce ) ) THEN
@@ -470,12 +464,12 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
470464

471465
strbasemag => VariableGet( Solver % Mesh % Variables,"strbasemag")
472466
IF (ASSOCIATED(strbasemag)) THEN
473-
! sanity check
474-
IF (strbasemag % TYPE /= Variable_on_elements) &
475-
CALL FATAL(SolverName,"strbasemag type should be on_elements")
476-
IF (.NOT.ASSOCIATED(strbasemag % Perm)) &
477-
CALL FATAL(SolverName,"strbasemag perm not associated")
478-
strbasemag % Values=0._dp
467+
! sanity check
468+
IF (strbasemag % TYPE /= Variable_on_elements) &
469+
CALL FATAL(SolverName,"strbasemag type should be on_elements")
470+
IF (.NOT.ASSOCIATED(strbasemag % Perm)) &
471+
CALL FATAL(SolverName,"strbasemag perm not associated")
472+
strbasemag % Values = 0._dp
479473
END IF
480474

481475
Ceff => VariableGet( Solver % Mesh % Variables,"Ceff")
@@ -503,7 +497,6 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
503497
'It is not possible to compute SSA problems with DOFs=',&
504498
STDOFs, ' . Aborting'
505499
CALL Fatal( SolverName, Message)
506-
STOP
507500
END IF
508501

509502
Material => GetMaterial(Element)
@@ -524,49 +517,49 @@ SUBROUTINE SSABasalSolver( Model,Solver,dt,TransientSimulation )
524517

525518
IF (ASSOCIATED(strbasemag)) THEN
526519
IF (strbasemag % Perm(Element % ElementIndex) > 0) &
527-
strbasemag% Values(strbasemag % Perm(Element % ElementIndex))= &
528-
ComputeMeanFriction(Element,n,ElementNodes,STDOFs,NodalU,NodalV,NodalZs,NodalZb,MinH,NodalDensity,SEP,GLnIP,sealevel,rhow)
520+
strbasemag% Values(strbasemag % Perm(Element % ElementIndex))= &
521+
ComputeMeanFriction(Element,n,ElementNodes,STDOFs,NodalU,NodalV,&
522+
NodalZs,NodalZb,MinH,NodalDensity,SEP,GLnIP,sealevel,rhow)
529523
END IF
530524

531525
IF (ASSOCIATED(Ceff)) THEN
532526
Do i=1,n
533527
stat = ElementInfo( Element, ElementNodes, Element % Type % NodeU(i) , Element % Type % NodeV(i),&
534-
Element % Type % NodeW(i), detJ, Basis )
535-
un=0._dp
528+
Element % Type % NodeW(i), detJ, Basis )
529+
un = 0._dp
536530
Do j=1,STDOFs
537-
un = un + VeloSol % Values(STDOFs*(VeloSol % Perm(NodeIndexes(i))-1)+j) &
538-
*VeloSol % Values(STDOFs*(VeloSol % Perm(NodeIndexes(i))-1)+j)
531+
un = un + VeloSol % Values(STDOFs*(VeloSol % Perm(NodeIndexes(i))-1)+j)**2
539532
End do
540-
un=sqrt(un)
533+
un = SQRT(un)
541534

542-
h=MAX(SUM(Basis(1:n)*(NodalZs(1:n)-NodalZb(1:n))),MinH)
535+
h = MAX(SUM(Basis(1:n)*(NodalZs(1:n)-NodalZb(1:n))),MinH)
543536
Ceff%Values(Ceff%Perm(NodeIndexes(i)))= &
544-
SSAEffectiveFriction(Element,n,Basis,un,SEP,.TRUE.,h,SUM(NodalDensity(1:n)*Basis(1:n)),rhow,sealevel)
537+
SSAEffectiveFriction(Element,n,Basis,un,SEP,.TRUE.,h,SUM(NodalDensity(1:n)*Basis(1:n)),rhow,sealevel)
545538
End do
546539
End IF
547540

548-
END DO
541+
END DO
549542
END IF
550543

551544

552545
! scale the results if a given limit is given... use with care?
553546
UnLimit = ListGetConstReal(SolverParams,'velocity norm limit',GotIt)
554547
IF (GotIt) THEN
555-
Do i=1,Solver%Mesh%NumberOfNodes
556-
un=0._dp
557-
Do j=1,STDOFs
558-
un=un+VariableValues(STDOFs*(i-1)+j)*VariableValues(STDOFs*(i-1)+j)
559-
End do
560-
un=sqrt(un)
561-
IF (un > 0._dp) THEN
562-
un_max=UnLimit/un
563-
IF (un_max < 1.0_dp) THEN
564-
Do j=1,STDOFs
565-
VariableValues(STDOFs*(i-1)+j)=VariableValues(STDOFs*(i-1)+j)*un_max
566-
End do
567-
END IF
568-
END IF
569-
End do
548+
DO i=1,Solver%Mesh%NumberOfNodes
549+
un=0._dp
550+
DO j=1,STDOFs
551+
un=un+VariableValues(STDOFs*(i-1)+j)**2
552+
END DO
553+
un=SQRT(un)
554+
IF (un > 0._dp) THEN
555+
un_max=UnLimit/un
556+
IF (un_max < 1.0_dp) THEN
557+
DO j=1,STDOFs
558+
VariableValues(STDOFs*(i-1)+j)=VariableValues(STDOFs*(i-1)+j)*un_max
559+
END DO
560+
END IF
561+
END IF
562+
END DO
570563
END IF
571564

572565
CALL DefaultFinish()
@@ -622,7 +615,7 @@ SUBROUTINE LocalMatrixUVSSA( STIFF, FORCE, Element, n, Nodes, gravity, &
622615
ELSE
623616
GMSol => VariableGet( CurrentModel % Variables, 'GroundedMask',UnFoundFatal=.TRUE. )
624617
CALL GetLocalSolution( NodalGM,UElement=Element,UVariable=GMSol)
625-
PartlyGroundedElement=(ANY(NodalGM(1:n) > 0._dp) .AND. ANY(NodalGM(1:n) < 0._dp))
618+
PartlyGroundedElement=(ANY(NodalGM(1:n) >= 0._dp) .AND. ANY(NodalGM(1:n) < 0._dp))
626619
IF (PartlyGroundedElement) THEN
627620
IP = GaussPoints( Element , np=GLnIP )
628621
ELSE

0 commit comments

Comments
 (0)