Skip to the content.

Reservoir Modeling

Documentation for reservoir modeling equipment in NeqSim, enabling coupled reservoir-process simulations.

Table of Contents


Overview

Location: neqsim.process.equipment.reservoir

The reservoir package provides classes for simplified reservoir modeling that can be integrated with process simulations. This enables:

Class Description
SimpleReservoir Material balance reservoir model
Well Well connection to reservoir
WellFlow Well flow calculations
WellSystem System of connected wells
ReservoirCVDsim Constant volume depletion simulation

SimpleReservoir

The SimpleReservoir class provides a material balance approach to reservoir modeling with support for multiple producers and injectors.

Class Hierarchy

ProcessEquipmentBaseClass
└── SimpleReservoir
    ├── contains: Well[] gasProducers
    ├── contains: Well[] oilProducers
    ├── contains: Well[] waterProducers
    ├── contains: Well[] gasInjectors
    └── contains: Well[] waterInjectors

Key Features

Constructor

import neqsim.process.equipment.reservoir.SimpleReservoir;
import neqsim.thermo.system.SystemSrkEos;

// Create reservoir fluid
SystemInterface reservoirFluid = new SystemSrkEos(373.0, 250.0);  // 100°C, 250 bar
reservoirFluid.addComponent("methane", 50.0);
reservoirFluid.addComponent("ethane", 5.0);
reservoirFluid.addComponent("propane", 3.0);
reservoirFluid.addComponent("n-heptane", 40.0);
reservoirFluid.addComponent("water", 2.0);
reservoirFluid.setMixingRule("classic");

// Create reservoir
SimpleReservoir reservoir = new SimpleReservoir("North Sea Field");
reservoir.setReservoirFluid(reservoirFluid);
reservoir.setGasVolume(1.0e9, "Sm3");      // Initial gas volume
reservoir.setOilVolume(100.0e6, "Sm3");     // Initial oil volume
reservoir.setWaterVolume(50.0e6, "m3");     // Initial water volume

Key Methods

Method Description
setReservoirFluid(SystemInterface) Set reservoir fluid composition
setGasVolume(double, String) Set initial gas volume
setOilVolume(double, String) Set initial oil volume
setWaterVolume(double, String) Set initial water volume
addGasProducer(String) Add gas production well
addOilProducer(String) Add oil production well
addWaterProducer(String) Add water production well
addGasInjector(String) Add gas injection well
addWaterInjector(String) Add water injection well
getGasInPlace(String) Get remaining gas in place
getOilInPlace(String) Get remaining oil in place
getPressure() Get current reservoir pressure
run() Execute material balance update

Adding Wells

// Add production wells
StreamInterface gasStream = reservoir.addGasProducer("Well-G1");
StreamInterface oilStream = reservoir.addOilProducer("Well-O1");
StreamInterface waterStream = reservoir.addWaterProducer("Well-W1");

// Add injection wells
StreamInterface gasInjStream = reservoir.addGasInjector("Well-GI1");
StreamInterface waterInjStream = reservoir.addWaterInjector("Well-WI1");

// Set production rates
reservoir.getGasProducer(0).getStream().setFlowRate(1.0, "MSm3/day");
reservoir.getOilProducer(0).getStream().setFlowRate(1000, "m3/day");

Retrieving Wells

// By index
Well gasWell = reservoir.getGasProducer(0);
Well oilWell = reservoir.getOilProducer(0);

// By name
Well namedWell = reservoir.getOilProducer("Well-O1");

// Access well stream
StreamInterface wellStream = gasWell.getStream();

Well Classes

Well

Represents a well connection to the reservoir.

import neqsim.process.equipment.reservoir.Well;

Well well = new Well("Production Well 1");
well.setStream(productionStream);

WellFlow

Provides well inflow performance relationship (IPR) calculations.

import neqsim.process.equipment.reservoir.WellFlow;

WellFlow wellFlow = new WellFlow("Well Inflow");
wellFlow.setReservoirPressure(250.0, "bara");
wellFlow.setWellheadPressure(80.0, "bara");
wellFlow.setProductivityIndex(10.0);  // m³/day/bar

Usage Examples

Basic Depletion Study

import neqsim.process.equipment.reservoir.SimpleReservoir;
import neqsim.thermo.system.SystemSrkEos;

// Create reservoir
SystemInterface fluid = new SystemSrkEos(373.0, 250.0);
fluid.addComponent("methane", 70.0);
fluid.addComponent("n-heptane", 30.0);
fluid.setMixingRule("classic");

SimpleReservoir reservoir = new SimpleReservoir("Test Reservoir");
reservoir.setReservoirFluid(fluid);
reservoir.setGasVolume(5.0e9, "Sm3");   // 5 GSm³
reservoir.setOilVolume(50.0e6, "Sm3");  // 50 MSm³

// Add producer
StreamInterface gasOut = reservoir.addGasProducer("GP-1");
reservoir.getGasProducer(0).getStream().setFlowRate(5.0, "MSm3/day");

// Simulate 10 years of production
double dt = 1.0;  // day
for (int day = 0; day < 3650; day++) {
    reservoir.run();
    
    // Log every month
    if (day % 30 == 0) {
        double year = day / 365.0;
        double gasInPlace = reservoir.getGasInPlace("GSm3");
        double pressure = reservoir.getPressure();
        
        System.out.printf("Year %.1f: GIP=%.2f GSm³, P=%.1f bara%n", 
                          year, gasInPlace, pressure);
    }
}

Oil Field with Water Injection

// Create oil reservoir
SimpleReservoir oilField = new SimpleReservoir("Oil Field");
oilField.setReservoirFluid(oilFluid);
oilField.setOilVolume(200.0e6, "Sm3");
oilField.setGasVolume(20.0e9, "Sm3");
oilField.setWaterVolume(100.0e6, "m3");
oilField.setLowPressureLimit(100.0);  // Minimum reservoir pressure

// Production wells
StreamInterface oil1 = oilField.addOilProducer("OP-1");
StreamInterface oil2 = oilField.addOilProducer("OP-2");
StreamInterface gas1 = oilField.addGasProducer("GP-1");

// Injection well for pressure maintenance
StreamInterface waterInj = oilField.addWaterInjector("WI-1");

// Set rates
oilField.getOilProducer(0).getStream().setFlowRate(5000, "bbl/day");
oilField.getOilProducer(1).getStream().setFlowRate(4000, "bbl/day");
oilField.getGasProducer(0).getStream().setFlowRate(1.0, "MSm3/day");

// Water injection for voidage replacement
oilField.getWaterInjector(0).getStream().setFlowRate(6000, "bbl/day");

// Run simulation
oilField.run();

Integrated Reservoir-Process System

import neqsim.process.processmodel.ProcessSystem;

// Create reservoir
SimpleReservoir reservoir = new SimpleReservoir("Field A");
reservoir.setReservoirFluid(reservoirFluid);
reservoir.setOilVolume(100.0e6, "Sm3");

// Add producer
StreamInterface wellStream = reservoir.addOilProducer("OP-1");

// Create process system
ProcessSystem facility = new ProcessSystem("FPSO");

// Reservoir production
reservoir.getOilProducer(0).getStream().setFlowRate(10000, "bbl/day");
facility.add(reservoir);

// Production separator
ThreePhaseSeparator separator = new ThreePhaseSeparator("HP Separator");
separator.setInletStream(wellStream);
facility.add(separator);

// Gas processing
Stream gasStream = separator.getGasOutStream();
Compressor compressor = new Compressor("Export Compressor", gasStream);
compressor.setOutletPressure(200.0, "bara");
facility.add(compressor);

// Run integrated simulation
facility.run();

// Check OOIP recovery
double initialOOIP = 100.0e6;
double remainingOil = reservoir.getOilInPlace("MSm3") * 1e6;
double recovery = (initialOOIP - remainingOil) / initialOOIP * 100;
System.out.println("Oil recovery: " + recovery + " %");

Material Balance

The reservoir uses a simplified material balance approach:

Gas Reservoir

G_p = G_i × (1 - P/P_i × Z_i/Z)

Where:

Oil Reservoir with Gas Cap

Includes gas cap expansion, oil zone compressibility, and water influx terms.

Volume Tracking

// Get original volumes
double OOIP = reservoir.getOOIP();  // Original oil in place
double OGIP = reservoir.getOGIP();  // Original gas in place

// Get current in-place volumes
double currentGIP = reservoir.getGasInPlace("GSm3");
double currentOIP = reservoir.getOilInPlace("MSm3");

// Get cumulative production
double cumGas = reservoir.getGasProductionTotal();
double cumOil = reservoir.getOilProductionTotal();

Integration with Process Systems

The reservoir can be integrated with surface facilities:

┌─────────────────┐
│   RESERVOIR     │
│                 │
│  ┌───────────┐  │
│  │  Gas Cap  │  │
│  └─────┬─────┘  │
│        │        │
│  ┌─────┴─────┐  │      ┌─────────────┐      ┌──────────┐
│  │ Oil Zone  │──┼──────│  Separator  │──────│ Pipeline │
│  └─────┬─────┘  │      └─────────────┘      └──────────┘
│        │        │
│  ┌─────┴─────┐  │
│  │   Water   │◄─┼───── Water Injection
│  └───────────┘  │
│                 │
└─────────────────┘