mooring-analysis
Mooring system design, analysis, and assessment for floating offshore platforms
When & Why to Use This Skill
This Claude skill provides comprehensive expertise in mooring system design, analysis, and assessment for floating offshore platforms. It delivers technical guidance on catenary, taut, and semi-taut configurations, incorporating industry standards such as API RP 2SK and DNV. The skill is optimized for offshore engineering workflows, offering precise calculations for tension, fatigue life, and anchor holding capacity to ensure robust station-keeping solutions.
Use Cases
- Station-keeping design: Engineering mooring systems for FPSOs, semi-submersibles, and SPAR platforms across various water depths.
- Catenary and tension analysis: Calculating static/dynamic behavior, suspended line lengths, and top tension using specialized catenary equations.
- Material property assessment: Evaluating the Minimum Breaking Load (MBL) and weight characteristics for chain, wire rope, and polyester components.
- Regulatory compliance checks: Verifying mooring integrity against ULS, ALS, and fatigue safety factors defined by API and ISO standards.
- Installation and pretension optimization: Planning installation procedures and calculating required pretension for target touchdown tensions.
| 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!