Hydrostatics Tutorial#

This tutorial covers detailed hydrostatic calculations with NavalToolbox.

Loading the Hull#

First, load a hull geometry:

from navaltoolbox import Hull, Vessel, HydrostaticsCalculator

# Load hull from STL file
hull = Hull("path/to/dtmb5415.stl")

# Check dimensions
bounds = hull.get_bounds()
print(f"LOA: {bounds[1] - bounds[0]:.2f}m")
print(f"BOA: {bounds[3] - bounds[2]:.2f}m")
print(f"Depth: {bounds[5] - bounds[4]:.2f}m")

# Create vessel
vessel = Vessel(hull)

Basic Hydrostatics#

Calculate hydrostatics at a specific draft:

# Create calculator (seawater density)
calc = HydrostaticsCalculator(vessel, water_density=1025.0)

# Calculate at draft 6.0m, even keel
state = calc.calculate_at_draft(
    draft=6.0,
    trim=0.0,
    heel=0.0,
    vcg=7.5  # for GM calculation
)

print(f"Volume: {state.volume:.1f} m³")
print(f"Displacement: {state.displacement:.0f} kg")
print(f"LCB: {state.lcb:.2f}m from AP")
print(f"TCB: {state.tcb:.3f}m (should be ~0)")
print(f"VCB: {state.vcb:.2f}m (KB)")

Waterplane & Stability#

The calculator computes accurate waterplane properties and applies Free Surface Correction (FSC) automatically if tanks are present:

# Waterplane Properties
print(f"Waterplane Area: {state.waterplane_area:.1f} m²")
print(f"LCF: {state.lcf:.2f} m from AP")
print(f"BMt: {state.bmt:.2f} m")
print(f"BMl: {state.bml:.2f} m")

# Metacentric Heights (requires VCG)
# KM = KB + BM
# GM_dry = KM - VCG
# GM_wet = GM_dry - FSC
print(f"KMt: {state.vcb + state.bmt:.2f} m")
print(f"GMT (corrected/wet): {state.gmt:.3f} m")
print(f"GMT (solid/dry):     {state.gmt_dry:.3f} m")

Finding Equilibrium Draft#

Find the draft for a known displacement:

# DTMB 5415 reference displacement: 8635 tonnes
target_displacement = 8635000  # kg

# Find draft for displacement (level keel)
state = calc.calculate_at_displacement(target_displacement)
print(f"Equilibrium draft: {state.draft:.3f}m")
print(f"Actual displacement: {state.displacement:.0f} kg")

# With VCG for GM calculation
state = calc.calculate_at_displacement(target_displacement, vcg=7.555)
print(f"Draft: {state.draft:.3f}m")
print(f"GMT: {state.gmt:.3f}m")

# Or with full COG (LCG, TCG, VCG) for advanced use
state = calc.calculate_at_displacement(
    target_displacement,
    cog=(71.67, 0.0, 7.555)
)

Calculating at Heel#

Hydrostatics change with heel angle:

# Compare upright vs heeled
for heel in [0, 10, 20, 30]:
    state = calc.calculate_at_draft(6.15, 0.0, heel, 7.555)
    print(f"Heel {heel:2d}°: Vol={state.volume:.1f}m³, VCB={state.vcb:.2f}m")

Fresh vs Salt Water#

Density affects displacement:

# Fresh water (rivers, lakes)
calc_fresh = HydrostaticsCalculator(vessel, water_density=1000.0)

# Salt water (sea)
calc_salt = HydrostaticsCalculator(vessel, water_density=1025.0)

draft = 6.0

state_fresh = calc_fresh.calculate_at_draft(draft, 0.0, 0.0, 7.5)
state_salt = calc_salt.calculate_at_draft(draft, 0.0, 0.0, 7.5)

print(f"Fresh water: {state_fresh.displacement:.0f} kg")
print(f"Salt water:  {state_salt.displacement:.0f} kg")
print(f"Difference:  {state_salt.displacement - state_fresh.displacement:.0f} kg")

Reference Values#

For DTMB 5415 at T=6.15m (SIMMAN 2008):

Property

Value

Volume

~8424 m³

CB

0.506

CM

0.816

LCB (from mid)

-0.686% Lpp