• Home
  • About
  • Contact
  • Projects
    • Aerospace
    • Upstream oil and gas
    • Midstream oil and gas
    • Downstream oil and gas
    • Consumer products
    • Electronics
    • Food products and processing
    • Utilities
    • Lifting and load securing
    • General manufacturing
    • Fatigue
    • Packaging
    • Pressure Vessels
    • Structural Engineering
  • Technical notes
    • Calculation of required ventilation area
    • Calculation of grout elastic modulus
    • Statistical analysis of grout test data
    • FFT of acceleration data
    • Comparison of experimental and FEA SCF
    • Fatigue computation of a pipeline river crossing due to VIV

Cross-Flow Fatigue Life Calculation as per DNVGL-RP-F105¶

In [1]:
from pint import UnitRegistry
u = UnitRegistry()
In [2]:
from math import pi
import numpy as np
import itertools
import csv
import pickle
In [3]:
from IPython.display import display, Math
from IPython.display import Image
In [4]:
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib
from matplotlib import pyplot as plt
matplotlib.style.use('ggplot')
In [5]:
P_i = 0.01
In [6]:
U_c = (5.51*u.ft/u.s).to(u.m/u.s)
U_c_10_year = (5.22*u.ft/u.s).to(u.m/u.s) # Use 25 year
U_c_100_year = (5.51*u.ft/u.s).to(u.m/u.s)
U_w = (0*u.ft/u.s).to(u.m/u.s)
U_w_1_year = (0*u.ft/u.s).to(u.m/u.s)
U_w_10_year = (0*u.ft/u.s).to(u.m/u.s)
U_w_100_year = (0*u.ft/u.s).to(u.m/u.s)
f_w = 1*u.Hz
In [7]:
D = (10*u.inch).to(u.m)
wall_t = (0.307*u.inch).to(u.m)
SG_contents = 0.84
In [8]:
f_CF = np.array([3.8,
                 6.6,
                 11.5,
                 18.5,
                 26.2,
                 33.2])*u.Hz
In [9]:
modes = [2,4,6,8,9,11]
In [10]:
A_CF = []
for mode in modes:
    sp2 = []
    with open('mode_{}.csv'.format(mode), 'rt') as f:
        reader = csv.reader(f)
        for row in reader:
            sp2.append(float(row[0]))
    A_CF.append(sp2)
In [11]:
A_CF = np.array(A_CF)
for i in range(len(modes)):
    print(A_CF[i].max())
6461.7509765625
11847.9501953125
21345.51953125
32452.767578125
45710.63671875
45499.71484375
In [12]:
e = (88.6*u.inch).to(u.m)
d = (0*u.inch).to(u.m)

2.3.2¶

The characteristic environmental condition, to be used in the avoidance or ULS (see [2.6.3]) criteria, shall reflect the most probable extreme response over a specified exposure period. For permanent operational conditions and temporary phases with duration in excess of 12 months, a 100-year return period applies, i.e. the characteristic environmental condition is the condition with 10 annual exceedance probability. When detailed information about the joint probability of waves and current is not available, this condition may be approximated by the most severe condition among the following two combinations:

  • The 100-year return condition for waves combined with the 10-year return condition for current.
  • The 10-year return condition for waves combined with the 100-year return condition for current.

The representative flow condition $U_{extreme}$ for the characteristic environmental event is thus given by

$$ U_{extreme} = \max\left(U_{c,100-year} + U_{w,10-year}, U_{c,10-year} + U_{w,100-year}\right) $$
In [13]:
U_extreme = max(U_c_100_year + U_w_10_year, U_c_10_year + U_w_100_year)

2.7.1¶

The safety factors to be used with the fatigue screening criteria in 2.4 are listed below.

In [14]:
gamma_IL = gamma_CF = 1.4

2.7.2¶

In [15]:
gamma_k = 1.3
# Well to very well defined
gamma_f_IL = 1.0
gamma_f_CF = 1.15
gamma_s = 1.3
eta = 0.25

4.1.5¶

The reduced velocity, $V_R$ , is defined as: $$ V_R = \frac{U_c + U_w}{f_j D} $$

where

\begin{align*} f_j &= \mbox{Natural still-water eigen frequency for the j-th mode}\\ U_c &= \mbox{Mean current velocity normal to the pipe}\\ U_w &= \mbox{Significant wave-induced flow velocity}\\ D &= \mbox{Outer pipe diameter.}\\ \end{align*}
In [16]:
f_2 = 3.8*u.Hz
In [17]:
U_w = 0.0*u.m/u.s
In [18]:
V_R = ((U_c + U_w)/(f_CF*D)).to_base_units()
for _V_R in V_R:
    print('Reduced velocity: {}'.format(_V_R.magnitude))
Reduced velocity: 1.7399999999999998
Reduced velocity: 1.0018181818181817
Reduced velocity: 0.5749565217391303
Reduced velocity: 0.35740540540540533
Reduced velocity: 0.2523664122137404
Reduced velocity: 0.19915662650602403

4.1.6¶

The Keulegan-Carpenter number is defined as:

$$ KC = \frac{U_w}{f_w D} $$

where $f_w = 1/T_u$ is the significant wave frequency.

In [19]:
KC = U_w/(f_w*D)
print('Keulegan-Carpenter: {:0.2f}'.format(KC.magnitude))
Keulegan-Carpenter: 0.00

4.1.7¶

The current flow velocity ratio is defined by:

$$ \alpha = \frac{U_c}{U_c + U_w} $$
In [20]:
alpha = U_c/(U_c + U_w)
display(Math(r'\alpha = {:0.2f}'.format(alpha.magnitude)))
$\displaystyle \alpha = 1.00$

4.1.8¶

The stability parameter, $K_S$ , representing the damping for a given modal shape is given by:

$$ K_S = \frac{4 \pi m_e \zeta_T}{\rho_w D^2} $$

where

\begin{align*} \rho_w &= \mbox{Water density}\\ \zeta_T &= \mbox{Total modal damping ratio}\\ m_e &= \mbox{Effective mass}\\ \end{align*}
In [21]:
rho_w = 1000*u.kg/u.m**3

4.1.9¶

$$ \zeta_T = \zeta_{str} + \zeta_{soil} + \zeta_h $$

where

\begin{align*} \zeta_{str} &= \mbox{Structural damping}\\ \zeta_{soil} &= \mbox{Soil damping}\\ \zeta_h &= \mbox{Hydrodynamic damping}\\ \end{align*}

Structural damping is due to internal friction forces of the pipe material and depends on the strain level and associated deflections. If no information is available, a structural modal damping ratio of $\zeta_{str} = 0.005$. (6.3.10)

For screening purposes $\zeta_{soil} = 0.01$ may be assumed.

For VIV within the lock-in region (see [A.6.1]), the hydrodynamic modal damping ratio is normally taken as zero when using a standard response model. Outside lock-in regions, the hydrodynamic damping may be assessed according to DNVGL-RP-C205.

In [22]:
zeta_T = 0.005 + 0.01
$$ m_e = \frac{\int_L m\left(s\right) \phi^2\left(s\right) ds}{\int_L \phi^2\left(s\right) ds} $$

where $\phi(s)$ is the assumed mode shape satisfying the boundary conditions and $m(s)$ is the mass per unit length including structural mass, added mass and mass of internal fluid. (6.6.6)

In [23]:
r2 = D/2
r1 = (D -2*wall_t)/2
A_i = pi*r1**2
A_s = pi*(r2**2 - r1**2)
rho_steel = 7700*u.kg/u.m**3
rho_fluid = 1000*u.kg/u.m**3
rho_fluid_contents = SG_contents*rho_fluid
m_e = rho_steel*A_s + rho_fluid*pi*r2**2 + rho_fluid_contents*A_i
display(Math(r'm_e = {:0.1f}'.format(m_e)))
$\displaystyle m_e = 134.6 kilogram / meter$
In [24]:
K_S = (4*pi*m_e*zeta_T)/(rho_fluid*D**2)
display(Math(r'K_S = {:0.1f}'.format(K_S.magnitude)))
$\displaystyle K_S = 0.4$

4.3.10¶

In all response model calculations, either in-line or cross-flow, the design values for the reduced velocity $V_{Rd}$ and the stability parameter $K_{sd}$ shall be applied as follows:

\begin{align*} V_{Rd} &= V_R \gamma_f\\ K_{sd} &= \frac{K_s}{\gamma_k} \end{align*}
In [25]:
K_sd = K_S/1.3
In [26]:
V_Rd = V_R*gamma_f_CF

for _V_Rd in V_Rd:
    display(Math(r'V_{{Rd}} = {}'.format(_V_Rd.magnitude)))

$\displaystyle V_{Rd} = 2.0009999999999994$
$\displaystyle V_{Rd} = 1.1520909090909088$
$\displaystyle V_{Rd} = 0.6611999999999998$
$\displaystyle V_{Rd} = 0.4110162162162161$
$\displaystyle V_{Rd} = 0.29022137404580145$
$\displaystyle V_{Rd} = 0.2290301204819276$

4.4 Cross-flow response model¶

In [27]:
Image("Figure_4-3-cropped.jpg")
Out[27]:
\begin{align*} V_{R, onset}^{CF} &= \frac{3 \psi_{proxi, onset} \psi_{trench, onset}}{\gamma_{on, CF}}\\ V_{R,1}^{CF} &= 7 - \left(\frac{7 - V_{R, onset}^{CF}}{1.15}\right) \left(1.3 - \frac{A_{z,1}}{D}\right)\\ V_{R,2}^{CF} &= V_{R, end}^{CF} - \left(\frac{7}{1.3}\right)\left(\frac{A_{z,1}}{D}\right)\\ V_{R, end}^{CF} &= 16\\ \end{align*}
$$ \frac{A_{z,1}}{D} = \left\{\begin{align*} 0.9 & \quad \alpha > 0.8 & f_{ratio} < 1.5\\ 0.9 + 0.5\left(f_{ratio} - 1.5\right) & \quad \alpha > 0.8 & 1.5 \le f_{ratio} \le 2.3 \\ 1.3 & \quad \alpha > 0.8 & f_{ratio} > 2.3 \\ 0.9 & \quad \alpha \le 0.8 & 30 \le KC \le 40\\ 0.7 + 0.01\left(KC - 10\right) & \quad \alpha \le 0.8 & 10 \le KC < 30\\ 0.7 & \quad \alpha \le 0.8 & KC < 10\\ \end{align*}\right. $$
$$ \frac{A_{z,2}}{D} = \frac{A_{z,1}}{D} $$

$f_{ratio}$ is the cross-flow frequency ratio for two consecutive (participating) cross-flow modes, taken as the minimum of $\frac{f_{CF,j}}{f_{CF, j-1}}$ and $\frac{f_{CF,j+1}}{f_{CF, j}}$

In [28]:
def f_ratio(j):
    j = j - 1
    if j == 0:
        return f_CF[j+1]/f_CF[j]
    if j == len(f_CF) - 1:
        return f_CF[j]/f_CF[j-1]
    f_ratio_1 = f_CF[j]/f_CF[j-1]
    f_ratio_2 = f_CF[j+1]/f_CF[j]
    return min(f_ratio_1,f_ratio_2)
In [29]:
for j in range(len(f_CF)):

    display(Math(r'f_{{ratio}}^{} = {:0.2f}'.format(j+1,f_ratio(j+1))))

$\displaystyle f_{ratio}^1 = 1.74 dimensionless$
$\displaystyle f_{ratio}^2 = 1.74 dimensionless$
$\displaystyle f_{ratio}^3 = 1.61 dimensionless$
$\displaystyle f_{ratio}^4 = 1.42 dimensionless$
$\displaystyle f_{ratio}^5 = 1.27 dimensionless$
$\displaystyle f_{ratio}^6 = 1.27 dimensionless$
In [30]:
def A_z_1_j_D(j):
    if alpha > 0.8:
        if f_ratio(j) < 1.5:
            return 0.9
        elif f_ratio(j) <= 2.3:
            return 0.9 + 0.5*(f_ratio(j) - 1.5)
        else:
            return 1.3
    else:
        if KC < 10:
            return 0.7
        elif KC < 30:
            return 0.7 + 0.01*(KC - 10)
        else:
            return 0.9
In [31]:
def A_z_2_j_D(j):
    return A_z_1_j_D(j)
In [32]:
A_z_D = []
for j in range(len(f_CF)):
    A_z_D.append(A_z_1_j_D(j+1))

    display(Math(r'\frac{{ A_{{ {} }} }}{{D}} = {:0.2f}'.format('z,1-{}'.format(j+1),A_z_1_j_D(j+1))))

A_z_D = np.array(A_z_D)
$\displaystyle \frac{ A_{ z,1-1 } }{D} = 1.02 dimensionless$
$\displaystyle \frac{ A_{ z,1-2 } }{D} = 1.02 dimensionless$
$\displaystyle \frac{ A_{ z,1-3 } }{D} = 0.95 dimensionless$
$\displaystyle \frac{ A_{ z,1-4 } }{D} = 0.90$
$\displaystyle \frac{ A_{ z,1-5 } }{D} = 0.90$
$\displaystyle \frac{ A_{ z,1-6 } }{D} = 0.90$
<ipython-input-32-03471decd1ab>:5: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.
  A_z_D = np.array(A_z_D)

4.4.6¶

$\psi_{proxi, onset}$ is a correction factor accounting for the seabed/river channel proximity:

$$ \psi_{proxi, onset} = \left\{\begin{align*} \frac{1}{5} \left(4 + 1.25 \frac{e}{D}\right)& \quad \mbox{for} \frac{e}{D} < 0.8\\ 1 & \quad \mbox{otherwise}\\ \end{align*}\right. $$
In [33]:
if e/D < 0.8:
    psi_proxi_onset = 1/5*(4 + 1.25*e/D)
else:
    psi_proxi_onset = 1

display(Math(r'\psi_{{proxi, onset}} = {:0.2f}'.format(psi_proxi_onset)))

$\displaystyle \psi_{proxi, onset} = 1.00$

4.4.7¶

In [34]:
Image("Figure_4-4-cropped.jpg")
Out[34]:

$\psi_{trench, onset}$ is a correction factor accounting for the effect of a pipe located in/over a trench:

$$ \psi_{trench, onset} = 1 + 0.5 \frac{\Delta}{D} $$

where $\Delta/D$ denotes a relative trench depth given by:

$$ \frac{\Delta}{D} = \frac{1.25 d - e}{D} $$

where

$$ 0 \le \frac{\Delta}{D} \le 1 $$
In [35]:
Delta_over_D = (1.25*d - e)/D
if Delta_over_D < 0:
    Delta_over_D = 0
if Delta_over_D > 1:
    Delta_over_D = 1

display(Math(r'\frac{{\Delta}}{{D}} = {:0.2f}'.format(Delta_over_D)))

$\displaystyle \frac{\Delta}{D} = 0.00$
In [36]:
psi_trench_offset = 1 + 0.5*Delta_over_D

display(Math(r'\psi_{{trench, onset}} = {:0.2f}'.format(psi_trench_offset)))

$\displaystyle \psi_{trench, onset} = 1.00$
In [37]:
V_R_onset_CF = 3*psi_proxi_onset*psi_trench_offset/gamma_CF

display(Math(r'V_{{R, onset}}^{{CF}} = {:0.2f}'.format(V_R_onset_CF)))

$\displaystyle V_{R, onset}^{CF} = 2.14$

2.4.4¶

The cross-flow natural frequencies $f_{CF,j}$ shall fulfil:

$$ \frac{f_{CF,j}}{\gamma_{CF}} > \frac{U_{c,100-year} + U_{w,1-year}}{V_{R, onset}^{CF}D} $$

where $\gamma_{CF}$ is a screening factor for cross-flow, see [2.7.1], and $V_{R, onset}^{CF}$ is the cross-flow onset value for the reduced velocity, see section [4.4.4]. If the above criterion is violated, a full in-line and cross-flow VIV fatigue analysis is required.

In [38]:
for f in f_CF:
    if f/gamma_CF > (U_c_100_year + U_w_1_year)/(V_R_onset_CF*D):
        print('True')
    else:
        print('False')
False
True
True
True
True
True
In [39]:
def V_R_1_CF(j):
    return 7 - (7 - V_R_onset_CF)/1.15*(1.3 - A_z_1_j_D(j))
In [40]:
for j in range(len(f_CF)):

    display(Math(r'V_{{R,1-{} }}^{{CF}} = {:0.2f}'.format(j+1,V_R_1_CF(j+1))))

$\displaystyle V_{R,1-1 }^{CF} = 5.81 dimensionless$
$\displaystyle V_{R,1-2 }^{CF} = 5.81 dimensionless$
$\displaystyle V_{R,1-3 }^{CF} = 5.54 dimensionless$
$\displaystyle V_{R,1-4 }^{CF} = 5.31$
$\displaystyle V_{R,1-5 }^{CF} = 5.31$
$\displaystyle V_{R,1-6 }^{CF} = 5.31$
In [41]:
V_R_end_CF = 16
In [42]:
def V_R_2_CF(j):
    return V_R_end_CF - 7/1.3*A_z_1_j_D(j)
In [43]:
for j in range(len(f_CF)):

    display(Math(r'V_{{R,2-{} }}^{{CF}} = {:0.2f}'.format(j+1,V_R_2_CF(j+1))))

$\displaystyle V_{R,2-1 }^{CF} = 10.52 dimensionless$
$\displaystyle V_{R,2-2 }^{CF} = 10.52 dimensionless$
$\displaystyle V_{R,2-3 }^{CF} = 10.86 dimensionless$
$\displaystyle V_{R,2-4 }^{CF} = 11.15$
$\displaystyle V_{R,2-5 }^{CF} = 11.15$
$\displaystyle V_{R,2-6 }^{CF} = 11.15$
In [44]:
x_RV = []
CF_VIV_amp = []
for j in range(len(f_CF)):
    x_RV.append([2,
                 V_R_onset_CF,
                 V_R_1_CF(j+1),
                 V_R_2_CF(j+1),
                 16])
    CF_VIV_amp.append([0,
                       0.15,
                       A_z_1_j_D(j+1),
                       A_z_2_j_D(j+1),
                       0])
x_RV = np.array(x_RV)
CF_VIV_amp = np.array(CF_VIV_amp)
<ipython-input-44-fb32a0ebebfc>:14: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.
  x_RV = np.array(x_RV)
<ipython-input-44-fb32a0ebebfc>:15: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.
  CF_VIV_amp = np.array(CF_VIV_amp)
In [45]:
fig = plt.figure(figsize=(10, 10))
ax = plt.subplot(111)
marker = itertools.cycle((',', '+', '.', 'o', '*'))
for j in range(len(f_CF)):
    ax.plot(x_RV[j],
            CF_VIV_amp[j],
            marker=next(marker),
            label='{}'.format(j+1))
     
ax.set_xlabel('Reduced Velocity')
ax.set_ylabel('Cross-Flow VIV Amplitude')
ax.set_xlim(0,18)
ax.minorticks_on()
lgd = ax.legend(bbox_to_anchor=(0.8, 1.0))
2021-02-09T08:30:10.086438 image/svg+xml Matplotlib v3.3.2, https://matplotlib.org/

4.4.8¶

The maximum normalized cross-flow VIV amplitude is defined as:

$$ \left(A_z/D\right)_{max} = \max_{1 \le j \le n} \left(A_z/D\right)_j $$
In [46]:
def A_z_D_func(_V_Rd, mode):
    return np.interp(_V_Rd, x_RV[mode], CF_VIV_amp[mode])
In [47]:
A_z_D_func(V_Rd[0], 0)
Out[47]:
0.0010499999999994186
In [48]:
A_z_D_vals = []
for j in range(len(f_CF)):
    A_z_D_vals.append(A_z_D_func(V_Rd[j], j))
A_z_D_vals = np.array(A_z_D_vals)
A_z_D_max = A_z_D_vals.max()

display(Math(r'\frac{{ A_z }}{{D}}_{{max}} = {:0.4f}'.format(A_z_D_vals.max())))

dominant = np.argmax(A_z_D_vals)
print(dominant)
print('Dominant mode: {}'.format(modes[dominant]))
$\displaystyle \frac{ A_z }{D}_{max} = 0.0010$
0
Dominant mode: 2

4.4.9¶

Mode j is a weak cross-flow mode if it is not the dominant cross-flow mode, and satisfies the following criterion:

$$ 0.1 \left(A_z/D\right)_{max} \le \left(A_z/D\right)_{j} \le \left(A_z/D\right)_{max} $$

Modes which are neither weak nor dominant are disregarded in the fatigue and extreme environmental stress calculations.

In [49]:
weak_modes = np.argwhere((A_z_D_vals >= 0.1*A_z_D_max) & (A_z_D_vals <= A_z_D_max))
weak_modes = weak_modes[weak_modes != dominant]
print('Weak modes: {}'.format(' '.join(str(modes[m]) for m in weak_modes) ))
Weak modes: 

4.4.10¶

At a given location x, the i-th cross-flow induced VIV stress range $S^{RM}_{CF,i}$ is:

$$ S^{RM}_{CF,i}\left(x\right) = 2 A_{CF,i}\left(x\right) \left(A_z/D\right)_{i} R_k \gamma_s $$

At the same location x, the j-th cross-flow induced VIV stress ranges$S^{RM}_{CF,j}$ for the contributing, weak cross-flow modes are:

$$ S^{RM}_{CF,j}\left(x\right) = A_{CF,j}\left(x\right) \left(A_z/D\right)_{j} R_k \gamma_s $$

4.4.11¶

The characteristic amplitude response for cross-flow VIV may be reduced due to the effect of damping. The reduction factor, $R_k$ is given by:

$$ R_k = \left\{\begin{align*} 1 - 0.15 K_{sd} & \quad \mbox{for} K_{sd} \le 4\\ 3.2 K_{sd}^{-1.5} & \quad \mbox{otherwise}\\ \end{align*}\right. $$
In [50]:
if K_sd <= 4:
    R_k = 1 - 0.15*K_sd
else:
    R_k = 3.2*K_sd**(-1.5)
display(Math(r'R_k = {:0.2f}'.format(R_k.magnitude)))
$\displaystyle R_k = 0.95$
In [51]:
S_CF_RM = np.zeros(A_CF.shape)
In [52]:
S_CF_RM[dominant] = 2*A_CF[dominant]*A_z_D_max*R_k*gamma_s
<ipython-input-52-74b683833de4>:1: UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray.
  S_CF_RM[dominant] = 2*A_CF[dominant]*A_z_D_max*R_k*gamma_s
In [53]:
for weak_mode in weak_modes:
    S_CF_RM[weak_mode] = A_CF[weak_mode]*A_z_D_vals[weak_mode]*R_k*gamma_s
In [54]:
print(S_CF_RM)
[[ 7.00575871  7.19814738  7.39247728  7.58863642  7.78651792  7.98601869
   8.18704394  8.38950395  8.59331537  8.79840313  9.00469914  9.21214296
   9.42068306  9.63027743  9.84089173 10.05250305 10.26509739 10.47867156
  10.69323448 10.90880651 11.12541691 11.34311149 11.56194625 11.52306449
  11.18413466 10.80572626 10.42946523 10.05572761  9.68490087  9.31738203
   8.95357831  8.59390645  8.23879084  7.88866286  7.54396217  7.20513414
   6.87262734  6.54689796  6.22840412  5.91760774  5.61497264  5.32096584
   5.03605404  4.76070585  4.49538826  4.24056895  3.99671364  3.76428649
   3.59626779  3.80384077  3.99860937  4.18012216  4.34793312  4.50160006
   4.64068649  4.76476104  4.87339868  4.96617981  5.04269245  5.33110367
   5.86877362  6.41091552  6.93472108  7.4396005   7.92497668  8.39028336
   8.8349689   9.25849376  9.66033492 10.03998339 10.39694988 10.73075974
  11.0409574  11.32710704 11.58879254 11.82561815 12.03720719 12.22320847
  12.38328857 12.51713828 12.62447127 12.70502415 12.75855767 12.99102872
  13.43134889 13.86172944 14.26407261 14.63806792 14.98343032 15.29990404
  15.5872613  15.84529977 16.07385019 16.27277133 16.44195375 16.581316
  16.69080973 16.7704184  16.82015473 16.8400658  16.83022925 16.79075322
  16.72178153 16.62348722 16.4960739  16.33977954 16.15487263 15.89224928
  15.54094295 15.1487621  14.72943719 14.28343777 13.81126268 13.31343619
  12.79050676 12.24304955 11.67166522 11.07697218 10.45961434  9.82025405
   9.15957337  8.47827092  7.77706248  7.05667784  6.31786144  5.56136786
   4.78796316  3.99842263  4.01902818  4.83968239  5.6740696   6.52139736
   7.38087193  8.25170116  9.13309547 10.02427099 10.92444956 11.83286131
  12.74874784 13.67136216 14.59996876]
 [ 0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.          0.          0.          0.
   0.          0.          0.        ]]

4.4.12¶

The combined response model cross-flow induced stress range is given as:

$$ S^{RM}_{comb, CF}\left(x\right) = \sqrt{\sum_{j=1}^m \left(S^{RM}_{CF,j}\left(x\right)\right)^2} $$

where m is the number of contributing cross-flow modes.

In [55]:
S_comb_CF_RM = np.sqrt(np.sum(np.square(S_CF_RM), axis=0))
print(S_comb_CF_RM)
[ 7.00575871  7.19814738  7.39247728  7.58863642  7.78651792  7.98601869
  8.18704394  8.38950395  8.59331537  8.79840313  9.00469914  9.21214296
  9.42068306  9.63027743  9.84089173 10.05250305 10.26509739 10.47867156
 10.69323448 10.90880651 11.12541691 11.34311149 11.56194625 11.52306449
 11.18413466 10.80572626 10.42946523 10.05572761  9.68490087  9.31738203
  8.95357831  8.59390645  8.23879084  7.88866286  7.54396217  7.20513414
  6.87262734  6.54689796  6.22840412  5.91760774  5.61497264  5.32096584
  5.03605404  4.76070585  4.49538826  4.24056895  3.99671364  3.76428649
  3.59626779  3.80384077  3.99860937  4.18012216  4.34793312  4.50160006
  4.64068649  4.76476104  4.87339868  4.96617981  5.04269245  5.33110367
  5.86877362  6.41091552  6.93472108  7.4396005   7.92497668  8.39028336
  8.8349689   9.25849376  9.66033492 10.03998339 10.39694988 10.73075974
 11.0409574  11.32710704 11.58879254 11.82561815 12.03720719 12.22320847
 12.38328857 12.51713828 12.62447127 12.70502415 12.75855767 12.99102872
 13.43134889 13.86172944 14.26407261 14.63806792 14.98343032 15.29990404
 15.5872613  15.84529977 16.07385019 16.27277133 16.44195375 16.581316
 16.69080973 16.7704184  16.82015473 16.8400658  16.83022925 16.79075322
 16.72178153 16.62348722 16.4960739  16.33977954 16.15487263 15.89224928
 15.54094295 15.1487621  14.72943719 14.28343777 13.81126268 13.31343619
 12.79050676 12.24304955 11.67166522 11.07697218 10.45961434  9.82025405
  9.15957337  8.47827092  7.77706248  7.05667784  6.31786144  5.56136786
  4.78796316  3.99842263  4.01902818  4.83968239  5.6740696   6.52139736
  7.38087193  8.25170116  9.13309547 10.02427099 10.92444956 11.83286131
 12.74874784 13.67136216 14.59996876]

4.4.13¶

The cycle counting frequency at a given location x, $f_{cyc,CF}^{RM}\left(x\right)$, for the combined cross-flow induced stress is calculated as follows:

$$ f_{cyc,CF}^{RM}\left(x\right) = \sqrt{\sum_{j=1}^m \left(f_j \frac{S^{RM}_{CF,j}\left(x\right)}{S^{RM}_{comb, CF}\left(x\right)} \right)^2} $$

where:

\begin{align*} f_j &= f_{CF-RES,j} & \mbox{for} \; j = i \; \mbox{when mode i is the dominant cross-flow mode}\\ f_j &= f_{CF,j} & j \ne i\\ \end{align*}

4.4.14¶

The cross-flow response frequency $f_{CF-RES,j}$ for the dominant mode is obtained based on the updated added mass coefficient $C_{a, CF-RES}$ due to the amplitude of cross-flow response using the following equation:

$$ f_{CF-RES,j} = f_{CF,j}\sqrt{\frac{s_g + C_a}{s_g + C_{a,CF-RES}}} $$

where:

\begin{align*} s_g &= (q+b)/b \; \mbox{is the specific gravity of the pipe (often referred to as mass ratio in the context of VIV)}\\ q &= \mbox{Submerged weight of the pipe, including content if any}\\ b &= \pi\rho_w g d^2/4 \; \mbox{is the pipe buoyancy}\\ C_a &= \mbox{Added mass coefficient, according to [6.6.7]}\\ C_{a,CF-RES} &= \mbox{Added mass coefficient due to cross-flow response} \end{align*}
In [56]:
g = 9.807*u.m/u.s**2
In [57]:
q = (rho_steel*A_s + rho_fluid_contents*A_i)*g
print(q)
823.1841686604758 kilogram / second ** 2
In [58]:
b = pi*rho_w*g*D**2/4
print(b)
496.92802475091605 kilogram / second ** 2
In [59]:
s_g = (q+b)/b
display(Math(r's_g = {:0.2f}'.format(s_g.magnitude)))
$\displaystyle s_g = 2.66$

6.6.7¶

$$ C_a = \left\{\begin{align*} 0.68 + \frac{1.6}{1 + 5 \frac{e}{D}} & \quad \mbox{for} \frac{e}{D} < 0.8\\ 1 & \quad \mbox{otherwise}\\ \end{align*}\right. $$
In [60]:
if e/D < 0.8:
    C_a = 0.68 + 1.6/(1+5*e/D)
else:
    C_a = 1*u.dimensionless
display(Math(r'C_a = {:0.2f}'.format(C_a.magnitude)))
$\displaystyle C_a = 1.00$

4.4.15¶

The calculation of the added mass coefficient described in this sub-section is for the calculation of the cross- flow response frequency of the dominant mode only.

It should be noted that the response models discussed in this sub-section, have the effect of the added mass built into them, i.e. they are plotted using the reduced velocity calculated with the still water natural frequency and associated added mass.

In [61]:
Image("Figure_4-5-cropped.jpg")
Out[61]: