Skip to content

Commit 5c0bc6c

Browse files
Merge pull request #14071 from marcosvanella/master
FDS Source : Add option to do POSIX write of .smv file.
2 parents 9285599 + 94fd64c commit 5c0bc6c

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

Source/cons.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ MODULE GLOBAL_CONSTANTS
196196
LOGICAL :: SETUP_ONLY=.FALSE. !< Indicates that the calculation should be stopped before time-stepping
197197
LOGICAL :: CHECK_MESH_ALIGNMENT=.FALSE. !< Indicates that the user wants to check the mesh alignment and then stop
198198
LOGICAL :: SMOKE3D=.TRUE. !< Indicates that the 3D smoke and fire output is desired
199+
LOGICAL :: SMV_PARALLEL_WRITE=.TRUE. !< If true, the CHID.smv file is written in parallel using MPI-IO.
199200
LOGICAL :: STATUS_FILES=.FALSE. !< Produce an output file CHID.notready which is deleted if the simulation completes
200201
LOGICAL :: LOCK_TIME_STEP=.FALSE. !< Do not allow time step to change for diagnostic purposes
201202
LOGICAL :: RESTRICT_TIME_STEP=.TRUE. !< Do not let the time step increase above its intial value

Source/dump.f90

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,9 @@ SUBROUTINE WRITE_SMOKEVIEW_FILE
15431543
CHARACTER(LEN=:), ALLOCATABLE :: SMVSTR
15441544
INTEGER :: OFFSET=0, SMVSTR_T_LEN=0, SMVSTR_USE_LEN=0, IERR
15451545
TYPE (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:
24572463
CALL MPI_FILE_DELETE(FN_SMV, MPI_INFO_NULL, IERR)
24582464
CALL MPI_EXSCAN(SMVSTR_USE_LEN,OFFSET,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
24592465
CALL MPI_FILE_OPEN(MPI_COMM_WORLD,FN_SMV,MPI_MODE_WRONLY+MPI_MODE_CREATE,MPI_INFO_NULL,SMVFILE_HANDLE,IERR)
24602466
CALL MPI_FILE_WRITE_AT_ALL(SMVFILE_HANDLE,INT(OFFSET,MPI_OFFSET_KIND),SMVSTR,SMVSTR_USE_LEN,MPI_CHARACTER,STATUS,IERR)
24612467
CALL MPI_FILE_SYNC(SMVFILE_HANDLE,IERR)
24622468
CALL 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+
24642519
DEALLOCATE(SMVSTR)
24652520

24662521
CONTAINS

Source/read.f90

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,8 +2328,8 @@ SUBROUTINE READ_DUMP
23282328
NFRAMES,PLOT3D_PART_ID,PLOT3D_QUANTITY,PLOT3D_SPEC_ID,PLOT3D_VELO_INDEX,&
23292329
RAMP_BNDF,RAMP_CPU,RAMP_CTRL,RAMP_DEVC,RAMP_FLUSH,RAMP_HRR,RAMP_HVAC,RAMP_ISOF,RAMP_MASS,&
23302330
RAMP_PART,RAMP_PL3D,RAMP_PROF,RAMP_RADF,RAMP_RESTART,RAMP_SLCF,RAMP_SL3D,RAMP_SMOKE3D,&
2331-
RAMP_SPEC,RAMP_TMP,RAMP_UVW,RENDER_FILE,RESULTS_DIR,SIG_FIGS,SIG_FIGS_EXP,SMOKE3D,STATUS_FILES,&
2332-
SUPPRESS_DIAGNOSTICS,TURB_INIT_CLOCK,VELOCITY_ERROR_FILE,WRITE_XYZ
2331+
RAMP_SPEC,RAMP_TMP,RAMP_UVW,RENDER_FILE,RESULTS_DIR,SIG_FIGS,SIG_FIGS_EXP,SMOKE3D,SMV_PARALLEL_WRITE,&
2332+
STATUS_FILES,SUPPRESS_DIAGNOSTICS,TURB_INIT_CLOCK,VELOCITY_ERROR_FILE,WRITE_XYZ
23332333

23342334
! Set defaults
23352335

0 commit comments

Comments
 (0)