Class ProductionProfileGenerator

java.lang.Object
neqsim.process.fielddevelopment.economics.ProductionProfileGenerator
All Implemented Interfaces:
Serializable

public class ProductionProfileGenerator extends Object implements Serializable
Generates production decline profiles using Arps decline curve analysis.

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:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • DAYS_PER_YEAR

      private static final double DAYS_PER_YEAR
      Days 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 production
      maxYears - maximum years to generate
      economicLimit - 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 fraction
      startYear - first year of production
      years - 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 production
      maxYears - maximum years to generate
      economicLimit - 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 fraction
      bFactor - Arps b-factor (0 < b < 1)
      startYear - first year of production
      years - 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 fraction
      startYear - first year of production
      maxYears - maximum years to generate
      economicLimit - 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 fraction
      startYear - first year of production
      years - 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 begins
      declineRate - decline rate after plateau
      declineType - type of decline (exponential, hyperbolic, harmonic)
      startYear - first year of production
      totalYears - 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 plateau
      declineRate - decline rate after plateau
      bFactor - b-factor for hyperbolic decline (ignored for other types)
      declineType - type of decline
      startYear - first year of production
      totalYears - total years including plateau
      economicLimit - 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 plateau
      plateauYears - years at plateau rate
      declineRate - decline rate after plateau
      declineType - type of decline curve
      startYear - first year of production
      totalYears - 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 plateau
      plateauYears - years at plateau rate
      declineRate - decline rate after plateau
      bFactor - b-factor for hyperbolic decline
      declineType - type of decline curve
      startYear - first year of production
      totalYears - total project years
      economicLimit - minimum economic rate
      Returns:
      map of year to annual production volume
    • calculateCumulativeProduction

      public static double calculateCumulativeProduction(Map<Integer,Double> profile)
      Calculates cumulative production from a profile.
      Parameters:
      profile - production profile (year to annual volume)
      Returns:
      total cumulative production
    • 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 rate
      declineRate - initial decline rate
      declineType - type of decline
      bFactor - b-factor (for hyperbolic)
      Returns:
      estimated ultimate recovery
    • scaleProfile

      public static Map<Integer,Double> scaleProfile(Map<Integer,Double> profile, double scaleFactor)
      Scales a production profile by a factor.
      Parameters:
      profile - original profile
      scaleFactor - multiplier for all values
      Returns:
      scaled profile
    • shiftProfile

      public static Map<Integer,Double> shiftProfile(Map<Integer,Double> profile, int yearShift)
      Shifts a production profile by a number of years.
      Parameters:
      profile - original profile
      yearShift - number of years to shift (positive = later)
      Returns:
      shifted profile
    • combineProfiles

      public static Map<Integer,Double> combineProfiles(Map<Integer,Double>... profiles)
      Combines multiple production profiles (e.g., for multiple wells or phases).
      Parameters:
      profiles - array of profiles to combine
      Returns:
      combined profile with summed values
    • getProfileSummary

      public static String getProfileSummary(Map<Integer,Double> profile)
      Gets a summary of a production profile.
      Parameters:
      profile - the profile to summarize
      Returns:
      formatted summary string