Skip to content

Commit

Permalink
FDS Source: Add pause feature to external control (firemodels#13128 b…
Browse files Browse the repository at this point in the history
…y Julio Cesar Silva)
  • Loading branch information
drjfloyd committed Jul 8, 2024
1 parent d5686e6 commit 89a9802
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 9 deletions.
7 changes: 4 additions & 3 deletions Source/cons.f90
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ MODULE GLOBAL_CONSTANTS
INTEGER, PARAMETER :: REALIZABILITY_STOP=8 !< Flag for STATUS_STOP
INTEGER, PARAMETER :: VERSION_STOP=10 !< Flag for STATUS_STOP
INTEGER, PARAMETER :: ODE_STOP=11 !< Flag for STATUS_STOP
INTEGER, PARAMETER :: HEARTBEAT_STOP=12 !< Flag for STATUS_STOP

INTEGER, PARAMETER :: SPHERE_DRAG=1 !< Flag for LPC\%DRAG_LAW (LPC means LAGRANGIAN_PARTICLE_CLASS)
INTEGER, PARAMETER :: CYLINDER_DRAG=2 !< Flag for LPC\%DRAG_LAW
Expand Down Expand Up @@ -735,9 +736,9 @@ MODULE GLOBAL_CONSTANTS
LOGICAL :: IBLANK_SMV=.TRUE. !< Parameter passed to smokeview (in .smv file) to control generation of blockages

! External file control
CHARACTER(250) :: EXTERNAL_FILENAME
LOGICAL :: READ_EXTERNAL = .FALSE.
INTEGER :: LU_EXTERNAL
CHARACTER(250) :: EXTERNAL_FILENAME='null',EXTERNAL_HEARTBEAT_FILENAME='null'
LOGICAL :: READ_EXTERNAL = .FALSE.,HEARTBEAT_FAIL=.TRUE.
INTEGER :: LU_EXTERNAL,LU_EXTERNAL_HEARTBEAT,DT_EXTERNAL_HEARTBEAT=0
REAL(EB) :: DT_EXTERNAL=0._EB, T_EXTERNAL
REAL(EB), ALLOCATABLE, DIMENSION(:) :: EXTERNAL_RAMP
LOGICAL(EB), ALLOCATABLE, DIMENSION(:) :: EXTERNAL_CTRL
Expand Down
33 changes: 31 additions & 2 deletions Source/func.f90
Original file line number Diff line number Diff line change
Expand Up @@ -562,19 +562,48 @@ END SUBROUTINE INITIALIZE_OUTPUT_CLOCKS
!> \brief Read in values for RAMP or CTRL controlled by an external file.

SUBROUTINE READ_EXTERNAL_FILE(FAILED)
USE GLOBAL_CONSTANTS, ONLY: N_RAMP,EXTERNAL_RAMP,EXTERNAL_CTRL,EXTERNAL_FILENAME,LU_EXTERNAL
USE GLOBAL_CONSTANTS, ONLY: N_RAMP,EXTERNAL_RAMP,EXTERNAL_CTRL,EXTERNAL_FILENAME,EXTERNAL_HEARTBEAT_FILENAME,&
LU_EXTERNAL,LU_EXTERNAL_HEARTBEAT,HEARTBEAT_STOP,HEARTBEAT_FAIL,DT_EXTERNAL_HEARTBEAT,STOP_STATUS
USE TYPES, ONLY: RAMPS
USE CONTROL_VARIABLES, ONLY: N_CTRL,CONTROL
INTEGER:: NC, NR
CHARACTER(LABEL_LENGTH) :: INPUT_LABEL,INPUT_TYPE
CHARACTER(250) :: TEST_FILENAME
REAL(EB) :: INPUT_REAL
INTEGER :: T_HEARTBEAT,DT_PAUSE
LOGICAL :: HEARTBEAT_FOUND
LOGICAL,INTENT(OUT) :: FAILED

FAILED = .FALSE.
EXTERNAL_RAMP = RAMPS%LAST
EXTERNAL_CTRL = CONTROL%CURRENT_STATE

OPEN(LU_EXTERNAL,FILE=EXTERNAL_FILENAME,ERR=100)
IF (DT_EXTERNAL_HEARTBEAT > 0) THEN
T_HEARTBEAT = 0
HEARTBEAT_LOOP: DO
INQUIRE(FILE=EXTERNAL_HEARTBEAT_FILENAME,EXIST=HEARTBEAT_FOUND)
IF (HEARTBEAT_FOUND) THEN
EXIT HEARTBEAT_LOOP
ELSE
DT_PAUSE = MIN(1,DT_EXTERNAL_HEARTBEAT - T_HEARTBEAT)
IF (DT_PAUSE <= 0._EB) THEN
IF (HEARTBEAT_FAIL) STOP_STATUS = HEARTBEAT_STOP
FAILED = .TRUE.
RETURN
ELSE
CALL FDS_SLEEP(DT_PAUSE)
T_HEARTBEAT = T_HEARTBEAT + DT_PAUSE
ENDIF
ENDIF
ENDDO HEARTBEAT_LOOP
OPEN(LU_EXTERNAL_HEARTBEAT,STATUS='OLD',ERR=100)
READ(UNIT=LU_EXTERNAL,END=300,ERR=300,FMT=*) TEST_FILENAME
EXTERNAL_FILENAME = TEST_FILENAME
300 CONTINUE
CLOSE(LU_EXTERNAL_HEARTBEAT,STATUS='DELETE')
ENDIF

OPEN(LU_EXTERNAL,FILE=EXTERNAL_FILENAME,ERR=100,STATUS='OLD')

DO
READ(UNIT=LU_EXTERNAL,END=200,ERR=110,FMT=*) INPUT_TYPE,INPUT_LABEL,INPUT_REAL
Expand Down
8 changes: 6 additions & 2 deletions Source/main.f90
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ PROGRAM FDS
ALLOCATE(EXTERNAL_CTRL(N_CTRL))
EXTERNAL_CTRL = CONTROL%INITIAL_STATE
LU_EXTERNAL = GET_FILE_NUMBER()
IF (DT_EXTERNAL_HEARTBEAT > 0._EB) LU_EXTERNAL_HEARTBEAT = GET_FILE_NUMBER()
ENDIF

! Allocate and initialize mesh-specific variables, and check to see if the code should stop
Expand Down Expand Up @@ -597,12 +598,13 @@ PROGRAM FDS
PREDICTOR = .TRUE.
CORRECTOR = .FALSE.

! Process externall controlled variables
! Process externally controlled variables
IF (READ_EXTERNAL) THEN
IF (MY_RANK==0 .AND. T > T_EXTERNAL) THEN
CALL READ_EXTERNAL_FILE(EXTERNAL_FAIL)
IF (.NOT. EXTERNAL_FAIL) T_EXTERNAL = T + DT_EXTERNAL
ENDIF
IF (HEARTBEAT_FAIL) CALL STOP_CHECK(1)
CALL EXCHANGE_EXTERNAL
ENDIF
! Begin the finite differencing of the PREDICTOR step
Expand Down Expand Up @@ -1752,7 +1754,9 @@ SUBROUTINE END_FDS
CASE(REALIZABILITY_STOP)
WRITE(MESSAGE,'(A)') 'ERROR: Unrealizable mass density - FDS stopped'
CASE(ODE_STOP)
WRITE(MESSAGE,'(A)') 'ERROR: Combustion ODE Solver Failure - FDS stopped'
WRITE(MESSAGE,'(A)') 'ERROR: Combustion ODE solver failure - FDS stopped'
CASE(HEARTBEAT_STOP)
WRITE(MESSAGE,'(A)') 'ERROR: External program failure - FDS stopped'
CASE DEFAULT
WRITE(MESSAGE,'(A)') 'null'
END SELECT
Expand Down
10 changes: 8 additions & 2 deletions Source/read.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1477,11 +1477,11 @@ SUBROUTINE READ_TIME(DT)
USE OUTPUT_CLOCKS, ONLY: RAMP_TIME_INDEX
REAL(EB), INTENT(OUT) :: DT
CHARACTER(LABEL_LENGTH) :: RAMP_TIME
NAMELIST /TIME/ DT,DT_END_FILL,DT_END_MINIMUM,DT_EXTERNAL,FYI,LIMITING_DT_RATIO,LOCK_TIME_STEP,&
NAMELIST /TIME/ DT,DT_END_FILL,DT_END_MINIMUM,DT_EXTERNAL,DT_EXTERNAL_HEARTBEAT,EXTERNAL_HEARTBEAT_FILENAME,HEARTBEAT_FAIL,&
FYI,LIMITING_DT_RATIO,LOCK_TIME_STEP,&
RAMP_TIME,RESTRICT_TIME_STEP,T_BEGIN,T_END,TIME_SHRINK_FACTOR,WALL_INCREMENT

DT = -1._EB
DT_EXTERNAL = 0._EB
TIME_SHRINK_FACTOR = 1._EB
T_BEGIN = 0._EB
T_END = 1._EB
Expand All @@ -1507,6 +1507,12 @@ SUBROUTINE READ_TIME(DT)

IF (RAMP_TIME /='null') CALL GET_RAMP_INDEX(RAMP_TIME,'TIME',RAMP_TIME_INDEX)

IF (DT_EXTERNAL_HEARTBEAT <= TWO_EPSILON_EB .NEQV. EXTERNAL_HEARTBEAT_FILENAME=='null') THEN
WRITE(MESSAGE,'(A)') &
'ERROR(XXX): On TIME, if one of DT_EXTERNAL_HEARTBEAT or EXTERNAL_HEARTBEAT_FILENAME is set, both must be set.'
CALL SHUTDOWN(MESSAGE) ; RETURN
ENDIF

END SUBROUTINE READ_TIME


Expand Down

0 comments on commit 89a9802

Please sign in to comment.