9.2 Marine Minerals

The ocean floor contains vast mineral resources: manganese nodules, cobalt crusts, polymetallic sulfides. Mining is technically possible but raises environmental and legal challenges.

Deep-Sea Mineral Types

Polymetallic Nodules

Potato-sized on abyssal plains. Mn, Ni, Cu, Co. Clarion-Clipperton Zone (Pacific). Grow mm/million years.

Cobalt-Rich Crusts

On seamount slopes. Mn, Co, Ni, platinum group. Pacific seamounts. 1-25 cm thick.

Massive Sulfides (SMS)

At hydrothermal vents. Cu, Zn, Au, Ag. Active and inactive vent sites.

Resource Estimates

~21 billion t

Nodules (CCZ alone)

~1 billion t

Cobalt crusts

~600 million t

Seafloor sulfides

Environmental Concerns

Habitat Destruction

Mining removes substrate. Slow recovery (centuries+). Unique ecosystems at vents.

Sediment Plumes

Mining creates turbidity. Can spread hundreds of km. Affects filter feeders.

Unknown Biodiversity

Many species undescribed. Mining may cause extinctions before discovery.

Noise & Light

Deep-sea life adapted to dark, quiet. Mining disrupts these conditions.

Python: Nodule Growth

#!/usr/bin/env python3
"""marine_minerals.py - Manganese nodule formation"""
import numpy as np
import matplotlib.pyplot as plt

def nodule_growth(time_myr, growth_rate_mm_myr=5):
    """
    Nodule radius growth over time
    Typical growth rate: 1-10 mm/million years
    """
    return growth_rate_mm_myr * time_myr

def nodule_mass(radius_mm, density=2000):
    """
    Approximate nodule mass (kg)
    Assuming spherical
    """
    radius_m = radius_mm / 1000
    volume = (4/3) * np.pi * radius_m**3
    return volume * density

# Growth over geological time
time = np.linspace(0, 20, 100)  # million years
radii = nodule_growth(time)
masses = nodule_mass(radii) * 1000  # grams

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

ax1.plot(time, radii, 'b-', lw=2)
ax1.set_xlabel('Time (million years)')
ax1.set_ylabel('Radius (mm)')
ax1.set_title('Nodule Growth')
ax1.grid(True, alpha=0.3)

ax2.plot(time, masses, 'g-', lw=2)
ax2.set_xlabel('Time (million years)')
ax2.set_ylabel('Mass (g)')
ax2.set_title('Nodule Mass')
ax2.grid(True, alpha=0.3)

plt.tight_layout()

# CCZ resource estimate
area_ccz = 4.5e6  # km²
nodules_per_sqm = 15  # average
avg_mass = 0.05  # kg
total = area_ccz * 1e6 * nodules_per_sqm * avg_mass / 1e9
print(f"CCZ nodule resource estimate: {total:.0f} billion tonnes")