Skip to content

Commit fd650e4

Browse files
authored
Merge pull request #14816 from mcgratta/ht3d_mpi
FDS Source: Reduce size of WALL_SEND_BUFFER
2 parents a017383 + 44ca52f commit fd650e4

File tree

4 files changed

+163
-50
lines changed

4 files changed

+163
-50
lines changed

Source/func.f90

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3049,6 +3049,24 @@ SUBROUTINE REALLOCATE_INTEGER_ARRAY(P,N1,N2,N3)
30493049
END SUBROUTINE REALLOCATE_INTEGER_ARRAY
30503050

30513051

3052+
!> \brief Change the allocation of an logical array with DIMENSION 1
3053+
!> \param P Original array
3054+
!> \param N1 Lower bound of old/new allocation
3055+
!> \param N2 Upper bound of old allocation
3056+
!> \param N3 Upper bound of new allocation
3057+
3058+
SUBROUTINE REALLOCATE_LOGICAL_ARRAY(P,N1,N2,N3)
3059+
3060+
LOGICAL, ALLOCATABLE, DIMENSION(:) :: P,DUMMY
3061+
INTEGER, INTENT(IN) :: N1,N2,N3
3062+
3063+
ALLOCATE(DUMMY(N1:N3))
3064+
IF (ALLOCATED(P)) DUMMY(N1:N2) = P(N1:N2)
3065+
CALL MOVE_ALLOC(DUMMY,P)
3066+
3067+
END SUBROUTINE REALLOCATE_LOGICAL_ARRAY
3068+
3069+
30523070
!> \brief Changes the allocation of a string array
30533071
!> \param P Original array
30543072
!> \param CLEN Length of string

Source/init.f90

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,7 +1789,7 @@ SUBROUTINE INITIALIZE_HT3D_WALL_CELLS(NM)
17891789
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES
17901790
INTEGER, INTENT(IN) :: NM
17911791
INTEGER :: I,IW,IW2,ITW,ITW2,NWP,NWP2,I2,IWA,DM,IOR,NOM,II,JJ,KK,NN,IC,NL
1792-
LOGICAL :: IOR_AVOID(-3:3)
1792+
LOGICAL :: IOR_AVOID(-3:3),FOUND
17931793
REAL(EB) :: X1,X2,Y1,Y2,Z1,Z2,XX1,XX2,YY1,YY2,ZZ1,ZZ2,PRIMARY_VOLUME,OVERLAP_VOLUME,DXX,DYY,DZZ,WEIGHT_FACTOR,&
17941794
SUM_WGT(3),XX,YY,ZZ,WEIGHT,TARGET_WEIGHT
17951795
TYPE(WALL_TYPE), POINTER :: WC
@@ -1799,6 +1799,7 @@ SUBROUTINE INITIALIZE_HT3D_WALL_CELLS(NM)
17991799
TYPE(BOUNDARY_THR_D_TYPE), POINTER :: THR_D
18001800
TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC,BC2
18011801
TYPE(MESH_TYPE), POINTER :: M
1802+
TYPE(STORAGE_TYPE), POINTER :: OS
18021803
INTEGER, ALLOCATABLE, DIMENSION(:) :: INTEGER_DUMMY
18031804
REAL(EB), ALLOCATABLE, DIMENSION(:) :: REAL_DUMMY
18041805
REAL(EB), PARAMETER :: TOL=0.0001_EB
@@ -1894,13 +1895,17 @@ SUBROUTINE INITIALIZE_HT3D_WALL_CELLS(NM)
18941895

18951896
OTHER_MESH_LOOP: DO NOM=1,NMESHES
18961897
IF (NM==NOM) CYCLE
1897-
ALTERNATE_WALL_LOOP_2: DO NN=1,M%OMESH(NOM)%WALL_RECV_BUFFER%N_ITEMS
1898-
IW2 = M%OMESH(NOM)%WALL_RECV_BUFFER%ITEM_INDEX(NN)
1898+
OS => M%OMESH(NOM)%WALL_RECV_BUFFER
1899+
ALTERNATE_WALL_LOOP_2: DO NN=1,OS%N_ITEMS
1900+
IW2 = OS%ITEM_INDEX(NN)
18991901
CALL SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,WALL_INDEX=IW2)
1902+
IF (FOUND) OS%SAVE_FLAG(NN) = .TRUE.
19001903
ENDDO ALTERNATE_WALL_LOOP_2
1901-
ALTERNATE_WALL_LOOP_2D: DO NN=1,M%OMESH(NOM)%THIN_WALL_RECV_BUFFER%N_ITEMS ! THIN_WALL cells, neighboring meshes
1902-
ITW2 = M%OMESH(NOM)%THIN_WALL_RECV_BUFFER%ITEM_INDEX(NN)
1904+
OS => M%OMESH(NOM)%THIN_WALL_RECV_BUFFER
1905+
ALTERNATE_WALL_LOOP_2D: DO NN=1,OS%N_ITEMS ! THIN_WALL cells, neighboring meshes
1906+
ITW2 = OS%ITEM_INDEX(NN)
19031907
CALL SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,THIN_WALL_INDEX=ITW2)
1908+
IF (FOUND) OS%SAVE_FLAG(NN) = .TRUE.
19041909
ENDDO ALTERNATE_WALL_LOOP_2D
19051910
ENDDO OTHER_MESH_LOOP
19061911

@@ -1999,13 +2004,17 @@ SUBROUTINE INITIALIZE_HT3D_WALL_CELLS(NM)
19992004

20002005
OTHER_MESH_LOOP_B: DO NOM=1,NMESHES
20012006
IF (NM==NOM) CYCLE
2002-
ALTERNATE_WALL_LOOP_2B: DO NN=1,M%OMESH(NOM)%WALL_RECV_BUFFER%N_ITEMS ! WALL cells, neighboring meshes
2003-
IW2 = M%OMESH(NOM)%WALL_RECV_BUFFER%ITEM_INDEX(NN)
2007+
OS => M%OMESH(NOM)%WALL_RECV_BUFFER
2008+
ALTERNATE_WALL_LOOP_2B: DO NN=1,OS%N_ITEMS ! WALL cells, neighboring meshes
2009+
IW2 = OS%ITEM_INDEX(NN)
20042010
CALL SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,WALL_INDEX=IW2)
2011+
IF (FOUND) OS%SAVE_FLAG(NN) = .TRUE.
20052012
ENDDO ALTERNATE_WALL_LOOP_2B
2006-
ALTERNATE_WALL_LOOP_2C: DO NN=1,M%OMESH(NOM)%THIN_WALL_RECV_BUFFER%N_ITEMS ! THIN_WALL cells, neighboring meshes
2007-
ITW2 = M%OMESH(NOM)%THIN_WALL_RECV_BUFFER%ITEM_INDEX(NN)
2013+
OS => M%OMESH(NOM)%THIN_WALL_RECV_BUFFER
2014+
ALTERNATE_WALL_LOOP_2C: DO NN=1,OS%N_ITEMS ! THIN_WALL cells, neighboring meshes
2015+
ITW2 = OS%ITEM_INDEX(NN)
20082016
CALL SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,THIN_WALL_INDEX=ITW2)
2017+
IF (FOUND) OS%SAVE_FLAG(NN) = .TRUE.
20092018
ENDDO ALTERNATE_WALL_LOOP_2C
20102019
ENDDO OTHER_MESH_LOOP_B
20112020

@@ -2069,6 +2078,7 @@ SUBROUTINE SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,WALL_INDEX,THIN_WALL_INDEX)
20692078
TYPE(THIN_WALL_TYPE), POINTER :: TW2
20702079

20712080
M2 => MESHES(NOM)
2081+
FOUND = .FALSE.
20722082

20732083
IF (PRESENT(WALL_INDEX)) THEN
20742084
CELL = WALL_INDEX
@@ -2116,6 +2126,7 @@ SUBROUTINE SEARCH_FOR_ALTERNATE_WALL_CELLS(NOM,WALL_INDEX,THIN_WALL_INDEX)
21162126
OVERLAP_VOLUME = DXX*DYY*DZZ
21172127
WEIGHT_FACTOR = OVERLAP_VOLUME/PRIMARY_VOLUME
21182128
IF (WEIGHT_FACTOR<TOL) CYCLE ALTERNATE_NODE_LOOP
2129+
FOUND = .TRUE. ! Save the index of the alternate wall
21192130
DM = SIZE(THR_D%NODE(I)%ALTERNATE_WALL_INDEX)
21202131
IF (THR_D%NODE(I)%ALTERNATE_WALL_COUNT+1>DM) CALL REALLOCATE_ALTERNATE
21212132
THR_D%NODE(I)%ALTERNATE_WALL_COUNT = THR_D%NODE(I)%ALTERNATE_WALL_COUNT + 1
@@ -3713,7 +3724,7 @@ END SUBROUTINE SET_DENSITY_AND_MASS_FRACTIONS_AT_WALL
37133724

37143725
SUBROUTINE FIND_WALL_BACK_INDICES(NM)
37153726

3716-
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY
3727+
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY,REALLOCATE_LOGICAL_ARRAY
37173728
INTEGER, INTENT(IN) :: NM
37183729
INTEGER :: IW,ITW,N,NOM,IC,IOR,IEC
37193730
TYPE(MESH_TYPE), POINTER :: M,M4
@@ -3745,16 +3756,19 @@ SUBROUTINE FIND_WALL_BACK_INDICES(NM)
37453756
OS%N_ITEMS_DIM = 50
37463757
ALLOCATE(OS%ITEM_INDEX(1:OS%N_ITEMS_DIM))
37473758
ALLOCATE(OS%SURF_INDEX(1:OS%N_ITEMS_DIM))
3759+
ALLOCATE(OS%SAVE_FLAG(1:OS%N_ITEMS_DIM))
37483760
ENDIF
37493761
IF (COUNT(OS%ITEM_INDEX(1:OS%N_ITEMS)==M4%CELL(IC)%WALL_INDEX(IOR))>0) CYCLE
37503762
IF (OS%N_ITEMS>=OS%N_ITEMS_DIM) THEN
37513763
CALL REALLOCATE_INTEGER_ARRAY(OS%ITEM_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
37523764
CALL REALLOCATE_INTEGER_ARRAY(OS%SURF_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
3765+
CALL REALLOCATE_LOGICAL_ARRAY(OS%SAVE_FLAG ,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
37533766
OS%N_ITEMS_DIM = OS%N_ITEMS_DIM + 50
37543767
ENDIF
37553768
OS%N_ITEMS = OS%N_ITEMS + 1
37563769
OS%ITEM_INDEX(OS%N_ITEMS) = M4%CELL(IC)%WALL_INDEX(IOR)
37573770
OS%SURF_INDEX(OS%N_ITEMS) = M4%CELL(IC)%SURF_INDEX(IOR)
3771+
OS%SAVE_FLAG(OS%N_ITEMS) = .FALSE.
37583772
ENDDO
37593773
ENDDO
37603774
ENDDO
@@ -3783,11 +3797,13 @@ SUBROUTINE FIND_WALL_BACK_INDICES(NM)
37833797
IF (OS%N_ITEMS>=OS%N_ITEMS_DIM) THEN
37843798
CALL REALLOCATE_INTEGER_ARRAY(OS%ITEM_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
37853799
CALL REALLOCATE_INTEGER_ARRAY(OS%SURF_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
3800+
CALL REALLOCATE_LOGICAL_ARRAY(OS%SAVE_FLAG ,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
37863801
OS%N_ITEMS_DIM = OS%N_ITEMS_DIM + 50
37873802
ENDIF
37883803
OS%N_ITEMS = OS%N_ITEMS + 1
37893804
OS%ITEM_INDEX(OS%N_ITEMS) = M4%CELL(IC)%THIN_WALL_INDEX(IOR,IEC)
37903805
OS%SURF_INDEX(OS%N_ITEMS) = M4%CELL(IC)%THIN_SURF_INDEX(IOR,IEC)
3806+
OS%SAVE_FLAG(OS%N_ITEMS) = .FALSE.
37913807
ENDIF
37923808
ENDDO
37933809
ENDDO
@@ -3805,7 +3821,7 @@ END SUBROUTINE FIND_WALL_BACK_INDICES
38053821
SUBROUTINE FIND_WALL_BACK_INDEX(NM,IW)
38063822

38073823
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES
3808-
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY
3824+
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY,REALLOCATE_LOGICAL_ARRAY
38093825
USE MISC_FUNCTIONS, ONLY: PROCESS_MESH_NEIGHBORHOOD
38103826
USE COMP_FUNCTIONS, ONLY: SHUTDOWN
38113827
INTEGER, INTENT(IN) :: NM,IW
@@ -4027,16 +4043,19 @@ SUBROUTINE FIND_WALL_BACK_INDEX(NM,IW)
40274043
OS%N_ITEMS_DIM = 50
40284044
ALLOCATE(OS%ITEM_INDEX(1:OS%N_ITEMS_DIM))
40294045
ALLOCATE(OS%SURF_INDEX(1:OS%N_ITEMS_DIM))
4046+
ALLOCATE(OS%SAVE_FLAG(1:OS%N_ITEMS_DIM))
40304047
ENDIF
40314048
IF (COUNT(OS%ITEM_INDEX(1:OS%N_ITEMS)==ONE_D%BACK_INDEX)==0) THEN
40324049
IF (OS%N_ITEMS>=OS%N_ITEMS_DIM) THEN
40334050
CALL REALLOCATE_INTEGER_ARRAY(OS%ITEM_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
40344051
CALL REALLOCATE_INTEGER_ARRAY(OS%SURF_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
4052+
CALL REALLOCATE_LOGICAL_ARRAY(OS%SAVE_FLAG ,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
40354053
OS%N_ITEMS_DIM = OS%N_ITEMS_DIM + 50
40364054
ENDIF
40374055
OS%N_ITEMS = OS%N_ITEMS + 1
40384056
OS%ITEM_INDEX(OS%N_ITEMS) = ONE_D%BACK_INDEX
40394057
OS%SURF_INDEX(OS%N_ITEMS) = ONE_D%BACK_SURF
4058+
OS%SAVE_FLAG(OS%N_ITEMS) = .TRUE.
40404059
ENDIF
40414060
ENDIF
40424061
EXIT FIND_BACK_WALL_CELL
@@ -4215,7 +4234,7 @@ END SUBROUTINE FIND_WALL_BACK_INDEX
42154234
SUBROUTINE FIND_THIN_WALL_BACK_INDEX(NM,ITW)
42164235

42174236
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES
4218-
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY
4237+
USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_INTEGER_ARRAY,REALLOCATE_LOGICAL_ARRAY
42194238
INTEGER, INTENT(IN) :: NM,ITW
42204239
INTEGER :: II,JJ,KK,IC,IOR,IEC,ITW2,NOM,NN,NNN,NL,N_MATLS,IIGM,IIGP,JJGM,JJGP,KKGM,KKGP,ICM,ICP
42214240
INTEGER, DIMENSION(MAX_MATERIALS) :: MATL_INDEX
@@ -4334,16 +4353,19 @@ SUBROUTINE FIND_THIN_WALL_BACK_INDEX(NM,ITW)
43344353
OS%N_ITEMS_DIM = 50
43354354
ALLOCATE(OS%ITEM_INDEX(1:OS%N_ITEMS_DIM))
43364355
ALLOCATE(OS%SURF_INDEX(1:OS%N_ITEMS_DIM))
4356+
ALLOCATE(OS%SAVE_FLAG(1:OS%N_ITEMS_DIM))
43374357
ENDIF
43384358
IF (COUNT(OS%ITEM_INDEX(1:OS%N_ITEMS)==ONE_D%BACK_INDEX)==0) THEN
43394359
IF (OS%N_ITEMS>=OS%N_ITEMS_DIM) THEN
43404360
CALL REALLOCATE_INTEGER_ARRAY(OS%ITEM_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
43414361
CALL REALLOCATE_INTEGER_ARRAY(OS%SURF_INDEX,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
4362+
CALL REALLOCATE_LOGICAL_ARRAY(OS%SAVE_FLAG ,1,OS%N_ITEMS_DIM,OS%N_ITEMS_DIM+50)
43424363
OS%N_ITEMS_DIM = OS%N_ITEMS_DIM + 50
43434364
ENDIF
43444365
OS%N_ITEMS = OS%N_ITEMS + 1
43454366
OS%ITEM_INDEX(OS%N_ITEMS) = ONE_D%BACK_INDEX
43464367
OS%SURF_INDEX(OS%N_ITEMS) = ONE_D%BACK_SURF
4368+
OS%SAVE_FLAG(OS%N_ITEMS) = .TRUE.
43474369
ENDIF
43484370
SELECT CASE(ABS(IOR))
43494371
CASE(1) ; ONE_D%LAYER_THICKNESS(1) = OB%UNDIVIDED_INPUT_LENGTH(1)

0 commit comments

Comments
 (0)