Class SensitivityAnalysis
java.lang.Object
neqsim.process.util.fielddevelopment.SensitivityAnalysis
- All Implemented Interfaces:
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
ProductionOptimizerfor 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:
SensitivityAnalysis.DistributionType.NORMAL- Symmetric uncertainty around meanSensitivityAnalysis.DistributionType.LOGNORMAL- Positive-valued, right-skewedSensitivityAnalysis.DistributionType.TRIANGULAR- Defined by min, mode, maxSensitivityAnalysis.DistributionType.UNIFORM- Equal probability in range
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:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumProbability distribution types for uncertain parameters.static final classComplete Monte Carlo analysis result.static final classConfiguration for sensitivity analysis.static final classSpider plot data point.static final classSingle Monte Carlo trial result.static final classUncertain parameter definition. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final ProcessSystemBase process system for simulation.static final intDefault number of Monte Carlo trials.private final List<SensitivityAnalysis.UncertainParameter> List of uncertain parameters.private RandomRandom number generator.private static final longSerialization version UID. -
Constructor Summary
ConstructorsConstructorDescriptionSensitivityAnalysis(ProcessSystem process) Creates a sensitivity analysis for a process system.SensitivityAnalysis(ProcessSystem process, Random rng) Creates a sensitivity analysis with specified RNG. -
Method Summary
Modifier and TypeMethodDescriptionAdds an uncertain parameter.Removes all parameters.Gets the base process system.Gets the list of parameters.private RandomgetRng()Gets the random number generator.runMonteCarloOptimization(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config) Runs Monte Carlo simulation on feed rate optimization.private List<SensitivityAnalysis.TrialResult> runParallelTrials(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config, Random localRng) Runs trials in parallel.private List<SensitivityAnalysis.TrialResult> runSequentialTrials(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config, Random localRng) Runs trials sequentially.private SensitivityAnalysis.TrialResultrunSingleTrial(int trialNum, Map<String, Double> sampled, StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Runs a single trial (used for parallel execution).runSpiderAnalysis(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, int stepsPerParameter, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Generates spider plot data for each parameter.runTornadoAnalysis(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Runs one-at-a-time sensitivity analysis (tornado diagram).runTornadoAnalysisInternal(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) voidSets the random number generator.
-
Field Details
-
serialVersionUID
private static final long serialVersionUIDSerialization version UID.- See Also:
-
DEFAULT_NUMBER_OF_TRIALS
public static final int DEFAULT_NUMBER_OF_TRIALSDefault number of Monte Carlo trials.- See Also:
-
baseProcess
Base process system for simulation. -
parameters
List of uncertain parameters. -
rng
Random number generator.
-
-
Constructor Details
-
SensitivityAnalysis
Creates a sensitivity analysis for a process system.- Parameters:
process- base process system
-
SensitivityAnalysis
Creates a sensitivity analysis with specified RNG.- Parameters:
process- base process systemrng- random number generator
-
-
Method Details
-
addParameter
Adds an uncertain parameter.- Parameters:
param- parameter to add- Returns:
- this for chaining
-
clearParameters
-
getParameters
Gets the list of parameters.- Returns:
- unmodifiable list of parameters
-
runMonteCarloOptimization
public SensitivityAnalysis.MonteCarloResult runMonteCarloOptimization(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config) Runs Monte Carlo simulation on feed rate optimization.For each trial:
- Sample all uncertain parameters
- Apply parameters to the process
- Run production optimization
- Extract the output metric
- Parameters:
feedStream- feed stream for optimizationlowerBound- lower bound for rateupperBound- upper bound for raterateUnit- rate unitoutputMetric- function to extract output from optimization resultconfig- simulation configuration- Returns:
- Monte Carlo result with statistics
-
runSequentialTrials
private List<SensitivityAnalysis.TrialResult> runSequentialTrials(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config, Random localRng) Runs trials sequentially. -
runParallelTrials
private List<SensitivityAnalysis.TrialResult> runParallelTrials(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric, SensitivityAnalysis.SensitivityConfig config, Random localRng) Runs trials in parallel. -
runSingleTrial
private SensitivityAnalysis.TrialResult runSingleTrial(int trialNum, Map<String, Double> sampled, StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Runs a single trial (used for parallel execution). -
runTornadoAnalysis
public Map<String,Double> runTornadoAnalysis(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Runs one-at-a-time sensitivity analysis (tornado diagram).For each parameter:
- Set all parameters to P50 (base case)
- Vary target parameter to P10, run, record output
- Vary target parameter to P90, run, record output
- Calculate sensitivity as |output_P90 - output_P10|
- Parameters:
feedStream- feed stream for optimizationlowerBound- lower bound for rateupperBound- upper bound for raterateUnit- rate unitoutputMetric- function to extract output- Returns:
- map of parameter name to sensitivity magnitude
-
runTornadoAnalysisInternal
private Map<String,Double> runTornadoAnalysisInternal(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) -
runSpiderAnalysis
public Map<String, List<SensitivityAnalysis.SpiderPoint>> runSpiderAnalysis(StreamInterface feedStream, double lowerBound, double upperBound, String rateUnit, int stepsPerParameter, ToDoubleFunction<ProductionOptimizer.OptimizationResult> outputMetric) Generates spider plot data for each parameter.Varies each parameter systematically from P10 to P90 while holding others at P50, recording the output at each step.
- Parameters:
feedStream- feed stream for optimizationlowerBound- lower bound for rateupperBound- upper bound for raterateUnit- rate unitstepsPerParameter- number of steps from P10 to P90outputMetric- function to extract output- Returns:
- map of parameter name to list of spider points
-
getRng
-
setRng
-
getBaseProcess
-