From 2257dc78778248aef1c8df582d9ae0664b6a64db Mon Sep 17 00:00:00 2001 From: mcgratta Date: Wed, 24 Jun 2026 13:35:07 -0400 Subject: [PATCH] FDS Source: Fix bugs related to restarting HT3D --- Source/dump.f90 | 10 +++------- Source/main.f90 | 26 ++++++++++++++++++++------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Source/dump.f90 b/Source/dump.f90 index 01ef4bc2a4..e84995288e 100644 --- a/Source/dump.f90 +++ b/Source/dump.f90 @@ -3634,8 +3634,6 @@ SUBROUTINE DUMP_RESTART(T,DT,NM) ENDDO WRITE(LU_CORE(NM)) N_BOUNDARY_COORD_DIM,N_BOUNDARY_ONE_D_DIM,N_BOUNDARY_PROP1_DIM,N_BOUNDARY_PROP2_DIM,N_BOUNDARY_RADIA_DIM -WRITE(LU_CORE(NM)) NEXT_AVAILABLE_BOUNDARY_COORD_SLOT,NEXT_AVAILABLE_BOUNDARY_ONE_D_SLOT,& - NEXT_AVAILABLE_BOUNDARY_PROP1_SLOT,NEXT_AVAILABLE_BOUNDARY_PROP2_SLOT,NEXT_AVAILABLE_BOUNDARY_RADIA_SLOT WRITE(LU_CORE(NM)) N_WALL_CELLS,N_WALL_CELLS_DIM OS => WALL_STORAGE @@ -3643,7 +3641,7 @@ SUBROUTINE DUMP_RESTART(T,DT,NM) WC => WALL(IW) RC=0 ; IC=0 ; LC=0 CALL PACK_WALL(NM,OS,WC,WC%SURF_INDEX,RC,IC,LC,UNPACK_IT=.FALSE.,COUNT_ONLY=.FALSE.,CHECK_BOUNDS=.FALSE.) - WRITE(LU_CORE(NM)) WC%SURF_INDEX + WRITE(LU_CORE(NM)) WC%SURF_INDEX,WC%TD_INDEX WRITE(LU_CORE(NM)) OS%REALS,OS%INTEGERS,OS%LOGICALS ENDDO @@ -3831,8 +3829,6 @@ SUBROUTINE READ_RESTART(T,DT,NM) ENDDO READ(LU_RESTART(NM)) N_BOUNDARY_COORD_DIM,N_BOUNDARY_ONE_D_DIM,N_BOUNDARY_PROP1_DIM,N_BOUNDARY_PROP2_DIM,N_BOUNDARY_RADIA_DIM -READ(LU_RESTART(NM)) NEXT_AVAILABLE_BOUNDARY_COORD_SLOT,NEXT_AVAILABLE_BOUNDARY_ONE_D_SLOT,& - NEXT_AVAILABLE_BOUNDARY_PROP1_SLOT,NEXT_AVAILABLE_BOUNDARY_PROP2_SLOT,NEXT_AVAILABLE_BOUNDARY_RADIA_SLOT IF (ALLOCATED(MESHES(NM)%BOUNDARY_COORD_OCCUPANCY)) DEALLOCATE(MESHES(NM)%BOUNDARY_COORD_OCCUPANCY) IF (ALLOCATED(MESHES(NM)%BOUNDARY_ONE_D_OCCUPANCY)) DEALLOCATE(MESHES(NM)%BOUNDARY_ONE_D_OCCUPANCY) @@ -3865,11 +3861,11 @@ SUBROUTINE READ_RESTART(T,DT,NM) IF (ALLOCATED(MESHES(NM)%WALL)) DEALLOCATE(MESHES(NM)%WALL) ; ALLOCATE(MESHES(NM)%WALL(0:N_WALL_CELLS_DIM)) OS => WALL_STORAGE DO IW=1,N_WALL_CELLS - READ(LU_RESTART(NM)) SURF_INDEX + WC => MESHES(NM)%WALL(IW) + READ(LU_RESTART(NM)) SURF_INDEX,WC%TD_INDEX READ(LU_RESTART(NM)) OS%REALS,OS%INTEGERS,OS%LOGICALS RC=0 ; IC=0 ; LC=0 CALL ALLOCATE_STORAGE(NM,SURF_INDEX=SURF_INDEX,WALL_INDEX=IW) - WC => MESHES(NM)%WALL(IW) CALL PACK_WALL(NM,OS,WC,SURF_INDEX,RC,IC,LC,UNPACK_IT=.TRUE.,COUNT_ONLY=.FALSE.,CHECK_BOUNDS=.TRUE.) ENDDO diff --git a/Source/main.f90 b/Source/main.f90 index 33c7a62a55..0abf9b4029 100644 --- a/Source/main.f90 +++ b/Source/main.f90 @@ -51,7 +51,7 @@ PROGRAM FDS ! Miscellaneous declarations -LOGICAL :: EX=.FALSE.,DIAGNOSTICS,CTRL_STOP_STATUS,CHECK_FREEZE_VELOCITY=.TRUE.,EXTERNAL_FAIL +LOGICAL :: EX=.FALSE.,DIAGNOSTICS,CTRL_STOP_STATUS,CHECK_FREEZE_VELOCITY=.TRUE.,EXTERNAL_FAIL,FIRST_RESTART_TIME_STEP INTEGER :: LO10,NM,IZERO,ANG_INC_COUNTER REAL(EB) :: T,DT,TNOW REAL :: CPUTIME @@ -553,18 +553,28 @@ PROGRAM FDS INITIALIZATION_PHASE = .FALSE. +! If the simulation is restarted, there are some tasks to do during the first time step of the restarted simulation + +IF (RESTART) THEN + FIRST_RESTART_TIME_STEP = .TRUE. +ELSE + FIRST_RESTART_TIME_STEP = .FALSE. +ENDIF + +! Special feature allowing the user to delay the gas phase CFD simulation until a specified UNFREEZE_TIME + IF (UNFREEZE_TIME > 0._EB) THEN FREEZE_VELOCITY=.TRUE. SOLID_PHASE_ONLY=.TRUE. LOCK_TIME_STEP=.TRUE. ENDIF -IF (MY_RANK==0 .AND. VERBOSE) CALL VERBOSE_PRINTOUT('Starting the time-stepping') - !*********************************************************************************************************************************** ! MAIN TIMESTEPPING LOOP !*********************************************************************************************************************************** +IF (MY_RANK==0 .AND. VERBOSE) CALL VERBOSE_PRINTOUT('Starting the time-stepping') + MAIN_LOOP: DO ICYC = ICYC + 1 ! Time step iterations @@ -591,11 +601,13 @@ PROGRAM FDS IF ((T+DT+DT_END_FILL)>T_END) DT = MAX(T_END-T+TWENTY_EPSILON_EB,DT_END_MINIMUM) - ! Determine when to dump out diagnostics to the .out file + ! Determine if diagnostics should be dumped to the .out file at the end of this time step LO10 = INT(LOG10(REAL(MAX(1,ABS(ICYC)),EB))) IF (MOD(ICYC,10**LO10)==0 .OR. MOD(ICYC,DIAGNOSTICS_INTERVAL)==0 .OR. (T+DT)>=T_END) DIAGNOSTICS = .TRUE. + ! Determine if a delayed gas phase simulation should be started + IF ((UNFREEZE_TIME > 0._EB).AND.(T>UNFREEZE_TIME)) THEN FREEZE_VELOCITY=.FALSE. SOLID_PHASE_ONLY=.FALSE. @@ -1038,6 +1050,8 @@ PROGRAM FDS IF (T>=T_END .AND. ICYC>0) EXIT MAIN_LOOP + FIRST_RESTART_TIME_STEP = .FALSE. + ENDDO MAIN_LOOP !*********************************************************************************************************************************** @@ -3598,7 +3612,7 @@ SUBROUTINE MESH_EXCHANGE(CODE) IW = OS%ITEM_INDEX(I) WC => MESHES(NOM)%WALL(IW) CALL PACK_WALL(NOM,OS,WC,OS%SURF_INDEX(I),RC,IC,LC,UNPACK_IT=.TRUE.,COUNT_ONLY=.FALSE.,& - CHECK_BOUNDS=INITIALIZATION_PHASE) + CHECK_BOUNDS=(INITIALIZATION_PHASE.OR.FIRST_RESTART_TIME_STEP)) ENDDO ENDIF RECEIVE_BACK_WALL @@ -3609,7 +3623,7 @@ SUBROUTINE MESH_EXCHANGE(CODE) IW = OS%ITEM_INDEX(I) TW => MESHES(NOM)%THIN_WALL(IW) CALL PACK_THIN_WALL(NOM,OS,TW,OS%SURF_INDEX(I),RC,IC,LC,UNPACK_IT=.TRUE.,COUNT_ONLY=.FALSE.,& - CHECK_BOUNDS=INITIALIZATION_PHASE) + CHECK_BOUNDS=(INITIALIZATION_PHASE.OR.FIRST_RESTART_TIME_STEP)) ENDDO ENDIF RECEIVE_BACK_THIN_WALL