Skip to content

Commit 6a3f09f

Browse files
committed
FDS Source: add LS SPREAD RATE output for storing local level set spread rates
1 parent 2f597f2 commit 6a3f09f

File tree

12 files changed

+39
-13
lines changed

12 files changed

+39
-13
lines changed

Manuals/FDS_User_Guide/FDS_User_Guide.tex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11320,6 +11320,8 @@ \subsection{Fire spread over a surface}
1132011320
\label{info:fire_spread_output}
1132111321
In some cases it can be useful to output timings related to the spread of fire over a surface. For example, when modeling wildland fires the shape and spread of the fire front can be very important. For this reason, two specialized output quantities are available as boundary files (Sec.~\ref{info:BNDF}) or as measurements from devices places on a solid boundary (Sec.~\ref{info:DEVC2}). These are \ct{FIRE ARRIVAL TIME} and \ct{FIRE RESIDENCE TIME}. The \ct{FIRE ARRIVAL TIME} quantity outputs the time at which the gas-phase cell adjacent to the solid exceeds a threshold for heat release rate per volume (\ct{HRRPUV}) and the \ct{FIRE RESIDENCE TIME} gives the cummulative time over which the threshold is exceeded during the simulation. The chosen threshold is the same as used by smokeview for rendering \ct{HRRPUV}, as described in Sec.~\ref{info:SMOKE3D}. In the case of a level set simulation (Sec.~\ref{info:level_set}), the \ct{FIRE ARRIVAL TIME} can be computed directly from the level set value and the \ct{FIRE RESIDENCE TIME} comes from the spread-rate adjusted burning duration of the fuel, as described in Sec.~\ref{level_set_fuel_model_1}. These two quantities are cummulatively populated over time such that a full picture of the fire spread can be obtained from relatively infrequent outputs - theoretically only one snapshot at the end of the simulation is required.
1132211322

11323+
For level set simulations another output is availble, called \ct{LS SPREAD RATE}. This output stores the magnitude of the local spread rate calculated as the fire reaches a given point along the surface. The dependence on slope and local wind is related to the mode of level set which is activated (Sec.~\ref{info:level_set}).
11324+
1132311325

1132411326
\newpage
1132511327

@@ -11552,6 +11554,7 @@ \section{Solid Phase Output Quantities}
1155211554
\ct{EMISSIVITY} & Surface emissivity (usually constant) & & B,D \\ \hline
1155311555
\ct{FIRE ARRIVAL TIME} & Section \ref{info:fire_spread_output} & \si{s} & B,D \\ \hline
1155411556
\ct{FIRE RESIDENCE TIME} & Section \ref{info:fire_spread_output} & \si{s} & B,D \\ \hline
11557+
\ct{LS SPREAD RATE} & Section \ref{info:fire_spread_output} & \si{m/s} & B,D \\ \hline
1155511558
\ct{GAS DENSITY} & Gas Density near wall & \si{kg/m^3} & B,D \\ \hline
1155611559
\ct{GAS TEMPERATURE} & Gas Temperature near wall & $^\circ$C & B,D \\ \hline
1155711560
\ct{HEAT TRANSFER COEFFICIENT} & Section \ref{info:convection} & \si{W/(m^2.K)} & B,D \\ \hline

Source/cons.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ MODULE GLOBAL_CONSTANTS
274274
LOGICAL :: FLUX_LIMITER_MW_CORRECTION=.FALSE. !< Flag for MW correction ensure consistent equation of state at face
275275
LOGICAL :: STORE_FIRE_ARRIVAL=.FALSE. !< Flag for tracking arrival of spreading fire front over a surface
276276
LOGICAL :: STORE_FIRE_RESIDENCE=.FALSE. !< Flag for tracking residence time of spreading fire front over a surface
277+
LOGICAL :: STORE_LS_SPREAD_RATE=.FALSE. !< Flag for outputting local level set spread rate magnitude
277278
LOGICAL :: TEST_NEW_CHAR_MODEL=.FALSE. !< Flag to envoke new char model
278279

279280
INTEGER, ALLOCATABLE, DIMENSION(:) :: CHANGE_TIME_STEP_INDEX !< Flag to indicate if a mesh needs to change time step

Source/data.f90

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,6 +1642,11 @@ SUBROUTINE DEFINE_OUTPUT_QUANTITIES
16421642
OUTPUT_QUANTITY(-91)%SHORT_NAME = 't_r'
16431643
OUTPUT_QUANTITY(-91)%PART_APPROPRIATE = .FALSE.
16441644

1645+
OUTPUT_QUANTITY(-92)%NAME = 'LS SPREAD RATE'
1646+
OUTPUT_QUANTITY(-92)%UNITS = 'm/s'
1647+
OUTPUT_QUANTITY(-92)%SHORT_NAME = 'r'
1648+
OUTPUT_QUANTITY(-92)%PART_APPROPRIATE = .FALSE.
1649+
16451650
! Condensation
16461651
OUTPUT_QUANTITY(-100)%NAME = 'CONDENSATION HEAT FLUX'
16471652
OUTPUT_QUANTITY(-100)%UNITS= 'kW/m2'

Source/dump.f90

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3645,6 +3645,7 @@ SUBROUTINE DUMP_RESTART(T,DT,NM)
36453645

36463646
IF (STORE_FIRE_ARRIVAL) WRITE(LU_CORE(NM)) FIRE_ARRIVAL_TIME
36473647
IF (STORE_FIRE_RESIDENCE) WRITE(LU_CORE(NM)) FIRE_RESIDENCE_TIME
3648+
IF (STORE_LS_SPREAD_RATE) WRITE(LU_CORE(NM)) LS_SPREAD_RATE
36483649

36493650
CLOSE(LU_CORE(NM))
36503651

@@ -3871,6 +3872,7 @@ SUBROUTINE READ_RESTART(T,DT,NM)
38713872

38723873
IF (STORE_FIRE_ARRIVAL) READ(LU_RESTART(NM)) FIRE_ARRIVAL_TIME
38733874
IF (STORE_FIRE_RESIDENCE) READ(LU_RESTART(NM)) FIRE_RESIDENCE_TIME
3875+
IF (STORE_LS_SPREAD_RATE) READ(LU_RESTART(NM)) LS_SPREAD_RATE
38743876

38753877
CLOSE(LU_RESTART(NM))
38763878

@@ -9387,20 +9389,17 @@ REAL(EB) FUNCTION SOLID_PHASE_OUTPUT(INDX,Y_INDEX,Z_INDEX,PART_INDEX,OPT_WALL_IN
93879389
CASE(82) ! BLOWING CORRECTION
93889390
SOLID_PHASE_OUTPUT = 0._EB
93899391
IF (SF%INCLUDE_BOUNDARY_PROP2_TYPE) SOLID_PHASE_OUTPUT = B2%BLOWING_CORRECTION
9390-
CASE(90) ! FIRE ARRIVAL TIME
9392+
CASE(90:92) ! FIRE ARRIVAL TIME, FIRE RESIDENCE TIME, LS SPREAD RATE
93919393
IF (PRESENT(OPT_WALL_INDEX)) THEN
93929394
OUTPUT_INDEX = OPT_WALL_INDEX
93939395
ELSEIF (PRESENT(OPT_CFACE_INDEX)) THEN
93949396
OUTPUT_INDEX = OPT_CFACE_INDEX-INTERNAL_CFACE_CELLS_LB+N_INTERNAL_WALL_CELLS+N_EXTERNAL_WALL_CELLS
93959397
ENDIF
9396-
SOLID_PHASE_OUTPUT = FIRE_ARRIVAL_TIME(OUTPUT_INDEX)
9397-
CASE(91) ! FIRE RESIDENCE TIME
9398-
IF (PRESENT(OPT_WALL_INDEX)) THEN
9399-
OUTPUT_INDEX = OPT_WALL_INDEX
9400-
ELSEIF (PRESENT(OPT_CFACE_INDEX)) THEN
9401-
OUTPUT_INDEX = OPT_CFACE_INDEX-INTERNAL_CFACE_CELLS_LB+N_INTERNAL_WALL_CELLS+N_EXTERNAL_WALL_CELLS
9402-
ENDIF
9403-
SOLID_PHASE_OUTPUT = FIRE_RESIDENCE_TIME(OUTPUT_INDEX)
9398+
SELECT CASE(INDX)
9399+
CASE(90); SOLID_PHASE_OUTPUT = FIRE_ARRIVAL_TIME(OUTPUT_INDEX)
9400+
CASE(91); SOLID_PHASE_OUTPUT = FIRE_RESIDENCE_TIME(OUTPUT_INDEX)
9401+
CASE(92); SOLID_PHASE_OUTPUT = LS_SPREAD_RATE(OUTPUT_INDEX)
9402+
END SELECT
94049403

94059404
CASE(100) ! CONDENSATION HEAT FLUX
94069405
SOLID_PHASE_OUTPUT = B1%Q_CONDENSE * 0.001_EB

Source/init.f90

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1261,7 +1261,10 @@ SUBROUTINE INITIALIZE_MESH_VARIABLES_2(NM)
12611261
ALLOCATE(M%FIRE_RESIDENCE_TIME(1:M%N_INTERNAL_WALL_CELLS+M%N_EXTERNAL_WALL_CELLS+M%N_INTERNAL_CFACE_CELLS))
12621262
CALL ChkMemErr('INIT','FIRE_RESIDENCE_TIME',IZERO) ; M%FIRE_RESIDENCE_TIME = 0._EB
12631263
ENDIF
1264-
1264+
IF (STORE_LS_SPREAD_RATE) THEN
1265+
ALLOCATE(M%LS_SPREAD_RATE(1:M%N_INTERNAL_WALL_CELLS+M%N_EXTERNAL_WALL_CELLS+M%N_INTERNAL_CFACE_CELLS))
1266+
CALL ChkMemErr('INIT','LS_SPREAD_RATE',IZERO) ; M%LS_SPREAD_RATE = 0._EB
1267+
ENDIF
12651268

12661269
CONTAINS
12671270

Source/mesh.f90

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ MODULE MESH_VARIABLES
123123
REAL(EB), ALLOCATABLE, DIMENSION(:,:,:) :: TURB_WORK9,TURB_WORK10
124124
REAL(EB), ALLOCATABLE, DIMENSION(:,:,:) :: CCVELDIV,CARTVELDIV
125125
REAL(EB), ALLOCATABLE, DIMENSION(:) :: WALL_WORK1,WALL_WORK2,FACE_WORK1,FACE_WORK2,FACE_WORK3
126-
REAL(EB), ALLOCATABLE, DIMENSION(:) :: FIRE_ARRIVAL_TIME,FIRE_RESIDENCE_TIME
126+
REAL(EB), ALLOCATABLE, DIMENSION(:) :: FIRE_ARRIVAL_TIME,FIRE_RESIDENCE_TIME,LS_SPREAD_RATE
127127
REAL(FB), ALLOCATABLE, DIMENSION(:,:,:,:) :: QQ, QQ2
128128
REAL(FB), ALLOCATABLE, DIMENSION(:,:) :: PP,PPN,BNDF_TIME_INTEGRAL
129129
INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IBK
@@ -382,7 +382,7 @@ MODULE MESH_POINTERS
382382
REAL(EB), POINTER, DIMENSION(:,:,:) :: CCVELDIV,CARTVELDIV
383383

384384
REAL(EB), POINTER, DIMENSION(:) :: WALL_WORK1,WALL_WORK2,FACE_WORK1,FACE_WORK2,FACE_WORK3
385-
REAL(EB), POINTER, DIMENSION(:) :: FIRE_ARRIVAL_TIME,FIRE_RESIDENCE_TIME
385+
REAL(EB), POINTER, DIMENSION(:) :: FIRE_ARRIVAL_TIME,FIRE_RESIDENCE_TIME,LS_SPREAD_RATE
386386

387387
REAL(FB), POINTER, DIMENSION(:,:,:,:) :: QQ, QQ2
388388
REAL(FB), POINTER, DIMENSION(:,:) :: PP,PPN,BNDF_TIME_INTEGRAL
@@ -644,6 +644,7 @@ SUBROUTINE POINT_TO_MESH(NM)
644644
FACE_WORK3=>M%FACE_WORK3
645645
FIRE_ARRIVAL_TIME=>M%FIRE_ARRIVAL_TIME
646646
FIRE_RESIDENCE_TIME=>M%FIRE_RESIDENCE_TIME
647+
LS_SPREAD_RATE=>M%LS_SPREAD_RATE
647648
QQ=>M%QQ
648649
QQ2=>M%QQ2
649650
PP=>M%PP

Source/read.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15130,6 +15130,9 @@ SUBROUTINE PROC_DEVC
1513015130
CASE ('FIRE RESIDENCE TIME')
1513115131
STORE_FIRE_RESIDENCE = .TRUE.
1513215132

15133+
CASE ('LS SPREAD RATE')
15134+
STORE_LS_SPREAD_RATE = .TRUE.
15135+
1513315136
END SELECT SPECIAL_QUANTITIES
1513415137

1513515138
IF ((DV%SPATIAL_STATISTIC/='null' .OR. DV%TEMPORAL_STATISTIC/='null') .AND. .NOT.DV%UNITS_SPECIFIED) THEN
@@ -15876,6 +15879,7 @@ SUBROUTINE READ_BNDF
1587615879
! Set flags for fire spread outputs
1587715880
IF (TRIM(QUANTITY)=='FIRE ARRIVAL TIME') STORE_FIRE_ARRIVAL = .TRUE.
1587815881
IF (TRIM(QUANTITY)=='FIRE RESIDENCE TIME') STORE_FIRE_RESIDENCE = .TRUE.
15882+
IF (TRIM(QUANTITY)=='LS SPREAD RATE') STORE_LS_SPREAD_RATE = .TRUE.
1587915883

1588015884
ENDDO READ_BNDF_LOOP
1588115885
REWIND(LU_INPUT) ; INPUT_FILE_LINE_NUMBER = 0

Source/vege.f90

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ SUBROUTINE LEVEL_SET_FIRESPREAD(T,DT,NM)
330330
USE MATH_FUNCTIONS, ONLY: EVALUATE_RAMP
331331
INTEGER, INTENT(IN) :: NM
332332
REAL(EB), INTENT(IN) :: T,DT
333-
INTEGER :: IIG,IW,JJG,IC
333+
INTEGER :: IIG,IW,JJG,IC,OUTPUT_INDEX
334334
INTEGER :: KDUM,KWIND,ICF,IKT
335335
REAL(EB) :: UMF_TMP,PHX,PHY,MAG_PHI,PHI_W_X,PHI_W_Y,UMF_X,UMF_Y,UMAG,ROS_MAG,UMF_MAG,ROTH_FACTOR,&
336336
SIN_THETA,COS_THETA,THETA
@@ -520,13 +520,16 @@ SUBROUTINE LEVEL_SET_FIRESPREAD(T,DT,NM)
520520
IW = CELL(IC)%WALL_INDEX(-3)
521521
WC => WALL(IW)
522522
B1 => BOUNDARY_PROP1(WC%B1_INDEX)
523+
OUTPUT_INDEX = IW
523524
IF (PHI_LS(IIG,JJG)>=0._EB .AND. B1%T_IGN>9.E5_EB) CALL IGNITE_GRID_CELL
524525
B2 => BOUNDARY_PROP2(WC%B2_INDEX)
525526
B2%PHI_LS = PHI_LS(IIG,JJG)
526527
ELSE
527528
DO IW=1,CUT_FACE(ICF)%NFACE ! All CC_INBOUNDARY CFACES on this cell.
528529
CFA => CFACE(CUT_FACE(ICF)%CFACE_INDEX(IW))
529530
B1 => BOUNDARY_PROP1(CFA%B1_INDEX)
531+
OUTPUT_INDEX = CUT_FACE(ICF)%CFACE_INDEX(IW) - &
532+
INTERNAL_CFACE_CELLS_LB+N_EXTERNAL_WALL_CELLS+N_INTERNAL_WALL_CELLS
530533
IF (PHI_LS(IIG,JJG)>=0._EB .AND. B1%T_IGN>9.E5_EB) CALL IGNITE_GRID_CELL
531534
B2 => BOUNDARY_PROP2(CFA%B2_INDEX)
532535
B2%PHI_LS = PHI_LS(IIG,JJG)
@@ -545,6 +548,7 @@ SUBROUTINE LEVEL_SET_FIRESPREAD(T,DT,NM)
545548
IW = CELL(IC)%WALL_INDEX(-3)
546549
WC => WALL(IW)
547550
B1 => BOUNDARY_PROP1(WC%B1_INDEX)
551+
OUTPUT_INDEX = IW
548552
IF (PHI_LS(IIG,JJG)>=0._EB .AND. B1%T_IGN>9.E5_EB) CALL IGNITE_GRID_CELL
549553
B2 => BOUNDARY_PROP2(WC%B2_INDEX)
550554
B2%PHI_LS = PHI_LS(IIG,JJG)
@@ -580,6 +584,8 @@ SUBROUTINE IGNITE_GRID_CELL
580584
IF (LEVEL_SET_COUPLED_FIRE) B1%AREA_ADJUST = B1%AREA_ADJUST * &
581585
B1%BURN_DURATION/(B1%BURN_DURATION - TWTH*SF%RAMP(REACTION(1)%FUEL_SMIX_INDEX)%TAU)
582586

587+
IF (STORE_LS_SPREAD_RATE) LS_SPREAD_RATE(OUTPUT_INDEX) = SQRT(SR_X_LS(IIG,JJG)**2 + SR_Y_LS(IIG,JJG)**2)
588+
583589
END SUBROUTINE IGNITE_GRID_CELL
584590

585591
END SUBROUTINE LEVEL_SET_FIRESPREAD

Verification/WUI/LS_ellipse_0ms_00deg.fds

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
&SLCF AGL_SLICE=0.1, QUANTITY='LEVEL SET VALUE' /
2424
&BNDF QUANTITY='FIRE ARRIVAL TIME'/
2525
&BNDF QUANTITY='FIRE RESIDENCE TIME'/
26+
&BNDF QUANTITY='LS SPREAD RATE'/
2627

2728
&DEVC XYZ=0,4,0, ID='000', QUANTITY='FIRE ARRIVAL TIME', TEMPORAL_STATISTIC='INSTANT VALUE', IOR=3/
2829
&DEVC XYZ=2.8284,2.8284,0, ID='045', QUANTITY='FIRE ARRIVAL TIME', TEMPORAL_STATISTIC='INSTANT VALUE', IOR=3/

Verification/WUI/LS_ellipse_0ms_30deg.fds

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
&SLCF AGL_SLICE=0.1, QUANTITY='LEVEL SET VALUE' /
2727
&BNDF QUANTITY='FIRE ARRIVAL TIME'/
2828
&BNDF QUANTITY='FIRE RESIDENCE TIME'/
29+
&BNDF QUANTITY='LS SPREAD RATE'/
2930

3031
&DEVC XYZ=0,4,6, ID='000', QUANTITY='FIRE ARRIVAL TIME', TEMPORAL_STATISTIC='INSTANT VALUE', IOR=3/
3132
&DEVC XYZ=2.8284,2.8284,7, ID='045', QUANTITY='FIRE ARRIVAL TIME', TEMPORAL_STATISTIC='INSTANT VALUE', IOR=3/

0 commit comments

Comments
 (0)