Class InjectionWellModel
- All Implemented Interfaces:
Serializable
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:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classPattern class for configuring multiple injection wells.static enumInjection well types.static classInjection well calculation result.static classRepresents an injection zone in a multi-zone injection well.static classResult for a single injection zone.static classMulti-zone injection calculation result. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate static final doubleprivate doubleprivate InjectionWellModel.InjectionTypeprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate static final longprivate doubleprivate doubleprivate doubleprivate booleanprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate doubleprivate List<InjectionWellModel.InjectionZone> -
Constructor Summary
ConstructorsConstructorDescriptionCreates a new injection well model with default parameters.InjectionWellModel(InjectionWellModel.InjectionType injectionType) Creates a new injection well model. -
Method Summary
Modifier and TypeMethodDescriptionvoidAdd an injection zone.calculate(double targetRateSm3d) Calculates injection well performance for target rate.private doublecalculateFrictionFactor(double reynolds) Calculates Darcy friction factor.private doublecalculateFrictionPressureDrop(double rateSm3d, double density) Calculates friction pressure drop in tubing.private voidCalculates Hall plot parameters for performance monitoring.private doubleCalculates injectivity index using Darcy's law.Calculates maximum injection rate at given constraints.calculateMultiZone(double totalTargetRate) Calculate multi-zone injection allocation at a given total target rate.private doublecalculatePumpPower(double rateSm3d, double deltaPbar) Calculates pump power requirement.private doublecalculateWellheadPressure(double rateSm3d, double bhp) Calculates wellhead injection pressure from BHP.calculateWithInterference(double targetRate, double[] producerDistances, double[] producerRates) Calculates injection with pressure interference from nearby producers.private doubleCalculate injectivity index for a specific zone using Darcy radial flow.doubleGet the effective fracture pressure accounting for thermal stress.doubleGet the thermal stress reduction at the wellbore wall.Get the zone results from the last multi-zone calculation.getZones()Get the list of injection zones.booleanCheck if thermal stress is enabled.setDrainageRadius(double radius) Sets drainage radius.setFormationPermeability(double permeability, String unit) Sets formation permeability.setFormationThickness(double thickness, String unit) Sets formation thickness.setFracturePressure(double pressure, String unit) Sets fracture pressure.Sets maximum BHP (operating limit below fracture pressure).voidsetPoissonsRatio(double nu) Set Poisson's ratio for thermal stress calculation.setPumpEfficiency(double efficiency) Sets pump efficiency.setReservoirPressure(double pressure, String unit) Sets reservoir pressure.setReservoirTemperature(double temperature, String unit) Sets reservoir temperature.setSkinFactor(double skin) Sets skin factor.setSurfaceInjectionPressure(double pressure, String unit) Sets surface injection pressure available.voidsetThermalStressReduction(double injectionTemp, double reservoirTemp, double thermalExpansion, double youngsModulusGPa) Set thermoelastic parameters for thermal stress reduction during cold injection.setTubingID(double diameter, String unit) Sets tubing ID.setWaterViscosity(double viscosity) Sets water viscosity at reservoir conditions.setWellboreRadius(double radius) Sets wellbore radius.setWellDepth(double depth, String unit) Sets well depth.Sets injection well type.
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
GRAVITY
private static final double GRAVITY- See Also:
-
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
-
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
Creates a new injection well model.- Parameters:
injectionType- type of injection well
-
-
Method Details
-
calculate
Calculates injection well performance for target rate.- Parameters:
targetRateSm3d- target injection rate (Sm3/day)- Returns:
- injection well result
-
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
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
Sets reservoir pressure.- Parameters:
pressure- pressure valueunit- unit ("bara", "psia")- Returns:
- this for chaining
-
setReservoirTemperature
Sets reservoir temperature.- Parameters:
temperature- temperature valueunit- unit ("K", "C", "F")- Returns:
- this for chaining
-
setFormationPermeability
Sets formation permeability.- Parameters:
permeability- permeability valueunit- unit ("mD", "D")- Returns:
- this for chaining
-
setFormationThickness
Sets formation thickness.- Parameters:
thickness- thickness valueunit- unit ("m", "ft")- Returns:
- this for chaining
-
setSkinFactor
Sets skin factor.- Parameters:
skin- skin factor (dimensionless)- Returns:
- this for chaining
-
setWellDepth
Sets well depth.- Parameters:
depth- depth valueunit- unit ("m", "ft")- Returns:
- this for chaining
-
setTubingID
Sets tubing ID.- Parameters:
diameter- diameter valueunit- unit ("m", "in", "mm")- Returns:
- this for chaining
-
setMaxBHP
Sets maximum BHP (operating limit below fracture pressure).- Parameters:
pressure- pressure valueunit- unit ("bara", "psia")- Returns:
- this for chaining
-
setFracturePressure
Sets fracture pressure.- Parameters:
pressure- pressure valueunit- unit ("bara", "psia")- Returns:
- this for chaining
-
setSurfaceInjectionPressure
Sets surface injection pressure available.- Parameters:
pressure- pressure valueunit- unit ("bara", "psia")- Returns:
- this for chaining
-
setWaterViscosity
Sets water viscosity at reservoir conditions.- Parameters:
viscosity- viscosity (cP)- Returns:
- this for chaining
-
setDrainageRadius
Sets drainage radius.- Parameters:
radius- radius (m)- Returns:
- this for chaining
-
setWellboreRadius
Sets wellbore radius.- Parameters:
radius- radius (m)- Returns:
- this for chaining
-
setPumpEfficiency
Sets pump efficiency.- Parameters:
efficiency- efficiency (0-1)- Returns:
- this for chaining
-
addZone
Add an injection zone.- Parameters:
zone- injection zone to add
-
getZones
Get the list of injection zones.- Returns:
- list of zones
-
calculateMultiZone
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
Calculate injectivity index for a specific zone using Darcy radial flow.- Parameters:
zone- the injection zone- Returns:
- injectivity index (Sm3/day/bar)
-
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-5youngsModulusGPa- 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
-