@@ -3051,6 +3051,9 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
30513051USE COMP_FUNCTIONS, ONLY: CURRENT_TIME
30523052USE CC_SCALARS, ONLY : GET_CUTCELL_HP,GET_PRES_CFACE_BCS,GET_FH_FROM_PRHS_AND_BCS
30533053USE MPI_F08
3054+ #ifdef WITH_HYPRE
3055+ USE HYPRE_INTERFACE
3056+ #endif
30543057
30553058REAL (EB), INTENT (IN ) :: T,DT
30563059
@@ -3150,6 +3153,8 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
31503153 ENDIF
31513154 ! WRITE(LU_ERR,*) 'SUM_FH=',SUM(F_H),H_MATRIX_INDEFINITE
31523155
3156+ LIBRARY_SELECT: SELECT CASE (UGLMAT_SOLVER_LIBRARY)
3157+ CASE (MKL_CPARDISO_FLAG) LIBRARY_SELECT
31533158#ifdef WITH_MKL
31543159 ! Dump local low an high rows assembled by this process in IPARM:
31553160 IPARM(41 ) = ZSL% LOWER_ROW
@@ -3169,6 +3174,22 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
31693174IF (ERROR /= 0 .AND. MY_RANK== 0 ) WRITE (LU_ERR,* ) ' GLMAT_SOLVER: The following ERROR was detected: ' , ERROR
31703175#endif
31713176
3177+ CASE (HYPRE_FLAG) LIBRARY_SELECT
3178+ #ifdef WITH_HYPRE
3179+ ! Solve the system using HYPRE:
3180+ CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% F_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% F_H, HYPRE_IERR)
3181+ CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
3182+ CALL HYPRE_PARCSRPCGSOLVE(ZSL% HYPRE_ZSL% SOLVER, ZSL% HYPRE_ZSL% PARCSR_A_H, ZSL% HYPRE_ZSL% PAR_F_H, &
3183+ ZSL% HYPRE_ZSL% PAR_X_H, HYPRE_IERR)
3184+ IF (CHECK_POISSON .AND. HYPRE_SOLVER_SETPRINTLEVEL> 0 ) THEN
3185+ CALL HYPRE_PARCSRPCGGETNUMITERATIONS(ZSL% HYPRE_ZSL% SOLVER, ZSL% HYPRE_ZSL% NUM_ITERATIONS, HYPRE_IERR)
3186+ CALL HYPRE_PARCSRPCGGETFINALRELATIVE(ZSL% HYPRE_ZSL% SOLVER, ZSL% HYPRE_ZSL% FINAL_RES_NORM, HYPRE_IERR)
3187+ ENDIF
3188+ CALL HYPRE_IJVECTORGETVALUES(ZSL% HYPRE_ZSL% X_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% X_H, HYPRE_IERR)
3189+ #endif
3190+
3191+ END SELECT LIBRARY_SELECT
3192+
31723193 IF (ZSL% MTYPE==- 2 ) THEN
31733194 SUM_XH = 0._EB ; MEAN_XH = 0._EB
31743195 WHOLE_DOM_IF2 : IF (.NOT. PRES_ON_WHOLE_DOMAIN) THEN
@@ -3321,6 +3342,18 @@ SUBROUTINE GLMAT_SOLVER_SETUP(STAGE_FLAG)
33213342IF (FREEZE_VELOCITY) RETURN ! Fixed velocity soln. i.e. PERIODIC_TEST=102 => FREEZE_VELOCITY=.TRUE.
33223343IF (SOLID_PHASE_ONLY) RETURN
33233344TNOW= CURRENT_TIME()
3345+
3346+ ! If either MKL or HYPRE library not present stop.
3347+ #ifndef WITH_MKL
3348+ #ifndef WITH_HYPRE
3349+ IF (MY_RANK== 0 ) WRITE (LU_ERR,' (A)' ) &
3350+ ' Error: MKL or HYPRE Library compile flag not defined for UGLMAT pressure solver.'
3351+ ! Some error - stop flag for CALL STOP_CHECK(1).
3352+ STOP_STATUS = SETUP_STOP
3353+ RETURN
3354+ #endif
3355+ #endif
3356+
33243357SELECT CASE (STAGE_FLAG)
33253358CASE (1 )
33263359
@@ -3849,9 +3882,13 @@ END SUBROUTINE COPY_CCVAR_IN_HS
38493882! ------------------------------- GET_H_MATRIX_LUDCMP -------------------------------
38503883
38513884SUBROUTINE GET_H_MATRIX_LUDCMP
3852- #ifdef WITH_MKL
3885+ #if defined WITH_MKL || defined WITH_HYPRE
38533886USE MPI_F08
38543887#endif
3888+ #ifdef WITH_HYPRE
3889+ USE HYPRE_INTERFACE
3890+ #endif
3891+
38553892! Local Variables:
38563893INTEGER :: INNZ, IROW, JCOL
38573894#ifdef WITH_MKL
@@ -3864,6 +3901,10 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
38643901INTEGER , ALLOCATABLE , DIMENSION (:,:) :: MB_FACTOR
38653902INTEGER :: IERR
38663903#endif
3904+ #ifdef WITH_HYPRE
3905+ INTEGER :: ONEV(1 )
3906+ REAL (EB) :: ZEROV(1 )
3907+ #endif
38673908
38683909! Define parameters:
38693910NRHS = 1
@@ -3875,9 +3916,21 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
38753916
38763917ERROR = 0 ! initialize error flag
38773918
3919+ SELECT CASE (UGLMAT_SOLVER_LIBRARY)
3920+ CASE (MKL_CPARDISO_FLAG)
38783921#ifdef WITH_MKL
3879- CALL SET_CLUSTER_SOLVER_IPARM
3922+ CALL SET_CLUSTER_SOLVER_IPARM
38803923#endif
3924+ CASE (HYPRE_FLAG)
3925+ #ifdef WITH_HYPRE
3926+ IERR= 0 ; CALL HYPRE_INITIALIZE(IERR)
3927+ IF (IERR== 1 ) THEN
3928+ IF (MY_RANK== 0 ) WRITE (LU_ERR,' (A)' ) ' Error: HYPRE pressure solver initialization error.'
3929+ STOP_STATUS = SETUP_STOP
3930+ RETURN
3931+ ENDIF
3932+ #endif
3933+ END SELECT
38813934
38823935IPZ_LOOP : DO IPZ= 0 ,N_ZONE
38833936
@@ -3891,16 +3944,25 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
38913944 ! Allocate F_H ans H_H for this Process and IPZ:
38923945 ALLOCATE ( ZSL% X_H(MAX (ZSL% NUNKH_LOCAL,1 )) , ZSL% F_H(MAX (ZSL% NUNKH_LOCAL,1 )) ); ZSL% F_H= 0._EB ; ZSL% X_H= 0._EB
38933946
3947+ ! Here each process defines de beginning and end rows in global numeration, for the equations
3948+ ! it has assembled:
3949+ IF (ZSL% NUNKH_LOCAL> 0 ) THEN
3950+ ZSL% LOWER_ROW = ZSL% UNKH_IND(NM_START) + 1
3951+ ZSL% UPPER_ROW = ZSL% UNKH_IND(NM_START) + ZSL% NUNKH_LOCAL
3952+ ELSE
3953+ ZSL% LOWER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3954+ ZSL% UPPER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3955+ ENDIF
3956+
3957+ LIBRARY_SELECT: SELECT CASE (UGLMAT_SOLVER_LIBRARY)
3958+
3959+ CASE (MKL_CPARDISO_FLAG) LIBRARY_SELECT
3960+ #ifdef WITH_MKL
38943961 !- -- This matrix definitoin used with MKL cluster solver -----
38953962 ! Allocate A_H IA_H and JA_H matrices, considering all matrix coefficients:
38963963 ALLOCATE ( ZSL% A_H(ZSL% TOT_NNZ_H) , ZSL% IA_H(MAX (ZSL% NUNKH_LOCAL,1 )+ 1 ) , ZSL% JA_H(ZSL% TOT_NNZ_H) )
38973964 ! Store upper triangular part of symmetric D_MAT_H in CSR format:
38983965 IF (ZSL% NUNKH_LOCAL> 0 ) THEN
3899- ! Here each process defines de beginning and end rows in global numeration, for the equations
3900- ! it has assembled:
3901- ZSL% LOWER_ROW = ZSL% UNKH_IND(NM_START) + 1
3902- ZSL% UPPER_ROW = ZSL% UNKH_IND(NM_START) + ZSL% NUNKH_LOCAL
3903-
39043966 INNZ = 0
39053967 DO IROW= 1 ,ZSL% NUNKH_LOCAL
39063968 ZSL% IA_H(IROW) = INNZ + 1
@@ -3913,8 +3975,6 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39133975 ENDDO
39143976 ZSL% IA_H(ZSL% NUNKH_LOCAL+1 ) = INNZ + 1
39153977 ELSE
3916- ZSL% LOWER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3917- ZSL% UPPER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
39183978 ZSL% A_H = 0._EB ! Add a zero coefficient in A(ZSL%UNKH_IND(NM_START),ZSL%UNKH_IND(NM_START)).
39193979 ZSL% IA_H(1 :2 ) = (/ 1 ,2 / )
39203980 ZSL% JA_H(1 ) = MAX (1 ,ZSL% UNKH_IND(NM_START))
@@ -3928,7 +3988,6 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39283988 ALLOCATE ( ZSL% A_H_FB(ZSL% TOT_NNZ_H) ); ZSL% A_H_FB(1 :ZSL% TOT_NNZ_H) = REAL (ZSL% A_H(1 :ZSL% TOT_NNZ_H),FB)
39293989#endif
39303990
3931- #ifdef WITH_MKL
39323991 ! Lower and uppper rows handled by this process:
39333992 IPARM(41 ) = ZSL% LOWER_ROW
39343993 IPARM(42 ) = ZSL% UPPER_ROW
@@ -4004,17 +4063,81 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
40044063 STOP_STATUS = SETUP_STOP
40054064 RETURN
40064065 ENDIF
4066+ #endif
40074067
4008- #else
4068+ CASE (HYPRE_FLAG) LIBRARY_SELECT
4069+ #ifdef WITH_HYPRE
40094070
4010- IF (MY_RANK== 0 ) WRITE (LU_ERR,' (A)' ) &
4011- ' Error: MKL Library compile flag was not defined for GLMAT as pressure solver.'
4012- ! Some error - stop flag for CALL STOP_CHECK(1).
4013- STOP_STATUS = SETUP_STOP
4014- RETURN
4071+ IF (ALLOCATED (ZSL% HYPRE_ZSL% INDICES)) DEALLOCATE (ZSL% HYPRE_ZSL% INDICES)
4072+ ALLOCATE ( ZSL% HYPRE_ZSL% INDICES(MAX (1 ,ZSL% NUNKH_LOCAL)) )
4073+
4074+ CALL HYPRE_IJMATRIXCREATE(MPI_COMM_WORLD,ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,&
4075+ ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
4076+ CALL HYPRE_IJMATRIXSETOBJECTTYPE(ZSL% HYPRE_ZSL% A_H,HYPRE_PARCSR,HYPRE_IERR)
4077+ CALL HYPRE_IJMATRIXINITIALIZE(ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
4078+ IF (ZSL% NUNKH_LOCAL > 0 ) THEN
4079+ ZSL% JD_MAT_H = ZSL% JD_MAT_H - 1
4080+ DO IROW= 1 ,ZSL% NUNKH_LOCAL
4081+ ZSL% HYPRE_ZSL% INDICES(IROW)= ZSL% LOWER_ROW+ IROW-2
4082+ CALL HYPRE_IJMATRIXSETVALUES(ZSL% HYPRE_ZSL% A_H, 1 , ZSL% NNZ_D_MAT_H(IROW), ZSL% HYPRE_ZSL% INDICES(IROW), &
4083+ 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)
4084+ ENDDO
4085+ ELSE
4086+ ZSL% HYPRE_ZSL% INDICES(1 )= ZSL% LOWER_ROW-1
4087+ ONEV(1 ) = 1 ; ZEROV(1 ) = 0._EB
4088+ ! Define a zero coefficient in A(ZSL%LOWER_ROW-1,ZSL%LOWER_ROW-1):
4089+ CALL HYPRE_IJMATRIXSETVALUES(ZSL% HYPRE_ZSL% A_H, 1 , ONEV(1 ), ZSL% HYPRE_ZSL% INDICES(1 ), &
4090+ ZSL% HYPRE_ZSL% INDICES(1 ), ZEROV(1 ), HYPRE_IERR)
4091+ ENDIF
4092+ CALL HYPRE_IJMATRIXASSEMBLE(ZSL% HYPRE_ZSL% A_H, HYPRE_IERR)
4093+ CALL HYPRE_IJMATRIXGETOBJECT(ZSL% HYPRE_ZSL% A_H, ZSL% HYPRE_ZSL% PARCSR_A_H, HYPRE_IERR)
4094+ ! Create right hand side vector
4095+ CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL% LOWER_ROW-1 , ZSL% UPPER_ROW-1 , ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4096+ CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL% HYPRE_ZSL% F_H, HYPRE_PARCSR, HYPRE_IERR)
4097+ CALL HYPRE_IJVECTORINITIALIZE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4098+ ! Create solution vector
4099+ CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL% LOWER_ROW-1 , ZSL% UPPER_ROW-1 , ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4100+ CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL% HYPRE_ZSL% X_H, HYPRE_PARCSR, HYPRE_IERR)
4101+ CALL HYPRE_IJVECTORINITIALIZE(ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4102+ ! Set values
4103+ CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% F_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% F_H, HYPRE_IERR)
4104+ CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% X_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% X_H, HYPRE_IERR)
4105+ ! Assemble vectors
4106+ CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4107+ CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4108+ ! Get rhs and soln objects
4109+ CALL HYPRE_IJVECTORGETOBJECT(ZSL% HYPRE_ZSL% F_H, ZSL% HYPRE_ZSL% PAR_F_H, HYPRE_IERR)
4110+ CALL HYPRE_IJVECTORGETOBJECT(ZSL% HYPRE_ZSL% X_H, ZSL% HYPRE_ZSL% PAR_X_H, HYPRE_IERR)
4111+
4112+ ! Create solver (Parallel Compressed Sparse Row Preconditioned Conjugate Gradient)
4113+ CALL HYPRE_PARCSRPCGCREATE(MPI_COMM_WORLD, ZSL% HYPRE_ZSL% SOLVER, HYPRE_IERR)
4114+ CALL HYPRE_PARCSRPCGSETMAXITER(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_MAXIT, HYPRE_IERR)
4115+ CALL HYPRE_PARCSRPCGSETTOL(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_TOL, HYPRE_IERR)
4116+ CALL HYPRE_PARCSRPCGSETTWONORM(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETTWONORM, HYPRE_IERR)
4117+ CALL HYPRE_PARCSRPCGSETPRINTLEVEL(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETPRINTLEVEL, HYPRE_IERR)
4118+ CALL HYPRE_PARCSRPCGSETLOGGING(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETLOGGING, HYPRE_IERR)
40154119
4120+ ! Set up the Algebraic Multi-Grid (AMG) preconditioner and specify any parameters
4121+ CALL HYPRE_BOOMERAMGCREATE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_IERR)
4122+ CALL HYPRE_BOOMERAMGSETPRINTLEVEL(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_SETPRINTLEVEL, HYPRE_IERR)
4123+ CALL HYPRE_BOOMERAMGSETCOARSENTYPE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_COARSENINGTYPE, HYPRE_IERR)
4124+ CALL HYPRE_BOOMERAMGSETRELAXTYPE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_SETRELAXTYPE, HYPRE_IERR)
4125+ CALL HYPRE_BOOMERAMGSETNUMSWEEPS(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_NUMSWEEPS, HYPRE_IERR)
4126+ CALL HYPRE_BOOMERAMGSETTOL(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_TOL, HYPRE_IERR)
4127+ CALL HYPRE_BOOMERAMGSETMAXITER(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_MAXITER, HYPRE_IERR)
4128+ CALL HYPRE_PARCSRPCGSETPRECOND(ZSL% HYPRE_ZSL% SOLVER, HYPRE_PRECOND_ID, ZSL% HYPRE_ZSL% PRECOND, HYPRE_IERR)
4129+ ! Solver setup
4130+ CALL HYPRE_PARCSRPCGSETUP(ZSL% HYPRE_ZSL% SOLVER, ZSL% HYPRE_ZSL% PARCSR_A_H,&
4131+ ZSL% HYPRE_ZSL% PAR_F_H, ZSL% HYPRE_ZSL% PAR_X_H, HYPRE_IERR)
40164132#endif
40174133
4134+ END SELECT LIBRARY_SELECT
4135+
4136+ ! Deallocate MAT_H arrays:
4137+ IF (ALLOCATED (ZSL% NNZ_D_MAT_H)) DEALLOCATE (ZSL% NNZ_D_MAT_H)
4138+ IF (ALLOCATED (ZSL% D_MAT_H)) DEALLOCATE (ZSL% D_MAT_H)
4139+ IF (ALLOCATED (ZSL% JD_MAT_H)) DEALLOCATE (ZSL% JD_MAT_H)
4140+
40184141ENDDO IPZ_LOOP
40194142
40204143! Set level MSG to 0 for solution:
@@ -5159,6 +5282,9 @@ END FUNCTION GRADIENT_WEIGHT
51595282SUBROUTINE FINISH_GLMAT_SOLVER
51605283
51615284USE MPI_F08
5285+ #ifdef WITH_HYPRE
5286+ USE HYPRE_INTERFACE
5287+ #endif
51625288
51635289! Local variables:
51645290INTEGER :: MAXFCT, MNUM, PHASE, NRHS, ERROR, MSGLVL
@@ -5180,13 +5306,21 @@ SUBROUTINE FINISH_GLMAT_SOLVER
51805306
51815307DO IPZ= 0 ,N_ZONE
51825308 ZSL = > ZONE_SOLVE(IPZ); IF (ZSL% NUNKH_TOTAL== 0 ) CYCLE
5183-
5309+ ! Finalize Cluster Sparse Solver:
5310+ IF (UGLMAT_SOLVER_LIBRARY== MKL_CPARDISO_FLAG) THEN
51845311#ifdef WITH_MKL
51855312 CALL CLUSTER_SPARSE_SOLVER(ZSL% PT_H, MAXFCT, MNUM, ZSL% MTYPE, PHASE, ZSL% NUNKH_TOTAL, &
51865313 ZSL% A_H, ZSL% IA_H, ZSL% JA_H, PERM, NRHS, IPARM, MSGLVL, ZSL% F_H, ZSL% X_H, MPI_COMM_WORLD, ERROR)
51875314#endif /* WITH_MKL */
5315+ ENDIF
51885316ENDDO
51895317
5318+ IF (UGLMAT_SOLVER_LIBRARY== HYPRE_FLAG) THEN
5319+ #ifdef WITH_HYPRE
5320+ CALL HYPRE_FINALIZE(HYPRE_IERR)
5321+ #endif
5322+ ENDIF
5323+
51905324DEALLOCATE (ZONE_SOLVE)
51915325
51925326RETURN
0 commit comments