Class PipeHagedornBrown

All Implemented Interfaces:
Serializable, Runnable, CapacityConstrainedEquipment, PipeLineInterface, ProcessEquipmentInterface, TwoPortInterface, ProcessElementInterface, SimulationInterface, NamedInterface

public class PipeHagedornBrown extends Pipeline
Pipeline simulation using Hagedorn and Brown empirical correlation for multiphase vertical flow.

Implements the Hagedorn and Brown (1965) method for predicting pressure traverses in vertical and near-vertical wells. This correlation is widely used for production tubing and vertical riser calculations, particularly when the liquid phase is continuous.

Reference

Hagedorn, A.R. and Brown, K.E., "Experimental Study of Pressure Gradients Occurring During Continuous Two-Phase Flow in Small-Diameter Vertical Conduits", Journal of Petroleum Technology, April 1965, pp. 475-484. SPE-940-PA.

Method Overview

The Hagedorn-Brown correlation calculates pressure gradient from:

dP/dz = (rho_m * g + f * rho_m * v_m^2 / (2 * D)) / (1 - rho_m * v_m * v_sg / P)

where rho_m is the mixture density accounting for slip between phases via the empirical liquid holdup correlation. The denominator accounts for the acceleration pressure gradient (kinetic energy changes).

Liquid Holdup Determination

Liquid holdup (H_L) is determined from three dimensionless groups using empirical charts (correlations fitted to Hagedorn-Brown experimental data):

  • Liquid velocity number: N_vL = v_sL * (rho_L / (g * sigma))^0.25
  • Gas velocity number: N_vG = v_sG * (rho_L / (g * sigma))^0.25
  • Pipe diameter number: N_D = D * (rho_L * g / sigma)^0.5
  • Liquid viscosity number: N_L = mu_L * (g / (rho_L * sigma^3))^0.25

Applicability

  • Best suited for vertical or near-vertical flow (inclination 75-90 degrees)
  • Wide range of gas-liquid ratios
  • Pipe diameters from 1 to 4 inches (tested range)
  • Not recommended for horizontal or slightly inclined flow

Usage Example

SystemInterface fluid = new SystemSrkEos(350.0, 200.0);
fluid.addComponent("methane", 0.8);
fluid.addComponent("nC10", 0.2);
fluid.setMixingRule("classic");

Stream inlet = new Stream("well_inlet", fluid);
inlet.setFlowRate(50000, "kg/hr");
inlet.run();

PipeHagedornBrown tubing = new PipeHagedornBrown("production_tubing", inlet);
tubing.setDiameter(0.0762); // 3 inch tubing
tubing.setLength(3000.0); // 3000 m TVD
tubing.setElevation(-3000.0); // vertical downward (production)
tubing.setNumberOfIncrements(30);
tubing.run();
Version:
1.0
Author:
NeqSim
See Also:
  • Field Details

    • serialVersionUID

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

      private static final org.apache.logging.log4j.Logger logger
      Logger object for class.
    • GRAVITY

      private static final double GRAVITY
      Acceleration of gravity in m/s2.
      See Also:
    • totalPressureDrop

      private double totalPressureDrop
      Total pressure drop in bar.
    • superficialLiquidVelocity

      private double superficialLiquidVelocity
      Superficial liquid velocity in m/s.
    • superficialGasVelocity

      private double superficialGasVelocity
      Superficial gas velocity in m/s.
    • mixtureVelocity

      private double mixtureVelocity
      Mixture velocity in m/s.
    • calculatedHoldup

      private double calculatedHoldup
      Calculated liquid holdup.
    • mixtureDensity

      private double mixtureDensity
      Mixture density in kg/m3.
    • pressureProfileList

      private List<Double> pressureProfileList
      Pressure profile along the pipe.
    • temperatureProfileList

      private List<Double> temperatureProfileList
      Temperature profile along the pipe.
    • lengthProfileList

      private List<Double> lengthProfileList
      Length profile along the pipe.
  • Constructor Details

    • PipeHagedornBrown

      public PipeHagedornBrown()
      Default constructor for PipeHagedornBrown.
    • PipeHagedornBrown

      public PipeHagedornBrown(String name)
      Constructor with name.
      Parameters:
      name - equipment name
    • PipeHagedornBrown

      public PipeHagedornBrown(String name, StreamInterface inStream)
      Constructor with name and inlet stream.
      Parameters:
      name - equipment name
      inStream - inlet stream
  • Method Details

    • run

      public void run(UUID id)

      In this method all thermodynamic and unit operations will be calculated in a steady state calculation.

      Specified by:
      run in interface SimulationInterface
      Overrides:
      run in class Pipeline
      Parameters:
      id - UUID
    • calcSegmentPressureDrop

      private double calcSegmentPressureDrop(SystemInterface sys, double segLength, double segElev)
      Calculate pressure drop for a single pipe segment using the Hagedorn-Brown method.
      Parameters:
      sys - thermodynamic system at segment conditions
      segLength - segment length in meters
      segElev - segment elevation change in meters (positive = upward)
      Returns:
      pressure drop in bar
    • calcLiquidHoldup

      private double calcLiquidHoldup(double nVl, double nVg, double nD, double nL, double lambdaL)
      Calculate liquid holdup using the Hagedorn-Brown empirical correlation.

      Uses curve-fit approximations to the original Hagedorn-Brown charts. The holdup is determined from a correlation function of dimensionless velocity, diameter, and viscosity numbers.

      Parameters:
      nVl - liquid velocity number
      nVg - gas velocity number
      nD - pipe diameter number
      nL - liquid viscosity number
      lambdaL - no-slip liquid fraction
      Returns:
      predicted liquid holdup (0 to 1)
    • calcCNL

      private double calcCNL(double nL)
      Calculate CNL coefficient from liquid viscosity number.
      Parameters:
      nL - liquid viscosity number
      Returns:
      CNL coefficient
    • calcHoldupFromParam

      private double calcHoldupFromParam(double param)
      Calculate liquid holdup from the holdup parameter using curve-fit to chart.
      Parameters:
      param - holdup parameter
      Returns:
      liquid holdup fraction
    • calcSecondaryCorrection

      private double calcSecondaryCorrection(double param)
      Calculate secondary correction factor psi.
      Parameters:
      param - secondary parameter
      Returns:
      correction factor psi
    • calcFrictionFactor

      private double calcFrictionFactor(double re)
      Calculate Moody/Haaland friction factor.
      Parameters:
      re - Reynolds number
      Returns:
      Fanning friction factor
    • getTotalPressureDrop

      public double getTotalPressureDrop()
      Get the total pressure drop across the pipe.
      Returns:
      total pressure drop in bar
    • getPressureDrop

      public double getPressureDrop()
      Get the total pressure drop across the pipeline.
      Specified by:
      getPressureDrop in interface PipeLineInterface
      Overrides:
      getPressureDrop in class Pipeline
      Returns:
      pressure drop in bar
    • getLiquidHoldup

      public double getLiquidHoldup()
      Get the calculated liquid holdup at the last segment.
      Specified by:
      getLiquidHoldup in interface PipeLineInterface
      Overrides:
      getLiquidHoldup in class Pipeline
      Returns:
      liquid holdup fraction
    • getMixtureDensity

      public double getMixtureDensity()
      Get the mixture density at the last segment.
      Returns:
      mixture density in kg/m3
    • getPressureProfile

      public double[] getPressureProfile()
      Get the pressure profile along the pipe.
      Specified by:
      getPressureProfile in interface PipeLineInterface
      Overrides:
      getPressureProfile in class Pipeline
      Returns:
      array of pressures in bar at each increment
    • getPressureProfileList

      public List<Double> getPressureProfileList()
      Get the pressure profile as a list.
      Returns:
      list of pressures in bar
    • getTemperatureProfile

      public double[] getTemperatureProfile()
      Get the temperature profile along the pipe.
      Specified by:
      getTemperatureProfile in interface PipeLineInterface
      Overrides:
      getTemperatureProfile in class Pipeline
      Returns:
      array of temperatures in Kelvin at each increment
    • getTemperatureProfileList

      public List<Double> getTemperatureProfileList()
      Get the temperature profile as a list.
      Returns:
      list of temperatures in Kelvin
    • getLengthProfile

      public List<Double> getLengthProfile()
      Get the length profile along the pipe.
      Returns:
      list of cumulative lengths in meters