@@ -1533,7 +1533,7 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
15331533CHARACTER (MESSAGE_LENGTH) :: MESSAGE
15341534TYPE (GEOMETRY_TYPE), POINTER :: G= >NULL ()
15351535INTEGER :: IG,IS_TERRAIN_INT
1536- INTEGER :: II,JJ,IIO,JJO,KKO,NOM
1536+ INTEGER :: II,JJ,IIO,JJO,KKO,NOM,IW,IW1,IW2,MESH_NEIGHBOR( 6 )
15371537INTEGER :: N_NODE_OUT, N_DUCT_OUT
15381538CHARACTER (LABEL_LENGTH) :: DEV_QUAN, HVAC_LABEL, OBST_LABEL
15391539TYPE (MPI_STATUS) :: STATUS
@@ -2166,23 +2166,55 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
21662166 ENDDO
21672167ENDIF
21682168
2169- ! Write grid info for each block
2169+ ! Write MESH-specific information
21702170
21712171MESH_LOOP: DO NM= 1 ,NMESHES
21722172
21732173 IF (PROCESS(NM)/= MY_RANK) CYCLE
21742174
21752175 M = > MESHES(NM)
21762176 T = > TRANS(NM)
2177+
2178+ ! Mesh offset (not used)
2179+
21772180 CALL EOL
21782181 WRITE (MYSTR,' (A)' ) ' OFFSET' ; CALL ADDSTR
21792182 WRITE (MYSTR,' (3F13.5)' ) 0 .,0 .,0 .; CALL ADDSTR
2183+
2184+ ! Mesh grid dimensions and neighbor information.
2185+ ! Determine if the six mesh faces abut a single mesh (MESH_NEIGHBOR>0), nothing (MESH_NEIGHBOR=0),
2186+ ! or a combination of nothing and/or multiple meshes (MESH_NEIGHBOR=-1). Write six values to GRID line.
2187+
2188+ DO I= 1 ,6
2189+ SELECT CASE (I)
2190+ CASE (1 ) ; IW1= 1 ; IW2= IW1+ M% JBAR* M% KBAR-1
2191+ CASE (2 ) ; IW1= M% JBAR* M% KBAR+1 ; IW2= IW1+ M% JBAR* M% KBAR-1
2192+ CASE (3 ) ; IW1= 2 * M% JBAR* M% KBAR+1 ; IW2= IW1+ M% IBAR* M% KBAR-1
2193+ CASE (4 ) ; IW1= 2 * M% JBAR* M% KBAR+ M% IBAR* M% KBAR+1 ; IW2= IW1+ M% IBAR* M% KBAR-1
2194+ CASE (5 ) ; IW1= 2 * M% JBAR* M% KBAR+2 * M% IBAR* M% KBAR+1 ; IW2= IW1+ M% IBAR* M% JBAR-1
2195+ 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
2196+ END SELECT
2197+ MESH_NEIGHBOR(I) = M% EXTERNAL_WALL(IW1)% NOM
2198+ DO IW= IW1,IW2
2199+ IF (M% EXTERNAL_WALL(IW)% NOM/= MESH_NEIGHBOR(I)) THEN
2200+ MESH_NEIGHBOR(I) = - 1
2201+ EXIT
2202+ ENDIF
2203+ ENDDO
2204+ ENDDO
2205+
21802206 CALL EOL
21812207 WRITE (MYSTR,' (A,3X,A)' ) ' GRID' ,TRIM (MESH_NAME(NM)); CALL ADDSTR
2182- WRITE (MYSTR,' (4I5)' ) M% IBAR,M% JBAR,M% KBAR,0 ; CALL ADDSTR
2208+ WRITE (MYSTR,' (9I6)' ) M% IBAR,M% JBAR,M% KBAR,MESH_NEIGHBOR(1 :6 ) ; CALL ADDSTR
2209+
2210+ ! Mesh dimensions and color indices
2211+
21832212 CALL EOL
21842213 WRITE (MYSTR,' (A)' ) ' PDIM' ; CALL ADDSTR
21852214 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
2215+
2216+ ! Mesh grid stretching information
2217+
21862218 CALL EOL
21872219 WRITE (MYSTR,' (A)' ) ' TRNX' ; CALL ADDSTR
21882220 WRITE (MYSTR,' (I5)' ) T% NOC(1 ); CALL ADDSTR
@@ -2211,7 +2243,8 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
22112243 WRITE (MYSTR,' (I5,F14.5)' ) K,M% Z(K); CALL ADDSTR
22122244 ENDDO
22132245
2214- ! Write obstacle info to .smv file
2246+ ! Obstruction information
2247+
22152248 CALL EOL
22162249 WRITE (MYSTR,' (A)' ) ' OBST' ; CALL ADDSTR
22172250 WRITE (MYSTR,* ) M% N_OBST; CALL ADDSTR
@@ -2457,64 +2490,71 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
24572490
24582491! Write the .smv file
24592492
2460- SMV_PARALLEL_WRITE_IF : IF ( SMV_PARALLEL_WRITE ) THEN
2493+ SMV_PARALLEL_WRITE_IF: IF ( SMV_PARALLEL_WRITE) THEN
24612494
2462- ! Write using MPI-IO:
2463- CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
2464- CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1 ,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
2465- CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+ MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
2466- CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT (OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
2467- CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
2468- CALL MPI_FILE_CLOSE(SMVFILE_HANDLE,IERR)
2495+ ! Write using MPI-IO:
2496+
2497+ CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
2498+ CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1 ,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
2499+ CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+ MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
2500+ CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT (OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
2501+ CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
2502+ CALL MPI_FILE_CLOSE(SMVFILE_HANDLE,IERR)
24692503
24702504ELSE SMV_PARALLEL_WRITE_IF
24712505
2472- ! Gather strings in rank 0, which does a POSIX write:
2473- IF (N_MPI_PROCESSES> 1 ) THEN
2474- ALLOCATE (RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ))
2475- RECV_USE_LEN= 0 ; RECV_USE_LEN(MY_RANK)= SMVSTR_USE_LEN; RECV_USE_OFF= 0
2476- RECV_COUNTS= 1 ; DO I= 0 ,N_MPI_PROCESSES-1 ; RECV_USE_OFF(I)= I; ENDDO
2477- IF (MY_RANK== 0 ) THEN
2478- ! Gather string sizes from all Processes in rank 0:
2479- CALL MPI_GATHERV(MPI_IN_PLACE,0 ,MPI_DATATYPE_NULL, &
2506+ ! Gather strings in rank 0, which does a POSIX write:
2507+
2508+ MPI_IF: IF (N_MPI_PROCESSES> 1 ) THEN
2509+
2510+ ALLOCATE (RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ))
2511+ RECV_USE_LEN= 0 ; RECV_USE_LEN(MY_RANK)= SMVSTR_USE_LEN; RECV_USE_OFF= 0
2512+ RECV_COUNTS= 1 ; DO I= 0 ,N_MPI_PROCESSES-1 ; RECV_USE_OFF(I)= I; ENDDO
2513+
2514+ IF (MY_RANK== 0 ) THEN
2515+ ! Gather string sizes from all Processes in rank 0:
2516+ CALL MPI_GATHERV(MPI_IN_PLACE,0 ,MPI_DATATYPE_NULL, &
24802517 RECV_USE_LEN(0 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
24812518 MPI_INTEGER,0 ,MPI_COMM_WORLD,IERR)
2482- ! Recompute offset for gather string:
2483- RECV_USE_OFF= 0
2484- DO I= 1 ,N_MPI_PROCESSES-1
2519+ ! Recompute offset for gather string:
2520+ RECV_USE_OFF= 0
2521+ DO I= 1 ,N_MPI_PROCESSES-1
24852522 RECV_USE_OFF(I) = RECV_USE_OFF(I-1 ) + RECV_USE_LEN(I-1 )
2486- ENDDO
2487- ! Gather strings from all Processes in rank 0:
2488- STR_GATHER_LEN = SUM (RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ))
2489- ALLOCATE (CHARACTER (LEN= STR_GATHER_LEN):: STR_GATHER); STR_GATHER(1 :SMVSTR_USE_LEN)= SMVSTR(1 :SMVSTR_USE_LEN)
2490- CALL MPI_GATHERV(MPI_IN_PLACE,0 ,MPI_DATATYPE_NULL, &
2523+ ENDDO
2524+ ! Gather strings from all Processes in rank 0:
2525+ STR_GATHER_LEN = SUM (RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ))
2526+ ALLOCATE (CHARACTER (LEN= STR_GATHER_LEN):: STR_GATHER); STR_GATHER(1 :SMVSTR_USE_LEN)= SMVSTR(1 :SMVSTR_USE_LEN)
2527+ CALL MPI_GATHERV(MPI_IN_PLACE,0 ,MPI_DATATYPE_NULL, &
24912528 STR_GATHER,RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
24922529 MPI_CHARACTER,0 ,MPI_COMM_WORLD,IERR)
2493- ! Process 0 writes SMV file:
2494- OPEN (UNIT= LU_SMV,FILE= FN_SMV,FORM= ' formatted' )
2495- WRITE (LU_SMV,' (A)' ) STR_GATHER(1 :STR_GATHER_LEN)
2496- CLOSE (LU_SMV)
2497- ELSE
2498- ! Gather string sizes from all Processes in rank 0:
2499- CALL MPI_GATHERV(SMVSTR_USE_LEN,1 ,MPI_INTEGER, &
2530+ ! Process 0 writes SMV file:
2531+ OPEN (UNIT= LU_SMV,FILE= FN_SMV,FORM= ' formatted' )
2532+ WRITE (LU_SMV,' (A)' ) STR_GATHER(1 :STR_GATHER_LEN)
2533+ CLOSE (LU_SMV)
2534+ ELSE
2535+ ! Gather string sizes from all Processes in rank 0:
2536+ CALL MPI_GATHERV(SMVSTR_USE_LEN,1 ,MPI_INTEGER, &
25002537 RECV_USE_LEN(0 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
25012538 MPI_INTEGER,0 ,MPI_COMM_WORLD,IERR)
2502- ! Gather strings from all Processes in rank 0:
2503- ALLOCATE (CHARACTER (LEN= 1 ):: STR_GATHER); ! Dummy allocation.
2504- CALL MPI_GATHERV(SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER, &
2539+ ! Gather strings from all Processes in rank 0:
2540+ ALLOCATE (CHARACTER (LEN= 1 ):: STR_GATHER); ! Dummy allocation.
2541+ CALL MPI_GATHERV(SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER, &
25052542 STR_GATHER,RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
25062543 MPI_CHARACTER,0 ,MPI_COMM_WORLD,IERR)
2507- ENDIF
2508- DEALLOCATE (RECV_USE_LEN,RECV_USE_OFF,RECV_COUNTS,STR_GATHER)
2509- ELSE
2510- ! Signle MPI process job : Process 0 writes SMV file.
2511- OPEN (UNIT= LU_SMV,FILE= FN_SMV,FORM= ' formatted' )
2512- WRITE (LU_SMV,' (A)' ) SMVSTR(1 :SMVSTR_USE_LEN)
2513- CLOSE (LU_SMV)
2514- ENDIF
2544+ ENDIF
25152545
2516- ENDIF SMV_PARALLEL_WRITE_IF
2546+ DEALLOCATE (RECV_USE_LEN,RECV_USE_OFF,RECV_COUNTS,STR_GATHER)
2547+
2548+ ELSE MPI_IF
2549+
2550+ ! Signle MPI process job : Process 0 writes SMV file.
2551+ OPEN (UNIT= LU_SMV,FILE= FN_SMV,FORM= ' formatted' )
2552+ WRITE (LU_SMV,' (A)' ) SMVSTR(1 :SMVSTR_USE_LEN)
2553+ CLOSE (LU_SMV)
25172554
2555+ ENDIF MPI_IF
2556+
2557+ ENDIF SMV_PARALLEL_WRITE_IF
25182558
25192559DEALLOCATE (SMVSTR)
25202560
0 commit comments