Class SensitivityAnalysis

java.lang.Object
neqsim.process.util.fielddevelopment.SensitivityAnalysis
All Implemented Interfaces:
Serializable

public class SensitivityAnalysis extends Object implements Serializable
Monte Carlo sensitivity analysis for field development uncertainty quantification.

This class provides comprehensive uncertainty analysis capabilities including:

  • Monte Carlo simulation with configurable probability distributions
  • P10/P50/P90 calculation for key outputs
  • Tornado diagram generation for sensitivity ranking
  • Spider plot data generation
  • Parallel execution for performance
  • Integration with ProductionOptimizer for process simulation

Uncertainty Quantification Concepts

Field development decisions are made under uncertainty. Key uncertain parameters include:

  • Reservoir properties (permeability, porosity, STOIIP)
  • Fluid properties (GOR, API gravity, viscosity)
  • Facility performance (equipment efficiencies, capacities)
  • Operating conditions (temperatures, pressures)
  • Economic factors (oil price, CAPEX, OPEX)

Probability Distributions

The following distributions are supported:

Sensitivity Analysis Methods

The class supports multiple sensitivity analysis approaches:

  • Monte Carlo: Random sampling of all parameters simultaneously
  • Tornado (One-at-a-time): Vary each parameter from P10 to P90 individually
  • Spider Plot: Systematic variation of each parameter across its range

Example Usage

SensitivityAnalysis sensitivity = new SensitivityAnalysis(facilityProcess);

// Add uncertain parameters
sensitivity.addParameter(UncertainParameter.triangular("feedTemperature", 15.0, 20.0, 25.0,
    (proc, val) -> feedStream.setTemperature(val, "C")));

sensitivity.addParameter(UncertainParameter.lognormal("reservoirPressure", 180.0, 200.0, 230.0,
    (proc, val) -> feedStream.setPressure(val, "bara")));

// Run Monte Carlo simulation
SensitivityConfig config = new SensitivityConfig().numberOfTrials(1000).parallel(true);

MonteCarloResult result = sensitivity.runMonteCarloOptimization(feedStream, 1000.0, 50000.0,
    "kg/hr", opt -> opt.getOptimalRate(), config);

System.out.printf("P10: %.0f, P50: %.0f, P90: %.0f%n", result.getP10(), result.getP50(),
    result.getP90());
System.out.println(result.toTornadoMarkdown());
Version:
1.0
Author:
ESOL
See Also: