Class SeparatorPerformanceCalculator

java.lang.Object
neqsim.process.equipment.separator.entrainment.SeparatorPerformanceCalculator
All Implemented Interfaces:
Serializable

public class SeparatorPerformanceCalculator extends Object implements Serializable
Calculates detailed separation performance for a separator or scrubber using droplet size distributions and grade efficiency curves.

This calculator provides an optional, physics-based alternative to the simple entrainment fractions in the base Separator class. When enabled, it computes entrainment from first-principles using:

  1. Inlet droplet size distribution (Rosin-Rammler, log-normal, or from Hinze correlation)
  2. Gravity separation section — cut diameter from vessel geometry and gas/liquid residence time
  3. Mist eliminator grade efficiency — wire mesh, vane pack, cyclone, or custom
  4. Liquid-liquid separation (three-phase) — oil/water droplet settling with plate pack option

The overall entrainment is the fraction of the inlet DSD that passes through all separation stages without being captured. For three-phase separators, separate calculations are performed for gas-oil, gas-water, oil-in-water, and water-in-oil entrainment.

Usage pattern:

SeparatorPerformanceCalculator calc = new SeparatorPerformanceCalculator();

// Configure inlet DSD (e.g., from pipe flow)
calc.setGasLiquidDSD(DropletSizeDistribution.rosinRammler(100e-6, 2.6));

// Configure mist eliminator
calc.setMistEliminatorCurve(GradeEfficiencyCurve.wireMeshDefault());

// Run calculation
calc.calculate(gasDensity, oilDensity, waterDensity, gasViscosity, oilViscosity, waterViscosity,
    gasVelocity, separatorDiameter, separatorLength, orientation, liquidLevelFraction);

// Get results
double oilInGas = calc.getOilInGasFraction();
double waterInGas = calc.getWaterInGasFraction();
Version:
1.0
Author:
NeqSim team
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      Serialization version UID.
      See Also:
    • G

      private static final double G
      Gravitational acceleration [m/s2].
      See Also:
    • gasLiquidDSD

      private DropletSizeDistribution gasLiquidDSD
      Inlet droplet size distribution for liquid-in-gas.
    • oilInWaterDSD

      private DropletSizeDistribution oilInWaterDSD
      Inlet droplet size distribution for oil-in-water (three-phase).
    • waterInOilDSD

      private DropletSizeDistribution waterInOilDSD
      Inlet droplet size distribution for water-in-oil (three-phase).
    • gasBubbleDSD

      private DropletSizeDistribution gasBubbleDSD
      Inlet droplet size distribution for gas bubbles in liquid.
    • mistEliminatorCurve

      private GradeEfficiencyCurve mistEliminatorCurve
      Grade efficiency curve for the mist eliminator (gas section).
    • oilWaterCoalescerCurve

      private GradeEfficiencyCurve oilWaterCoalescerCurve
      Grade efficiency curve for oil-water coalescer (if present).
    • includeGravitySection

      private boolean includeGravitySection
      Whether to include gravity pre-separation before mist eliminator.
    • flowRegimeCalc

      private MultiphaseFlowRegime flowRegimeCalc
      Flow regime calculator for the inlet pipe.
    • inletDeviceModel

      private InletDeviceModel inletDeviceModel
      Inlet device model.
    • geometryCalc

      private SeparatorGeometryCalculator geometryCalc
      Separator geometry calculator.
    • useEnhancedCalculation

      private boolean useEnhancedCalculation
      Whether to use the enhanced calculation chain (flow regime + inlet device + geometry).
    • inletPipeDiameter

      private double inletPipeDiameter
      Inlet pipe diameter [m] for flow regime prediction.
    • surfaceTension

      private double surfaceTension
      Gas-liquid interfacial tension [N/m] for DSD generation.
    • oilWaterInterfacialTension

      private double oilWaterInterfacialTension
      Oil-water interfacial tension [N/m] for liquid-liquid DSD estimation.
    • liquidLiquidResidenceTimeOverride

      private double liquidLiquidResidenceTimeOverride
      Liquid-liquid residence time override [s]. Zero means use geometry-calculated value.
    • oilVolumeFraction

      private double oilVolumeFraction
      Oil volume fraction in the liquid phase [0-1] for three-phase calculations. Defaults to 0.5 (equal oil/water split). Set via setOilVolumeFraction(double) when the actual oil/water split is known from the thermodynamic system.
    • applyTurbulenceCorrection

      private boolean applyTurbulenceCorrection
      Whether to apply turbulent diffusion correction to the gravity cut diameter.
    • mistEliminatorFlooded

      private boolean mistEliminatorFlooded
      Whether flooding was detected in the mist eliminator.
    • postInletDeviceDSD

      private DropletSizeDistribution postInletDeviceDSD
      DSD after inlet device transformation (intermediate result).
    • apiComplianceResult

      private transient DropletSettlingCalculator.ApiComplianceResult apiComplianceResult
      API 12J compliance result (populated after calculate() if geometry is known).
    • oilInGasFraction

      private double oilInGasFraction
      Calculated oil-in-gas entrainment fraction (volume basis).
    • waterInGasFraction

      private double waterInGasFraction
      Calculated water-in-gas entrainment fraction (volume basis).
    • gasInOilFraction

      private double gasInOilFraction
      Calculated gas-in-oil carry-under fraction (volume basis).
    • gasInWaterFraction

      private double gasInWaterFraction
      Calculated gas-in-water carry-under fraction (volume basis).
    • oilInWaterFraction

      private double oilInWaterFraction
      Calculated oil-in-water fraction (volume basis).
    • waterInOilFraction

      private double waterInOilFraction
      Calculated water-in-oil fraction (volume basis).
    • gravitySectionEfficiency

      private double gravitySectionEfficiency
      Gravity section efficiency for gas-liquid separation.
    • mistEliminatorEfficiency

      private double mistEliminatorEfficiency
      Mist eliminator efficiency.
    • overallGasLiquidEfficiency

      private double overallGasLiquidEfficiency
      Overall gas-liquid separation efficiency.
    • gravityCutDiameter

      private double gravityCutDiameter
      Gravity section cut diameter [m].
    • liquidLiquidGravityEfficiency

      private double liquidLiquidGravityEfficiency
      Liquid-liquid gravity section efficiency.
    • kFactor

      private double kFactor
      K-factor (Souders-Brown) at operating conditions.
    • kFactorUtilization

      private double kFactorUtilization
      K-factor utilization (operating K / design K).
    • liquidInGasCalibrationFactor

      private double liquidInGasCalibrationFactor
      Calibration multiplier for liquid-in-gas carryover fractions.
    • gasCarryUnderCalibrationFactor

      private double gasCarryUnderCalibrationFactor
      Calibration multiplier for gas carry-under fractions (gas in liquid).
    • liquidLiquidCalibrationFactor

      private double liquidLiquidCalibrationFactor
      Calibration multiplier for liquid-liquid cross-contamination fractions.
    • inletDeviceBulkEfficiency

      private double inletDeviceBulkEfficiency
      Inlet device bulk separation efficiency.
    • inletFlowRegime

      private MultiphaseFlowRegime.FlowRegime inletFlowRegime
      Flow regime at separator inlet.
  • Constructor Details

    • SeparatorPerformanceCalculator

      public SeparatorPerformanceCalculator()
      Creates a new SeparatorPerformanceCalculator with default settings.
  • Method Details

    • calculate

      public void calculate(double gasDensity, double oilDensity, double waterDensity, double gasViscosity, double oilViscosity, double waterViscosity, double gasVelocity, double vesselDiameter, double vesselLength, String orientation, double liquidLevelFraction)
      Performs the full separation performance calculation.

      This method calculates entrainment fractions for all relevant phase pairs based on the configured droplet size distributions, grade efficiency curves, and separator geometry.

      Parameters:
      gasDensity - gas phase density [kg/m3]
      oilDensity - oil phase density [kg/m3], 0 if no oil
      waterDensity - water phase density [kg/m3], 0 if no water
      gasViscosity - gas phase dynamic viscosity [Pa.s]
      oilViscosity - oil phase dynamic viscosity [Pa.s]
      waterViscosity - water phase dynamic viscosity [Pa.s]
      gasVelocity - superficial gas velocity in gas section [m/s]
      vesselDiameter - internal diameter of separator [m]
      vesselLength - length of separator [m]
      orientation - "horizontal" or "vertical"
      liquidLevelFraction - fraction of vessel cross-section occupied by liquid (horizontal) or fraction of height (vertical) [0-1]
    • applyCalibrationFactors

      private void applyCalibrationFactors()
      Applies user-defined calibration multipliers to calculated entrainment fractions.

      This preserves the mechanistic model structure while allowing reconciliation to plant/vendor test data. All calibrated values are clamped to [0, 1].

    • clamp01

      private static double clamp01(double value)
      Clamps a value to the physical [0, 1] range.
      Parameters:
      value - raw value
      Returns:
      clamped value in [0, 1]
    • calculateStandard

      private void calculateStandard(double gasDensity, double oilDensity, double waterDensity, double gasViscosity, double oilViscosity, double waterViscosity, double gasVelocity, double vesselDiameter, double vesselLength, String orientation, double liquidLevelFraction)
      Standard calculation path (original implementation).
      Parameters:
      gasDensity - gas density [kg/m3]
      oilDensity - oil density [kg/m3]
      waterDensity - water density [kg/m3]
      gasViscosity - gas viscosity [Pa.s]
      oilViscosity - oil viscosity [Pa.s]
      waterViscosity - water viscosity [Pa.s]
      gasVelocity - gas velocity [m/s]
      vesselDiameter - vessel diameter [m]
      vesselLength - vessel length [m]
      orientation - vessel orientation
      liquidLevelFraction - liquid level fraction
    • calculateEnhanced

      private void calculateEnhanced(double gasDensity, double oilDensity, double waterDensity, double gasViscosity, double oilViscosity, double waterViscosity, double gasVelocity, double vesselDiameter, double vesselLength, String orientation, double liquidLevelFraction)
      Enhanced calculation chain integrating flow regime prediction, inlet device modeling, detailed vessel geometry, and database-driven internals performance.

      Calculation sequence:

      1. Predict inlet pipe flow regime and generate regime-specific DSD
      2. Model inlet device: bulk separation, DSD transformation, pressure drop
      3. Calculate vessel geometry: gas/liquid areas, settling heights, K-factor
      4. Gravity section: droplet settling with proper residence time from geometry
      5. Mist eliminator: grade efficiency with K-factor flooding check
      6. Liquid-liquid separation with geometry-based residence time (three-phase)
      Parameters:
      gasDensity - gas phase density [kg/m3]
      oilDensity - oil phase density [kg/m3], 0 if no oil
      waterDensity - water phase density [kg/m3], 0 if no water
      gasViscosity - gas phase dynamic viscosity [Pa.s]
      oilViscosity - oil phase dynamic viscosity [Pa.s]
      waterViscosity - water phase dynamic viscosity [Pa.s]
      gasVelocity - superficial gas velocity in gas section [m/s]
      vesselDiameter - internal diameter of separator [m]
      vesselLength - length of separator [m]
      orientation - "horizontal" or "vertical"
      liquidLevelFraction - fraction of vessel cross-section occupied by liquid [0-1]
    • calcGasLiquidSeparation

      private void calcGasLiquidSeparation(double gasDensity, double liquidDensity, double gasViscosity, double gasVelocity, double diameter, double length, String orientation, double liquidLevelFrac)
      Calculates gas-liquid separation efficiency combining gravity section and mist eliminator.
      Parameters:
      gasDensity - gas density [kg/m3]
      liquidDensity - liquid density [kg/m3]
      gasViscosity - gas viscosity [Pa.s]
      gasVelocity - superficial gas velocity [m/s]
      diameter - vessel diameter [m]
      length - vessel length [m]
      orientation - vessel orientation
      liquidLevelFrac - liquid level fraction
    • calcCombinedEfficiency

      private double calcCombinedEfficiency(DropletSizeDistribution dsd, GradeEfficiencyCurve stage1, GradeEfficiencyCurve stage2)
      Calculates combined efficiency of two stages in series (gravity + mist eliminator).

      For each size class, the combined efficiency is:

      $$ \eta_{combined}(d) = 1 - (1 - \eta_1(d)) \cdot (1 - \eta_2(d)) $$
      Parameters:
      dsd - droplet size distribution
      stage1 - first stage (gravity)
      stage2 - second stage (mist eliminator)
      Returns:
      combined overall efficiency
    • estimateLiquidResidenceTime

      private static double estimateLiquidResidenceTime(double diameter, double length, String orientation, double liquidLevelFrac, double gasVelocity)
      Estimates the liquid residence time from vessel geometry and gas velocity.

      Uses mass continuity to derive the superficial liquid velocity from the superficial gas velocity and the phase fraction, then divides vessel length by that velocity.

      Parameters:
      diameter - vessel internal diameter [m]
      length - vessel tangent-to-tangent length [m]
      orientation - "horizontal" or "vertical"
      liquidLevelFrac - fraction of cross-section occupied by liquid [0-1]
      gasVelocity - superficial gas velocity [m/s]
      Returns:
      estimated liquid residence time [s]
    • calcGasBubbleCarryUnder

      private void calcGasBubbleCarryUnder(double gasDensity, double liquidDensity, double liquidViscosity, double gasVelocity, double diameter, double length, String orientation, double liquidLevelFrac)
    • calcLiquidLiquidSeparation

      private void calcLiquidLiquidSeparation(double oilDensity, double waterDensity, double oilViscosity, double waterViscosity, double diameter, double length, String orientation, double liquidLevelFrac)
      Calculates liquid-liquid separation (oil-water and water-oil).
      Parameters:
      oilDensity - oil density [kg/m3]
      waterDensity - water density [kg/m3]
      oilViscosity - oil viscosity [Pa.s]
      waterViscosity - water viscosity [Pa.s]
      diameter - vessel diameter [m]
      length - vessel length [m]
      orientation - vessel orientation
      liquidLevelFrac - total liquid level fraction
    • resetResults

      private void resetResults()
      Resets all calculated results to zero.
    • toJson

      public String toJson()
      Returns a JSON string with full performance calculation results.
      Returns:
      JSON string
    • getOilInGasFraction

      public double getOilInGasFraction()
      Gets the calculated oil-in-gas entrainment fraction (volume basis).
      Returns:
      oilInGasFraction [0-1]
    • getWaterInGasFraction

      public double getWaterInGasFraction()
      Gets the calculated water-in-gas entrainment fraction (volume basis).
      Returns:
      waterInGasFraction [0-1]
    • getGasInOilFraction

      public double getGasInOilFraction()
      Gets the calculated gas-in-oil carry-under fraction (volume basis).
      Returns:
      gasInOilFraction [0-1]
    • getGasInWaterFraction

      public double getGasInWaterFraction()
      Gets the calculated gas-in-water carry-under fraction (volume basis).
      Returns:
      gasInWaterFraction [0-1]
    • getOilInWaterFraction

      public double getOilInWaterFraction()
      Gets the calculated oil-in-water fraction (volume basis).
      Returns:
      oilInWaterFraction [0-1]
    • getWaterInOilFraction

      public double getWaterInOilFraction()
      Gets the calculated water-in-oil fraction (volume basis).
      Returns:
      waterInOilFraction [0-1]
    • getGravitySectionEfficiency

      public double getGravitySectionEfficiency()
      Gets the gravity section efficiency for gas-liquid separation.
      Returns:
      gravitySectionEfficiency [0-1]
    • getMistEliminatorEfficiency

      public double getMistEliminatorEfficiency()
      Gets the mist eliminator efficiency.
      Returns:
      mistEliminatorEfficiency [0-1]
    • getOverallGasLiquidEfficiency

      public double getOverallGasLiquidEfficiency()
      Gets the overall gas-liquid separation efficiency.
      Returns:
      overallGasLiquidEfficiency [0-1]
    • getGravityCutDiameter

      public double getGravityCutDiameter()
      Gets the gravity section cut diameter [m].
      Returns:
      gravityCutDiameter [m]
    • getLiquidLiquidGravityEfficiency

      public double getLiquidLiquidGravityEfficiency()
      Gets the liquid-liquid gravity section efficiency.
      Returns:
      liquidLiquidGravityEfficiency [0-1]
    • setGasLiquidDSD

      public void setGasLiquidDSD(DropletSizeDistribution dsd)
      Sets the inlet droplet size distribution for liquid-in-gas separation.
      Parameters:
      dsd - droplet size distribution
    • getGasLiquidDSD

      public DropletSizeDistribution getGasLiquidDSD()
      Gets the gas-liquid droplet size distribution.
      Returns:
      dsd or null if not set
    • setOilInWaterDSD

      public void setOilInWaterDSD(DropletSizeDistribution dsd)
      Sets the inlet droplet size distribution for oil-in-water droplets.
      Parameters:
      dsd - droplet size distribution
    • setWaterInOilDSD

      public void setWaterInOilDSD(DropletSizeDistribution dsd)
      Sets the inlet droplet size distribution for water-in-oil droplets.
      Parameters:
      dsd - droplet size distribution
    • setGasBubbleDSD

      public void setGasBubbleDSD(DropletSizeDistribution dsd)
      Sets the inlet droplet size distribution for gas bubbles entrained in liquid.
      Parameters:
      dsd - bubble size distribution
    • setMistEliminatorCurve

      public void setMistEliminatorCurve(GradeEfficiencyCurve curve)
      Sets the grade efficiency curve for the mist eliminator.
      Parameters:
      curve - grade efficiency curve
    • getMistEliminatorCurve

      public GradeEfficiencyCurve getMistEliminatorCurve()
      Gets the mist eliminator grade efficiency curve.
      Returns:
      curve or null if not set
    • setOilWaterCoalescerCurve

      public void setOilWaterCoalescerCurve(GradeEfficiencyCurve curve)
      Sets the grade efficiency curve for a liquid-liquid coalescer (plate pack, etc.).
      Parameters:
      curve - grade efficiency curve
    • setIncludeGravitySection

      public void setIncludeGravitySection(boolean include)
      Sets whether to include gravity pre-separation before the mist eliminator.
      Parameters:
      include - true to include gravity section (default true)
    • isIncludeGravitySection

      public boolean isIncludeGravitySection()
      Gets whether gravity pre-separation is included.
      Returns:
      true if gravity section is included
    • setLiquidLiquidResidenceTime

      public void setLiquidLiquidResidenceTime(double seconds)
      Sets the liquid-liquid residence time override [s].
      Parameters:
      seconds - residence time [s]
    • setLiquidInGasCalibrationFactor

      public void setLiquidInGasCalibrationFactor(double factor)
      Sets calibration multiplier for liquid-in-gas carryover (oil-in-gas and water-in-gas fractions).
      Parameters:
      factor - calibration factor (>= 0), where 1.0 means no calibration
    • getLiquidInGasCalibrationFactor

      public double getLiquidInGasCalibrationFactor()
      Gets calibration multiplier for liquid-in-gas carryover.
      Returns:
      calibration factor
    • setGasCarryUnderCalibrationFactor

      public void setGasCarryUnderCalibrationFactor(double factor)
      Sets calibration multiplier for gas carry-under (gas-in-oil and gas-in-water).
      Parameters:
      factor - calibration factor (>= 0), where 1.0 means no calibration
    • getGasCarryUnderCalibrationFactor

      public double getGasCarryUnderCalibrationFactor()
      Gets calibration multiplier for gas carry-under.
      Returns:
      calibration factor
    • setLiquidLiquidCalibrationFactor

      public void setLiquidLiquidCalibrationFactor(double factor)
      Sets calibration multiplier for liquid-liquid cross-contamination (oil-in-water and water-in-oil fractions).
      Parameters:
      factor - calibration factor (>= 0), where 1.0 means no calibration
    • getLiquidLiquidCalibrationFactor

      public double getLiquidLiquidCalibrationFactor()
      Gets calibration multiplier for liquid-liquid cross-contamination.
      Returns:
      calibration factor
    • loadCalibrationCasesFromCsv

      public static List<SeparatorPerformanceCalculator.CalibrationCase> loadCalibrationCasesFromCsv(String filePath) throws IOException
      Loads calibration cases from a CSV file.

      Required headers (case-insensitive):

      • modeled_oil_in_gas, modeled_water_in_gas, modeled_gas_in_oil, modeled_gas_in_water, modeled_oil_in_water, modeled_water_in_oil
      • measured_oil_in_gas, measured_water_in_gas, measured_gas_in_oil, measured_gas_in_water, measured_oil_in_water, measured_water_in_oil

      Optional header: case_id.

      Parameters:
      filePath - path to CSV file
      Returns:
      list of calibration cases
      Throws:
      IOException - if reading fails or required columns are missing
    • calibrateFromGroupedMeasurements

      public SeparatorPerformanceCalculator.CalibrationSummary calibrateFromGroupedMeasurements(double measuredLiquidInGas, double measuredGasCarryUnder, double measuredLiquidLiquid, double modelFloor)
      Calibrates factors from grouped measurements (three values only).

      Groups are interpreted as:

      • liquid-in-gas: average of oil-in-gas and water-in-gas model values
      • gas carry-under: average of gas-in-oil and gas-in-water model values
      • liquid-liquid: average of oil-in-water and water-in-oil model values
      Parameters:
      measuredLiquidInGas - measured grouped liquid-in-gas
      measuredGasCarryUnder - measured grouped gas carry-under
      measuredLiquidLiquid - measured grouped liquid-liquid cross-contamination
      modelFloor - minimum model value for ratio fitting
      Returns:
      calibration summary
    • calibrateFromCaseLibrary

      Calibrates factors from a list of modeled/measured cases.
      Parameters:
      cases - calibration cases
      modelFloor - minimum model value for ratio fitting
      Returns:
      batch calibration summary with pre/post error metrics
    • buildBatchCalibrationReportJson

      public String buildBatchCalibrationReportJson(List<SeparatorPerformanceCalculator.CalibrationCase> cases, SeparatorPerformanceCalculator.BatchCalibrationSummary summary, double modelFloor)
      Builds a JSON calibration report with factors, aggregate error metrics, and per-case residuals.
      Parameters:
      cases - calibration cases used in fitting
      summary - batch calibration summary returned by calibrateFromCaseLibrary(List, double)
      modelFloor - minimum floor used for percentage error calculations
      Returns:
      pretty-printed JSON calibration report
    • saveBatchCalibrationReportJson

      public void saveBatchCalibrationReportJson(String filePath, List<SeparatorPerformanceCalculator.CalibrationCase> cases, SeparatorPerformanceCalculator.BatchCalibrationSummary summary, double modelFloor) throws IOException
      Saves batch calibration report JSON to disk.
      Parameters:
      filePath - output file path
      cases - calibration cases used in fitting
      summary - batch calibration summary
      modelFloor - minimum floor used for percentage error calculations
      Throws:
      IOException - if file writing fails
    • getDouble

      private static double getDouble(String[] cols, Map<String,Integer> idx, String key, int row) throws IOException
      Parses a numeric CSV column value.
      Parameters:
      cols - CSV columns
      idx - header index map
      key - column key
      row - row number (for diagnostics)
      Returns:
      parsed double value
      Throws:
      IOException - if parsing fails
    • getString

      private static String getString(String[] cols, Map<String,Integer> idx, String key, String defaultValue)
      Parses an optional string CSV column value.
      Parameters:
      cols - CSV columns
      idx - header index map
      key - column key
      defaultValue - default value if column missing/blank
      Returns:
      parsed string
    • addRatio

      private static void addRatio(List<Double> list, double ratio)
      Adds finite ratio values to a list.
      Parameters:
      list - target list
      ratio - ratio value
    • meanList

      private static double meanList(List<Double> values)
      Returns arithmetic mean of a list of doubles.
      Parameters:
      values - values list
      Returns:
      mean value
    • pairMape

      private static double pairMape(double modeled, double measured, double floor)
      Computes absolute percentage error for one modeled/measured pair.
      Parameters:
      modeled - modeled value
      measured - measured value
      floor - small floor to avoid division by zero
      Returns:
      absolute percentage error
    • averagePositive

      private static double averagePositive(double a, double b, double floor)
      Returns average of positive values above a floor, or 0 if no values qualify.
      Parameters:
      a - value a
      b - value b
      floor - minimum value threshold
      Returns:
      average or 0
    • calibrateFromMeasuredFractions

      public SeparatorPerformanceCalculator.CalibrationSummary calibrateFromMeasuredFractions(double measuredOilInGas, double measuredWaterInGas, double measuredGasInOil, double measuredGasInWater, double measuredOilInWater, double measuredWaterInOil, double modelFloor)
      Auto-calibrates entrainment multipliers from one measured benchmark point.

      This method uses the current calculated fractions as model values and computes group-wise multipliers from measured/model ratios:

      • Liquid-in-gas: oil-in-gas and water-in-gas
      • Gas carry-under: gas-in-oil and gas-in-water
      • Liquid-liquid: oil-in-water and water-in-oil

      Ratios are only formed for model values above modelFloor. The group multiplier is the arithmetic mean of valid ratios. If no valid ratios exist in a group, the existing factor is retained.

      Parameters:
      measuredOilInGas - measured oil-in-gas fraction [0-1]
      measuredWaterInGas - measured water-in-gas fraction [0-1]
      measuredGasInOil - measured gas-in-oil fraction [0-1]
      measuredGasInWater - measured gas-in-water fraction [0-1]
      measuredOilInWater - measured oil-in-water fraction [0-1]
      measuredWaterInOil - measured water-in-oil fraction [0-1]
      modelFloor - minimum modeled fraction to use in ratio fitting (e.g. 1e-9)
      Returns:
      calibration summary containing old/new factors and data-point usage
    • safeRatio

      private static double safeRatio(double measured, double modeled, double floor)
      Computes measured/model ratio for calibration if modeled value exceeds floor.
      Parameters:
      measured - measured fraction
      modeled - modeled fraction
      floor - minimum modeled value for ratio use
      Returns:
      ratio, or NaN if modeled value is below floor
    • countFinite

      private static int countFinite(double[] values)
      Counts finite values in an array.
      Parameters:
      values - input values
      Returns:
      number of finite values
    • averageFinite

      private static double averageFinite(double[] values, double defaultValue)
      Calculates the arithmetic mean of finite values, or returns a default value.
      Parameters:
      values - input values
      defaultValue - fallback if no finite values are present
      Returns:
      arithmetic mean of finite values or defaultValue
    • setUseEnhancedCalculation

      public void setUseEnhancedCalculation(boolean use)
      Enables or disables the enhanced calculation chain (flow regime, inlet device, geometry).
      Parameters:
      use - true to enable enhanced calculation
    • isUseEnhancedCalculation

      public boolean isUseEnhancedCalculation()
      Returns whether enhanced calculation is enabled.
      Returns:
      true if enhanced calculation is enabled
    • setInletPipeDiameter

      public void setInletPipeDiameter(double diameter)
      Sets the inlet pipe diameter for flow regime prediction.
      Parameters:
      diameter - inlet pipe diameter [m]
    • getInletPipeDiameter

      public double getInletPipeDiameter()
      Gets the inlet pipe diameter.
      Returns:
      inlet pipe diameter [m]
    • setSurfaceTension

      public void setSurfaceTension(double sigma)
      Sets the gas-liquid interfacial tension for DSD generation.
      Parameters:
      sigma - interfacial tension [N/m]
    • getSurfaceTension

      public double getSurfaceTension()
      Gets the gas-liquid interfacial tension.
      Returns:
      interfacial tension [N/m]
    • setOilWaterInterfacialTension

      public void setOilWaterInterfacialTension(double sigma)
      Sets the oil-water interfacial tension for liquid-liquid DSD.
      Parameters:
      sigma - interfacial tension [N/m]
    • getOilWaterInterfacialTension

      public double getOilWaterInterfacialTension()
      Gets the oil-water interfacial tension.
      Returns:
      interfacial tension [N/m]
    • setInletDeviceModel

      public void setInletDeviceModel(InletDeviceModel model)
      Sets the inlet device model.
      Parameters:
      model - inlet device model
    • getInletDeviceModel

      public InletDeviceModel getInletDeviceModel()
      Gets the inlet device model.
      Returns:
      inlet device model or null
    • setFlowRegimeCalculator

      public void setFlowRegimeCalculator(MultiphaseFlowRegime calc)
      Sets the flow regime calculator.
      Parameters:
      calc - flow regime calculator
    • getFlowRegimeCalculator

      public MultiphaseFlowRegime getFlowRegimeCalculator()
      Gets the flow regime calculator.
      Returns:
      flow regime calculator or null
    • setGeometryCalculator

      public void setGeometryCalculator(SeparatorGeometryCalculator calc)
      Sets the separator geometry calculator.
      Parameters:
      calc - geometry calculator
    • getGeometryCalculator

      public SeparatorGeometryCalculator getGeometryCalculator()
      Gets the separator geometry calculator.
      Returns:
      geometry calculator or null
    • getKFactor

      public double getKFactor()
      Gets the K-factor (Souders-Brown) at operating conditions.
      Returns:
      kFactor [m/s]
    • getKFactorUtilization

      public double getKFactorUtilization()
      Gets the K-factor utilization (operating K / design K).
      Returns:
      kFactorUtilization [0-...], values above 1.0 indicate flooding
    • getInletDeviceBulkEfficiency

      public double getInletDeviceBulkEfficiency()
      Gets the inlet device bulk separation efficiency.
      Returns:
      inletDeviceBulkEfficiency [0-1]
    • getInletFlowRegime

      public MultiphaseFlowRegime.FlowRegime getInletFlowRegime()
      Gets the predicted inlet flow regime.
      Returns:
      flow regime enum or null if not calculated
    • isMistEliminatorFlooded

      public boolean isMistEliminatorFlooded()
      Returns whether the mist eliminator is flooded (K-factor exceeds design).
      Returns:
      true if flooded
    • getPostInletDeviceDSD

      public DropletSizeDistribution getPostInletDeviceDSD()
      Gets the DSD after inlet device transformation.
      Returns:
      transformed DSD or null if not calculated
    • setOilVolumeFraction

      public void setOilVolumeFraction(double fraction)
      Sets the oil volume fraction in the liquid phase for three-phase calculations.

      This fraction is used when splitting the liquid flow between the oil and water phases in the vessel geometry calculation. The default of 0.5 (50/50 split) should be overridden by the Separator.run() method using the actual phase volumes from the thermodynamic system.

      Parameters:
      fraction - oil volume fraction [0-1]
    • getOilVolumeFraction

      public double getOilVolumeFraction()
      Gets the oil volume fraction used in three-phase calculations.
      Returns:
      oil volume fraction [0-1]
    • setApplyTurbulenceCorrection

      public void setApplyTurbulenceCorrection(boolean apply)
      Enables or disables the turbulent diffusion correction on the gravity cut diameter.

      When enabled (default), the Csanady (1963) turbulent dispersion correction increases the effective cut diameter to account for turbulence in the separator vessel, giving a more accurate (less optimistic) prediction at higher gas loads. Disable only for quiescent-flow validation cases.

      Parameters:
      apply - true to apply correction (default), false to use pure gravity settling
    • isApplyTurbulenceCorrection

      public boolean isApplyTurbulenceCorrection()
      Returns whether the turbulent diffusion correction is active.
      Returns:
      true if turbulence correction is applied
    • getApiComplianceResult

      public DropletSettlingCalculator.ApiComplianceResult getApiComplianceResult()
      Returns the API 12J compliance check result.

      Populated automatically after calculate(double, double, double, double, double, double, double, double, double, String, double) when a gravity cut diameter is available. Returns null before the first calculation or when insufficient geometry data is available.

      Returns:
      API 12J compliance result, or null if not yet computed
    • generateLiquidLiquidDSD

      public static DropletSizeDistribution generateLiquidLiquidDSD(double interfacialTension, double continuousDensity, double nozzleVelocity, double nozzleDiameter)
      Generates a default Rosin-Rammler DSD for liquid-liquid droplets using the Hinze (1955) maximum stable droplet breakup criterion, adapted for oil-water interfacial tension and turbulent energy input at the separator inlet.

      The maximum stable droplet diameter in turbulent flow (Hinze, 1955): $d_{max} = C \cdot (\sigma / \rho_c)^{3/5} \cdot \epsilon^{-2/5}$ where $\epsilon$ is the turbulent energy dissipation rate estimated from inlet momentum: $\epsilon \approx u_n^3 / D_{nozzle}$.

      The median diameter is set to $d_{max} / 4$ and a Rosin-Rammler spread of 1.8 is used, consistent with oil-water emulsion data (Luo and Svendsen, 1996).

      References:

      • Hinze, J.O. (1955). Fundamentals of the hydrodynamic mechanism of splitting in dispersion processes. AIChE J., 1(3), 289-295.
      • Luo, H., Svendsen, H.F. (1996). Theoretical model for drop and bubble breakup in turbulent dispersions. AIChE J., 42(5), 1225-1233.
      Parameters:
      interfacialTension - oil-water interfacial tension [N/m]
      continuousDensity - continuous phase density [kg/m3]
      nozzleVelocity - inlet nozzle velocity [m/s]
      nozzleDiameter - inlet nozzle diameter [m]
      Returns:
      Rosin-Rammler DSD representing the initial liquid-liquid droplet population