Skip to content

Commit 26e86f4

Browse files
committed
FDS Source : Address semidefinite matrices in global pressure solver.
1 parent bc530c4 commit 26e86f4

File tree

2 files changed

+59
-23
lines changed

2 files changed

+59
-23
lines changed

Source/pres.f90

Lines changed: 56 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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
30543054
REAL(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:
30603060
TYPE(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)
31213125
ENDDO
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+
33843392
SELECT CASE(STAGE_FLAG)
33853393
CASE(1)
33863394

@@ -3923,7 +3931,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39233931
INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MB_FACTOR
39243932
#endif
39253933
#ifdef WITH_HYPRE
3926-
INTEGER :: ONEV(1)
3934+
INTEGER :: ONEV(1), END_ROW
39273935
REAL(EB) :: ZEROV(1)
39283936
#endif
39293937
!.. All other variables
@@ -3957,7 +3965,7 @@ SUBROUTINE GET_H_MATRIX_LUDCMP
39573965
#endif
39583966
END 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
42264262
REAL(EB), POINTER, DIMENSION(:,:) :: D_MAT_HP
42274263
INTEGER :: 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
43074343
ENDDO IPZ_LOOP
43084344

@@ -4332,7 +4368,7 @@ SUBROUTINE GET_H_MATRIX
43324368
INTEGER :: WC_JD(1:2,1:2)
43334369
LOGICAL :: 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
45534589
ENDDO
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
49675003
ENDDO
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:
53235359
PHASE = -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

Source/read.f90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9880,7 +9880,7 @@ SUBROUTINE READ_PRES
98809880
#ifndef WITH_MKL
98819881
#ifdef WITH_HYPRE
98829882
IF (PRES_FLAG==ULMAT_FLAG ) ULMAT_SOLVER_LIBRARY =HYPRE_FLAG
9883-
IF (PRES_FLAG==UGLMAT_FLAG) UGLMAT_SOLVER_LIBRARY=HYPRE_FLAG
9883+
IF (PRES_FLAG==UGLMAT_FLAG .OR. PRES_FLAG==GLMAT_FLAG) UGLMAT_SOLVER_LIBRARY=HYPRE_FLAG
98849884
#endif
98859885
#endif
98869886
#ifndef WITH_HYPRE
@@ -11065,7 +11065,7 @@ SUBROUTINE READ_OBST(QUICK_READ)
1106511065
IF (SURF_ID6(5) ==SURFACE(NNN)%ID) OB%SURF_INDEX(-3) = NNN
1106611066
IF (SURF_ID6(6) ==SURFACE(NNN)%ID) OB%SURF_INDEX( 3) = NNN
1106711067
ENDDO
11068-
11068+
1106911069
DO NNN=-3,3
1107011070
IF (SURFACE(OB%SURF_INDEX(NNN))%NODE_ID/='null') THEN
1107111071
WRITE(MESSAGE,'(A,A,A)') 'ERROR(xxx): OBST_ID ',TRIM(ID),' cannot have a SURF with NODE_ID.'
@@ -12219,7 +12219,7 @@ SUBROUTINE READ_VENT
1221912219
ENDDO
1222012220
IF (SURFACE(VT%SURF_INDEX)%NODE_ID /='null') THEN
1222112221
WRITE(MESSAGE,'(3A)') 'ERROR(812): VENT ',TRIM(ID),' Use SURF_ID HVAC instead of NODE_ID.'
12222-
CALL SHUTDOWN(MESSAGE,PROCESS_0_ONLY=.FALSE.) ; RETURN
12222+
CALL SHUTDOWN(MESSAGE,PROCESS_0_ONLY=.FALSE.) ; RETURN
1222312223
ENDIF
1222412224

1222512225
IF (SURF_ID=='OPEN') VT%TYPE_INDICATOR = 2

0 commit comments

Comments
 (0)