Skip to content

Crystallizer

Crystallizer (cooling / evaporative / antisolvent). Splits the inlet between a Crystals outlet and a Mother-Liquor outlet. Solubility of the target solute in the solvent is described by a modified Apelblat/Van't-Hoff form: C_sat(T) [g solute / g solvent] = A + B(T - 298) + C(T - 298)^2 At steady state, mass crystallized = max(0, m_solute_in - C_sat * m_solvent_in). In Evaporative mode the solvent mass is reduced by EvaporationFraction before the check. The evaporated solvent leaves through the optional Vapor outlet (port 2) as vapor at the operating temperature, at the feed pressure or, when that is above the solvent vapor pressure at the operating temperature, at that vapor pressure (saturated vapor: the vessel runs under the vacuum at which the solvent boils at the operating temperature). With no Vapor stream connected the evaporated solvent stays in the Mother Liquor outlet, which closes the mass balance, and a warning is shown; the crystallized mass is the same in both cases. In Antisolvent mode, an additional stream adds solvent that "dilutes" the solubility by a user-set factor (SolubilityReductionByAntisolvent, 0 to 1). The heat duty is the enthalpy balance of the streams, sum of the outlets minus sum of the inlets, with the outlet enthalpies from flashes at the outlet conditions; in Evaporative mode it includes the latent heat of the evaporated solvent. It is reported in Result_Duty_kW (positive = heat added).

DWSIM.UnitOperations.UnitOperations.UnitOp_Crystallizer
Assembly DWSIM.UnitOperations.dll · Object ← BaseClass ← UnitOpBaseClass ← UnitOp_Crystallizer

At a glance

Crystallizer in the example flowsheet

Port Index Connected in the example
Inlet, material 0 Concentrate
Inlet, material 1
Outlet, material 0 Crystals
Outlet, material 1 Mother liquor
Outlet, material 2

Example

This code runs on every build of this site, and the output below is what it printed.

fs = (Flowsheet.Create("CrystallizerExample")
      .WithCompounds("Water", "Lactose", "Glucose")
      .WithPropertyPackage(PropertyPackages.NRTL))

# 55 g of lactose per 100 g of water, close to saturation at 60 C
concentrate = (fs.AddMaterialStream("Concentrate")
               .At(Q.Celsius(60.0), Q.Bar(1.5))
               .SetCompoundMassFlow("Water", 0.620)          # kg/s
               .SetCompoundMassFlow("Lactose", 0.341)
               .SetCompoundMassFlow("Glucose", 0.010))
crystals = fs.AddMaterialStream("Crystals")
liquor = fs.AddMaterialStream("Mother liquor")

cr = (fs.AddCrystallizer("CR-1")
      .WithMode(CrystallizerMode.Cooling)
      .WithSoluteCompound("Lactose")
      .WithSolventCompound("Water")
      .WithOperatingTemperature(Q.Celsius(10.0))
      # solubility in g lactose / g water = A + B (T - 298.15) + C (T - 298.15)^2,
      # fitted to 0.119 at 0 C, 0.216 at 25 C and 0.582 at 60 C
      .WithSolubilityCoefficients(0.216, 6.62e-3, 1.10e-4)
      .WithMeanCrystalSizeMicrons(250.0)
      .ConnectFeed(concentrate, 0)
      .ConnectProduct(crystals, 0)
      .ConnectProduct(liquor, 1))

fs.AutoLayout()
fs.Solve()

c = cr.Object
print(f"Solubility at 10 C = {c.Result_Csat_gg * 100.0:.1f} g/100 g water")
print(f"Crystals           = {c.Result_Cryst_kgs * 3600.0:.0f} kg/h")
print(f"Lactose yield      = {c.Result_Yield * 100.0:.1f} %")
print(f"Mother liquor      = {c.Result_MotherLiquor_kgs * 3600.0:.0f} kg/h")

Output

Solubility at 10 C = 14.1 g/100 g water
Crystals           = 912 kg/h
Lactose yield      = 74.3 %
Mother liquor      = 2584 kg/h

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
Mode - yes
Solute Compound - yes
Solvent Compound - yes
Operating T K yes
Solubility A - yes
Solubility B - yes
Solubility C - yes
Evaporation Fraction - result
Solubility Reduction By Antisolvent - result
Mean Crystal Size um yes
Solute In Feed kg/s result
Crystallized Mass kg/s result
Mother Liquor Mass kg/s result
Crystallization Yield - result
Saturation Concentration g/g result
Vapor Mass kg/s result
Heat Duty kW result

Learn more

API members

Public members declared by this class. Inherited members are documented on the base classes.

Constructors

UnitOp_Crystallizer(): Initializes a new default instance of the UnitOp_Crystallizer class.

Initializes a new default instance of the UnitOp_Crystallizer class.

public UnitOp_Crystallizer()
Public Sub New()

UnitOp_Crystallizer(string, string): Initializes a new instance of the UnitOp_Crystallizer class with a name and description.

Initializes a new instance of the UnitOp_Crystallizer class with a name and description.

Parameter Type Description
name String The name of this unit operation.
description String A brief description of this unit operation.
public UnitOp_Crystallizer(string name, string description)
Public Sub New(name As String, description As String)

Properties

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

EvaporationFraction: Gets or sets the fraction (0-1) of the solvent evaporated in Evaporative mode.

Gets or sets the fraction (0-1) of the solvent evaporated in Evaporative mode. The evaporated solvent leaves through the Vapor outlet, or stays in the Mother Liquor outlet when no Vapor stream is connected. Default 0.30.

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

IsBio: Gets a value indicating that this unit operation belongs to the Bio group of the object palette.

Gets a value indicating that this unit operation belongs to the Bio group of the object palette. Always True.

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

MeanCrystalSize_um: Gets or sets the mean crystal size, in micrometres.

Gets or sets the mean crystal size, in micrometres. Reported only; the calculation does not use it. Default 200.

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

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.

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

Mode: Gets or sets the crystallization mode: Cooling (0) solves at OperatingT_K; Evaporative (1) solves...

Gets or sets the crystallization mode: Cooling (0) solves at OperatingT_K; Evaporative (1) solves at OperatingT_K after removing EvaporationFraction of the solvent; Antisolvent (2) keeps the feed temperature and reduces the solubility by SolubilityReductionByAntisolvent. Default Cooling.

public CrystallizerMode Mode { get; set; }
Public Property Mode As CrystallizerMode

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

Gets or sets the simulation object class category (Separators). The getter always returns Separators.

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

OperatingT_K: Gets or sets the operating temperature in Cooling and Evaporative modes, in K.

Gets or sets the operating temperature in Cooling and Evaporative modes, in K. Both outlets leave at this temperature. Default 278.15.

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

Result_Cryst_kgs: Gets or sets the crystals outlet mass flow, in kg/s.

Gets or sets the crystals outlet mass flow, in kg/s. Calculated result.

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

Result_Csat_gg: Gets or sets the saturation concentration used in the last calculation, in g solute per g solvent.

Gets or sets the saturation concentration used in the last calculation, in g solute per g solvent. Calculated result.

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

Result_Duty_kW: Gets or sets the heat duty from the enthalpy balance (outlets minus inlets), in kW; positive = heat added.

Gets or sets the heat duty from the enthalpy balance (outlets minus inlets), in kW; positive = heat added. Calculated result.

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

Result_MotherLiquor_kgs: Gets or sets the mother liquor outlet mass flow, in kg/s.

Gets or sets the mother liquor outlet mass flow, in kg/s. Calculated result.

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

Result_SoluteInFeed_kgs: Gets or sets the solute mass flow in the combined feed, in kg/s.

Gets or sets the solute mass flow in the combined feed, in kg/s. Calculated result.

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

Result_Vapor_kgs: Gets or sets the Vapor outlet mass flow (evaporated solvent), in kg/s.

Gets or sets the Vapor outlet mass flow (evaporated solvent), in kg/s. Zero outside Evaporative mode and when no Vapor stream is connected. Calculated result.

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

Result_Yield: Gets or sets the crystallization yield, the crystallized mass over the solute mass in the feed (0-1).

Gets or sets the crystallization yield, the crystallized mass over the solute mass in the feed (0-1). Calculated result.

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

Sol_A: Gets or sets the constant term A of the solubility correlation C_sat = A + B(T - 298.15) + C(T - 298.15)^2, in g...

Gets or sets the constant term A of the solubility correlation C_sat = A + B(T - 298.15) + C(T - 298.15)^2, in g solute per g solvent. Default 0.35.

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

Sol_B: Gets or sets the linear coefficient B of the solubility correlation, in g solute per g solvent per K.

Gets or sets the linear coefficient B of the solubility correlation, in g solute per g solvent per K. Default 0.005.

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

Sol_C: Gets or sets the quadratic coefficient C of the solubility correlation, in g solute per g solvent per K2.

Gets or sets the quadratic coefficient C of the solubility correlation, in g solute per g solvent per K2. Default 0.

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

SolubilityReductionByAntisolvent: Gets or sets the fractional reduction (0-1) of the solute solubility in Antisolvent mode; the saturation...

Gets or sets the fractional reduction (0-1) of the solute solubility in Antisolvent mode; the saturation concentration is multiplied by (1 - value). Default 0.7.

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

SoluteCompound: Gets or sets the name of the solute compound that crystallizes.

Gets or sets the name of the solute compound that crystallizes. Required.

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

SolventCompound: Gets or sets the name of the solvent compound used as the basis of the solubility.

Gets or sets the name of the solvent compound used as the basis of the solubility. Required. Default "Water".

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

SupportsDynamicMode: Gets a value indicating whether this unit operation supports dynamic simulation mode.

Gets a value indicating whether this unit operation supports dynamic simulation mode. Always False; it is calculated as a steady-state model.

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

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

GetDisplayDescription(): Returns the localized description string for this unit operation type.

Returns the localized description string for this unit operation type.

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

GetDisplayName(): Returns the localized display name for this unit operation type.

Returns the localized display name for this unit operation type.

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

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

Returns the raw bytes of the icon image for this unit operation.

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 unit operation.

Generates a plain-text results report for this unit operation.

Parameter Type Description
su IUnitsOfMeasure The unit system used for formatting output values.
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

SolubilityAt(double): Evaluates the solubility correlation A + B(T - 298.15) + C(T - 298.15)^2, clipped at zero.

Evaluates the solubility correlation A + B(T - 298.15) + C(T - 298.15)^2, clipped at zero.

Parameter Type Description
T_K Double The temperature, in K.
public double SolubilityAt(double T_K)
Public Function SolubilityAt(T_K As Double) As Double

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 unit operation, if any.

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

public object f
Public f As Object