Path: blob/main/latex-templates/templates/climate-science/carbon_cycle.tex
51 views
unlisted
% Carbon Cycle Model Template1% Topics: Box models, carbon reservoirs, anthropogenic perturbation, feedback loops2% Style: Technical report with policy implications34\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{Global Carbon Cycle Modeling: Reservoirs, Fluxes, and Anthropogenic Perturbation}21\author{Earth System Science Research}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This technical report presents a comprehensive analysis of the global carbon cycle using29box models to represent carbon exchange between atmosphere, ocean, and terrestrial biosphere.30We examine natural carbon fluxes, anthropogenic emissions, and the resulting changes in31atmospheric CO$_2$ concentration. The model explores the airborne fraction of emissions,32ocean uptake dynamics, and climate-carbon feedbacks. Projections under different emission33scenarios illustrate the long-term implications for atmospheric carbon levels.34\end{abstract}3536\section{Introduction}3738The global carbon cycle plays a central role in Earth's climate system. Anthropogenic39emissions have perturbed this cycle, leading to rising atmospheric CO$_2$ concentrations40and associated climate change.4142\begin{definition}[Carbon Reservoirs]43The major carbon reservoirs are:44\begin{itemize}45\item \textbf{Atmosphere}: $\sim$850 PgC (pre-industrial: 590 PgC)46\item \textbf{Ocean}: $\sim$38,000 PgC (surface + deep)47\item \textbf{Terrestrial biosphere}: $\sim$2,000 PgC (vegetation + soil)48\item \textbf{Fossil fuels}: $\sim$4,000 PgC49\end{itemize}50(1 PgC = $10^{15}$ g carbon = 1 GtC)51\end{definition}5253\section{Theoretical Framework}5455\subsection{Box Model Equations}5657\begin{theorem}[Three-Box Carbon Cycle Model]58The evolution of carbon in atmosphere ($C_A$), surface ocean ($C_O$), and biosphere ($C_B$) is:59\begin{align}60\frac{dC_A}{dt} &= -k_{AO}(C_A - C_A^{eq}) - k_{AB}(C_A - C_A^{eq}) + E(t) \\61\frac{dC_O}{dt} &= k_{AO}(C_A - C_A^{eq}) - k_{OD}(C_O - C_O^{eq}) \\62\frac{dC_B}{dt} &= k_{AB}(C_A - C_A^{eq}) - k_{BR}C_B63\end{align}64where $k$ values are exchange coefficients and $E(t)$ is anthropogenic emission.65\end{theorem}6667\subsection{CO$_2$ Concentration and Carbon Mass}6869\begin{definition}[Conversion Factors]70Atmospheric CO$_2$ concentration (ppm) relates to carbon mass (PgC):71\begin{equation}72C_A \text{ (PgC)} = \frac{\text{CO}_2 \text{ (ppm)}}{2.13}73\end{equation}74Thus 1 ppm CO$_2 \approx 2.13$ PgC.75\end{definition}7677\subsection{Airborne Fraction}7879\begin{definition}[Airborne Fraction]80The fraction of anthropogenic emissions remaining in the atmosphere:81\begin{equation}82f_{airborne} = \frac{\Delta C_A}{\sum E(t)}83\end{equation}84Currently $f_{airborne} \approx 0.44$ (the ocean and biosphere absorb $\sim$56\%).85\end{definition}8687\begin{remark}[Ocean Chemistry]88Ocean CO$_2$ uptake is limited by the Revelle factor:89\begin{equation}90R = \frac{\Delta[\text{CO}_2]/[\text{CO}_2]}{\Delta\text{DIC}/\text{DIC}} \approx 1091\end{equation}92Only 1/R of absorbed CO$_2$ remains as dissolved CO$_2$; the rest converts to bicarbonate.93\end{remark}9495\section{Computational Analysis}9697\begin{pycode}98import numpy as np99import matplotlib.pyplot as plt100from scipy.integrate import odeint101102np.random.seed(42)103104# Carbon cycle box model105def carbon_cycle(y, t, params, emission_func):106C_A, C_O, C_B = y107k_AO, k_AB, k_OD, k_BR, C_A_eq, C_O_eq = params108109E = emission_func(t)110111dC_A = -k_AO * (C_A - C_A_eq) - k_AB * (C_A - C_A_eq) + E112dC_O = k_AO * (C_A - C_A_eq) - k_OD * (C_O - C_O_eq)113dC_B = k_AB * (C_A - C_A_eq) - k_BR * C_B114115return [dC_A, dC_O, dC_B]116117# Parameters (based on simplified IPCC values)118k_AO = 0.1 # Atmosphere-ocean exchange (1/yr)119k_AB = 0.05 # Atmosphere-biosphere exchange (1/yr)120k_OD = 0.01 # Surface-deep ocean exchange (1/yr)121k_BR = 0.02 # Biosphere respiration (1/yr)122C_A_eq = 590 # Pre-industrial atmospheric C (PgC)123C_O_eq = 1000 # Surface ocean equilibrium (PgC)124params = (k_AO, k_AB, k_OD, k_BR, C_A_eq, C_O_eq)125126# Initial conditions (year 1850)127C_A_0 = 590 # PgC128C_O_0 = 1000 # PgC129C_B_0 = 550 # PgC130y0 = [C_A_0, C_O_0, C_B_0]131132# Emission scenarios133def emissions_historical(t):134# Simplified historical emissions (PgC/yr)135if t < 1900:136return 0.5 * np.exp(0.02 * (t - 1850))137elif t < 2000:138return 1.0 * np.exp(0.025 * (t - 1900))139else:140return 10.0141142def emissions_rcp26(t):143# RCP 2.6 - aggressive mitigation144if t < 2020:145return emissions_historical(t)146elif t < 2050:147return 10.0 * (1 - 0.8 * (t - 2020) / 30)148else:149return 2.0 * np.exp(-0.05 * (t - 2050))150151def emissions_rcp45(t):152# RCP 4.5 - moderate mitigation153if t < 2040:154return emissions_historical(t) if t < 2020 else 10.0 + 0.05 * (t - 2020)155elif t < 2080:156return 11.0 - 0.2 * (t - 2040)157else:158return 3.0159160def emissions_rcp85(t):161# RCP 8.5 - business as usual162if t < 2020:163return emissions_historical(t)164else:165return 10.0 * np.exp(0.01 * (t - 2020))166167# Time arrays168t_hist = np.linspace(1850, 2020, 171)169t_proj = np.linspace(2020, 2100, 81)170t_full = np.linspace(1850, 2100, 251)171172# Solve for historical period173sol_hist = odeint(carbon_cycle, y0, t_hist, args=(params, emissions_historical))174175# Solve for different scenarios176y0_2020 = sol_hist[-1]177sol_rcp26 = odeint(carbon_cycle, y0_2020, t_proj, args=(params, emissions_rcp26))178sol_rcp45 = odeint(carbon_cycle, y0_2020, t_proj, args=(params, emissions_rcp45))179sol_rcp85 = odeint(carbon_cycle, y0_2020, t_proj, args=(params, emissions_rcp85))180181# Convert to CO2 concentration (ppm)182ppm_conversion = 2.13183CO2_hist = sol_hist[:, 0] / ppm_conversion184CO2_rcp26 = sol_rcp26[:, 0] / ppm_conversion185CO2_rcp45 = sol_rcp45[:, 0] / ppm_conversion186CO2_rcp85 = sol_rcp85[:, 0] / ppm_conversion187188# Calculate cumulative emissions189cumulative_hist = np.cumsum([emissions_historical(t) for t in t_hist]) * (t_hist[1] - t_hist[0])190191# Calculate airborne fraction192delta_C_A = sol_hist[-1, 0] - C_A_0193airborne_fraction = delta_C_A / cumulative_hist[-1]194195# Ocean and land uptake196ocean_uptake = sol_hist[:, 1] - C_O_0197land_uptake = sol_hist[:, 2] - C_B_0198199# Create annual emissions array200emissions_array_hist = np.array([emissions_historical(t) for t in t_hist])201emissions_rcp26_arr = np.array([emissions_rcp26(t) for t in t_proj])202emissions_rcp45_arr = np.array([emissions_rcp45(t) for t in t_proj])203emissions_rcp85_arr = np.array([emissions_rcp85(t) for t in t_proj])204205# Create figure206fig = plt.figure(figsize=(14, 12))207208# Plot 1: Historical CO2 concentration209ax1 = fig.add_subplot(3, 3, 1)210ax1.plot(t_hist, CO2_hist, 'b-', linewidth=2)211ax1.axhline(y=280, color='gray', linestyle='--', alpha=0.7, label='Pre-industrial')212ax1.set_xlabel('Year')213ax1.set_ylabel('CO$_2$ (ppm)')214ax1.set_title('Historical Atmospheric CO$_2$')215ax1.legend(fontsize=8)216217# Plot 2: Emission scenarios218ax2 = fig.add_subplot(3, 3, 2)219ax2.plot(t_hist, emissions_array_hist, 'k-', linewidth=2, label='Historical')220ax2.plot(t_proj, emissions_rcp26_arr, 'g-', linewidth=2, label='RCP 2.6')221ax2.plot(t_proj, emissions_rcp45_arr, 'b-', linewidth=2, label='RCP 4.5')222ax2.plot(t_proj, emissions_rcp85_arr, 'r-', linewidth=2, label='RCP 8.5')223ax2.set_xlabel('Year')224ax2.set_ylabel('Emissions (PgC/yr)')225ax2.set_title('CO$_2$ Emission Scenarios')226ax2.legend(fontsize=8)227228# Plot 3: Projected CO2 concentrations229ax3 = fig.add_subplot(3, 3, 3)230ax3.plot(t_hist, CO2_hist, 'k-', linewidth=2, label='Historical')231ax3.plot(t_proj, CO2_rcp26, 'g-', linewidth=2, label='RCP 2.6')232ax3.plot(t_proj, CO2_rcp45, 'b-', linewidth=2, label='RCP 4.5')233ax3.plot(t_proj, CO2_rcp85, 'r-', linewidth=2, label='RCP 8.5')234ax3.axhline(y=450, color='orange', linestyle=':', alpha=0.7)235ax3.set_xlabel('Year')236ax3.set_ylabel('CO$_2$ (ppm)')237ax3.set_title('Projected CO$_2$ Concentrations')238ax3.legend(fontsize=8)239240# Plot 4: Carbon reservoir changes241ax4 = fig.add_subplot(3, 3, 4)242ax4.plot(t_hist, sol_hist[:, 0] - C_A_0, 'r-', linewidth=2, label='Atmosphere')243ax4.plot(t_hist, ocean_uptake, 'b-', linewidth=2, label='Ocean')244ax4.plot(t_hist, land_uptake, 'g-', linewidth=2, label='Land')245ax4.set_xlabel('Year')246ax4.set_ylabel('$\\Delta$C (PgC)')247ax4.set_title('Carbon Reservoir Changes')248ax4.legend(fontsize=8)249250# Plot 5: Cumulative emissions and uptake251ax5 = fig.add_subplot(3, 3, 5)252ax5.fill_between(t_hist, 0, cumulative_hist, alpha=0.3, label='Total emissions')253ax5.plot(t_hist, sol_hist[:, 0] - C_A_0, 'r-', linewidth=2, label='Atmosphere')254ax5.set_xlabel('Year')255ax5.set_ylabel('Cumulative C (PgC)')256ax5.set_title(f'Airborne Fraction = {airborne_fraction:.2f}')257ax5.legend(fontsize=8)258259# Plot 6: Sink efficiency over time260ax6 = fig.add_subplot(3, 3, 6)261cumsum = np.cumsum(emissions_array_hist)262atm_increase = sol_hist[:, 0] - C_A_0263cumsum[cumsum == 0] = 1 # Avoid division by zero264airborne_time = atm_increase / cumsum265ax6.plot(t_hist[10:], airborne_time[10:], 'purple', linewidth=2)266ax6.axhline(y=0.5, color='gray', linestyle='--', alpha=0.7)267ax6.set_xlabel('Year')268ax6.set_ylabel('Airborne fraction')269ax6.set_title('Sink Efficiency Over Time')270ax6.set_ylim([0.3, 0.7])271272# Plot 7: CO2 growth rate273ax7 = fig.add_subplot(3, 3, 7)274growth_rate = np.diff(CO2_hist) / np.diff(t_hist)275ax7.plot(t_hist[1:], growth_rate, 'b-', linewidth=1.5)276ax7.set_xlabel('Year')277ax7.set_ylabel('CO$_2$ growth (ppm/yr)')278ax7.set_title('Atmospheric CO$_2$ Growth Rate')279280# Plot 8: Temperature proxy (simplified)281ax8 = fig.add_subplot(3, 3, 8)282# Climate sensitivity ~3 K per doubling283ECS = 3.0 # K284dT_hist = ECS * np.log(CO2_hist / 280) / np.log(2)285dT_rcp26 = ECS * np.log(CO2_rcp26 / 280) / np.log(2)286dT_rcp45 = ECS * np.log(CO2_rcp45 / 280) / np.log(2)287dT_rcp85 = ECS * np.log(CO2_rcp85 / 280) / np.log(2)288ax8.plot(t_hist, dT_hist, 'k-', linewidth=2, label='Historical')289ax8.plot(t_proj, dT_rcp26, 'g-', linewidth=2, label='RCP 2.6')290ax8.plot(t_proj, dT_rcp45, 'b-', linewidth=2, label='RCP 4.5')291ax8.plot(t_proj, dT_rcp85, 'r-', linewidth=2, label='RCP 8.5')292ax8.axhline(y=1.5, color='orange', linestyle=':', label='1.5 K target')293ax8.axhline(y=2.0, color='red', linestyle=':', label='2.0 K limit')294ax8.set_xlabel('Year')295ax8.set_ylabel('$\\Delta T$ (K)')296ax8.set_title('Implied Temperature Change')297ax8.legend(fontsize=7)298299# Plot 9: Carbon budget300ax9 = fig.add_subplot(3, 3, 9)301budget_15 = 420 # PgC remaining for 1.5 K302budget_20 = 1170 # PgC remaining for 2.0 K303emissions_cum_proj = np.cumsum(emissions_rcp45_arr) * (t_proj[1] - t_proj[0])304ax9.bar(['1.5 K', '2.0 K'], [budget_15, budget_20], color=['orange', 'red'], alpha=0.7)305ax9.axhline(y=emissions_cum_proj[-1], color='blue', linestyle='--',306label=f'RCP 4.5 emissions: {emissions_cum_proj[-1]:.0f} PgC')307ax9.set_ylabel('Carbon budget (PgC)')308ax9.set_title('Remaining Carbon Budget')309ax9.legend(fontsize=8)310311plt.tight_layout()312plt.savefig('carbon_cycle_analysis.pdf', dpi=150, bbox_inches='tight')313plt.close()314315# Final values316CO2_2020 = CO2_hist[-1]317CO2_2100_rcp26 = CO2_rcp26[-1]318CO2_2100_rcp85 = CO2_rcp85[-1]319\end{pycode}320321\begin{figure}[htbp]322\centering323\includegraphics[width=\textwidth]{carbon_cycle_analysis.pdf}324\caption{Global carbon cycle analysis: (a) Historical CO$_2$ rise; (b) Emission scenarios;325(c) Projected CO$_2$ concentrations; (d) Carbon reservoir changes; (e) Cumulative emissions326and airborne fraction; (f) Sink efficiency evolution; (g) CO$_2$ growth rate; (h) Implied327temperature change; (i) Remaining carbon budget for climate targets.}328\label{fig:carbon}329\end{figure}330331\section{Results}332333\subsection{Model Parameters}334335\begin{pycode}336print(r"\begin{table}[htbp]")337print(r"\centering")338print(r"\caption{Carbon Cycle Model Parameters}")339print(r"\begin{tabular}{lcc}")340print(r"\toprule")341print(r"Parameter & Value & Units \\")342print(r"\midrule")343print(f"Atmosphere-ocean exchange & {k_AO} & yr$^{{-1}}$ \\\\")344print(f"Atmosphere-biosphere exchange & {k_AB} & yr$^{{-1}}$ \\\\")345print(f"Surface-deep ocean exchange & {k_OD} & yr$^{{-1}}$ \\\\")346print(f"Biosphere respiration & {k_BR} & yr$^{{-1}}$ \\\\")347print(f"Pre-industrial CO$_2$ & {C_A_eq/ppm_conversion:.0f} & ppm \\\\")348print(r"\bottomrule")349print(r"\end{tabular}")350print(r"\label{tab:parameters}")351print(r"\end{table}")352\end{pycode}353354\subsection{Scenario Projections}355356\begin{pycode}357print(r"\begin{table}[htbp]")358print(r"\centering")359print(r"\caption{Projected CO$_2$ Concentrations in 2100}")360print(r"\begin{tabular}{lcc}")361print(r"\toprule")362print(r"Scenario & CO$_2$ (ppm) & $\Delta T$ (K) \\")363print(r"\midrule")364print(f"RCP 2.6 & {CO2_2100_rcp26:.0f} & {ECS * np.log(CO2_2100_rcp26/280)/np.log(2):.1f} \\\\")365print(f"RCP 4.5 & {CO2_rcp45[-1]:.0f} & {ECS * np.log(CO2_rcp45[-1]/280)/np.log(2):.1f} \\\\")366print(f"RCP 8.5 & {CO2_2100_rcp85:.0f} & {ECS * np.log(CO2_2100_rcp85/280)/np.log(2):.1f} \\\\")367print(r"\bottomrule")368print(r"\end{tabular}")369print(r"\label{tab:projections}")370print(r"\end{table}")371\end{pycode}372373\section{Discussion}374375\begin{example}[Airborne Fraction]376The airborne fraction of $\py{f"{airborne_fraction:.2f}"}$ means that about \py{f"{(1-airborne_fraction)*100:.0f}"}\%377of emitted carbon is absorbed by natural sinks. The ocean absorbs $\sim$25\% and the378land biosphere $\sim$30\%.379\end{example}380381\begin{remark}[Climate-Carbon Feedbacks]382This simple model neglects important feedbacks:383\begin{itemize}384\item \textbf{Ocean warming}: Reduces CO$_2$ solubility385\item \textbf{Permafrost thaw}: Releases stored carbon386\item \textbf{Forest dieback}: Amazon could become a source387\item \textbf{Ocean acidification}: Reduces carbonate buffering388\end{itemize}389These feedbacks would increase the airborne fraction.390\end{remark}391392\section{Conclusions}393394This carbon cycle analysis demonstrates:395\begin{enumerate}396\item Current CO$_2$ concentration is $\sim$\py{f"{CO2_2020:.0f}"} ppm (2020)397\item Airborne fraction is $\py{f"{airborne_fraction:.2f}"}$398\item RCP 8.5 leads to $\sim$\py{f"{CO2_2100_rcp85:.0f}"} ppm by 2100399\item Only RCP 2.6 scenario keeps warming below 2 K400\item Carbon budget for 1.5 K target is rapidly depleting401\end{enumerate}402403\section*{Further Reading}404405\begin{itemize}406\item IPCC. \textit{Climate Change 2021: The Physical Science Basis}. Cambridge, 2021.407\item Archer, D. \textit{The Global Carbon Cycle}. Princeton University Press, 2010.408\item Sarmiento, J.L. \& Gruber, N. \textit{Ocean Biogeochemical Dynamics}. Princeton, 2006.409\end{itemize}410411\end{document}412413414