Skip to the content.

Dew-point calculations locate a phase-appearance boundary for a defined gas composition and pressure. They are sensitive to sampling, water or heavy-end content, model selection, binary-interaction parameters, and the specified pressure. Treat NeqSim results as calculation evidence, not as proof that a sample, measurement procedure, or delivery point complies with a standard or contract.

Choose the maintained calculation path

Engineering question Current class Current boundary
Water dew point at one pressure Standard_ISO18453 Converts a non-GERG-water input composition to an internal SystemGERGwaterEos and runs waterDewPointTemperatureFlash()
Legacy database-backed water-dew-point rows Draft_ISO18453 Retained for compatibility in BaseContract; new direct calculations should use Standard_ISO18453
Hydrocarbon dew point at the class’s fixed pressure BestPracticeHydrocarbonDewPoint Copies non-water components into an internal SRK system, applies mixing rule 2, and calculates at 50 bara
Dew-point curve, cricondentherm, or cricondenbar Phase-envelope or saturation operations The fixed-pressure standards classes do not calculate these envelope extrema

A dew point at 50 bara is not the cricondentherm. The cricondentherm is the maximum temperature on the complete phase envelope and generally occurs at a pressure determined by the envelope calculation.

Water dew point with Standard_ISO18453

The current class is documented in source as superseding Draft_ISO18453. It accepts any SystemInterface; when the input is not already a GERG-water system, the constructor copies the phase-0 component names and mole amounts into a new SystemGERGwaterEos.

The calculation pressure is absolute pressure in bara. Use setPressure(double) or setReferencePressure(double) before calculate(). The primary result key is dewPointTemperature; the no-unit getter returns degrees Celsius, while the two-argument getter recognizes "K" and "F" conversions.

Executable Java 8 example

import neqsim.standards.gasquality.Standard_ISO18453;
import neqsim.thermo.system.SystemGERGwaterEos;
import neqsim.thermo.system.SystemInterface;

SystemInterface wetGas = new SystemGERGwaterEos(268.15, 20.0);
wetGas.addComponent("methane", 0.9);
wetGas.addComponent("water", 0.0000051);
wetGas.createDatabase(true);
wetGas.setMixingRule(8);
wetGas.init(0);

Standard_ISO18453 waterDewPoint = new Standard_ISO18453(wetGas);
waterDewPoint.setPressure(70.0);
waterDewPoint.calculate();

double waterDewPointC =
    waterDewPoint.getValue("dewPointTemperature", "C");
double calculationPressureBara = waterDewPoint.getValue("pressure");

For the repository fixture, the result is approximately -28.493 °C at 70 bara. That number validates the documented API and bundled model behavior; it is not a generic natural-gas expectation.

Water-dew-point contract decisions

Apply the governing limit explicitly in the project layer:

double maximumWaterDewPointC = -8.0;
boolean withinWaterDewPointLimit =
    Double.isFinite(waterDewPointC)
        && waterDewPointC <= maximumWaterDewPointC;

isOnSpec() compares the calculated value with getSalesContract().getWaterDewPointTemperature(). The default embedded BaseContract limit is not evidence for a particular delivery point. setDewPointTemperatureSpec(double) stores a separate class field that the current isOnSpec() implementation does not read. Prefer the explicit comparison above unless a verified ContractInterface has been attached.

The direct operation solves equality of water fugacity between the feed gas and a pure incipient condensed phase. It uses a bracketed temperature solve with a relative fugacity criterion; an exhausted iteration limit is a failure, not a dew point. Positive water content and positive finite absolute pressure are required. The legacy direct pure-MEG calculation is also supported. The standard classes log a failed calculation and return NaN, so isOnSpec() is false.

The bracket refinement reuses its endpoint residuals for secant steps and bisects at least every second trial. Invalid or out-of-bracket predictions also use bisection. Acceptance still requires a logarithmic fugacity residual no greater than 1e-9; this acceleration does not change the condensed-phase reference, standards model, pressure or composition treatment.

Ice, liquid water, and applicability

ISO 18453:2004, clauses 3–5, uses separate water attraction functions for vapour pressure over ice below 273.16 K and over liquid water above it. A subzero ISO result therefore must not be compared with a supercooled-liquid dew point without identifying the condensed phase. Hydrate equilibrium is another, separate boundary.

The validated working range is −15 to +5 °C and 5 to 100 bara, subject to the standard’s composition limits. The extended range is −50 to +40 °C and 1 to 300 bara, with unknown correlation uncertainty. Thus −26 °C is outside the validated range but inside the extended range. Numerical convergence does not extend the model’s engineering validity; do not use extrapolation outside the extended range as an ISO-qualified result.

A result differing from an ideal-gas estimate alone does not identify a coding error. Use the same ice/liquid reference and check fugacity equilibrium, model parameters and applicability first. The direct operation retains the existing pure condensed-phase approximation; it does not model dissolved gas, mixed water/glycol liquids, or hydrates. Use and qualify the multiphase/CPA or hydrate operation for those questions. The ISO-model low-temperature deviations from measurements are discussed by Rajzinger (2012), Table 2; matching that model is distinct from matching experimental data.

Temperature-derivative consistency

The GERG-water attraction function uses a fourth-power term. Its first and second temperature derivatives must differentiate that same expression, for both the generic diffalphaT/diffdiffalphaT APIs and the legacy GERG-specific aliases. All paths select the ice coefficients below 273.16 K and liquid-water coefficients at or above that temperature. The derivatives are branch-local; a finite-difference check must not straddle the coefficient switch.

The former implementation differentiated a cubic term and inherited ordinary PR alpha derivatives through the generic APIs. Recalculate derivative-dependent properties, including enthalpy and heat capacity, obtained with that version. The direct bracketed dew-point operation does not use those temperature derivatives. Its existing control values are retained, apart from the corrected coefficient selection in the narrow interval 273.15–273.16 K.

Regression coverage compares both derivatives with finite differences, checks the mixed-gas fugacity derivatives with ThermodynamicModelTest, and compares synthetic methane/ethane/propane dew points with an independent PR-root calculation using ISO 18453 Table 2–3 parameters. The bundled component database uses slightly different constants; the comparison tolerance is a numerical fixture tolerance, not the standard’s experimental correlation uncertainty. This establishes the checked mathematical identities and model comparisons; full ISO conformity still requires the governing standard’s controlled examples and complete composition and applicability checks.

Trace-water process analyser

WaterDewPointAnalyser’s CPA method solves fixed-feed-gas equilibrium against a water-rich liquid, including dissolved gas, using Statoil SRK-CPA. It uses metastable liquid water below freezing and excludes solid and hydrate searches. Unlike the former phase-appearance search, its stopping criterion is water fugacity equilibrium; the amount of an incipient phase does not set the answer. Failed measurements return NaN, and the process stream remains unchanged.

The direct API is waterDewPointTemperatureFlash(true). It requires a non-reacting gas and a liquid with more than 50 mol% water. Dissolved components satisfy their gas/liquid fugacity equations while water closes the liquid composition. This keeps the solve on the aqueous branch rather than accepting the trivial gas-composition root. It does not check global stability against other liquid phases. Select the analyser’s multiphase method on a CPA stream when hydrocarbon liquids or glycol-rich liquids must be included. The existing no-argument direct operation retains its pure-condensate reference.

For a synthetic gas containing 95% methane before moisture substitution, 3% ethane, 1% nitrogen and 1% CO2, 5 ppmv water at 43 bara gives approximately −43.90 °C with the mixed-liquid CPA method. GERG-water gives approximately −34.50 °C. These numerical fixtures use different condensed-phase models; agreement within 3 °C is not a valid universal acceptance criterion. Tests cover 1–100 ppmv at 43 and 70 bara and independently reinitialize both EOS phases to check every component’s fugacity equality. This establishes numerical equilibrium, not experimental accuracy of either low-temperature model.

Before the convergence correction, the fixed temperature step scaled with absolute water mole fraction and could stop at 10,000 iterations far from equilibrium, especially in dry gas. Earlier stored dew-point values from this operation should be recalculated. Retain the input composition, water basis, pressure, model, NeqSim version and convergence diagnostics with each result.

Screen an extractive analyser sample system

A dew-point calculation alone does not prove that an extractive analyser sees the process gas. The public AnalyserSampleSystem class added in #4715 screens four common sample-system effects:

Flows are normal litres per hour at 0 °C and 1.01325 bara. Pressures are absolute bara, tube dimensions are metres, and temperatures supplied to the sample-system setters are degrees Celsius. The water model uses Bukacek. Hydrocarbon dew point uses a NeqSim flash after removing water and glycols. Film calculations assume a saturated outlet: water dry-out is therefore a lower bound for the stated film mass and flow. Glycol dry-out uses a CPA flash with a vapour-pressure fallback; it is not a sensor-recovery guarantee.

Executable Java 8 screening example

import neqsim.process.measurementdevice.AnalyserSampleSystem;
import neqsim.thermo.system.SystemInterface;
import neqsim.thermo.system.SystemSrkCPAstatoil;
import neqsim.thermo.util.empiric.BukacekWaterInGas;

public class AnalyserSampleSystemGuideExample {
  public static void main(String[] args) {
    double pressureBara = 63.0;
    double waterMoleFraction =
        BukacekWaterInGas.getWaterInGas(273.15 - 40.0, pressureBara);
    double dryMoleFraction = 1.0 - waterMoleFraction;

    SystemInterface sampleGas =
        new SystemSrkCPAstatoil(273.15 + 25.0, pressureBara);
    sampleGas.addComponent("methane", 0.85 * dryMoleFraction);
    sampleGas.addComponent("ethane", 0.08 * dryMoleFraction);
    sampleGas.addComponent("propane", 0.04 * dryMoleFraction);
    sampleGas.addComponent("n-butane", 0.02 * dryMoleFraction);
    sampleGas.addComponent("n-hexane", 0.01 * dryMoleFraction);
    sampleGas.addComponent("water", waterMoleFraction);
    sampleGas.addComponent("TEG", 0.0);
    sampleGas.setMixingRule(10);

    AnalyserSampleSystem sampleSystem =
        new AnalyserSampleSystem(sampleGas);
    sampleSystem.setTubeTemperatureC(20.0);
    sampleSystem.setRegulatorOutletPressureBara(3.5);
    sampleSystem.setFlowsNlPerHour(15.0, 90.0);
    sampleSystem.setTubeGeometry(1.4e-3, 9.0);

    double tapDewPointC = sampleSystem.getWaterDewPointAtTapC();
    double condensationMarginK =
        sampleSystem.getWaterCondensationMarginK();
    double transportLagSeconds = sampleSystem.getTransportLagSeconds();
    double waterFilmDryOutHours =
        sampleSystem.getWaterFilmDryOutTimeHours(
            1.0e-3, 60.0, 2.0, 15.0);

    if (Math.abs(tapDewPointC + 40.0) > 0.05
        || sampleSystem.isWaterCondensingInTube()
        || Math.abs(condensationMarginK - 60.0) > 0.1
        || !Double.isFinite(transportLagSeconds)
        || transportLagSeconds <= 1.0
        || transportLagSeconds >= 600.0
        || !Double.isFinite(waterFilmDryOutHours)
        || waterFilmDryOutHours <= 0.0) {
      throw new IllegalStateException(
          "Sample-system screening is outside the documented bounds");
    }
  }
}

This synthetic dry-gas case should give a water dew point near −40 °C at the tap, a positive condensation margin near 60 K, no water condensation, and a finite transport lag. Those checks validate the documented API and qualitative engineering bounds; they do not validate an installed sample system.

Before using the result, replace the synthetic composition and geometry with controlled data and verify the process tap, heat tracing, regulator, bypass, analyser flow, material compatibility, calibration, response test, uncertainty, and governing measurement procedure. A positive margin is a screening result, not evidence of representative sampling. Do not interpret the lower-bound film time as an allowed restart delay or the glycol estimate as a maintenance interval.

Hydrocarbon dew point with BestPracticeHydrocarbonDewPoint

The constructor copies every phase-0 component except exact component name water into a new SystemSrkEos, applies mixing rule 2, and initializes an internal calculation system. It does not reuse the input fluid’s EOS or fitted binary-interaction parameters.

The current implementation has a fixed specPressure of 50.0 bara. calculate() resets the internal system to that pressure. The inherited setReferencePressure(double) method does not change specPressure, and changing the pressure of the input fluid after construction does not change the calculation pressure.

Executable Java 8 example

import neqsim.standards.gasquality.BestPracticeHydrocarbonDewPoint;
import neqsim.thermo.system.SystemInterface;
import neqsim.thermo.system.SystemSrkEos;

SystemInterface richGas = new SystemSrkEos(293.15, 70.0);
richGas.addComponent("methane", 0.85);
richGas.addComponent("ethane", 0.05);
richGas.addComponent("propane", 0.03);
richGas.addComponent("i-butane", 0.01);
richGas.addComponent("n-butane", 0.015);
richGas.addComponent("i-pentane", 0.005);
richGas.addComponent("n-pentane", 0.005);
richGas.addComponent("n-hexane", 0.003);
richGas.addComponent("nitrogen", 0.02);
richGas.addComponent("CO2", 0.012);
richGas.setMixingRule("classic");

BestPracticeHydrocarbonDewPoint hydrocarbonDewPoint =
    new BestPracticeHydrocarbonDewPoint(richGas);
hydrocarbonDewPoint.calculate();

double hydrocarbonDewPointC =
    hydrocarbonDewPoint.getValue(
        "hydrocarbondewpointTemperature", "C");
double calculationPressureBara =
    hydrocarbonDewPoint.getValue("pressure");

The result should be finite and the reported calculation pressure is 50 bara. The two-argument getter does not currently convert hydrocarbon-dew-point units; use "C" and report degrees Celsius.

Do not use BestPracticeHydrocarbonDewPoint.isOnSpec() for a hydrocarbon limit. The current method compares the hydrocarbon result with the attached contract’s water-dew-point temperature. Apply the verified hydrocarbon limit explicitly:

double maximumHydrocarbonDewPointC = -2.0;
boolean withinHydrocarbonDewPointLimit =
    Double.isFinite(hydrocarbonDewPointC)
        && hydrocarbonDewPointC <= maximumHydrocarbonDewPointC;

The value above only illustrates caller-owned comparison logic. Replace it with the controlled limit, pressure range, uncertainty, and rounding rules from the governing agreement.

Curves and envelope extrema

Do not build a pressure curve by changing the source fluid pressure and repeatedly constructing BestPracticeHydrocarbonDewPoint; every instance still calculates at 50 bara. For a curve or envelope extremum, use a thermodynamic phase-envelope or saturation workflow that exposes pressure as a calculation input, then validate the selected EOS and characterization against measured dew-point data.

For hydrocarbon-dew-point work, preserve and qualify:

For water-dew-point work, also qualify water-content measurement, acid gases, glycols or inhibitors, salinity where relevant, and the applicability range of the chosen water model.

Reporting and engineering boundary

Every reported result should include:

  1. sample or case identity and composition basis;
  2. NeqSim version and class name;
  3. EOS, mixing rule, characterization, and parameter provenance;
  4. absolute calculation pressure in bara;
  5. dew-point temperature and unit;
  6. convergence or failure diagnostics;
  7. governing standard or contract edition from a controlled source;
  8. project limit, uncertainty, rounding rule, and accountable reviewer.

Class names such as Standard_ISO18453 do not establish that sampling, instrumentation, calibration, data reduction, or the complete requirements of a licensed standard have been satisfied.