@@ -1518,7 +1518,7 @@ SUBROUTINE ULMAT_SOLVE_ZONE(NM,IPZ)
15181518 WALL_CELL_LOOP_0 : DO IW= N_EXTERNAL_WALL_CELLS+1 ,N_EXTERNAL_WALL_CELLS+ N_INTERNAL_WALL_CELLS
15191519 WC = > WALL(IW)
15201520 IF (WC% BOUNDARY_TYPE/= SOLID_BOUNDARY .OR. WC% CUT_FACE_INDEX> 0 ) CYCLE WALL_CELL_LOOP_0
1521- BC = > BOUNDARY_COORD(WC% BC_INDEX);
1521+ BC = > BOUNDARY_COORD(WC% BC_INDEX);
15221522 IOR = BC% IOR; IF (ABS (IOR)/= 1 ) CYCLE WALL_CELL_LOOP_0 ! Only in x.
15231523 ! Gasphase cell indexes:
15241524 IIG = BC% IIG; JJG = BC% JJG; KKG = BC% KKG
@@ -1540,7 +1540,7 @@ SUBROUTINE ULMAT_SOLVE_ZONE(NM,IPZ)
15401540 DHDN = (H_BAR(I_OFFSET(NM)+ IIG)- H_BAR(I_OFFSET(NM)+ IIG-1 ))* TP_RDXN(I_OFFSET(NM)+ IIG-1 )
15411541 AF = ((1._EB - CYL_FCT)* DY(JJG) + CYL_FCT* R(IIG-1 )) * DZ(KKG)
15421542 VAL = DHDN* AF
1543- END SELECT
1543+ END SELECT
15441544 ! Add to F_H:
15451545 ZM% F_H(IROW) = ZM% F_H(IROW) - VAL
15461546 ENDDO WALL_CELL_LOOP_0
@@ -3054,11 +3054,15 @@ MODULE GLOBMAT_SOLVER
30543054REAL (EB), SAVE :: CYL_FCT
30553055
30563056! Pressure zone loops index:
3057- INTEGER :: IPZ
3057+ INTEGER :: IPZ, N_ZONE_GLOBMAT
30583058
30593059! Handle for ZONE_SOLVER array entries:
30603060TYPE (ZONE_SOLVE_TYPE), POINTER :: ZSL
30613061
3062+ ! Matrix types:
3063+ INTEGER , PARAMETER :: SYMM_INDEFINITE =- 2
3064+ INTEGER , PARAMETER :: SYMM_POSITIVE_DEFINITE= 2
3065+
30623066! #define SINGLE_PRECISION_PSN_SOLVE
30633067
30643068! Timing variable:
@@ -3120,7 +3124,7 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
31203124 CALL GET_PRES_CFACE_BCS(NM,T,DT)
31213125ENDDO
31223126
3123- IPZ_LOOP : DO IPZ= 0 ,N_ZONE
3127+ IPZ_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
31243128
31253129 ZSL = > ZONE_SOLVE(IPZ)
31263130
@@ -3138,7 +3142,7 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
31383142 CALL GET_FH_FROM_PRHS_AND_BCS(NM,DT,CYL_FCT,UNKH,ZSL% NUNKH_LOCAL,IPZ,ZSL% F_H)
31393143 ENDDO MESH_LOOP_1
31403144
3141- IF (ZSL% MTYPE==- 2 ) THEN
3145+ IF (ZSL% MTYPE== SYMM_INDEFINITE ) THEN
31423146 SUM_FH = 0._EB ; MEAN_FH = 0._EB
31433147 WHOLE_DOM_IF1 : IF (.NOT. PRES_ON_WHOLE_DOMAIN) THEN
31443148 ! Sum source F_H by Pressure Zone:
@@ -3203,6 +3207,7 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
32033207
32043208 CASE (HYPRE_FLAG) LIBRARY_SELECT
32053209#ifdef WITH_HYPRE
3210+ IF (ZSL% MTYPE== SYMM_INDEFINITE .AND. ZSL% UPPER_ROW== ZSL% NUNKH_TOTAL) ZSL% F_H(MAX (ZSL% NUNKH_LOCAL,1 )) = 0._EB
32063211 ! Solve the system using HYPRE:
32073212 CALL HYPRE_IJVECTORSETVALUES(ZSL% HYPRE_ZSL% F_H, ZSL% NUNKH_LOCAL, ZSL% HYPRE_ZSL% INDICES, ZSL% F_H, HYPRE_IERR)
32083213 CALL HYPRE_IJVECTORASSEMBLE(ZSL% HYPRE_ZSL% F_H, HYPRE_IERR)
@@ -3217,7 +3222,7 @@ SUBROUTINE GLMAT_SOLVER(T,DT)
32173222
32183223 END SELECT LIBRARY_SELECT
32193224
3220- IF (ZSL% MTYPE==- 2 ) THEN
3225+ IF (ZSL% MTYPE== SYMM_INDEFINITE ) THEN
32213226 SUM_XH = 0._EB ; MEAN_XH = 0._EB
32223227 WHOLE_DOM_IF2 : IF (.NOT. PRES_ON_WHOLE_DOMAIN) THEN
32233228 ! Sum H by Pressure Zone:
@@ -3381,6 +3386,9 @@ SUBROUTINE GLMAT_SOLVER_SETUP(STAGE_FLAG)
33813386#endif
33823387#endif
33833388
3389+ N_ZONE_GLOBMAT = N_ZONE
3390+ IF (PRES_ON_WHOLE_DOMAIN) N_ZONE_GLOBMAT = 0
3391+
33843392SELECT CASE (STAGE_FLAG)
33853393CASE (1 )
33863394
@@ -3923,7 +3931,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39233931INTEGER , ALLOCATABLE , DIMENSION (:,:) :: MB_FACTOR
39243932#endif
39253933#ifdef WITH_HYPRE
3926- INTEGER :: ONEV(1 )
3934+ INTEGER :: ONEV(1 ), END_ROW
39273935REAL (EB) :: ZEROV(1 )
39283936#endif
39293937! .. All other variables
@@ -3957,7 +3965,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39573965#endif
39583966END SELECT
39593967
3960- IPZ_LOOP : DO IPZ= 0 ,N_ZONE
3968+ IPZ_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
39613969
39623970 ZSL = > ZONE_SOLVE(IPZ); IF (ZSL% NUNKH_TOTAL== 0 ) CYCLE
39633971
@@ -4092,21 +4100,49 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
40924100
40934101 CASE (HYPRE_FLAG) LIBRARY_SELECT
40944102#ifdef WITH_HYPRE
4095-
40964103 IF (ALLOCATED (ZSL% HYPRE_ZSL% INDICES)) DEALLOCATE (ZSL% HYPRE_ZSL% INDICES)
40974104 ALLOCATE ( ZSL% HYPRE_ZSL% INDICES(MAX (1 ,ZSL% NUNKH_LOCAL)) )
40984105
40994106 CALL HYPRE_IJMATRIXCREATE(MPI_COMM_WORLD,ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,&
41004107 ZSL% LOWER_ROW-1 ,ZSL% UPPER_ROW-1 ,ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
41014108 CALL HYPRE_IJMATRIXSETOBJECTTYPE(ZSL% HYPRE_ZSL% A_H,HYPRE_PARCSR,HYPRE_IERR)
41024109 CALL HYPRE_IJMATRIXINITIALIZE(ZSL% HYPRE_ZSL% A_H,HYPRE_IERR)
4110+ IF (ZSL% MTYPE== SYMM_INDEFINITE) THEN
4111+ IF (ZSL% NUNKH_TOTAL== 1 ) THEN ! Single unknown, zero coefficient matrix (1,1). Set coefficient to 1.
4112+ IF (ZSL% NUNKH_LOCAL== 1 ) THEN
4113+ ZSL% NNZ_D_MAT_H(1 ) = 1
4114+ DEALLOCATE (ZSL% JD_MAT_H); ALLOCATE (ZSL% JD_MAT_H(1 ,1 )); ZSL% JD_MAT_H(1 ,1 ) = 1
4115+ DEALLOCATE (ZSL% D_MAT_H ); ALLOCATE (ZSL% D_MAT_H(1 ,1 ) ); ZSL% D_MAT_H(1 ,1 ) = 1._EB
4116+ ENDIF
4117+ ELSE ! More than one unknown
4118+ IF (ZSL% UPPER_ROW== ZSL% NUNKH_TOTAL) THEN
4119+ END_ROW = ZSL% NUNKH_LOCAL-1
4120+ ELSE
4121+ END_ROW = ZSL% NUNKH_LOCAL
4122+ ENDIF
4123+ ! Rows 1 to ZM%NUNKH-1, last column, set all to zero:
4124+ DO IROW= 1 ,END_ROW
4125+ DO JCOL= 1 ,ZSL% NNZ_D_MAT_H(IROW)
4126+ IF ( ZSL% JD_MAT_H(JCOL,IROW) /= ZSL% NUNKH_TOTAL ) CYCLE ! Make zero matrix entries in last column.
4127+ ZSL% D_MAT_H(JCOL,IROW) = 0._EB
4128+ ENDDO
4129+ ENDDO
4130+ ! Last row, all zeros except the diagonal that keeps diagonal number:
4131+ IF (ZSL% UPPER_ROW== ZSL% NUNKH_TOTAL) THEN
4132+ IROW = ZSL% NUNKH_LOCAL
4133+ DO JCOL= 1 ,ZSL% NNZ_D_MAT_H(IROW)
4134+ IF ( ZSL% JD_MAT_H(JCOL,IROW) /= ZSL% NUNKH_TOTAL ) ZSL% D_MAT_H(JCOL,IROW) = 0._EB
4135+ ENDDO
4136+ ENDIF
4137+ ENDIF
4138+ ENDIF
41034139 IF (ZSL% NUNKH_LOCAL > 0 ) THEN
4104- ZSL% JD_MAT_H = ZSL% JD_MAT_H - 1
4105- DO IROW= 1 ,ZSL% NUNKH_LOCAL
4140+ ZSL% JD_MAT_H = ZSL% JD_MAT_H - 1
4141+ DO IROW= 1 ,ZSL% NUNKH_LOCAL
41064142 ZSL% HYPRE_ZSL% INDICES(IROW)= ZSL% LOWER_ROW+ IROW-2
41074143 CALL HYPRE_IJMATRIXSETVALUES(ZSL% HYPRE_ZSL% A_H, 1 , ZSL% NNZ_D_MAT_H(IROW), ZSL% HYPRE_ZSL% INDICES(IROW), &
41084144 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)
4109- ENDDO
4145+ ENDDO
41104146 ELSE
41114147 ZSL% HYPRE_ZSL% INDICES(1 )= ZSL% LOWER_ROW-1
41124148 ONEV(1 ) = 1 ; ZEROV(1 ) = 0._EB
@@ -4226,7 +4262,7 @@ SUBROUTINE GET_BCS_H_MATRIX
42264262REAL (EB), POINTER , DIMENSION (:,:) :: D_MAT_HP
42274263INTEGER :: H_MAT_IVEC
42284264
4229- IPZ_LOOP : DO IPZ= 0 ,N_ZONE
4265+ IPZ_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
42304266 ZSL = > ZONE_SOLVE(IPZ)
42314267
42324268 ! Allocate D_MAT_H:
@@ -4300,9 +4336,9 @@ SUBROUTINE GET_BCS_H_MATRIX
43004336 ! Here all reduce with sum among MPI processes:
43014337 IF (N_MPI_PROCESSES > 1 ) CALL MPI_ALLREDUCE(MPI_IN_PLACE,H_MAT_IVEC,1 ,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
43024338 IF ( H_MAT_IVEC > 0 ) THEN
4303- ZSL% MTYPE = 2 ! At least one Dirichlet BC, matrix positive definite.
4339+ ZSL% MTYPE = SYMM_POSITIVE_DEFINITE ! At least one Dirichlet BC, matrix positive definite.
43044340 ELSE
4305- ZSL% MTYPE =- 2 ! Indefinite.
4341+ ZSL% MTYPE = SYMM_INDEFINITE ! Indefinite.
43064342 ENDIF
43074343ENDDO IPZ_LOOP
43084344
@@ -4332,7 +4368,7 @@ SUBROUTINE GET_H_MATRIX
43324368INTEGER :: WC_JD(1 :2 ,1 :2 )
43334369LOGICAL :: FLG
43344370
4335- IPZ_LOOP : DO IPZ= 0 ,N_ZONE
4371+ IPZ_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
43364372
43374373 ZSL = > ZONE_SOLVE(IPZ)
43384374
@@ -4553,7 +4589,7 @@ SUBROUTINE GET_MATRIXGRAPH_H_WHLDOM
45534589ENDDO
45544590
45554591! Now Loop by Pressure Zone:
4556- IPZ_LOOP : DO IPZ= 0 ,N_ZONE
4592+ IPZ_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
45574593
45584594 ZSL = > ZONE_SOLVE(IPZ)
45594595 ZSL% NUNKH_LOCAL = SUM (ZSL% NUNKH_LOC(LOWER_MESH_INDEX:UPPER_MESH_INDEX))
@@ -4959,14 +4995,14 @@ SUBROUTINE GET_MATRIX_INDEXES_H
49594995 ! Initialize unknown numbers for H:
49604996 MESHES(NM)% CCVAR(:,:,:,UNKH) = IS_UNDEFINED
49614997 ! Select the parent zone as the first in the row
4962- DO IPZ= 0 ,N_ZONE
4998+ DO IPZ= 0 ,N_ZONE_GLOBMAT
49634999 ZSL = > ZONE_SOLVE(IPZ)
49645000 IF (.NOT. PRES_ON_WHOLE_DOMAIN) &
49655001 ZSL% CONNECTED_ZONE_PARENT = MINLOC (CONNECTED_ZONES(IPZ,:), DIM= 1 , MASK= CONNECTED_ZONES(IPZ,:)/= 0 ) - 1
49665002 ENDDO
49675003ENDDO
49685004
4969- PRES_ZONE_LOOP : DO IPZ= 0 ,N_ZONE
5005+ PRES_ZONE_LOOP : DO IPZ= 0 ,N_ZONE_GLOBMAT
49705006
49715007 ZSL = > ZONE_SOLVE(IPZ)
49725008
@@ -5322,7 +5358,7 @@ SUBROUTINE FINISH_GLMAT_SOLVER
53225358! Finalize Pardiso:
53235359PHASE = - 1
53245360
5325- DO IPZ= 0 ,N_ZONE
5361+ DO IPZ= 0 ,N_ZONE_GLOBMAT
53265362 ZSL = > ZONE_SOLVE(IPZ); IF (ZSL% NUNKH_TOTAL== 0 ) CYCLE
53275363 ! Finalize Cluster Sparse Solver:
53285364 IF (UGLMAT_SOLVER_LIBRARY== MKL_CPARDISO_FLAG) THEN
0 commit comments