Endurance gain from weld improvements

DNV has published RP-C203 Fatigue design of offshore steel structures (2025). It now covers bankable endurance1 from weld improvement techniques such as grinding, and hammer peening.

I’ve taken a stab at comparing Tables 2-3 and F-15, see figure below. The legend to be read as [N] – no improvements, [G] – grinding, and [P] – hammer peening.

S-N curves for tubular joints in air and in seawater
S-N curves for tubular joints in seawater with cathodic protection without and with weld improvements (grinding, hammer peening) as per DNV RP-C203 (2025) standard.
Data and plot code for weld improvements
curve,r_start,r_mid,r_end,a1,m1,a2,m2
T (DNV 2025) [N],1.00E+03,1.80E+06,1.00E+08,12.180,3.0,16.130,5.0
T (DNV 2025 [G]),1.00E+03,1.00E+06,1.00E+08,14.597,4.0,18.896,6.0
T (DNV 2025 [P]),1.00E+03,1.00E+06,1.00E+08,17.082,5.0,21.515,7.0
#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
# Grinding and hammer peening improvements in DNV-RP-C203 (2025)
# snc.py  -- 2025 C Kunte

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


def lbls():
    plt.legend(loc="best", fontsize="small")
    plt.xlabel(r"Number of cycles, N")
    plt.ylabel(r"Hotspot stress, $\sigma$ (MPa)")
    plt.grid(True, which="both", linestyle="--", linewidth=0.5)


def sncurve(curve, r_start, r_mid, r_end, a1, m1, a2, m2, color):
    # First slope
    n1 = np.logspace(np.log10(r_start), np.log10(r_mid), num=200)
    s1 = (n1 / 10**a1) ** (-1 / m1)

    # Second slope
    n2 = np.logspace(np.log10(r_mid), np.log10(r_end), num=200)
    s_mid = (r_mid / 10**a1) ** (-1 / m1)
    s2 = s_mid * (n2 / r_mid) ** (-1 / m2)

    plt.loglog(n1, s1, base=10, color=color,
               label=f"{curve} ($m_1$={m1}, $m_2$={m2})")
    plt.loglog(n2, s2, base=10, color=color)


def main():
    df = pd.read_csv("./sncurves_t.csv")

    # Exactly three colors, in order:
    colors = ["red", "darkorange", "green"]

    for (i, (_, row)) in enumerate(df.iterrows()):
        color = colors[i]  # select 1st, 2nd, 3rd
        sncurve(**row.to_dict(), color=color)

    lbls()
    plt.title("S–N curves as per DNV RP-C203 (2025)")
    plt.savefig("sncurves_t.svg")


if __name__ == "__main__":
    main()