FDS Tutorials

Simple Supply and Exhaust Vents

In this short tutorial you will learn how to model simple supply and exhaust vents.

1. Geometry and duration

In this example we will model an exhaust and a supply vent in a 3 m x 4 m x 3 m room:

&MESH XB= 0, 3, 0, 4, 0, 3, IJK= 30, 40, 30 /

The duration of the simulation will be 60 seconds.

&TIME T_END=60. /

2. Combustion

The combustion will be simulated by giving a HHRPUA to the surfaces of an obstruction:

&OBST XB= 1.3, 1.7, 1.8, 2.2, 0, 0.5, COLOR='RED', SURF_ID='fire1' /
&SURF ID='fire1', HRRPUA=150 /

The reaction parameters used are the following:

&REAC ID = 'propane reaction', SOOT_YIELD=0.03, CO_YIELD=0.05, FUEL='PROPANE'/

3. Supply and Exhaust vents

We want to model a supply vent in the bottom left of the room and an exhaust vent on the top right.

  • The position of the vents is defined by the usual XB parameter with the format x1,x2,y1,y2,z1,z2 (depending on where you are placing the vent, a pair of these values have to be equal since the vent is flat).
  • The VOLUME_FLOW parameter defines the volume flow of the vent in mc/s. If the flow is entering the computational domain, VOLUME_FLOW should be a negative number, otherwise it should be positive.

Supply vent

&VENT XB=0,0,1,3,0.2,0.6, SURF_ID='supply'/

Exhaust vent

&VENT XB=3,3,1.5,2.5,2.6,3, SURF_ID='exhaust'/

3.1. Air velocity

Note that instead of specifying the VOLUME_FLOW, you could specify the air velocity with the parameter VEL, expressed in m/s, as follows:

&VENT XB=0,0,1,3,0.2,0.6, SURF_ID='supply'/
&SURF ID='supply', VEL = -2, COLOR='GREEN' /

&VENT XB=3,3,1.5,2.5,2.6,3, SURF_ID='exhaust'/

3.2. Controlling the activation of the vents

You can control the activation of the vents using basic control actions (see also “Remove obstructions during a simulation in FDS).

Suppose you want the ventilation system to activate after 20 seconds from the start of the simulation.

You can do that by:

  • creating a “timer device”
  • assigning that device to the 2 vents, as follows:


&VENT XB=0,0,1,3,0.2,0.6, SURF_ID='supply', DEVC_ID='timer'/
&VENT XB=3,3,1.5,2.5,2.6,3, SURF_ID='exhaust', DEVC_ID='timer'/

The INITIAL_STATE=.FALSE.  parameter indicates that the vents are not active at the beginning of the simulation.

When the device reaches the setpoint of its quantity (in this case 20 seconds of the TIME quantity) it changes the state from .FALSE. to .TRUE., activating the vents.

FDS Tutorials

Smokeview Tutorial – Basic functions

In this Smokeview tutorial you will learn how to use the basic functions of the software.

1. Opening a Smokeview file

To open a Smokeview file (.smv) you just have to double click on it.

Two windows should now be opened by the software:

In the “visualization window”, Smokeview will automatically show the geometry of your simulation:

2. Controlling the view

To zoom in/out you have to hold and drag the scroll wheel of your mouse.

To rotate the view, you just have to hold left click and drag.

3. Loading different outputs

For the purpose of this basic Smokeview tutorial we will only look at the most used functions on the software.

3.1 Loading the fire and smoke animations

If you want to load the fire animation on Smokeview you just have to:

Right click–> Load/Unload–>3D Smoke–>HRRPUV

In this way Smokeview will load the HRRPUV output (Heat Release Rate per Unit of Volume), which is the fire animation.

If you want to load the smoke animation you will have to follow the same instruction as before, but instead you will have to click on SOOT DENSITY instead of HRRPUV:

Right click–> Load/Unload–>3D Smoke–>SOOT DENSITY

The fire and smoke animation should be automatically running.

3.2 Controlling the animations

One of the things you might want to control is the speed of the animation.

To do that, you just need to:

Right click–> Options –>Max frame rate–> *frame rate*

  • To pause the animation, press the “t” key on your keyboard.
  • To resume the animation, press “t” again.
  • To restart the animation press “0”.

You can also use your mouse to navigate through the timeline by left clicking and dragging.

3.3 Loading slice files

If you want to load slice files, the procedure is very similar to the HRRPUV and SOOT DENSITY one:

Right click–> Load/Unload–> Slice –>*quantity*–> *Slice file*

If you have some vector slice files in your simulation, you can load them with this procedure:

Right click–> Load/Unload–> Vector Slice –>*quantity*–> *vector slice file*

4. Unloading outputs

If you have loaded multiple outputs and you want to unload one of them, you can do that by following the same path that you used to load the output and selecting the unload option.

Instead, if you want to unload all the files, you just have to:

Right click–> Load/Unload–> Unload all

FDS Tutorials

Radially spreading fire

In this tutorial you will learn how to model a Radially Spreading Fire, both on a flat plane and among obstructions.

All of this will be accomplished without modeling the pyrolysis of the solid fuels directly.

1. Why model a radially spreading fire?

This function is commonly used to emulate a realistic fire growth/spread.

It allows the user to mimic a t-squared fire growth rate in a more natural way.


2. Radially spreading fire on a flat surface

Let’s first model a normal combustion on a flat plane using the VENT and SURF line:

&VENT XB= 1, 9, 1, 9, 0, 0, SURF_ID='fire' /
&SURF ID='fire', HRRPUA=500 /

These lines tell FDS to model a fire on the ground (z, z’ = 0) that burns at 500 kW/m2.

The total heat released during the combustion is equal to the area of the vent times the HRRPUA value:

(8 m * 8 m) * 500 kW/m2 = 32000 kW

To change this phenomenon into a radially spreading fire we need to add 2 parameters on the VENT line:

  • XYZ – which indicates the origin of the spreading fire (if unspecified, default is the center point of the VENT)
  • SPREAD_RATE – which indicates the speed of the fire spread in m/s

&VENT XB= 1, 9, 1, 9, 0, 0, SURF_ID='fire', XYZ= 4, 4, 0, SPREAD_RATE=0.1 /
&SURF ID='fire', HRRPUA=500 /

In this example , by setting XYZ= 2, 2, 0, and SPREAD_RATE=0.1, we instructed FDS to ignite in the x=4 and y=4 coordinates of the ground (z=0) and that the speed of the spread should be 0,1 m/s.

In this way we have emulated a t-squared fire growth in a natural and realistic way.

If we want to emulate also the descending part of the curve, we will also need to tell FDS how much time every cell of the vent should burn with the command RAMP_Q.

RAMP_Q parameter recap:
This function enable you to specify for each second of the simulation the multiplying factor “F”, which increases/decreases the HRRPUA value over time. By setting it to 0 and 1 you are able to switch on and off the combustion for each cell involved in the fire model.

Here is how to apply it in a radially spreading fire:

&VENT XB= 1, 9, 1, 9, 0, 0, SURF_ID='fire', XYZ= 4, 4, 0, SPREAD_RATE=0.1 /
&SURF ID='fire', HRRPUA=500, RAMP_Q='fireramp' /
&RAMP ID='fireramp', T= 0, F=0 /
&RAMP ID='fireramp', T= 1, F=1 /
&RAMP ID='fireramp', T=200, F=1 /
&RAMP ID='fireramp', T=201, F=0 /

In this example the descending part of the HRR curve will start at 200 s because the first cell lightened by the radially spreading fire will stop burning at 200 s.

Every cell of the vent will stop burning after 200 second from its first ignition.

Radially spreading fire on a flat surface

This picture shows the Heat Release Rate over time measured by the “_hrr.csv” file generated by FDS:


3. Radially spreading fire among obstructions

If you want the fire to spread over an area that is not confined to a flat plane, you need to specify XYZ and SPREAD_RATE on the SURF line directly and then apply that SURF line to the obstructions or particles over which you want the fire to spread.

&OBST XB=0.8,2,0.8,2,0.4,0, SURF_ID='fire1' /
&OBST XB=2.6,3.8,0.8,2,0.8,0, SURF_ID='fire1' /
&OBST XB=4.4,5.6,0.8,2,1,0, SURF_ID='fire1' /
&OBST XB=6.2,7.4,0.8,2,0.2,0, SURF_ID='fire1' /
&OBST XB=8,9.2,0.8,2,0.6,0, SURF_ID='fire1' /

&SURF ID='fire1', HRRPUA=250, SPREAD_RATE=0.1, XYZ=5,5,0

This technique is useful for simulating the spread of fire through a cluttered space when the detailed properties of the materials are unknown, or when the uncertainties associated with modeling the pyrolysis of the solid fuels directly are too great.

Radially spreading fire among obstructions

FDS guides and examples list

Check out the complete FDS guides and examples list

FDS-SMV download:

FDS Tutorials

Remove obstructions during a simulation in FDS

In this tutorial you will learn how to remove obstructions during a simulation in FDS.

1. Introduction

Devices can be used to control various actions. One of the most frequent controls implemented in a FDS simulation is the removal (or creation) of an obstruction.

In this tutorial we will remove obstructions using basic control actions. We will NOT use any Advanced Control Functions: (CTRL Namelist Group).

You will learn how to remove obstructions with FDS with 2 slightly different methods:

  • In the first simulation the window in a room will be removed after a defined number of seconds (like a timer).
  • In the second simulation the same window will be removed when a thermocouple reaches a specified setpoint value.

2. Remove obstruction in FDS

The obstruction removal can be achieved by:

  • assigning a DEVC_ID to the obstruction
  • and assigning a SETPOINT parameter to the device.

When the device measures a higher/lower quantity than the SETPOINT value, the device will “change state” (from .TRUE. to .FALSE. or vice versa), therefore removing or creating the obstruction.

3. Time dependent obstruction removal

The code you need to implement in your FDS input file is the following:

&OBST XB= 5, 5.01, 1.5, 3.5, 2, 3, TRANSPARENCY=0.9 ,RGB=160, 252, 255, DEVC_ID='timer'/

As you can see, we’ve told FDS that:

  • the obstruction is dependent on the device “timer”
  • the device initial state is “.TRUE.”
  • the device should change state when the TIME quantity reaches the value of 35 (35 seconds since the beginning of the simulation)

4. Temperature dependent obstruction removal

If you need to remove an obstruction when the temperature reaches a certain value, you can use this code:

&OBST XB= 5, 5.01, 1.5, 3.5, 2, 3, TRANSPARENCY=0.9 ,RGB=160, 252, 255, DEVC_ID='control temperature'/
&DEVC ID='control temperature', QUANTITY = 'THERMOCOUPLE', XYZ = 4.8, 3.6, 2.8, SETPOINT=100, INITIAL_STATE=.TRUE. /

The main structure of the code is the same as before, but now:

  • the obstruction is dependent on the device “control temperature”
  • a thermocouple device is placed in XYZ = 4.8, 3.6, 2.8
  • the device will change state when the THERMOCOUPLE quantity reaches the value of 100 (100 °C)
  • the device initial state is still “.TRUE.”

FDS guides and examples list

Check out the complete FDS guides and examples list

FDS Tutorials

Multiple Meshes

In this Fire Dynamics Simulator tutorial, you are going to learn how to properly define multiple meshes in the same FDS simulation.

Mesh Basics

All FDS calculations are performed within a domain that is made up of parallelepipedal volumes called meshes. Each mesh is divided into rectangular cells, the number of which depends on the desired resolution of the flow dynamics.

A mesh is defined by the MESH line:

&MESH XB= x, x’, y, y’, z, z’, IJK= n(x), n(y), n(z). /

The volume is a parallelepiped defined by 2 of its opposites corners; the coordinates of the first point are x, y, z; the second ones are x’, y’, z’.

The XB command defines the dimensions of the volume in meters, in the format of XB= x, x’, y, y’, z, z’.

The mesh is subdivided into uniform cells via the parameter IJK. This parameter specifies the number of parts in which you want to divide the three dimensions (x, y, z), in the format of IJK= n(x), n(y), n(z).

It’s advisable to subdivide each mesh so that the mesh cells resemble cubes (length, width and height of the cells should be roughly the same).

Multiple Meshes

The term “multiple meshes” means that the computational domain consists of more than one parallelepipedal volume.
Each individual mesh needs a specific MESH line.
In general, the meshes should be entered from finest to coarsest (from “smallest cells” to “biggest cells”).

Why use multiple meshes

There are different reasons for wanting to subdivide the computation domain in more than one mesh:

  • reason #1: it’s sometimes useful to adopt different resolutions for different parts of a simulation (you might want to prefer fine mesh resolutions where complicated phenomena are taking place , whereas in spaces where not much is happening you probably don’t want to waste computing power, so you might want to use bigger cells).
  • reason #2: you might want to subdivide the calculation on different cores/computers using MPI (see the dedicated chapter on the official FDS User Guide, this aspect is not discussed in this FDS tutorial)
  • reason #3: if the case you want to simulate involves a geometry very different from a rectangular volume, in order not to waster computing power, you might want to use multiple rectangular volumes to englobe your geometry.

Example: imagine a fire scenario meant to be simulated in the building shown below.

You could use a single mesh but a lot of the volume of the mesh would contain uninteresting data:

Instead, you could optimize the simulation by using 3 different meshes; in this way, you would also be able to speed up the calculation by properly adopting different MPI processes.

Mesh Alignment

The most important rule of mesh alignment is that abutting cells ought to have the same cross-sectional area, or integral ratios, as shown in the following pictures (the pictures are taken from the FDS User Guide, but they are modified to highlight the various characteristics).

The exchange of information across mesh boundaries is not as accurate as cell to cell exchanges within one mesh, so try to avoid placing mesh boundaries where complicated phenomena are expected.


Let’s say we want to model a scenario in which a fire starts in a room and the smoke invades the near corridor.

We want a refined mesh in the zone in which the smoke passes from the room to the corridor, but we evaluate that coarser meshes are suitable in the rest of the geometry.

We will use 10 cm cubes for the refined mesh and 20 cm cubes for the coarse ones, as follows:

&MESH ID='Mesh 01', IJK=30, 24, 28, XB=6, 9, 0, 2.4, 0, 2.8/ refined mesh
&MESH ID='Mesh 02', IJK=15, 9, 14, XB=6, 9, 2.4, 4.2, 0, 2.8/ coarse mesh
&MESH ID='Mesh 03', IJK=30, 6, 14, XB=0, 6, 0, 1.2, 0, 2.8/ coarse mesh
&MESH ID='Mesh 04', IJK=30, 6, 14, XB=9, 15, 0, 1.2, 0, 2.8/ coarse mesh

As you can see, Mesh 01 is divided with a higher resolution on all 3 dimensions:
dimension x: (9 – 6) / 30 = 0.1 m
dimension y: (2.4 – 0) / 24 = 0.1 m
dimension z: (2.8 – 0) / 28 = 0.1 m

The other meshes have lower resolution (here’s Mesh 02 for example)
dimension x: (9 – 6) / 15 = 0.2 m
dimension y: (4.2 – 2.4) / 9 = 0.2 m
dimension z: (2.8 – 0) / 14 = 0.2 m

Important things to consider

When using multiple meshes you should consider the following aspects to ensure that a simulation is properly set up:
1) The mesh boundaries should be away from areas of activity to make sure that the information is being transferred properly from mesh to mesh.
2) The user should evaluate if the loss of information caused from moving from a fine to a coarse mesh is tolerable.