Class InjectionConformanceMonitor
- All Implemented Interfaces:
Serializable, Runnable, ProcessEquipmentInterface, ProcessElementInterface, SimulationInterface, NamedInterface
This class provides time-series analysis tools for injection well surveillance data. It uses Hall plot analysis, slope change detection, and injection profile interpretation to identify conformance issues such as:
- Fracture initiation or extension (Hall slope decrease)
- Near-wellbore plugging or scaling (Hall slope increase)
- Out-of-zone injection (injection profile mismatch vs target)
- Channel development through cement (progressive conformance loss)
Hall Plot Analysis
The Hall plot is cumulative wellhead pressure times time (sum of WHP * dt) vs cumulative injection volume. A constant Hall slope indicates stable injectivity. A decreasing slope indicates fracture growth or improved injectivity. An increasing slope indicates plugging or skin increase.
Usage Example
InjectionConformanceMonitor monitor = new InjectionConformanceMonitor("Injector-1 Monitor");
// Record daily injection data
monitor.recordInjectionData(0.0, 250.0, 5000.0); // day 0: 250 bar WHP, 5000 bbl/d
monitor.recordInjectionData(1.0, 252.0, 5000.0); // day 1
monitor.recordInjectionData(2.0, 248.0, 5200.0); // day 2
// ... more data points ...
// Calculate Hall plot
monitor.calculateHallPlot();
double slope = monitor.getCurrentHallSlope();
// Detect slope changes
boolean slopeChanged = monitor.detectSlopeChange(0.2); // 20% threshold
String diagnosis = monitor.getDiagnosis();
System.out.println("Hall slope: " + slope + " bar/m3");
System.out.println("Diagnosis: " + diagnosis);
- Version:
- 1.0
- Author:
- ESOL
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumConformance diagnosis result.static classSingle injection data record.static classZone injection profile data point. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate doubleprivate final List<InjectionConformanceMonitor.InjectionDataPoint> private booleanprivate doubleprivate final List<InjectionConformanceMonitor.ZoneProfilePoint> private static final org.apache.logging.log4j.Loggerprivate static final longFields inherited from class ProcessEquipmentBaseClass
conditionAnalysisMessage, energyStream, hasController, isSolved, properties, reportFields inherited from class SimulationBaseClass
calcIdentifier, calculateSteadyState, timeFields inherited from class NamedBaseClass
name -
Constructor Summary
ConstructorsConstructorDescriptionCreate an injection conformance monitor. -
Method Summary
Modifier and TypeMethodDescriptionvoidaddZoneProfile(String zoneName, double depthM, double allocationFraction, boolean isTargetZone) Add a zone to the injection profile.private voidCalculate the Hall slope from the last 20% of data using least-squares linear regression.voidCalculate the Hall plot from recorded injection data.private voidCalculate the Hall slope from the first 20% of data (initial injectivity baseline).private doublecalculateSlopeLinearRegression(int startIdx, int endIdx) Calculate slope using least-squares linear regression on the Hall plot.booleandetectSlopeChange(double thresholdFraction) Detect a significant change in the Hall slope.Get the conformance diagnosis enum.doubleGet the current Hall slope from the most recent data.intGet the number of recorded data points.Get recorded data points.Get the current conformance diagnosis.private StringGet human-readable diagnosis description.Get the list of Hall plot cumulative pressure times.Get the list of Hall plot cumulative injection volumes.doubleGet the initial Hall slope from the early data.doubleGet the injection efficiency from the zone profile.Get the injection zone profile.doubleGet the out-of-zone injection fraction from the profile.voidrecordInjectionData(double timeDays, double wellheadPressureBar, double injectionRateM3perDay) Record an injection data point.voidreset()Clear all recorded data and reset the monitor.voidIn this method all thermodynamic and unit operations will be calculated in a steady state calculation.private voidUpdate the conformance diagnosis based on Hall slope analysis and injection profile.Methods inherited from class ProcessEquipmentBaseClass
addCapacityConstraint, addController, copy, displayResult, equals, getAvailableMargin, getAvailableMarginPercent, getBottleneckConstraint, getCapacityConstraints, getConditionAnalysisMessage, getConstraintEvaluationReport, getController, getController, getControllers, getEffectiveCapacityFactor, getEnergyStream, getEntropyProduction, getExergyChange, getFailureMode, getMassBalance, getMassBalance, getMaxUtilization, getMaxUtilizationPercent, getMechanicalDesign, getMinimumFlow, getPressure, getPressure, getProperty, getReferenceDesignation, getReport_json, getResultTable, getSpecification, getTemperature, getTemperature, getThermoSystem, getUtilizationSummary, hashCode, initElectricalDesign, initializeDefaultConstraints, initInstrumentDesign, initMechanicalDesign, isActive, isActive, isCapacityAnalysisEnabled, isCapacityExceeded, isFailed, isHardLimitExceeded, isNearCapacityLimit, isSetEnergyStream, reportResults, restoreFromFailure, run_step, runConditionAnalysis, setCapacityAnalysisEnabled, setController, setEnergyStream, setEnergyStream, setFailureMode, setFlowValveController, setMinimumFlow, setPressure, setReferenceDesignation, setRegulatorOutSignal, setSpecification, setTemperature, simulateDegradedOperation, simulateTrip, solved, toJson, toJsonMethods inherited from class SimulationBaseClass
getCalculateSteadyState, getCalculationIdentifier, getTime, increaseTime, isRunInSteps, setCalculateSteadyState, setCalculationIdentifier, setRunInSteps, setTimeMethods inherited from class NamedBaseClass
getName, getTagNumber, setName, setTagNumberMethods inherited from class Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface NamedInterface
getName, getTagName, getTagNumber, setName, setTagName, setTagNumberMethods inherited from interface ProcessEquipmentInterface
getCapacityDuty, getCapacityMax, getElectricalDesign, getEquipmentState, getExergyChange, getExergyDestruction, getExergyDestruction, getFluid, getInletStreams, getInstrumentDesign, getOperatingEnvelopeViolation, getOutletFlowRate, getOutletPressure, getOutletStreams, getOutletTemperature, getReferenceDesignationString, getRestCapacity, getSimulationValidationErrors, isSimulationValid, isWithinOperatingEnvelope, needRecalculation, validateSetupMethods inherited from interface SimulationInterface
getCalculateSteadyState, getCalculationIdentifier, getTime, increaseTime, isRunInSteps, run, run_step, runTransient, runTransient, setCalculateSteadyState, setCalculationIdentifier, setRunInSteps, setTime
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
logger
private static final org.apache.logging.log4j.Logger logger -
dataPoints
-
injectionProfile
-
hallCumulativePressureTime
-
hallCumulativeVolume
-
currentHallSlope
private double currentHallSlope -
initialHallSlope
private double initialHallSlope -
hallPlotCalculated
private boolean hallPlotCalculated -
diagnosis
-
-
Constructor Details
-
InjectionConformanceMonitor
Create an injection conformance monitor.- Parameters:
name- monitor name
-
-
Method Details
-
recordInjectionData
public void recordInjectionData(double timeDays, double wellheadPressureBar, double injectionRateM3perDay) Record an injection data point.- Parameters:
timeDays- time since start of monitoring (days)wellheadPressureBar- wellhead pressure (bar)injectionRateM3perDay- injection rate (m3/day)
-
addZoneProfile
public void addZoneProfile(String zoneName, double depthM, double allocationFraction, boolean isTargetZone) Add a zone to the injection profile.- Parameters:
zoneName- zone identifierdepthM- zone depth (m)allocationFraction- fraction of total injection going to this zone (0.0-1.0)isTargetZone- whether this is the intended injection zone
-
calculateHallPlot
public void calculateHallPlot()Calculate the Hall plot from recorded injection data.Hall integral is the cumulative sum of (WHP * dt) plotted against cumulative injection volume. The slope of this plot indicates injectivity behavior.
-
getCurrentHallSlope
public double getCurrentHallSlope()Get the current Hall slope from the most recent data.- Returns:
- current Hall slope (bar day/m3)
-
getInitialHallSlope
public double getInitialHallSlope()Get the initial Hall slope from the early data.- Returns:
- initial Hall slope (bar day/m3)
-
detectSlopeChange
public boolean detectSlopeChange(double thresholdFraction) Detect a significant change in the Hall slope.- Parameters:
thresholdFraction- fractional change threshold (e.g., 0.2 for 20%)- Returns:
- true if slope change exceeds threshold
-
getDiagnosis
-
getConformanceDiagnosis
Get the conformance diagnosis enum.- Returns:
- diagnosis enum value
-
getInjectionEfficiency
public double getInjectionEfficiency()Get the injection efficiency from the zone profile.Injection efficiency = fraction of total injection going to target zone(s).
- Returns:
- injection efficiency (0.0 to 1.0), or -1 if no profile available
-
getOutOfZoneFraction
public double getOutOfZoneFraction()Get the out-of-zone injection fraction from the profile.- Returns:
- out-of-zone fraction (0.0 to 1.0), or -1 if no profile available
-
getHallCumulativePressureTime
-
getHallCumulativeVolume
-
getDataPointCount
public int getDataPointCount()Get the number of recorded data points.- Returns:
- data point count
-
getDataPoints
Get recorded data points.- Returns:
- list of injection data points
-
getInjectionProfile
Get the injection zone profile.- Returns:
- list of zone profile points
-
reset
public void reset()Clear all recorded data and reset the monitor. -
calculateCurrentSlope
private void calculateCurrentSlope()Calculate the Hall slope from the last 20% of data using least-squares linear regression. -
calculateInitialSlope
private void calculateInitialSlope()Calculate the Hall slope from the first 20% of data (initial injectivity baseline). -
calculateSlopeLinearRegression
private double calculateSlopeLinearRegression(int startIdx, int endIdx) Calculate slope using least-squares linear regression on the Hall plot.- Parameters:
startIdx- start index (inclusive)endIdx- end index (inclusive)- Returns:
- slope (bar day / m3)
-
updateDiagnosis
private void updateDiagnosis()Update the conformance diagnosis based on Hall slope analysis and injection profile. -
getDiagnosisDescription
Get human-readable diagnosis description.- Returns:
- description string
-
run
In this method all thermodynamic and unit operations will be calculated in a steady state calculation.
- Parameters:
id- UUID
-