Class ProductionProfileGenerator
- All Implemented Interfaces:
Serializable
This class implements the classic Arps decline curve equations (exponential, hyperbolic, and harmonic) for forecasting oil and gas production over the field life. These empirical models are widely used in reservoir engineering for production forecasting and reserves estimation.
Decline Curve Types
- Exponential (b=0): Constant percentage decline per period. Common for solution-gas drive reservoirs and boundary-dominated flow.
- Hyperbolic (0<b<1): Declining percentage decline over time. Most common for multiphase flow and heterogeneous reservoirs.
- Harmonic (b=1): Linear decline rate. Represents gravity drainage or some water drive reservoirs.
Arps Equations
The general Arps hyperbolic equation:
q(t) = qi / (1 + b * Di * t) ^ (1 / b)
Where:
- q(t) = production rate at time t
- qi = initial production rate
- Di = initial decline rate (fraction per time period)
- b = decline exponent (0 = exponential, 0<b<1 = hyperbolic, 1 = harmonic)
- t = time
Example Usage
// Create generator
ProductionProfileGenerator generator = new ProductionProfileGenerator();
// Generate exponential decline (typical for gas wells)
Map<Integer, Double> gasProfile = generator.generateExponentialDecline(10.0e6, // Initial rate:
// 10 MSm3/d
0.15, // 15% annual decline
2026, // Start year
20, // 20 years
0.5e6 // Economic limit: 0.5 MSm3/d
);
// Generate hyperbolic decline (typical for oil wells)
Map<Integer, Double> oilProfile = generator.generateHyperbolicDecline(15000, // Initial rate:
// 15,000 bbl/d
0.20, // 20% initial decline
0.5, // b-factor = 0.5
2026, // Start year
25, // 25 years
100 // Economic limit: 100 bbl/d
);
// Use with CashFlowEngine
CashFlowEngine engine = new CashFlowEngine("NO");
engine.setProductionProfile(oilProfile, gasProfile, null);
Plateau Period
Many fields have a plateau period before decline begins. Use the methods with plateau parameters to model this behavior:
// 3 years plateau, then exponential decline
Map<Integer, Double> profile = generator.generateWithPlateau(10.0e6, // Plateau rate
3, // Plateau years
0.12, // 12% decline after plateau
DeclineType.EXPONENTIAL, 2026, // Start year
20 // Total years
);
- Version:
- 1.0
- Author:
- ESOL
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumDecline curve type enumeration. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final doubleDays per year for rate conversions.private static final long -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic doublecalculateCumulativeProduction(Map<Integer, Double> profile) Calculates cumulative production from a profile.static doublecalculateEUR(double initialRatePerDay, double declineRate, ProductionProfileGenerator.DeclineType declineType, double bFactor) Calculates the estimated ultimate recovery (EUR) using Arps equations.combineProfiles(Map<Integer, Double>... profiles) Combines multiple production profiles (e.g., for multiple wells or phases).generateExponentialDecline(double initialRatePerDay, double annualDeclineRate, int startYear, int years) Generates exponential decline with default economic limit of 0.generateExponentialDecline(double initialRatePerDay, double annualDeclineRate, int startYear, int maxYears, double economicLimit) Generates an exponential decline production profile.generateFullProfile(double peakRatePerDay, int rampUpYears, int plateauYears, double declineRate, double bFactor, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears, double economicLimit) Generates a full production profile with all configurable parameters.generateFullProfile(double peakRatePerDay, int rampUpYears, int plateauYears, double declineRate, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears) Generates a production profile with ramp-up, plateau, and decline phases.generateHarmonicDecline(double initialRatePerDay, double initialDeclineRate, int startYear, int years) Generates harmonic decline with default economic limit.generateHarmonicDecline(double initialRatePerDay, double initialDeclineRate, int startYear, int maxYears, double economicLimit) Generates a harmonic decline production profile.generateHyperbolicDecline(double initialRatePerDay, double initialDeclineRate, double bFactor, int startYear, int years) Generates hyperbolic decline with default economic limit.generateHyperbolicDecline(double initialRatePerDay, double initialDeclineRate, double bFactor, int startYear, int maxYears, double economicLimit) Generates a hyperbolic decline production profile.generateWithPlateau(double plateauRatePerDay, int plateauYears, double declineRate, double bFactor, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears, double economicLimit) Generates a production profile with plateau and configurable decline parameters.generateWithPlateau(double plateauRatePerDay, int plateauYears, double declineRate, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears) Generates a production profile with an initial plateau period followed by decline.static StringgetProfileSummary(Map<Integer, Double> profile) Gets a summary of a production profile.scaleProfile(Map<Integer, Double> profile, double scaleFactor) Scales a production profile by a factor.shiftProfile(Map<Integer, Double> profile, int yearShift) Shifts a production profile by a number of years.
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
DAYS_PER_YEAR
private static final double DAYS_PER_YEARDays per year for rate conversions.- See Also:
-
-
Constructor Details
-
ProductionProfileGenerator
public ProductionProfileGenerator()Creates a new production profile generator.
-
-
Method Details
-
generateExponentialDecline
public Map<Integer,Double> generateExponentialDecline(double initialRatePerDay, double annualDeclineRate, int startYear, int maxYears, double economicLimit) Generates an exponential decline production profile.Exponential decline assumes a constant percentage decline per time period:
q(t) = qi * e ^ (-Di * t)
- Parameters:
initialRatePerDay- initial production rate (volume per day)annualDeclineRate- annual decline rate as fraction (e.g., 0.15 for 15%)startYear- first year of productionmaxYears- maximum years to generateeconomicLimit- minimum economic rate (stops when rate falls below)- Returns:
- map of year to annual production volume
-
generateExponentialDecline
public Map<Integer,Double> generateExponentialDecline(double initialRatePerDay, double annualDeclineRate, int startYear, int years) Generates exponential decline with default economic limit of 0.- Parameters:
initialRatePerDay- initial production rate (volume per day)annualDeclineRate- annual decline rate as fractionstartYear- first year of productionyears- number of years to generate- Returns:
- map of year to annual production volume
-
generateHyperbolicDecline
public Map<Integer,Double> generateHyperbolicDecline(double initialRatePerDay, double initialDeclineRate, double bFactor, int startYear, int maxYears, double economicLimit) Generates a hyperbolic decline production profile.Hyperbolic decline uses the Arps equation with 0 < b < 1:
q(t) = qi / (1 + b * Di * t) ^ (1 / b)
- Parameters:
initialRatePerDay- initial production rate (volume per day)initialDeclineRate- initial decline rate as fraction (e.g., 0.20 for 20%)bFactor- Arps b-factor (0 < b < 1, typically 0.3-0.7)startYear- first year of productionmaxYears- maximum years to generateeconomicLimit- minimum economic rate- Returns:
- map of year to annual production volume
-
generateHyperbolicDecline
public Map<Integer,Double> generateHyperbolicDecline(double initialRatePerDay, double initialDeclineRate, double bFactor, int startYear, int years) Generates hyperbolic decline with default economic limit.- Parameters:
initialRatePerDay- initial production rate (volume per day)initialDeclineRate- initial decline rate as fractionbFactor- Arps b-factor (0 < b < 1)startYear- first year of productionyears- number of years to generate- Returns:
- map of year to annual production volume
-
generateHarmonicDecline
public Map<Integer,Double> generateHarmonicDecline(double initialRatePerDay, double initialDeclineRate, int startYear, int maxYears, double economicLimit) Generates a harmonic decline production profile.Harmonic decline is a special case of hyperbolic decline with b = 1:
q(t) = qi / (1 + Di * t)
- Parameters:
initialRatePerDay- initial production rate (volume per day)initialDeclineRate- initial decline rate as fractionstartYear- first year of productionmaxYears- maximum years to generateeconomicLimit- minimum economic rate- Returns:
- map of year to annual production volume
-
generateHarmonicDecline
public Map<Integer,Double> generateHarmonicDecline(double initialRatePerDay, double initialDeclineRate, int startYear, int years) Generates harmonic decline with default economic limit.- Parameters:
initialRatePerDay- initial production rate (volume per day)initialDeclineRate- initial decline rate as fractionstartYear- first year of productionyears- number of years to generate- Returns:
- map of year to annual production volume
-
generateWithPlateau
public Map<Integer,Double> generateWithPlateau(double plateauRatePerDay, int plateauYears, double declineRate, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears) Generates a production profile with an initial plateau period followed by decline.- Parameters:
plateauRatePerDay- plateau production rate (volume per day)plateauYears- number of years at plateau before decline beginsdeclineRate- decline rate after plateaudeclineType- type of decline (exponential, hyperbolic, harmonic)startYear- first year of productiontotalYears- total years including plateau- Returns:
- map of year to annual production volume
-
generateWithPlateau
public Map<Integer,Double> generateWithPlateau(double plateauRatePerDay, int plateauYears, double declineRate, double bFactor, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears, double economicLimit) Generates a production profile with plateau and configurable decline parameters.- Parameters:
plateauRatePerDay- plateau production rate (volume per day)plateauYears- number of years at plateaudeclineRate- decline rate after plateaubFactor- b-factor for hyperbolic decline (ignored for other types)declineType- type of declinestartYear- first year of productiontotalYears- total years including plateaueconomicLimit- minimum economic rate- Returns:
- map of year to annual production volume
-
generateFullProfile
public Map<Integer,Double> generateFullProfile(double peakRatePerDay, int rampUpYears, int plateauYears, double declineRate, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears) Generates a production profile with ramp-up, plateau, and decline phases.This is the most realistic model for new field developments, with:
- Ramp-up: Linear increase from first production to plateau
- Plateau: Constant rate at peak production
- Decline: Arps decline curve after plateau
- Parameters:
peakRatePerDay- peak/plateau production rate (volume per day)rampUpYears- years to ramp from 0 to plateauplateauYears- years at plateau ratedeclineRate- decline rate after plateaudeclineType- type of decline curvestartYear- first year of productiontotalYears- total project years- Returns:
- map of year to annual production volume
-
generateFullProfile
public Map<Integer,Double> generateFullProfile(double peakRatePerDay, int rampUpYears, int plateauYears, double declineRate, double bFactor, ProductionProfileGenerator.DeclineType declineType, int startYear, int totalYears, double economicLimit) Generates a full production profile with all configurable parameters.- Parameters:
peakRatePerDay- peak/plateau production rate (volume per day)rampUpYears- years to ramp from 0 to plateauplateauYears- years at plateau ratedeclineRate- decline rate after plateaubFactor- b-factor for hyperbolic declinedeclineType- type of decline curvestartYear- first year of productiontotalYears- total project yearseconomicLimit- minimum economic rate- Returns:
- map of year to annual production volume
-
calculateCumulativeProduction
-
calculateEUR
public static double calculateEUR(double initialRatePerDay, double declineRate, ProductionProfileGenerator.DeclineType declineType, double bFactor) Calculates the estimated ultimate recovery (EUR) using Arps equations.For exponential decline, EUR = qi / Di. For hyperbolic/harmonic, the calculation is more complex and depends on economic limit.
- Parameters:
initialRatePerDay- initial production ratedeclineRate- initial decline ratedeclineType- type of declinebFactor- b-factor (for hyperbolic)- Returns:
- estimated ultimate recovery
-
scaleProfile
-
shiftProfile
-
combineProfiles
-
getProfileSummary
-