CFB Fast Pyrolysis Reactor¶
Known issue
With the published CRECK-2014 scheme the bio-oil (total liquid) comes out at about 50 % at riser residence times, against the 65 to 75 % measured in fluid beds. The char yield includes the activated lignin residue (LIGOH) the scheme leaves in the solid, about 18 % of the feed in the example.
![]()
Circulating Fluidized Bed (CFB) reactor for fast pyrolysis of lignocellulosic biomass. The riser is modelled as a 1-D axial plug-flow reactor discretised into N cells; each cell integrates the reduced Ranzi multi-step scheme for cellulose/hemicellulose/lignin on mass-fraction basis, with vapor residence time computed from the local gas superficial velocity and Geldart-A solids hold-up. An optional second block (char combustor) closes the energy balance.
DWSIM.UnitOperations.Reactors.Reactor_CFBFastPyrolysis
Assembly DWSIM.UnitOperations.dll · Object ← BaseClass ← UnitOpBaseClass ← Reactor ← Reactor_CFBFastPyrolysis
At a glance¶

| Port | Index | Connected in the example |
|---|---|---|
| Inlet, material | 0 |
Wood |
| Outlet, material | 0 |
Pyrolysis products |
Example¶
This code runs on every build of this site, and the output below is what it printed.
fs = (Flowsheet.Create("CFBPyrolysisExample")
.WithCompounds("Biomass_Generic", "Carbon", "Phenol", "Carbon monoxide", "Water")
.WithPropertyPackage(PropertyPackages.PengRobinson))
# Biomass_Generic carries the wood; the riser kinetics take the wood's make-up
# from WithBiomassComposition below.
wood = (fs.AddMaterialStream("Wood")
.At(Q.Celsius(25.0), Q.Bar(1.2))
.SetCompoundMassFlow("Biomass_Generic", 1.0)) # kg/s, dry basis
products = fs.AddMaterialStream("Pyrolysis products")
cfb = (fs.AddCFBFastPyrolysisReactor("R-1")
.WithRiserHeight(Q.Meters(8.0))
.WithRiserDiameter(Q.Meters(0.6))
.WithAxialCells(20)
.WithCarrierGasVelocityMPerS(5.0)
.WithSolidsSlipFactor(2.5) # solids stay 2.5x longer than the vapors
.WithSandMode(CFBSandMode.External)
.WithSandInletTemperature(Q.Celsius(560.0))
.WithSandToBiomassRatio(15.0)
.WithBiomassComposition(0.42, 0.25, 0.33) # cellulose, hemicellulose, lignin
.ConnectFeed(wood, 0)
.ConnectProduct(products, 0))
r = cfb.Object
# compounds that carry each product lump in the outlet stream
r.BiomassCompound = "Biomass_Generic"
r.CharCompound = "Carbon"
r.BioOilCompound = "Phenol"
r.GasLumpCompound = "Carbon monoxide"
fs.AutoLayout()
fs.Solve()
print(f"Bio-oil yield = {r.Result_OilYield_wfrac * 100.0:.1f} wt %")
print(f"Gas yield = {r.Result_GasYield_wfrac * 100.0:.1f} wt %")
print(f"Char yield = {r.Result_CharYield_wfrac * 100.0:.1f} wt %")
print(f"Unreacted solids = {r.Result_UnreactedSolid_wfrac * 100.0:.1f} wt %")
print(f"Outlet temperature = {r.Result_OutletTemperature_K - 273.15:.0f} C")
print(f"Vapor residence time = {r.Result_VaporResidenceTime_s:.2f} s")
print(f"Pyrolysis duty = {r.Result_PyrolysisDuty_kW:.1f} kW (heat from the sand)")
Output
Bio-oil yield = 48.9 wt %
Gas yield = 5.9 wt %
Char yield = 40.1 wt %
Unreacted solids = 5.1 wt %
Outlet temperature = 489 C
Vapor residence time = 1.14 s
Pyrolysis duty = 938.4 kW (heat from the sand)
DWSIM 10.2.11.0, generated 2026-10-08.
Properties¶
IDs accepted by GetPropertyValue, SetPropertyValue, the sensitivity analysis, the optimizer, the Adjust block and dynamic events. Units are SI; pass another unit system to GetPropertyValue to get them converted.
| ID | Name | Unit (SI) | Input |
|---|---|---|---|
Riser Height |
m | yes | |
Riser Diameter |
m | yes | |
Num Axial Cells |
- | yes | |
Solids Holdup |
- | yes | |
Solids Slip Factor |
- | yes | |
Bed Material Density |
kg/m3 | yes | |
Bed Material Cp |
J/(kg.K) | yes | |
Carrier Gas Velocity |
m/s | yes | |
Sand Mode |
- | yes | |
Sand Inlet Temperature |
K | yes | |
Sand To Biomass Ratio |
- | yes | |
Heat Loss Fraction |
- | yes | |
Cellulose Mass Fraction |
- | yes | |
Hemicellulose Mass Fraction |
- | yes | |
Lignin Mass Fraction |
- | yes | |
Heat Of Pyrolysis |
J/kg | yes | |
Biomass Compound |
- | yes | |
Char Compound |
- | yes | |
BioOil Compound |
- | yes | |
Gas Compound |
- | yes | |
Water Compound |
- | yes | |
Oxygen Compound |
- | yes | |
CO2 Compound |
- | yes | |
Nitrogen Compound |
- | yes | |
Char LHV |
J/kg | result | |
Char Combustor Excess Air |
- | result | |
Char Combustor Heat Loss |
- | result | |
Oil Yield |
- | result | |
Gas Yield |
- | result | |
Char Yield |
- | result | |
Unreacted Solid |
- | result | |
Outlet Temperature |
K | result | |
Vapor Residence Time |
s | result | |
Sand Circulation |
kg/s | result | |
Sand Outlet Temperature |
K | result | |
Pyrolysis Duty |
kW | result | |
Combustor Duty |
kW | result | |
Combustor Air Flow |
kg/s | result | |
Combustor Flue Temperature |
K | result |
Learn more¶
-
User guide
API members¶
Public members declared by this class. Inherited members are documented on the base classes.
Constructors¶
Reactor_CFBFastPyrolysis(): Initializes a new default instance of the Reactor_CFBFastPyrolysis class.
Initializes a new default instance of the Reactor_CFBFastPyrolysis class.
Reactor_CFBFastPyrolysis(string, string): Initializes a new instance of the Reactor_CFBFastPyrolysis class with a name and description.
Initializes a new instance of the Reactor_CFBFastPyrolysis class with a name and description.
| Parameter | Type | Description |
|---|---|---|
name |
String |
The name of this reactor. |
description |
String |
A brief description of this reactor. |
Properties¶
BedMaterialCp_JkgK: Bed material specific heat (J/kg/K).
Bed material specific heat (J/kg/K). Default 830 (silica sand at 500 deg C).
BedMaterialDensity_kgm3: Bed material (sand/olivine) density (kg/m3).
Bed material (sand/olivine) density (kg/m3). Default 2600 (silica sand).
BiomassCompound: Biomass compound name in the flowsheet (dry-basis pseudo-solid).
Biomass compound name in the flowsheet (dry-basis pseudo-solid). Required.
BioOilCompound: Bio-oil compound name (condensable primary vapors, lump).
Bio-oil compound name (condensable primary vapors, lump).
CarrierGasVelocity_ms: Carrier gas superficial velocity at inlet (m/s).
Carrier gas superficial velocity at inlet (m/s). Default 5 m/s for fast-fluidised CFB.
CelluloseMassFrac: Cellulose mass fraction of dry biomass (0-1).
Cellulose mass fraction of dry biomass (0-1). Typical woody biomass 0.40-0.50.
CharCombustorExcessAir: Excess air fraction over stoichiometric for the char combustor (0..1).
Excess air fraction over stoichiometric for the char combustor (0..1). Default 0.2 = 20 %.
CharCombustorHeatLoss: Heat loss fraction of the char combustor (0..0.2).
Heat loss fraction of the char combustor (0..0.2). Default 0.03.
CharCompound: Char compound name (pseudo-solid) produced by pyrolysis.
Char compound name (pseudo-solid) produced by pyrolysis.
CharLHV_Jkg: Char heating value (J/kg) used by the internal combustor.
Char heating value (J/kg) used by the internal combustor. Default 30 MJ/kg.
CO2Compound: Carbon-dioxide compound name (char combustor product).
Carbon-dioxide compound name (char combustor product).
ComponentDescription: Gets or sets the display description for this unit operation.
Gets or sets the display description for this unit operation.
ComponentName: Gets or sets the display name for this unit operation.
Gets or sets the display name for this unit operation.
GasLumpCompound: Non-condensable gas compound name (CO/CO2/CH4/H2/H2O lump).
Non-condensable gas compound name (CO/CO2/CH4/H2/H2O lump).
HeatLossFraction: Heat-loss fraction of riser duty (0..0.2).
Heat-loss fraction of riser duty (0..0.2). Default 0.02 (2 %).
HeatOfPyrolysis_Jkg: Enthalpy of pyrolysis per kg of dry biomass feed (J/kg), for reference.
Enthalpy of pyrolysis per kg of dry biomass feed (J/kg), for reference. Positive = endothermic. Default 250 kJ/kg (Bridgwater 2012). The duty comes from the riser energy balance, which uses the reaction heats of the kinetic scheme.
HemicelluloseMassFrac: Hemicellulose mass fraction of dry biomass (0-1).
Hemicellulose mass fraction of dry biomass (0-1). Typical 0.25-0.35.
IsBio: Gets a value that marks this reactor as a bioprocess unit.
Gets a value that marks this reactor as a bioprocess unit. The object palettes read this flag by reflection to list it in the Biochemical group.
LigninMassFrac: Lignin mass fraction of dry biomass (0-1).
Lignin mass fraction of dry biomass (0-1). Typical 0.20-0.30.
MobileCompatible: Gets a value indicating whether this reactor is compatible with mobile interfaces.
Gets a value indicating whether this reactor is compatible with mobile interfaces. Always False.
NitrogenCompound: Nitrogen compound name (char combustor inert).
Nitrogen compound name (char combustor inert).
NumAxialCells: Number of axial discretisation cells for the 1-D PFR (>= 5, <= 500).
Number of axial discretisation cells for the 1-D PFR (>= 5, <= 500).
ObjectClass: Gets or sets the simulation object class category (Reactors).
Gets or sets the simulation object class category (Reactors).
OxygenCompound: Oxygen compound name (only used by the internal char combustor).
Oxygen compound name (only used by the internal char combustor).
Result_CharYield_wfrac: Gets or sets the calculated char yield at the riser outlet (char plus activated lignin residue), as a mass fraction...
Gets or sets the calculated char yield at the riser outlet (char plus activated lignin residue), as a mass fraction of the biomass feed.
Result_CombustorAirFlow_kgps: Gets or sets the calculated air mass flow fed to the internal char combustor, including excess air, in kg/s.
Gets or sets the calculated air mass flow fed to the internal char combustor, including excess air, in kg/s. Zero in External sand mode.
Result_CombustorDuty_kW: Gets or sets the calculated heat released by the internal char combustor after its heat loss, in kW.
Gets or sets the calculated heat released by the internal char combustor after its heat loss, in kW. Zero in External sand mode.
Result_CombustorFlueT_K: Gets or sets the estimated adiabatic flue gas temperature of the internal char combustor, in K.
Gets or sets the estimated adiabatic flue gas temperature of the internal char combustor, in K. Zero in External sand mode.
Result_GasYield_wfrac: Gets or sets the calculated non-condensable gas yield at the riser outlet, as a mass fraction of the biomass feed.
Gets or sets the calculated non-condensable gas yield at the riser outlet, as a mass fraction of the biomass feed.
Result_OilYield_wfrac: Gets or sets the calculated bio-oil (condensable vapor) yield at the riser outlet, as a mass fraction of the biomass...
Gets or sets the calculated bio-oil (condensable vapor) yield at the riser outlet, as a mass fraction of the biomass feed.
Result_OutletTemperature_K: Gets or sets the calculated temperature of the reacting mixture at the riser outlet, in K.
Gets or sets the calculated temperature of the reacting mixture at the riser outlet, in K. The outlet stream is written at this temperature.
Result_PyrolysisDuty_kW: Gets or sets the calculated pyrolysis duty, in kW: the heat the sand delivers to the reacting mixture (sensible...
Gets or sets the calculated pyrolysis duty, in kW: the heat the sand delivers to the reacting mixture (sensible heat, reaction heats and feed preheat). In External sand mode this value is written to the energy stream.
Result_SandCirculation_kgps: Gets or sets the calculated sand (bed material) circulation rate through the riser, in kg/s.
Gets or sets the calculated sand (bed material) circulation rate through the riser, in kg/s. In InternalCharCombustor mode this is the rate that closes the combustor energy balance.
Result_SandOutletTemperature_K: Gets or sets the calculated sand temperature at the riser outlet, in K.
Gets or sets the calculated sand temperature at the riser outlet, in K.
Result_UnreactedSolid_wfrac: Gets or sets the calculated fraction of the biomass feed that leaves the riser unconverted (cellulose, hemicellulose...
Gets or sets the calculated fraction of the biomass feed that leaves the riser unconverted (cellulose, hemicellulose and lignin, native or activated), as a mass fraction.
Result_VaporResidenceTime_s: Gets or sets the calculated vapor residence time in the riser, in s.
Gets or sets the calculated vapor residence time in the riser, in s.
RiserDiameter_m: Riser internal diameter (m).
Riser internal diameter (m). Typical 0.2-1.5 m for 1-100 t/day plants.
RiserHeight_m: Riser height (m).
Riser height (m). Typical industrial CFB fast-pyrolysis risers: 5-15 m.
SandInletTemperature_K: Sand inlet temperature (K) when SandMode = External.
Sand inlet temperature (K) when SandMode = External. Typical 700-850 K.
SandMode: Sand-supply mode (external constant T, or coupled char combustor).
Sand-supply mode (external constant T, or coupled char combustor).
SandToBiomassRatio: Sand mass-flow / biomass-feed mass-flow ratio (kg/kg).
Sand mass-flow / biomass-feed mass-flow ratio (kg/kg). Default 15. When SandMode = InternalCharCombustor this is only the initial guess.
SolidsHoldup: Average solids hold-up fraction in the riser (m3_solid / m3_total).
Average solids hold-up fraction in the riser (m3_solid / m3_total). Default 0.05 is typical for Geldart-A sand at u_g >> u_mf in a dilute riser.
SolidsSlipFactor: Solids residence time over vapor residence time in the riser (slip factor, 1 = no slip).
Solids residence time over vapor residence time in the riser (slip factor, 1 = no slip). Risers run at 2 to 3.
SupportsDynamicMode: Gets a value indicating whether this reactor supports dynamic simulation mode.
Gets a value indicating whether this reactor supports dynamic simulation mode. Always False.
WaterCompound: Water compound name (optional; for moisture flash and combustor).
Water compound name (optional; for moisture flash and combustor).
Methods¶
Calculate(object): Calculates the object.
Calculates the object.
| Parameter | Type | Description |
|---|---|---|
args |
Object |
CloneXML(): Creates a deep copy of this object by round-tripping through XML serialization.
Creates a deep copy of this object by round-tripping through XML serialization.
CloseEditForm(): Closes the editor of this object, if it is open.
Closes the editor of this object, if it is open.
DeCalculate(): Decalculates the object.
Decalculates the object.
DisplayEditForm(): Opens the editor of this object.
Opens the editor of this object. A host that has no editor for it does nothing.
GetChartModel(string): Builds an OxyPlot model of one axial profile group of the last trajectory, riser height on the x axis.
Builds an OxyPlot model of one axial profile group of the last trajectory, riser height on the x axis.
| Parameter | Type | Description |
|---|---|---|
name |
String |
GetChartModelNames(): Chart names the PFD chart object can embed: the axial profiles of the last riser integration.
Chart names the PFD chart object can embed: the axial profiles of the last riser integration.
GetDisplayDescription(): Returns the description string for this reactor type.
Returns the description string for this reactor type.
GetDisplayName(): Returns the display name for this reactor type.
Returns the display name for this reactor type.
GetIconBitmapBytes(): Returns the raw bytes of the icon image for this reactor.
Returns the raw bytes of the icon image for this reactor.
GetProperties(PropertyType): Get a list of all properties of the object.
Get a list of all properties of the object.
| Parameter | Type | Description |
|---|---|---|
proptype |
PropertyType |
Type of the property. |
GetPropertyUnit(string, IUnitsOfMeasure): Gets the units of a property.
Gets the units of a property.
| Parameter | Type | Description |
|---|---|---|
prop |
String |
Property identifier. |
su |
IUnitsOfMeasure |
Units system to use. Null to use the default (SI) system. |
GetPropertyValue(string, IUnitsOfMeasure): Returns the value of a named property, converting from SI to the current unit system.
Returns the value of a named property, converting from SI to the current unit system. Falls back to extra properties if the property is not found in the base implementation.
| Parameter | Type | Description |
|---|---|---|
prop |
String |
The property identifier string. |
su |
IUnitsOfMeasure |
Optional units-of-measure system used for conversion; uses the shared SI system when Nothing. |
GetReport(IUnitsOfMeasure, CultureInfo, string): Generates a plain-text results report for this reactor.
Generates a plain-text results report for this reactor.
| Parameter | Type | Description |
|---|---|---|
su |
IUnitsOfMeasure |
The unit system used for formatting output values (not used; values are reported in fixed units). |
ci |
CultureInfo |
The culture info used for number formatting. |
numberformat |
String |
A .NET numeric format string (e.g. "G6") applied to output values. |
SetPropertyValue(string, object, IUnitsOfMeasure): Sets the value of a property.
Sets the value of a property.
| Parameter | Type | Description |
|---|---|---|
prop |
String |
Property identifier. |
propval |
Object |
Property value to set at the specified units. |
su |
IUnitsOfMeasure |
Units system to use. Null to use the default (SI) system. |
UpdateEditForm(): Redraws the editor of this object with the current values, if it is open.
Redraws the editor of this object with the current values, if it is open.
Fields¶