Path: blob/main/latex-templates/templates/atmospheric-science/atmospheric_dynamics.tex
75 views
unlisted
\documentclass[11pt,a4paper]{article}1\usepackage[utf8]{inputenc}2\usepackage[T1]{fontenc}3\usepackage{amsmath,amssymb}4\usepackage{graphicx}5\usepackage{booktabs}6\usepackage{siunitx}7\usepackage{geometry}8\geometry{margin=1in}9\usepackage{pythontex}10\usepackage{hyperref}11\usepackage{float}1213\title{Atmospheric Dynamics\\Geostrophic Wind and Thermal Balance}14\author{Department of Atmospheric Sciences}15\date{\today}1617\begin{document}18\maketitle1920\begin{abstract}21Analysis of atmospheric dynamics including geostrophic balance, thermal wind, and jet stream formation.22\end{abstract}232425\section{Introduction}2627Atmospheric dynamics governs weather and climate through pressure, temperature, and wind relationships.2829\begin{pycode}30import numpy as np31import matplotlib.pyplot as plt32plt.rcParams['text.usetex'] = True33plt.rcParams['font.family'] = 'serif'3435# Constants36Omega = 7.292e-5 # Earth rotation rate37R = 287 # Gas constant for air38g = 9.81 # Gravity39\end{pycode}4041\section{Geostrophic Wind}4243$u_g = -\frac{1}{f\rho}\frac{\partial p}{\partial y}$, $v_g = \frac{1}{f\rho}\frac{\partial p}{\partial x}$4445\begin{pycode}46lat = np.linspace(10, 80, 100)47f = 2 * Omega * np.sin(np.radians(lat))4849# Pressure gradient (typical mid-latitude)50dp_dy = 1e-3 # Pa/m51rho = 1.2 # kg/m^35253u_g = -dp_dy / (f * rho)5455fig, ax = plt.subplots(figsize=(10, 6))56ax.plot(lat, u_g, 'b-', linewidth=2)57ax.set_xlabel('Latitude (degrees)')58ax.set_ylabel('Geostrophic Wind Speed (m/s)')59ax.set_title('Geostrophic Wind vs Latitude')60ax.grid(True, alpha=0.3)61plt.tight_layout()62plt.savefig('geostrophic_wind.pdf', dpi=150, bbox_inches='tight')63plt.close()64\end{pycode}6566\begin{figure}[H]67\centering68\includegraphics[width=0.85\textwidth]{geostrophic_wind.pdf}69\caption{Geostrophic wind speed dependence on latitude.}70\end{figure}7172\section{Thermal Wind}7374\begin{pycode}75p_levels = np.array([1000, 850, 700, 500, 300, 200])76T_profile = np.array([288, 278, 268, 253, 228, 218])7778# Temperature gradient79dT_dy = -2e-6 # K/m (typical)80phi = 45 # Latitude81f_45 = 2 * Omega * np.sin(np.radians(phi))8283# Thermal wind shear84du_dz = -(g / (f_45 * T_profile)) * dT_dy85z = np.array([0, 1.5, 3, 5.5, 9, 12]) # km8687fig, ax = plt.subplots(figsize=(10, 6))88ax.plot(du_dz * 1000, z, 'b-o', linewidth=1.5, markersize=8)89ax.set_xlabel('Wind Shear (m/s per km)')90ax.set_ylabel('Altitude (km)')91ax.set_title('Thermal Wind Shear Profile')92ax.grid(True, alpha=0.3)93plt.tight_layout()94plt.savefig('thermal_wind.pdf', dpi=150, bbox_inches='tight')95plt.close()96\end{pycode}9798\begin{figure}[H]99\centering100\includegraphics[width=0.85\textwidth]{thermal_wind.pdf}101\caption{Thermal wind shear as function of altitude.}102\end{figure}103104\section{Rossby Number}105106$Ro = \frac{U}{fL}$107108\begin{pycode}109U = 10 # Typical wind speed m/s110L = np.logspace(3, 7, 100) # Length scales111112Ro_30 = U / (2 * Omega * np.sin(np.radians(30)) * L)113Ro_60 = U / (2 * Omega * np.sin(np.radians(60)) * L)114115fig, ax = plt.subplots(figsize=(10, 6))116ax.loglog(L/1000, Ro_30, label='30$^\\circ$N', linewidth=1.5)117ax.loglog(L/1000, Ro_60, label='60$^\\circ$N', linewidth=1.5)118ax.axhline(y=1, color='r', linestyle='--', label='Ro = 1')119ax.set_xlabel('Length Scale (km)')120ax.set_ylabel('Rossby Number')121ax.set_title('Rossby Number vs Length Scale')122ax.legend()123ax.grid(True, alpha=0.3, which='both')124plt.tight_layout()125plt.savefig('rossby_number.pdf', dpi=150, bbox_inches='tight')126plt.close()127\end{pycode}128129\begin{figure}[H]130\centering131\includegraphics[width=0.85\textwidth]{rossby_number.pdf}132\caption{Rossby number for different latitudes and scales.}133\end{figure}134135\section{Jet Stream}136137\begin{pycode}138lat_jet = np.linspace(20, 70, 100)139z_jet = np.linspace(0, 15, 50)140LAT, Z = np.meshgrid(lat_jet, z_jet)141142# Simplified jet stream model143U_jet = 40 * np.exp(-((LAT - 45)**2/100)) * np.exp(-((Z - 10)**2/10))144145fig, ax = plt.subplots(figsize=(12, 6))146cs = ax.contourf(LAT, Z, U_jet, levels=20, cmap='jet')147plt.colorbar(cs, label='Wind Speed (m/s)')148ax.set_xlabel('Latitude (degrees)')149ax.set_ylabel('Altitude (km)')150ax.set_title('Jet Stream Wind Speed')151plt.tight_layout()152plt.savefig('jet_stream.pdf', dpi=150, bbox_inches='tight')153plt.close()154\end{pycode}155156\begin{figure}[H]157\centering158\includegraphics[width=0.9\textwidth]{jet_stream.pdf}159\caption{Cross-section of jet stream wind speed.}160\end{figure}161162\section{Potential Vorticity}163164\begin{pycode}165theta = np.linspace(280, 350, 100) # Potential temperature166f_pv = 1e-4167dtheta_dp = -0.1 # K/Pa168169PV = -g * f_pv * dtheta_dp * np.ones_like(theta)170171fig, ax = plt.subplots(figsize=(10, 6))172ax.plot(theta, PV * 1e6, 'b-', linewidth=2)173ax.set_xlabel('Potential Temperature (K)')174ax.set_ylabel('PV (PVU)')175ax.set_title('Potential Vorticity')176ax.grid(True, alpha=0.3)177plt.tight_layout()178plt.savefig('potential_vorticity.pdf', dpi=150, bbox_inches='tight')179plt.close()180\end{pycode}181182\begin{figure}[H]183\centering184\includegraphics[width=0.85\textwidth]{potential_vorticity.pdf}185\caption{Potential vorticity on isentropic surfaces.}186\end{figure}187188\section{Ekman Spiral}189190\begin{pycode}191z_ek = np.linspace(0, 2000, 100)192K = 10 # Eddy diffusivity193f_ek = 1e-4194delta = np.sqrt(2 * K / f_ek)195196u_ek = 10 * (1 - np.exp(-z_ek/delta) * np.cos(z_ek/delta))197v_ek = 10 * np.exp(-z_ek/delta) * np.sin(z_ek/delta)198199fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))200ax1.plot(u_ek, z_ek, 'b-', linewidth=2, label='u')201ax1.plot(v_ek, z_ek, 'r-', linewidth=2, label='v')202ax1.set_xlabel('Wind Speed (m/s)')203ax1.set_ylabel('Height (m)')204ax1.set_title('Ekman Layer Wind Profile')205ax1.legend()206ax1.grid(True, alpha=0.3)207208ax2.plot(u_ek, v_ek, 'b-', linewidth=1.5)209ax2.plot(u_ek[0], v_ek[0], 'go', markersize=10)210ax2.set_xlabel('u (m/s)')211ax2.set_ylabel('v (m/s)')212ax2.set_title('Ekman Spiral')213ax2.grid(True, alpha=0.3)214ax2.axis('equal')215plt.tight_layout()216plt.savefig('ekman_spiral.pdf', dpi=150, bbox_inches='tight')217plt.close()218\end{pycode}219220\begin{figure}[H]221\centering222\includegraphics[width=0.95\textwidth]{ekman_spiral.pdf}223\caption{Ekman layer wind profile and spiral.}224\end{figure}225226\section{Results}227228\begin{pycode}229print(r'\begin{table}[H]')230print(r'\centering')231print(r'\caption{Atmospheric Parameters at 45$^\circ$N}')232print(r'\begin{tabular}{@{}lc@{}}')233print(r'\toprule')234print(r'Parameter & Value \\')235print(r'\midrule')236print(f'Coriolis parameter & {f_45:.2e} s$^{{-1}}$ \\\\')237print(f'Ekman depth & {delta:.0f} m \\\\')238print(f'Rossby deformation radius & $\\sim$1000 km \\\\')239print(r'\bottomrule')240print(r'\end{tabular}')241print(r'\end{table}')242\end{pycode}243244\section{Conclusions}245246Atmospheric dynamics is governed by the balance between pressure gradient, Coriolis, and frictional forces.247248249\end{document}250251252