Skip to content

Commit

Permalink
FDS Source: Issue firemodels/smv#2085. Add GRID neighbors
Browse files Browse the repository at this point in the history
  • Loading branch information
mcgratta committed Feb 3, 2025
1 parent 41f8707 commit 86169e7
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 48 deletions.
134 changes: 87 additions & 47 deletions Source/dump.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1533,7 +1533,7 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
CHARACTER(MESSAGE_LENGTH) :: MESSAGE
TYPE(GEOMETRY_TYPE), POINTER :: G=>NULL()
INTEGER :: IG,IS_TERRAIN_INT
INTEGER :: II,JJ,IIO,JJO,KKO,NOM
INTEGER :: II,JJ,IIO,JJO,KKO,NOM,IW,IW1,IW2,MESH_NEIGHBOR(6)
INTEGER :: N_NODE_OUT, N_DUCT_OUT
CHARACTER(LABEL_LENGTH) :: DEV_QUAN, HVAC_LABEL, OBST_LABEL
TYPE (MPI_STATUS) :: STATUS
Expand Down Expand Up @@ -2166,23 +2166,55 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
ENDDO
ENDIF

! Write grid info for each block
! Write MESH-specific information

MESH_LOOP: DO NM=1,NMESHES

IF (PROCESS(NM)/=MY_RANK) CYCLE

M => MESHES(NM)
T => TRANS(NM)

! Mesh offset (not used)

CALL EOL
WRITE(MYSTR,'(A)') 'OFFSET'; CALL ADDSTR
WRITE(MYSTR,'(3F13.5)') 0.,0.,0.; CALL ADDSTR

! Mesh grid dimensions and neighbor information.
! Determine if the six mesh faces abut a single mesh (MESH_NEIGHBOR>0), nothing (MESH_NEIGHBOR=0),
! or a combination of nothing and/or multiple meshes (MESH_NEIGHBOR=-1). Write six values to GRID line.

DO I=1,6
SELECT CASE(I)
CASE(1) ; IW1=1 ; IW2=IW1+M%JBAR*M%KBAR-1
CASE(2) ; IW1= M%JBAR*M%KBAR+1 ; IW2=IW1+M%JBAR*M%KBAR-1
CASE(3) ; IW1=2*M%JBAR*M%KBAR+1 ; IW2=IW1+M%IBAR*M%KBAR-1
CASE(4) ; IW1=2*M%JBAR*M%KBAR+ M%IBAR*M%KBAR+1 ; IW2=IW1+M%IBAR*M%KBAR-1
CASE(5) ; IW1=2*M%JBAR*M%KBAR+2*M%IBAR*M%KBAR+1 ; IW2=IW1+M%IBAR*M%JBAR-1
CASE(6) ; IW1=2*M%JBAR*M%KBAR+2*M%IBAR*M%KBAR+ M%IBAR*M%JBAR+1 ; IW2=IW1+M%IBAR*M%JBAR-1
END SELECT
MESH_NEIGHBOR(I) = M%EXTERNAL_WALL(IW1)%NOM
DO IW=IW1,IW2
IF (M%EXTERNAL_WALL(IW)%NOM/=MESH_NEIGHBOR(I)) THEN
MESH_NEIGHBOR(I) = -1
EXIT
ENDIF
ENDDO
ENDDO

CALL EOL
WRITE(MYSTR,'(A,3X,A)') 'GRID',TRIM(MESH_NAME(NM)); CALL ADDSTR
WRITE(MYSTR,'(4I5)') M%IBAR,M%JBAR,M%KBAR,0; CALL ADDSTR
WRITE(MYSTR,'(9I6)') M%IBAR,M%JBAR,M%KBAR,MESH_NEIGHBOR(1:6) ; CALL ADDSTR

! Mesh dimensions and color indices

CALL EOL
WRITE(MYSTR,'(A)') 'PDIM'; CALL ADDSTR
WRITE(MYSTR,'(9F14.5)') M%XS,M%XF,M%YS,M%YF,M%ZS,M%ZF,(REAL(M%RGB(I),FB)/255._FB,I = 1,3); CALL ADDSTR

! Mesh grid stretching information

CALL EOL
WRITE(MYSTR,'(A)') 'TRNX'; CALL ADDSTR
WRITE(MYSTR,'(I5)') T%NOC(1); CALL ADDSTR
Expand Down Expand Up @@ -2211,7 +2243,8 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
WRITE(MYSTR,'(I5,F14.5)') K,M%Z(K); CALL ADDSTR
ENDDO

! Write obstacle info to .smv file
! Obstruction information

CALL EOL
WRITE(MYSTR,'(A)') 'OBST'; CALL ADDSTR
WRITE(MYSTR,*) M%N_OBST; CALL ADDSTR
Expand Down Expand Up @@ -2457,64 +2490,71 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE

! Write the .smv file

SMV_PARALLEL_WRITE_IF : IF( SMV_PARALLEL_WRITE ) THEN
SMV_PARALLEL_WRITE_IF: IF (SMV_PARALLEL_WRITE) THEN

! Write using MPI-IO:
CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT(OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
CALL MPI_FILE_CLOSE(SMVFILE_HANDLE,IERR)
! Write using MPI-IO:

CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT(OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
CALL MPI_FILE_CLOSE(SMVFILE_HANDLE,IERR)

ELSE SMV_PARALLEL_WRITE_IF

! Gather strings in rank 0, which does a POSIX write:
IF(N_MPI_PROCESSES>1) THEN
ALLOCATE(RECV_USE_LEN(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1),RECV_COUNTS(0:N_MPI_PROCESSES-1))
RECV_USE_LEN=0; RECV_USE_LEN(MY_RANK)=SMVSTR_USE_LEN; RECV_USE_OFF=0
RECV_COUNTS=1; DO I=0,N_MPI_PROCESSES-1; RECV_USE_OFF(I)=I; ENDDO
IF(MY_RANK==0) THEN
! Gather string sizes from all Processes in rank 0:
CALL MPI_GATHERV(MPI_IN_PLACE,0,MPI_DATATYPE_NULL, &
! Gather strings in rank 0, which does a POSIX write:

MPI_IF: IF (N_MPI_PROCESSES>1) THEN

ALLOCATE(RECV_USE_LEN(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1),RECV_COUNTS(0:N_MPI_PROCESSES-1))
RECV_USE_LEN=0; RECV_USE_LEN(MY_RANK)=SMVSTR_USE_LEN; RECV_USE_OFF=0
RECV_COUNTS=1; DO I=0,N_MPI_PROCESSES-1; RECV_USE_OFF(I)=I; ENDDO

IF (MY_RANK==0) THEN
! Gather string sizes from all Processes in rank 0:
CALL MPI_GATHERV(MPI_IN_PLACE,0,MPI_DATATYPE_NULL, &
RECV_USE_LEN(0),RECV_COUNTS(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1), &
MPI_INTEGER,0,MPI_COMM_WORLD,IERR)
! Recompute offset for gather string:
RECV_USE_OFF=0
DO I=1,N_MPI_PROCESSES-1
! Recompute offset for gather string:
RECV_USE_OFF=0
DO I=1,N_MPI_PROCESSES-1
RECV_USE_OFF(I) = RECV_USE_OFF(I-1) + RECV_USE_LEN(I-1)
ENDDO
! Gather strings from all Processes in rank 0:
STR_GATHER_LEN = SUM(RECV_USE_LEN(0:N_MPI_PROCESSES-1))
ALLOCATE(CHARACTER(LEN=STR_GATHER_LEN)::STR_GATHER); STR_GATHER(1:SMVSTR_USE_LEN)=SMVSTR(1:SMVSTR_USE_LEN)
CALL MPI_GATHERV(MPI_IN_PLACE,0,MPI_DATATYPE_NULL, &
ENDDO
! Gather strings from all Processes in rank 0:
STR_GATHER_LEN = SUM(RECV_USE_LEN(0:N_MPI_PROCESSES-1))
ALLOCATE(CHARACTER(LEN=STR_GATHER_LEN)::STR_GATHER); STR_GATHER(1:SMVSTR_USE_LEN)=SMVSTR(1:SMVSTR_USE_LEN)
CALL MPI_GATHERV(MPI_IN_PLACE,0,MPI_DATATYPE_NULL, &
STR_GATHER,RECV_USE_LEN(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1), &
MPI_CHARACTER,0,MPI_COMM_WORLD,IERR)
! Process 0 writes SMV file:
OPEN(UNIT=LU_SMV,FILE=FN_SMV,FORM='formatted')
WRITE(LU_SMV,'(A)') STR_GATHER(1:STR_GATHER_LEN)
CLOSE(LU_SMV)
ELSE
! Gather string sizes from all Processes in rank 0:
CALL MPI_GATHERV(SMVSTR_USE_LEN,1,MPI_INTEGER, &
! Process 0 writes SMV file:
OPEN(UNIT=LU_SMV,FILE=FN_SMV,FORM='formatted')
WRITE(LU_SMV,'(A)') STR_GATHER(1:STR_GATHER_LEN)
CLOSE(LU_SMV)
ELSE
! Gather string sizes from all Processes in rank 0:
CALL MPI_GATHERV(SMVSTR_USE_LEN,1,MPI_INTEGER, &
RECV_USE_LEN(0),RECV_COUNTS(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1), &
MPI_INTEGER,0,MPI_COMM_WORLD,IERR)
! Gather strings from all Processes in rank 0:
ALLOCATE(CHARACTER(LEN=1)::STR_GATHER); ! Dummy allocation.
CALL MPI_GATHERV(SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER, &
! Gather strings from all Processes in rank 0:
ALLOCATE(CHARACTER(LEN=1)::STR_GATHER); ! Dummy allocation.
CALL MPI_GATHERV(SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER, &
STR_GATHER,RECV_USE_LEN(0:N_MPI_PROCESSES-1),RECV_USE_OFF(0:N_MPI_PROCESSES-1), &
MPI_CHARACTER,0,MPI_COMM_WORLD,IERR)
ENDIF
DEALLOCATE(RECV_USE_LEN,RECV_USE_OFF,RECV_COUNTS,STR_GATHER)
ELSE
! Signle MPI process job : Process 0 writes SMV file.
OPEN(UNIT=LU_SMV,FILE=FN_SMV,FORM='formatted')
WRITE(LU_SMV,'(A)') SMVSTR(1:SMVSTR_USE_LEN)
CLOSE(LU_SMV)
ENDIF
ENDIF

ENDIF SMV_PARALLEL_WRITE_IF
DEALLOCATE(RECV_USE_LEN,RECV_USE_OFF,RECV_COUNTS,STR_GATHER)

ELSE MPI_IF

! Signle MPI process job : Process 0 writes SMV file.
OPEN(UNIT=LU_SMV,FILE=FN_SMV,FORM='formatted')
WRITE(LU_SMV,'(A)') SMVSTR(1:SMVSTR_USE_LEN)
CLOSE(LU_SMV)

ENDIF MPI_IF

ENDIF SMV_PARALLEL_WRITE_IF

DEALLOCATE(SMVSTR)

Expand Down
1 change: 0 additions & 1 deletion Source/init.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1054,7 +1054,6 @@ SUBROUTINE INITIALIZE_MESH_VARIABLES_2(NM)

USE MEMORY_FUNCTIONS, ONLY: REALLOCATE_EDGE,REALLOCATE_REAL_ARRAY
USE PHYSICAL_FUNCTIONS, ONLY: GET_SPECIFIC_HEAT
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES
USE CONTROL_VARIABLES
INTEGER :: N,I,J,K,IPTS,JPTS,KPTS,N_EDGES_DIM,IW,IC,IERR,IPZ,IZERO,ICF,NSLICE
INTEGER, INTENT(IN) :: NM
Expand Down

0 comments on commit 86169e7

Please sign in to comment.