| name | mooring-analysis |
| version | 1.0.0 |
| description | Mooring system design, analysis, and assessment for floating offshore platforms |
| author | workspace-hub |
| category | subject-matter-expert |
| tags | mooring, catenary, taut-mooring, offshore, fpso, station-keeping, api-rp-2sk, dnv |
| platforms | engineering |
Mooring Analysis SME Skill
Comprehensive mooring system design and analysis expertise for floating offshore platforms including catenary, taut, and semi-taut configurations.
When to Use This Skill
Use mooring analysis knowledge when:
- Station-keeping design - FPSO, semi-sub, SPAR mooring
- Catenary analysis - Static and dynamic behavior
- Tension calculations - Pretension, extreme loads
- Fatigue assessment - Mooring line fatigue life
- Anchor design - Holding capacity verification
- Installation planning - Pretension optimization
Core Knowledge Areas
1. Mooring Types
Catenary Mooring:
characteristics:
restoring_force: "Weight of suspended line"
typical_water_depth: "< 2000m"
materials: ["chain", "wire", "combination"]
advantages:
- Simple and reliable
- Well-proven technology
- Good energy absorption
disadvantages:
- Large footprint
- Heavy at great depths
Taut Mooring:
characteristics:
restoring_force: "Elastic elongation"
typical_water_depth: "Any depth"
materials: ["polyester", "steel wire"]
advantages:
- Small footprint
- Suitable for ultra-deep water
- Lower weight
disadvantages:
- Complex dynamics
- Requires higher pretension
- More sensitive to installation
2. Catenary Equations
Basic Catenary:
import numpy as np
def catenary_profile(
horizontal_tension: float, # kN
weight_per_length: float, # kN/m
length_on_seabed: float = 0 # m
) -> dict:
"""
Calculate catenary mooring line profile.
Catenary equations:
- x = a * sinh(s/a)
- z = a * (cosh(s/a) - 1)
Where a = H/w (catenary parameter)
Args:
horizontal_tension: Horizontal tension at touchdown
weight_per_length: Weight per unit length in water
length_on_seabed: Length of line on seabed
Returns:
Catenary parameters
"""
# Catenary parameter
a = horizontal_tension / weight_per_length
return {
'catenary_parameter_m': a,
'horizontal_tension_kN': horizontal_tension,
'weight_per_length_kN_m': weight_per_length
}
def catenary_suspended_length(
water_depth: float,
horizontal_distance: float,
horizontal_tension: float,
weight_per_length: float
) -> float:
"""
Calculate suspended length of catenary line.
Solve: z = a(cosh(x/a) - 1) for length s
Args:
water_depth: Water depth
horizontal_distance: Horizontal distance to anchor
horizontal_tension: Horizontal tension
weight_per_length: Weight per length
Returns:
Suspended line length
"""
from scipy.optimize import fsolve
a = horizontal_tension / weight_per_length
def equations(s):
# Horizontal: x = a*sinh(s/a)
# Vertical: z = a*(cosh(s/a) - 1)
eq1 = a * np.sinh(s/a) - horizontal_distance
eq2 = a * (np.cosh(s/a) - 1) - water_depth
return [eq1, eq2]
# Initial guess
s0 = np.sqrt(horizontal_distance**2 + water_depth**2)
# Solve
solution = fsolve(equations, s0)[0]
return solution
def catenary_top_tension(
water_depth: float,
horizontal_tension: float,
weight_per_length: float
) -> float:
"""
Calculate tension at top of catenary line.
T_top = sqrt(H² + (w*z)²)
Args:
water_depth: Water depth
horizontal_tension: Horizontal tension
weight_per_length: Weight per length
Returns:
Top tension in kN
"""
vertical_component = weight_per_length * water_depth
T_top = np.sqrt(horizontal_tension**2 + vertical_component**2)
return T_top
3. Mooring Line Components
Chain:
def chain_properties(
diameter: float, # mm
grade: str = "R4"
) -> dict:
"""
Get chain properties.
Args:
diameter: Nominal chain diameter
grade: Chain grade (R3, R4, R5)
Returns:
Chain properties
"""
# Minimum Breaking Load (MBL) for studless chain
# API RP 2SK Table 4-1
grade_factors = {
'R3': 0.0219, # tonnes/mm²
'R4': 0.0246,
'R5': 0.0273
}
k = grade_factors.get(grade, 0.0246)
MBL = k * diameter**2 # tonnes
# Weight in air (approximate)
weight_air = 0.0218 * diameter**2 # kg/m
# Weight in water (steel in seawater)
submerged_factor = (7.85 - 1.025) / 7.85 # Steel in seawater
weight_water = weight_air * submerged_factor # kg/m
return {
'diameter_mm': diameter,
'grade': grade,
'MBL_tonnes': MBL,
'MBL_kN': MBL * 9.81,
'weight_air_kg_m': weight_air,
'weight_water_kg_m': weight_water
}
Wire Rope:
def wire_rope_properties(
diameter: float, # mm
construction: str = "6x36"
) -> dict:
"""
Get wire rope properties.
Args:
diameter: Wire rope diameter
construction: Wire construction (6x36, 6x19, etc.)
Returns:
Wire properties
"""
# Approximate MBL (6x36 IWRC)
MBL = 0.0175 * diameter**2 # tonnes
# Weight in air
weight_air = 0.040 * diameter**2 # kg/m (steel core)
# Weight in water
submerged_factor = (7.85 - 1.025) / 7.85
weight_water = weight_air * submerged_factor
return {
'diameter_mm': diameter,
'construction': construction,
'MBL_tonnes': MBL,
'MBL_kN': MBL * 9.81,
'weight_air_kg_m': weight_air,
'weight_water_kg_m': weight_water
}
Polyester Rope:
def polyester_rope_properties(
diameter: float, # mm
linear_density: float = None # kg/m
) -> dict:
"""
Get polyester rope properties.
Args:
diameter: Rope diameter
linear_density: Mass per unit length (if known)
Returns:
Polyester properties
"""
# Approximate MBL
MBL = 0.0048 * diameter**2 # tonnes
# Weight in air (if not provided)
if linear_density is None:
linear_density = 0.0045 * diameter**2 # kg/m
# Weight in water (polyester is neutrally buoyant in seawater)
# Specific gravity ~1.38, seawater ~1.025
submerged_factor = (1.38 - 1.025) / 1.38
weight_water = linear_density * submerged_factor
# Axial stiffness (EA)
EA = 850 * MBL # kN (approximate)
return {
'diameter_mm': diameter,
'MBL_tonnes': MBL,
'MBL_kN': MBL * 9.81,
'weight_air_kg_m': linear_density,
'weight_water_kg_m': weight_water,
'EA_kN': EA
}
4. Design Standards and Criteria
Safety Factors (API RP 2SK):
safety_factors:
intact_condition:
ULS: # Ultimate Limit State
permanent_mooring: 1.67
temporary_mooring: 1.50
ALS: # Accidental Limit State
permanent: 1.25
temporary: 1.15
damaged_condition: # One line failed
ULS:
permanent: 1.40
temporary: 1.25
ALS:
permanent: 1.15
temporary: 1.05
fatigue:
design_factor: 10.0
Design Load Cases:
load_cases:
operating:
return_period: "1 year"
vessel_offset: "Normal operation"
mooring_check: "Fatigue dominant"
extreme:
return_period: "100 year"
vessel_offset: "Maximum excursion"
mooring_check: "ULS"
survival:
return_period: "10,000 year"
vessel_offset: "Survival condition"
mooring_check: "ALS"
damaged:
condition: "One line failed"
environment: "100 year"
mooring_check: "Damaged ULS"
5. Installation and Pretensioning
Pretension Optimization:
def calculate_pretension(
water_depth: float,
horizontal_distance: float,
target_touchdown_tension: float,
weight_per_length: float
) -> dict:
"""
Calculate required pretension for target touchdown tension.
Args:
water_depth: Water depth
horizontal_distance: Horizontal distance to anchor
target_touchdown_tension: Desired horizontal tension at seabed
weight_per_length: Line weight per length
Returns:
Required pretension
"""
# Calculate catenary profile
a = target_touchdown_tension / weight_per_length
# Suspended length
s = catenary_suspended_length(
water_depth,
horizontal_distance,
target_touchdown_tension,
weight_per_length
)
# Top tension
vertical_load = weight_per_length * water_depth
pretension = np.sqrt(target_touchdown_tension**2 + vertical_load**2)
return {
'pretension_kN': pretension,
'touchdown_tension_kN': target_touchdown_tension,
'suspended_length_m': s,
'catenary_parameter_m': a
}
6. Dynamic Analysis Considerations
Low Frequency Motion:
def estimate_low_frequency_offset(
mean_wave_drift: float, # kN
mooring_stiffness: float # kN/m
) -> float:
"""
Estimate vessel low-frequency offset.
Simple static approximation:
offset = Force / Stiffness
Args:
mean_wave_drift: Mean wave drift force
mooring_stiffness: Total horizontal stiffness
Returns:
Offset in meters
"""
return mean_wave_drift / mooring_stiffness
def calculate_mooring_stiffness(
num_lines: int,
pretension: float, # kN per line
fairlead_depth: float,
weight_per_length: float,
line_azimuth: list # degrees for each line
) -> float:
"""
Calculate total horizontal mooring stiffness.
Args:
num_lines: Number of mooring lines
pretension: Pretension per line
fairlead_depth: Depth of fairlead below waterline
weight_per_length: Weight per unit length
line_azimuth: Azimuth of each line
Returns:
Total horizontal stiffness in kN/m
"""
# Simplified: K = (T/a) for catenary
# where a = H/w
stiffness_per_line = weight_per_length * pretension / fairlead_depth
# Resolve in each direction
total_stiffness = 0
for azimuth in line_azimuth:
# Component in surge direction
component = stiffness_per_line * np.cos(np.radians(azimuth))
total_stiffness += component
return total_stiffness
Practical Applications
Application 1: FPSO 12-Line Mooring
mooring_configuration:
vessel: "FPSO"
water_depth: 1500 # m
number_of_lines: 12
configuration: "3x4 spread" # 3 bundles, 4 lines each
line_composition:
upper_chain:
length: 500 # m
diameter: 127 # mm
grade: "R4"
wire_rope:
length: 1000 # m
diameter: 120 # mm
construction: "6x36 IWRC"
lower_chain:
length: 500 # m
diameter: 127 # mm
grade: "R4"
pretension:
target: 2000 # kN per line
tolerance: "+/-10%"
anchor:
type: "drag_embedment"
capacity: 5000 # kN
safety_factor: 2.0
Application 2: Mooring Integrity Check
def mooring_integrity_check(
tension: float, # kN
MBL: float, # kN
safety_factor: float
) -> dict:
"""
Check mooring line integrity against criteria.
Args:
tension: Applied tension
MBL: Minimum Breaking Load
safety_factor: Required safety factor
Returns:
Check results
"""
utilization = tension / (MBL / safety_factor)
passed = utilization <= 1.0
return {
'tension_kN': tension,
'MBL_kN': MBL,
'allowable_tension_kN': MBL / safety_factor,
'utilization': utilization,
'passed': passed,
'margin': (1.0 - utilization) * 100 # Percent
}
Key Design Steps
Preliminary Sizing
- Water depth
- Vessel offset limits
- Environmental criteria
Configuration Selection
- Number of lines
- Line composition
- Anchor type
Static Analysis
- Catenary profile
- Pretension
- Touchdown loads
Dynamic Analysis
- Vessel motions
- Line tensions
- Fatigue damage
Integrity Assessment
- ULS/ALS checks
- Fatigue life
- Installation feasibility
Resources
- API RP 2SK: Stationkeeping Systems
- DNV-OS-E301: Position Mooring
- ISO 19901-7: Stationkeeping Systems
- OCIMF: Mooring Equipment Guidelines
Use this skill for all mooring system design and analysis in DigitalModel!