@@ -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,8 +3901,13 @@ 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:
3910+ INNZ = 0 ; IROW = 0 ; JCOL= 0
38693911NRHS = 1
38703912MAXFCT = 1
38713913MNUM = 1
@@ -3875,9 +3917,21 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
38753917
38763918ERROR = 0 ! initialize error flag
38773919
3920+ SELECT CASE (UGLMAT_SOLVER_LIBRARY)
3921+ CASE (MKL_CPARDISO_FLAG)
38783922#ifdef WITH_MKL
3879- CALL SET_CLUSTER_SOLVER_IPARM
3923+ CALL SET_CLUSTER_SOLVER_IPARM
38803924#endif
3925+ CASE (HYPRE_FLAG)
3926+ #ifdef WITH_HYPRE
3927+ IERR= 0 ; CALL HYPRE_INITIALIZE(IERR)
3928+ IF (IERR== 1 ) THEN
3929+ IF (MY_RANK== 0 ) WRITE (LU_ERR,' (A)' ) ' Error: HYPRE pressure solver initialization error.'
3930+ STOP_STATUS = SETUP_STOP
3931+ RETURN
3932+ ENDIF
3933+ #endif
3934+ END SELECT
38813935
38823936IPZ_LOOP : DO IPZ= 0 ,N_ZONE
38833937
@@ -3891,16 +3945,25 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
38913945 ! Allocate F_H ans H_H for this Process and IPZ:
38923946 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
38933947
3948+ ! Here each process defines de beginning and end rows in global numeration, for the equations
3949+ ! it has assembled:
3950+ IF (ZSL% NUNKH_LOCAL> 0 ) THEN
3951+ ZSL% LOWER_ROW = ZSL% UNKH_IND(NM_START) + 1
3952+ ZSL% UPPER_ROW = ZSL% UNKH_IND(NM_START) + ZSL% NUNKH_LOCAL
3953+ ELSE
3954+ ZSL% LOWER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3955+ ZSL% UPPER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3956+ ENDIF
3957+
3958+ LIBRARY_SELECT: SELECT CASE (UGLMAT_SOLVER_LIBRARY)
3959+
3960+ CASE (MKL_CPARDISO_FLAG) LIBRARY_SELECT
3961+ #ifdef WITH_MKL
38943962 !- -- This matrix definitoin used with MKL cluster solver -----
38953963 ! Allocate A_H IA_H and JA_H matrices, considering all matrix coefficients:
38963964 ALLOCATE ( ZSL% A_H(ZSL% TOT_NNZ_H) , ZSL% IA_H(MAX (ZSL% NUNKH_LOCAL,1 )+ 1 ) , ZSL% JA_H(ZSL% TOT_NNZ_H) )
38973965 ! Store upper triangular part of symmetric D_MAT_H in CSR format:
38983966 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-
39043967 INNZ = 0
39053968 DO IROW= 1 ,ZSL% NUNKH_LOCAL
39063969 ZSL% IA_H(IROW) = INNZ + 1
@@ -3913,8 +3976,6 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39133976 ENDDO
39143977 ZSL% IA_H(ZSL% NUNKH_LOCAL+1 ) = INNZ + 1
39153978 ELSE
3916- ZSL% LOWER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
3917- ZSL% UPPER_ROW = MAX (1 ,ZSL% UNKH_IND(NM_START))
39183979 ZSL% A_H = 0._EB ! Add a zero coefficient in A(ZSL%UNKH_IND(NM_START),ZSL%UNKH_IND(NM_START)).
39193980 ZSL% IA_H(1 :2 ) = (/ 1 ,2 / )
39203981 ZSL% JA_H(1 ) = MAX (1 ,ZSL% UNKH_IND(NM_START))
@@ -3928,7 +3989,6 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39283989 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)
39293990#endif
39303991
3931- #ifdef WITH_MKL
39323992 ! Lower and uppper rows handled by this process:
39333993 IPARM(41 ) = ZSL% LOWER_ROW
39343994 IPARM(42 ) = ZSL% UPPER_ROW
@@ -4004,17 +4064,81 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
40044064 STOP_STATUS = SETUP_STOP
40054065 RETURN
40064066 ENDIF
4067+ #endif
40074068
4008- #else
4069+ CASE (HYPRE_FLAG) LIBRARY_SELECT
4070+ #ifdef WITH_HYPRE
40094071
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
4072+ IF (ALLOCATED (ZSL% HYPRE_ZSL% INDICES)) DEALLOCATE (ZSL% HYPRE_ZSL% INDICES)
4073+ ALLOCATE ( ZSL% HYPRE_ZSL% INDICES(MAX (1 ,ZSL% NUNKH_LOCAL)) )
4074+
4075+ CALL HYPRE_IJMATRIXCREATE(MPI_COMM_WORLD,ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,&
4076+ ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
4077+ CALL HYPRE_IJMATRIXSETOBJECTTYPE(ZSL% HYPRE_ZSL% A_H,HYPRE_PARCSR,HYPRE_IERR)
4078+ CALL HYPRE_IJMATRIXINITIALIZE(ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
4079+ IF (ZSL% NUNKH_LOCAL > 0 ) THEN
4080+ ZSL% JD_MAT_H = ZSL% JD_MAT_H - 1
4081+ DO IROW= 1 ,ZSL% NUNKH_LOCAL
4082+ ZSL% HYPRE_ZSL% INDICES(IROW)= ZSL% LOWER_ROW+ IROW-2
4083+ CALL HYPRE_IJMATRIXSETVALUES(ZSL% HYPRE_ZSL% A_H, 1 , ZSL% NNZ_D_MAT_H(IROW), ZSL% HYPRE_ZSL% INDICES(IROW), &
4084+ 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)
4085+ ENDDO
4086+ ELSE
4087+ ZSL% HYPRE_ZSL% INDICES(1 )= ZSL% LOWER_ROW-1
4088+ ONEV(1 ) = 1 ; ZEROV(1 ) = 0._EB
4089+ ! Define a zero coefficient in A(ZSL%LOWER_ROW-1,ZSL%LOWER_ROW-1):
4090+ CALL HYPRE_IJMATRIXSETVALUES(ZSL% HYPRE_ZSL% A_H, 1 , ONEV(1 ), ZSL% HYPRE_ZSL% INDICES(1 ), &
4091+ ZSL% HYPRE_ZSL% INDICES(1 ), ZEROV(1 ), HYPRE_IERR)
4092+ ENDIF
4093+ CALL HYPRE_IJMATRIXASSEMBLE(ZSL% HYPRE_ZSL% A_H, HYPRE_IERR)
4094+ CALL HYPRE_IJMATRIXGETOBJECT(ZSL% HYPRE_ZSL% A_H, ZSL% HYPRE_ZSL% PARCSR_A_H, HYPRE_IERR)
4095+ ! Create right hand side vector
4096+ CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL% LOWER_ROW-1 , ZSL% UPPER_ROW-1 , ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4097+ CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL% HYPRE_ZSL% F_H, HYPRE_PARCSR, HYPRE_IERR)
4098+ CALL HYPRE_IJVECTORINITIALIZE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4099+ ! Create solution vector
4100+ CALL HYPRE_IJVECTORCREATE(MPI_COMM_WORLD, ZSL% LOWER_ROW-1 , ZSL% UPPER_ROW-1 , ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4101+ CALL HYPRE_IJVECTORSETOBJECTTYPE(ZSL% HYPRE_ZSL% X_H, HYPRE_PARCSR, HYPRE_IERR)
4102+ CALL HYPRE_IJVECTORINITIALIZE(ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4103+ ! Set values
4104+ CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% F_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% F_H, HYPRE_IERR)
4105+ CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% X_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% X_H, HYPRE_IERR)
4106+ ! Assemble vectors
4107+ CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
4108+ CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% X_H, HYPRE_IERR)
4109+ ! Get rhs and soln objects
4110+ CALL HYPRE_IJVECTORGETOBJECT(ZSL% HYPRE_ZSL% F_H, ZSL% HYPRE_ZSL% PAR_F_H, HYPRE_IERR)
4111+ CALL HYPRE_IJVECTORGETOBJECT(ZSL% HYPRE_ZSL% X_H, ZSL% HYPRE_ZSL% PAR_X_H, HYPRE_IERR)
4112+
4113+ ! Create solver (Parallel Compressed Sparse Row Preconditioned Conjugate Gradient)
4114+ CALL HYPRE_PARCSRPCGCREATE(MPI_COMM_WORLD, ZSL% HYPRE_ZSL% SOLVER, HYPRE_IERR)
4115+ CALL HYPRE_PARCSRPCGSETMAXITER(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_MAXIT, HYPRE_IERR)
4116+ CALL HYPRE_PARCSRPCGSETTOL(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_TOL, HYPRE_IERR)
4117+ CALL HYPRE_PARCSRPCGSETTWONORM(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETTWONORM, HYPRE_IERR)
4118+ CALL HYPRE_PARCSRPCGSETPRINTLEVEL(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETPRINTLEVEL, HYPRE_IERR)
4119+ CALL HYPRE_PARCSRPCGSETLOGGING(ZSL% HYPRE_ZSL% SOLVER, HYPRE_SOLVER_SETLOGGING, HYPRE_IERR)
40154120
4121+ ! Set up the Algebraic Multi-Grid (AMG) preconditioner and specify any parameters
4122+ CALL HYPRE_BOOMERAMGCREATE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_IERR)
4123+ CALL HYPRE_BOOMERAMGSETPRINTLEVEL(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_SETPRINTLEVEL, HYPRE_IERR)
4124+ CALL HYPRE_BOOMERAMGSETCOARSENTYPE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_COARSENINGTYPE, HYPRE_IERR)
4125+ CALL HYPRE_BOOMERAMGSETRELAXTYPE(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_SETRELAXTYPE, HYPRE_IERR)
4126+ CALL HYPRE_BOOMERAMGSETNUMSWEEPS(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_NUMSWEEPS, HYPRE_IERR)
4127+ CALL HYPRE_BOOMERAMGSETTOL(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_TOL, HYPRE_IERR)
4128+ CALL HYPRE_BOOMERAMGSETMAXITER(ZSL% HYPRE_ZSL% PRECOND, HYPRE_PRECOND_MAXITER, HYPRE_IERR)
4129+ CALL HYPRE_PARCSRPCGSETPRECOND(ZSL% HYPRE_ZSL% SOLVER, HYPRE_PRECOND_ID, ZSL% HYPRE_ZSL% PRECOND, HYPRE_IERR)
4130+ ! Solver setup
4131+ CALL HYPRE_PARCSRPCGSETUP(ZSL% HYPRE_ZSL% SOLVER, ZSL% HYPRE_ZSL% PARCSR_A_H,&
4132+ ZSL% HYPRE_ZSL% PAR_F_H, ZSL% HYPRE_ZSL% PAR_X_H, HYPRE_IERR)
40164133#endif
40174134
4135+ END SELECT LIBRARY_SELECT
4136+
4137+ ! Deallocate MAT_H arrays:
4138+ IF (ALLOCATED (ZSL% NNZ_D_MAT_H)) DEALLOCATE (ZSL% NNZ_D_MAT_H)
4139+ IF (ALLOCATED (ZSL% D_MAT_H)) DEALLOCATE (ZSL% D_MAT_H)
4140+ IF (ALLOCATED (ZSL% JD_MAT_H)) DEALLOCATE (ZSL% JD_MAT_H)
4141+
40184142ENDDO IPZ_LOOP
40194143
40204144! Set level MSG to 0 for solution:
@@ -5159,6 +5283,9 @@ END FUNCTION GRADIENT_WEIGHT
51595283SUBROUTINE FINISH_GLMAT_SOLVER
51605284
51615285USE MPI_F08
5286+ #ifdef WITH_HYPRE
5287+ USE HYPRE_INTERFACE
5288+ #endif
51625289
51635290! Local variables:
51645291INTEGER :: MAXFCT, MNUM, PHASE, NRHS, ERROR, MSGLVL
@@ -5180,13 +5307,21 @@ SUBROUTINE FINISH_GLMAT_SOLVER
51805307
51815308DO IPZ= 0 ,N_ZONE
51825309 ZSL = > ZONE_SOLVE(IPZ); IF (ZSL% NUNKH_TOTAL== 0 ) CYCLE
5183-
5310+ ! Finalize Cluster Sparse Solver:
5311+ IF (UGLMAT_SOLVER_LIBRARY== MKL_CPARDISO_FLAG) THEN
51845312#ifdef WITH_MKL
51855313 CALL CLUSTER_SPARSE_SOLVER(ZSL% PT_H, MAXFCT, MNUM, ZSL% MTYPE, PHASE, ZSL% NUNKH_TOTAL, &
51865314 ZSL% A_H, ZSL% IA_H, ZSL% JA_H, PERM, NRHS, IPARM, MSGLVL, ZSL% F_H, ZSL% X_H, MPI_COMM_WORLD, ERROR)
51875315#endif /* WITH_MKL */
5316+ ENDIF
51885317ENDDO
51895318
5319+ IF (UGLMAT_SOLVER_LIBRARY== HYPRE_FLAG) THEN
5320+ #ifdef WITH_HYPRE
5321+ CALL HYPRE_FINALIZE(HYPRE_IERR)
5322+ #endif
5323+ ENDIF
5324+
51905325DEALLOCATE (ZONE_SOLVE)
51915326
51925327RETURN
0 commit comments