Class NelsonCurveAssessment
- All Implemented Interfaces:
Serializable
The Nelson curves define the operating limits (temperature vs hydrogen partial pressure) below which various steels can safely operate without suffering high-temperature hydrogen attack. HTHA occurs when dissolved hydrogen reacts with carbon in the steel to form methane (CH4) at grain boundaries, causing irreversible internal decarburisation, fissuring, and loss of mechanical properties.
Mechanism
At elevated temperatures (>200°C), molecular hydrogen dissociates on the steel surface and diffuses into the metal as atomic hydrogen. It then reacts with iron carbide (Fe3C):
Fe3C + 4H → 3Fe + CH4
The methane molecules are too large to diffuse out and accumulate at grain boundaries, creating internal pressure that leads to fissuring and blistering. This process is irreversible — once HTHA occurs, the steel must be replaced.
Material Categories
Higher alloy content (Cr, Mo, V) stabilises carbides against hydrogen attack, shifting the Nelson curve to higher temperatures and pressures:
| Material | Typical Max Temp at 100 psia H2 | Resistance |
|---|---|---|
| Carbon steel | ~220°C | Lowest |
| C-0.5Mo | ~300°C | Low-moderate |
| 1Cr-0.5Mo | ~400°C | Moderate |
| 1.25Cr-0.5Mo | ~450°C | Good |
| 2.25Cr-1Mo | ~500°C | Very good |
| Austenitic SS | >550°C | Excellent |
Standards
- API 941, 8th Edition (2016) — Steels for Hydrogen Service at Elevated Temperatures and Pressures in Petroleum Refineries and Petrochemical Plants
- API RP 941 Annex A — Operating limit curves
Usage
NelsonCurveAssessment nelson = new NelsonCurveAssessment();
nelson.setTemperatureC(350.0);
nelson.setH2PartialPressureBar(20.0);
nelson.setMaterialType("carbon_steel");
nelson.evaluate();
boolean safe = nelson.isBelowNelsonCurve();
double maxTemp = nelson.getMaxAllowableTemperatureC();
double maxPressure = nelson.getMaxAllowableH2PressureBar();
- Version:
- 1.0
- Author:
- ESOL
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final double[][]Austenitic stainless steel Nelson curve data points.private booleanWhether the operating point is below (safe side of) the Nelson curve.private static final double[][]C-0.5Mo steel Nelson curve data points.private static final double[][]Carbon steel Nelson curve data points.private static final double[][]1Cr-0.5Mo steel Nelson curve data points.private static final double[][]1.25Cr-0.5Mo steel Nelson curve data points.private static final double[][]2.25Cr-1Mo steel Nelson curve data points.private booleanWhether evaluation has been performed.private doubleHydrogen partial pressure [psia].private StringMaterial type identifier.private doubleMaximum allowable H2 partial pressure at the given temperature [bar].private doubleMaximum allowable temperature at the given H2 partial pressure [°C].private StringRecommended material upgrade if current material is insufficient.private StringRisk level.private static final longSerialization version UID.Supported material type identifiers.private doubleOperating temperature [°C].private doubleTemperature margin above the Nelson curve [°C]. -
Constructor Summary
ConstructorsConstructorDescriptionCreates a new NelsonCurveAssessment with default parameters. -
Method Summary
Modifier and TypeMethodDescriptionvoidevaluate()Runs the Nelson curve assessment.private StringfindMinimumUpgrade(double tempF, double pressurePsia) Finds the minimum material upgrade that would be acceptable at these conditions.private double[][]Returns the Nelson curve data for the configured material.doubleGets the maximum allowable H2 partial pressure at the given temperature.doubleGets the maximum allowable temperature at the given H2 partial pressure.Gets the recommended material upgrade.Gets the risk level.Gets the list of supported material types.doubleGets the temperature margin relative to the Nelson curve.private doubleinterpolateMaxPressure(double[][] curve, double tempF) Interpolates the maximum allowable H2 partial pressure at a given temperature.private doubleinterpolateMaxTemp(double[][] curve, double pressurePsia) Interpolates the maximum allowable temperature at a given H2 partial pressure.booleanChecks whether the operating point is below the Nelson curve (safe).voidsetH2PartialPressureBar(double bar) Sets the hydrogen partial pressure in bar and converts internally to psia.voidsetH2PartialPressurePsia(double psia) Sets the hydrogen partial pressure in psia.voidsetMaterialType(String type) Sets the material type for Nelson curve lookup.voidsetTemperatureC(double tempC) Sets the operating temperature.toJson()Returns the assessment results as a JSON string.toMap()Returns the assessment results as a Map.
-
Field Details
-
serialVersionUID
private static final long serialVersionUIDSerialization version UID.- See Also:
-
CARBON_STEEL_CURVE
private static final double[][] CARBON_STEEL_CURVECarbon steel Nelson curve data points.Reference: API 941 Figure 1. Applicable to carbon steel (SA-106, SA-516-70, API 5L grades). Note: C-0.5Mo steel was historically shown as a separate curve above carbon steel but has been reclassified due to field failures. Use the carbon steel curve for C-0.5Mo unless extensive qualification testing is performed.
-
C_0_5MO_CURVE
private static final double[][] C_0_5MO_CURVEC-0.5Mo steel Nelson curve data points.WARNING: API 941 8th edition notes significant field failures with C-0.5Mo. Use with caution — many operators now use the carbon steel curve for C-0.5Mo equipment.
-
CR1_0_5MO_CURVE
private static final double[][] CR1_0_5MO_CURVE1Cr-0.5Mo steel Nelson curve data points.Reference: API 941 Figure 1. Applicable to F12, P12, and equivalent grades.
-
CR1_25_0_5MO_CURVE
private static final double[][] CR1_25_0_5MO_CURVE1.25Cr-0.5Mo steel Nelson curve data points.Reference: API 941 Figure 1. Applicable to F11, P11, and equivalent grades.
-
CR2_25_1MO_CURVE
private static final double[][] CR2_25_1MO_CURVE2.25Cr-1Mo steel Nelson curve data points.Reference: API 941 Figure 1. Applicable to F22, P22, and equivalent grades. Most common upgrade material for hydrogen service.
-
AUSTENITIC_SS_CURVE
private static final double[][] AUSTENITIC_SS_CURVEAustenitic stainless steel Nelson curve data points.Austenitic stainless steels (304, 316, 321, 347) have significantly higher HTHA resistance due to low carbon activity and stable austenitic structure. The curve boundary is approximate — typically not the controlling limit in practice.
-
SUPPORTED_MATERIALS
-
temperatureC
private double temperatureCOperating temperature [°C]. -
h2PartialPressurePsia
private double h2PartialPressurePsiaHydrogen partial pressure [psia]. -
materialType
Material type identifier. -
belowNelsonCurve
private boolean belowNelsonCurveWhether the operating point is below (safe side of) the Nelson curve. -
maxAllowableTempC
private double maxAllowableTempCMaximum allowable temperature at the given H2 partial pressure [°C]. -
maxAllowableH2PressureBar
private double maxAllowableH2PressureBarMaximum allowable H2 partial pressure at the given temperature [bar]. -
temperatureMarginC
private double temperatureMarginCTemperature margin above the Nelson curve [°C]. Negative = safe. -
riskLevel
Risk level. -
recommendedUpgrade
Recommended material upgrade if current material is insufficient. -
evaluated
private boolean evaluatedWhether evaluation has been performed.
-
-
Constructor Details
-
NelsonCurveAssessment
public NelsonCurveAssessment()Creates a new NelsonCurveAssessment with default parameters.
-
-
Method Details
-
setTemperatureC
public void setTemperatureC(double tempC) Sets the operating temperature.- Parameters:
tempC- temperature in degrees Celsius
-
setH2PartialPressurePsia
public void setH2PartialPressurePsia(double psia) Sets the hydrogen partial pressure in psia.- Parameters:
psia- H2 partial pressure in psia
-
setH2PartialPressureBar
public void setH2PartialPressureBar(double bar) Sets the hydrogen partial pressure in bar and converts internally to psia.- Parameters:
bar- H2 partial pressure in bar
-
setMaterialType
Sets the material type for Nelson curve lookup.Valid types: "carbon_steel", "c_0_5mo", "1cr_0_5mo", "1_25cr_0_5mo", "2_25cr_1mo", "austenitic_ss".
- Parameters:
type- material type identifier
-
evaluate
public void evaluate()Runs the Nelson curve assessment.Interpolates the applicable Nelson curve to determine whether the operating point is safe and calculates the temperature margin and maximum allowable conditions.
-
getCurveData
private double[][] getCurveData()Returns the Nelson curve data for the configured material.- Returns:
- 2D array of {pressure_psia, max_temp_F} points
-
interpolateMaxTemp
private double interpolateMaxTemp(double[][] curve, double pressurePsia) Interpolates the maximum allowable temperature at a given H2 partial pressure.- Parameters:
curve- Nelson curve datapressurePsia- H2 partial pressure [psia]- Returns:
- maximum allowable temperature [°F]
-
interpolateMaxPressure
private double interpolateMaxPressure(double[][] curve, double tempF) Interpolates the maximum allowable H2 partial pressure at a given temperature.- Parameters:
curve- Nelson curve datatempF- temperature [°F]- Returns:
- maximum allowable H2 partial pressure [psia]
-
findMinimumUpgrade
Finds the minimum material upgrade that would be acceptable at these conditions.- Parameters:
tempF- temperature [°F]pressurePsia- H2 partial pressure [psia]- Returns:
- recommended material name, or empty if none found
-
isBelowNelsonCurve
public boolean isBelowNelsonCurve()Checks whether the operating point is below the Nelson curve (safe).- Returns:
- true if below the Nelson curve
-
getMaxAllowableTemperatureC
public double getMaxAllowableTemperatureC()Gets the maximum allowable temperature at the given H2 partial pressure.- Returns:
- maximum allowable temperature [°C]
-
getMaxAllowableH2PressureBar
public double getMaxAllowableH2PressureBar()Gets the maximum allowable H2 partial pressure at the given temperature.- Returns:
- maximum allowable H2 partial pressure [bar]
-
getTemperatureMarginC
public double getTemperatureMarginC()Gets the temperature margin relative to the Nelson curve.Negative values mean the operating point is below (safe side of) the curve. Positive values mean the operating point exceeds the curve — material is at risk of HTHA.
- Returns:
- temperature margin [°C]
-
getRiskLevel
Gets the risk level.- Returns:
- risk level: "Low", "Medium", "High", or "Very High"
-
getRecommendedUpgrade
Gets the recommended material upgrade.- Returns:
- recommended upgrade material, or empty if current material is acceptable
-
getSupportedMaterialTypes
-
toMap
-
toJson
Returns the assessment results as a JSON string.- Returns:
- JSON representation of the assessment
-