Skip to content

Operational Risk Simulation Framework with Process Topology Analysis#1847

Merged
EvenSol merged 5 commits intomasterfrom
streaming-processes
Jan 30, 2026
Merged

Operational Risk Simulation Framework with Process Topology Analysis#1847
EvenSol merged 5 commits intomasterfrom
streaming-processes

Conversation

@EvenSol
Copy link
Copy Markdown
Collaborator

@EvenSol EvenSol commented Jan 30, 2026

Summary

This PR introduces a comprehensive Operational Risk Simulation Framework for NeqSim, enabling equipment failure analysis, production impact assessment, degraded operation optimization, Monte Carlo risk simulation, and process topology/dependency analysis with STID (Standard Tag Identification) support.


🎯 Key Features

1. Equipment Failure Modeling (neqsim.process.equipment.failure)

Class Description
EquipmentFailureMode Defines failure types (TRIP, DEGRADED, PARTIAL_FAILURE, FULL_FAILURE, MAINTENANCE, BYPASSED) with capacity reduction factors
ReliabilityDataSource Singleton providing OREDA-based reliability data (MTTF, failure rates, repair times) from CSV files

Example:

EquipmentFailureMode failure = EquipmentFailureMode.trip("Compressor A", "High vibration");
failure.getCapacityReduction();  // Returns 1.0 (100% loss)

ReliabilityDataSource.getInstance().getMTTF("Compressor");  // Returns 8760 hours

2. Production Impact Analysis (neqsim.process.util.optimizer)

Class Description
ProductionImpactAnalyzer Analyzes production loss from equipment failures, compares to plant stop scenarios
ProductionImpactResult Contains production loss %, affected equipment list, revenue impact
DegradedOperationOptimizer Optimizes plant operation during equipment outages
DegradedOperationResult Recovery plans with step-by-step operational changes

Example:

ProductionImpactAnalyzer analyzer = new ProductionImpactAnalyzer(processSystem);
ProductionImpactResult result = analyzer.analyzeFailureImpact(failureMode);

System.out.println("Production loss: " + result.getPercentLoss() + "%");
System.out.println("Revenue impact: $" + result.getRevenueImpact());

3. Monte Carlo Risk Simulation (neqsim.process.safety.risk)

Class Description
OperationalRiskSimulator Monte Carlo simulation of equipment failures over time
OperationalRiskResult Statistical results (P10/P50/P90, expected losses, confidence intervals)
RiskMatrix 5×5 graphical risk matrix with probability, consequence, and cost dimensions

Risk Matrix Categories:

Probability Consequence Risk Levels
RARE (1) NEGLIGIBLE (1) LOW
UNLIKELY (2) MINOR (2) MEDIUM
POSSIBLE (3) MODERATE (3) HIGH
LIKELY (4) MAJOR (4) VERY_HIGH
ALMOST_CERTAIN (5) CATASTROPHIC (5) EXTREME

Example:

OperationalRiskSimulator simulator = new OperationalRiskSimulator(process);
simulator.addEquipmentWithReliability("Compressor A", 8760, 24);  // MTTF, MTTR
OperationalRiskResult result = simulator.runSimulation(10000, 365);

System.out.println("Expected production loss: " + result.getExpectedProductionLoss() + "%");
System.out.println("P90 loss: " + result.getP90Loss() + "%");

// Risk Matrix
RiskMatrix matrix = new RiskMatrix();
matrix.addRiskItem("Compressor Trip", ProbabilityCategory.POSSIBLE, 
                   ConsequenceCategory.MAJOR, 500000.0);
System.out.println(matrix.toVisualization());

4. Process Topology Analysis (neqsim.process.util.topology)

Class Description
ProcessTopologyAnalyzer Extracts graph structure from ProcessSystem, identifies parallel equipment
FunctionalLocation STID tag parsing and validation (format: PPPP-TT-NNNNN[S])
DependencyAnalyzer Analyzes cascade failure effects, cross-installation dependencies

STID Format:

PPPP-TT-NNNNN[S]
│    │  │     └─ Train suffix (A, B, C...)
│    │  └─────── Sequence number
│    └────────── Equipment type (KA=compressor, PA=pump, VG=separator)
└─────────────── Installation code (1775=Gullfaks C, 2540=Åsgard A)

Installation Codes:

Code Installation
1775 Gullfaks C
1776 Gullfaks A
1777 Gullfaks B
2540 Åsgard A
2541 Åsgard B
6608 Troll A

Example:

// Build topology
ProcessTopologyAnalyzer topology = new ProcessTopologyAnalyzer(process);
topology.buildTopology();

// Add STID tags
topology.setFunctionalLocation("Compressor A", "1775-KA-23011A");
topology.setFunctionalLocation("Compressor B", "1775-KA-23011B");

// Check parallel equipment
FunctionalLocation locA = new FunctionalLocation("1775-KA-23011A");
FunctionalLocation locB = new FunctionalLocation("1775-KA-23011B");
locA.isParallelTo(locB);  // Returns true

// Analyze dependencies
DependencyAnalyzer deps = new DependencyAnalyzer(process, topology);
FailureImpactResult result = deps.analyzeFailure("Compressor A");

// What equipment needs extra monitoring?
Map<String, String> toMonitor = deps.getEquipmentToMonitor("Compressor A");

5. Cross-Installation Dependency Analysis

Supports tracking dependencies between installations (e.g., Gullfaks → Åsgard gas export):

// Define cross-installation dependency
deps.addCrossInstallationDependency(
    "Export Gas",              // Source equipment
    "Åsgard Inlet Separator",  // Target equipment
    "Åsgard A",                // Target installation
    "gas_export"               // Dependency type
);

// Or using STID tags
FunctionalLocation source = new FunctionalLocation("1775-KA-23011A");  // Gullfaks
FunctionalLocation target = new FunctionalLocation("2540-VG-30001");   // Åsgard
deps.addCrossInstallationDependency(source, target, "gas_export", 0.6);

// Analyze cross-installation effects
FailureImpactResult result = deps.analyzeFailure("Export Gas");
for (CrossInstallationEffect effect : result.getCrossInstallationEffects()) {
    System.out.println("Affects: " + effect.getTargetInstallation());
    System.out.println("Impact: " + effect.getImpactFactor() * 100 + "%");
}

📁 Files Added

Java Source Files (14 files)

Package File Description
failure EquipmentFailureMode.java Failure type definitions with builder pattern
failure ReliabilityDataSource.java OREDA reliability data singleton
failure package-info.java Package documentation
risk OperationalRiskSimulator.java Monte Carlo simulation engine
risk OperationalRiskResult.java Simulation results with statistics
risk RiskMatrix.java 5×5 risk matrix with visualization
optimizer ProductionImpactAnalyzer.java Failure impact analysis
optimizer ProductionImpactResult.java Impact analysis results
optimizer DegradedOperationOptimizer.java Degraded operation optimization
optimizer DegradedOperationResult.java Optimization results
topology ProcessTopologyAnalyzer.java Graph extraction from ProcessSystem
topology FunctionalLocation.java STID tag parsing
topology DependencyAnalyzer.java Cascade failure analysis
topology package-info.java Package documentation

Data Files (2 files)

File Description
reliabilitydata/equipment_reliability.csv OREDA-based MTTF/MTTR data
reliabilitydata/failure_modes.csv Failure mode definitions

Test Files (9 files)

File Tests
EquipmentFailureModeTest.java Failure mode creation, capacity reduction
ReliabilityDataSourceTest.java OREDA data loading, lookups
ProductionImpactAnalyzerTest.java Impact analysis, equipment ranking
DegradedOperationOptimizerTest.java Optimization, recovery plans
OperationalRiskSimulatorTest.java Monte Carlo simulation
RiskMatrixTest.java Risk matrix operations, visualization
ProcessTopologyAnalyzerTest.java Topology extraction, parallel detection
FunctionalLocationTest.java STID parsing, validation
DependencyAnalyzerTest.java Failure cascade, cross-installation

Jupyter Notebooks (4 files)

Notebook Description
RiskSimulationDemo.ipynb Monte Carlo risk simulation demo
ProductionImpactAnalysis.ipynb Production loss analysis
DegradedOperationDemo.ipynb Degraded operation optimization
TopologyDependencyAnalysis.ipynb Topology and STID tagging demo

🧪 Test Coverage

All new functionality includes comprehensive unit tests:

neqsim.process.equipment.failure - 12 tests
neqsim.process.util.optimizer    - 18 tests  
neqsim.process.safety.risk       - 15 tests
neqsim.process.util.topology     - 27 tests
────────────────────────────────────────────
Total: 72 new tests

📊 API Summary

Risk Simulation Flow

┌─────────────────┐     ┌──────────────────────┐     ┌────────────────────┐
│ EquipmentFailure│────►│ ProductionImpact     │────►│ DegradedOperation  │
│ Mode            │     │ Analyzer             │     │ Optimizer          │
└─────────────────┘     └──────────────────────┘     └────────────────────┘
        │                        │                            │
        ▼                        ▼                            ▼
┌─────────────────┐     ┌──────────────────────┐     ┌────────────────────┐
│ Reliability     │     │ OperationalRisk      │     │ RiskMatrix         │
│ DataSource      │     │ Simulator (MC)       │     │ (5×5 Visualization)│
└─────────────────┘     └──────────────────────┘     └────────────────────┘

Topology Analysis Flow

┌─────────────────┐     ┌──────────────────────┐     ┌────────────────────┐
│ ProcessSystem   │────►│ ProcessTopology      │────►│ DependencyAnalyzer │
│                 │     │ Analyzer             │     │                    │
└─────────────────┘     └──────────────────────┘     └────────────────────┘
                                 │                            │
                                 ▼                            ▼
                        ┌──────────────────────┐     ┌────────────────────┐
                        │ FunctionalLocation   │     │ CrossInstallation  │
                        │ (STID Tags)          │     │ Dependencies       │
                        └──────────────────────┘     └────────────────────┘

🔧 Usage from Python (neqsim-python)

import jpype
import neqsim

from neqsim.process.util.topology import ProcessTopologyAnalyzer, FunctionalLocation
from neqsim.process.safety.risk import RiskMatrix, OperationalRiskSimulator

# Topology analysis
topology = ProcessTopologyAnalyzer(process)
topology.buildTopology()
topology.setFunctionalLocation("Compressor A", "1775-KA-23011A")

# Risk matrix
matrix = RiskMatrix()
matrix.addRiskItem("Compressor Trip", 
                   RiskMatrix.ProbabilityCategory.POSSIBLE,
                   RiskMatrix.ConsequenceCategory.MAJOR, 
                   500000.0)
print(matrix.toVisualization())

✅ Checklist

  • All tests passing
  • Java 8 compatible (no var, List.of(), etc.)
  • Complete JavaDoc documentation
  • OREDA-based reliability data included
  • Jupyter notebook examples
  • Cross-installation support (Gullfaks ↔ Åsgard)
  • STID tag parsing and validation
  • JSON and DOT graph export

🔗 Related Issues

  • Equipment reliability analysis for production optimization
  • Process topology extraction for dependency mapping
  • STID/SAP integration for functional location tagging
  • Cross-field dependency analysis (multi-installation)

📝 Notes

  • All reliability data is based on OREDA (Offshore Reliability Data) handbook values
  • STID installation codes follow Norwegian Continental Shelf standards
  • Risk matrix follows ISO 31000 / NORSOK Z-013 guidelines
  • Topology export supports Graphviz DOT format for visualization

@EvenSol EvenSol merged commit 46e2098 into master Jan 30, 2026
7 checks passed
@EvenSol EvenSol deleted the streaming-processes branch January 30, 2026 16:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant