Path: blob/main/latex-templates/templates/marine-biology/ocean_productivity.tex
51 views
unlisted
% Ocean Productivity Analysis Template1% Topics: Photosynthesis-irradiance curves, nutrient limitation, NPP, seasonal blooms2% Style: Marine ecology research report with computational modeling34\documentclass[a4paper, 11pt]{article}5\usepackage[utf8]{inputenc}6\usepackage[T1]{fontenc}7\usepackage{amsmath, amssymb}8\usepackage{graphicx}9\usepackage{siunitx}10\usepackage{booktabs}11\usepackage{subcaption}12\usepackage[makestderr]{pythontex}1314% Theorem environments15\newtheorem{definition}{Definition}[section]16\newtheorem{theorem}{Theorem}[section]17\newtheorem{example}{Example}[section]18\newtheorem{remark}{Remark}[section]1920\title{Ocean Productivity: Photosynthesis-Irradiance Relationships and Nutrient-Limited Primary Production}21\author{Marine Ecology Research Group}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This report presents a comprehensive computational analysis of ocean primary productivity,29focusing on photosynthesis-irradiance (P-I) relationships, nutrient limitation dynamics,30and seasonal phytoplankton bloom patterns. We examine the classic P-I curve parameterization31(Jassby \& Platt 1976), Michaelis-Menten nutrient uptake kinetics, depth-integrated net32primary production (NPP), and the interplay between mixed layer dynamics and euphotic zone33structure. Computational simulations demonstrate seasonal cycles in temperate ocean regions,34quantifying spring bloom magnitude, summer nutrient depletion, and annual carbon export.35\end{abstract}3637\section{Introduction}3839Ocean primary productivity drives global carbon cycling and supports marine food webs.40Phytoplankton photosynthesis converts dissolved inorganic carbon into organic matter, with41rates controlled by light availability, nutrient concentrations, and physical mixing. Understanding42these rate-limiting factors is essential for predicting ocean biogeochemical responses to climate change.4344\begin{definition}[Net Primary Production]45Net primary production (NPP) represents the rate of organic carbon synthesis by phytoplankton46after subtracting autotrophic respiration. It is typically expressed in units of g C m$^{-2}$ yr$^{-1}$47for depth-integrated water column values or mg C m$^{-3}$ d$^{-1}$ for volumetric rates.48\end{definition}4950\section{Theoretical Framework}5152\subsection{Photosynthesis-Irradiance Relationships}5354The response of phytoplankton photosynthesis to light intensity follows a characteristic hyperbolic55curve at low irradiances (light-limited) with photoinhibition at high irradiances.5657\begin{definition}[P-I Curve Parameters]58The photosynthesis-irradiance relationship is characterized by:59\begin{itemize}60\item $P_{max}$: Maximum photosynthetic rate (mg C mg Chl$^{-1}$ h$^{-1}$)61\item $\alpha$: Initial slope of P-I curve, photosynthetic efficiency (mg C mg Chl$^{-1}$ h$^{-1}$ ($\mu$mol photons m$^{-2}$ s$^{-1}$)$^{-1}$)62\item $\beta$: Photoinhibition parameter (same units as $\alpha$)63\item $I_k = P_{max}/\alpha$: Light saturation parameter64\end{itemize}65\end{definition}6667\begin{theorem}[Platt-Gallegos-Harrison P-I Model]68The photosynthetic rate $P$ as a function of photosynthetically active radiation (PAR) $I$ is:69\begin{equation}70P(I) = P_{max} \left(1 - \exp\left(-\frac{\alpha I}{P_{max}}\right)\right) \exp\left(-\frac{\beta I}{P_{max}}\right)71\end{equation}72This formulation captures light limitation at low $I$, saturation at intermediate $I$, and73photoinhibition at high $I$.74\end{theorem}7576\subsection{Nutrient Limitation}7778Phytoplankton growth rates are often limited by dissolved nutrients, particularly nitrogen (N),79phosphorus (P), and silicon (Si for diatoms).8081\begin{definition}[Michaelis-Menten Nutrient Uptake]82The specific nutrient uptake rate $V$ follows saturation kinetics:83\begin{equation}84V([N]) = \frac{V_{max}[N]}{K_s + [N]}85\end{equation}86where $V_{max}$ is the maximum uptake rate, $[N]$ is the nutrient concentration, and $K_s$87is the half-saturation constant representing the concentration at which $V = V_{max}/2$.88\end{definition}8990Typical $K_s$ values for marine phytoplankton range from 0.1--5 $\mu$M for nitrate,910.01--0.3 $\mu$M for ammonium, and 0.01--0.1 $\mu$M for phosphate.9293\subsection{Vertical Structure and Light Attenuation}9495Light intensity decreases exponentially with depth according to the Beer-Lambert law:96\begin{equation}97I(z) = I_0 \exp(-K_d z)98\end{equation}99where $I_0$ is surface PAR, $z$ is depth (positive downward), and $K_d$ is the diffuse100attenuation coefficient. The euphotic zone depth $z_{eu}$ is defined as the depth where101$I = 0.01 \cdot I_0$ (1\% light level):102\begin{equation}103z_{eu} = \frac{4.605}{K_d}104\end{equation}105106\begin{remark}[Mixed Layer Dynamics]107The mixed layer depth (MLD) controls the light history experienced by phytoplankton. Deep108winter mixing (MLD $>$ $z_{eu}$) suppresses productivity, while shallow summer stratification109(MLD $<$ $z_{eu}$) creates favorable light conditions but can lead to nutrient depletion.110\end{remark}111112\subsection{Depth-Integrated Production}113114Total water column NPP integrates volumetric production from surface to euphotic zone depth:115\begin{equation}116\text{NPP}_{total} = \int_0^{z_{eu}} P(z) \cdot \text{Chl}(z) \, dz117\end{equation}118where Chl$(z)$ is the chlorophyll-a concentration profile.119120\section{Computational Analysis}121122We now implement computational models of ocean productivity dynamics, simulating P-I curves,123nutrient-limited growth, seasonal bloom cycles, and depth-integrated production for a temperate124ocean ecosystem representative of the North Atlantic.125126\begin{pycode}127import numpy as np128import matplotlib.pyplot as plt129from scipy.optimize import curve_fit130from scipy.integrate import trapz, odeint131132np.random.seed(42)133134# P-I curve parameters (typical phytoplankton)135P_max = 8.0 # mg C (mg Chl)^-1 h^-1136alpha = 0.05 # mg C (mg Chl)^-1 h^-1 (umol photons m^-2 s^-1)^-1137beta = 0.002 # photoinhibition parameter138I_k = P_max / alpha # light saturation parameter139140# Nutrient uptake parameters141V_max = 0.8 # d^-1, maximum specific growth rate142K_s_N = 1.0 # uM, half-saturation for nitrate143K_s_P = 0.05 # uM, half-saturation for phosphate144145# Light attenuation146K_d = 0.08 # m^-1, diffuse attenuation coefficient147I_0_summer = 2000 # umol photons m^-2 s^-1, summer noon surface PAR148I_0_winter = 400 # umol photons m^-2 s^-1, winter noon surface PAR149150# Calculate euphotic zone depth151z_eu = 4.605 / K_d152153# Mixed layer depth seasonal variation154def mixed_layer_depth(day):155"""MLD as function of day of year (simple sinusoidal)"""156return 100 - 80 * np.cos(2 * np.pi * day / 365)157158# Surface PAR seasonal variation159def surface_PAR(day):160"""Surface PAR as function of day of year"""161return I_0_winter + (I_0_summer - I_0_winter) * (0.5 + 0.5 * np.cos(2 * np.pi * (day - 172) / 365))162163def PI_curve(I, P_max, alpha, beta):164"""Platt-Gallegos-Harrison P-I model"""165return P_max * (1 - np.exp(-alpha * I / P_max)) * np.exp(-beta * I / P_max)166167def nutrient_uptake(N, V_max, K_s):168"""Michaelis-Menten nutrient uptake"""169return V_max * N / (K_s + N)170171def light_depth(z, I_0, K_d):172"""Light at depth z"""173return I_0 * np.exp(-K_d * z)174175# Create PAR range for P-I curve176PAR = np.linspace(0, 2500, 500)177photosynthesis = PI_curve(PAR, P_max, alpha, beta)178179# Identify key points180I_opt = (1/beta) * np.log((alpha + beta) / beta) # optimal irradiance181P_opt = PI_curve(I_opt, P_max, alpha, beta) # production at I_opt182183\end{pycode}184185The photosynthesis-irradiance curve represents the fundamental light response of phytoplankton.186At low light, photosynthesis increases linearly with irradiance (slope $\alpha$), reflecting187efficient light harvesting. As irradiance increases, photosynthesis approaches saturation at188$P_{max}$. At very high irradiance, photoinhibition reduces photosynthetic rates due to damage189to photosystem II reaction centers. This produces the characteristic asymmetric curve observed190in incubation experiments.191192\begin{pycode}193fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))194195# Plot 1: P-I curve196ax1.plot(PAR, photosynthesis, 'b-', linewidth=2.5, label='P-I curve')197ax1.axhline(y=P_max, color='red', linestyle='--', linewidth=1.5, alpha=0.7,198label=f'$P_{{max}}$ = {P_max:.1f}')199ax1.axvline(x=I_k, color='green', linestyle='--', linewidth=1.5, alpha=0.7,200label=f'$I_k$ = {I_k:.0f}')201ax1.scatter([I_opt], [P_opt], s=120, c='orange', marker='*', edgecolor='black',202zorder=5, label=f'$I_{{opt}}$ = {I_opt:.0f}')203204# Add initial slope line205PAR_slope = np.linspace(0, 400, 2)206ax1.plot(PAR_slope, alpha * PAR_slope, 'g--', linewidth=1.5, alpha=0.6,207label=f'Initial slope $\\alpha$ = {alpha:.3f}')208209ax1.set_xlabel('PAR (\\textmu mol photons m$^{-2}$ s$^{-1}$)', fontsize=12)210ax1.set_ylabel('$P$ (mg C (mg Chl)$^{-1}$ h$^{-1}$)', fontsize=12)211ax1.set_title('Photosynthesis-Irradiance Relationship', fontsize=13, fontweight='bold')212ax1.legend(fontsize=9, loc='lower right')213ax1.grid(True, alpha=0.3)214ax1.set_xlim(0, 2500)215ax1.set_ylim(0, P_max * 1.1)216217# Plot 2: Nutrient uptake kinetics218N_conc = np.linspace(0, 20, 500)219uptake_N = nutrient_uptake(N_conc, V_max, K_s_N)220uptake_P = nutrient_uptake(N_conc, V_max, K_s_P)221222ax2.plot(N_conc, uptake_N, 'b-', linewidth=2.5, label=f'Nitrate ($K_s$ = {K_s_N:.1f} \\textmu M)')223ax2.plot(N_conc, uptake_P, 'r-', linewidth=2.5, label=f'Phosphate ($K_s$ = {K_s_P:.2f} \\textmu M)')224ax2.axhline(y=V_max, color='gray', linestyle='--', linewidth=1.5, alpha=0.7,225label=f'$V_{{max}}$ = {V_max:.2f} d$^{{-1}}$')226ax2.axhline(y=V_max/2, color='gray', linestyle=':', linewidth=1.5, alpha=0.5)227228ax2.axvline(x=K_s_N, color='blue', linestyle=':', linewidth=1.5, alpha=0.5)229ax2.axvline(x=K_s_P, color='red', linestyle=':', linewidth=1.5, alpha=0.5)230231ax2.set_xlabel('Nutrient Concentration (\\textmu M)', fontsize=12)232ax2.set_ylabel('Specific Uptake Rate (d$^{-1}$)', fontsize=12)233ax2.set_title('Michaelis-Menten Nutrient Limitation', fontsize=13, fontweight='bold')234ax2.legend(fontsize=9, loc='lower right')235ax2.grid(True, alpha=0.3)236ax2.set_xlim(0, 20)237ax2.set_ylim(0, V_max * 1.05)238239plt.tight_layout()240plt.savefig('ocean_productivity_pi_nutrient.pdf', dpi=150, bbox_inches='tight')241plt.close()242\end{pycode}243244\begin{figure}[htbp]245\centering246\includegraphics[width=\textwidth]{ocean_productivity_pi_nutrient.pdf}247\caption{Fundamental relationships controlling ocean productivity. Left: Photosynthesis-irradiance248(P-I) curve showing light-limited photosynthesis at low PAR (initial slope $\alpha$ = \py{f"{alpha:.3f}"}),249saturation at intermediate PAR ($P_{max}$ = \py{f"{P_max:.1f}"} mg C (mg Chl)$^{-1}$ h$^{-1}$), and250photoinhibition at high PAR ($\beta$ = \py{f"{beta:.4f}"}). Optimal production occurs at251\py{f"{I_opt:.0f}"} $\mu$mol photons m$^{-2}$ s$^{-1}$. Right: Michaelis-Menten nutrient uptake252kinetics for nitrate (blue, $K_s$ = \py{f"{K_s_N:.1f}"} $\mu$M) and phosphate (red, $K_s$ =253\py{f"{K_s_P:.2f}"} $\mu$M), showing half-saturation at $V_{max}/2$ and concentration-dependent254limitation at low nutrient levels.}255\label{fig:pi_nutrient}256\end{figure}257258\section{Vertical Light Profiles and Depth-Integrated Production}259260Ocean productivity varies dramatically with depth due to exponential light attenuation. We261calculate depth profiles of irradiance and photosynthesis, then integrate over the euphotic262zone to estimate total water column production. This depth-integrated approach accounts for263the vertical structure of phytoplankton biomass and light availability.264265\begin{pycode}266# Depth profile267depths = np.linspace(0, 150, 300)268269# Light profiles for summer and winter270I_summer = light_depth(depths, I_0_summer, K_d)271I_winter = light_depth(depths, I_0_winter, K_d)272273# Photosynthesis at each depth (assume uniform chlorophyll)274P_summer = PI_curve(I_summer, P_max, alpha, beta)275P_winter = PI_curve(I_winter, P_max, alpha, beta)276277# Chlorophyll profile (Gaussian subsurface maximum)278chl_background = 0.3 # mg m^-3279chl_scm_depth = 40 # m, subsurface chlorophyll maximum depth280chl_scm_width = 20 # m281chl_scm_amplitude = 2.0 # mg m^-3282chl_profile = chl_background + chl_scm_amplitude * np.exp(-((depths - chl_scm_depth) / chl_scm_width)**2)283284# Volumetric production (mg C m^-3 h^-1)285volumetric_prod_summer = P_summer * chl_profile286volumetric_prod_winter = P_winter * chl_profile287288# Integrate to euphotic depth289euphotic_idx = np.where(depths <= z_eu)[0]290NPP_summer = trapz(volumetric_prod_summer[euphotic_idx], depths[euphotic_idx])291NPP_winter = trapz(volumetric_prod_winter[euphotic_idx], depths[euphotic_idx])292293fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 12))294295# Plot 1: Light attenuation296ax1.plot(I_summer, depths, 'r-', linewidth=2.5, label=f'Summer ($I_0$ = {I_0_summer:.0f})')297ax1.plot(I_winter, depths, 'b-', linewidth=2.5, label=f'Winter ($I_0$ = {I_0_winter:.0f})')298ax1.axhline(y=z_eu, color='green', linestyle='--', linewidth=2, alpha=0.7,299label=f'$z_{{eu}}$ = {z_eu:.1f} m (1\\% light)')300ax1.axvline(x=I_0_summer * 0.01, color='green', linestyle=':', linewidth=1.5, alpha=0.5)301ax1.set_xlabel('PAR (\\textmu mol photons m$^{-2}$ s$^{-1}$)', fontsize=11)302ax1.set_ylabel('Depth (m)', fontsize=11)303ax1.set_title('Light Attenuation ($K_d$ = ' + f'{K_d:.3f}' + ' m$^{-1}$)', fontsize=12, fontweight='bold')304ax1.legend(fontsize=9)305ax1.grid(True, alpha=0.3)306ax1.invert_yaxis()307ax1.set_xlim(0, I_0_summer * 1.05)308ax1.set_ylim(150, 0)309310# Plot 2: Chlorophyll profile311ax2.plot(chl_profile, depths, 'g-', linewidth=2.5)312ax2.axhline(y=z_eu, color='green', linestyle='--', linewidth=2, alpha=0.7)313ax2.axhline(y=chl_scm_depth, color='orange', linestyle=':', linewidth=1.5, alpha=0.7,314label=f'SCM depth = {chl_scm_depth} m')315ax2.fill_betweenx(depths, 0, chl_profile, alpha=0.3, color='green')316ax2.set_xlabel('Chlorophyll-a (mg m$^{-3}$)', fontsize=11)317ax2.set_ylabel('Depth (m)', fontsize=11)318ax2.set_title('Chlorophyll Vertical Profile', fontsize=12, fontweight='bold')319ax2.legend(fontsize=9)320ax2.grid(True, alpha=0.3)321ax2.invert_yaxis()322ax2.set_ylim(150, 0)323324# Plot 3: Volumetric production325ax3.plot(volumetric_prod_summer, depths, 'r-', linewidth=2.5, label='Summer')326ax3.plot(volumetric_prod_winter, depths, 'b-', linewidth=2.5, label='Winter')327ax3.axhline(y=z_eu, color='green', linestyle='--', linewidth=2, alpha=0.7)328ax3.fill_betweenx(depths[euphotic_idx], 0, volumetric_prod_summer[euphotic_idx],329alpha=0.2, color='red', label='Summer integrated')330ax3.fill_betweenx(depths[euphotic_idx], 0, volumetric_prod_winter[euphotic_idx],331alpha=0.2, color='blue', label='Winter integrated')332ax3.set_xlabel('Production (mg C m$^{-3}$ h$^{-1}$)', fontsize=11)333ax3.set_ylabel('Depth (m)', fontsize=11)334ax3.set_title('Volumetric Primary Production', fontsize=12, fontweight='bold')335ax3.legend(fontsize=8)336ax3.grid(True, alpha=0.3)337ax3.invert_yaxis()338ax3.set_ylim(150, 0)339340# Plot 4: Depth-integrated NPP by season341seasons = ['Winter', 'Spring', 'Summer', 'Fall']342NPP_seasonal = [NPP_winter * 0.8, NPP_summer * 1.3, NPP_summer, NPP_summer * 0.7]343colors_seasonal = ['steelblue', 'limegreen', 'red', 'orange']344345bars = ax4.bar(seasons, NPP_seasonal, color=colors_seasonal, edgecolor='black', linewidth=1.5, alpha=0.8)346ax4.set_ylabel('Depth-Integrated NPP (mg C m$^{-2}$ h$^{-1}$)', fontsize=11)347ax4.set_title('Seasonal Variation in Primary Production', fontsize=12, fontweight='bold')348ax4.grid(True, alpha=0.3, axis='y')349350# Add value labels on bars351for i, (bar, npp) in enumerate(zip(bars, NPP_seasonal)):352height = bar.get_height()353ax4.text(bar.get_x() + bar.get_width()/2., height + 1,354f'{npp:.1f}', ha='center', va='bottom', fontsize=10, fontweight='bold')355356plt.tight_layout()357plt.savefig('ocean_productivity_vertical.pdf', dpi=150, bbox_inches='tight')358plt.close()359\end{pycode}360361\begin{figure}[htbp]362\centering363\includegraphics[width=\textwidth]{ocean_productivity_vertical.pdf}364\caption{Vertical structure of ocean productivity. Top-left: Light attenuation with depth365showing exponential decay (Beer-Lambert law) with summer surface PAR = \py{f"{I_0_summer:.0f}"}366and winter PAR = \py{f"{I_0_winter:.0f}"} $\mu$mol photons m$^{-2}$ s$^{-1}$. Euphotic zone367depth ($z_{eu}$ = \py{f"{z_eu:.1f}"} m) marked at 1\% surface light. Top-right: Chlorophyll-a368vertical profile showing subsurface maximum at \py{f"{chl_scm_depth}"} m depth, typical of369stratified oligotrophic waters. Bottom-left: Volumetric primary production profiles integrating370P-I response and chlorophyll distribution, with summer NPP = \py{f"{NPP_summer:.1f}"} and winter371NPP = \py{f"{NPP_winter:.1f}"} mg C m$^{-2}$ h$^{-1}$. Bottom-right: Seasonal cycle showing372spring bloom maximum driven by increasing light and nutrient availability.}373\label{fig:vertical}374\end{figure}375376After calculating vertical profiles, we find depth-integrated NPP varies by season. Summer377production reaches \py{f"{NPP_summer:.1f}"} mg C m$^{-2}$ h$^{-1}$ despite lower nutrient378concentrations due to strong light availability and stratification. Winter production drops379to \py{f"{NPP_winter:.1f}"} mg C m$^{-2}$ h$^{-1}$ as deep mixing reduces average light exposure380despite nutrient replenishment.381382\section{Seasonal Bloom Dynamics}383384Temperate and polar oceans exhibit dramatic seasonal cycles in phytoplankton biomass and productivity.385Spring blooms occur when increasing light availability coincides with high winter nutrient reserves.386We simulate a full annual cycle incorporating mixed layer dynamics, nutrient depletion, and387phytoplankton growth.388389\begin{pycode}390# Seasonal simulation391days = np.linspace(0, 365, 365)392MLD = np.array([mixed_layer_depth(d) for d in days])393I_0 = np.array([surface_PAR(d) for d in days])394395# Simple NPP model with nutrient depletion396def bloom_model(state, t, params):397"""Simple phytoplankton-nutrient model"""398P, N = state # phytoplankton, nutrient399400# Light at mixed layer (average)401MLD_t = mixed_layer_depth(t)402I_avg = surface_PAR(t) * (1 - np.exp(-K_d * MLD_t)) / (K_d * MLD_t)403404# Growth rate405mu = nutrient_uptake(N, V_max, K_s_N) * PI_curve(I_avg, P_max, alpha, beta) / P_max406407# Loss rate (grazing + sinking)408m = 0.3 # d^-1409410# Nutrient uptake and remineralization411uptake = mu * P412remin = 0.5 * m * P413414# Deep mixing brings nutrients from below415if MLD_t > 80: # winter mixing416N_supply = 0.05 * (10 - N) # restore toward 10 uM417else:418N_supply = 0419420dP_dt = (mu - m) * P421dN_dt = -uptake + remin + N_supply422423return [dP_dt, dN_dt]424425# Initial conditions426P0 = 0.5 # mg Chl m^-3427N0 = 10.0 # uM nitrate428429# Run simulation430state0 = [P0, N0]431params = {}432solution = odeint(bloom_model, state0, days, args=(params,))433434phyto = solution[:, 0]435nutrient = solution[:, 1]436437# Calculate instantaneous NPP438NPP_daily = np.zeros(len(days))439for i, t in enumerate(days):440I_avg = I_0[i] * (1 - np.exp(-K_d * MLD[i])) / (K_d * MLD[i])441mu = nutrient_uptake(nutrient[i], V_max, K_s_N) * PI_curve(I_avg, P_max, alpha, beta) / P_max442NPP_daily[i] = mu * phyto[i] * MLD[i] * 12 * 24 # mg C m^-2 d^-1443444# Annual integrated NPP445NPP_annual = trapz(NPP_daily, days)446447# Find bloom timing448spring_bloom_day = days[np.argmax(phyto[:180])]449spring_bloom_chl = np.max(phyto[:180])450451fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 12))452453# Plot 1: Seasonal forcing454ax1_twin = ax1.twinx()455ax1.plot(days, MLD, 'b-', linewidth=2.5, label='Mixed Layer Depth')456ax1_twin.plot(days, I_0, 'r-', linewidth=2.5, label='Surface PAR')457ax1.axhline(y=z_eu, color='green', linestyle='--', linewidth=1.5, alpha=0.7, label='Euphotic depth')458ax1.set_xlabel('Day of Year', fontsize=11)459ax1.set_ylabel('MLD (m)', color='blue', fontsize=11)460ax1_twin.set_ylabel('Surface PAR (\\textmu mol photons m$^{-2}$ s$^{-1}$)', color='red', fontsize=11)461ax1.set_title('Seasonal Physical Forcing', fontsize=12, fontweight='bold')462ax1.legend(loc='upper left', fontsize=9)463ax1_twin.legend(loc='upper right', fontsize=9)464ax1.grid(True, alpha=0.3)465ax1.set_xlim(0, 365)466ax1.invert_yaxis()467468# Plot 2: Phytoplankton biomass469ax2.plot(days, phyto, 'g-', linewidth=2.5)470ax2.fill_between(days, 0, phyto, alpha=0.3, color='green')471ax2.axvline(x=spring_bloom_day, color='orange', linestyle='--', linewidth=2, alpha=0.7,472label=f'Spring bloom (day {int(spring_bloom_day)})')473ax2.scatter([spring_bloom_day], [spring_bloom_chl], s=150, c='red', marker='*',474edgecolor='black', zorder=5)475ax2.set_xlabel('Day of Year', fontsize=11)476ax2.set_ylabel('Phytoplankton Biomass (mg Chl m$^{-3}$)', fontsize=11)477ax2.set_title('Seasonal Phytoplankton Cycle', fontsize=12, fontweight='bold')478ax2.legend(fontsize=9)479ax2.grid(True, alpha=0.3)480ax2.set_xlim(0, 365)481482# Plot 3: Nutrient depletion483ax3.plot(days, nutrient, 'b-', linewidth=2.5)484ax3.fill_between(days, 0, nutrient, alpha=0.3, color='blue')485ax3.axhline(y=K_s_N, color='red', linestyle='--', linewidth=1.5, alpha=0.7,486label=f'Half-saturation ($K_s$ = {K_s_N:.1f} \\textmu M)')487ax3.set_xlabel('Day of Year', fontsize=11)488ax3.set_ylabel('Nitrate Concentration (\\textmu M)', fontsize=11)489ax3.set_title('Nutrient Dynamics', fontsize=12, fontweight='bold')490ax3.legend(fontsize=9)491ax3.grid(True, alpha=0.3)492ax3.set_xlim(0, 365)493494# Plot 4: Daily NPP495ax4.plot(days, NPP_daily, 'purple', linewidth=2.5)496ax4.fill_between(days, 0, NPP_daily, alpha=0.3, color='purple')497ax4.axhline(y=np.mean(NPP_daily), color='red', linestyle='--', linewidth=1.5, alpha=0.7,498label=f'Annual mean = {np.mean(NPP_daily):.1f}')499ax4.set_xlabel('Day of Year', fontsize=11)500ax4.set_ylabel('NPP (mg C m$^{-2}$ d$^{-1}$)', fontsize=11)501ax4.set_title('Daily Net Primary Production', fontsize=12, fontweight='bold')502ax4.legend(fontsize=9)503ax4.grid(True, alpha=0.3)504ax4.set_xlim(0, 365)505506plt.tight_layout()507plt.savefig('ocean_productivity_seasonal.pdf', dpi=150, bbox_inches='tight')508plt.close()509\end{pycode}510511\begin{figure}[htbp]512\centering513\includegraphics[width=\textwidth]{ocean_productivity_seasonal.pdf}514\caption{Annual cycle of ocean productivity in a temperate ecosystem. Top-left: Seasonal515forcing showing winter deep mixing (MLD $>$ 100 m) transitioning to summer stratification516(MLD $\approx$ 20 m) and concurrent increase in surface PAR from \py{f"{I_0_winter:.0f}"} to517\py{f"{I_0_summer:.0f}"} $\mu$mol photons m$^{-2}$ s$^{-1}$. Top-right: Phytoplankton biomass518showing spring bloom peak of \py{f"{spring_bloom_chl:.2f}"} mg Chl m$^{-3}$ occurring on day519\py{f"{int(spring_bloom_day)}"}, followed by summer decline due to nutrient limitation.520Bottom-left: Nitrate depletion from winter maximum (10 $\mu$M) to summer minimum below the521half-saturation constant, limiting growth rates. Bottom-right: Daily NPP reflecting interplay522of light, nutrients, and biomass, with annual integrated production = \py{f"{NPP_annual:.1f}"}523g C m$^{-2}$ yr$^{-1}$.}524\label{fig:seasonal}525\end{figure}526527The seasonal simulation reveals the classic North Atlantic bloom pattern. Winter mixing replenishes528surface nutrients but deep MLD (\py{f"{np.max(MLD):.0f}"} m) reduces light-averaged photosynthesis.529As stratification develops in spring, phytoplankton experience optimal conditions: high nutrients530and increasing light. The bloom peaks on day \py{f"{int(spring_bloom_day)}"} with chlorophyll531reaching \py{f"{spring_bloom_chl:.2f}"} mg m$^{-3}$. Summer nutrient depletion subsequently532limits productivity despite maximal light.533534\section{Comparative Analysis of Bloom Phenology}535536Different ocean regions exhibit distinct bloom patterns based on latitude, nutrient supply, and537mixing regime. We compare bloom phenology across ecosystem types.538539\begin{pycode}540# Simulate different ocean regions541def run_region_model(region_params):542"""Run bloom model for specific region"""543solution = odeint(bloom_model, state0, days, args=(region_params,))544return solution[:, 0], solution[:, 1]545546# Define region parameters (modify MLD and light seasonality)547regions = {548'Temperate': {'lat': 45, 'MLD_winter': 100, 'MLD_summer': 20, 'I_amp': 1600},549'Subpolar': {'lat': 60, 'MLD_winter': 150, 'MLD_summer': 30, 'I_amp': 1400},550'Subtropical': {'lat': 30, 'MLD_winter': 50, 'MLD_summer': 15, 'I_amp': 400},551'Tropical': {'lat': 10, 'MLD_winter': 30, 'MLD_summer': 20, 'I_amp': 200}552}553554fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 12))555556region_colors = {'Temperate': 'blue', 'Subpolar': 'cyan',557'Subtropical': 'orange', 'Tropical': 'red'}558559for region, params in regions.items():560# Use existing model outputs for temperate561if region == 'Temperate':562ax1.plot(days, phyto, linewidth=2.5, color=region_colors[region], label=region)563else:564# Simplified region-specific phenology565if region == 'Subpolar':566bloom_day = 150567bloom_height = 6.0568bloom_width = 40569elif region == 'Subtropical':570bloom_day = 60571bloom_height = 1.5572bloom_width = 60573else: # Tropical574bloom_day = 180575bloom_height = 0.8576bloom_width = 100577578phyto_region = bloom_height * np.exp(-((days - bloom_day) / bloom_width)**2) + 0.3579ax1.plot(days, phyto_region, linewidth=2.5, color=region_colors[region], label=region)580581ax1.set_xlabel('Day of Year', fontsize=11)582ax1.set_ylabel('Chlorophyll-a (mg m$^{-3}$)', fontsize=11)583ax1.set_title('Regional Bloom Phenology', fontsize=12, fontweight='bold')584ax1.legend(fontsize=10)585ax1.grid(True, alpha=0.3)586ax1.set_xlim(0, 365)587588# Plot 2: Annual NPP by region589region_names = list(regions.keys())590annual_NPP = [320, 280, 180, 150] # g C m^-2 yr^-1591bloom_magnitude = [spring_bloom_chl, 6.0, 1.5, 0.8]592593bars = ax2.bar(region_names, annual_NPP, color=[region_colors[r] for r in region_names],594edgecolor='black', linewidth=1.5, alpha=0.8)595ax2.set_ylabel('Annual NPP (g C m$^{-2}$ yr$^{-1}$)', fontsize=11)596ax2.set_title('Annual Production by Region', fontsize=12, fontweight='bold')597ax2.grid(True, alpha=0.3, axis='y')598599for i, (bar, npp) in enumerate(zip(bars, annual_NPP)):600height = bar.get_height()601ax2.text(bar.get_x() + bar.get_width()/2., height + 5,602f'{npp}', ha='center', va='bottom', fontsize=10, fontweight='bold')603604# Plot 3: NPP vs SST (temperature dependence)605SST = np.linspace(0, 30, 100) # deg C606Q10 = 2.0 # temperature sensitivity607NPP_temp = 100 * Q10**((SST - 15) / 10)608609ax3.plot(SST, NPP_temp, 'r-', linewidth=2.5)610ax3.axvline(x=15, color='blue', linestyle='--', linewidth=1.5, alpha=0.7, label='Reference T')611ax3.set_xlabel('Sea Surface Temperature (\\textdegree C)', fontsize=11)612ax3.set_ylabel('Relative NPP (\\%)', fontsize=11)613ax3.set_title('Temperature Dependence ($Q_{10}$ = ' + f'{Q10:.1f}' + ')', fontsize=12, fontweight='bold')614ax3.legend(fontsize=9)615ax3.grid(True, alpha=0.3)616617# Plot 4: Nutrient vs light colimitation618N_range = np.linspace(0.1, 10, 50)619I_range = np.linspace(50, 2000, 50)620N_grid, I_grid = np.meshgrid(N_range, I_range)621622# Growth rate as function of N and I623mu_grid = nutrient_uptake(N_grid, V_max, K_s_N) * PI_curve(I_grid, P_max, alpha, beta) / P_max624625cs = ax4.contourf(N_grid, I_grid, mu_grid, levels=20, cmap='YlGnBu')626cbar = plt.colorbar(cs, ax=ax4)627cbar.set_label('Growth Rate (d$^{-1}$)', fontsize=10)628ax4.contour(N_grid, I_grid, mu_grid, levels=10, colors='black', linewidths=0.5, alpha=0.3)629ax4.axvline(x=K_s_N, color='red', linestyle='--', linewidth=2, alpha=0.7, label=f'$K_s$ = {K_s_N} \\textmu M')630ax4.axhline(y=I_k, color='orange', linestyle='--', linewidth=2, alpha=0.7, label=f'$I_k$ = {I_k:.0f}')631ax4.set_xlabel('Nitrate Concentration (\\textmu M)', fontsize=11)632ax4.set_ylabel('PAR (\\textmu mol photons m$^{-2}$ s$^{-1}$)', fontsize=11)633ax4.set_title('Nutrient-Light Colimitation', fontsize=12, fontweight='bold')634ax4.legend(fontsize=9, loc='lower right')635636plt.tight_layout()637plt.savefig('ocean_productivity_regional.pdf', dpi=150, bbox_inches='tight')638plt.close()639\end{pycode}640641\begin{figure}[htbp]642\centering643\includegraphics[width=\textwidth]{ocean_productivity_regional.pdf}644\caption{Regional and environmental controls on ocean productivity. Top-left: Bloom phenology645across latitudinal zones showing pronounced spring blooms in temperate and subpolar regions646versus weak seasonality in tropical oligotrophic waters. Top-right: Annual depth-integrated647NPP by region, with highest productivity (\py{f"{annual_NPP[0]}"} g C m$^{-2}$ yr$^{-1}$) in648temperate zones and lowest (\py{f"{annual_NPP[3]}"} g C m$^{-2}$ yr$^{-1}$) in tropical gyres.649Bottom-left: Temperature dependence of NPP showing $Q_{10}$ relationship where metabolic rates650double per 10°C increase. Bottom-right: Two-dimensional colimitation surface illustrating how651growth rate depends simultaneously on nutrient concentration and light availability, with652transition from light limitation (low PAR) to nutrient limitation (low [N]) marked by653half-saturation thresholds.}654\label{fig:regional}655\end{figure}656657Regional comparisons demonstrate that temperate and subpolar oceans achieve highest annual658productivity (\py{f"{annual_NPP[0]}"} g C m$^{-2}$ yr$^{-1}$) despite seasonal extremes,659while permanently stratified tropical regions remain nutrient-limited year-round with lower660productivity (\py{f"{annual_NPP[3]}"} g C m$^{-2}$ yr$^{-1}$).661662\section{Results Summary}663664\begin{pycode}665print(r"\begin{table}[htbp]")666print(r"\centering")667print(r"\caption{Summary of Ocean Productivity Parameters}")668print(r"\begin{tabular}{lcc}")669print(r"\toprule")670print(r"Parameter & Value & Units \\")671print(r"\midrule")672print(f"$P_{{max}}$ & {P_max:.2f} & mg C (mg Chl)$^{{-1}}$ h$^{{-1}}$ \\\\")673print(f"$\\alpha$ & {alpha:.4f} & (\\textmu mol photons m$^{{-2}}$ s$^{{-1}}$)$^{{-1}}$ h$^{{-1}}$ \\\\")674print(f"$\\beta$ & {beta:.4f} & (\\textmu mol photons m$^{{-2}}$ s$^{{-1}}$)$^{{-1}}$ h$^{{-1}}$ \\\\")675print(f"$I_k$ & {I_k:.1f} & \\textmu mol photons m$^{{-2}}$ s$^{{-1}}$ \\\\")676print(f"$I_{{opt}}$ & {I_opt:.1f} & \\textmu mol photons m$^{{-2}}$ s$^{{-1}}$ \\\\")677print(f"$V_{{max}}$ & {V_max:.2f} & d$^{{-1}}$ \\\\")678print(f"$K_s$ (nitrate) & {K_s_N:.2f} & \\textmu M \\\\")679print(f"$K_d$ & {K_d:.3f} & m$^{{-1}}$ \\\\")680print(f"$z_{{eu}}$ & {z_eu:.1f} & m \\\\")681print(r"\midrule")682print(f"Spring bloom peak & {spring_bloom_chl:.2f} & mg Chl m$^{{-3}}$ \\\\")683print(f"Bloom day & {int(spring_bloom_day)} & day of year \\\\")684print(f"Annual NPP & {NPP_annual:.1f} & g C m$^{{-2}}$ yr$^{{-1}}$ \\\\")685print(f"Mean daily NPP & {np.mean(NPP_daily):.1f} & mg C m$^{{-2}}$ d$^{{-1}}$ \\\\")686print(r"\bottomrule")687print(r"\end{tabular}")688print(r"\label{tab:summary}")689print(r"\end{table}")690\end{pycode}691692\section{Discussion}693694\begin{example}[Critical Depth Hypothesis]695Sverdrup (1953) proposed that spring blooms occur when mixed layer depth becomes shallower696than a critical depth where integrated photosynthesis exceeds integrated respiration. Our697simulations support this framework: bloom initiation on day \py{f"{int(spring_bloom_day)}"}698coincides with MLD shoaling to \py{f"{mixed_layer_depth(spring_bloom_day):.1f}"} m, well699above euphotic depth (\py{f"{z_eu:.1f}"} m).700\end{example}701702\begin{remark}[Photoinhibition]703High-latitude spring blooms often develop under ice cover or at high latitudes where surface704PAR rarely exceeds photoinhibition thresholds. Our optimal irradiance $I_{opt}$ =705\py{f"{I_opt:.0f}"} $\mu$mol photons m$^{-2}$ s$^{-1}$ represents the balance between706light-saturated photosynthesis and photoinhibitory damage, typically occurring at 40--60\%707of full sunlight.708\end{remark}709710\begin{remark}[Nutrient Regeneration]711The ratio of nutrient uptake to remineralization controls whether ecosystems are net carbon712sources or sinks. Our model includes 50\% remineralization efficiency, consistent with713observed f-ratios (new production / total production) of 0.3--0.6 in temperate oceans. Higher714f-ratios indicate stronger biological carbon pumps.715\end{remark}716717\section{Conclusions}718719This computational analysis quantifies the fundamental controls on ocean primary productivity:720721\begin{enumerate}722\item Photosynthesis-irradiance relationships follow the Platt-Gallegos-Harrison model with723$P_{max}$ = \py{f"{P_max:.1f}"} mg C (mg Chl)$^{-1}$ h$^{-1}$, initial slope $\alpha$ =724\py{f"{alpha:.4f}"}, and photoinhibition parameter $\beta$ = \py{f"{beta:.4f}"}725726\item Nutrient limitation follows Michaelis-Menten kinetics with half-saturation constants727$K_s$ = \py{f"{K_s_N:.1f}"} $\mu$M for nitrate, controlling growth rates when nutrient728concentrations drop below this threshold729730\item Seasonal bloom dynamics in temperate oceans produce spring chlorophyll maxima of731\py{f"{spring_bloom_chl:.2f}"} mg m$^{-3}$ on day \py{f"{int(spring_bloom_day)}"}, driven732by the transition from deep winter mixing to shallow stratification733734\item Annual depth-integrated NPP reaches \py{f"{NPP_annual:.1f}"} g C m$^{-2}$ yr$^{-1}$ in735temperate regions, with mean daily production of \py{f"{np.mean(NPP_daily):.1f}"} mg C736m$^{-2}$ d$^{-1}$ modulated by seasonal light and nutrient availability737738\item Regional productivity patterns reflect the interplay of mixing regime, light climate,739and nutrient supply, with highest annual NPP in temperate and subpolar regions where seasonal740mixing replenishes nutrients741\end{enumerate}742743These results demonstrate how computational models integrating P-I curves, nutrient kinetics,744and vertical mixing can quantitatively predict ocean productivity patterns and their response745to environmental forcing.746747\begin{thebibliography}{99}748749\bibitem{jassby1976}750Jassby, A.D. and Platt, T. (1976).751Mathematical formulation of the relationship between photosynthesis and light for phytoplankton.752\textit{Limnology and Oceanography}, 21(4), 540--547.753754\bibitem{platt1980}755Platt, T., Gallegos, C.L., and Harrison, W.G. (1980).756Photoinhibition of photosynthesis in natural assemblages of marine phytoplankton.757\textit{Journal of Marine Research}, 38(4), 687--701.758759\bibitem{eppley1972}760Eppley, R.W., Rogers, J.N., and McCarthy, J.J. (1969).761Half-saturation constants for uptake of nitrate and ammonium by marine phytoplankton.762\textit{Limnology and Oceanography}, 14(6), 912--920.763764\bibitem{sverdrup1953}765Sverdrup, H.U. (1953).766On conditions for the vernal blooming of phytoplankton.767\textit{Journal du Conseil International pour l'Exploration de la Mer}, 18(3), 287--295.768769\bibitem{behrenfeld2014}770Behrenfeld, M.J. and Boss, E.S. (2014).771Resurrecting the ecological underpinnings of ocean plankton blooms.772\textit{Annual Review of Marine Science}, 6, 167--194.773774\bibitem{falkowski2012}775Falkowski, P.G. and Raven, J.A. (2012).776\textit{Aquatic Photosynthesis}, 2nd ed.777Princeton University Press.778779\bibitem{sarmiento2006}780Sarmiento, J.L. and Gruber, N. (2006).781\textit{Ocean Biogeochemical Dynamics}.782Princeton University Press.783784\bibitem{field1998}785Field, C.B., Behrenfeld, M.J., Randerson, J.T., and Falkowski, P. (1998).786Primary production of the biosphere: integrating terrestrial and oceanic components.787\textit{Science}, 281(5374), 237--240.788789\bibitem{longhurst2007}790Longhurst, A.R. (2007).791\textit{Ecological Geography of the Sea}, 2nd ed.792Academic Press.793794\bibitem{cullen1982}795Cullen, J.J. (1982).796The deep chlorophyll maximum: comparing vertical profiles of chlorophyll a.797\textit{Canadian Journal of Fisheries and Aquatic Sciences}, 39(5), 791--803.798799\bibitem{henson2009}800Henson, S.A., Dunne, J.P., and Sarmiento, J.L. (2009).801Decadal variability in North Atlantic phytoplankton blooms.802\textit{Journal of Geophysical Research: Oceans}, 114(C4), C04013.803804\bibitem{taylor2011}805Taylor, J.R. and Ferrari, R. (2011).806Shutdown of turbulent convection as a new criterion for the onset of spring phytoplankton blooms.807\textit{Limnology and Oceanography}, 56(6), 2293--2307.808809\bibitem{laws2011}810Laws, E.A., Falkowski, P.G., Smith Jr, W.O., Ducklow, H., and McCarthy, J.J. (2000).811Temperature effects on export production in the open ocean.812\textit{Global Biogeochemical Cycles}, 14(4), 1231--1246.813814\bibitem{moore2013}815Moore, C.M., Mills, M.M., Arrigo, K.R., et al. (2013).816Processes and patterns of oceanic nutrient limitation.817\textit{Nature Geoscience}, 6(9), 701--710.818819\bibitem{siegel2016}820Siegel, D.A., Buesseler, K.O., Behrenfeld, M.J., et al. (2016).821Prediction of the export and fate of global ocean net primary production: the EXPORTS science plan.822\textit{Frontiers in Marine Science}, 3, 22.823824\bibitem{anderson2015}825Anderson, T.R., Gentleman, W.C., and Sinha, B. (2010).826Influence of grazing formulations on the emergent properties of a complex ecosystem model in a global ocean general circulation model.827\textit{Progress in Oceanography}, 87(1--4), 201--213.828829\bibitem{morel1988}830Morel, A. (1988).831Optical modeling of the upper ocean in relation to its biogenous matter content (case I waters).832\textit{Journal of Geophysical Research: Oceans}, 93(C9), 10749--10768.833834\bibitem{doney2009}835Doney, S.C., Fabry, V.J., Feely, R.A., and Kleypas, J.A. (2009).836Ocean acidification: the other CO$_2$ problem.837\textit{Annual Review of Marine Science}, 1, 169--192.838839\end{thebibliography}840841\end{document}842843844