Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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