Advanced Workflows for Reservoir Engineers
Overview
This guide covers advanced reservoir engineering workflows using ResSmith, including multi-well analysis, history matching, EOR evaluation, and production optimization.
Multi-Well and Field Analysis
Well Interference Analysis
Analyze interference between wells:
from ressmith import (
analyze_interference_with_production_history,
recommend_spacing_from_eur,
analyze_well_pattern
)
# Analyze interference
interference = analyze_interference_with_production_history(
well_data={
'well_1': data1,
'well_2': data2,
'well_3': data3
},
well_locations={
'well_1': (lat1, lon1),
'well_2': (lat2, lon2),
'well_3': (lat3, lon3)
}
)
# Get spacing recommendations
spacing = recommend_spacing_from_eur(
well_data,
well_locations,
target_interference=0.1 # 10% maximum interference
)
print(f"Recommended spacing: {spacing['optimal_spacing']:.0f} ft")
print(f"Expected interference: {spacing['expected_interference']*100:.1f}%")
Pattern Analysis
Analyze well patterns (5-spot, 9-spot):
from ressmith import analyze_well_pattern
# 5-spot pattern analysis
pattern_result = analyze_well_pattern(
well_data,
pattern_type='five_spot',
well_spacing=660.0 # 10-acre spacing
)
print(f"Pattern efficiency: {pattern_result['pattern_efficiency']:.2f}")
print(f"Drainage overlap: {pattern_result['drainage_overlap']*100:.1f}%")
History Matching and Simulation Integration
Material Balance History Matching
Match historical production and pressure:
from ressmith import history_match_material_balance
import numpy as np
# Historical data
time = np.array([0, 30, 60, 90, 120, 150, 180]) # days
production = np.array([0, 5000, 12000, 20000, 28000, 35000, 42000]) # STB
pressure = np.array([5000, 4800, 4600, 4400, 4200, 4000, 3800]) # psi
# History match
result = history_match_material_balance(
time=time,
production=production,
pressure=pressure,
drive_mechanism='solution_gas'
)
print(f"Matched OOIP: {result.optimized_params['N']:,.0f} STB")
print(f"Initial pressure: {result.optimized_params['pi']:.0f} psi")
print(f"Match quality (RMSE): {result.production_match['rmse']:.0f} STB")
Parameter Sensitivity Analysis
Analyze sensitivity of history match parameters:
from ressmith import (
run_parameter_sensitivity_analysis,
analyze_parameter_sensitivity,
identify_critical_parameters
)
# Sensitivity analysis
sensitivity = run_parameter_sensitivity_analysis(
result,
time=time,
production=production,
pressure=pressure,
n_samples=50
)
# Identify critical parameters
critical = identify_critical_parameters(sensitivity, threshold=0.1)
print(f"Critical parameters: {critical}")
Simulator Integration
Export data for reservoir simulators:
from ressmith import export_simulator_input, import_simulator_output
# Export for Eclipse
export_simulator_input(
production_data=production_df,
pressure_data=pressure_df,
output_path='eclipse_input.dat',
format='eclipse',
well_properties={
'permeability': 50.0, # md
'porosity': 0.15,
'thickness': 50.0 # ft
}
)
# Import simulation results
sim_results = import_simulator_output(
'simulation_output.rst',
format='eclipse'
)
# Compare simulation to forecast
from ressmith import compare_simulation_to_forecast
comparison = compare_simulation_to_forecast(
forecast=forecast,
simulation_results=sim_results['production'],
time_col='date'
)
print(f"Simulation vs Forecast RMSE: {comparison['rmse']:.2f}")
Enhanced Oil Recovery (EOR)
Waterflood Analysis
Analyze waterflood performance:
from ressmith import (
analyze_waterflood,
predict_waterflood_performance,
calculate_mobility_ratio_workflow
)
# Analyze existing waterflood
waterflood_result = analyze_waterflood(
production_data=production_df,
injection_data=injection_df,
pattern_type='five_spot',
well_spacing=660.0
)
print(f"Areal sweep efficiency: {waterflood_result['areal_sweep']:.2f}")
print(f"Displacement efficiency: {waterflood_result['displacement_efficiency']:.2f}")
print(f"Overall recovery factor: {waterflood_result['recovery_factor']:.2f}")
# Predict future performance
future_performance = predict_waterflood_performance(
current_recovery=waterflood_result['recovery_factor'],
target_recovery=0.35, # 35% target
injection_rate=1000.0, # STB/day
pattern_efficiency=waterflood_result['areal_sweep']
)
print(f"Time to target: {future_performance['time_to_target']:.0f} days")
Mobility Ratio
Calculate mobility ratio for waterflood:
mobility_ratio = calculate_mobility_ratio_workflow(
oil_viscosity=1.0, # cp
water_viscosity=0.5, # cp
oil_relative_permeability=0.8,
water_relative_permeability=0.3
)
print(f"Mobility ratio: {mobility_ratio:.2f}")
if mobility_ratio < 1.0:
print("Favorable mobility ratio - good displacement efficiency expected")
else:
print("Unfavorable mobility ratio - consider mobility control")
Production Operations
Well Test Validation
Validate well test data and results:
from ressmith import validate_and_analyze_well_test
import numpy as np
# Well test data
time = np.array([0.1, 0.5, 1, 2, 5, 10, 24]) # hours
pressure = np.array([3000, 3200, 3400, 3600, 3800, 3900, 3950]) # psi
# Validate and analyze
result = validate_and_analyze_well_test(
time=time,
pressure=pressure,
test_type='buildup',
production_rate=1000.0, # STB/day
production_time=720.0 # hours
)
if result['is_valid']:
test_result = result['test_result']
print(f"Permeability: {test_result.permeability:.2f} md")
print(f"Skin factor: {test_result.skin:.2f}")
print(f"Reservoir pressure: {test_result.reservoir_pressure:.0f} psi")
else:
print("Test validation failed:")
for error in result['data_validation'].errors:
print(f" - {error}")
Production Allocation
Optimize production allocation:
from ressmith import allocate_production, optimize_production
from ressmith.primitives import FacilityConstraints
# Well capacities
well_capacities = {
'well_1': 1000.0, # STB/day
'well_2': 800.0,
'well_3': 600.0
}
# Facility constraints
constraints = FacilityConstraints(
max_total_rate=2000.0, # Facility limit
facility_capacity=2500.0,
max_well_rate=1200.0
)
# Optimize allocation
allocation = optimize_production(
well_capacities=well_capacities,
total_target=2400.0,
well_costs={'well_1': 10.0, 'well_2': 12.0, 'well_3': 15.0},
constraints=constraints
)
print(f"Optimal allocation: {allocation['allocations']}")
print(f"Facility utilization: {allocation['facility_utilization']*100:.1f}%")
Artificial Lift Optimization
Optimize artificial lift systems:
from ressmith import (
optimize_esp_system,
optimize_gas_lift_system,
compare_artificial_lift_methods
)
# ESP optimization
esp_result = optimize_esp_system(
ipr_curve=(pressures, rates),
vlp_curve=(pressures, rates),
target_rate=500.0 # STB/day
)
print(f"Optimal ESP rate: {esp_result['optimal_rate']:.0f} STB/day")
print(f"Power required: {esp_result['power_required']:.1f} HP")
# Compare lift methods
comparison = compare_artificial_lift_methods(
ipr_curve=(pressures, rates),
vlp_curve=(pressures, rates),
target_rate=500.0
)
print(f"Best method: {comparison['best_method']}")
print(f"Cost comparison: {comparison['cost_comparison']}")
Rate Transient Analysis (RTA)
Flow Regime Identification
Identify flow regimes from production data:
from ressmith import (
identify_flow_regime,
analyze_production_data,
generate_all_diagnostic_plots
)
# Identify flow regime
regime = identify_flow_regime(time, rate)
print(f"Flow regime: {regime}")
# Comprehensive RTA analysis
rta_result = analyze_production_data(
time=time,
rate=rate,
pressure=pressure
)
print(f"Permeability: {rta_result['permeability']:.2f} md")
print(f"Fracture half-length: {rta_result['fracture_half_length']:.0f} ft")
print(f"SRV: {rta_result['srv']:.0f} acre-ft")
# Generate diagnostic plots
plots = generate_all_diagnostic_plots(
time=time,
rate=rate,
save_path='rta_diagnostics'
)
Type Curve Matching
Match production to type curves:
from ressmith import (
match_type_curve_workflow,
analyze_blasingame,
analyze_dn_type_curve
)
# Blasingame type curve
blasingame = analyze_blasingame(
data=production_df,
rate_col='oil',
pressure_col='pressure'
)
# DN type curve (for tight gas/shale)
dn_result = analyze_dn_type_curve(
data=production_df,
rate_col='gas',
initial_pressure=5000.0
)
print(f"DN flow regime: {dn_result['flow_regime']}")
print(f"Duong m parameter: {dn_result['duong_m']:.3f}")
Coning and Breakthrough Analysis
Water/Gas Coning
Analyze coning and predict breakthrough:
from ressmith import (
analyze_well_coning,
forecast_wor_gor_with_coning
)
# Coning analysis
coning_result = analyze_well_coning(
production_data=production_df,
well_properties={
'permeability': 50.0, # md
'thickness': 50.0, # ft
'oil_viscosity': 1.0, # cp
'water_viscosity': 0.5, # cp
'density_difference': 0.3 # g/cc
}
)
print(f"Critical rate: {coning_result['critical_rate']:.0f} STB/day")
print(f"Coning risk: {coning_result['coning_risk']}")
print(f"Breakthrough time: {coning_result['breakthrough_time']:.0f} days")
# Forecast WOR/GOR with breakthrough
wor_gor_forecast = forecast_wor_gor_with_coning(
production_data=production_df,
coning_analysis=coning_result,
horizon=60
)
print(f"Forecasted WOR at 60 months: {wor_gor_forecast['wor_forecast'].iloc[-1]:.2f}")
Relative Permeability and Capillary Pressure
Generate Relative Permeability Curves
Create relative permeability curves:
from ressmith import (
generate_relative_permeability_curves,
generate_three_phase_relative_permeability,
generate_capillary_pressure_curve
)
# Two-phase oil-water
kr_curves = generate_relative_permeability_curves(
sw_values=np.linspace(0.2, 0.8, 100),
swc=0.2, # Connate water saturation
sor=0.3 # Residual oil saturation
)
# Three-phase (oil/gas/water)
kr_3phase = generate_three_phase_relative_permeability(
sw_values=np.linspace(0.2, 0.8, 100),
sg_values=np.linspace(0.0, 0.3, 100),
swc=0.2,
sor=0.3,
sgr=0.05 # Residual gas saturation
)
# Capillary pressure
pc_curve = generate_capillary_pressure_curve(
sw_values=np.linspace(0.2, 0.8, 100),
pore_throat_radius=10.0, # microns
interfacial_tension=30.0, # dynes/cm
contact_angle=0.0 # degrees
)
Pressure Normalization
Normalize Production Data
Normalize rates and cumulative for RTA:
from ressmith import (
normalize_production_with_pressure,
normalize_for_rta_analysis,
calculate_pseudopressure_workflow
)
# Normalize rates
normalized = normalize_production_with_pressure(
data=production_df,
rate_col='oil',
pressure_col='pressure',
initial_pressure=5000.0
)
# For RTA analysis
rta_normalized = normalize_for_rta_analysis(
data=production_df,
rate_col='gas',
pressure_col='pressure',
temperature=200.0, # F
gas_gravity=0.7
)
# Pseudopressure (for gas)
pseudopressure = calculate_pseudopressure_workflow(
pressure=pressure_array,
temperature=200.0,
gas_gravity=0.7
)
Summary
These advanced workflows enable comprehensive reservoir engineering analysis:
Multi-well analysis: Interference, spacing, pattern efficiency
History matching: Material balance, parameter sensitivity, simulator integration
EOR evaluation: Waterflood analysis, mobility ratio, recovery prediction
Production operations: Well test validation, allocation, artificial lift
RTA: Flow regime identification, type curve matching, diagnostic plots
Coning analysis: Breakthrough prediction, WOR/GOR forecasting
Fluid properties: Relative permeability, capillary pressure
For more details, see: