Skip to content

CO2 Transport (Span-Wagner / PR)

DWSIM Plus

Available with a DWSIM Plus (Patreon) subscription.

Property package for CO2-rich streams in pipelines, compression and shipping: the Span-Wagner reference equation of state for pure CO2, and Peng-Robinson with binary parameters for the usual pipeline impurities for CO2 with impurities.

DWSIM.Extensions.PropertyPackages.CCUS.Transport.CO2TransportPropertyPackage
Assembly DWSIM.Extensions.PropertyPackages.CCUS.dll · Object ← PropertyPackage ← CO2TransportPropertyPackage
Name in the flowsheet CO2 Transport (Span-Wagner/PR) · FluentAPI PropertyPackages.Plus.CO2Transport

Scope

The package is for CO2-rich streams in pipeline transport, compression trains and ship transport: dense-phase and gas-phase properties, phase envelopes of CO2 with impurities, and the detection of two-phase flow. It switches between two equations of state on the CO2 content of the stream:

  • Pure CO2 (mole fraction above 0.9999): the Span-Wagner (1996) reference equation of state, a 42-term Helmholtz energy formulation (7 polynomial, 27 exponential and 8 Gaussian terms) with Tc = 304.1282 K, Pc = 73.773 bar and ρc = 467.6 kg/m3. Density, fugacity, enthalpy and entropy come from the Helmholtz energy and its derivatives.
  • CO2 with impurities: Peng-Robinson with binary parameters for the usual pipeline impurities, which the package editor lists with their sources.
Pair kij Pair kij
CO2-N2 0.0070 CO2-CH4 0.0919
CO2-O2 0.1140 CO2-H2 0.0920
CO2-Ar 0.1150 CO2-CO 0.0490
CO2-H2S 0.0974 CO2-NO2 0.0500
CO2-H2O 0.1896 N2-O2 -0.0119
CO2-SO2 0.0440 N2-Ar -0.0060
N2-H2 -0.0200

The CO2-H2O value comes from Spycher, Pruess and Ennis-King (2003). Pairs not in the table have kij = 0. The package also offers IsTwoPhase(T, P) and MinimumOperatingPressure(T, safetyFactor) for pipeline checks on the stream composition.

Recommended envelope. Temperature 216 to 1100 K and pressure up to 800 MPa (the range of Span-Wagner); CO2 purity above 90 mol% for pipeline work; impurities N2, O2, Ar, H2S, H2O, SO2, CH4, H2, CO and NO2.

Validation. The pure CO2 density from Span-Wagner matches the NIST WebBook data: 228.8 kg/m3 at 350 K and 100 bar (supercritical, +0.003 %) and 938.2 kg/m3 at 280 K and 100 bar (liquid, +0.001 %). The validation cases also cover the saturated liquid and vapor densities from 220 to 300 K, the region near the critical point, a CO2/N2/O2 pipeline mixture and a compression from 10 to 100 bar.

Limitations

  • A stream with more than 0.01 mol% of impurities leaves Span-Wagner for Peng-Robinson; the mixture properties carry the accuracy of a cubic equation of state and of the general methods listed under the property methods below.
  • The viscosity and thermal conductivity of the streams come from the general correlations of DWSIM listed there.

Example

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

fs = (Flowsheet.Create("CO2TransportExample")
      .WithCompounds("Carbon dioxide", "Nitrogen", "Argon", "Methane")
      .WithPropertyPackage(PropertyPackages.Plus.CO2Transport))

def pure(name):                           # pure CO2: Span-Wagner
    return fs.AddMaterialStream(name).SetCompoundMolarFlow("Carbon dioxide", 100.0)

def mixture(name):                        # 96 % CO2 with N2, Ar and CH4: Peng-Robinson
    return (fs.AddMaterialStream(name)
            .SetCompoundMolarFlow("Carbon dioxide", 96.0).SetCompoundMolarFlow("Nitrogen", 2.0)
            .SetCompoundMolarFlow("Argon", 1.0).SetCompoundMolarFlow("Methane", 1.0))

dense = pure("CO2, 110 bar").At(Q.Celsius(25.0), Q.Bar(110.0))
gas = pure("CO2, 30 bar").At(Q.Celsius(25.0), Q.Bar(30.0))
pipeline = mixture("Mixture, 110 bar").At(Q.Celsius(25.0), Q.Bar(110.0))
dew25 = mixture("Mixture, dew point at 25 C").WithTemperature(Q.Celsius(25.0)).WithVaporFraction(1.0)
bubble60 = mixture("Mixture, bubble point at 60 bar").WithPressure(Q.Bar(60.0)).WithVaporFraction(0.0)
dew60 = mixture("Mixture, dew point at 60 bar").WithPressure(Q.Bar(60.0)).WithVaporFraction(1.0)
fs.Solve()

for b in (dense, gas, pipeline):
    s = b.Object
    i = 2 if s.Phases[2].Properties.molarfraction else 3     # vapor or liquid
    p = s.Phases[i].Properties
    print(f"{s.GraphicObject.Tag:16}: {'vapor' if i == 2 else 'liquid'}, density {p.density:.1f} kg/m3, "
          f"viscosity {p.viscosity * 1e6:.1f} uPa s")
print(f"Mixture dew pressure at 25 C = {dew25.Object.Phases[0].Properties.pressure / 1e5:.1f} bar")
print(f"Mixture at 60 bar: two phases from {bubble60.Object.Phases[0].Properties.temperature - 273.15:.1f} C "
      f"(bubble) to {dew60.Object.Phases[0].Properties.temperature - 273.15:.1f} C (dew)")

Output

CO2, 110 bar    : liquid, density 832.6 kg/m3, viscosity 76.7 uPa s
CO2, 30 bar     : vapor, density 64.1 kg/m3, viscosity 15.5 uPa s
Mixture, 110 bar: liquid, density 735.2 kg/m3, viscosity 75.0 uPa s
Mixture dew pressure at 25 C = 70.5 bar
Mixture at 60 bar: two phases from 9.5 C (bubble) to 18.7 C (dew)

DWSIM 10.2.11.0, generated 2026-10-08.

Property methods

How the package calculates each property, as it reports it in PropertyMethodsInfo (the property package editor shows the same list).

Property Method
Vapor fugacity Span-Wagner EOS (pure CO2) / Peng-Robinson EOS with the package kij (mixtures)
Liquid fugacity Span-Wagner EOS (pure CO2) / Peng-Robinson EOS with the package kij (mixtures)
Vapor enthalpy, entropy, Cp/Cv Span-Wagner EOS (pure CO2) / Ideal Gas (mixtures)
Liquid enthalpy, entropy, Cp/Cv Span-Wagner EOS (pure CO2) / Ideal Gas less the heats of vaporization (mixtures)
Vapor density Span-Wagner EOS (pure CO2) / Ideal Gas (mixtures)
Liquid density Span-Wagner EOS (pure CO2) / Peng-Robinson EOS with the package kij (mixtures)
Vapor viscosity Fenghour, Wakeham and Vesovic 1998 (pure CO2) / Experimental / Lucas / Jossi-Stiel-Thodos (mixtures)
Liquid viscosity Fenghour, Wakeham and Vesovic 1998 (pure CO2) / Experimental / Letsou-Stiel (mixtures)
Vapor thermal conductivity Vesovic et al. 1990 (pure CO2) / Experimental / Ely-Hanley (mixtures)
Liquid thermal conductivity Vesovic et al. 1990 (pure CO2) / Experimental / Latini (mixtures)
Surface tension Experimental / Brock-Bird
Solid density Experimental Data / User-Defined
Solid enthalpy, entropy, Cp/Cv Experimental Solid Cp / From Liquid Phase Enthalpy + Enthalpy of Fusion

Default flash algorithm: Universal.

Configuration saved with the flowsheet

The package writes its settings to the simulation file (SaveData) and reads them back on load (LoadData). The elements below are the ones this package adds to those of every property package, as written for the example.

This package adds no elements of its own.

Settings common to every property package, as saved for the example
Element Value
Type 76 characters
ComponentName CO2 Transport (Span-Wagner/PR)
ComponentDescription Span-Wagner EOS for pure CO2, PR for CO2-rich mixtures.
Tag CO2 Transport (Span-Wagner/PR)
UseHenryConstants true
AutoEstimateMissingNRTLUNIQUACParameters true
UseImmiscibleListForLiquid2InitialEstimates true
SingleCompoundCheckThreshold 0.99999
OverrideKvalFugCoeff false
OverrideEnthalpyCalculation false
OverrideEntropyCalculation false
LiquidDensityCalculationMode_Subcritical Rackett_and_ExpData
LiquidDensityCalculationMode_Supercritical Rackett_and_ExpData
LiquidDensity_CorrectExpDataForPressure true
LiquidDensity_UsePenelouxVolumeTranslation true
LiquidViscosityCalculationMode_Subcritical ExpData
LiquidViscosityCalculationMode_Supercritical Letsou_Stiel
LiquidViscosity_CorrectExpDataForPressure true
LiquidViscosity_MixingRule MoleAverage
VaporPhaseFugacityCalculationMode Ideal
SolidPhaseFugacityCalculationMethod FromLiquidFugacity
SolidPhaseFugacity_UseIdealLiquidPhaseFugacity false
SolidPhaseEnthalpy_UsesCp false
EnthalpyEntropyCpCvCalculationMode LeeKesler
LiquidEnthalpyEntropyCpCvCalculationMode_EOS EOS
LiquidFugacity_UsePoyntingCorrectionFactor true
ActivityCoefficientModels_IgnoreMissingInteractionParameters false
IgnoreVaporFractionLimit false
IgnoreSalinityLimit false
CalculateAdditionalMaterialStreamProperties true
FlashCalculationApproach NestedLoops
DisplayMissingCompoundPropertiesWarning false
ForcedSolids []
PropertyOverrides {}
FlashSettings 36 Setting entries

Learn more

API members

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

Constructors

CO2TransportPropertyPackage()
public CO2TransportPropertyPackage()
Public Sub New()

CO2TransportPropertyPackage(bool)
Parameter Type Description
comode Boolean
public CO2TransportPropertyPackage(bool comode)
Public Sub New(comode As Boolean)

Properties

FlashBase: DWSIM's flash, with the starting pressure of a bubble-point or two-phase TV flash of a mixture taken from Wilson...

DWSIM's flash, with the starting pressure of a bubble-point or two-phase TV flash of a mixture taken from Wilson K-values (see TransportFlash).

public override FlashAlgorithm FlashBase { get; }
Public Overrides ReadOnly Property FlashBase As FlashAlgorithm

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

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

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

Methods

AUX_LIQDENS(double, Array, double, double, bool)
Parameter Type Description
T Double
Vx Array
P Double
Pvp Double
EXPERIMENT Boolean
public override double AUX_LIQDENS(double T, Array Vx, double P = 0, double Pvp = 0, bool EXPERIMENT = false)
Public Overrides Function AUX_LIQDENS(T As Double, Vx As Array, P As Double = 0, Pvp As Double = 0, EXPERIMENT As Boolean = False) As Double

AUX_VAPDENS(double, double)
Parameter Type Description
T Double
P Double
public override double AUX_VAPDENS(double T, double P)
Public Overrides Function AUX_VAPDENS(T As Double, P As Double) As Double

AUX_Z(double[], double, double, PhaseName)
Parameter Type Description
Vx Double[]
T Double
P Double
state PhaseName
public override double AUX_Z(double[] Vx, double T, double P, PhaseName state)
Public Overrides Function AUX_Z(Vx As Double(), T As Double, P As Double, state As PhaseName) As Double

CalculateCO2ThermalConductivity(double, double)
Parameter Type Description
T Double
P Double
public double CalculateCO2ThermalConductivity(double T, double P)
Public Function CalculateCO2ThermalConductivity(T As Double, P As Double) As Double

CalculateCO2Viscosity(double, double)
Parameter Type Description
T Double
P Double
public double CalculateCO2Viscosity(double T, double P)
Public Function CalculateCO2Viscosity(T As Double, P As Double) As Double

Clone()
public override PropertyPackage Clone()
Public Overrides Function Clone() As PropertyPackage

DW_CalcCompPartialVolume(Phase, double, double)
Parameter Type Description
phase Phase
T Double
P Double
public override void DW_CalcCompPartialVolume(Phase phase, double T, double P)
Public Overrides Sub DW_CalcCompPartialVolume(phase As Phase, T As Double, P As Double)

DW_CalcdKdComposition(double[], double[], double, double, State, string): Composition (mole-number) derivative of the equilibrium K-values, d(K_i)/dn_j, with respect to the mole numbers of...

Composition (mole-number) derivative of the equilibrium K-values, d(K_i)/dn_j, with respect to the mole numbers of the phase indicated by withRespectTo (State.Liquid perturbs Vx, State.Vapor perturbs Vy), on a total-moles = 1 basis. Returns an (nc x nc) matrix. Base implementation is a finite difference; EOS/activity packages override it using the analytical d(ln phi)/dn (or d(ln gamma)/dx) building blocks.

Parameter Type Description
Vx Double[]
Vy Double[]
T Double
P Double
withRespectTo State
type String
public override double[,] DW_CalcdKdComposition(double[] Vx, double[] Vy, double T, double P, State withRespectTo, string type = "LV")
Public Overrides Function DW_CalcdKdComposition(Vx As Double(), Vy As Double(), T As Double, P As Double, withRespectTo As State, type As String = "LV") As Double(,)

DW_CalcdKdT(double[], double[], double, double, string)
Parameter Type Description
Vx Double[]
Vy Double[]
T Double
P Double
type String
public override double[] DW_CalcdKdT(double[] Vx, double[] Vy, double T, double P, string type = "LV")
Public Overrides Function DW_CalcdKdT(Vx As Double(), Vy As Double(), T As Double, P As Double, type As String = "LV") As Double()

DW_CalcdLnFugCoeffdn(double[], double, double, State): Composition (mole-number) derivative of the natural logarithm of the fugacity coefficients, d(ln phi_i)/dn_j, for...

Composition (mole-number) derivative of the natural logarithm of the fugacity coefficients, d(ln phi_i)/dn_j, for the given phase, evaluated on a total-moles = 1 basis. Returns an (nc x nc) matrix. Base implementation is a finite difference in mole numbers; EOS/activity packages override this with the closed-form partial-molar expression.

Parameter Type Description
Vx Double[]
T Double
P Double
st State
public override double[,] DW_CalcdLnFugCoeffdn(double[] Vx, double T, double P, State st)
Public Overrides Function DW_CalcdLnFugCoeffdn(Vx As Double(), T As Double, P As Double, st As State) As Double(,)

DW_CalcdLnFugCoeffdT(double[], double, double, State): Temperature derivative of the natural logarithm of the fugacity coefficients, d(ln phi_i)/dT, for the given phase.

Temperature derivative of the natural logarithm of the fugacity coefficients, d(ln phi_i)/dT, for the given phase. Base implementation is a forward finite difference; EOS/activity packages override this with a closed-form expression. Distinct from DW_CalcdFugCoeffdT, which returns d(phi)/dT (not the logarithm).

Parameter Type Description
Vx Double[]
T Double
P Double
st State
public override double[] DW_CalcdLnFugCoeffdT(double[] Vx, double T, double P, State st)
Public Overrides Function DW_CalcdLnFugCoeffdT(Vx As Double(), T As Double, P As Double, st As State) As Double()

DW_CalcEnthalpy(Array, double, double, State): Calculates the enthalpy of a mixture.

Calculates the enthalpy of a mixture.

Parameter Type Description
Vx Array Vector of doubles containing the molar composition of the mixture.
T Double Temperature (K)
P Double Pressure (Pa)
st State State enum indicating the state of the mixture (liquid or vapor).
public override double DW_CalcEnthalpy(Array Vx, double T, double P, State st)
Public Overrides Function DW_CalcEnthalpy(Vx As Array, T As Double, P As Double, st As State) As Double

DW_CalcEnthalpyDeparture(Array, double, double, State): Calculates the enthalpy departure of a mixture.

Calculates the enthalpy departure of a mixture.

Parameter Type Description
Vx Array Vector of doubles containing the molar composition of the mixture.
T Double Temperature (K)
P Double Pressure (Pa)
st State State enum indicating the state of the mixture (liquid or vapor).
public override double DW_CalcEnthalpyDeparture(Array Vx, double T, double P, State st)
Public Overrides Function DW_CalcEnthalpyDeparture(Vx As Array, T As Double, P As Double, st As State) As Double

DW_CalcEntropy(Array, double, double, State): Calculates the entropy of a mixture.

Calculates the entropy of a mixture.

Parameter Type Description
Vx Array Vector of doubles containing the molar composition of the mixture.
T Double Temperature (K)
P Double Pressure (Pa)
st State State enum indicating the state of the mixture (liquid or vapor).
public override double DW_CalcEntropy(Array Vx, double T, double P, State st)
Public Overrides Function DW_CalcEntropy(Vx As Array, T As Double, P As Double, st As State) As Double

DW_CalcEntropyDeparture(Array, double, double, State): Calculates the entropy departure of a mixture.

Calculates the entropy departure of a mixture.

Parameter Type Description
Vx Array Vector of doubles containing the molar composition of the mixture.
T Double Temperature (K)
P Double Pressure (Pa)
st State State enum indicating the state of the mixture (liquid or vapor).
public override double DW_CalcEntropyDeparture(Array Vx, double T, double P, State st)
Public Overrides Function DW_CalcEntropyDeparture(Vx As Array, T As Double, P As Double, st As State) As Double

DW_CalcFugCoeff(Array, double, double, State): Calculates fugacity coefficients for the specified composition at the specified conditions.

Calculates fugacity coefficients for the specified composition at the specified conditions.

Parameter Type Description
Vx Array Vector of doubles containing the molar composition of the mixture.
T Double Temperature in K
P Double Pressure in Pa
st State Mixture state (Liquid or Vapor)
public override double[] DW_CalcFugCoeff(Array Vx, double T, double P, State st)
Public Overrides Function DW_CalcFugCoeff(Vx As Array, T As Double, P As Double, st As State) As Double()

DW_CalcPhaseProps(Phase)
Parameter Type Description
Phase Phase
public override void DW_CalcPhaseProps(Phase Phase)
Public Overrides Sub DW_CalcPhaseProps(Phase As Phase)

DW_CalcProp(string, Phase): Provides a wrapper function for CAPE-OPEN CalcProp/CalcSingleProp functions.

Provides a wrapper function for CAPE-OPEN CalcProp/CalcSingleProp functions.

Parameter Type Description
property String The property to be calculated.
phase Phase The phase where the property must be calculated for.
public override void DW_CalcProp(string property, Phase phase)
Public Overrides Sub DW_CalcProp([property] As String, phase As Phase)

GetEditingForm(): Returns the binary interaction parameter editor of this package.

Returns the binary interaction parameter editor of this package.

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

IsTwoPhase(double, double)
Parameter Type Description
T Double
P Double
public bool IsTwoPhase(double T, double P)
Public Function IsTwoPhase(T As Double, P As Double) As Boolean

MinimumOperatingPressure(double, double)
Parameter Type Description
T Double
safetyFactor Double
public double MinimumOperatingPressure(double T, double safetyFactor = 1.15)
Public Function MinimumOperatingPressure(T As Double, safetyFactor As Double = 1.15) As Double

PopulateCrossPlatformEditor(object): The package has no adjustable parameters: the panel lists the binary interaction parameters, the supported...

The package has no adjustable parameters: the panel lists the binary interaction parameters, the supported components and the model, mirroring the Windows editor.

Parameter Type Description
container Object
public override void PopulateCrossPlatformEditor(object container)
Public Overrides Sub PopulateCrossPlatformEditor(container As Object)

ReturnInstance(string)
Parameter Type Description
typename String
public override object ReturnInstance(string typename)
Public Overrides Function ReturnInstance(typename As String) As Object

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

SaveData()
public override List<XElement> SaveData()
Public Overrides Function SaveData() As List(Of XElement)

SupportsComponent(ICompoundConstantProperties)
Parameter Type Description
comp ICompoundConstantProperties
public override bool SupportsComponent(ICompoundConstantProperties comp)
Public Overrides Function SupportsComponent(comp As ICompoundConstantProperties) As Boolean

Fields

ClassId
public const string ClassId = "C4D5E6F7-8901-4A23-B456-789012345678"
Public Const ClassId As String = "C4D5E6F7-8901-4A23-B456-789012345678"