diff --git a/Source/cons.f90 b/Source/cons.f90 index 789c03b3d12..55082f42e7e 100644 --- a/Source/cons.f90 +++ b/Source/cons.f90 @@ -759,7 +759,7 @@ MODULE GLOBAL_CONSTANTS LOGICAL, ALLOCATABLE, DIMENSION(:) :: EXTERNAL_CTRL ! VENT array -REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: VENT_TOTAL_AREA +REAL(EB), ALLOCATABLE, DIMENSION(:) :: VENT_TOTAL_AREA !< Array holding grid-snapped areas for all vents END MODULE GLOBAL_CONSTANTS diff --git a/Source/main.f90 b/Source/main.f90 index dc0d696bd8f..237476bc8e6 100644 --- a/Source/main.f90 +++ b/Source/main.f90 @@ -72,7 +72,7 @@ PROGRAM FDS CHARACTER(MPI_MAX_PROCESSOR_NAME) :: PNAME LOGICAL, ALLOCATABLE, DIMENSION(:) :: LOGICAL_BUFFER_EXTERNAL REAL(EB), ALLOCATABLE, DIMENSION(:) :: REAL_BUFFER_DUCT,REAL_BUFFER_EXTERNAL -REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: REAL_BUFFER_10,REAL_BUFFER_20,REAL_BUFFER_VENT +REAL(EB), ALLOCATABLE, DIMENSION(:,:) :: REAL_BUFFER_10,REAL_BUFFER_20 ! Initialize OpenMP @@ -1053,7 +1053,6 @@ SUBROUTINE MPI_INITIALIZATION_CHORES(TASK_NUMBER) ALLOCATE(REAL_BUFFER_DUCT((2+N_TRACKED_SPECIES)*N_DUCTNODES+N_DUCTS)) ALLOCATE(REAL_BUFFER_10(10,NMESHES)) ALLOCATE(REAL_BUFFER_20(20,NMESHES)) - ALLOCATE(REAL_BUFFER_VENT(N_VENT_TOTAL,NMESHES)) IF (READ_EXTERNAL) THEN ALLOCATE(REAL_BUFFER_EXTERNAL(N_RAMP)) @@ -1064,13 +1063,11 @@ SUBROUTINE MPI_INITIALIZATION_CHORES(TASK_NUMBER) ALLOCATE(COUNTS_10(0:N_MPI_PROCESSES-1)) ALLOCATE(COUNTS_20(0:N_MPI_PROCESSES-1)) ALLOCATE(COUNTS_TP(0:N_MPI_PROCESSES-1)) - ALLOCATE(COUNTS_VENT(0:N_MPI_PROCESSES-1)) ALLOCATE(DISPLS(0:N_MPI_PROCESSES-1)) ALLOCATE(DISPLS_10(0:N_MPI_PROCESSES-1)) ALLOCATE(DISPLS_20(0:N_MPI_PROCESSES-1)) ALLOCATE(DISPLS_TP(0:N_MPI_PROCESSES-1)) - ALLOCATE(DISPLS_VENT(0:N_MPI_PROCESSES-1)) ALLOCATE(I_OFFSET(NMESHES)) COUNTS = 0 @@ -1095,8 +1092,6 @@ SUBROUTINE MPI_INITIALIZATION_CHORES(TASK_NUMBER) DISPLS(N) = COUNTS(N-1) + DISPLS(N-1) DISPLS_TP(N) = COUNTS_TP(N-1) + DISPLS_TP(N-1) ENDDO - COUNTS_VENT = COUNTS*N_VENT_TOTAL - DISPLS_VENT = DISPLS*N_VENT_TOTAL COUNTS_10 = COUNTS*10 DISPLS_10 = DISPLS*10 COUNTS_20 = COUNTS*20 @@ -4275,22 +4270,17 @@ SUBROUTINE CHECK_FREEZE_VELOCITY_STATUS END SUBROUTINE CHECK_FREEZE_VELOCITY_STATUS -!> \brief Exchange FDS VENT areas so each process knows the total FDS area +!> \brief Sum up local grid-snapped or "FDS" VENT areas so that each process knows the total vent area spanning multiple meshes SUBROUTINE EXCHANGE_VENT_AREA -INTEGER:: NM,NV +INTEGER :: NM,NV -IF (N_MPI_PROCESSES>1) THEN - REAL_BUFFER_VENT = VENT_TOTAL_AREA - CALL MPI_ALLGATHERV(MPI_IN_PLACE,0,MPI_DATATYPE_NULL,REAL_BUFFER_VENT,& - COUNTS_VENT,DISPLS_VENT,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,IERR) - VENT_TOTAL_AREA = REAL_BUFFER_VENT -ENDIF +CALL MPI_ALLREDUCE(MPI_IN_PLACE,VENT_TOTAL_AREA,N_VENT_TOTAL,MPI_DOUBLE_PRECISION,MPI_SUM,MPI_COMM_WORLD,IERR) -DO NM=1,NMESHES - IF (PROCESS(NM)/=MY_RANK) CYCLE - DO NV=1,MESHES(NM)%N_VENT - MESHES(NM)%VENTS(NV)%TOTAL_FDS_AREA=SUM(VENT_TOTAL_AREA(MESHES(NM)%VENTS(NV)%TOTAL_INDEX,:)) +DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX + M => MESHES(NM) + DO NV=1,M%N_VENT + M%VENTS(NV)%TOTAL_FDS_AREA = VENT_TOTAL_AREA(M%VENTS(NV)%TOTAL_INDEX) ENDDO ENDDO diff --git a/Source/read.f90 b/Source/read.f90 index 804fb50b70d..cec5e3fdd89 100644 --- a/Source/read.f90 +++ b/Source/read.f90 @@ -11777,7 +11777,7 @@ SUBROUTINE READ_VENT IF (I_MODE==2) THEN ALLOCATE(MESHES(NM)%VENTS(N_VENT),STAT=IZERO) ; CALL ChkMemErr('READ','VENTS',IZERO) ; VENTS=>MESHES(NM)%VENTS - IF (.NOT. ALLOCATED(VENT_TOTAL_AREA)) ALLOCATE(VENT_TOTAL_AREA(N_VENT_TOTAL,NMESHES),STAT=IZERO) ! Only once per MPI process + IF (.NOT. ALLOCATED(VENT_TOTAL_AREA)) ALLOCATE(VENT_TOTAL_AREA(N_VENT_TOTAL),STAT=IZERO) ! Only once per MPI process CALL ChkMemErr('READ','VENT_TOTAL_AREA',IZERO); VENT_TOTAL_AREA = 0._EB IF (MY_RANK==0 .AND. .NOT.ALLOCATED(ORIGINAL_VENTS)) ALLOCATE(ORIGINAL_VENTS(N_ORIGINAL_VENTS)) ENDIF @@ -11787,7 +11787,7 @@ SUBROUTINE READ_VENT N_VENT = 0 ! Number of VENTs stored by each mesh N_TOTAL = 0 ! Counter of all VENTs, both explicit and implicit N_EXPLICIT = 0 ! Counter of explicitly declared VENTs - N_VENT_TOTAL = 0 ! Purely for Smokeview drawing of VENTs + N_VENT_TOTAL = 0 ! Total number of all vents throughout the whole domain N_ORIGINAL_VENTS = 0 ! Number of specified vents for use with Smokeview and HVAC drawing REWIND(LU_INPUT) ; INPUT_FILE_LINE_NUMBER = 0 @@ -12443,7 +12443,7 @@ SUBROUTINE READ_VENT ENDDO ENDDO END SELECT - VENT_TOTAL_AREA(VT%TOTAL_INDEX,NM) = VT%FDS_AREA + VENT_TOTAL_AREA(VT%TOTAL_INDEX) = VENT_TOTAL_AREA(VT%TOTAL_INDEX) + VT%FDS_AREA ENDDO VENT_LOOP_3 ENDDO MESH_LOOP_2