@@ -1543,6 +1543,9 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
15431543CHARACTER (LEN= :), ALLOCATABLE :: SMVSTR
15441544INTEGER :: OFFSET= 0 , SMVSTR_T_LEN= 0 , SMVSTR_USE_LEN= 0 , IERR
15451545TYPE (PATCH_TYPE), POINTER :: EP
1546+ INTEGER :: STR_GATHER_LEN
1547+ INTEGER , ALLOCATABLE , DIMENSION (:) :: RECV_USE_LEN,RECV_USE_OFF,RECV_COUNTS
1548+ CHARACTER (LEN= :), ALLOCATABLE :: STR_GATHER
15461549
15471550! If this is a RESTART case but an old .smv file does not exist, shutdown with an ERROR.
15481551
@@ -2454,13 +2457,65 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
24542457
24552458! Write the .smv file
24562459
2460+ SMV_PARALLEL_WRITE_IF : IF ( SMV_PARALLEL_WRITE ) THEN
2461+
2462+ ! Write using MPI-IO:
24572463CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
24582464CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1 ,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
24592465CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+ MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
24602466CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT (OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
24612467CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
24622468CALL MPI_FILE_CLOSE(SMVFILE_HANDLE,IERR)
24632469
2470+ ELSE SMV_PARALLEL_WRITE_IF
2471+
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, &
2480+ RECV_USE_LEN(0 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
2481+ 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
2485+ 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, &
2491+ STR_GATHER,RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
2492+ 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, &
2500+ RECV_USE_LEN(0 ),RECV_COUNTS(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
2501+ 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, &
2505+ STR_GATHER,RECV_USE_LEN(0 :N_MPI_PROCESSES-1 ),RECV_USE_OFF(0 :N_MPI_PROCESSES-1 ), &
2506+ 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
2515+
2516+ ENDIF SMV_PARALLEL_WRITE_IF
2517+
2518+
24642519DEALLOCATE (SMVSTR)
24652520
24662521CONTAINS
0 commit comments