Skip to content

Chromatography Column

Chromatography column (simplified Langmuir-binding + user-specified resolution model). For each compound, the user specifies a "RecoveryToProduct" fraction (0 to 1) - for BindElute mode, this is the elution yield; for FlowThrough, it's the pass-through fraction. ApplyChemistryDefaults fills the binding capacity, the Thomas rate constant and the recoveries with typical values for the selected chemistry; the editors and the FluentAPI call it when the chemistry changes. The column's dynamic binding capacity is checked against the target load of one cycle (feed rate times CycleLoadTime_s).

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

At a glance

Chromatography Column in the example flowsheet

Port Index Connected in the example
Inlet, material 0 Clarified lysate
Outlet, material 0 Eluate
Outlet, material 1 Flow-through

Example

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

# Casein stands in for the target protein; glucose is the impurity to clear.
fs = (Flowsheet.Create("ChromatographyExample")
      .WithCompounds("Water", "Casein", "Glucose")
      .WithPropertyPackage(PropertyPackages.NRTL))

lysate = (fs.AddMaterialStream("Clarified lysate")
          .At(Q.Celsius(20.0), Q.Bar(3.0))
          .SetCompoundMassFlow("Water", 0.9850)            # kg/s
          .SetCompoundMassFlow("Casein", 0.0100)
          .SetCompoundMassFlow("Glucose", 0.0050))
eluate = fs.AddMaterialStream("Eluate")
flowthrough = fs.AddMaterialStream("Flow-through")

col = (fs.AddChromatographyColumn("IEX-1")
       .WithMode(ChromatographyMode.BindElute)
       .WithChemistry(ChromatographyChemistry.IonExchange)
       .WithColumnVolumeLiters(200.0)
       .WithDynamicBindingCapacityGPerL(60.0)
       .WithDefaultRecoveryToProduct(0.25)       # elution buffer volume, as a share of the load
       .WithRecoveryToProduct("Casein", 0.92)    # elution yield of the protein
       .WithRecoveryToProduct("Glucose", 0.01)
       .ConnectFeed(lysate, 0)
       .ConnectProduct(eluate, 0)
       .ConnectProduct(flowthrough, 1))

fs.AutoLayout()
fs.Solve()

p_in = lysate.Object.Phases[0].Compounds
p_out = eluate.Object.Phases[0].Compounds
protein, sugar = p_out["Casein"].MassFlow, p_out["Glucose"].MassFlow
print(f"Protein recovery     = {protein / p_in['Casein'].MassFlow * 100.0:.1f} %")
feed_purity = p_in["Casein"].MassFlow / (p_in["Casein"].MassFlow + p_in["Glucose"].MassFlow)
print(f"Protein purity       = {protein / (protein + sugar) * 100.0:.1f} % of solutes (feed {feed_purity * 100.0:.1f} %)")
print(f"Concentration factor = {p_out['Casein'].MassFraction / p_in['Casein'].MassFraction:.1f}")
print(f"Eluate flow          = {eluate.MassFlowKgPerSecond * 3600.0:.0f} kg/h")

Output

Protein recovery     = 92.0 %
Protein purity       = 99.5 % of solutes (feed 66.7 %)
Concentration factor = 3.6
Eluate flow          = 920 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
Chemistry - yes
Target Compound - yes
Column Volume L yes
Dynamic Binding Capacity g/L yes
Default Recovery To Product - yes
Cycle Load Time s yes
Thomas Rate Constant L/(g.s) yes
Loading Time s yes
Feed Mass kg/s result
Product Mass kg/s result
Waste Mass kg/s result
Target Recovery - result
Load Per Cycle kg result
Binding Capacity kg result
Load Ratio - result
Time To Capacity s result
Load Volume Fraction - result
Saturated - result

Learn more

API members

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

Constructors

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

Initializes a new default instance of the UnitOp_Chromatography class.

public UnitOp_Chromatography()
Public Sub New()

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

Initializes a new instance of the UnitOp_Chromatography 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_Chromatography(string name, string description)
Public Sub New(name As String, description As String)

Properties

Chemistry: Gets or sets the resin chemistry: IonExchange (default), Affinity, HIC (hydrophobic interaction), SizeExclusion or...

Gets or sets the resin chemistry: IonExchange (default), Affinity, HIC (hydrophobic interaction), SizeExclusion or MixedMode. The calculation does not read it; the editors and the FluentAPI WithChemistry call ApplyChemistryDefaults when it changes, which fills the binding capacity, the Thomas rate constant and the recoveries with typical values for the chemistry. Setting the property directly keeps the current values.

public ChromatographyChemistry Chemistry { get; set; }
Public Property Chemistry As ChromatographyChemistry

ColumnVolume_L: Gets or sets the packed column (resin bed) volume, in L.

Gets or sets the packed column (resin bed) volume, in L. Default 10 L.

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

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

CycleLoadTime_s: Gets or sets the duration of the load step of one cycle, in s.

Gets or sets the duration of the load step of one cycle, in s. The target load per cycle is the target feed mass flow times this time, and Result_LoadRatio divides it by the binding capacity. Default 1 s, which reproduces the load ratio of earlier versions (target feed rate in kg/s over capacity in kg); set the real load time of the cycle. Result_TimeToCapacity_s gives the time that fills the capacity.

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

DefaultRecoveryToProduct: Gets or sets the fraction (0 to 1) of each compound sent to the Product outlet when the compound has no entry in...

Gets or sets the fraction (0 to 1) of each compound sent to the Product outlet when the compound has no entry in RecoveryToProduct. Default 0.05.

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

DynamicBindingCapacity_gL: Gets or sets the dynamic binding capacity of the resin, in g per L of column volume.

Gets or sets the dynamic binding capacity of the resin, in g per L of column volume. Default 40 g/L. Used for the load ratio check and as q_max in the Thomas breakthrough model.

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

IsBio: Gets a value that marks this unit operation as a bioprocess unit.

Gets a value that marks this unit operation 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

LoadingTime_s: Loading time (s) of the dynamic breakthrough simulation (BindElute_Dynamic).

Loading time (s) of the dynamic breakthrough simulation (BindElute_Dynamic). 0 = auto (to about 99 % saturation).

public double LoadingTime_s { get; set; }
Public Property LoadingTime_s 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 operating mode: BindElute (0, default), FlowThrough (1) or BindElute_Dynamic (2).

Gets or sets the operating mode: BindElute (0, default), FlowThrough (1) or BindElute_Dynamic (2). The compound split always uses the per-compound recoveries; BindElute_Dynamic also builds a Thomas-model breakthrough curve for the loading step.

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

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

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

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

RecoveryFromChemistryDefaults: Gets or sets the names of the compounds whose RecoveryToProduct entry was filled by...

Gets or sets the names of the compounds whose RecoveryToProduct entry was filled by ApplyChemistryDefaults. The editors label these rows as chemistry defaults; SetRecoveryToProduct takes a compound off the list when the user sets its recovery. The calculation does not read it. Empty by default, so files saved before it existed show every entry as user-set.

public List<string> RecoveryFromChemistryDefaults { get; set; }
Public Property RecoveryFromChemistryDefaults As List(Of String)

RecoveryToProduct: Gets or sets the per-compound fraction (0 to 1) of the feed mass sent to the Product outlet, keyed by compound name.

Gets or sets the per-compound fraction (0 to 1) of the feed mass sent to the Product outlet, keyed by compound name. The remainder goes to the Waste outlet. In bind-elute mode this is the elution yield; in flow-through mode it is the pass-through fraction.

public Dictionary<string, double> RecoveryToProduct { get; set; }
Public Property RecoveryToProduct As Dictionary(Of String, Double)

ResinDensity_gL: Resin bulk density, in g/L of column.

Resin bulk density, in g/L of column. Not used by the calculation: the dynamic binding capacity is per litre of column, so the Thomas capacity term is q_max (g/L) times the column volume (L) and the resin density cancels. Kept so older files load.

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

Result_BindingCapacity_kg: Gets or sets the calculated binding capacity of the column, in kg: dynamic binding capacity (g/L) times column...

Gets or sets the calculated binding capacity of the column, in kg: dynamic binding capacity (g/L) times column volume (L) / 1000.

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

Result_FeedMass_kgs: Gets or sets the calculated feed mass flow, in kg/s.

Gets or sets the calculated feed mass flow, in kg/s.

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

Result_LoadPerCycle_kg: Gets or sets the calculated target load per cycle, in kg: target feed mass flow times...

Gets or sets the calculated target load per cycle, in kg: target feed mass flow times CycleLoadTime_s.

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

Result_LoadRatio: Gets or sets the calculated load ratio (dimensionless): target load per cycle (target feed mass flow times...

Gets or sets the calculated load ratio (dimensionless): target load per cycle (target feed mass flow times CycleLoadTime_s, in kg) divided by the column binding capacity (dynamic binding capacity times column volume, in kg). Values above 1 mean the column is saturated.

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

Result_LoadVolumeFraction: Gets or sets the calculated feed volume loaded per cycle as a fraction of the column volume: feed volumetric flow...

Gets or sets the calculated feed volume loaded per cycle as a fraction of the column volume: feed volumetric flow times CycleLoadTime_s over the column volume. Size exclusion runs take 0.02 to 0.05 (2 to 5 % of CV).

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

Result_ProductMass_kgs: Gets or sets the calculated Product outlet mass flow, in kg/s.

Gets or sets the calculated Product outlet mass flow, in kg/s.

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

Result_Saturated: Gets or sets a value indicating whether the last calculation exceeded the binding capacity (load ratio above 1).

Gets or sets a value indicating whether the last calculation exceeded the binding capacity (load ratio above 1).

public bool Result_Saturated { get; set; }
Public Property Result_Saturated As Boolean

Result_TargetRecovery: Gets or sets the calculated recovery (0 to 1) of the target compounds in the Product outlet.

Gets or sets the calculated recovery (0 to 1) of the target compounds in the Product outlet. The target is TargetCompound, or every compound above 5000 g/mol when it is empty.

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

Result_TimeToCapacity_s: Gets or sets the calculated load time that fills the binding capacity, in s: binding capacity over target feed mass...

Gets or sets the calculated load time that fills the binding capacity, in s: binding capacity over target feed mass flow. 0 when the feed has no target.

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

Result_WasteMass_kgs: Gets or sets the calculated Waste outlet mass flow, in kg/s.

Gets or sets the calculated Waste outlet mass flow, in kg/s.

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

SEC_ExclusionLimit_gmol: Gets or sets the exclusion limit of the size exclusion resin, in g/mol: compounds at or above it elute in the void...

Gets or sets the exclusion limit of the size exclusion resin, in g/mol: compounds at or above it elute in the void volume (Kav = 0). Default 600 000 g/mol (Superdex 200 class, globular proteins). Read only by ApplyChemistryDefaults for SizeExclusion.

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

SEC_PermeationLimit_gmol: Gets or sets the total permeation limit of the size exclusion resin, in g/mol: compounds at or below it reach the...

Gets or sets the total permeation limit of the size exclusion resin, in g/mol: compounds at or below it reach the whole pore volume (Kav = 1). Default 10 000 g/mol (Superdex 200 class). Read only by ApplyChemistryDefaults for SizeExclusion.

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

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.

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

TargetCompound: Gets or sets the name of the target compound (the product the column captures or polishes).

Gets or sets the name of the target compound (the product the column captures or polishes). Empty (default): every compound above 5000 g/mol counts as a target for the recovery, the load ratio and the Thomas breakthrough. ApplyChemistryDefaults gives the target the chemistry yield and treats the other macromolecules as impurities.

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

ThomasRateConstant_Lgs: Thomas rate constant k_Th, in L/(g.s).

Thomas rate constant k_Th, in L/(g.s). Typical: 1e-4 to 1e-2. Used by BindElute_Dynamic only.

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

Methods

ApplyChemistryDefaults(): Fills DynamicBindingCapacity_gL, ThomasRateConstant_Lgs and...

Fills DynamicBindingCapacity_gL, ThomasRateConstant_Lgs and the RecoveryToProduct entries with typical platform values for Chemistry (see GetChemistryDefaults). The editors and the FluentAPI WithChemistry call it when the chemistry changes; Calculate never does, so a saved flowsheet keeps the values it was saved with. Recoveries: the target (TargetCompound, or every compound above 5000 g/mol when it is empty) gets the chemistry step yield; host cell proteins (a compound named HCP or host cell protein) and, with a named target, the other compounds above 5000 g/mol get 10^-LRV. Size exclusion sets the binding capacity to 0 and gives every compound 1 - Kav (SizeExclusionKav). Water, and the small solutes outside size exclusion, keep their entries or DefaultRecoveryToProduct. Entries a previous call filled (those on RecoveryFromChemistryDefaults) are removed first, so a compound the new chemistry does not cover returns to DefaultRecoveryToProduct; entries the user typed stay. Each compound it fills goes on RecoveryFromChemistryDefaults.

public void ApplyChemistryDefaults()
Public Sub ApplyChemistryDefaults()

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)

ChemistryDefaultRecovery(ICompoundConstantProperties): Returns the recovery to product that ApplyChemistryDefaults gives a compound under the...

Returns the recovery to product that ApplyChemistryDefaults gives a compound under the current Chemistry, or Nothing when the defaults leave the compound alone (water, and small solutes outside size exclusion).

Parameter Type Description
compound ICompoundConstantProperties The compound.
public double? ChemistryDefaultRecovery(ICompoundConstantProperties compound)
Public Function ChemistryDefaultRecovery(compound As ICompoundConstantProperties) As Double?

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 the breakthrough curve (against bed volumes) or of the cumulative load (against time).

Builds an OxyPlot model of the breakthrough curve (against bed volumes) or of the cumulative load (against time).

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 curves of the last dynamic bind-elute run.

Chart names the PFD chart object can embed: the curves of the last dynamic bind-elute run.

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

GetChemistryDefaults(ChromatographyChemistry): Returns the typical platform values of a resin chemistry: dynamic binding capacity, Thomas rate constant, target...

Returns the typical platform values of a resin chemistry: dynamic binding capacity, Thomas rate constant, target step yield and impurity log reduction.

Parameter Type Description
chemistry ChromatographyChemistry The resin chemistry.
public static ChromatographyChemistryDefaults GetChemistryDefaults(ChromatographyChemistry chemistry)
Public Shared Function GetChemistryDefaults(chemistry As ChromatographyChemistry) As ChromatographyChemistryDefaults

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

Returns the description string for this unit operation type.

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

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

Returns the 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 (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

RecoveryFor(string): Returns the fraction of a compound sent to the Product outlet: its entry in RecoveryToProduct...

Returns the fraction of a compound sent to the Product outlet: its entry in RecoveryToProduct, or DefaultRecoveryToProduct when it has none, clamped to 0 to 1. Calculate splits the feed with it and the editors show it in the recovery grids, so both always agree.

Parameter Type Description
compName String The compound name.
public double RecoveryFor(string compName)
Public Function RecoveryFor(compName As String) As Double

RecoverySource(string): Returns where the recovery of a compound comes from, as the editors label it: 'user-set' (an entry the user typed)...

Returns where the recovery of a compound comes from, as the editors label it: "user-set" (an entry the user typed), "chemistry default" (an entry filled by ApplyChemistryDefaults) or "default recovery" (no entry; DefaultRecoveryToProduct applies).

Parameter Type Description
compName String The compound name.
public string RecoverySource(string compName)
Public Function RecoverySource(compName 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

SetRecoveryToProduct(string, double): Sets the recovery to product of one compound as a user value: writes its RecoveryToProduct...

Sets the recovery to product of one compound as a user value: writes its RecoveryToProduct entry and takes it off RecoveryFromChemistryDefaults. The editors and the FluentAPI WithRecoveryToProduct call it.

Parameter Type Description
compName String The compound name.
value Double The fraction (0 to 1) of the compound feed mass sent to the Product outlet.
public void SetRecoveryToProduct(string compName, double value)
Public Sub SetRecoveryToProduct(compName As String, value As Double)

SizeExclusionKav(double): Returns the size exclusion partition coefficient Kav for a molecular weight: linear in log10(MW) from 1 at...

Returns the size exclusion partition coefficient Kav for a molecular weight: linear in log10(MW) from 1 at SEC_PermeationLimit_gmol to 0 at SEC_ExclusionLimit_gmol, clamped to 0 to 1 (Carta and Jungbauer 2010).

Parameter Type Description
molarWeight Double The molecular weight, in g/mol.
public double SizeExclusionKav(double molarWeight)
Public Function SizeExclusionKav(molarWeight 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