Equipment Failure Modeling
This document describes how to model equipment failures in NeqSim, including failure types, capacity factors, and reliability data.
Failure Types
FailureType Enum
public enum FailureType {
TRIP, // Complete stop, requires restart
DEGRADED, // Reduced capacity operation
PARTIAL_FAILURE,// Some functions lost
FULL_FAILURE, // Equipment non-functional
MAINTENANCE, // Planned shutdown
BYPASSED // Flow routed around
}
Failure Type Characteristics
| Type | Capacity | Recovery | Typical Duration |
|---|---|---|---|
| TRIP | 0% | Manual restart | 1-4 hours |
| DEGRADED | 10-90% | Continues operating | Until repair |
| PARTIAL_FAILURE | 20-80% | May continue | Until repair |
| FULL_FAILURE | 0% | Major repair | Days to weeks |
| MAINTENANCE | 0% | Planned | Hours to days |
| BYPASSED | 0% | Reconfiguration | Until restored |
Creating Failure Modes
Using Static Factory Methods
// Quick creation for common failure types
EquipmentFailureMode trip = EquipmentFailureMode.trip("Compressor A");
EquipmentFailureMode trip2 = EquipmentFailureMode.trip("Compressor A", "High vibration");
EquipmentFailureMode degraded = EquipmentFailureMode.degraded("Pump B", 0.5); // 50% capacity
EquipmentFailureMode maintenance = EquipmentFailureMode.maintenance("Heat Exchanger", 8.0); // 8 hours
Using Builder Pattern
EquipmentFailureMode failure = EquipmentFailureMode.builder()
.name("Compressor surge")
.description("Compressor enters surge condition")
.type(FailureType.TRIP)
.capacityFactor(0.0) // Complete loss
.efficiencyFactor(1.0) // N/A when tripped
.mttr(24.0) // 24 hours to repair
.failureFrequency(0.5) // 0.5 per year
.requiresImmediateAction(true)
.autoRecoverable(false)
.build();
Capacity Factor
The capacity factor defines the fraction of normal output during failure:
\[C_f = \frac{\text{Output during failure}}{\text{Normal output}}\]| Value | Meaning |
|---|---|
| 0.0 | Complete loss (TRIP, FULL_FAILURE) |
| 0.5 | 50% capacity (DEGRADED) |
| 0.8 | 80% capacity (minor degradation) |
| 1.0 | No effect on capacity |
Example: Degraded Compressor
// Compressor running at 70% capacity due to fouling
EquipmentFailureMode fouling = EquipmentFailureMode.builder()
.name("Compressor fouling")
.type(FailureType.DEGRADED)
.capacityFactor(0.7) // 70% capacity
.efficiencyFactor(0.85) // 85% efficiency
.build();
double normalFlow = 100.0; // kg/s
double degradedFlow = normalFlow * fouling.getCapacityFactor(); // 70 kg/s
Efficiency Factor
For degraded operation, efficiency may also be reduced:
\[\eta_{\text{degraded}} = \eta_{\text{normal}} \times E_f\]Where $E_f$ is the efficiency factor (0.0 to 1.0).
Example: Reduced Efficiency
// Compressor with fouled internals
EquipmentFailureMode fouling = EquipmentFailureMode.builder()
.name("Fouling")
.type(FailureType.DEGRADED)
.capacityFactor(0.9) // 90% capacity
.efficiencyFactor(0.8) // 80% of normal efficiency
.build();
double normalEfficiency = 0.75;
double degradedEfficiency = normalEfficiency * fouling.getEfficiencyFactor(); // 0.6
Reliability Data Source
OREDA-Based Data
The ReliabilityDataSource provides reliability data from OREDA (Offshore Reliability Data):
ReliabilityDataSource source = ReliabilityDataSource.getInstance();
// Get reliability data for equipment type
double mttf = source.getMTTF("Compressor"); // Mean Time To Failure (hours)
double mttr = source.getMTTR("Compressor"); // Mean Time To Repair (hours)
double failureRate = source.getFailureRate("Compressor"); // Failures per year
Equipment Types with Reliability Data
| Equipment Type | MTTF (hours) | MTTR (hours) | Availability |
|---|---|---|---|
| Compressor | 8,760 | 24 | 99.7% |
| Pump | 17,520 | 8 | 99.95% |
| Separator | 43,800 | 4 | 99.99% |
| Heat Exchanger | 43,800 | 12 | 99.97% |
| Valve (Control) | 26,280 | 4 | 99.98% |
| Turbine | 8,760 | 48 | 99.5% |
CSV Data Format
Reliability data is stored in CSV files under src/main/resources/reliabilitydata/:
equipment_reliability.csv:
EquipmentType,MTTF_hours,MTTR_hours,Source
Compressor,8760,24,OREDA-2015
Pump,17520,8,OREDA-2015
Separator,43800,4,OREDA-2015
HeatExchanger,43800,12,OREDA-2015
Valve,26280,4,OREDA-2015
failure_modes.csv:
EquipmentType,FailureMode,Probability,CapacityFactor,TypicalMTTR
Compressor,Trip,0.6,0.0,24
Compressor,Degraded,0.3,0.7,48
Compressor,Partial,0.1,0.5,72
Mathematical Background
Failure Rate
Failure rate $\lambda$ is the expected number of failures per unit time:
\[\lambda = \frac{1}{\text{MTTF}}\]For a Poisson process, the probability of $k$ failures in time $t$:
\[P(k) = \frac{(\lambda t)^k e^{-\lambda t}}{k!}\]Availability
Inherent availability:
\[A = \frac{\text{MTTF}}{\text{MTTF} + \text{MTTR}} = \frac{\text{Uptime}}{\text{Total Time}}\]For multiple independent equipment in series:
\[A_{\text{system}} = \prod_{i=1}^{n} A_i\]For redundant equipment in parallel:
\[A_{\text{parallel}} = 1 - \prod_{i=1}^{n} (1 - A_i)\]Reliability Function
Exponential reliability function (constant failure rate):
\[R(t) = e^{-\lambda t}\]Probability of failure before time $t$:
\[F(t) = 1 - R(t) = 1 - e^{-\lambda t}\]Common Failure Scenarios
1. Compressor Trip
EquipmentFailureMode compressorTrip = EquipmentFailureMode.builder()
.name("Compressor trip - high vibration")
.description("Trip due to vibration exceeding 25mm/s")
.type(FailureType.TRIP)
.capacityFactor(0.0)
.mttr(24.0)
.failureFrequency(0.5) // Once every 2 years
.requiresImmediateAction(true)
.build();
2. Pump Degradation
EquipmentFailureMode pumpWear = EquipmentFailureMode.builder()
.name("Pump impeller wear")
.description("Gradual performance degradation")
.type(FailureType.DEGRADED)
.capacityFactor(0.8) // 80% of design flow
.efficiencyFactor(0.75) // Reduced efficiency
.mttr(72.0) // Impeller replacement
.failureFrequency(0.2)
.build();
3. Separator Level Control Failure
EquipmentFailureMode levelFailure = EquipmentFailureMode.builder()
.name("Level control failure")
.description("Level transmitter malfunction")
.type(FailureType.PARTIAL_FAILURE)
.capacityFactor(0.7) // Manual level control possible
.mttr(4.0)
.requiresImmediateAction(false)
.autoRecoverable(false)
.build();
4. Planned Maintenance
EquipmentFailureMode turnaround = EquipmentFailureMode.builder()
.name("Planned turnaround")
.description("Annual maintenance shutdown")
.type(FailureType.MAINTENANCE)
.capacityFactor(0.0)
.mttr(168.0) // 7 days
.failureFrequency(1.0) // Annual
.requiresImmediateAction(false)
.build();
Integration with Process Simulation
Applying Failure to Equipment
// Get compressor from process
Compressor compressor = (Compressor) process.getUnit("HP Compressor");
// Create failure mode
EquipmentFailureMode failure = EquipmentFailureMode.trip("HP Compressor");
// Analyze impact
ProductionImpactAnalyzer analyzer = new ProductionImpactAnalyzer(process);
ProductionImpactResult result = analyzer.analyzeFailureImpact(failure);
System.out.println("Production loss: " + result.getPercentLoss() + "%");
System.out.println("Affected equipment: " + result.getAffectedEquipment());
Best Practices
- Use OREDA data when available for realistic reliability values
- Define multiple failure modes for critical equipment
- Include degraded modes - not all failures are complete trips
- Consider auto-recovery for transient failures
- Document failure causes in descriptions for maintenance planning
- Validate with historical data when possible