Skip to content

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

CFB Fast Pyrolysis Reactor in the example flowsheet

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

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.

public Reactor_CFBFastPyrolysis()
Public Sub New()

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.
public Reactor_CFBFastPyrolysis(string name, string description)
Public Sub New(name As String, description As String)

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).

public double BedMaterialCp_JkgK { get; set; }
Public Property BedMaterialCp_JkgK As Double

BedMaterialDensity_kgm3: Bed material (sand/olivine) density (kg/m3).

Bed material (sand/olivine) density (kg/m3). Default 2600 (silica sand).

public double BedMaterialDensity_kgm3 { get; set; }
Public Property BedMaterialDensity_kgm3 As Double

BiomassCompound: Biomass compound name in the flowsheet (dry-basis pseudo-solid).

Biomass compound name in the flowsheet (dry-basis pseudo-solid). Required.

public string BiomassCompound { get; set; }
Public Property BiomassCompound As String

BioOilCompound: Bio-oil compound name (condensable primary vapors, lump).

Bio-oil compound name (condensable primary vapors, lump).

public string BioOilCompound { get; set; }
Public Property BioOilCompound As String

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.

public double CarrierGasVelocity_ms { get; set; }
Public Property CarrierGasVelocity_ms As Double

CelluloseMassFrac: Cellulose mass fraction of dry biomass (0-1).

Cellulose mass fraction of dry biomass (0-1). Typical woody biomass 0.40-0.50.

public double CelluloseMassFrac { get; set; }
Public Property CelluloseMassFrac As Double

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 %.

public double CharCombustorExcessAir { get; set; }
Public Property CharCombustorExcessAir As Double

CharCombustorHeatLoss: Heat loss fraction of the char combustor (0..0.2).

Heat loss fraction of the char combustor (0..0.2). Default 0.03.

public double CharCombustorHeatLoss { get; set; }
Public Property CharCombustorHeatLoss As Double

CharCompound: Char compound name (pseudo-solid) produced by pyrolysis.

Char compound name (pseudo-solid) produced by pyrolysis.

public string CharCompound { get; set; }
Public Property CharCompound As String

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.

public double CharLHV_Jkg { get; set; }
Public Property CharLHV_Jkg As Double

CO2Compound: Carbon-dioxide compound name (char combustor product).

Carbon-dioxide compound name (char combustor product).

public string CO2Compound { get; set; }
Public Property CO2Compound As String

ComponentDescription: Gets or sets the display description for this unit operation.

Gets or sets the display description for this unit operation.

public override string ComponentDescription { get; set; }
Public Overrides Property ComponentDescription As String

ComponentName: Gets or sets the display name for this unit operation.

Gets or sets the display name for this unit operation.

public override string ComponentName { get; set; }
Public Overrides Property ComponentName As String

GasLumpCompound: Non-condensable gas compound name (CO/CO2/CH4/H2/H2O lump).

Non-condensable gas compound name (CO/CO2/CH4/H2/H2O lump).

public string GasLumpCompound { get; set; }
Public Property GasLumpCompound As String

HeatLossFraction: Heat-loss fraction of riser duty (0..0.2).

Heat-loss fraction of riser duty (0..0.2). Default 0.02 (2 %).

public double HeatLossFraction { get; set; }
Public Property HeatLossFraction As Double

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.

public double HeatOfPyrolysis_Jkg { get; set; }
Public Property HeatOfPyrolysis_Jkg As Double

HemicelluloseMassFrac: Hemicellulose mass fraction of dry biomass (0-1).

Hemicellulose mass fraction of dry biomass (0-1). Typical 0.25-0.35.

public double HemicelluloseMassFrac { get; set; }
Public Property HemicelluloseMassFrac As Double

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.

public bool IsBio { get; }
Public ReadOnly Property IsBio As Boolean

LigninMassFrac: Lignin mass fraction of dry biomass (0-1).

Lignin mass fraction of dry biomass (0-1). Typical 0.20-0.30.

public double LigninMassFrac { get; set; }
Public Property LigninMassFrac As Double

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.

public override bool MobileCompatible { get; }
Public Overrides ReadOnly Property MobileCompatible As Boolean

NitrogenCompound: Nitrogen compound name (char combustor inert).

Nitrogen compound name (char combustor inert).

public string NitrogenCompound { get; set; }
Public Property NitrogenCompound As String

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).

public int NumAxialCells { get; set; }
Public Property NumAxialCells As Integer

ObjectClass: Gets or sets the simulation object class category (Reactors).

Gets or sets the simulation object class category (Reactors).

public override SimulationObjectClass ObjectClass { get; set; }
Public Overrides Property ObjectClass As SimulationObjectClass

OxygenCompound: Oxygen compound name (only used by the internal char combustor).

Oxygen compound name (only used by the internal char combustor).

public string OxygenCompound { get; set; }
Public Property OxygenCompound As String

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.

public double Result_CharYield_wfrac { get; set; }
Public Property Result_CharYield_wfrac As Double

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.

public double Result_CombustorAirFlow_kgps { get; set; }
Public Property Result_CombustorAirFlow_kgps As Double

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.

public double Result_CombustorDuty_kW { get; set; }
Public Property Result_CombustorDuty_kW As Double

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.

public double Result_CombustorFlueT_K { get; set; }
Public Property Result_CombustorFlueT_K As Double

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.

public double Result_GasYield_wfrac { get; set; }
Public Property Result_GasYield_wfrac As Double

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.

public double Result_OilYield_wfrac { get; set; }
Public Property Result_OilYield_wfrac As Double

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.

public double Result_OutletTemperature_K { get; set; }
Public Property Result_OutletTemperature_K As Double

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.

public double Result_PyrolysisDuty_kW { get; set; }
Public Property Result_PyrolysisDuty_kW As Double

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.

public double Result_SandCirculation_kgps { get; set; }
Public Property Result_SandCirculation_kgps As Double

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.

public double Result_SandOutletTemperature_K { get; set; }
Public Property Result_SandOutletTemperature_K As Double

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.

public double Result_UnreactedSolid_wfrac { get; set; }
Public Property Result_UnreactedSolid_wfrac As Double

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.

public double Result_VaporResidenceTime_s { get; set; }
Public Property Result_VaporResidenceTime_s As Double

RiserDiameter_m: Riser internal diameter (m).

Riser internal diameter (m). Typical 0.2-1.5 m for 1-100 t/day plants.

public double RiserDiameter_m { get; set; }
Public Property RiserDiameter_m As Double

RiserHeight_m: Riser height (m).

Riser height (m). Typical industrial CFB fast-pyrolysis risers: 5-15 m.

public double RiserHeight_m { get; set; }
Public Property RiserHeight_m As Double

SandInletTemperature_K: Sand inlet temperature (K) when SandMode = External.

Sand inlet temperature (K) when SandMode = External. Typical 700-850 K.

public double SandInletTemperature_K { get; set; }
Public Property SandInletTemperature_K As Double

SandMode: Sand-supply mode (external constant T, or coupled char combustor).

Sand-supply mode (external constant T, or coupled char combustor).

public CFBSandMode SandMode { get; set; }
Public Property SandMode As CFBSandMode

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.

public double SandToBiomassRatio { get; set; }
Public Property SandToBiomassRatio As Double

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.

public double SolidsHoldup { get; set; }
Public Property SolidsHoldup As Double

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.

public double SolidsSlipFactor { get; set; }
Public Property SolidsSlipFactor As Double

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.

public override bool SupportsDynamicMode { get; }
Public Overrides ReadOnly Property SupportsDynamicMode As Boolean

WaterCompound: Water compound name (optional; for moisture flash and combustor).

Water compound name (optional; for moisture flash and combustor).

public string WaterCompound { get; set; }
Public Property WaterCompound As String

Methods

Calculate(object): Calculates the object.

Calculates the object.

Parameter Type Description
args Object
public override void Calculate(object args = null)
Public Overrides Sub Calculate(args As Object = Nothing)

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.

public override object CloneXML()
Public Overrides Function CloneXML() As Object

CloseEditForm(): Closes the editor of this object, if it is open.

Closes the editor of this object, if it is open.

public override void CloseEditForm()
Public Overrides Sub CloseEditForm()

DeCalculate(): Decalculates the object.

Decalculates the object.

public override void DeCalculate()
Public Overrides Sub DeCalculate()

DisplayEditForm(): Opens the editor of this object.

Opens the editor of this object. A host that has no editor for it does nothing.

public override void DisplayEditForm()
Public Overrides Sub DisplayEditForm()

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
public override object GetChartModel(string name)
Public Overrides Function GetChartModel(name As String) As Object

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.

public override List<string> GetChartModelNames()
Public Overrides Function GetChartModelNames() As List(Of String)

GetDisplayDescription(): Returns the description string for this reactor type.

Returns the description string for this reactor type.

public override string GetDisplayDescription()
Public Overrides Function GetDisplayDescription() As String

GetDisplayName(): Returns the display name for this reactor type.

Returns the display name for this reactor type.

public override string GetDisplayName()
Public Overrides Function GetDisplayName() As String

GetIconBitmapBytes(): Returns the raw bytes of the icon image for this reactor.

Returns the raw bytes of the icon image for this reactor.

public override byte[] GetIconBitmapBytes()
Public Overrides Function GetIconBitmapBytes() As Byte()

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.
public override string[] GetProperties(PropertyType proptype)
Public Overrides Function GetProperties(proptype As PropertyType) As String()

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.
public override string GetPropertyUnit(string prop, IUnitsOfMeasure su = null)
Public Overrides Function GetPropertyUnit(prop As String, su As IUnitsOfMeasure = Nothing) As String

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.
public override object GetPropertyValue(string prop, IUnitsOfMeasure su = null)
Public Overrides Function GetPropertyValue(prop As String, su As IUnitsOfMeasure = Nothing) As Object

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.
public override string GetReport(IUnitsOfMeasure su, CultureInfo ci, string numberformat)
Public Overrides Function GetReport(su As IUnitsOfMeasure, ci As CultureInfo, numberformat As String) As String

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.
public override bool SetPropertyValue(string prop, object propval, IUnitsOfMeasure su = null)
Public Overrides Function SetPropertyValue(prop As String, propval As Object, su As IUnitsOfMeasure = Nothing) As Boolean

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.

public override void UpdateEditForm()
Public Overrides Sub UpdateEditForm()

Fields

f: The classic (WinForms) editor window open for this reactor, if any.

The classic (WinForms) editor window open for this reactor, if any. Not saved with the flowsheet.

public object f
Public f As Object