This guide provides detailed documentation of the COMP database, which stores pure component parameters used by NeqSim’s thermodynamic models. Understanding these parameters is essential for model selection, debugging, and extending NeqSim with new components.
Table of Contents
- Database Overview
- Database Location and Format
- Parameter Categories
- Parameter Reference Table
- Link to Thermodynamic Models
- Component Types
- Accessing Parameters in Code
- Adding Custom Components
- Related Database Tables
Database Overview
The component, blob, experiment, and fluid database wrappers share JDBC lifecycle
handling through NeqSimDatabaseBase. All four wrappers implement AutoCloseable
and should be closed with Java try-with-resources. Each instance owns its statement
and connection; repeated initialization reuses them. Closing attempts both resources,
even if statement cleanup fails, and preserves additional SQL errors as suppressed
exceptions. A subsequent query or execution can reopen a closed wrapper. Wrappers
are not thread-safe and should not be shared between concurrent operations.
Existing concrete APIs remain compatible: NeqSimDataBase.execute(String) returns
a boolean, while blob, experiment, and fluid execute(String) methods return void.
The fluid wrapper retains its legacy log-and-return error behavior and
getResultSet(String database, String sqlString) overload; the database label does
not change the active connection. Other wrappers propagate SQL failures with their
original cause. The inherited FileSystemSettings constants remain available for
existing callers. The blob wrapper loads the H2 driver for H2 and H2RT, without
the removed JDBC-ODBC bridge.
The COMP table is the primary pure component property database in NeqSim. It contains over 150 parameters per component, organized into functional groups that support different thermodynamic models and property calculations.
Key characteristics:
- ~260 components in the standard database
- CSV format for easy maintenance and version control
- Loaded at runtime into an in-memory H2 database
- Extensible via temporary tables or database modification
Database Location and Format
| Item | Value |
|---|---|
| File Path | src/main/resources/data/COMP.csv |
| Runtime Path | data/COMP.csv (in JAR) |
| Format | CSV with header row |
| Encoding | UTF-8 |
| Primary Key | ID (integer) |
| Lookup Key | NAME (string, case-sensitive) |
Parameter Categories
Basic Properties
| Column | Description | Unit | Model Usage |
|---|---|---|---|
ID |
Unique component identifier | - | Internal indexing |
NAME |
Component name for lookup | - | addComponent("methane", ...) |
CASnumber |
CAS Registry Number | - | Component identification |
InChIKey |
Structure-derived identifier | - | Identity checking, not used by any model |
COMPTYPE |
Component type classification | - | Model selection (see Component Types) |
COMPINDEX |
Component index in database | - | Internal ordering |
FORMULA |
Chemical formula | - | Element calculations |
MOLARMASS |
Molar mass | g/mol | All models (stored internally as kg/mol) |
InChIKey is a hash of the molecular structure, so it is identical for a
substance no matter how it is named and differs whenever the structure differs.
Use it, not the name or the CAS number, to check whether two rows are the same
molecule: a CAS number may be missing, wrong, or registered separately for each
stereoisomer, and a row created by copying another keeps the original’s values in
every column that was not edited. A repeated InChIKey is either an intentional
variant pair (a neutral and its ion, a PVTsim re-parameterisation, ice and
water) or a copy-paste defect.
Temporary TBP and wax pseudo-components have no defined molecular structure, so
their InChIKey is left unset. Their database insert names its physical-property
columns explicitly: optional identity columns must not shift or discard wax
flags, fusion enthalpies, or other characterization data. This also preserves
compatibility with component tables that have no InChIKey column.
When adding standard components, also update the case-insensitive canonical-name
index in ComponentNameResolver. Loading the extended database also imports any
standard component names and optional columns absent from COMP_EXT.csv.
For names shared with the standard table, neutral components use COMP.csv as
the source of their common pure-component parameters. The extended table keeps
its own unique ID and COMPINDEX, and ion rows retain their electrolyte model
parameters. Newly imported standard names receive unique IDs. The stored
COMP_EXT.csv is synchronized with the neutral rows by
python3 devtools/repair_water_cp_placeholders.py --write; the database loader
also reapplies the standard values on switching modes so future additions to
COMP.csv cannot silently revive stale extended values.
Read CSV names with a CSV parser because systematic names can contain commas.
Critical Properties
These parameters are fundamental to all cubic equations of state (SRK, PR, etc.).
| Column | Description | Unit | Model Usage |
|---|---|---|---|
TC |
Critical temperature | °C | Converted to K internally: $T_c = T_{C,db} + 273.15$ |
PC |
Critical pressure | bara | SRK, PR, CPA EoS parameter a and b |
ACSFACT |
Acentric factor (ω) | - | Alpha function: $m = f(\omega)$ |
CRITVOL |
Critical molar volume | cm³/mol | Critical compressibility: $Z_c = \frac{P_c V_c}{R T_c}$ |
NORMBOIL |
Normal boiling point | °C | Stored as K internally |
Model linkage:
- SRK EoS: $a = 0.42748 \frac{R^2 T_c^2}{P_c}$, $b = 0.08664 \frac{R T_c}{P_c}$
- PR EoS: $a = 0.45724 \frac{R^2 T_c^2}{P_c}$, $b = 0.07780 \frac{R T_c}{P_c}$
- Alpha function: $\alpha(T) = [1 + m(1-\sqrt{T_r})]^2$ where $m = f(\omega)$
Vapor Pressure Parameters
Parameters for Antoine-type vapor pressure correlations.
| Column | Description | Unit | Model Usage |
|---|---|---|---|
AntoineVapPresLiqType |
Equation type or availability marker | - | pow10, pow10KPa, log, exp, loglog; none means unavailable |
ANTOINEA |
Antoine A coefficient | - | Vapor pressure calculation |
ANTOINEB |
Antoine B coefficient | - | Vapor pressure calculation |
ANTOINEC |
Antoine C coefficient | - | Vapor pressure calculation |
ANTOINED |
Antoine D coefficient | - | Extended Antoine |
ANTOINEE |
Antoine E coefficient | - | Extended Antoine |
ANTOINESolidA |
Solid vapor pressure A | - | Sublimation pressure |
ANTOINESolidB |
Solid vapor pressure B | - | Sublimation pressure |
ANTOINESolidC |
Solid vapor pressure C | - | Sublimation pressure |
Antoine equation forms:
pow10: $\log_{10}(P_{sat}) = A - \frac{B}{T + C - 273.15}$ (P in bar absolute, API temperature T in K)pow10KPa: $P_{sat} = 10^{A-B/(T+C)}/10^5$ in bar absolute, with T in K. The legacy label retains this existing scale; it does not select a kPa-to-bar conversion.-
For non- pow10/pow10KPalabels with $E > 10^{-12}$, DIPPR-101 gives $P_{sat} = \exp(A + B/T + C \ln(T) + DT^E)/10^5$ in bar, with T in K. This includes legacy logandexplabels. - With zero exponent,
logandexpuse $P_{sat} = \exp(A - B/(T+C))$ in bar, with T in K.
getAntoineVaporPressuredT(T) returns the analytical derivative for pow10,
pow10KPa, DIPPR-101, and the three-parameter log/exp form, in bar/K.
For pow10KPa, $dP_{sat}/dT = P_{sat}\ln(10)B/(T+C)^2$; explicit base-ten
labels keep precedence even when ANTOINEE is nonzero. The pressure and
derivative therefore use the same correlation and scale during inverse-temperature
recovery. The legacy Wagner fallback still returns zero for the derivative;
correlation availability alone does not establish derivative support for that path.
Missing data and applicability: none with zero ANTOINEA–ANTOINEE
means no liquid-vapor correlation is available; it does not mean zero vapor
pressure. The three repeated legacy tuples reported in issue #3771, copied
water coefficients on unrelated compounds, the default pseudo-component
template, and every charged species are marked this way. Repeated coefficients
have not been reinterpreted as measured Wagner fits or replaced with guessed data.
Water and seawater retain their existing correlation. Solid sublimation
coefficients and EOS parameters are separate and are unchanged.
If all five liquid-vapor coefficients are zero, NeqSim also reports the correlation as unavailable, even if an imported row has a live type label. It does not infer or store a fitted Antoine curve from a normal boiling point. Supply a sourced fit when vapor pressure is required.
ComponentInterface.hasAntoineVaporPressureCorrelation() distinguishes missing
data from an available correlation. Availability alone does not certify the
accuracy or fitted range of older data. getAntoineVaporPressure(T) and its
temperature derivative return Double.NaN for missing data, ions, nonpositive or
nonfinite T, T above the component’s critical temperature, nonfinite/nonpositive
evaluated pressure, or evaluated pressure above the component’s finite critical
pressure. A missing or nonfinite critical pressure also makes the result unavailable. The inverse
getAntoineVaporTemperature(P) returns NaN for missing data, nonpositive or
nonfinite P, and P above the critical pressure. A fitted correlation may have a
narrower range; rejected results are not clipped to Pc and admitted results are not a general
quality guarantee. Below the melting point a liquid correlation can describe a
metastable liquid, not solid sublimation.
EOS saturation calculations and adsorption estimates already recognize NaN and
use their own initial guesses or estimation paths. Activity models requiring a
pure-liquid reference need actual vapor-pressure data or an appropriate Henry
reference; the none marker does not supply either. Selecting the extended
database synchronizes common neutral pure-component properties from the
standard table, including unavailable-data markers and corrected acetone
coefficients. Ion-specific extended properties remain separate.
Acetone provenance: the NIST Chemistry WebBook
reports A = 4.42448, B = 1312.253, C = -32.445 for T in K and P in bar,
valid from 259.16 to 507.60 K, based on Ambrose, Sprake and Townsend (1974),
DOI: 10.1016/0021-9614(74)90119-0.
The database stores C = 240.705 to match the existing pow10 Celsius offset.
This gives approximately 0.306 bar at 298.15 K and 0.726 bar at 320 K; the
0.031 bar at 298.15 K quoted in issue #3771 is not the acetone reference value.
The three numerical coefficients are attributed reference data; no external
software or compiled database has been imported.
Ideal Gas Heat Capacity
Polynomial coefficients for ideal gas heat capacity: $C_p^{ig} = A + BT + CT^2 + DT^3 + ET^4$
| Column | Description | Unit |
|---|---|---|
CPA |
Coefficient A | J/(mol·K) |
CPB |
Coefficient B | J/(mol·K²) |
CPC |
Coefficient C | J/(mol·K³) |
CPD |
Coefficient D | J/(mol·K⁴) |
CPE |
Coefficient E | J/(mol·K⁵) |
CPsolid1-5 |
Solid phase Cp coefficients | J/(mol·K) |
CPliquid1-5 |
Liquid phase Cp coefficients | J/(mol·K) |
Usage: Enthalpy, entropy, and Gibbs energy departure functions for all EoS models.
Repaired water Cp placeholders (issue #4049)
The 130 non-water hydrocarbon rows in COMP.csv that previously contained
water’s exact five ideal-gas Cp coefficients now have component-specific
polynomials. The 121 corresponding rows present in COMP_EXT.csv have the same
replacement. Other shared neutral pure-component fields have likewise been
aligned between the two stored tables; their row IDs remain independent.
Water’s own coefficients are retained. The full list of Cp names,
CAS numbers, structure-group counts, method, and predicted values at 298.15 and
500 K is in the Cp replacement inventory.
The migration can be checked with
python3 devtools/repair_water_cp_placeholders.py --check.
For 1,2,4-trimethylbenzene, CPA–CPE are a quartic least-squares fit to
NIST Chemistry WebBook gas-phase Cp data for CAS 95-63-6
over 273.15–1000 K (maximum error at the ten tabulated points: 0.365
J/(mol K)). The remaining 129 estimates use the Joback–Reid group-contribution
method for ideal-gas Cp:
The Joback–Reid values are estimates, not measured component correlations; isomers with the same first-order group counts receive the same estimate. The structure decomposition checks each row’s carbon/hydrogen count against its formula, and the resulting Cp is positive at 250, 298.15, 500, 800, and 1000 K. Use 250–1000 K as the documented screening interval for these estimates; validate individual compounds against experimental data for engineering caloric work. The NIST fit has direct supporting data only over 273.15–1000 K.
Independent points illustrate the estimation error: the method gives 104.85 and 189.59 J/(mol K) for cyclohexane at 298.15 and 500 K, compared with NIST’s 105.3 and 188.68; for trans-2-pentene it gives 105.91 and 162.54 against 108.9 and 162.0. These comparisons validate scale and trend, not a universal error bound for all 129 hydrocarbons.
The extended database includes many other GEN rows absent from the standard
table. Their Cp provenance has not been established by this shared-component
repair; a matching water polynomial in such a row must not be interpreted as
measured data. Ion-specific extended properties are intentionally exempt from
the neutral-component synchronization.
Liquid Phase Properties
| Column | Description | Unit | Model Usage |
|---|---|---|---|
LIQDENS |
Liquid density at standard conditions | g/cm³ | Density correlations |
RACKETZ |
Rackett compressibility factor | - | Rackett liquid density: $V = V_c Z_{RA}^{[1+(1-T_r)^{2/7}]}$ |
racketZCPA |
Rackett Z for CPA model | - | CPA volume correction |
volcorrSRK_T |
SRK volume translation | - | Péneloux correction: $V_{corr} = V_{EoS} - c$ |
volcorrCPA_T |
CPA volume translation | - | CPA Péneloux correction |
STDDENS |
Standard density | g/cm³ | Reference conditions |
LIQUIDDENSITYCOEFS1-5 |
Liquid density correlation coefficients | - | Temperature-dependent density |
Transport Properties
| Column | Description | Unit | Model Usage |
|---|---|---|---|
DIPOLEMOMENT |
Dipole moment | Debye | Polar corrections |
VISCFACT |
Viscosity correction factor | - | Corresponding states |
LIQVISCMODEL |
Liquid viscosity model type | - | Model selection (1-4) |
LIQVISC1-4 |
Liquid viscosity parameters | - | Andrade equation: $\ln(\eta) = A + B/T + C\ln(T) + DT$ |
LIQUIDCONDUCTIVITY1-3 |
Liquid thermal conductivity | - | $k = A + BT + CT^2$ |
PARACHOR |
Parachor | - | Surface tension: $\sigma^{1/4} = P[\rho_L - \rho_V]$ |
PARACHOR_CPA |
Parachor for CPA model | - | CPA surface tension |
criticalViscosity |
Critical viscosity | Pa·s | Transport correlations |
Equation of State Parameters
Attractive Term Parameters
| Column | Description | Unit | Model Usage |
|---|---|---|---|
PVMODEL |
PV model type | - | Classic for standard EoS |
MC1, MC2, MC3 |
Mathias-Copeman parameters (SRK) | - | Enhanced alpha function |
MCPR1, MCPR2, MCPR3 |
Mathias-Copeman parameters (PR) | - | PR alpha function |
TwuCoon1-3 |
Twu-Coon alpha function parameters | - | Twu-Coon attractive term |
SCHWARTZENTRUBER1-3 |
Schwartzentruber parameters | - | Schwartzentruber EoS |
MC1Solid-MC3Solid |
Solid phase Mathias-Copeman | - | Solid fugacity |
Mathias-Copeman alpha function: \(\alpha = [1 + c_1(1-\sqrt{T_r}) + c_2(1-\sqrt{T_r})^2 + c_3(1-\sqrt{T_r})^3]^2\)
Lennard-Jones Parameters
| Column | Description | Unit | Model Usage |
|---|---|---|---|
LJDIAMETER |
LJ molecular diameter | Å | Gas viscosity, diffusion |
LJEPS |
LJ energy parameter | K | ε/k_B |
SphericalCoreRadius |
Hard-core radius | - | LJ potential |
LJDIAMETERHYDRATE |
LJ diameter for hydrates | Å | Hydrate equilibrium |
LJEPSHYDRATE |
LJ energy for hydrates | K | Hydrate cage interaction |
Association Parameters (CPA/SAFT)
Parameters for Cubic-Plus-Association (CPA) and PC-SAFT models.
| Column | Description | Unit | Model Usage |
|---|---|---|---|
associationsites |
Number of association sites | - | 0, 1, 2, 3, or 4 |
associationscheme |
Association scheme | - | 0, 1A, 2A, 2B, 3B, 4C |
associationenergy |
Association energy (ε^AB) | J/mol | CPA association term |
associationboundingvolume_SRK |
Association volume (β) for SRK-CPA | - | SRK-CPA |
associationboundingvolume_PR |
Association volume (β) for PR-CPA | - | PR-CPA |
aCPA_SRK |
CPA a parameter (SRK base) | Pa·m⁶/mol² | SRK-CPA |
bCPA_SRK |
CPA b parameter (SRK base) | m³/mol | SRK-CPA |
mCPA_SRK |
CPA m parameter (SRK base) | - | SRK-CPA |
aCPA_PR |
CPA a parameter (PR base) | Pa·m⁶/mol² | PR-CPA |
bCPA_PR |
CPA b parameter (PR base) | m³/mol | PR-CPA |
mCPA_PR |
CPA m parameter (PR base) | - | PR-CPA |
PC-SAFT Parameters
| Column | Description | Unit | Model Usage |
|---|---|---|---|
mSAFT |
Number of segments | - | Chain length |
sigmaSAFT |
Segment diameter | Å | Hard-sphere term |
epsikSAFT |
Segment energy | K | ε/k_B |
associationboundingvolume_PCSAFT |
Association volume | - | PC-SAFT association |
associationenergy_PCSAFT |
Association energy | K | PC-SAFT association |
Association schemes:
| Scheme | Sites | Example Molecules |
|——–|——-|——————-|
| 0 | 0 | Non-associating (hydrocarbons) |
| 1A | 1 | HCl, aromatic compounds |
| 2A | 2 | CO₂ (electron donor/acceptor) |
| 2B | 2 | Alcohols (1 proton donor, 1 acceptor) |
| 3B | 3 | Amines |
| 4C | 4 | Water, glycols (2 donors, 2 acceptors) |
Hydrate Parameters
Parameters for gas hydrate equilibrium calculations.
| Column | Description | Unit | Model Usage |
|---|---|---|---|
HydrateFormer |
Hydrate-forming capability | - | yes or no |
HydrateA1Small, HydrateB1Small |
Type I small cage (512) | - | Langmuir constants |
HydrateA1Large, HydrateB1Large |
Type I large cage (51262) | - | Langmuir constants |
HydrateA2Small, HydrateB2Small |
Type II small cage (512) | - | Langmuir constants |
HydrateA2Large, HydrateB2Large |
Type II large cage (51264) | - | Langmuir constants |
A1_smallGF-B2_largeGF |
Graffis parameters | - | Alternative parameterization |
SphericalCoreRadiusHYDRATE |
Core radius for hydrates | - | Cavity occupation |
Thermodynamic Reference Data
| Column | Description | Unit | Model Usage |
|---|---|---|---|
Href |
Separate legacy reference metadata | J/mol | Not the formation enthalpy used by getHID |
GIBBSENERGYOFFORMATION |
Gibbs energy of formation | J/mol | Chemical equilibrium |
ENTHALPYOFFORMATION |
Standard ideal-gas enthalpy of formation at 298.15 K for reviewed neutral species | J/mol | Reaction thermodynamics and optional formation-referenced stream enthalpy |
FORMATIONENTHALPYSOURCE |
Provenance of a reviewed gas-phase formation enthalpy; blank means unavailable | - | Enables explicit formation-reference calculations; zero values require provenance too |
ABSOLUTEENTROPY |
Absolute entropy | J/(mol·K) | Entropy calculations |
HEATOFFUSION |
Heat of fusion | J/mol | Solid-liquid equilibrium |
Hsub |
Heat of sublimation | J/mol | Solid-vapor equilibrium |
TRIPLEPOINTTEMPERATURE |
Triple point temperature | K | Phase boundaries |
TRIPLEPOINTPRESSURE |
Triple point pressure | bar | Phase boundaries |
TRIPLEPOINTDENSITY |
Triple point density | kg/m³ | Reference state |
MELTINGPOINTTEMPERATURE |
Melting point | K | Solid calculations |
Formation enthalpy availability and sources
getHID(T) retains the default sensible-enthalpy convention, zero at 273.15 K.
Enable fluid.setUseIdealGasEnthalpyOfFormation(true) to include
ENTHALPYOFFORMATION and integrate Cp from 298.15 K, where the tabulated
formation enthalpy applies. See the reference-state guide.
This does not use Href, which is separate legacy metadata.
The following gas-phase values have explicit provenance. Values are stored in
J/mol; the table displays kJ/mol. Each link points to the NIST Chemistry WebBook
entry (SRD 69). Chase values use the displayed Shomate H reference constant;
Cp continues to use NeqSim’s existing polynomial, not the Shomate correlation.
| Component | Formation enthalpy at 298.15 K (kJ/mol) | Source |
|---|---|---|
| methane | -74.87310 | Chase 1998 |
| CO2 | -393.5224 | Chase 1998 |
| water (ideal gas) | -241.8264 | Chase 1998 |
| CO | -110.5271 | Chase 1998 |
| ammonia | -45.89806 | Chase 1998 |
| H2S | -20.600 | CODATA 1984 |
| ethane | -83.800 | Pittam and Pilcher 1972 |
| propane | -104.700 | Pittam and Pilcher 1972 |
| hydrogen | 0 | Element standard state |
| nitrogen | 0 | Element standard state |
| oxygen | 0 | Element standard state |
| helium | 0 | Element standard state |
| argon | 0 | Element standard state |
In particular, helium no longer carries the old -242000 J/mol placeholder.
The extended-database loader copies these reviewed value/source pairs from
COMP.csv into the loaded extended table. Other extended entries remain
unreviewed. The optional column is also preserved when adding missing standard
components. Older custom databases without the column continue to work in
legacy mode; they cannot silently opt into formation-based enthalpy.
Blank provenance does not mean that formation enthalpy is physically zero.
It means the entry has not been reviewed for this gas-phase reference. Supply
a finite value with setIdealGasEnthalpyOfFormation(value) on each phase’s
component before enabling the system option, or add a sourced database entry.
The setter marks the value as user-supplied. Aqueous ionic formation properties
must not be interpreted as ideal-gas values and remain outside this option.
Generated TBP estimates and combined pseudo-component estimates retain their
legacy numeric values but have no reviewed provenance. Supply appropriate
formation data explicitly before using those fractions in this reference mode.
Ionic and Electrolyte Parameters
| Column | Description | Unit | Model Usage |
|---|---|---|---|
IONICCHARGE |
Ionic charge | - | Electrolyte models |
REFERENCESTATETYPE |
Reference state | - | solvent or solute |
DIELECTRICPARAMETER1-5 |
Dielectric parameters | - | Electrolyte activity |
DeshMatIonicDiameter |
Debye-Hückel diameter | Å | Electrolyte models |
calcActivity |
Activity calculation flag | - | 0 or 1 |
Henry’s Law Parameters
| Column | Description | Unit |
|---|---|---|
HenryCoef1 |
Henry constant A | - |
HenryCoef2 |
Henry constant B | - |
HenryCoef3 |
Henry constant C | - |
HenryCoef4 |
Henry constant D | - |
Henry’s law correlation: \(\ln(H) = A + \frac{B}{T} + C\ln(T) + DT\)
Solid Phase Parameters
| Column | Description | Unit |
|---|---|---|
SOLIDDENSITYCOEFS1-5 |
Solid density coefficients | - |
HEATOFVAPORIZATIONCOEFS1-5 |
Heat of vaporization coefficients | - |
waxformer |
Wax-forming component | - |
Parameter Reference Table
Complete parameter list with units and typical values:
| Parameter | Unit | Example (methane) | Example (water) |
|---|---|---|---|
MOLARMASS |
g/mol | 16.043 | 18.015 |
TC |
°C | -82.59 | 374.15 (legacy model parameter) |
PC |
bara | 45.99 | 220.89 (legacy model parameter) |
ACSFACT |
- | 0.0115 | 0.344 |
CRITVOL |
cm³/mol | 99.0 | 56.0 |
NORMBOIL |
°C | -161.55 | 100.0 |
LIQDENS |
g/cm³ | 0.422 | 0.999 |
RACKETZ |
- | 0.0 | 0.0 |
DIPOLEMOMENT |
Debye | 0.0 | 1.8 |
associationsites |
- | 0 | 4 |
HydrateFormer |
- | yes | no |
Link to Thermodynamic Models
How Parameters Feed into Models
┌─────────────────────────────────────────────────────────────────┐
│ COMP Database │
├─────────────────────────────────────────────────────────────────┤
│ TC, PC, ACSFACT ──────────────> Cubic EoS (SRK, PR) │
│ MC1, MC2, MC3 ──────────────> Mathias-Copeman α(T) │
│ TwuCoon1-3 ──────────────> Twu-Coon α(T) │
│ aCPA, bCPA, mCPA ──────────────> CPA EoS │
│ associationsites ──────────────> CPA/SAFT Association │
│ mSAFT, σSAFT, εSAFT ──────────> PC-SAFT │
│ UNIFAC groups ──────────────> Activity models │
│ LJDIAMETER, LJEPS ─────────────> Transport properties │
│ HydrateA/B params ─────────────> Hydrate equilibrium │
│ CPA, CPB, CPC... ──────────────> Enthalpy/Entropy │
│ ANTOINEA-E ──────────────> Vapor pressure │
└─────────────────────────────────────────────────────────────────┘
Model-Parameter Mapping
| Model Class | Key Parameters |
|---|---|
SystemSrkEos |
TC, PC, ACSFACT, MC1-3, RACKETZ |
SystemPrEos |
TC, PC, ACSFACT, MCPR1-3 |
SystemSrkCPA |
aCPA_SRK, bCPA_SRK, mCPA_SRK, associationsites, associationenergy, associationboundingvolume_SRK |
SystemPrCPA |
aCPA_PR, bCPA_PR, mCPA_PR, associationboundingvolume_PR |
SystemPCSAFT |
mSAFT, sigmaSAFT, epsikSAFT, associationboundingvolume_PCSAFT |
SystemGERG2008Eos |
Uses internal GERG parameters, but TC/PC for initialization |
SystemUNIFAC |
TC, PC (for vapor), UNIFAC groups from UNIFACcomp table |
Component Types
The COMPTYPE field classifies components for model selection:
| Type | Description | Examples |
|---|---|---|
HC |
Hydrocarbon | methane, ethane, propane, benzene |
inert |
Inert gas | nitrogen, CO2, oxygen, argon |
ion |
Ionic species | Na+, Cl-, HCO3-, Ca++ |
amine |
Amine compounds | MDEA, MEA, DEA |
alcohol |
Alcohols | methanol, ethanol |
glycol |
Glycol compounds | MEG, DEG, TEG |
ice |
Ice/solid water | ice |
TBP |
TBP pseudo-component | Generated from characterization |
plus |
Plus fraction | C7+, C10+, etc. |
Accessing Parameters in Code
Reading Component Properties
// Create a system and access component properties
SystemInterface fluid = new SystemSrkEos(298.15, 10.0);
fluid.addComponent("methane", 1.0);
fluid.init(0);
// Access pure component parameters
ComponentInterface comp = fluid.getPhase(0).getComponent("methane");
double Tc = comp.getTC(); // Critical temperature [K]
double Pc = comp.getPC(); // Critical pressure [bara]
double omega = comp.getAcentricFactor(); // Acentric factor [-]
double Mw = comp.getMolarMass(); // Molar mass [kg/mol]
double Tb = comp.getNormalBoilingPoint(); // Normal boiling point [K]
System.out.println("Methane Tc = " + Tc + " K");
System.out.println("Methane Pc = " + Pc + " bara");
System.out.println("Methane ω = " + omega);
Modifying Component Properties
// Modify properties for sensitivity analysis
comp.setTC(190.6); // Set new Tc in Kelvin
comp.setPC(46.0); // Set new Pc in bara
comp.setAcentricFactor(0.012);
// Re-initialize to apply changes
fluid.init(0);
Adding Custom Components
Method 1: Database Modification
Add a new row to COMP.csv with all required parameters.
Method 2: Runtime Addition
// Add a pseudo-component with custom properties
SystemInterface fluid = new SystemSrkEos(298.15, 50.0);
// Add TBP fraction with molar mass and density
fluid.addTBPfraction("C7_custom", 0.1, 95.0 / 1000.0, 0.72); // name, moles, MW [g/mol], SG
// Or add component and modify properties
fluid.addComponent("n-heptane", 1.0);
ComponentInterface comp = fluid.getPhase(0).getComponent("n-heptane");
comp.setTC(540.0);
comp.setPC(27.4);
comp.setAcentricFactor(0.35);
// Initialize database for binary parameters
fluid.createDatabase(true);
fluid.setMixingRule(2);
Method 3: Temporary Tables
// Enable temporary tables for session-specific components
NeqSimDataBase.setCreateTemporaryTables(true);
// Components added to "comptemp" table
fluid.getPhase(0).getComponent(0).insertComponentIntoDatabase("comptemp");
// Remember to disable after use
NeqSimDataBase.setCreateTemporaryTables(false);
Related Database Tables
The COMP table works with several related tables:
| Table | Purpose | Key Columns |
|---|---|---|
INTER |
Binary interaction parameters (kij) | comp1, comp2, kij, model |
UNIFACcomp |
UNIFAC group assignments (original UNIFAC) | Name, sub1…sub138 |
UNIFACcompUMRPRU |
UNIFAC group assignments (UMR-PRU) | Name, sub1…sub138 |
UNIFACGroupParam |
UNIFAC subgroup parameters | Secondary, Main, VolumeR, SurfAreaQ |
UNIFACInterParam* |
UNIFAC group interaction parameters | MainGroup, n1…n70 |
MBWR32param |
MBWR equation parameters | comp, coefficients |
AdsorptionParameters |
Adsorption isotherm parameters | comp, adsorbent, params |
The subN columns are indexed by the standard UNIFAC secondary subgroup
number, so sub12 is ACCH2. A component row is found by exact match on
Name against the COMP.csv NAME, which means a name mismatch between the two
files silently leaves the component with no groups.
UNIFAC Group Assignment Conventions
There are two group-assignment tables, and they are not interchangeable:
| Table | Read by | Maintained? |
|---|---|---|
UNIFACcomp.csv |
classic UNIFAC / UNIQUAC (ComponentGEUnifac) |
No — frozen |
UNIFACcompUMRPRU.csv |
UMR-PRU (ComponentGEUnifacUMRPRU) |
Yes |
UMR-PRU is the model in active use, so UNIFACcompUMRPRU.csv is the table that
is kept complete and correct. Where the two disagree, the UMR-PRU assignment
follows NTUA/Voutsas, which takes precedence over the DDBST original-UNIFAC
decomposition. UNIFACcomp.csv is left as published.
The subgroup number used in both tables is the Secondary column of
UNIFACGroupParam.csv, not ID. UNIFACGroupParam.csv also carries a
Reference column identifying where each subgroup comes from:
| Reference | Subgroups | Source |
|---|---|---|
Hansen1991 |
1–64, 70 | Published original UNIFAC (DDBST) |
Holderbaum1991, Fisher1995 |
120–128, 134 | PSRK gas groups |
Voutsas2017, Voutsas, NTUA, Mentzelos |
135–140 | UMR-PRU extensions |
Aromatics
Main group 4 is “aromatic carbon-alkane”. When a ring carbon carries an alkane substituent, the ring carbon and its attached carbon form a single ACCH3 / ACCH2 / ACCH group:
toluene 5*ACH + 1*ACCH3
ethylbenzene 5*ACH + 1*ACCH2 + 1*CH3
pentylbenzene 5*ACH + 1*ACCH2 + 3*CH2 + 1*CH3
The bare AC group is reserved for a ring carbon whose substituent is not
an alkane group, for example styrene (1*CH2=CH + 5*ACH + 1*AC), a naphthalene
ring fusion, or one of the dedicated ACOH / ACCl / ACNO2 / ACNH2 groups.
Rings
The UMR-PRU set adds cyclic clones cCH2 (136), cCH (137) and cC (138).
They carry the same R and Q as CH2 / CH / C and sit in their own main groups
66–68 so that ring-specific interaction parameters can be regressed. Because R
and Q are identical, the combinatorial term is unaffected; only the residual
term changes. All cross terms between main group 1 and main groups 66–68 are
zero in the A, B and C matrices, and the rows are otherwise equal, so the two
choices differ only against water, CO2, CH4, N2, H2S, C2H6, Hg and TEG.
In UNIFACcompUMRPRU.csv every ring carbon uses the cyclic groups. This
matches the DDBST modified UNIFAC (Dortmund) assignment set, which uses its
cyclic subgroups 78/79/80 (CY-CH2, CY-CH, CY-C) for the same molecules:
cyclohexane 6*cCH2
methylcyclohexane 1*CH3 + 5*cCH2 + 1*cCH
n-butylcyclohexane 1*CH3 + 3*CH2 + 5*cCH2 + 1*cCH
cyclopropane 3*cCH2
Original UNIFAC has no cyclic groups at all — main groups 66–68 have no rows in
UNIFACInterParam.csv — so UNIFACcomp.csv correctly uses the aliphatic groups
for rings. The same molecule therefore has two different, both correct,
assignments in the two tables.
Small rings (C3, C4) are outside the range the Voutsas2017 parameters were
regressed on, since group contribution cannot represent ring strain. They are
assigned the cyclic groups anyway, because that is both the structurally correct
decomposition and what DDBST does.
Gases
Light gases are carried as a single dedicated group rather than decomposed:
CH4 (122), O2 (123), Ar (124), N2 (125), H2S (126), H2 (127), CO (128),
C2H6 (134). Spin isomers share the parent group, so ortho-hydrogen and
para-hydrogen both use H2 (127) — UNIFAC has no way to distinguish them.
Argon’s main group 59 has an interaction parameter only against water, so against hydrocarbons argon reduces to the combinatorial term alone.
Known gaps: ethylene and alkynes
ethylene has no representable assignment. Main group 2 (C=C) provides
only substituted subgroups — CH2=CH, CH=CH, CH2=C, CH=C, C=C — and none stands
for a bare CH2=CH2. DDBST has no assignment for it either, in any of its
original, modified or PSRK sets. Representing ethylene needs a dedicated fitted
group, the way Voutsas added C2H6 as group 134; it is not a data-entry fix and
must not be approximated with a substituted olefin group.
5-methyl-3-heptyne has the same problem for a different reason: DDBST assigns
the alkyne subgroup 66, which has no row in UNIFACGroupParam.csv and therefore
neither R and Q nor interaction parameters.
Both are listed in HYDROCARBONS_WITHOUT_A_GROUP in UnifacDatabaseIntegrityTest
so the “every hydrocarbon has an assignment” check does not demand a row that
cannot be written. They remain usable with the cubic equations of state.
Missing groups fail loudly
A component with no group assignment gives R = Q = 0, which makes the
combinatorial term evaluate to NaN rather than raising an error.
ComponentGEUnifac and ComponentGEUnifacUMRPRU therefore throw when a
component ends up with no groups.
Note that a UMR-PRU or PSRK component does not need a row in
UNIFACcomp.csv. PhaseGEUnifac skips building the classic components when it
is constructing a subclass, which would otherwise discard them immediately while
forcing every UMR-PRU component to be duplicated into the classic table.
Vapor-pressure data audit (issue #3822)
The public vapor-pressure API returns NaN when a correlation is unavailable,
inapplicable or produces a nonfinite/nonpositive pressure. Its inverse must close
the requested pressure before returning a temperature. It does not expose overflow
as a usable pressure or report a failed inverse iteration as success.
The H2O2 row combined an incompatible coefficient set with DIPPR dispatch and
produced infinity. Its liquid-vapor correlation is now explicitly unavailable.
Unverified copied tuples for PG, SF6, R12, R134a, COS, 3-methyl-1-butene and eight
branched/cyclic hydrocarbons are also unavailable, as are the all-zero sulfuric
acid, nitric acid and NO2 tuples. The standard COMP.csv records the corrections. The existing extended-database
loader applies the same reviewed standard correlations when COMP_EXT.csv is
selected, preserving unrelated extended data. This does not remove the components or their EOS parameters.
Species aliases and deliberate seawater/water or MEG variants are not automatically
rejected merely because their coefficients coincide.
Ammonia and H2S use sourced base-ten Antoine fits, with pressure in bar:
| Component | Source temperature range (K) | A | B | C for T in K |
|---|---|---|---|---|
| Ammonia | 239.6–371.5 | 4.86886 | 1113.928 | -10.409 |
| H2S | 212.8–349.5 | 4.52887 | 958.587 | -0.539 |
Sources: NIST Chemistry WebBook, Stull (1947),
ammonia and
hydrogen sulfide.
The database pow10 convention uses Celsius in the denominator, so its stored
C adds 273.15 to the tabulated Kelvin C. The table has no per-fit range columns;
callers must respect these fit ranges. The API’s generic positive-T/Tc check is
not a certification of validity throughout that larger interval.
AntoineHazopRegressionTest verifies these fits, their derivatives and inverses,
as well as rejection of the original H2O2 overflow from custom/legacy tables.
Ionic critical fields are pseudo-component model parameters, not measured
liquid-vapor critical points of isolated ions. CSV TC uses degrees Celsius,
whereas the Java getter uses kelvin. Replacing these model inputs with NaN
would invalidate electrolyte calculations; liquid-vapor applicability is instead
rejected explicitly for ions by the property API.
Water reference constants and model compatibility
neqsim.thermo.WaterReferenceConstants exposes the IAPWS-95 critical point of ordinary
water: CRITICAL_TEMPERATURE_K = 647.096, CRITICAL_PRESSURE_PA = 22064000, and
CRITICAL_PRESSURE_BARA = 220.64. These are physical reference values from the
IAPWS G5-01(2026) guideline, section 4.1.
The Henry-law and humid-air IAPWS correlations use this shared reference.
These constants do not apply to isotopically substituted water.
The COMP water row retains the established simulation parameters TC = 374.15 °C
(647.30 K) and PC = 220.89 bara. ComponentInterface.getTC() and getPC() return
these model parameters, including explicit user overrides, rather than replacing them
with reference values. The legacy values are not the IAPWS physical critical point;
no claim of experimental fitting provenance is made for them.
Replacing the shared parameters changes cubic-EOS terms, CPA attraction functions, transport correlations and flash initialization. The direct substitution in #4128 caused phase-count, chemical-closure, salt-saturation and hydrate-inventory regressions. Migration of these model parameters remains unqualified and must include model-specific assessment and physical validation, rather than changing expected test results alone. Issue #4091 therefore remains open for the model migration and viscosity-data concerns.
Data Integrity Gates
Two JUnit tests guard these tables. Both compare the current findings against a baseline of accepted, pre-existing issues, and both fail if a baseline entry has been fixed, so the baselines can only shrink.
| Test | Guards | Baseline |
|---|---|---|
ComponentDatabaseIntegrityTest |
COMP.csv | src/test/resources/data/comp_known_issues.tsv |
UnifacDatabaseIntegrityTest |
UNIFAC tables | src/test/resources/data/unifac_known_issues.tsv |
UnifacDatabaseIntegrityTest checks subgroup R, Q and main group against the
DDBST published values, duplicate component names, subgroups with no parameter
row, components with no groups, molar mass implied by the assigned groups
against COMP.csv, and the aromatic and ring conventions above.
The baseline is a ratchet, not a requirement to preserve defects. A fixed finding must be removed in the same change. Do not add newly introduced defects to make a test pass. The screening commands below can help inspect a proposed data change:
python devtools/screen_unifac_tables.py --tsv > src/test/resources/data/unifac_known_issues.tsv
python devtools/screen_component_database.py --tsv > src/test/resources/data/comp_known_issues.tsv
Write these files as UTF-8 without a byte order mark. On Windows use Python rather than PowerShell redirection, which adds a BOM.
The screening scripts and the tests do not report the same findings. The checks are implemented twice: in Python in
devtools/, and again in Java inside the tests.screen_unifac_tables.pyemits nomissing_unifac_rowfinding at all, so regeneratingunifac_known_issues.tsvfrom it deletes every such entry and the test then reports them all as new. Take the delta from the test failure output, which lists exactly what to add and remove, and edit the baseline rather than overwriting it.
CI does not run these tests for a data-only change. The
Detect Java/XML changesjob skips the whole test matrix when a pull request touches no.javaor.xmlfile, so a change toCOMP.csvor the UNIFAC tables alone goes green with these gates never executed. Run them locally:./mvnw test -Dtest=ComponentDatabaseIntegrityTest,UnifacDatabaseIntegrityTestNote the comma: surefire treats
+as a literal, and-Dtest=A+Bmatches nothing and fails with “No tests matching pattern”.
See Also
- Fluid Creation Guide - How to create fluids using these parameters
- Mixing Rules Guide - Binary interaction parameters (kij)
- Mathematical Models - Model equations using these parameters
References
- Soave, G. (1972). Equilibrium constants from a modified Redlich-Kwong equation of state. Chemical Engineering Science, 27(6), 1197-1203.
- Peng, D. Y., & Robinson, D. B. (1976). A new two-constant equation of state. Industrial & Engineering Chemistry Fundamentals, 15(1), 59-64.
- Kontogeorgis, G. M., et al. (1999). An equation of state for associating fluids. Industrial & Engineering Chemistry Research, 38(10), 4073-4082.
- Gross, J., & Sadowski, G. (2001). Perturbed-chain SAFT: An equation of state based on a perturbation theory for chain molecules. Industrial & Engineering Chemistry Research, 40(4), 1244-1260.
- Hansen, H. K., Rasmussen, P., Fredenslund, A., Schiller, M., & Gmehling, J. (1991). Vapor-liquid equilibria by UNIFAC group contribution. 5. Revision and extension. Industrial & Engineering Chemistry Research, 30(10), 2352-2355.
- Holderbaum, T., & Gmehling, J. (1991). PSRK: A group contribution equation of state based on UNIFAC. Fluid Phase Equilibria, 70(2-3), 251-265.
- DDBST GmbH. Published parameters for original UNIFAC. https://www.ddbst.com/published-parameters-unifac.html