4.5 Marine Food Webs

Marine food webs describe the complex feeding relationships in ocean ecosystems. Energy flows from primary producers through multiple trophic levels, with only ~10% transferred at each step.

Trophic Levels

Level 1: Primary Producers

Phytoplankton, seaweeds. Convert sunlight to organic matter. Base of food web.

Level 2: Primary Consumers

Herbivorous zooplankton, filter feeders. Eat phytoplankton.

Level 3: Secondary Consumers

Small fish, squid. Predatory zooplankton. Eat primary consumers.

Level 4+: Higher Predators

Large fish, marine mammals, seabirds. Apex predators at top.

Ecological Efficiency

\( E = \frac{P_{n+1}}{P_n} \approx 0.10 \)

~10% rule: Only 10% of energy transfers to next trophic level

10,000 kg

Phytoplankton

1,000 kg

Zooplankton

100 kg

Small fish

The Microbial Loop

A parallel pathway that recycles dissolved organic matter:

DOM → Bacteria → Flagellates → Ciliates → Zooplankton

~50% of primary production flows through the microbial loop

Python: Food Web Model

#!/usr/bin/env python3
"""marine_food_webs.py - Simple NPZ model"""
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def npz_model(y, t, params):
    """
    Nutrient-Phytoplankton-Zooplankton model
    """
    N, P, Z = y
    mu_max, K_N, g_max, K_P, m_P, m_Z, gamma = params

    # Phytoplankton growth (Monod kinetics)
    mu = mu_max * N / (K_N + N)
    # Grazing (Holling Type II)
    g = g_max * P / (K_P + P)

    dN = -mu * P + m_P * P + gamma * m_Z * Z
    dP = mu * P - g * Z - m_P * P
    dZ = (1 - gamma) * g * Z - m_Z * Z

    return [dN, dP, dZ]

# Parameters
params = (1.0, 0.5, 0.5, 0.5, 0.1, 0.05, 0.3)
y0 = [5.0, 1.0, 0.5]  # Initial: N, P, Z
t = np.linspace(0, 100, 1000)

sol = odeint(npz_model, y0, t, args=(params,))

plt.figure(figsize=(10, 6))
plt.plot(t, sol[:, 0], 'b-', label='Nutrients')
plt.plot(t, sol[:, 1], 'g-', label='Phytoplankton')
plt.plot(t, sol[:, 2], 'r-', label='Zooplankton')
plt.xlabel('Time'); plt.ylabel('Concentration')
plt.title('NPZ Model Dynamics')
plt.legend(); plt.grid(True, alpha=0.3)