Path: blob/main/latex-templates/templates/climate-science/temperature_model.tex
51 views
unlisted
% Temperature Model Template1% Topics: Energy balance, radiative forcing, climate sensitivity, feedback analysis2% Style: Research article with model validation34\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 Temperature Modeling: Energy Balance and Climate Sensitivity}21\author{Climate Dynamics Research Group}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This study presents energy balance models for global mean surface temperature,29examining radiative forcing from greenhouse gases and the response of the climate system.30We analyze zero-dimensional and one-dimensional models, calculate climate sensitivity31from different feedback mechanisms, and compare model projections with observations.32The analysis quantifies transient and equilibrium climate response to CO$_2$ forcing.33\end{abstract}3435\section{Introduction}3637Earth's global mean surface temperature is determined by the balance between incoming38solar radiation and outgoing longwave radiation. Perturbations to this balance from39greenhouse gas increases lead to warming until a new equilibrium is reached.4041\begin{definition}[Radiative Forcing]42Radiative forcing $F$ is the change in net radiative flux at the tropopause due to43a change in an external driver. For CO$_2$:44\begin{equation}45F = 5.35 \ln\left(\frac{C}{C_0}\right) \quad \text{W/m}^246\end{equation}47where $C$ is CO$_2$ concentration and $C_0$ is the reference (pre-industrial) value.48\end{definition}4950\section{Theoretical Framework}5152\subsection{Zero-Dimensional Energy Balance}5354\begin{theorem}[Planetary Energy Balance]55The rate of change of Earth's heat content is:56\begin{equation}57C_p \frac{dT}{dt} = F - \lambda \Delta T58\end{equation}59where $C_p$ is heat capacity, $F$ is radiative forcing, $\lambda$ is the climate60feedback parameter, and $\Delta T = T - T_0$ is the temperature anomaly.61\end{theorem}6263\begin{definition}[Climate Sensitivity]64Equilibrium climate sensitivity (ECS) is the warming for doubled CO$_2$:65\begin{equation}66\text{ECS} = \frac{F_{2\times\text{CO}_2}}{\lambda} = \frac{3.7}{\lambda} \quad \text{K}67\end{equation}68With $\lambda \approx 1.2$ W/(m$^2$K), ECS $\approx$ 3 K.69\end{definition}7071\subsection{Climate Feedbacks}7273\begin{theorem}[Feedback Analysis]74The total feedback parameter is the sum of individual feedbacks:75\begin{equation}76\lambda = \lambda_0 + \lambda_{WV} + \lambda_{LR} + \lambda_A + \lambda_C77\end{equation}78where $\lambda_0$ is the Planck response (no feedbacks), and other terms are water79vapor, lapse rate, albedo, and cloud feedbacks.80\end{theorem}8182\begin{remark}[Feedback Values]83Typical feedback values (W m$^{-2}$ K$^{-1}$):84\begin{itemize}85\item Planck (blackbody): $\lambda_0 \approx 3.2$ (negative, stabilizing)86\item Water vapor: $\lambda_{WV} \approx -1.8$ (positive, amplifying)87\item Lapse rate: $\lambda_{LR} \approx 0.6$ (negative)88\item Albedo: $\lambda_A \approx -0.3$ (positive)89\item Cloud: $\lambda_C \approx -0.5$ (positive, uncertain)90\end{itemize}91Net: $\lambda \approx 1.2$ W/(m$^2$K)92\end{remark}9394\subsection{Transient Climate Response}9596\begin{definition}[TCR and ECS]97\begin{itemize}98\item \textbf{Transient Climate Response (TCR)}: Warming at time of CO$_2$ doubling99under 1\%/yr increase ($\sim$70 years)100\item \textbf{Equilibrium Climate Sensitivity (ECS)}: Final equilibrium warming101for doubled CO$_2$102\end{itemize}103Typically TCR/ECS $\approx$ 0.5--0.7 due to ocean heat uptake.104\end{definition}105106\section{Computational Analysis}107108\begin{pycode}109import numpy as np110import matplotlib.pyplot as plt111from scipy.integrate import odeint112113np.random.seed(42)114115# Energy balance model116def ebm_single(T, t, F_func, C_eff, lambda_val):117F = F_func(t)118dTdt = (F - lambda_val * T) / C_eff119return dTdt120121# Two-box model (surface + deep ocean)122def ebm_twobox(y, t, F_func, C_s, C_d, lambda_val, gamma):123T_s, T_d = y124F = F_func(t)125dTs = (F - lambda_val * T_s - gamma * (T_s - T_d)) / C_s126dTd = gamma * (T_s - T_d) / C_d127return [dTs, dTd]128129# Parameters130C_eff = 10.0 # Effective heat capacity (W yr m^-2 K^-1)131C_s = 8.0 # Surface layer132C_d = 100.0 # Deep ocean133lambda_val = 1.2 # Climate feedback (W m^-2 K^-1)134gamma = 0.5 # Ocean heat exchange135136# Forcing scenarios137CO2_pi = 280 # Pre-industrial CO2 (ppm)138139def forcing_step(t):140"""Step doubling of CO2"""141return 3.7 if t > 0 else 0142143def forcing_ramp(t):144"""1%/yr CO2 increase"""145if t < 0:146return 0147elif t < 70:148return 5.35 * np.log(1.01**t)149else:150return 5.35 * np.log(2)151152def forcing_historical(t):153"""Simplified historical forcing"""154if t < 1850:155return 0156elif t < 2020:157CO2 = 280 * np.exp(0.004 * (t - 1850))158return 5.35 * np.log(CO2 / 280)159else:160return 3.0161162def forcing_rcp(t, scenario='4.5'):163"""RCP scenario forcing"""164F_2020 = 3.0165if t < 2020:166return forcing_historical(t)167if scenario == '2.6':168return F_2020 + 0.5 * (1 - np.exp(-0.05 * (t - 2020)))169elif scenario == '4.5':170return F_2020 + 1.5 * (1 - np.exp(-0.03 * (t - 2020)))171else: # 8.5172return F_2020 + 0.08 * (t - 2020)173174# Time arrays175t_step = np.linspace(-10, 200, 500)176t_ramp = np.linspace(-10, 140, 500)177t_hist = np.linspace(1850, 2100, 251)178179# Solve step response180T_step = odeint(ebm_single, 0, t_step, args=(forcing_step, C_eff, lambda_val))[:, 0]181y0_2box = [0, 0]182T_2box_step = odeint(ebm_twobox, y0_2box, t_step,183args=(forcing_step, C_s, C_d, lambda_val, gamma))184185# Solve ramp response186T_ramp = odeint(ebm_single, 0, t_ramp, args=(forcing_ramp, C_eff, lambda_val))[:, 0]187T_2box_ramp = odeint(ebm_twobox, y0_2box, t_ramp,188args=(forcing_ramp, C_s, C_d, lambda_val, gamma))189190# Historical simulation191T_hist = odeint(ebm_single, 0, t_hist,192args=(lambda t: forcing_historical(t), C_eff, lambda_val))[:, 0]193194# RCP scenarios195T_rcp26 = odeint(ebm_single, 0, t_hist,196args=(lambda t: forcing_rcp(t, '2.6'), C_eff, lambda_val))[:, 0]197T_rcp45 = odeint(ebm_single, 0, t_hist,198args=(lambda t: forcing_rcp(t, '4.5'), C_eff, lambda_val))[:, 0]199T_rcp85 = odeint(ebm_single, 0, t_hist,200args=(lambda t: forcing_rcp(t, '8.5'), C_eff, lambda_val))[:, 0]201202# Climate sensitivity calculation203ECS = 3.7 / lambda_val204TCR = T_ramp[np.argmin(np.abs(t_ramp - 70))]205206# Feedback analysis207lambda_0 = 3.2 # Planck208lambda_wv = -1.8 # Water vapor209lambda_lr = 0.6 # Lapse rate210lambda_a = -0.3 # Albedo211lambda_c = -0.5 # Cloud212feedbacks = {213'Planck': lambda_0,214'Water vapor': lambda_wv,215'Lapse rate': lambda_lr,216'Albedo': lambda_a,217'Cloud': lambda_c218}219lambda_total = sum(feedbacks.values())220221# ECS uncertainty range222lambda_range = np.linspace(0.8, 2.0, 100)223ECS_range = 3.7 / lambda_range224225# Create figure226fig = plt.figure(figsize=(14, 12))227228# Plot 1: Step response229ax1 = fig.add_subplot(3, 3, 1)230ax1.plot(t_step, T_step, 'b-', linewidth=2, label='1-box')231ax1.plot(t_step, T_2box_step[:, 0], 'r-', linewidth=2, label='2-box surface')232ax1.plot(t_step, T_2box_step[:, 1], 'r--', linewidth=1.5, label='2-box deep')233ax1.axhline(y=ECS, color='gray', linestyle='--', alpha=0.7, label=f'ECS = {ECS:.1f} K')234ax1.set_xlabel('Time (years)')235ax1.set_ylabel('$\\Delta T$ (K)')236ax1.set_title('Step Response (2xCO$_2$)')237ax1.legend(fontsize=7)238ax1.set_xlim([-10, 200])239240# Plot 2: Ramp response241ax2 = fig.add_subplot(3, 3, 2)242ax2.plot(t_ramp, T_ramp, 'b-', linewidth=2, label='Temperature')243forcing_ramp_arr = np.array([forcing_ramp(t) for t in t_ramp])244ax2_twin = ax2.twinx()245ax2_twin.plot(t_ramp, forcing_ramp_arr, 'r--', linewidth=1.5, label='Forcing')246ax2.axvline(x=70, color='gray', linestyle=':', alpha=0.7)247ax2.scatter([70], [TCR], s=100, c='green', zorder=5, label=f'TCR = {TCR:.2f} K')248ax2.set_xlabel('Time (years)')249ax2.set_ylabel('$\\Delta T$ (K)', color='b')250ax2_twin.set_ylabel('Forcing (W/m$^2$)', color='r')251ax2.set_title('1\\%/yr CO$_2$ Increase')252ax2.legend(fontsize=8, loc='upper left')253254# Plot 3: Historical + projections255ax3 = fig.add_subplot(3, 3, 3)256ax3.plot(t_hist, T_hist, 'k-', linewidth=2, label='Historical')257ax3.plot(t_hist, T_rcp26, 'g-', linewidth=2, label='RCP 2.6')258ax3.plot(t_hist, T_rcp45, 'b-', linewidth=2, label='RCP 4.5')259ax3.plot(t_hist, T_rcp85, 'r-', linewidth=2, label='RCP 8.5')260ax3.axhline(y=1.5, color='orange', linestyle=':', label='1.5 K')261ax3.axhline(y=2.0, color='red', linestyle=':', label='2.0 K')262ax3.set_xlabel('Year')263ax3.set_ylabel('$\\Delta T$ (K)')264ax3.set_title('Temperature Projections')265ax3.legend(fontsize=7, loc='upper left')266267# Plot 4: Feedback analysis268ax4 = fig.add_subplot(3, 3, 4)269names = list(feedbacks.keys())270values = list(feedbacks.values())271colors = ['gray', 'blue', 'cyan', 'orange', 'purple']272bars = ax4.barh(names, values, color=colors)273ax4.axvline(x=0, color='black', linewidth=0.5)274ax4.set_xlabel('Feedback (W m$^{-2}$ K$^{-1}$)')275ax4.set_title(f'Feedback Components ($\\lambda_{{total}}$ = {lambda_total:.1f})')276277# Plot 5: ECS distribution278ax5 = fig.add_subplot(3, 3, 5)279ax5.plot(lambda_range, ECS_range, 'b-', linewidth=2)280ax5.axhline(y=3.0, color='red', linestyle='--', alpha=0.7, label='Best estimate')281ax5.fill_between([1.0, 1.5], 0, 6, alpha=0.2, color='green', label='Likely range')282ax5.set_xlabel('$\\lambda$ (W m$^{-2}$ K$^{-1}$)')283ax5.set_ylabel('ECS (K)')284ax5.set_title('ECS vs Feedback Parameter')285ax5.legend(fontsize=8)286ax5.set_ylim([0, 6])287288# Plot 6: Warming rate289ax6 = fig.add_subplot(3, 3, 6)290dT_dt = np.diff(T_hist) / np.diff(t_hist)291ax6.plot(t_hist[1:], dT_dt * 10, 'b-', linewidth=1.5) # per decade292ax6.set_xlabel('Year')293ax6.set_ylabel('Warming rate (K/decade)')294ax6.set_title('Rate of Temperature Change')295296# Plot 7: Ocean heat uptake297ax7 = fig.add_subplot(3, 3, 7)298ax7.plot(t_step, T_2box_step[:, 0] - T_2box_step[:, 1], 'purple', linewidth=2)299ax7.set_xlabel('Time (years)')300ax7.set_ylabel('$T_s - T_d$ (K)')301ax7.set_title('Surface-Deep Ocean Temperature Difference')302303# Plot 8: Forcing components304ax8 = fig.add_subplot(3, 3, 8)305# Different forcing agents (simplified)306t_forcing = np.linspace(1850, 2020, 100)307CO2_forcing = 5.35 * np.log(280 * np.exp(0.004 * (t_forcing - 1850)) / 280)308CH4_forcing = 0.3 * (1 - np.exp(-0.01 * (t_forcing - 1850)))309aerosol_forcing = -0.5 * (1 - np.exp(-0.02 * (t_forcing - 1850)))310ax8.plot(t_forcing, CO2_forcing, 'r-', linewidth=2, label='CO$_2$')311ax8.plot(t_forcing, CH4_forcing, 'g-', linewidth=2, label='CH$_4$')312ax8.plot(t_forcing, aerosol_forcing, 'b-', linewidth=2, label='Aerosols')313ax8.plot(t_forcing, CO2_forcing + CH4_forcing + aerosol_forcing, 'k--',314linewidth=2, label='Total')315ax8.set_xlabel('Year')316ax8.set_ylabel('Forcing (W/m$^2$)')317ax8.set_title('Radiative Forcing Components')318ax8.legend(fontsize=8)319320# Plot 9: Energy imbalance321ax9 = fig.add_subplot(3, 3, 9)322F_arr = np.array([forcing_historical(t) for t in t_hist])323N = F_arr - lambda_val * T_hist # Net energy imbalance324ax9.plot(t_hist, N, 'b-', linewidth=2)325ax9.axhline(y=0, color='black', linewidth=0.5)326ax9.set_xlabel('Year')327ax9.set_ylabel('N (W/m$^2$)')328ax9.set_title('Planetary Energy Imbalance')329ax9.fill_between(t_hist, 0, N, where=N > 0, alpha=0.3, color='red', label='Heating')330ax9.legend(fontsize=8)331332plt.tight_layout()333plt.savefig('temperature_model_analysis.pdf', dpi=150, bbox_inches='tight')334plt.close()335336# Key results337T_2020 = T_hist[np.argmin(np.abs(t_hist - 2020))]338T_2100_rcp45 = T_rcp45[-1]339\end{pycode}340341\begin{figure}[htbp]342\centering343\includegraphics[width=\textwidth]{temperature_model_analysis.pdf}344\caption{Climate temperature modeling: (a) Step response to CO$_2$ doubling; (b) Ramp345response showing TCR; (c) Historical and projected temperatures; (d) Feedback component346analysis; (e) ECS dependence on feedback parameter; (f) Warming rate over time;347(g) Ocean heat uptake dynamics; (h) Radiative forcing components; (i) Planetary energy348imbalance.}349\label{fig:temperature}350\end{figure}351352\section{Results}353354\subsection{Climate Sensitivity}355356\begin{pycode}357print(r"\begin{table}[htbp]")358print(r"\centering")359print(r"\caption{Climate Sensitivity Parameters}")360print(r"\begin{tabular}{lcc}")361print(r"\toprule")362print(r"Parameter & Value & Units \\")363print(r"\midrule")364print(f"Feedback parameter $\\lambda$ & {lambda_val} & W m$^{{-2}}$ K$^{{-1}}$ \\\\")365print(f"Equilibrium Climate Sensitivity & {ECS:.1f} & K \\\\")366print(f"Transient Climate Response & {TCR:.2f} & K \\\\")367print(f"TCR/ECS ratio & {TCR/ECS:.2f} & --- \\\\")368print(r"\bottomrule")369print(r"\end{tabular}")370print(r"\label{tab:sensitivity}")371print(r"\end{table}")372\end{pycode}373374\subsection{Temperature Projections}375376\begin{pycode}377print(r"\begin{table}[htbp]")378print(r"\centering")379print(r"\caption{Projected Temperature Changes}")380print(r"\begin{tabular}{lcc}")381print(r"\toprule")382print(r"Scenario & 2100 $\Delta T$ (K) & Exceeds 2 K? \\")383print(r"\midrule")384print(f"RCP 2.6 & {T_rcp26[-1]:.1f} & {'No' if T_rcp26[-1] < 2 else 'Yes'} \\\\")385print(f"RCP 4.5 & {T_rcp45[-1]:.1f} & {'No' if T_rcp45[-1] < 2 else 'Yes'} \\\\")386print(f"RCP 8.5 & {T_rcp85[-1]:.1f} & {'No' if T_rcp85[-1] < 2 else 'Yes'} \\\\")387print(r"\bottomrule")388print(r"\end{tabular}")389print(r"\label{tab:projections}")390print(r"\end{table}")391\end{pycode}392393\section{Discussion}394395\begin{example}[Equilibrium vs Transient Response]396The TCR of $\py{f"{TCR:.2f}"}$ K is smaller than the ECS of $\py{f"{ECS:.1f}"}$ K because397the deep ocean absorbs heat. The ratio TCR/ECS = $\py{f"{TCR/ECS:.2f}"}$ indicates that398only $\sim$\py{f"{TCR/ECS*100:.0f}"}\% of equilibrium warming is realized at the time399of CO$_2$ doubling.400\end{example}401402\begin{remark}[Feedback Uncertainty]403Cloud feedback remains the largest source of uncertainty in ECS estimates. Positive404cloud feedback (reduced low clouds with warming) increases ECS, while negative feedback405decreases it. Current estimates range from $-0.2$ to $-1.2$ W m$^{-2}$ K$^{-1}$.406\end{remark}407408\begin{example}[Committed Warming]409Even if emissions stop, warming continues due to:410\begin{itemize}411\item Ocean thermal inertia (decades to equilibrate)412\item Reduction in aerosol cooling (immediate)413\item Carbon cycle feedbacks (decades to centuries)414\end{itemize}415This "committed warming" adds $\sim$0.5 K to current warming.416\end{example}417418\section{Conclusions}419420This temperature modeling analysis demonstrates:421\begin{enumerate}422\item ECS is $\py{f"{ECS:.1f}"}$ K with feedback parameter $\lambda = \py{f"{lambda_val}"}$ W m$^{-2}$ K$^{-1}$423\item TCR is $\py{f"{TCR:.2f}"}$ K, approximately \py{f"{TCR/ECS*100:.0f}"}\% of ECS424\item Current warming is $\sim$\py{f"{T_2020:.1f}"} K above pre-industrial425\item RCP 4.5 projects $\py{f"{T_2100_rcp45:.1f}"}$ K warming by 2100426\item Water vapor and cloud feedbacks dominate sensitivity uncertainty427\end{enumerate}428429\section*{Further Reading}430431\begin{itemize}432\item Hartmann, D.L. \textit{Global Physical Climatology}, 2nd ed. Elsevier, 2016.433\item Held, I.M. \& Soden, B.J. Water vapor feedback and global warming. \textit{Annu. Rev. Energy Environ.} 25, 441--475, 2000.434\item Sherwood, S.C. et al. An assessment of Earth's climate sensitivity using multiple lines of evidence. \textit{Rev. Geophys.} 58, e2019RG000678, 2020.435\end{itemize}436437\end{document}438439440