CO2 Capture (eNRTL)¶
DWSIM Plus
Available with a DWSIM Plus (Patreon) subscription.
Electrolyte NRTL property package for CO2 capture in aqueous MEA, DEA, MDEA, piperazine and MDEA with piperazine. The flash works on the apparent compounds (water, the amine, CO2 and other gases); every liquid is speciated into its true molecules and ions in chemical equilibrium, which gives the CO2 partial pressure, the heat of absorption, the pH and the density of the loaded solvent.
DWSIM.Extensions.PropertyPackages.CCUS.Capture.CarbonCapturePropertyPackage
Assembly DWSIM.Extensions.PropertyPackages.CCUS.dll · Object ← PropertyPackage ← ElectrolyteBasePropertyPackage ← BaseElectrolytePropertyPackage ← CarbonCapturePropertyPackage
Name in the flowsheet CO2 Capture (eNRTL) · FluentAPI PropertyPackages.Plus.CarbonCapture
Scope¶
The package describes aqueous amine solvents loaded with CO2, as found in the absorbers and strippers of post-combustion capture and gas treating units. It covers five solvents: monoethanolamine (MEA), diethanolamine (DEA), methyldiethanolamine (MDEA), piperazine (PZ) and the blend of MDEA with piperazine. The amine is recognized by its CAS number, then by its name.
The flash works on the apparent compounds of the stream: water, the amine, CO2 and any other gas. Whenever it needs the fugacities of a liquid, the package splits that liquid into its true species in chemical equilibrium and computes their activity coefficients with the electrolyte NRTL model in the generalized form of Chen and Song (2004), with the Pitzer-Debye-Hückel term of the Electrolyte NRTL package. The fugacity of an apparent compound is that of its molecular species, so stream compositions stay apparent and the phase equilibrium carries the chemistry. All parameters are compiled into the package; it reads no data files.
| Solvent | True species |
|---|---|
| MEA | H2O, MEA, CO2(aq), MEAH+, MEACOO-, HCO3-, CO32-, OH-, H+ |
| DEA | the same with DEA, DEAH+ and DEACOO- |
| MDEA | H2O, MDEA, CO2(aq), MDEAH+, HCO3-, CO32-, OH-, H+ (a tertiary amine forms no carbamate) |
| PZ | H2O, PZ, CO2(aq), PZH+, PZCOO-, H+PZCOO-, PZ(COO-)2, HCO3-, CO32-, OH-, H+ |
| MDEA + PZ | the species and reactions of both amines in one liquid |
Chemical equilibria. Water dissociation and the two dissociations of CO2 (Edwards et al. 1978), the protonation of each amine (Bates and Pinching 1951 for MEA, Posey 1996 for DEA and MDEA, Hetzer, Robinson and Bates 1968 for PZ), carbamate reversion for MEA and DEA (Austgen 1989) and the three piperazine carbamate reactions (Ermatchkov, Pérez-Salado Kamps and Maurer 2003). The constants are on the mole-fraction scale; water and the amine are referred to the pure liquid, CO2(aq) and the ions to infinite dilution in water.
Phase equilibrium. Water and the amine follow their vapor pressure times activity; CO2 follows the Henry constant of Carroll, Slupsky and Mather (1991) times its activity coefficient, with a Poynting term (34 cm3/mol). The vapor is Peng-Robinson. N2, O2, H2S and other gases take part in no reaction and dissolve physically, so the package does not describe H2S treating.
Parameters. The NRTL pairs have the form τ = a + b (1/T - 1/298.15 K). The water-amine pairs of MEA and MDEA were fitted to amine + water vapor-liquid data; those of DEA (Posey 1996) and PZ (Hilliard 2008) are published values. The molecule-ion-pair parameters were fitted to CO2 partial pressures and calorimetric heats of absorption together; every other pair takes the defaults of Chen and Evans (1986).
Enthalpy, density and pH. The liquid enthalpy comes from the temperature derivative of the liquid
fugacities, so the heat of absorption appears in the energy balance of any unit operation. The density of
the loaded solvent comes from correlations fitted to Amundsen, Øi and Eimer (2009) for MEA, Han et
al. (2012) for DEA and MDEA, and Freeman and Rochelle (2011) for PZ. The pH (molality scale) and the ionic
strength come from the speciation, which SpeciateLiquid and LastSpeciation return species by species.
Accuracy. Average deviations from the validation of the package (fit: data the parameters were regressed to; check: compared only):
| Solvent | CO2 partial pressure | Heat of absorption | Density |
|---|---|---|---|
| MEA | 14 % (Wagner 2013, fit), 18 to 35 % on four sets checked | 3.2 to 3.9 kJ/mol (Arcis 2011, integral) | 2.6 kg/m3 |
| DEA | 15 and 29 % (fit), 12 % (Dash 2011, check) | 3.3 to 4.3 kJ/mol | 1.2 kg/m3 |
| MDEA | 12 to 20 % on three of the four sets fitted, 14 % (Leontiadis 2019, check) | 3.2 to 3.8 kJ/mol | 2.0 kg/m3 |
| PZ | 16 to 32 % (fit), 28 % (Hilliard 2008, check) | 6.0 and 7.1 kJ/mol at 313 and 353 K (differential) | 3.7 kg/m3 |
| MDEA + PZ | 19 and 20 % (Chen 2011, fit), 23 and 51 % at 373 to 423 K (Xu 2011, check) | no data | 1 to 4 kg/m3 (lean) |
Limitations¶
- Fitted ranges: MEA 15 and 30 mass% (2.8 to 7.3 mol/kg), 313 to 393 K; DEA 2 and 4 M, 303 to 353 K; MDEA 298 to 363 K; PZ 1 to 12 mol/kg, 313 to 423 K; MDEA + PZ at 7 m/2 m and 5 m/5 m, 40 to 100 °C. CO2 partial pressures up to 1.2 MPa (MEA up to 500 kPa). Above 120 °C the MEA and DEA carbamate constants extrapolate.
- AMP, amine blends other than MDEA + PZ, and an amine together with ions or salts (heat-stable salts, Na+, Cl-) are refused with a message. Water with gases and no amine takes a molecular flash; water with ions and no amine, the speciation of the electrolyte packages.
- Near a loading of 0.5 mol/mol the CO2 partial pressure rises tenfold within a few hundredths of loading; there the MEA data of Jou et al. and Wagner et al. differ by a factor of about 2, and the model lies between them. Some MDEA and PZ data sets disagree with the others by a factor of 2 to 8 (PZ: up to three orders of magnitude); the fit follows the majority.
- Equilibrium only: the slow reaction of CO2 with MDEA in a real absorber has to come from a rate-based column model.
- The solid PZ hexahydrate is not modelled: concentrated, lean PZ solutions that would precipitate on cooling (8 to 10 mol/kg below about 0.05 mol CO2 per mol of alkalinity at 40 °C) come out as a liquid.
- The MEA differential heat at 313 K comes out up to 13 kJ/mol more exothermic than the calorimetry of Mondal et al. (2017) between 0.2 and 0.45 mol/mol. The Born term for the permittivity of the mixed solvent is not included.
Example¶
This code runs on every build of this site, and the output below is what it printed.
fs = (Flowsheet.Create("CO2CaptureExample")
.WithCompounds("Water", "Monoethanolamine", "Carbon dioxide")
.WithPropertyPackage(PropertyPackages.Plus.CarbonCapture))
# 1 kg/s of 30 mass% MEA at three CO2 loadings (mol CO2/mol MEA), each at its
# bubble point at 40 C: the vapor holds the equilibrium partial pressures
mea = 0.30 / 0.06108 # mol/s of MEA
streams = {}
for loading in (0.2, 0.4, 0.5):
streams[loading] = (fs.AddMaterialStream(f"MEA, loading {loading}")
.WithTemperature(Q.Celsius(40.0)).WithVaporFraction(0.0)
.SetCompoundMolarFlow("Water", 0.70 / 0.018015)
.SetCompoundMolarFlow("Monoethanolamine", mea)
.SetCompoundMolarFlow("Carbon dioxide", loading * mea))
fs.Solve()
for loading, b in streams.items():
s = b.Object
P = s.Phases[0].Properties.pressure # bubble pressure, Pa
pCO2 = s.Phases[2].Compounds["Carbon dioxide"].MoleFraction * P
print(f"Loading {loading}: pCO2 = {pCO2 / 1000:.3g} kPa, pH = {s.Phases[3].Properties.pH:.2f}")
# true species of the liquid at loading 0.4 (molality, mol/kg of water)
pp = list(fs.Inner.PropertyPackages.Values)[0].__implementation__ # the package class
liquid = streams[0.4].Object.Phases[3]
x = Array[Double]([c.MoleFraction for c in liquid.Compounds.Values])
sp = pp.SpeciateLiquid(x, 313.15)
m = {name: sp.Molality(i) for i, name in enumerate(sp.Model.SpeciesNames)}
print(f"Speciation at 0.4: MEAH+ {m['MEAH+']:.2f}, MEACOO- {m['MEACOO-']:.2f}, "
f"HCO3- {m['HCO3-']:.3f}, free MEA {m['MEA']:.2f} mol/kg")
print(f"Loaded solvent density = {liquid.Properties.density:.1f} kg/m3")
Output
Loading 0.2: pCO2 = 0.00791 kPa, pH = 9.82
Loading 0.4: pCO2 = 0.169 kPa, pH = 9.16
Loading 0.5: pCO2 = 3.33 kPa, pH = 8.51
Speciation at 0.4: MEAH+ 2.85, MEACOO- 2.69, HCO3- 0.082, free MEA 1.49 mol/kg
Loaded solvent density = 1088.4 kg/m3
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 | Peng-Robinson EOS |
| Liquid fugacity | Amines: electrolyte NRTL with chemical equilibrium, Henry's law (CO2), vapour pressure times activity (water, amine); no amine: eNRTL activity coefficients + Henry's law / vapour pressure |
| Vapor enthalpy, entropy, Cp/Cv | Ideal Gas |
| Liquid enthalpy, entropy, Cp/Cv | Amine solvents: temperature derivative of the liquid fugacities of the speciated liquid (heat of absorption included); without an amine: Ideal Liquid |
| Vapor density | Ideal Gas |
| Liquid density | Amine solvents: loaded-solvent correlations (Amundsen et al. 2009 for MEA, Han et al. 2012 for DEA and MDEA, Freeman and Rochelle 2011 for PZ) |
| Vapor viscosity | Experimental / Lucas / Jossi-Stiel-Thodos |
| Liquid viscosity | Experimental / Letsou-Stiel (solvent) with the Jones-Dole correction for the ions |
| Vapor thermal conductivity | Experimental / Ely-Hanley |
| Liquid thermal conductivity | Experimental / Latini (solvent) with the Riedel correction for the ions |
| 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: Nested_Loops_VLE.
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.
| Element | Content in the example | What it holds |
|---|---|---|
ElectrolyteFlash_ReactionSetID |
DefaultSet |
Setting of the legacy electrolyte flash (ElectrolyteSVLE) that the base class saves; the flashes of this package do not read it |
ElectrolyteFlash_Tolerance |
1E-07 |
The same, the tolerance of that flash |
ElectrolyteFlash_MaximumIterations |
200 |
The same, its iteration limit |
IncludeExcessEnthalpy |
false |
Adds the eNRTL excess enthalpy to the liquid enthalpy of water with gases or ions and no amine (off by default); the amine path takes its excess enthalpy from the speciation in any case |
GenerateSolubilityReactions |
false |
Salt dissolution equilibria of the base electrolyte package; not used here, since the package replaces its chemical equilibria |
UseReactiveKvalues |
false |
Not used here; the columns take the K-values the flash converges on |
Settings common to every property package, as saved for the example
| Element | Value |
|---|---|
Type |
75 characters |
ComponentName |
CO2 Capture (eNRTL) |
ComponentDescription |
95 characters |
Tag |
CO2 Capture (eNRTL) |
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¶
-
User guide
-
Used with
API members¶
Public members declared by this class. Inherited members are documented on the base classes.
Constructors¶
CarbonCapturePropertyPackage(bool)
| Parameter | Type | Description |
|---|---|---|
comode |
Boolean |
Properties¶
FlashBase: The apparent-compound flash for MEA, DEA, MDEA, piperazine or MDEA with piperazine, with water; the speciation flash...
The apparent-compound flash for MEA, DEA, MDEA, piperazine or MDEA with piperazine, with water; the speciation flash of the electrolyte packages for water with ions or salts and no amine; a vapour-liquid flash on DW_CalcFugCoeff for water and gases. The other amines, the other amine blends and an amine together with ions or salts are refused with a message.
ImplementsAnalyticalDerivatives
ImplementsCrossPlatformEditor
LastSpeciation: Speciation of the last liquid whose pH was calculated on the amine path, or null.
Speciation of the last liquid whose pH was calculated on the amine path, or null.
ShouldUseKvalueMethod3: The columns take DW_CalcKvalue, the K-values of DW_CalcFugCoeff that the flash converges on, with UseReactiveKvalues...
The columns take DW_CalcKvalue, the K-values of DW_CalcFugCoeff that the flash converges on, with UseReactiveKvalues on or off.
Methods¶
AUX_LIQDENS(double, Array, double, double, bool): Liquid density on the amine path from AmineSolutionDensity, with any other dissolved compound added at its own...
Liquid density on the amine path from AmineSolutionDensity, with any other dissolved compound added at its own liquid molar volume.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
Vx |
Array |
|
P |
Double |
|
Pvp |
Double |
|
FORCE_EOS |
Boolean |
AUX_LIQDENS(double, double, double, int, bool): The phase overload the phase properties are calculated with, which the electrolyte base class answers on its own...
The phase overload the phase properties are calculated with, which the electrolyte base class answers on its own: the same density on the amine path.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
|
Pvp |
Double |
|
phaseid |
Int32 |
|
FORCE_EOS |
Boolean |
AUX_VAPDENS(double, double): Vapour density: Peng-Robinson on the vapour root, the equation of state of VaporFugacity.
Vapour density: Peng-Robinson on the vapour root, the equation of state of VaporFugacity. The electrolyte packages' density was the ideal gas.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
CalculateChemicalEquilibria(double, double)
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
CalculateChemicalEquilibria(double, double, double[])
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
|
x |
Double[] |
Clone()
DW_CalcdKdT(double[], double[], double, double, string)
| Parameter | Type | Description |
|---|---|---|
Vx |
Double[] |
|
Vy |
Double[] |
|
T |
Double |
|
P |
Double |
|
type |
String |
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 |
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 |
DW_CalcEnthalpy(Array, double, double, State): On the amine path the liquid enthalpy follows from the temperature dependence of the liquid fugacities, which...
On the amine path the liquid enthalpy follows from the temperature dependence of the liquid fugacities, which carries the heat of absorption. Elsewhere it is the electrolyte packages' enthalpy.
| Parameter | Type | Description |
|---|---|---|
Vx0 |
Array |
|
T |
Double |
|
P |
Double |
|
st |
State |
DW_CalcEntropy(Array, double, double, State): Entropy to match DW_CalcEnthalpy: S = S_ig − ΔHvap/T of water and the amine (the convention of the electrolyte...
Entropy to match DW_CalcEnthalpy: S = S_ig − ΔHvap/T of water and the amine (the convention of the electrolyte packages) + (H_R − G_R)/T, G_R = R·T·Σ x·ln(f/f_ref) with the same reference fugacities as the enthalpy.
| Parameter | Type | Description |
|---|---|---|
Vx0 |
Array |
|
T |
Double |
|
P |
Double |
|
st |
State |
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) |
DW_CalcKvalue3(double[], double[], double, double): DW_CalcKvalue on the normalised liquid and vapour, for a caller that asks for the reactive route by name.
DW_CalcKvalue on the normalised liquid and vapour, for a caller that asks for the reactive route by name. Amounts in, as the columns pass them; with no vapour the liquid stands in for it.
| Parameter | Type | Description |
|---|---|---|
Vnx |
Double[] |
|
Vny |
Double[] |
|
T |
Double |
|
P |
Double |
DW_CalcPhaseProps(Phase): The vapour's compressibility factor follows its density; the electrolyte packages wrote 1.
The vapour's compressibility factor follows its density; the electrolyte packages wrote 1.
| Parameter | Type | Description |
|---|---|---|
Phase |
Phase |
DW_CalcProp(string, Phase): pH and ionic strength of a liquid on the amine path come from its speciation, which...
pH and ionic strength of a liquid on the amine path come from its speciation, which LastSpeciation then holds; everything else is the electrolyte packages' own.
| Parameter | Type | Description |
|---|---|---|
property |
String |
|
phase |
Phase |
GetEditingForm(): Returns the binary interaction parameter editor of this package.
Returns the binary interaction parameter editor of this package.
PopulateCrossPlatformEditor(object): The package has no adjustable parameters: the panel lists the supported amines, the speciation reactions and the...
The package has no adjustable parameters: the panel lists the supported amines, the speciation reactions and the model, mirroring the Windows editor.
| Parameter | Type | Description |
|---|---|---|
container |
Object |
ReturnInstance(string)
| Parameter | Type | Description |
|---|---|---|
typename |
String |
RunPostMaterialStreamSetRoutine()
SaveData(): Writes IncludeExcessEnthalpy, GenerateSolubilityReactions and UseReactiveKvalues after the data the base package...
Writes IncludeExcessEnthalpy, GenerateSolubilityReactions and UseReactiveKvalues after the data the base package saves, so the three options travel with the flowsheet file and with Clone.
SpeciateLiquid(Array, double): Speciation of the liquid Vx (apparent mole fractions) at T; null off the amine path, when the liquid holds no water...
Speciation of the liquid Vx (apparent mole fractions) at T; null off the amine path, when the liquid holds no water or no amine, or when CO2 is more than half of water + amine + CO2 (a CO2 liquid, which the trial phases of the flash can reach and the model does not describe). Starts from the nearest of the recent speciations.
| Parameter | Type | Description |
|---|---|---|
Vx |
Array |
|
T |
Double |
Fields¶