Claus Sulfur Recovery Unit¶
DWSIM Plus
Available with a DWSIM Plus (Patreon) subscription.
![]()
Shortcut Claus Sulfur Recovery Unit. Takes an acid-gas feed and converts a configurable fraction of the H₂S into elemental sulfur via the overall reaction 2 H₂S + O₂ → 2 S + 2 H₂O. The sulfur outlet is emitted as moles of a surrogate "Sulfur" compound; the tail gas outlet carries unreacted feed plus produced water. Air is not tracked (shortcut). Heat of reaction is exported on the energy stream.
DWSIM.UnitOperations.Refining.Claus.ClausUnitOperation
Assembly DWSIM.UnitOperations.Refining.dll · Object ← BaseClass ← UnitOpBaseClass ← ClausUnitOperation
At a glance¶

| Port | Index | Connected in the example |
|---|---|---|
| Inlet, material | 0 |
Acid-gas |
| Inlet, material | 1 |
Air |
| Outlet, material | 0 |
Sulfur |
| Outlet, material | 1 |
Tail-gas |
| Outlet, energy | 2 |
Waste-heat |
Example¶
This code runs on every build of this site, and the output below is what it printed.
fs = (Flowsheet.Create("ClausExample")
.WithCompounds("Hydrogen sulfide", "Carbon dioxide", "Water", "Oxygen", "Nitrogen", "Sulfur")
.WithPropertyPackage(PropertyPackages.PengRobinson))
# Acid gas: 90 mol% H2S, 6 % CO2, 4 % water vapour, 100 kmol/h
acid_gas = (fs.AddMaterialStream("Acid-gas").At(Q.Celsius(50.0), Q.Bar(1.8))
.SetCompoundMolarFlow("Hydrogen sulfide", 90.0 / 3.6)
.SetCompoundMolarFlow("Carbon dioxide", 6.0 / 3.6)
.SetCompoundMolarFlow("Water", 4.0 / 3.6))
# Combustion air: enough O2 for H2S + 1/2 O2 -> S + H2O, 5 % excess
o2 = 0.5 * 90.0 * 1.05
air = (fs.AddMaterialStream("Air").At(Q.Celsius(30.0), Q.Bar(1.8))
.SetCompoundMolarFlow("Oxygen", o2 / 3.6)
.SetCompoundMolarFlow("Nitrogen", o2 * 79.0 / 21.0 / 3.6))
sulfur = fs.AddMaterialStream("Sulfur")
tail_gas = fs.AddMaterialStream("Tail-gas")
heat = fs.AddEnergyStream("Waste-heat")
sru = (fs.AddClausSRU("SRU-1")
.WithSulfurRecovery(0.97)
.WithOperatingTemperature(Q.Celsius(150.0)) # outlet temperature after the condensers
.WithOperatingPressure(Q.Bar(1.5))
.ConnectFeed(acid_gas, 0).ConnectFeed(air, 1)
.ConnectProduct(sulfur, 0).ConnectProduct(tail_gas, 1))
# The waste-heat duty leaves through outlet port 2
sru.ConnectEnergyProduct(heat, 2)
fs.AutoLayout()
fs.Solve()
h2s_in = acid_gas.Object.Phases[0].Compounds["Hydrogen sulfide"].MolarFlow # mol/s
h2s_out = tail_gas.Object.Phases[0].Compounds["Hydrogen sulfide"].MolarFlow
print(f"Sulfur produced = {sulfur.MassFlowKgPerSecond * 86.4:.1f} t/d")
print(f"Sulfur recovery = {100.0 * (1.0 - h2s_out / h2s_in):.1f} %")
print(f"H2S in tail gas = {tail_gas.OverallMoleFraction('Hydrogen sulfide') * 100.0:.2f} mol%")
print(f"Tail gas flow = {tail_gas.MassFlowKgPerSecond * 3600.0:.0f} kg/h")
print(f"Waste heat = {heat.EnergyFlowKW:.0f} kW")
Output
Sulfur produced = 67.2 t/d
Sulfur recovery = 97.0 %
H2S in tail gas = 0.96 mol%
Tail gas flow = 7095 kg/h
Waste heat = 5335 kW
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 |
|---|---|---|---|
Operating Temperature |
K | yes | |
Operating Pressure |
Pa | yes | |
Sulfur Recovery Fraction |
NF | yes | |
Feed Mass Flow |
kg/s | result | |
Sulfur Mass Flow |
kg/s | result | |
Tail Gas Mass Flow |
kg/s | result | |
Waste Heat Duty |
kW | result |
Learn more¶
-
User guide
API members¶
Public members declared by this class. Inherited members are documented on the base classes.
Constructors¶
Properties¶
ComponentDescription: Gets or sets the CAPE-OPEN component description for this unit operation.
Gets or sets the CAPE-OPEN component description for this unit operation.
Config: Gets or sets the configuration of this Claus sulfur recovery unit: the operating temperature and pressure, sulfur...
Gets or sets the configuration of this Claus sulfur recovery unit: the operating temperature and pressure, sulfur recovery fraction, heat release per mole of H2S, and the names of the H2S, sulfur surrogate, water and oxygen compounds.
IsRefining: Gets a value indicating that this unit operation belongs to the refining group.
Gets a value indicating that this unit operation belongs to the refining group. Always true; the object palette uses it to list the unit under the Refinery category.
MobileCompatible: Gets a value indicating whether this unit operation is compatible with mobile interfaces.
Gets a value indicating whether this unit operation is compatible with mobile interfaces. Always false.
ObjectClass: Gets the simulation object class category (Reactors).
Gets the simulation object class category (Reactors).
Prefix: Gets the default name prefix for this unit operation ('SRU-').
Gets the default name prefix for this unit operation ("SRU-").
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.
CreateConnectors(): Creates the graphic connector definitions on the flowsheet: two inlets (Acid Gas and Combustion Air) on the left...
Creates the graphic connector definitions on the flowsheet: two inlets (Acid Gas and Combustion Air) on the left, two outlets (Sulfur and Tail Gas) on the right, and a Waste Heat energy outlet.
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.
Draw(object): Draws the unit operation icon on the given SkiaSharp canvas.
Draws the unit operation icon on the given SkiaSharp canvas. Draw mode 2 uses the embedded PNG image (falling back to the vector icon if it cannot be loaded), draw mode 1 draws the vector icon as a silhouette, and other modes draw the vector icon.
| Parameter | Type | Description |
|---|---|---|
g |
Object |
The SkiaSharp canvas (SKCanvas). |
GetDisplayDescription(): Returns the description string for this unit operation type.
Returns the description string for this unit operation type.
GetDisplayName(): Returns the display name for this unit operation type.
Returns the display name for this unit operation type.
GetIconBitmapBytes(): Returns the raw bytes of the icon image for this unit operation, rendered from the vector icon at 64 x 64 pixels.
Returns the raw bytes of the icon image for this unit operation, rendered from the vector icon at 64 x 64 pixels.
GetPreferredGraphicObjectHeight(): Returns the preferred height of the flowsheet graphic object, in pixels.
Returns the preferred height of the flowsheet graphic object, in pixels.
GetPreferredGraphicObjectWidth(): Returns the preferred width of the flowsheet graphic object, in pixels.
Returns the preferred width of the flowsheet graphic object, in pixels.
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. |
LoadData(List<XElement>): Restores the unit operation state from a list of XML elements previously produced by SaveData.
Restores the unit operation state from a list of XML elements previously produced by SaveData.
| Parameter | Type | Description |
|---|---|---|
data |
List<XElement> |
The list of XElement objects containing serialized state. |
PopulateEditorPanel(object): Populates the cross-platform (Avalonia) editor panel with controls: buttons that open the configuration and results...
Populates the cross-platform (Avalonia) editor panel with controls: buttons that open the configuration and results forms. Other container types are ignored.
| Parameter | Type | Description |
|---|---|---|
ctner |
Object |
The editor panel (layout container) to populate. |
ReturnInstance(string): Creates and returns a new instance for deserialization.
Creates and returns a new instance for deserialization.
| Parameter | Type | Description |
|---|---|---|
typename |
String |
The type name to instantiate (not used). |
SaveData(): Serializes the unit operation state to a list of XML elements for persistence.
Serializes the unit operation state to a list of XML elements for persistence.
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¶