Skip to the content.

neqsim.process.equipment.util.ProducedWaterDegassingSystem builds an inlet, three pressure-reduction heaters, and three separators (degasser, CFU, caisson). It calculates gas release and component emission rates with EmissionsCalculator. Use it for screening with an explicit calculation basis and independent validation.

Thermodynamic model and limitations

The builder uses SystemSrkCPAstatoil, mixing rule 10, multiphase checking, and the current NeqSim database interaction parameters. Water is initially 95 mol%; the specified gas fractions distribute the remaining 5 mol%. This is an assumed loading, not a fit to a measured gas-water ratio (GWR). Flow in m3/hr is converted to mass using an assumed water density of 1000 kg/m3.

setSalinity currently stores reporting metadata only: it does not add NaCl, change interaction parameters, or implement salting out. The gas composition, water flow, temperature, and stage pressures remain separate inputs. This convenience builder does not accept or modify a caller-owned fluid. For a separately characterized fluid, assemble Stream, Heater, and ThreePhaseSeparator equipment directly and validate that model independently.

Optional tuning is unsupported

setTunedInteractionParameters(true) throws UnsupportedOperationException before changing model state. Previously it silently retained default coefficients. Omit the call, or explicitly use false, to select the unchanged database model. The same rejection applies at build(), both run() entry points, and result access to protect older serialized models that retained a true flag. A rejected setter call leaves an existing process and its results intact. For an older model, explicitly select false and rebuild before running.

There is no supported optional tuned model or claimed validity range in this builder. Its legacy KIJ_WATER_* constants remain available for source compatibility, are deprecated, and are not applied to any fluid.

The Kristiansen et al. workshop paper (2023) is background for a separate field-calibrated model. Appendix A, Eq. (6), defines $k_{ij}=k_{ij,0}+k_{ij,T}(T-288.15)$ with temperature $T$ in kelvin and $k_{ij,T}$ in inverse kelvin. Its Table 2 was fitted to water containing about 10–11 wt% NaCl. These coefficients are not default neutral/electrolyte parameters. Applying them requires reconciliation of the full EOS, association, mixing-rule, temperature-reference, and salinity conventions, followed by validation against independent public data. Combining a salt-specific fit with an explicit salt correction can double-count salinity. See issue #4483 and the broader provenance work in #4234.

The paper’s field uncertainty and reporting qualifications do not establish the accuracy or regulatory suitability of this screening builder. Results require a case-specific uncertainty assessment and applicable reporting review.

Executable Java example

This example uses the supported default model, synthetic conditions, and absolute pressures. ProducedWaterDegassingDocumentationTest compiles and executes this exact code fence against the current source.

import java.util.Map;
import neqsim.process.equipment.util.ProducedWaterDegassingSystem;

public class ProducedWaterDegassingExample {
  /**
   * Runs a synthetic screening case with the default database model.
   *
   * @return the executed model for inspection or integration
   */
  public static ProducedWaterDegassingSystem runExample() {
    ProducedWaterDegassingSystem system = new ProducedWaterDegassingSystem("Screening PW");
    system.setWaterFlowRate(100.0, "m3/hr");
    system.setWaterTemperature(80.0, "C");
    system.setInletPressure(30.0, "bara");
    system.setDegasserPressure(4.0, "bara");
    system.setCFUPressure(1.2, "bara");
    system.setCaissonPressure(1.01325, "bara");
    system.setDissolvedGasComposition(
        new String[] {"CO2", "methane", "ethane", "propane"},
        new double[] {0.51, 0.44, 0.04, 0.01});
    system.setTunedInteractionParameters(false);
    system.setLabGWR(0.85);
    system.run();
    Map<String, Object> comparison = system.getValidationResults();
    if (comparison == null || !comparison.containsKey("GWR")) {
      throw new IllegalStateException("Missing lab comparison");
    }
    return system;
  }
}

The lab value above is synthetic and demonstrates comparison reporting; it is not an independent physical validation. Inspect getValidationResults() and getMethodComparisonReport() together with the model basis. Setting lab data only computes deviations; it never calibrates coefficients or inlet loading. The legacy passesRegulatoryCriteria map key tests a fixed 7.5% GWR threshold, not regulatory compliance or a complete uncertainty budget.

API reference

Method Supported behavior
setWaterFlowRate(double, String) kg/hr, m3/hr, bbl/day; volume conversion assumes 1000 kg/m3
setWaterTemperature(double, String) C, K, F
setInletPressure(double, String) bara, barg, psia, psig
setDegasserPressure(double, String) First-stage pressure
setCFUPressure(double, String) Second-stage pressure
setCaissonPressure(double, String) Third-stage pressure
setDissolvedGasComposition(String[], double[]) Gas component names and mole fractions
setDissolvedGasComposition(Map<String, Double>) Copies the supplied gas composition
setSalinity(double, String) Stores metadata in wt%, ppm, or molal; no thermodynamic salt effect
setTunedInteractionParameters(boolean) false: database model; true: throws
setLabGWR(double) Comparison GWR in Sm3 gas per Sm3 water
setLabGasComposition(Map<String, Double>) Copies lab gas mole fractions for comparison
build() Builds or explicitly rebuilds the process from current configuration
run() / run(UUID) Executes the process; builds it if absent
getProcessSystem() Exposes the composed process
getDegasserEmissions() / getCFUEmissions() / getCaissonEmissions() Stage calculators
getTotalCO2EmissionRate(String) / getTotalMethaneEmissionRate(String) / getTotalNMVOCEmissionRate(String) Total component mass rates, e.g. kg/hr or tonnes/year
getTotalCO2Equivalents(String) CO2 equivalents; built-in factors CH4=28 and nmVOC=2.2
getEmissionsReport() / getMethodComparisonReport() Text reports after running
getValidationResults() / toMap() Comparison metrics / results suitable for JSON serialization

After changing configuration on a previously built model, call build() again before run(); the convenience runner only builds when the process is absent. Stage temperatures follow the heater/flash calculations; inlet temperature is not an independent temperature setpoint for every stage.