from pint import UnitRegistry
u = UnitRegistry()
from math import pi
import numpy as np
import itertools
import csv
import pickle
from IPython.display import display, Math
from IPython.display import Image
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib
from matplotlib import pyplot as plt
matplotlib.style.use('ggplot')
P_i = 0.01
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
D = (10*u.inch).to(u.m)
wall_t = (0.307*u.inch).to(u.m)
SG_contents = 0.84
f_CF = np.array([3.8,
6.6,
11.5,
18.5,
26.2,
33.2])*u.Hz
modes = [2,4,6,8,9,11]
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)
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
e = (88.6*u.inch).to(u.m)
d = (0*u.inch).to(u.m)
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 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) $$U_extreme = max(U_c_100_year + U_w_10_year, U_c_10_year + U_w_100_year)
The safety factors to be used with the fatigue screening criteria in 2.4 are listed below.
gamma_IL = gamma_CF = 1.4
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
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*}f_2 = 3.8*u.Hz
U_w = 0.0*u.m/u.s
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
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.
KC = U_w/(f_w*D)
print('Keulegan-Carpenter: {:0.2f}'.format(KC.magnitude))
Keulegan-Carpenter: 0.00
The current flow velocity ratio is defined by:
$$ \alpha = \frac{U_c}{U_c + U_w} $$alpha = U_c/(U_c + U_w)
display(Math(r'\alpha = {:0.2f}'.format(alpha.magnitude)))
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*}rho_w = 1000*u.kg/u.m**3
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.
zeta_T = 0.005 + 0.01
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)
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)))
K_S = (4*pi*m_e*zeta_T)/(rho_fluid*D**2)
display(Math(r'K_S = {:0.1f}'.format(K_S.magnitude)))
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*}K_sd = K_S/1.3
V_Rd = V_R*gamma_f_CF
for _V_Rd in V_Rd:
display(Math(r'V_{{Rd}} = {}'.format(_V_Rd.magnitude)))
Image("Figure_4-3-cropped.jpg")
$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}}$
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)
for j in range(len(f_CF)):
display(Math(r'f_{{ratio}}^{} = {:0.2f}'.format(j+1,f_ratio(j+1))))
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
def A_z_2_j_D(j):
return A_z_1_j_D(j)
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)
<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)
$\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. $$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)))
Image("Figure_4-4-cropped.jpg")
$\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 $$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)))
psi_trench_offset = 1 + 0.5*Delta_over_D
display(Math(r'\psi_{{trench, onset}} = {:0.2f}'.format(psi_trench_offset)))
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)))
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.
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
def V_R_1_CF(j):
return 7 - (7 - V_R_onset_CF)/1.15*(1.3 - A_z_1_j_D(j))
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))))
V_R_end_CF = 16
def V_R_2_CF(j):
return V_R_end_CF - 7/1.3*A_z_1_j_D(j)
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))))
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)
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))
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 $$def A_z_D_func(_V_Rd, mode):
return np.interp(_V_Rd, x_RV[mode], CF_VIV_amp[mode])
A_z_D_func(V_Rd[0], 0)
0.0010499999999994186
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]))
0 Dominant mode: 2
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.
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:
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 $$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. $$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)))
S_CF_RM = np.zeros(A_CF.shape)
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
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
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. ]]
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.
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]
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*}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*}g = 9.807*u.m/u.s**2
q = (rho_steel*A_s + rho_fluid_contents*A_i)*g
print(q)
823.1841686604758 kilogram / second ** 2
b = pi*rho_w*g*D**2/4
print(b)
496.92802475091605 kilogram / second ** 2
s_g = (q+b)/b
display(Math(r's_g = {:0.2f}'.format(s_g.magnitude)))
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)))
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.
Image("Figure_4-5-cropped.jpg")