Class InjectionWellModel

java.lang.Object
neqsim.process.fielddevelopment.reservoir.InjectionWellModel
All Implemented Interfaces:
Serializable

public class InjectionWellModel extends Object implements Serializable
Injection well performance model for water and gas injection.

This class provides comprehensive injection well modeling including:

  • Injectivity Index: Relationship between injection rate and pressure
  • Hall Plot Analysis: Injection performance monitoring
  • Wellbore Hydraulics: Pressure losses in injection tubing
  • Fracture Pressure: Maximum safe injection pressure
  • Skin Factor Effects: Near-wellbore damage or stimulation

Injectivity Index

The injectivity index (II) relates injection rate to bottomhole pressure:

q = II × (P_wf - P_res)

where q is injection rate, P_wf is flowing bottomhole pressure, and P_res is average reservoir pressure. Injectivity depends on:

  • Permeability and thickness (kh)
  • Fluid viscosity at reservoir conditions
  • Near-wellbore skin factor
  • Wellbore radius and drainage radius

Hall Plot

The Hall plot is used to monitor injection well performance:

∫(P_wf - P_res)dt vs. Cumulative Injection

Slope changes indicate:

  • Increasing slope: Formation damage (skin increase)
  • Decreasing slope: Fracturing or channeling
  • Constant slope: Stable injection

Usage Example

InjectionWellModel well = new InjectionWellModel();
well.setWellType(InjectionType.WATER_INJECTOR);
well.setReservoirPressure(250.0, "bara");
well.setFormationPermeability(100.0, "mD");
well.setFormationThickness(30.0, "m");
well.setSkinFactor(2.0);
well.setWellDepth(3000.0, "m");
well.setTubingID(0.1, "m");
well.setMaxBHP(350.0, "bara"); // Below fracture pressure

InjectionWellResult result = well.calculate(10000.0); // Target 10000 Sm3/day

System.out.println("Achievable rate: " + result.getAchievableRate() + " Sm3/day");
System.out.println("Required WHI pressure: " + result.getWellheadPressure() + " bara");
System.out.println("BHP: " + result.getBottomholePressure() + " bara");
System.out.println("Pump power: " + result.getPumpPower() + " kW");
Version:
1.0
Author:
ESOL
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • GRAVITY

      private static final double GRAVITY
      See Also:
    • injectionType

      private InjectionWellModel.InjectionType injectionType
    • reservoirPressure

      private double reservoirPressure
    • reservoirTemperature

      private double reservoirTemperature
    • formationPermeability

      private double formationPermeability
    • formationThickness

      private double formationThickness
    • drainageRadius

      private double drainageRadius
    • wellboreRadius

      private double wellboreRadius
    • skinFactor

      private double skinFactor
    • wellDepth

      private double wellDepth
    • tubingID

      private double tubingID
    • tubingRoughness

      private double tubingRoughness
    • fracturePressure

      private double fracturePressure
    • maxBHP

      private double maxBHP
    • minWHP

      private double minWHP
    • surfaceInjectionPressure

      private double surfaceInjectionPressure
    • waterDensity

      private double waterDensity
    • waterViscosity

      private double waterViscosity
    • gasMolecularWeight

      private double gasMolecularWeight
    • gasViscosity

      private double gasViscosity
    • formationWaterViscosity

      private double formationWaterViscosity
    • pumpEfficiency

      private double pumpEfficiency
    • zones

      private transient List<InjectionWellModel.InjectionZone> zones
    • thermalExpansionCoeff

      private double thermalExpansionCoeff
    • youngsModulus

      private double youngsModulus
    • poissonsRatio

      private double poissonsRatio
    • injectionTemperature

      private double injectionTemperature
    • reservoirTemperatureForThermal

      private double reservoirTemperatureForThermal
    • thermalStressEnabled

      private boolean thermalStressEnabled
  • Constructor Details

    • InjectionWellModel

      public InjectionWellModel()
      Creates a new injection well model with default parameters.
    • InjectionWellModel

      public InjectionWellModel(InjectionWellModel.InjectionType injectionType)
      Creates a new injection well model.
      Parameters:
      injectionType - type of injection well
  • Method Details

    • calculate

      public InjectionWellModel.InjectionWellResult calculate(double targetRateSm3d)
      Calculates injection well performance for target rate.
      Parameters:
      targetRateSm3d - target injection rate (Sm3/day)
      Returns:
      injection well result
    • calculateMaximumRate

      public InjectionWellModel.InjectionWellResult calculateMaximumRate()
      Calculates maximum injection rate at given constraints.
      Returns:
      maximum injection result
    • calculateInjectivityIndex

      private double calculateInjectivityIndex()
      Calculates injectivity index using Darcy's law.

      For radial flow: II = 2π × k × h / (μ × B × (ln(re/rw) + S))

      Returns:
      injectivity index (Sm3/day/bar)
    • calculateWellheadPressure

      private double calculateWellheadPressure(double rateSm3d, double bhp)
      Calculates wellhead injection pressure from BHP.
      Parameters:
      rateSm3d - injection rate (Sm3/day)
      bhp - bottomhole pressure (bara)
      Returns:
      wellhead pressure (bara)
    • calculateFrictionPressureDrop

      private double calculateFrictionPressureDrop(double rateSm3d, double density)
      Calculates friction pressure drop in tubing.
      Parameters:
      rateSm3d - rate (Sm3/day)
      density - fluid density (kg/m³)
      Returns:
      friction pressure drop (bar)
    • calculateFrictionFactor

      private double calculateFrictionFactor(double reynolds)
      Calculates Darcy friction factor.
      Parameters:
      reynolds - Reynolds number
      Returns:
      friction factor
    • calculatePumpPower

      private double calculatePumpPower(double rateSm3d, double deltaPbar)
      Calculates pump power requirement.
      Parameters:
      rateSm3d - injection rate (Sm3/day)
      deltaPbar - pressure boost (bar)
      Returns:
      pump power (kW)
    • calculateHallPlotParameters

      private void calculateHallPlotParameters(InjectionWellModel.InjectionWellResult result)
      Calculates Hall plot parameters for performance monitoring.
      Parameters:
      result - injection result to populate
    • calculateWithInterference

      public InjectionWellModel.InjectionWellResult calculateWithInterference(double targetRate, double[] producerDistances, double[] producerRates)
      Calculates injection with pressure interference from nearby producers.
      Parameters:
      targetRate - target rate (Sm3/day)
      producerDistances - distances to nearby producers (m)
      producerRates - production rates of nearby wells (Sm3/day)
      Returns:
      adjusted injection result
    • setWellType

      Sets injection well type.
      Parameters:
      type - injection type
      Returns:
      this for chaining
    • setReservoirPressure

      public InjectionWellModel setReservoirPressure(double pressure, String unit)
      Sets reservoir pressure.
      Parameters:
      pressure - pressure value
      unit - unit ("bara", "psia")
      Returns:
      this for chaining
    • setReservoirTemperature

      public InjectionWellModel setReservoirTemperature(double temperature, String unit)
      Sets reservoir temperature.
      Parameters:
      temperature - temperature value
      unit - unit ("K", "C", "F")
      Returns:
      this for chaining
    • setFormationPermeability

      public InjectionWellModel setFormationPermeability(double permeability, String unit)
      Sets formation permeability.
      Parameters:
      permeability - permeability value
      unit - unit ("mD", "D")
      Returns:
      this for chaining
    • setFormationThickness

      public InjectionWellModel setFormationThickness(double thickness, String unit)
      Sets formation thickness.
      Parameters:
      thickness - thickness value
      unit - unit ("m", "ft")
      Returns:
      this for chaining
    • setSkinFactor

      public InjectionWellModel setSkinFactor(double skin)
      Sets skin factor.
      Parameters:
      skin - skin factor (dimensionless)
      Returns:
      this for chaining
    • setWellDepth

      public InjectionWellModel setWellDepth(double depth, String unit)
      Sets well depth.
      Parameters:
      depth - depth value
      unit - unit ("m", "ft")
      Returns:
      this for chaining
    • setTubingID

      public InjectionWellModel setTubingID(double diameter, String unit)
      Sets tubing ID.
      Parameters:
      diameter - diameter value
      unit - unit ("m", "in", "mm")
      Returns:
      this for chaining
    • setMaxBHP

      public InjectionWellModel setMaxBHP(double pressure, String unit)
      Sets maximum BHP (operating limit below fracture pressure).
      Parameters:
      pressure - pressure value
      unit - unit ("bara", "psia")
      Returns:
      this for chaining
    • setFracturePressure

      public InjectionWellModel setFracturePressure(double pressure, String unit)
      Sets fracture pressure.
      Parameters:
      pressure - pressure value
      unit - unit ("bara", "psia")
      Returns:
      this for chaining
    • setSurfaceInjectionPressure

      public InjectionWellModel setSurfaceInjectionPressure(double pressure, String unit)
      Sets surface injection pressure available.
      Parameters:
      pressure - pressure value
      unit - unit ("bara", "psia")
      Returns:
      this for chaining
    • setWaterViscosity

      public InjectionWellModel setWaterViscosity(double viscosity)
      Sets water viscosity at reservoir conditions.
      Parameters:
      viscosity - viscosity (cP)
      Returns:
      this for chaining
    • setDrainageRadius

      public InjectionWellModel setDrainageRadius(double radius)
      Sets drainage radius.
      Parameters:
      radius - radius (m)
      Returns:
      this for chaining
    • setWellboreRadius

      public InjectionWellModel setWellboreRadius(double radius)
      Sets wellbore radius.
      Parameters:
      radius - radius (m)
      Returns:
      this for chaining
    • setPumpEfficiency

      public InjectionWellModel setPumpEfficiency(double efficiency)
      Sets pump efficiency.
      Parameters:
      efficiency - efficiency (0-1)
      Returns:
      this for chaining
    • addZone

      public void addZone(InjectionWellModel.InjectionZone zone)
      Add an injection zone.
      Parameters:
      zone - injection zone to add
    • getZones

      Get the list of injection zones.
      Returns:
      list of zones
    • calculateMultiZone

      public InjectionWellModel.MultiZoneInjectionResult calculateMultiZone(double totalTargetRate)
      Calculate multi-zone injection allocation at a given total target rate.

      The BHP is determined from the total target rate and the combined injectivity of all zones. Each zone then receives flow proportional to its individual injectivity and pressure differential.

      Parameters:
      totalTargetRate - total target injection rate (Sm3/day)
      Returns:
      multi-zone injection result with per-zone breakdown
    • calculateZoneInjectivityIndex

      private double calculateZoneInjectivityIndex(InjectionWellModel.InjectionZone zone)
      Calculate injectivity index for a specific zone using Darcy radial flow.
      Parameters:
      zone - the injection zone
      Returns:
      injectivity index (Sm3/day/bar)
    • getZoneResults

      public List<InjectionWellModel.InjectionZoneResult> getZoneResults()
      Get the zone results from the last multi-zone calculation.
      Returns:
      list of per-zone results, or empty list if no calculation done
    • setThermalStressReduction

      public void setThermalStressReduction(double injectionTemp, double reservoirTemp, double thermalExpansion, double youngsModulusGPa)
      Set thermoelastic parameters for thermal stress reduction during cold injection.

      During cold water or CO2 injection, the near-wellbore rock cools, reducing the minimum horizontal stress and effectively lowering the fracture pressure. The thermal stress reduction is:

      delta_sigma_thermal = alpha_T * E / (1 - nu) * (T_inj - T_res)

      Parameters:
      injectionTemp - injection fluid temperature (K)
      reservoirTemp - reservoir temperature (K)
      thermalExpansion - linear thermal expansion coefficient (1/K), typically 1e-5 to 3e-5
      youngsModulusGPa - Young's modulus (GPa), typically 10-50 GPa for reservoir rock
    • setPoissonsRatio

      public void setPoissonsRatio(double nu)
      Set Poisson's ratio for thermal stress calculation.
      Parameters:
      nu - Poisson's ratio (dimensionless, typically 0.2-0.35)
    • getThermalStressReduction

      public double getThermalStressReduction()
      Get the thermal stress reduction at the wellbore wall.
      Returns:
      thermal stress reduction (bar), positive means stress decreases
    • getEffectiveFracturePressure

      public double getEffectiveFracturePressure()
      Get the effective fracture pressure accounting for thermal stress.

      Cold injection reduces the minimum horizontal stress and therefore the fracture pressure: Pfrac_effective = Pfrac_original - |delta_sigma_thermal|

      Returns:
      effective fracture pressure (bara)
    • isThermalStressEnabled

      public boolean isThermalStressEnabled()
      Check if thermal stress is enabled.
      Returns:
      true if thermal stress parameters have been set