Skip to content

Commit

Permalink
FDS Source: Pyrolysis in HT3D cases
Browse files Browse the repository at this point in the history
  • Loading branch information
mcgratta committed Sep 11, 2023
1 parent 2401d2b commit c647f0f
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 59 deletions.
22 changes: 11 additions & 11 deletions Manuals/FDS_User_Guide/FDS_User_Guide.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2387,11 +2387,11 @@ \subsection{Solid Phase Numerical Gridding Issues}

The default parameters governing the node spacing are appropriate for simple heat transfer calculations, but sometimes pyrolysis reactions cause spurious fluctuations in temperature and burning rate. The numerical accuracy and stability of the solid phase solution may be improved as follows:
\begin{description}
\item[Make the node spacing more uniform] inside the material by setting {\ct STRETCH\_FACTOR(NL)=1.} on the {\ct SURF} line. This will generate a perfectly uniform mesh for layer number {\ct NL}. Values between 1 and 2 give different levels of stretching. The default value of 2 indicates that the second cell is twice as thick as the first, the third is twice the second, and so on until the mid-depth of the layer is reached, at which point the cells shrink following the same pattern. Note that {\ct STRETCH\_FACTOR} needs to be specified for all the layers unless the default value is desired.
\item[Make the mesh cells smaller] by setting {\ct CELL\_SIZE\_FACTOR(NL)} less than 1 for the layer {\ct NL}. For example, a value of 0.5 makes the mesh cells in the layer half the size.
\item[Make the node spacing more uniform] inside the material by setting {\ct STRETCH\_FACTOR=1.} on the {\ct SURF} line. This will generate a perfectly uniform mesh. Values between 1 and 2 give different levels of stretching. The default value of 2 indicates that the second cell is twice as thick as the first, the third is twice the second, and so on until the mid-depth of the layer is reached, at which point the cells shrink following the same pattern.
\item[Make the mesh cells smaller] by setting {\ct CELL\_SIZE\_FACTOR} less than 1. For example, a value of 0.5 makes the mesh cells in the layer half the size.
\item[Specify your own cell size] by specifying {\ct CELL\_SIZE} directly. This parameter over-rides {\ct STRETCH\_FACTOR} and {\ct CELL\_SIZE\_FACTOR} and it applies to all layers.
\item[Improve the time resolution] by setting {\ct WALL\_INCREMENT=1} on the {\ct TIME} line. This forces the solid phase solution to be updated every time step instead of the default every 2 time steps. If this is still not sufficient, you can direct that FDS use smaller time steps to update the solid phase heat conduction calculation than that used by the gas phase solver. This can be done specifically for a selected surface ({\ct SURF}) type. The feature works by sub-dividing the gas phase time step into halves, quarters, eighths, etc., as specified by the {\ct SURF} line integer parameter {\ct SUBSTEP\_POWER}. Its default value is 2, meaning that the solid phase time step for that particular {\ct SURF} type can be sub-divided by {\em at most} a factor of $2^2=4$. If you set {\ct SUBSTEP\_POWER} to 4, the time step will be sub-divided by {\em at most} a factor of $2^4=16$. The decision to sub-divide the time step is based on the criterion that the internal temperature of the solid should not change by more than {\ct DELTA\_TMP\_MAX}~$^\circ$C during that sub-step. The default value of {\ct DELTA\_TMP\_MAX} is 10~$^\circ$C, and this is also a {\ct SURF} parameter. You can choose {\ct QUANTITY='SUBSTEPS'} on either a {\ct DEVC} or {\ct BNDF} output line to see how many sub-steps are being used by a particular surface cell or the entire domain.
\item[Limit the number of cells in a layer] by setting {\ct N\_LAYER\_CELLS\_MAX(:)}. This array input has a default of 1000. Reducing this value does not necessarily improve accuracy, but it does save computing time. However, rarely does the solid phase require this many cells. The output file {\ct CHID.out} contains the coordinates of the solid phase nodes.
\item[Limit the number of cells in any layer] by setting {\ct N\_LAYER\_CELLS\_MAX} (default 1000). Reducing this value does not necessarily improve accuracy, but it does save computing time. However, rarely does the solid phase require this many cells. The output file {\ct CHID.out} contains the coordinates of the solid phase nodes.
\item[Change when a wall cell is renoded] by setting {\ct RENODE\_DELTA\_T} on the {\ct SURF} line. If cells shrink during pyrolysis, FDS will try and renode the wall cell to reduce the number of wall nodes over time. If there is a large enough temperature difference between the first wall cell and the second wall cell, then renoding can result in large swings of the surface temperature which can cause spurious behavior in the pyrolysis model. {\ct RENODE\_DELTA\_T} defines a limit on the temperature difference between wall cells, where FDS will not renode the wall. The default value is 2~K.
\end{description}
If all the material components react and leave no solid residue, the thickness of the solid will shrink. Each of the shrinking layers will vanish from the computation when its thickness gets smaller than a prescribed limiting value. This value can be set on a {\ct SURF} line using {\ct MINIMUM\_LAYER\_THICKNESS}, defaulting to $1 \times 10^{-6}$~m. When all the material of a shrinking surface is consumed but {\ct BURN\_AWAY} is not prescribed, the surface temperature is set to {\ct TMP\_GAS\_BACK}, convective heat flux to zero and burning rate to zero.
Expand Down Expand Up @@ -2444,7 +2444,7 @@ \subsubsection{Limitations}
\item {\ct HT3D} cannot be applied to an exterior boundary; it must be applied to an {\ct OBST} that is completely within the computational domain.
\item Avoid contact between 3-D and 1-D solids. If two sides of a 3-D solid touch 1-D solids, there will be no lateral heat conduction computed in that particular direction.
\item If your 3-D obstruction extends beyond meshes that abut, add the parameter {\ct NEIGHBOR\_SEPARATION\_DISTANCE} to the {\ct MISC} line. Any mesh within this distance of another mesh will share geometry information for use in the 3-D heat conduction calculation.
\item By default, the interior nodes are clustered near the surface and stretched out deeper within the solid. If you want to maintain uniform spacing, set {\ct CELL\_SIZE} on the {\ct SURF} line to indicate the desired interior node spacing. The {\ct CELL\_SIZE} is typically the same as the gas phase cells.
\item By default, the interior nodes are clustered near the surface and stretched out deeper within the solid. If you want to maintain uniform spacing, set {\ct CELL\_SIZE} on the {\ct SURF} line to indicate the desired interior node spacing. The {\ct CELL\_SIZE} is typically the same as the gas phase cells.
\end{enumerate}

\subsubsection{Example: Steel Assembly}
Expand Down Expand Up @@ -2527,7 +2527,7 @@ \subsubsection{Surface Linings}
&MATL ID='STUFF C', DENSITY= 30, SPECIFIC_HEAT=2.5, CONDUCTIVITY=0.3 /
&MATL ID='STEEL', DENSITY=7500, SPECIFIC_HEAT=0.5, CONDUCTIVITY=50. /
\end{lstlisting}
The resulting solid has the same dimensions as the one you specify, but 5~mm of its surface material is replaced by the given layers of ``stuff.''
The resulting solid has the same dimensions as the one you specify, but 5~mm of its surface material is replaced by the given layers of ``stuff.''



Expand Down Expand Up @@ -3454,9 +3454,9 @@ \section{HVAC Systems}
\be
P_{node}^{n+1}=P_{node}^n \; (1-{\ct HVAC\_PRES\_RELAX}) \; + \; P_{FDS}^{n+1} \; {\ct HVAC\_PRES\_RELAX}
\ee
Setting this parameter closer to 0 reduces the sensitivity of the HVAC solution to short, transient pressure changes in the FDS domain; however, doing so will also result in the HVAC solution lagging for longer duration pressure changes.
Setting this parameter closer to 0 reduces the sensitivity of the HVAC solution to short, transient pressure changes in the FDS domain; however, doing so will also result in the HVAC solution lagging for longer duration pressure changes.

The second method is setting the keyword {\ct HVAC\_LOCAL\_PRESSURE} on the {\ct MISC} line. When set, this will cause FDS to use the {\ct ZONE} pressure at a vent plus the stagnation pressure of any flow normal to the vent to determine the pressure boundary condition for a node connected to the FDS domain rather than the {\ct ZONE} pressure plus the the pressure derived from the local value of $\cH$.
The second method is setting the keyword {\ct HVAC\_LOCAL\_PRESSURE} on the {\ct MISC} line. When set, this will cause FDS to use the {\ct ZONE} pressure at a vent plus the stagnation pressure of any flow normal to the vent to determine the pressure boundary condition for a node connected to the FDS domain rather than the {\ct ZONE} pressure plus the the pressure derived from the local value of $\cH$.

\subsection{HVAC Duct Parameters}
\label{info:HVACduct}
Expand Down Expand Up @@ -12701,11 +12701,11 @@ \section{\texorpdfstring{{\tt SURF}}{SURF} (Surface Properties)}
{\ct ADIABATIC} & Logical & Section~\ref{info:adiabatic} & & {\ct F} \\ \hline
{\ct AREA\_MULTIPLIER} & Real & Section~\ref{info:area_mult} & & 1.0 \\ \hline
{\ct BACKING} & Character & Section~\ref{info:BACKING} & & {\ct 'EXPOSED'} \\ \hline
{\ct BLOWING} & Logical & Section~\ref{blowing} & & \\ \hline
{\ct BLOWING} & Logical & Section~\ref{blowing} & & \\ \hline
{\ct BURN\_AWAY} & Logical & Section~\ref{info:BURN_AWAY} & & {\ct F} \\ \hline
{\ct BURN\_DURATION} & Real & Section~\ref{info:BURN_DURATION} & s & 1000000 \\ \hline
{\ct CELL\_SIZE} & Real & Section~\ref{info:solid_phase_stability} & m & \\ \hline
{\ct CELL\_SIZE\_FACTOR(:)} & Real Array & Section~\ref{info:solid_phase_stability} & & 1.0 \\ \hline
{\ct CELL\_SIZE\_FACTOR} & Real & Section~\ref{info:solid_phase_stability} & & 1.0 \\ \hline
{\ct COLOR } & Character & Section~\ref{info:colors} & & \\ \hline
{\ct CONVECTION\_LENGTH\_SCALE} & Real & Section~\ref{info:convection} & m & 1. \\ \hline
{\ct CONVECTIVE\_HEAT\_FLUX} & Real & Section~\ref{info:convection} & \si{kW/m^2} & \\ \hline
Expand Down Expand Up @@ -12756,7 +12756,7 @@ \section{\texorpdfstring{{\tt SURF}}{SURF} (Surface Properties)}
{\ct MINIMUM\_SCALING\_HEAT\_FLUX} & Real & Section~\ref{info:scaled_burning} & \si{kW/m^2} & 0 \\ \hline
{\ct MLRPUA} & Real & Section~\ref{info:gas_burner} & \si{kg/(m^2.s)} & \\ \hline
{\ct MOISTURE\_FRACTION(:)} & Real Array & Section~\ref{info:vegetation} & & 0. \\ \hline
{\ct N\_LAYER\_CELLS\_MAX} & Integer Array & Section~\ref{info:solid_phase_stability} & & 1000 \\ \hline
{\ct N\_LAYER\_CELLS\_MAX} & Integer & Section~\ref{info:solid_phase_stability} & & 1000 \\ \hline
{\ct NEAR\_WALL\_EDDY\_VISCOSITY} & Real & Section~\ref{info:LES} & m$^2$/s & \\ \hline
{\ct NEAR\_WALL\_TURBULENCE\_MODEL} & Character & Section~\ref{info:LES} & & \\ \hline
{\ct NET\_HEAT\_FLUX} & Real & Section~\ref{info:convection} & kW/m$^2$ & \\ \hline
Expand Down Expand Up @@ -12795,7 +12795,7 @@ \section{\texorpdfstring{{\tt SURF}}{SURF} (Surface Properties)}
{\ct SHAPE\_FACTOR} & Real & Section~\ref{info:boundary_fuel_model} & & 0.25 \\ \hline
{\ct SPEC\_ID} & Character & Section~\ref{info:MASS_FLUX} & & \\ \hline
{\ct SPREAD\_RATE} & Real & Section~\ref{info:spread} & m/s & \\ \hline
{\ct STRETCH\_FACTOR(:) } & Real & Section~\ref{info:solid_phase_stability} & & 2. \\ \hline
{\ct STRETCH\_FACTOR } & Real & Section~\ref{info:solid_phase_stability} & & 2. \\ \hline
{\ct SUBSTEP\_POWER} & Integer & Section~\ref{info:solid_phase_stability} & & 2 \\ \hline
{\ct SURFACE\_VOLUME\_RATIO(:) } & Real & Section~\ref{pine_needles} & 1/m & \\ \hline
{\ct TAU\_EF} & Real & Section~\ref{info:RAMP_Time} & s & 1. \\ \hline
Expand Down
6 changes: 3 additions & 3 deletions Source/dump.f90
Original file line number Diff line number Diff line change
Expand Up @@ -9701,7 +9701,7 @@ SUBROUTINE DUMP_PROF(T,NM)
IF (NWP==0) CYCLE PROF_LOOP
X_S_NEW(0:NWP) = ONE_D%X(0:NWP)
THICKNESS = SUM(ONE_D%LAYER_THICKNESS)
CALL GET_WALL_NODE_WEIGHTS(NWP,SF%N_LAYERS,ONE_D%N_LAYER_CELLS,ONE_D%LAYER_THICKNESS,SF%GEOMETRY, &
CALL GET_WALL_NODE_WEIGHTS(NWP,ONE_D%N_LAYERS,ONE_D%N_LAYER_CELLS,ONE_D%LAYER_THICKNESS,SF%GEOMETRY, &
ONE_D%X(0:NWP),SF%LAYER_DIVIDE,DX_S(1:NWP),RDX_S(0:NWP+1),RDXN_S(0:NWP),DX_WGT_S(0:NWP),DXF,DXB,LAYER_INDEX,MF_FRAC,&
SF%INNER_RADIUS)
ELSE
Expand Down Expand Up @@ -9739,8 +9739,8 @@ SUBROUTINE DUMP_PROF(T,NM)
ENDIF
ELSE
RHO_S = 0._EB
DO NN=1,SF%N_MATL
IF (PF%QUANTITY==SF%MATL_NAME(NN) .OR. PF%QUANTITY=='DENSITY') THEN
DO NN=1,ONE_D%N_MATL
IF (PF%QUANTITY==MATERIAL(ONE_D%MATL_INDEX(NN))%ID .OR. PF%QUANTITY=='DENSITY') THEN
DO I=1,NWP
RHO_S(I) = RHO_S(I) + ONE_D%MATL_COMP(NN)%RHO(I)
ENDDO
Expand Down
13 changes: 9 additions & 4 deletions Source/func.f90
Original file line number Diff line number Diff line change
Expand Up @@ -1839,6 +1839,9 @@ SUBROUTINE PACK_BOUNDARY_ONE_D(NM,IC,RC,OS,OD_INDEX,UNPACK_IT,COUNT_ONLY)
I1 = I2+1 ; I2 = I1 + ONE_D%N_LAYERS - 1
IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%REALS(I1:I2) , ONE_D%LAYER_THICKNESS(1:I2-I1+1) , UNPACK_IT)

I1 = I2+1 ; I2 = I1 + ONE_D%N_LAYERS - 1
IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%REALS(I1:I2) , ONE_D%MIN_DIFFUSIVITY(1:I2-I1+1) , UNPACK_IT)

I1 = I2+1 ; I2 = I1 + ONE_D%N_CELLS_MAX - 1
IF (.NOT.COUNT_ONLY) CALL EQUATE(OS%REALS(I1:I2) , ONE_D%RHO_C_S(1:I2-I1+1) , UNPACK_IT)

Expand Down Expand Up @@ -1890,6 +1893,7 @@ SUBROUTINE REALLOCATE_BOUNDARY_ONE_D(ONE_D)
IF (ALLOCATED(ONE_D%TMP)) DEALLOCATE(ONE_D%TMP) ; ALLOCATE(ONE_D%TMP(0:ONE_D%N_CELLS_MAX+1))
IF (ALLOCATED(ONE_D%DELTA_TMP)) DEALLOCATE(ONE_D%DELTA_TMP) ; ALLOCATE(ONE_D%DELTA_TMP(0:ONE_D%N_CELLS_MAX+1))
IF (ALLOCATED(ONE_D%LAYER_THICKNESS)) DEALLOCATE(ONE_D%LAYER_THICKNESS) ; ALLOCATE(ONE_D%LAYER_THICKNESS(ONE_D%N_LAYERS))
IF (ALLOCATED(ONE_D%MIN_DIFFUSIVITY)) DEALLOCATE(ONE_D%MIN_DIFFUSIVITY) ; ALLOCATE(ONE_D%MIN_DIFFUSIVITY(ONE_D%N_LAYERS))
IF (ALLOCATED(ONE_D%RHO_C_S)) DEALLOCATE(ONE_D%RHO_C_S) ; ALLOCATE(ONE_D%RHO_C_S(ONE_D%N_CELLS_MAX))
IF (ALLOCATED(ONE_D%K_S)) DEALLOCATE(ONE_D%K_S) ; ALLOCATE(ONE_D%K_S(0:ONE_D%N_CELLS_MAX+1))
IF (ALLOCATED(ONE_D%DDSUM)) DEALLOCATE(ONE_D%DDSUM) ; ALLOCATE(ONE_D%DDSUM(ONE_D%N_LAYERS))
Expand Down Expand Up @@ -1950,7 +1954,8 @@ SUBROUTINE INITIALIZE_BOUNDARY_ONE_D(NM,OD_INDEX,SURF_INDEX)
ONE_D%TMP = SF%TMP_INNER
ENDIF
ONE_D%DELTA_TMP = 0._EB
ONE_D%LAYER_THICKNESS(1:SF%N_LAYERS) = SF%LAYER_THICKNESS(1:SF%N_LAYERS)
ONE_D%LAYER_THICKNESS(1:ONE_D%N_LAYERS) = SF%LAYER_THICKNESS(1:SF%N_LAYERS)
ONE_D%MIN_DIFFUSIVITY(1:ONE_D%N_LAYERS) = SF%MIN_DIFFUSIVITY(1:SF%N_LAYERS)
ONE_D%RHO_C_S = 1.E6_EB
ONE_D%K_S = 0._EB
ONE_D%DDSUM(1:SF%N_LAYERS) = SF%DDSUM(1:SF%N_LAYERS)
Expand Down Expand Up @@ -2799,7 +2804,7 @@ END SUBROUTINE GET_N_LAYER_CELLS
!> \param N_LAYER_CELLS Array holding the number of cells in each layer
!> \param N_LAYER_CELLS_OLD Former value of N_LAYER_CELLS
!> \param SMALLEST_CELL_SIZE Array holding the sizes of the bounding cells in each layer (m)
!> \param STRETCH_FACTOR Array holding the stretching factors of each layer
!> \param STRETCH_FACTOR Node stretching factor of each layer
!> \param REMESH_LAYER Logical array indicating if current layer should be remeshed
!> \param X_S Array containing boundaries of the interior cells
!> \param X_S_OLD Array containing old boundaries of the interior cells used when skipping remesh for a layer
Expand All @@ -2808,7 +2813,7 @@ SUBROUTINE GET_WALL_NODE_COORDINATES(N_CELLS,N_CELLS_OLD,N_LAYERS,N_LAYER_CELLS,
STRETCH_FACTOR,REMESH_LAYER,X_S,X_S_OLD)

INTEGER, INTENT(IN) :: N_CELLS,N_CELLS_OLD,N_LAYERS, N_LAYER_CELLS(N_LAYERS),N_LAYER_CELLS_OLD(N_LAYERS)
REAL(EB), INTENT(IN) :: SMALLEST_CELL_SIZE(N_LAYERS),STRETCH_FACTOR(N_LAYERS),X_S_OLD(0:N_CELLS_OLD)
REAL(EB), INTENT(IN) :: SMALLEST_CELL_SIZE(N_LAYERS),STRETCH_FACTOR,X_S_OLD(0:N_CELLS_OLD)
REAL(EB), INTENT(OUT) :: X_S(0:N_CELLS)
LOGICAL, INTENT(IN) :: REMESH_LAYER(N_LAYERS)

Expand All @@ -2824,7 +2829,7 @@ SUBROUTINE GET_WALL_NODE_COORDINATES(N_CELLS,N_CELLS_OLD,N_LAYERS,N_LAYER_CELLS,
DO I=1,N_LAYER_CELLS(NL)
II = II+1
IF (REMESH_LAYER(NL)) THEN
DX_S = SMALLEST_CELL_SIZE(NL)*STRETCH_FACTOR(NL)**(MIN(I-1,N_LAYER_CELLS(NL)-I))
DX_S = SMALLEST_CELL_SIZE(NL)*STRETCH_FACTOR**(MIN(I-1,N_LAYER_CELLS(NL)-I))
ELSE
DX_S = X_S_OLD(I_START+I) - X_S_OLD(I_START+I-1)
ENDIF
Expand Down
Loading

0 comments on commit c647f0f

Please sign in to comment.