ckunte.net

Tow

This post was eventually expanded into a paper in 2015.

When asked to compare the severity of sea-transportation between the North Sea1 and the South China Sea, most engineers side with the former, which they deduce from comparing sea-states. So, it’s rare to not get a blank stare from people when I say they may not be right.2 Here’s why. Let’s take a look at practiced barge motion design criteria in each.

Table 1: Barge motion criteria for medium sized barges
Parameter North Sea South China Sea
Length, L (m) >76.0 91.4
Width, B (m) >23.0 27.4
Roll angle, $\alpha$ (°) 20.0 12.5
Roll period, $T_r$ (s) 10 5
Pitch angle, $\beta$ (°) 12.5 8
Pitch period, $T_p$ (s) 10 5.5
Heave, gh 0.2g 0.2g

where, $\alpha$ and $\beta$ are roll and pitch single amplitude of angular accelerations respectively (in degrees), together with corresponding full cycle periods (in seconds); and h is heave single amplitude of linear acceleration (either in terms of g, or in meters).

At first look, with all motion parameters greater, this may still look like the North Sea is governing over the South China Sea. But is it really? To be sure, let’s convert these into accelerations and resulting inertial forces.

Maximum acceleration, in a simple harmonic motion without phase info., may be computed as follows:

\begin{aligned} \theta_r = \omega^2 \cdot a \newline \end{aligned}

From the above, roll acceleration takes the form:

\begin{aligned} \theta_r = \left(\frac{2\pi}{T_r}\right)^2 \cdot \alpha \newline \end{aligned}

Similarly, pitch acceleration takes the form:

\begin{aligned} \theta_p = \left(\frac{2\pi}{T_p}\right)^2 \cdot \beta \newline \end{aligned}

where, Tr, Tp, and Th are full cycle periods associated with roll, pitch and heave respectively (s). They are given in Table 1.

Table 2: Accelerations
$\theta_r$ (rad/s2) $\theta_p$ (rad/s2) gh (m/s2)
North Sea 0.14 0.09 1.96
South China Sea 0.34 0.22 1.96
Increase (%) 143% 144%

What? How? Well, it is due to the full cycle period associated with motions, the proverbial elephant in the room, because most people read or regard full cycle periods as some sort of meta information. In the case of the South China Sea, however, nonlinearly lower full cycle periods in the denominator drive accelerations up. In turn, inertial forces increase as a consequence of higher accelerations (Newton’s second law of motion).3

Full cycle (motion) periods are given by:

\begin{aligned} T_r = 2\pi \left( \frac{r_x^2 + m_{a_{roll}}}{\overline{GM_T} \cdot g} \right)^\frac{1}{2} \newline \end{aligned}

\begin{aligned} T_p = 2\pi \left( \frac{r_y^2 + m_{a_{pitch}}}{\overline{GM_L} \cdot g} \right)^\frac{1}{2} \newline \end{aligned}

\begin{aligned} T_h = 2\pi \left(\frac{m + m_{a_{heave}}}{A_w \cdot \rho \cdot g} \right)^\frac{1}{2} \newline \end{aligned}

These could sometimes be simplified to:

\begin{aligned} T_r = 2\pi \frac{r_x}{\sqrt{\overline{GM_T} \cdot g}} \newline \end{aligned}

\begin{aligned} T_p = 2\pi \frac{r_y}{\sqrt{\overline{GM_L} \cdot g}} \newline \end{aligned}

where,

There is a reason full (motion) periods are engineered for manned vessels, which is to make motions humanely tolerable as the graph below shows.4

Human response to vessel motion

Boundary of depression and intolerable ranges can occur for very low accelerations, if periods are too low. Whereas a combination of acceleration and its corresponding average frequency of oscillation determines the level of comfort aboard.

However, marine cargo transports often involve unmanned dummy barges, for which human response is not seen as a governing requirement, and are therefore OK to operate at lower periods of motion. High dynamic acceleration is often a result of small period of motion, as seen in the case of South China Sea pertaining to unmanned cargo barges.

One way to manage this is by optimising (static) metacentric height, GM, by keeping it sufficiently high from greater initial stability considerations — but not excessively high, to warrant low periods of motion. This would not only reduce dynamic accelerations, but also help improve human response, where essential.


Effect of cargo position on inertia forces (Oct 22, 17)

While working on a project recently, I took the opportunity to develop the effect of cargo position on sea-transport forces in unrestricted open-seas (in terms of W, which is the dry weight of cargo), and extend it to profile all vessel types described in 0030/ND.

Large vessels

Large vessels

Medium vessels and large cargo barges

Medium vessels and large cargo barges

Small barges

Small barges

Small vessels

Small vessels

where, Lx, Ly, and Lz are are distances between barge center of rotation and cargo center of gravity in x (along barge length), y (along barge width), and z (vertical) respectively.

Plot code

Here’s the plot code for all standard vessel types described in 0030/ND.

#!/usr/bin/env python
# encoding: utf-8

"""Influence of cargo eccentricity on sea-transport forces.
Vessel types are based on Noble Denton Rules and Guidelines 0030/ND.
2017 ckunte

Usage: ves.py ( -l | -m | -s | -v) [--tr=T1] [--tp=T2]
       ves.py -h, --help
       ves.py --version

Options:
  -h, --help  Show this help screen.
  --tr=T1     Single amplitude roll period in seconds [default: 10.]
  --tp=T2     Single amplitude pitch period in seconds [default: 10.]
  -l          Plot for large vessels >140m, >30m
  -m          Plot for medium vessels & large cargo barges >=76m, >=23m
  -s          Plot for small cargo barges <76m, <23m
  -v          Plot for small vessels <76m, <23m
  --version   Show version.

"""
import numpy as np
import matplotlib.pyplot as plt
from docopt import docopt

# Acceleration due to gravity
g = 9.81
# Heave amplitude in terms of acceleration due to gravity, g
h = 0.2

args = docopt(__doc__, version='Influence of cargo eccentricity on sea-transport forces, version: 0.1')
Tr = float(args['--tr'])
Tp = float(args['--tp'])

r = [20.0, 25.0, 30.0] # In degrees
p = [10.0, 12.5, 15.0] # In degrees

def misc():
    plt.legend(loc=0)
    plt.grid(True)
    plt.xlabel('L (m)')
    plt.ylabel('Inertia force in terms of W')
    plt.show()
    pass

def pgr():
    # Angular accelerations
    thta_r = r * (2 * np.pi / Tr)**2
    thta_p = p * (2 * np.pi / Tp)**2
    # Lx, Ly, or Lz
    x = np.linspace(0, 30) # Lx range from 0 -- 30m
    y = np.linspace(0, 15) # Ly range from 0 -- 15m
    z = np.linspace(0, 30) # Lz range from 0 -- 30m
    # Vertical force per unit mass
    Fvr = np.cos(r) + (y / g) * thta_r + h * np.cos(r)
    Fvp = np.cos(p) + (x / g) * thta_p + h * np.cos(p)
    # Horizontal force per unit mass
    Fhr = np.sin(r) + (z / g) * thta_r + h * np.sin(r)
    Fhp = np.sin(p) + (z / g) * thta_p + h * np.sin(p)
    # Labels
    lbl = [
    "Fv (roll) incl. gravity (L => Ly)",
    "Fv (pitch) incl. gravity (L => Lx)",
    "Fh (roll) (L => Lz)",
    "Fh (pitch) (L => Lz)"
    ]
    # Plot
    plt.plot(y,Fvr,label=lbl[0],linewidth=2)
    plt.plot(x,Fvp,label=lbl[1],linewidth=2)
    plt.plot(z,Fhr,label=lbl[2],linewidth=2)
    plt.plot(z,Fhp,label=lbl[3],linewidth=2)
    pass

if __name__ == '__main__':
    if args['-l']:
        r = r[0] * np.pi / 180.0 # in rad => 20 deg
        p = p[0] * np.pi / 180.0 # in rad => 10 deg
        plt.title('Large vessels (LOA > 140m, B > 30m)')
        pgr()
        misc()
    elif args['-m']:
        r = r[0] * np.pi / 180.0 # in rad => 20 deg
        p = p[1] * np.pi / 180.0 # in rad => 12.5 deg
        plt.title('Medium vessels & large cargo barges ($\geq$76m, $\geq$23m)')
        pgr()
        misc()
    elif args['-s']:
        r = r[1] * np.pi / 180.0 # in rad => 25 deg
        p = p[2] * np.pi / 180.0 # in rad => 15 deg
        plt.title('Small cargo barges (<76m, <23m)')
        pgr()
        misc()
    elif args['-v']:
        r = r[2] * np.pi / 180.0 # in rad => 30 deg
        p = p[2] * np.pi / 180.0 # in rad => 15 deg
        plt.title('Small vessels (<76m, <23m)')
        pgr()
        misc()
    else:
        print "No option was selected. For help, try: python ves.py -h"

For non-standard motion responses, particularly in benign environments that exhibit lower single amplitude motion and lower full cycle period, the following code could be used. It requires all values to be input.

#!/usr/bin/env python
# encoding: utf-8

"""Influence of cargo eccentricity on sea-transport forces.
Custom vessel based on barge motion responses.
2017 ckunte

Usage: ves.py --r=R --p=P --tr=T1 --tp=T2
       ves.py -h, --help
       ves.py --version

Options:
  -h, --help  Show this help screen.
  --r=R       Single amplitude roll angle in deg [default: 20.0]
  --p=P       Single amplitude pitch angle in deg [default: 12.5]
  --tr=T1     Single amplitude roll period in seconds [default: 10.]
  --tp=T2     Single amplitude pitch period in seconds [default: 10.]
  --version   Show version.

"""
import numpy as np
import matplotlib.pyplot as plt
try:
    from docopt import docopt
except ImportError:
    raise ImportError('Requires docopt: run pip install docopt')

# Acceleration due to gravity
g = 9.81
# Heave amplitude in terms of acceleration due to gravity, g
h = 0.2

args = docopt(__doc__, version='Custom vessel: Infl. of cargo ecc. on inertia forces, version: 0.1')
r = float(args['--r'])
p = float(args['--p'])
Tr = float(args['--tr'])
Tp = float(args['--tp'])

def misc():
    plt.legend(loc=0)
    plt.grid(True)
    plt.xlabel('L (m)')
    plt.ylabel('Inertia force in terms of W')
    plt.show()
    pass

def pgr():
    # Angular accelerations
    thta_r = r * (2 * np.pi / Tr)**2
    thta_p = p * (2 * np.pi / Tp)**2
    # Lx, Ly, or Lz
    x = np.linspace(0, 30) # Lx range from 0 -- 30m
    y = np.linspace(0, 15) # Ly range from 0 -- 15m
    z = np.linspace(0, 30) # Lz range from 0 -- 30m
    # Vertical force per unit mass
    Fvr = np.cos(r) + (y / g) * thta_r + h * np.cos(r)
    Fvp = np.cos(p) + (x / g) * thta_p + h * np.cos(p)
    # Horizontal force per unit mass
    Fhr = np.sin(r) + (z / g) * thta_r + h * np.sin(r)
    Fhp = np.sin(p) + (z / g) * thta_p + h * np.sin(p)
    # Labels
    lbl = [
    "Fv (roll) incl. gravity (L => Ly)",
    "Fv (pitch) incl. gravity (L => Lx)",
    "Fh (roll) (L => Lz)",
    "Fh (pitch) (L => Lz)"
    ]
    # Plot
    plt.plot(y,Fvr,label=lbl[0],linewidth=2)
    plt.plot(x,Fvp,label=lbl[1],linewidth=2)
    plt.plot(z,Fhr,label=lbl[2],linewidth=2)
    plt.plot(z,Fhp,label=lbl[3],linewidth=2)
    pass

if __name__ == '__main__':
    r = r * np.pi / 180.0 # in rad
    p = p * np.pi / 180.0 # in rad
    plt.title('Custom vessel')
    pgr()
    misc()

  1. GL Noble Denton, Technical Policy Board — Table 7-2 (Unrestricted, Case 2), Default Motion Criteria, Guidelines for Marine Transportations, Document No. 0030/ND. 

  2. I’ve found not Mechanical, Metocean, or Structural engineers, but only Naval architects are usually quick to recover from their stagger as they are able to quickly bring in other factors into perspective. 

  3. See also libraries for processing motion response datasets. 

  4. Journée and Pinkster, Introduction to Ship Hydromechanics.