PC-SAFT¶
Perturbed-Chain SAFT equation of state of Gross and Sadowski, with association: gases, solvents, hydrogen-bonding compounds and polymers, with polymer-specific numerical safeguards, liquid-liquid seeding and transport properties.
DWSIM.Thermodynamics.AdvancedEOS.PCSAFT2PropertyPackage
Assembly DWSIM.Thermodynamics.AdvancedEOS.PCSAFT2.dll · Object ← PropertyPackage ← PCSAFT2PropertyPackage
Name in the flowsheet PC-SAFT (with Association Support) (.NET Code) · FluentAPI PropertyPackages.PCSAFT
Scope¶
PC-SAFT (Perturbed-Chain Statistical Associating Fluid Theory, Gross and Sadowski) is an equation of state for mixtures of gases, solvents, hydrogen-bonding compounds and polymers. Each molecule is a chain of m tangent spheres of diameter σ with a dispersion energy ε/k, and the residual Helmholtz energy is the sum of a hard-chain, a dispersion and an association term. The package is the base of the Ionic Liquids package.
Parameters. A non-associating compound needs m, σ (Å) and ε/k (K); an associating
one adds the association energy εAB/k (K) and volume κAB. The package
table (pcsaft.dat) holds 193 compounds, 19 of them associating and 14 polymers; pcsaft_ip.dat holds
48 binary parameters. Unlike pairs combine as σij = (σi +
σj)/2 and εij = (εiεj)1/2
(1 - kij), with kij(T) = kij + kij,T (T - 298.15 K). Parameters
of other compounds are entered in the package editor.
Association. Sites follow the 2B (one donor, one acceptor), 4C (two of each) and 4C/ether schemes, each site type with a multiplicity, so a long associating chain needs only two site fractions. Unlike associating compounds cross-associate, with the arithmetic mean of the two association energies.
Polymers. The segment number grows with the number-average molar mass, m = (m/M) Mn, so one parameter row per repeat unit covers any chain length. The built-in polymers are HDPE, LDPE, polypropylene, polybutene, polyisobutene, polystyrene, poly(vinyl acetate), polydimethylsiloxane, poly(n-butyl methacrylate), polybutadiene, poly(α-methylstyrene), PMMA, poly(methyl acrylate) and poly(ethylene glycol) (4C/ether). For the very large segment numbers of a macromolecule DWSIM carries the logarithm of the fugacity coefficient, brackets the density root over the physical packing-fraction range, and solves the site fractions by damped substitution. The liquid-liquid flash of a polymer solution is seeded from the spinodal of the equation of state and judges phase identity on a mass basis, so the miscibility gap is found without a manual estimate. The Polymer Characterization tool splits a Schulz-Zimm or log-normal molar-mass distribution into pseudo-components, and random or alternating copolymers of two repeat units are built from the homopolymer parameters.
Properties. Phase equilibrium, vapor and liquid densities come from PC-SAFT. Enthalpy, entropy and
heat capacities come from the PC-SAFT departure functions when the mixture holds an associating compound
or a polymer; otherwise the Lee-Kesler departure functions are used by default (UseLeeKeslerEnthalpy,
UseLeeKeslerCpCv). In a phase with a polymer, viscosity is a mass-fraction logarithmic blend (a
polymer without viscosity data is left out of it), and thermal conductivity and surface tension are
mass-fraction averages, with per-polymer estimates when a polymer has no data.
Validation (from the user guide).
| System | Quantity | Experiment | Model |
|---|---|---|---|
| PP / n-pentane, 5 wt %, 177/187/197 °C | cloud pressure | 47/59/73 bar | 48/62/72 bar |
| HDPE / ethylene, 5 wt %, 140/150/170 °C | cloud pressure | 1850/1780/1650 bar | 1850/1750/1650 bar |
| PMMA / 1-chlorobutane | UCST | about 281 K | about 283 K |
| methanol / ethanol / 1-propanol in water, 323 K | γ∞ | 1.8 / 5 / 14 | 1.8 / 5.6 / 14.3 |
Limitations¶
- Accurate for non-associating and weakly interacting polymer-solvent systems, where one small kij captures the mixture; strongly hydrogen-bonding aqueous systems are semi-quantitative.
- The combining rule makes the water-polymer cross-association weaker than the water self-association: the vapor-liquid equilibrium of poly(ethylene glycol) in water needs a fitted kij, its closed-loop liquid-liquid behavior is not reproduced, and water-alcohol equilibrium relies on the small kij shipped for the common alcohols.
- Oligomers need molar-mass-specific σ and ε/k; the shipped polymer rows are high-molar-mass values. Copolymers are limited to two repeat units.
Example¶
This code runs on every build of this site, and the output below is what it printed.
fs = (Flowsheet.Create("PCSAFTExample")
.WithCompounds("Methanol", "Water")
.WithPropertyPackage(PropertyPackages.PCSAFT))
# 30 mol % methanol at 1 atm: bubble point (vapor fraction 0) and dew point (vapor fraction 1);
# both compounds self-associate (2B sites) and cross-associate with each other
def mixture(name, vf):
return (fs.AddMaterialStream(name)
.WithPressure(Q.Bar(1.01325)).WithVaporFraction(vf)
.SetCompoundMolarFlow("Methanol", 0.3)
.SetCompoundMolarFlow("Water", 0.7))
bubble, dew = mixture("Bubble point", 0.0), mixture("Dew point", 1.0)
# liquid methanol at 25 C: the density comes from the equation of state
methanol = (fs.AddMaterialStream("Methanol")
.At(Q.Celsius(25.0), Q.Bar(1.01325))
.SetCompoundMolarFlow("Methanol", 1.0))
fs.Solve()
b, d = bubble.Object, dew.Object
print(f"Bubble point = {b.Phases[0].Properties.temperature - 273.15:.2f} C, "
f"methanol in the vapor = {b.Phases[2].Compounds['Methanol'].MoleFraction:.3f}")
print(f"Dew point = {d.Phases[0].Properties.temperature - 273.15:.2f} C, "
f"methanol in the liquid = {d.Phases[3].Compounds['Methanol'].MoleFraction:.3f}")
print(f"Bubble to dew point, dh = {d.Phases[0].Properties.enthalpy - b.Phases[0].Properties.enthalpy:.0f} kJ/kg")
print(f"Liquid methanol at 25 C = {methanol.Object.Phases[0].Properties.density:.1f} kg/m3")
Output
Bubble point = 77.99 C, methanol in the vapor = 0.666
Dew point = 91.47 C, methanol in the liquid = 0.064
Bubble to dew point, dh = 1763 kJ/kg
Liquid methanol at 25 C = 790.6 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 | PC-SAFT EOS |
| Liquid fugacity | PC-SAFT EOS |
| Vapor enthalpy, entropy, Cp/Cv | Lee-Kesler for mixtures without associating compounds or polymers (default) / PC-SAFT EOS |
| Liquid enthalpy, entropy, Cp/Cv | Lee-Kesler for mixtures without associating compounds or polymers (default) / PC-SAFT EOS |
| Vapor density | PC-SAFT EOS |
| Liquid density | PC-SAFT EOS |
| Vapor viscosity | Experimental / Lucas / Jossi-Stiel-Thodos |
| Liquid viscosity | Experimental / Letsou-Stiel; mass-fraction logarithmic blend for phases with a polymer |
| Vapor thermal conductivity | Experimental / Ely-Hanley |
| Liquid thermal conductivity | Experimental / Latini; mass-fraction average for phases with a polymer |
| Surface tension | Experimental / Brock-Bird; mass-fraction average for phases with a polymer |
| 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.
| Element | Content in the example | What it holds |
|---|---|---|
UseLeeKeslerEnthalpy |
true |
Lee-Kesler enthalpy and entropy for mixtures without an associating compound or a polymer (true by default); with one of them in the flowsheet the PC-SAFT departure functions are used |
UseLeeKeslerCpCv |
true |
The same switch for Cp and Cv |
InteractionParameters |
1 InteractionParameter entry (Compound1, Compound2, CAS1, CAS2, Value) |
kij (Value) and kij,T (ValueT, 1/K, written when not zero) of the pairs of the flowsheet compounds, from pcsaft_ip.dat or entered in the editor |
CompoundParameters |
2 CompoundParameterSet entries (Compound, CAS_ID, MW, m, sigma, epsilon_k, assocparam, kAiBi, epsilon_AiBi, m_over_M, scheme, copolymer, coseq) |
PC-SAFT parameters of the flowsheet compounds (m, σ in Å, ε/k in K, association sites assocparam, volume kAiBi and energy epsilon_AiBi; for a polymer m/M, the association scheme and the copolymer definition) |
First InteractionParameter of InteractionParameters in the example
First CompoundParameterSet of CompoundParameters in the example
Settings common to every property package, as saved for the example
| Element | Value |
|---|---|
Type |
DWSIM.Thermodynamics.AdvancedEOS.PCSAFT2PropertyPackage |
ComponentName |
PC-SAFT (with Association Support) (.NET Code) |
ComponentDescription |
120 characters |
Tag |
PC-SAFT (with Association Support) (.NET Code) |
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¶
Properties¶
CompoundParameters
DisplayDescription
FlashBase: Returns the FlashAlgorithm object instance for this property package.
Returns the FlashAlgorithm object instance for this property package.
ImplementsAnalyticalDerivatives
InteractionParameters
MobileCompatible
UseLeeKeslerCpCv
UseLeeKeslerEnthalpy
UsesGibbsMinimizationForLLE: When True, the liquid-liquid flash converges the split by minimizing the two-phase Gibbs energy (descent), rather...
When True, the liquid-liquid flash converges the split by minimizing the two-phase Gibbs energy (descent), rather than by successive substitution / a residual-norm Newton. Needed for packages whose miscibility gap is shallow enough that the ordinary methods collapse onto the trivial solution - e.g. a polymer in PC-SAFT.
Methods¶
AssociationFromMatrices(string, ref double, ref double): Largest entry of the association volume and energy matrices of an associationparams string ('n', '[kappa matrix]'...
Largest entry of the association volume and energy matrices of an associationparams string ("n", "[kappa matrix]", "[epsilon matrix]"); zero when the string defines no association.
| Parameter | Type | Description |
|---|---|---|
assocparam |
String |
|
kappa |
Double |
|
eps |
Double |
AssociationMatrices(double, double): The associationparams string of a two-site-type (donor/acceptor) compound with association volume kappa and energy...
The associationparams string of a two-site-type (donor/acceptor) compound with association volume kappa and energy eps (K), in the form the parameter tables use.
| Parameter | Type | Description |
|---|---|---|
kappa |
Double |
|
eps |
Double |
AUX_CONDTL(double, int): Liquid thermal conductivity of a phase that contains a polymer.
Liquid thermal conductivity of a phase that contains a polymer. Each compound's value comes from AUX_LIQTHERMCONDi (the user-supplied liquid thermal-conductivity equation when present), blended by a mass-fraction average so the polymer contributes in proportion to its mass rather than its trace mole fraction. Conductivities of solvent and polymer are of the same order, so a linear (not logarithmic) average is appropriate. With no polymer present the base Li mixing rule is used.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
phaseid |
Int32 |
AUX_LIQVISCm(double, double, int): Liquid viscosity of a phase that contains a polymer.
Liquid viscosity of a phase that contains a polymer. A polymer's mole fraction is tiny, so the base mole-average mixing nullifies its viscosity however large. Here each compound's pure viscosity comes from AUX_LIQVISCi (the user-supplied liquid-viscosity equation when present) and they are blended by a mass-fraction-weighted logarithm (an Arrhenius blend), so the polymer governs the solution viscosity in proportion to its mass. With no polymer present the base mixing rule is used.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
|
phaseid |
Int32 |
AUX_SURFTM(double): Liquid surface tension of a phase that contains a polymer.
Liquid surface tension of a phase that contains a polymer. Each compound's value comes from AUX_SURFTi (the user-supplied surface-tension data when present), blended by a mass-fraction average over the sub-critical compounds so the polymer is not nullified by its trace mole fraction. With no polymer present the base molar average is used.
| Parameter | Type | Description |
|---|---|---|
T |
Double |
AUX_VAPDENS(double, double)
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
AUX_Z(double[], double, double, PhaseName)
| Parameter | Type | Description |
|---|---|---|
Vx |
Double[] |
|
T |
Double |
|
P |
Double |
|
state |
PhaseName |
CalcIsothermalCompressibility(IPhase)
| Parameter | Type | Description |
|---|---|---|
p |
IPhase |
CalcJouleThomsonCoefficient(IPhase)
| Parameter | Type | Description |
|---|---|---|
p |
IPhase |
CalcSpeedOfSound(IPhase)
| Parameter | Type | Description |
|---|---|---|
p |
IPhase |
DisplayEditingForm()
DW_CalcCompPartialVolume(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
phase |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcCp_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcCv_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcdLnFugCoeffdn(double[], double, double, State): Composition (mole-number) derivative of the log fugacity coefficients, d(lnphi_i)/dn_j at total moles = 1.
Composition (mole-number) derivative of the log fugacity coefficients, d(lnphi_i)/dn_j at total moles = 1. The density is solved ONCE at the base composition; the EoS is then evaluated in closed form at that fixed density for each perturbation (no density solve per perturbation), and the constant-pressure density response is added analytically: d(lnphi_i)/dn_j = [d(lnphi_i)/dn_j]_rho + (d lnphi_i/d rho) * (d rho/dn_j), d rho/dn_j = -[dP/dn_j]_rho / (dP/d rho). This is what makes the liquid-liquid Gibbs-minimisation Newton step affordable for PC-SAFT.
| Parameter | Type | Description |
|---|---|---|
Vx |
Double[] |
|
T |
Double |
|
P |
Double |
|
st |
State |
DW_CalcEnergyFlowMistura_ISOL(double, double)
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
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). |
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). |
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). |
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). |
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_CalcK_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcKvalue(double[], double[], double, double, string): Calculates K-values of components in a mixture.
Calculates K-values of components in a mixture.
| Parameter | Type | Description |
|---|---|---|
Vx |
Double[] |
Vector of doubles containing the molar composition of the liquid phase. |
Vy |
Double[] |
Vector of doubles containing the molar composition of the vapor phase. |
T |
Double |
Temperature of the system. |
P |
Double |
Pressure of the system. |
type |
String |
DW_CalcLnFugCoeff(Array, double, double, State): Log fugacity coefficients straight from the EoS, without the exponential that underflows to zero for a high...
Log fugacity coefficients straight from the EoS, without the exponential that underflows to zero for a high segment-number polymer. Keeps the true (large negative) chemical potential for the stability test and phase-split estimates.
| Parameter | Type | Description |
|---|---|---|
Vx |
Array |
|
T |
Double |
|
P |
Double |
|
st |
State |
DW_CalcMassaEspecifica_ISOL(Phase, double, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
|
Pvp |
Double |
DW_CalcMM_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcPhaseProps(Phase)
| Parameter | Type | Description |
|---|---|---|
Phase |
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. |
DW_CalcPVAP_ISOL(double)
| Parameter | Type | Description |
|---|---|---|
T |
Double |
DW_CalcTensaoSuperficial_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
DW_CalcViscosidadeDinamica_ISOL(Phase, double, double)
| Parameter | Type | Description |
|---|---|---|
Phase1 |
Phase |
|
T |
Double |
|
P |
Double |
GetEditingForm(): Returns the binary interaction parameter editor of this package.
Returns the binary interaction parameter editor of this package.
LIQDENS(double, double, double[])
| Parameter | Type | Description |
|---|---|---|
T |
Double |
|
P |
Double |
|
Vx |
Double[] |
LoadData(List<XElement>)
| Parameter | Type | Description |
|---|---|---|
data |
List<XElement> |
RET_VNONVOLATILE(): Per-compound flag marking a compound as effectively non-volatile (for example a high-molar-mass polymer, whose...
Per-compound flag marking a compound as effectively non-volatile (for example a high-molar-mass polymer, whose vapour pressure is negligible and whose vapour-liquid K-value is essentially zero). The default is all False, so ordinary packages are unaffected. A package that models such species (PC-SAFT for polymers) overrides this so the vapour-liquid flash keeps them in the liquid instead of reading a spurious vapour pressure off placeholder critical constants.
RET_VPVAP(double)
| Parameter | Type | Description |
|---|---|---|
T |
Double |
ReturnInstance(string)
| Parameter | Type | Description |
|---|---|---|
typename |
String |
RunPostMaterialStreamSetRoutine()
SaveData()