Production Impact Analysis
Production Impact Analysis quantifies how equipment failures affect plant output, enabling prioritization of maintenance and investment decisions.
Overview
When equipment fails, production is affected in several ways:
- Direct loss - Equipment output stops or reduces
- Cascade effects - Downstream equipment starved
- Bottleneck shifts - Different equipment becomes limiting
- Quality changes - Product specifications may change
The ProductionImpactAnalyzer uses NeqSim simulation to calculate these effects accurately.
Key Metrics
Production Loss Percentage
\[\text{Loss}_\% = \frac{P_{\text{normal}} - P_{\text{degraded}}}{P_{\text{normal}}} \times 100\%\]Revenue Impact
\[\text{Revenue Loss} = P_{\text{loss}} \times \text{Price} \times \text{Duration}\]Criticality Index
\[CI = \frac{\text{Production Loss}_\%}{\text{max(Production Loss across all equipment)}}\]Equipment with $CI > 0.8$ is considered “critical”.
Using ProductionImpactAnalyzer
Basic Analysis
// Create analyzer
ProductionImpactAnalyzer analyzer = new ProductionImpactAnalyzer(processSystem);
// Configure streams
analyzer.setFeedStreamName("Well Feed");
analyzer.setProductStreamName("Export Gas");
analyzer.setProductPrice(500.0, "USD/tonne");
// Analyze a specific failure
EquipmentFailureMode compressorTrip = EquipmentFailureMode.trip("HP Compressor");
ProductionImpactResult result = analyzer.analyzeFailureImpact(compressorTrip);
// Get results
System.out.println("Production loss: " + result.getPercentLoss() + "%");
System.out.println("Revenue impact: $" + result.getRevenueImpact() + "/hour");
System.out.println("Affected equipment: " + result.getAffectedEquipment());
Analyzing All Equipment
// Rank all equipment by criticality
Map<String, Double> criticality = analyzer.rankEquipmentByCriticality();
System.out.println("Equipment Criticality Ranking:");
for (Map.Entry<String, Double> entry : criticality.entrySet()) {
String status = entry.getValue() > 80 ? "⚠️ CRITICAL" : "";
System.out.printf(" %s: %.1f%% %s%n",
entry.getKey(), entry.getValue(), status);
}
Comparing Scenarios
// Compare failure to complete plant stop
ProductionImpactResult failure = analyzer.analyzeFailureImpact(compressorTrip);
ProductionImpactResult plantStop = analyzer.comparePlantStop();
double severityRatio = failure.getPercentLoss() / plantStop.getPercentLoss();
System.out.println("Severity vs plant stop: " + (severityRatio * 100) + "%");
ProductionImpactResult
The result object contains comprehensive impact data:
public class ProductionImpactResult {
// Production metrics
double getNormalProduction(); // kg/hr before failure
double getDegradedProduction(); // kg/hr after failure
double getProductionLoss(); // kg/hr lost
double getPercentLoss(); // 0-100%
// Economic metrics
double getRevenueImpact(); // $/hr
double getEstimatedDailyCost(); // $/day
// Affected equipment
List<String> getAffectedEquipment();
List<String> getCascadeEffects();
// Quality impacts (if applicable)
Map<String, Double> getQualityChanges();
// Bottleneck analysis
String getNewBottleneck();
double getBottleneckCapacity();
}
Impact Categories
Direct Impact
Equipment’s direct contribution to production:
// For a compressor
double throughput = compressor.getInletStream().getFlowRate("kg/hr");
double directImpact = throughput; // If compressor trips
Cascade Impact
Downstream equipment affected by upstream failure:
HP Separator trips
└─► HP Compressor starved (no gas feed)
└─► Export Cooler no flow
└─► Export Pipeline empty
// Cascade analysis
List<String> cascade = result.getCascadeEffects();
// Returns: [HP Compressor, Export Cooler, Export Pipeline]
Parallel Train Impact
When one train of parallel equipment fails:
Normal: Train A (50%) + Train B (50%) = 100%
Failure: Train A (0%) + Train B (50%) = 50%
// Parallel train analysis
if (topology.hasParallelEquipment("Compressor A")) {
List<String> parallel = topology.getParallelEquipment("Compressor A");
// Can redistribute load to Train B
}
Analysis Methods
1. Single Equipment Failure
EquipmentFailureMode failure = EquipmentFailureMode.trip("Equipment Name");
ProductionImpactResult result = analyzer.analyzeFailureImpact(failure);
2. Multiple Equipment Failures
List<EquipmentFailureMode> failures = Arrays.asList(
EquipmentFailureMode.trip("Compressor A"),
EquipmentFailureMode.degraded("Pump B", 0.5)
);
ProductionImpactResult result = analyzer.analyzeMultipleFailures(failures);
3. Degraded Operation Analysis
// What if compressor runs at 70% capacity?
EquipmentFailureMode degraded = EquipmentFailureMode.builder()
.name("Compressor fouling")
.type(FailureType.DEGRADED)
.capacityFactor(0.7)
.build();
ProductionImpactResult result = analyzer.analyzeFailureImpact(degraded);
System.out.println("At 70% capacity: " + result.getPercentLoss() + "% production loss");
4. Sensitivity Analysis
// How does production change with compressor capacity?
double[] capacities = {1.0, 0.9, 0.8, 0.7, 0.6, 0.5};
for (double cap : capacities) {
EquipmentFailureMode mode = EquipmentFailureMode.degraded("HP Compressor", cap);
ProductionImpactResult result = analyzer.analyzeFailureImpact(mode);
System.out.printf("Capacity %.0f%%: Production loss %.1f%%%n",
cap * 100, result.getPercentLoss());
}
Output:
Capacity 100%: Production loss 0.0%
Capacity 90%: Production loss 8.5%
Capacity 80%: Production loss 18.2%
Capacity 70%: Production loss 28.9%
Capacity 60%: Production loss 40.1%
Capacity 50%: Production loss 50.0%
Economic Analysis
Revenue Impact Calculation
// Set economic parameters
analyzer.setProductPrice(500.0, "USD/tonne"); // Gas price
analyzer.setDowntimeCostPerHour(10000.0); // Fixed costs
ProductionImpactResult result = analyzer.analyzeFailureImpact(failure);
// Get economic impact
double productionLoss = result.getProductionLoss(); // kg/hr
double revenueRate = productionLoss * 0.5 / 1000; // USD/hr (at $500/tonne)
double fixedCosts = analyzer.getDowntimeCostPerHour(); // USD/hr
double totalHourlyCost = revenueRate + fixedCosts; // Total USD/hr
Annual Impact Projection
\[\text{Annual Cost} = \lambda \times \text{MTTR} \times \text{Hourly Cost}\]double failureRate = 0.5; // per year
double mttr = 24.0; // hours
double hourlyCost = 50000.0; // USD/hr
double annualImpact = failureRate * mttr * hourlyCost; // $600,000/year
Visualization
Impact Summary Table
// Generate summary for all equipment
String table = analyzer.generateImpactSummary();
Output:
╔════════════════════════╦═══════════╦═══════════════╦═══════════════╗
║ Equipment ║ Loss (%) ║ Revenue/hr ║ Criticality ║
╠════════════════════════╬═══════════╬═══════════════╬═══════════════╣
║ HP Compressor ║ 85.2% ║ $42,600 ║ ⚠️ CRITICAL ║
║ LP Compressor ║ 65.4% ║ $32,700 ║ ⚠️ CRITICAL ║
║ HP Separator ║ 100.0% ║ $50,000 ║ ⚠️ CRITICAL ║
║ Export Pump ║ 45.0% ║ $22,500 ║ HIGH ║
║ Condensate Pump ║ 12.5% ║ $6,250 ║ MEDIUM ║
║ Inlet Cooler ║ 18.3% ║ $9,150 ║ MEDIUM ║
╚════════════════════════╩═══════════╩═══════════════╩═══════════════╝
JSON Export
String json = result.toJson();
{
"equipment": "HP Compressor",
"failureMode": "TRIP",
"normalProduction": {
"value": 50000,
"unit": "kg/hr"
},
"degradedProduction": {
"value": 7400,
"unit": "kg/hr"
},
"productionLoss": {
"value": 42600,
"unit": "kg/hr",
"percent": 85.2
},
"revenueImpact": {
"hourly": 42600,
"daily": 1022400,
"currency": "USD"
},
"affectedEquipment": [
"Export Cooler",
"Export Pipeline"
],
"cascadeEffects": [
{
"equipment": "Export Cooler",
"effect": "No flow",
"delay": "Immediate"
}
]
}
Integration with Other Tools
With Risk Matrix
// Populate risk matrix with impact data
RiskMatrix matrix = new RiskMatrix(process);
for (String equipment : analyzer.getAllEquipment()) {
EquipmentFailureMode failure = EquipmentFailureMode.trip(equipment);
ProductionImpactResult impact = analyzer.analyzeFailureImpact(failure);
ConsequenceCategory consequence =
ConsequenceCategory.fromProductionLoss(impact.getPercentLoss());
// Add to risk matrix
matrix.addRiskItem(equipment, probability, consequence, impact.getRevenueImpact());
}
With Topology Analysis
// Consider topology for cascade effects
ProcessTopologyAnalyzer topology = new ProcessTopologyAnalyzer(process);
topology.buildTopology();
// Find all downstream equipment
List<String> downstream = topology.getDownstreamEquipment("HP Separator");
// All downstream equipment will be affected by separator failure
Best Practices
- Validate baseline - Ensure normal production matches design
- Include all products - Gas, oil, condensate may have different values
- Consider quality - Off-spec product may have reduced value
- Account for startup - Production ramp-up after repair
- Include cascade effects - Use topology analysis
- Update prices - Use current market prices
- Document assumptions - Record all economic parameters