Skip to content

Commit 92ccc68

Browse files
Merge pull request #15087 from marcosvanella/master
FDS Source : UGLMAT HYPRE, compute only in MPI processes with nonzero unkowns.
2 parents 4ec3e63 + f3a42a4 commit 92ccc68

34 files changed

+2035
-91
lines changed

Build/Scripts/set_compilers.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,11 @@ set_compiler_from_env_var COMP_CXX FIREMODELS_CXX set_COMP_CXX
5454
set_compiler_from_env_var COMP_FC FIREMODELS_FC set_COMP_FC
5555

5656
# Determine compiler list based on build target
57-
if [[ "$FDS_BUILD_TARGET" == *"osx"* ]]; then
57+
if [[ "$FDS_BUILD_TARGET" == "ompi_intel"* ]]; then
58+
select_compiler_from_system COMP_CC mpicc icx
59+
select_compiler_from_system COMP_CXX mpicxx icpx
60+
select_compiler_from_system COMP_FC mpifort
61+
elif [[ "$FDS_BUILD_TARGET" == *"osx"* ]]; then
5862
select_compiler_from_system COMP_CC mpicc clang gcc
5963
select_compiler_from_system COMP_CXX mpicxx clang++ g++
6064
select_compiler_from_system COMP_FC mpifort

Source/pres.f90

Lines changed: 104 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -3059,6 +3059,14 @@ MODULE GLOBMAT_SOLVER
30593059
! Handle for ZONE_SOLVER array entries:
30603060
TYPE(ZONE_SOLVE_TYPE), POINTER :: ZSL
30613061

3062+
! Communicator for each zone:
3063+
#ifdef WITH_HYPRE
3064+
TYPE ZSL_COMM_TYPE
3065+
TYPE(MPI_COMM) :: COMM
3066+
END TYPE ZSL_COMM_TYPE
3067+
TYPE(ZSL_COMM_TYPE), ALLOCATABLE, DIMENSION(:) :: ZSL_COMM
3068+
#endif
3069+
30623070
! Matrix types:
30633071
INTEGER, PARAMETER :: SYMM_INDEFINITE =-2
30643072
INTEGER, PARAMETER :: SYMM_POSITIVE_DEFINITE= 2
@@ -3209,15 +3217,17 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
32093217
#ifdef WITH_HYPRE
32103218
IF (ZSL%MTYPE==SYMM_INDEFINITE .AND. ZSL%UPPER_ROW==ZSL%NUNKH_TOTAL) ZSL%F_H(MAX(ZSL%NUNKH_LOCAL,1)) = 0._EB
32113219
! Solve the system using HYPRE:
3212-
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%F_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%F_H, HYPRE_IERR)
3213-
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
3214-
CALL HYPRE_PARCSRPCGSOLVE(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%PARCSR_A_H, ZSL%HYPRE_ZSL%PAR_F_H, &
3215-
ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
3216-
IF (CHECK_POISSON .AND. HYPRE_SOLVER_SETPRINTLEVEL>0) THEN
3217-
CALL HYPRE_PARCSRPCGGETNUMITERATIONS(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%NUM_ITERATIONS, HYPRE_IERR)
3218-
CALL HYPRE_PARCSRPCGGETFINALRELATIVE(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%FINAL_RES_NORM, HYPRE_IERR)
3220+
IF(ZSL%NUNKH_LOCAL > 0) THEN
3221+
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%F_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%F_H, HYPRE_IERR)
3222+
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
3223+
CALL HYPRE_PARCSRPCGSOLVE(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%PARCSR_A_H, ZSL%HYPRE_ZSL%PAR_F_H, &
3224+
ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
3225+
IF (CHECK_POISSON .AND. HYPRE_SOLVER_SETPRINTLEVEL>0) THEN
3226+
CALL HYPRE_PARCSRPCGGETNUMITERATIONS(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%NUM_ITERATIONS, HYPRE_IERR)
3227+
CALL HYPRE_PARCSRPCGGETFINALRELATIVE(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%FINAL_RES_NORM, HYPRE_IERR)
3228+
ENDIF
3229+
CALL HYPRE_IJVECTORGETVALUES(ZSL%HYPRE_ZSL%X_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%X_H, HYPRE_IERR)
32193230
ENDIF
3220-
CALL HYPRE_IJVECTORGETVALUES(ZSL%HYPRE_ZSL%X_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%X_H, HYPRE_IERR)
32213231
#endif
32223232

32233233
END SELECT LIBRARY_SELECT
@@ -3931,8 +3941,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39313941
INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MB_FACTOR
39323942
#endif
39333943
#ifdef WITH_HYPRE
3934-
INTEGER :: ONEV(1), END_ROW
3935-
REAL(EB) :: ZEROV(1)
3944+
INTEGER ::END_ROW, COLOR
39363945
CHARACTER(FN_LENGTH) :: FN_PARCSRPCG_MATRIX
39373946
#endif
39383947
!.. All other variables
@@ -3963,6 +3972,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39633972
STOP_STATUS = SETUP_STOP
39643973
RETURN
39653974
ENDIF
3975+
ALLOCATE(ZSL_COMM(0:N_ZONE_GLOBMAT))
39663976
#endif
39673977
END SELECT
39683978

@@ -4104,97 +4114,100 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
41044114
IF (ALLOCATED(ZSL%HYPRE_ZSL%INDICES)) DEALLOCATE(ZSL%HYPRE_ZSL%INDICES)
41054115
ALLOCATE( ZSL%HYPRE_ZSL%INDICES(MAX(1,ZSL%NUNKH_LOCAL)) )
41064116

4107-
CALL HYPRE_IJMATRIXCREATE(MPI_COMM_WORLD,ZSL%LOWER_ROW-1,ZSL%UPPER_ROW-1,&
4108-
ZSL%LOWER_ROW-1,ZSL%UPPER_ROW-1,ZSL%HYPRE_ZSL%A_H,HYPRE_IERR)
4109-
CALL HYPRE_IJMATRIXSETOBJECTTYPE(ZSL%HYPRE_ZSL%A_H,HYPRE_PARCSR,HYPRE_IERR)
4110-
CALL HYPRE_IJMATRIXINITIALIZE(ZSL%HYPRE_ZSL%A_H,HYPRE_IERR)
4111-
IF (ZSL%MTYPE==SYMM_INDEFINITE) THEN
4112-
IF(ZSL%NUNKH_TOTAL==1) THEN ! Single unknown, zero coefficient matrix (1,1). Set coefficient to 1.
4113-
IF(ZSL%NUNKH_LOCAL==1) THEN
4114-
ZSL%NNZ_D_MAT_H(1) = 1
4115-
DEALLOCATE(ZSL%JD_MAT_H); ALLOCATE(ZSL%JD_MAT_H(1,1)); ZSL%JD_MAT_H(1,1) = 1
4116-
DEALLOCATE(ZSL%D_MAT_H ); ALLOCATE(ZSL%D_MAT_H(1,1) ); ZSL%D_MAT_H(1,1) = 1._EB
4117-
ENDIF
4118-
ELSE ! More than one unknown
4119-
IF(ZSL%UPPER_ROW==ZSL%NUNKH_TOTAL) THEN
4120-
END_ROW = ZSL%NUNKH_LOCAL-1
4121-
ELSE
4122-
END_ROW = ZSL%NUNKH_LOCAL
4123-
ENDIF
4124-
! Rows 1 to ZM%NUNKH-1, last column, set all to zero:
4125-
DO IROW=1,END_ROW
4126-
DO JCOL=1,ZSL%NNZ_D_MAT_H(IROW)
4127-
IF ( ZSL%JD_MAT_H(JCOL,IROW) /= ZSL%NUNKH_TOTAL ) CYCLE ! Make zero matrix entries in last column.
4128-
ZSL%D_MAT_H(JCOL,IROW) = 0._EB
4129-
ENDDO
4130-
ENDDO
4131-
! Last row, all zeros except the diagonal that keeps diagonal number:
4132-
IF(ZSL%UPPER_ROW==ZSL%NUNKH_TOTAL) THEN
4133-
IROW = ZSL%NUNKH_LOCAL
4134-
DO JCOL=1,ZSL%NNZ_D_MAT_H(IROW)
4135-
IF ( ZSL%JD_MAT_H(JCOL,IROW) /= ZSL%NUNKH_TOTAL ) ZSL%D_MAT_H(JCOL,IROW) = 0._EB
4117+
COLOR = MPI_UNDEFINED; IF(ZSL%NUNKH_LOCAL > 0) COLOR = 1
4118+
CALL MPI_COMM_SPLIT(MPI_COMM_WORLD,COLOR,0,ZSL_COMM(IPZ)%COMM,HYPRE_IERR)
4119+
4120+
IF(ZSL%NUNKH_LOCAL > 0) THEN
4121+
CALL HYPRE_IJMATRIXCREATE(ZSL_COMM(IPZ)%COMM,ZSL%LOWER_ROW-1,ZSL%UPPER_ROW-1,&
4122+
ZSL%LOWER_ROW-1,ZSL%UPPER_ROW-1,ZSL%HYPRE_ZSL%A_H,HYPRE_IERR)
4123+
4124+
CALL HYPRE_IJMATRIXSETOBJECTTYPE(ZSL%HYPRE_ZSL%A_H,HYPRE_PARCSR,HYPRE_IERR)
4125+
CALL HYPRE_IJMATRIXINITIALIZE(ZSL%HYPRE_ZSL%A_H,HYPRE_IERR)
4126+
4127+
IF (ZSL%MTYPE==SYMM_INDEFINITE) THEN
4128+
IF(ZSL%NUNKH_TOTAL==1) THEN ! Single unknown, zero coefficient matrix (1,1). Set coefficient to 1.
4129+
IF(ZSL%NUNKH_LOCAL==1) THEN
4130+
ZSL%NNZ_D_MAT_H(1) = 1
4131+
DEALLOCATE(ZSL%JD_MAT_H); ALLOCATE(ZSL%JD_MAT_H(1,1)); ZSL%JD_MAT_H(1,1) = 1
4132+
DEALLOCATE(ZSL%D_MAT_H ); ALLOCATE(ZSL%D_MAT_H(1,1) ); ZSL%D_MAT_H(1,1) = 1._EB
4133+
ENDIF
4134+
ELSE ! More than one unknown
4135+
IF(ZSL%UPPER_ROW==ZSL%NUNKH_TOTAL) THEN
4136+
END_ROW = ZSL%NUNKH_LOCAL-1
4137+
ELSE
4138+
END_ROW = ZSL%NUNKH_LOCAL
4139+
ENDIF
4140+
! Rows 1 to ZM%NUNKH-1, last column, set all to zero:
4141+
DO IROW=1,END_ROW
4142+
DO JCOL=1,ZSL%NNZ_D_MAT_H(IROW)
4143+
IF ( ZSL%JD_MAT_H(JCOL,IROW) /= ZSL%NUNKH_TOTAL ) CYCLE ! Make zero matrix entries in last column.
4144+
ZSL%D_MAT_H(JCOL,IROW) = 0._EB
4145+
ENDDO
41364146
ENDDO
4147+
! Last row, all zeros except the diagonal that keeps diagonal number:
4148+
IF(ZSL%UPPER_ROW==ZSL%NUNKH_TOTAL) THEN
4149+
IROW = ZSL%NUNKH_LOCAL
4150+
DO JCOL=1,ZSL%NNZ_D_MAT_H(IROW)
4151+
IF ( ZSL%JD_MAT_H(JCOL,IROW) /= ZSL%NUNKH_TOTAL ) ZSL%D_MAT_H(JCOL,IROW) = 0._EB
4152+
ENDDO
4153+
ENDIF
41374154
ENDIF
41384155
ENDIF
4139-
ENDIF
4140-
IF(ZSL%NUNKH_LOCAL > 0) THEN
4156+
41414157
ZSL%JD_MAT_H = ZSL%JD_MAT_H - 1
41424158
DO IROW=1,ZSL%NUNKH_LOCAL
41434159
ZSL%HYPRE_ZSL%INDICES(IROW)=ZSL%LOWER_ROW+IROW-2
41444160
CALL HYPRE_IJMATRIXSETVALUES(ZSL%HYPRE_ZSL%A_H, 1, ZSL%NNZ_D_MAT_H(IROW), ZSL%HYPRE_ZSL%INDICES(IROW), &
41454161
ZSL%JD_MAT_H(1:ZSL%NNZ_D_MAT_H(IROW),IROW), ZSL%D_MAT_H(1:ZSL%NNZ_D_MAT_H(IROW),IROW), HYPRE_IERR)
41464162
ENDDO
4147-
ELSE
4148-
ZSL%HYPRE_ZSL%INDICES(1)=ZSL%LOWER_ROW-1
4149-
ONEV(1) = 1; ZEROV(1) = 0._EB
4150-
! Define a zero coefficient in A(ZSL%LOWER_ROW-1,ZSL%LOWER_ROW-1):
4151-
CALL HYPRE_IJMATRIXSETVALUES(ZSL%HYPRE_ZSL%A_H, 1, ONEV(1), ZSL%HYPRE_ZSL%INDICES(1), &
4152-
ZSL%HYPRE_ZSL%INDICES(1), ZEROV(1), HYPRE_IERR)
4153-
ENDIF
4154-
CALL HYPRE_IJMATRIXASSEMBLE(ZSL%HYPRE_ZSL%A_H, HYPRE_IERR)
4155-
CALL HYPRE_IJMATRIXGETOBJECT(ZSL%HYPRE_ZSL%A_H, ZSL%HYPRE_ZSL%PARCSR_A_H, HYPRE_IERR)
4156-
! Create right hand side vector
4157-
CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL%LOWER_ROW-1, ZSL%UPPER_ROW-1, ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4158-
CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL%HYPRE_ZSL%F_H, HYPRE_PARCSR, HYPRE_IERR)
4159-
CALL HYPRE_IJVECTORINITIALIZE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4160-
! Create solution vector
4161-
CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL%LOWER_ROW-1, ZSL%UPPER_ROW-1, ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4162-
CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL%HYPRE_ZSL%X_H, HYPRE_PARCSR, HYPRE_IERR)
4163-
CALL HYPRE_IJVECTORINITIALIZE(ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4164-
! Set values
4165-
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%F_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%F_H, HYPRE_IERR)
4166-
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%X_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%X_H, HYPRE_IERR)
4167-
! Assemble vectors
4168-
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4169-
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4170-
! Get rhs and soln objects
4171-
CALL HYPRE_IJVECTORGETOBJECT(ZSL%HYPRE_ZSL%F_H, ZSL%HYPRE_ZSL%PAR_F_H, HYPRE_IERR)
4172-
CALL HYPRE_IJVECTORGETOBJECT(ZSL%HYPRE_ZSL%X_H, ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
41734163

4174-
! Create solver (Parallel Compressed Sparse Row Preconditioned Conjugate Gradient)
4175-
CALL HYPRE_PARCSRPCGCREATE(MPI_COMM_WORLD, ZSL%HYPRE_ZSL%SOLVER, HYPRE_IERR)
4176-
CALL HYPRE_PARCSRPCGSETMAXITER(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_MAXIT, HYPRE_IERR)
4177-
CALL HYPRE_PARCSRPCGSETTOL(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_TOL, HYPRE_IERR)
4178-
CALL HYPRE_PARCSRPCGSETTWONORM(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETTWONORM, HYPRE_IERR)
4179-
CALL HYPRE_PARCSRPCGSETPRINTLEVEL(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETPRINTLEVEL, HYPRE_IERR)
4180-
CALL HYPRE_PARCSRPCGSETLOGGING(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETLOGGING, HYPRE_IERR)
4181-
4182-
! Set up the Algebraic Multi-Grid (AMG) preconditioner and specify any parameters
4183-
CALL HYPRE_BOOMERAMGCREATE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_IERR)
4184-
CALL HYPRE_BOOMERAMGSETPRINTLEVEL(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_SETPRINTLEVEL, HYPRE_IERR)
4185-
CALL HYPRE_BOOMERAMGSETCOARSENTYPE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_COARSENINGTYPE, HYPRE_IERR)
4186-
CALL HYPRE_BOOMERAMGSETRELAXTYPE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_SETRELAXTYPE, HYPRE_IERR)
4187-
CALL HYPRE_BOOMERAMGSETNUMSWEEPS(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_NUMSWEEPS, HYPRE_IERR)
4188-
CALL HYPRE_BOOMERAMGSETTOL(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_TOL, HYPRE_IERR)
4189-
CALL HYPRE_BOOMERAMGSETMAXITER(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_MAXITER, HYPRE_IERR)
4190-
CALL HYPRE_PARCSRPCGSETPRECOND(ZSL%HYPRE_ZSL%SOLVER, HYPRE_PRECOND_ID, ZSL%HYPRE_ZSL%PRECOND, HYPRE_IERR)
4191-
! Solver setup
4192-
IF(WRITE_PARCSRPCG_MATRIX) THEN
4193-
WRITE(FN_PARCSRPCG_MATRIX,'(A,A)') TRIM(CHID),'_hypre_matrix.txt'
4194-
CALL HYPRE_PARCSRMATRIXPRINT(ZSL%HYPRE_ZSL%PARCSR_A_H, TRIM(FN_PARCSRPCG_MATRIX), LEN(TRIM(FN_PARCSRPCG_MATRIX)), HYPRE_IERR)
4164+
CALL HYPRE_IJMATRIXASSEMBLE(ZSL%HYPRE_ZSL%A_H, HYPRE_IERR)
4165+
CALL HYPRE_IJMATRIXGETOBJECT(ZSL%HYPRE_ZSL%A_H, ZSL%HYPRE_ZSL%PARCSR_A_H, HYPRE_IERR)
4166+
4167+
! Create right hand side vector
4168+
CALL HYPRE_IJVECTORCREATE(ZSL_COMM(IPZ)%COMM, ZSL%LOWER_ROW-1, ZSL%UPPER_ROW-1, ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4169+
CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL%HYPRE_ZSL%F_H, HYPRE_PARCSR, HYPRE_IERR)
4170+
CALL HYPRE_IJVECTORINITIALIZE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4171+
! Create solution vector
4172+
CALL HYPRE_IJVECTORCREATE(ZSL_COMM(IPZ)%COMM, ZSL%LOWER_ROW-1, ZSL%UPPER_ROW-1, ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4173+
CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL%HYPRE_ZSL%X_H, HYPRE_PARCSR, HYPRE_IERR)
4174+
CALL HYPRE_IJVECTORINITIALIZE(ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4175+
! Set values
4176+
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%F_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%F_H, HYPRE_IERR)
4177+
CALL HYPRE_IJVECTORSETVALUES(ZSL%HYPRE_ZSL%X_H, ZSL%NUNKH_LOCAL, ZSL%HYPRE_ZSL%INDICES, ZSL%X_H, HYPRE_IERR)
4178+
! Assemble vectors
4179+
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%F_H, HYPRE_IERR)
4180+
CALL HYPRE_IJVECTORASSEMBLE(ZSL%HYPRE_ZSL%X_H, HYPRE_IERR)
4181+
! Get rhs and soln objects
4182+
CALL HYPRE_IJVECTORGETOBJECT(ZSL%HYPRE_ZSL%F_H, ZSL%HYPRE_ZSL%PAR_F_H, HYPRE_IERR)
4183+
CALL HYPRE_IJVECTORGETOBJECT(ZSL%HYPRE_ZSL%X_H, ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
4184+
4185+
! Create solver (Parallel Compressed Sparse Row Preconditioned Conjugate Gradient)
4186+
CALL HYPRE_PARCSRPCGCREATE(ZSL_COMM(IPZ)%COMM, ZSL%HYPRE_ZSL%SOLVER, HYPRE_IERR)
4187+
CALL HYPRE_PARCSRPCGSETMAXITER(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_MAXIT, HYPRE_IERR)
4188+
CALL HYPRE_PARCSRPCGSETTOL(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_TOL, HYPRE_IERR)
4189+
CALL HYPRE_PARCSRPCGSETTWONORM(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETTWONORM, HYPRE_IERR)
4190+
CALL HYPRE_PARCSRPCGSETPRINTLEVEL(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETPRINTLEVEL, HYPRE_IERR)
4191+
CALL HYPRE_PARCSRPCGSETLOGGING(ZSL%HYPRE_ZSL%SOLVER, HYPRE_SOLVER_SETLOGGING, HYPRE_IERR)
4192+
4193+
! Set up the Algebraic Multi-Grid (AMG) preconditioner and specify any parameters
4194+
CALL HYPRE_BOOMERAMGCREATE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_IERR)
4195+
CALL HYPRE_BOOMERAMGSETPRINTLEVEL(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_SETPRINTLEVEL, HYPRE_IERR)
4196+
CALL HYPRE_BOOMERAMGSETCOARSENTYPE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_COARSENINGTYPE, HYPRE_IERR)
4197+
CALL HYPRE_BOOMERAMGSETRELAXTYPE(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_SETRELAXTYPE, HYPRE_IERR)
4198+
CALL HYPRE_BOOMERAMGSETNUMSWEEPS(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_NUMSWEEPS, HYPRE_IERR)
4199+
CALL HYPRE_BOOMERAMGSETTOL(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_TOL, HYPRE_IERR)
4200+
CALL HYPRE_BOOMERAMGSETMAXITER(ZSL%HYPRE_ZSL%PRECOND, HYPRE_PRECOND_MAXITER, HYPRE_IERR)
4201+
CALL HYPRE_PARCSRPCGSETPRECOND(ZSL%HYPRE_ZSL%SOLVER, HYPRE_PRECOND_ID, ZSL%HYPRE_ZSL%PRECOND, HYPRE_IERR)
4202+
! Solver setup
4203+
IF(WRITE_PARCSRPCG_MATRIX) THEN
4204+
WRITE(FN_PARCSRPCG_MATRIX,'(A,A)') TRIM(CHID),'_hypre_matrix.txt'
4205+
CALL HYPRE_PARCSRMATRIXPRINT(ZSL%HYPRE_ZSL%PARCSR_A_H, TRIM(FN_PARCSRPCG_MATRIX), &
4206+
LEN(TRIM(FN_PARCSRPCG_MATRIX)), HYPRE_IERR)
4207+
ENDIF
4208+
CALL HYPRE_PARCSRPCGSETUP(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%PARCSR_A_H,&
4209+
ZSL%HYPRE_ZSL%PAR_F_H, ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
41954210
ENDIF
4196-
CALL HYPRE_PARCSRPCGSETUP(ZSL%HYPRE_ZSL%SOLVER, ZSL%HYPRE_ZSL%PARCSR_A_H,&
4197-
ZSL%HYPRE_ZSL%PAR_F_H, ZSL%HYPRE_ZSL%PAR_X_H, HYPRE_IERR)
41984211
#endif
41994212

42004213
END SELECT LIBRARY_SELECT
@@ -5377,6 +5390,7 @@ SUBROUTINE FINISH_GLMAT_SOLVER
53775390
IF (UGLMAT_SOLVER_LIBRARY==HYPRE_FLAG) THEN
53785391
#ifdef WITH_HYPRE
53795392
CALL HYPRE_FINALIZE(HYPRE_IERR)
5393+
DEALLOCATE(ZSL_COMM)
53805394
#endif
53815395
ENDIF
53825396

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
! Routines to test colocated schemes for Low Mach model time integration.
2+
! Test cases:
3+
! 1. taylor_green_vortex.m : Test overall accuracy on structured grids with Nx x Ny cells.
4+
! Same parameters as ns2d set of verification cases in FDS_Verification_Guide.pdf.
5+
! Performs 2 tests : a) L2 error norm of momentum at T_end over the whole domain.
6+
! b) RMS error of U-Velocity in center point over all time integration steps,
7+
! (same as done in the FDS verification guide).
8+
!
9+
! ------------------------------------------------------------------------------------------------
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
function [FB_cell, FB_face_n] = build_FB_cell_face(p_cell, rho_cell, cells, faces, Lx, Ly)
2+
% p_cell : Nc x 1 pressure (or Bernoulli-pressure part) at cells
3+
% rho_cell : Nc x 1 density at cells
4+
% Outputs:
5+
% FB_cell : Nc x 2 vector -p * ∇(1/ρ) at cells
6+
% FB_face_n : Nf x 1 scalar face-normal avg: 0.5(FB_P+FB_N)·n_f
7+
8+
Nc = numel(cells); Nf = numel(faces);
9+
10+
invR = 1 ./ rho_cell; % 1/ρ at cells
11+
gradInvR = ls_grad_scalar_2d(invR, cells, faces, Lx, Ly); % ∇(1/ρ) at cells
12+
13+
% Cell-centered F_B = - p * ∇(1/ρ)
14+
FB_cell = - p_cell(:) .* gradInvR; % implicit expansion: (Nc×1) .* (Nc×2) → (Nc×2)
15+
16+
% Face-normal average like F_A
17+
FB_face_n = zeros(Nf,1);
18+
for f = 1:Nf
19+
P = faces(f).owner;
20+
N = faces(f).neigh; % periodic mesh ⇒ N>0
21+
nf = faces(f).nf(:);
22+
if N>0
23+
FBav = 0.5*(FB_cell(P,:) + FB_cell(N,:));
24+
else
25+
FBav = FB_cell(P,:); % (kept for completeness)
26+
end
27+
FB_face_n(f) = FBav * nf;
28+
end
29+
end
30+
31+
% function FB_face_n = build_FB_face_n_compact(p, rho, cells, faces, Lx, Ly)
32+
% Nf = numel(faces);
33+
% FB_face_n = zeros(Nf,1);
34+
% for f = 1:Nf
35+
% P = faces(f).owner;
36+
% N = faces(f).neigh; % periodic ⇒ N>0
37+
% nf = faces(f).nf(:);
38+
%
39+
% dvec = periodic_delta_2d(cells(N).xc - cells(P).xc, Lx, Ly);
40+
% dn = dot(dvec, nf); % compact face distance along nf
41+
% invrP = 1.0 / rho(P);
42+
% invrN = 1.0 / rho(N);
43+
% d_invrho_dn = (invrN - invrP) / dn;
44+
%
45+
% pf = 0.5*(p(P) + p(N)); % centered face pressure
46+
% FB_face_n(f) = - pf * d_invrho_dn;
47+
% end
48+
% end
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
function [FA_cell, FA_face_n] = build_adv_body_forces_2d(u_in, rho, rho0, gvec, U_f, cells, faces, stage)
2+
% F_A = div(u⊗u) - grad(0.5|u|^2) - (div u) u - (1/rho)(rho-rho0) g
3+
% u : Nc x 2 (cell-centered)
4+
% rho : Nc x 1
5+
% U_f : Nf x 1 (face-normal velocity along faces(f).nf, owner->neigh)
6+
% returns:
7+
% FA_cell : Nc x 2 (cell-centered vector)
8+
% FA_face_n : Nf x 1 (face-normal avg of F_A for Poisson RHS)
9+
10+
global H_projection
11+
12+
%if stage==2
13+
% u = reconstruct_u_from_faces_w(U_f, cells, faces);
14+
%else
15+
u = u_in;
16+
%end
17+
Nc = size(u,1); Nf = numel(faces);
18+
Kc = 0.5*sum(u.^2,2); % 0.5|u|^2 at cells
19+
20+
21+
22+
sum_divuV = zeros(Nc,1); % Σ s_pf U_f A_f
23+
sum_divUU = zeros(Nc,2); % Σ s_pf (u_f^c U_f) A_f
24+
sum_gradKV= zeros(Nc,2); % Σ s_pf (K_f^c n_f) A_f
25+
26+
for f = 1:Nf
27+
P = faces(f).owner; N = faces(f).neigh;
28+
nf = faces(f).nf(:); Af = faces(f).Af;
29+
Uf = U_f(f);
30+
31+
% centered face values (periodic mesh ⇒ N>0)
32+
if N>0
33+
uf = 0.5*(u(P,:)+u(N,:));
34+
Kf = 0.5*(Kc(P)+Kc(N));
35+
else
36+
uf = u(P,:); Kf = Kc(P);
37+
end
38+
39+
adv_flux = (uf .* Uf) * Af; % vector
40+
gradK_flux = (Kf * nf.') * Af; % vector
41+
42+
% owner (+), neighbor (-)
43+
sum_divUU(P,:) = sum_divUU(P,:) + adv_flux;
44+
sum_gradKV(P,:)= sum_gradKV(P,:) + gradK_flux;
45+
sum_divuV(P) = sum_divuV(P) + Uf*Af;
46+
47+
if N>0
48+
sum_divUU(N,:) = sum_divUU(N,:) - adv_flux;
49+
sum_gradKV(N,:)= sum_gradKV(N,:) - gradK_flux;
50+
sum_divuV(N) = sum_divuV(N) - Uf*Af;
51+
end
52+
end
53+
54+
FA_cell = zeros(Nc,2);
55+
g = gvec(:).';
56+
for p = 1:Nc
57+
Vp = cells(p).V;
58+
divUU = sum_divUU(p,:)/Vp; % ∇·(u⊗u)
59+
if(H_projection)
60+
gradK = sum_gradKV(p,:)/Vp; % ∇(0.5|u|^2)
61+
divu_u = (sum_divuV(p)/Vp)*u(p,:); % (∇·u) u
62+
else
63+
gradK = zeros(1,2);
64+
divu_u = zeros(1,2);
65+
end
66+
body = - ((rho(p)-rho0)/rho(p)) * g;
67+
FA_cell(p,:) = divUU - gradK - divu_u + body;
68+
end
69+
70+
% face-normal average of F_A (for Poisson RHS)
71+
FA_face_n = zeros(Nf,1);
72+
for f = 1:Nf
73+
P = faces(f).owner; N = faces(f).neigh; nf = faces(f).nf(:);
74+
Fav = (N>0) * 0.5*(FA_cell(P,:)+FA_cell(N,:)) + (N==0)*FA_cell(P,:);
75+
FA_face_n(f) = Fav * nf;
76+
end
77+
end

0 commit comments

Comments
 (0)