diff --git a/Source/dump.f90 b/Source/dump.f90 index e470951e27d..97e902eeb80 100644 --- a/Source/dump.f90 +++ b/Source/dump.f90 @@ -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 @@ -2166,7 +2166,7 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE ENDDO ENDIF -! Write grid info for each block +! Write MESH-specific information MESH_LOOP: DO NM=1,NMESHES @@ -2174,15 +2174,47 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE 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 @@ -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 @@ -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) diff --git a/Source/init.f90 b/Source/init.f90 index 25575446a91..abc2ab6324c 100644 --- a/Source/init.f90 +++ b/Source/init.f90 @@ -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