Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/geophysics/plate_tectonics.tex
51 views
unlisted
1
\documentclass[a4paper, 11pt]{article}
2
\usepackage[utf8]{inputenc}
3
\usepackage[T1]{fontenc}
4
\usepackage{amsmath, amssymb, amsthm}
5
\usepackage{graphicx}
6
\usepackage{booktabs}
7
\usepackage{siunitx}
8
\usepackage{subcaption}
9
\usepackage[makestderr]{pythontex}
10
11
\newtheorem{definition}{Definition}
12
\newtheorem{theorem}{Theorem}
13
\newtheorem{example}{Example}
14
\newtheorem{remark}{Remark}
15
16
\title{Plate Tectonics: Thermal Evolution, Plate Motion, and Mantle Convection}
17
\author{Computational Geophysics Laboratory}
18
\date{\today}
19
20
\begin{document}
21
\maketitle
22
23
\begin{abstract}
24
This technical report presents comprehensive computational analysis of plate tectonic processes including lithospheric cooling, seafloor subsidence, heat flow evolution, and plate kinematics. We implement the half-space and plate cooling models, analyze Euler pole rotation kinematics, and model mantle convection using Rayleigh-Benard theory. The analysis quantifies lithospheric thickness, thermal age relationships, and driving forces of plate motion.
25
\end{abstract}
26
27
\section{Theoretical Framework}
28
29
\begin{definition}[Thermal Diffusion]
30
Heat conduction in the lithosphere follows the diffusion equation:
31
\begin{equation}
32
\frac{\partial T}{\partial t} = \kappa \nabla^2 T
33
\end{equation}
34
where $\kappa = k/(\rho c_p)$ is thermal diffusivity ($\sim 10^{-6}$ m$^2$/s).
35
\end{definition}
36
37
\begin{theorem}[Half-Space Cooling Model]
38
For lithosphere cooling from initial mantle temperature $T_m$, the temperature profile is:
39
\begin{equation}
40
T(z, t) = T_s + (T_m - T_s) \text{erf}\left(\frac{z}{2\sqrt{\kappa t}}\right)
41
\end{equation}
42
where $\text{erf}$ is the error function and $T_s$ is surface temperature.
43
\end{theorem}
44
45
\subsection{Seafloor Subsidence}
46
47
Thermal contraction causes seafloor deepening with age:
48
\begin{equation}
49
d(t) = d_r + \frac{2\rho_m \alpha_V (T_m - T_s)}{\rho_m - \rho_w} \sqrt{\frac{\kappa t}{\pi}}
50
\end{equation}
51
52
where $d_r$ is ridge depth, $\alpha_V$ is volumetric thermal expansion, and $\rho_m$, $\rho_w$ are mantle and water densities.
53
54
\begin{example}[Heat Flow]
55
Surface heat flow decreases with age:
56
\begin{equation}
57
q(t) = \frac{k(T_m - T_s)}{\sqrt{\pi \kappa t}}
58
\end{equation}
59
Typical values range from $>$200 mW/m$^2$ at ridges to $<$50 mW/m$^2$ on old oceanic crust.
60
\end{example}
61
62
\subsection{Plate Kinematics}
63
64
Plate motion on a sphere follows Euler's theorem---rotation about a fixed pole:
65
\begin{equation}
66
\mathbf{v} = \boldsymbol{\omega} \times \mathbf{r}
67
\end{equation}
68
where $\boldsymbol{\omega}$ is the angular velocity vector and $\mathbf{r}$ is the position vector.
69
70
\section{Computational Analysis}
71
72
\begin{pycode}
73
import numpy as np
74
from scipy.special import erf, erfc
75
import matplotlib.pyplot as plt
76
plt.rc('text', usetex=True)
77
plt.rc('font', family='serif', size=10)
78
79
# Physical parameters
80
kappa = 1e-6 # Thermal diffusivity (m^2/s)
81
k = 3.3 # Thermal conductivity (W/m/K)
82
Tm = 1350 # Mantle temperature (C)
83
Ts = 0 # Surface temperature (C)
84
alpha_V = 3e-5 # Thermal expansion (1/K)
85
rho_m = 3300 # Mantle density (kg/m^3)
86
rho_w = 1030 # Seawater density (kg/m^3)
87
rho_a = 3200 # Asthenosphere density (kg/m^3)
88
dr = 2500 # Ridge depth (m)
89
g = 9.81 # Gravity (m/s^2)
90
91
# Time conversion
92
Ma_to_s = 1e6 * 365.25 * 24 * 3600
93
94
# Age range
95
age_Ma = np.linspace(0.1, 200, 200)
96
age_s = age_Ma * Ma_to_s
97
98
# Half-space cooling model
99
def halfspace_depth(age_s):
100
"""Seafloor depth from half-space model (m)."""
101
return dr + 2 * rho_m * alpha_V * (Tm - Ts) / (rho_m - rho_w) * np.sqrt(kappa * age_s / np.pi)
102
103
def halfspace_heatflow(age_s):
104
"""Surface heat flow from half-space model (mW/m^2)."""
105
return k * (Tm - Ts) / np.sqrt(np.pi * kappa * age_s) * 1000
106
107
def lithosphere_thickness(age_s, T_threshold=1100):
108
"""Thermal lithosphere thickness (m)."""
109
return 2.32 * np.sqrt(kappa * age_s) # Depth to T = 0.9*Tm
110
111
# Plate model parameters
112
a_plate = 125000 # Plate thickness (m)
113
tau = a_plate**2 / (np.pi**2 * kappa) # Thermal time constant
114
115
def plate_depth(age_s):
116
"""Seafloor depth from plate model (m)."""
117
d_inf = dr + rho_m * alpha_V * (Tm - Ts) * a_plate / (rho_m - rho_w)
118
return d_inf - (d_inf - dr) * (8/np.pi**2) * np.exp(-age_s/tau)
119
120
# Temperature profiles at different ages
121
ages_profile = [10, 50, 100, 150] # Ma
122
z = np.linspace(0, 150000, 300) # Depth in m
123
124
# Plate velocities (mm/yr) - major plates
125
plates = {
126
'Pacific': 75,
127
'Australian': 60,
128
'Nazca': 55,
129
'Cocos': 52,
130
'Philippine': 45,
131
'N American': 23,
132
'S American': 17,
133
'Eurasian': 21,
134
'African': 22,
135
'Antarctic': 17
136
}
137
138
# Euler pole example (Pacific-North American)
139
euler_lat = 48.7
140
euler_lon = -78.2
141
omega = 0.78 # deg/Ma
142
143
# Driving forces (relative magnitudes)
144
forces = {
145
'Ridge Push': 2.5,
146
'Slab Pull': 10,
147
'Basal Drag': 3,
148
'Mantle Suction': 1.5
149
}
150
151
# Rayleigh number for mantle convection
152
Ra_crit = 1000 # Critical Rayleigh number
153
deltaT = 2500 # Temperature difference (K)
154
d_mantle = 2900e3 # Mantle thickness (m)
155
nu = 1e21 # Viscosity (Pa*s)
156
alpha = 3e-5 # Thermal expansion
157
158
Ra = rho_m * g * alpha * deltaT * d_mantle**3 / (kappa * nu)
159
160
# Calculate depths and heat flow
161
depth_halfspace = halfspace_depth(age_s)
162
depth_plate = plate_depth(age_s)
163
heatflow = halfspace_heatflow(age_s)
164
lith_thickness = lithosphere_thickness(age_s)
165
166
# Subsidence rate
167
subsidence_rate = np.gradient(depth_halfspace, age_Ma) / 1000 # km/Ma
168
169
# Create visualization
170
fig = plt.figure(figsize=(12, 10))
171
gs = fig.add_gridspec(3, 3, hspace=0.35, wspace=0.35)
172
173
# Plot 1: Seafloor depth vs age
174
ax1 = fig.add_subplot(gs[0, 0])
175
ax1.plot(age_Ma, depth_halfspace/1000, 'b-', lw=2, label='Half-space')
176
ax1.plot(age_Ma, depth_plate/1000, 'r--', lw=2, label='Plate')
177
ax1.plot(np.sqrt(age_Ma), depth_halfspace/1000, 'g:', lw=1, alpha=0) # Hidden
178
ax1.set_xlabel('Age (Ma)')
179
ax1.set_ylabel('Depth (km)')
180
ax1.set_title('Seafloor Subsidence')
181
ax1.legend(fontsize=8)
182
ax1.invert_yaxis()
183
ax1.grid(True, alpha=0.3)
184
185
# Plot 2: Heat flow vs age
186
ax2 = fig.add_subplot(gs[0, 1])
187
ax2.plot(age_Ma, heatflow, 'r-', lw=2)
188
ax2.axhline(y=65, color='gray', ls='--', alpha=0.5, label='Continental avg')
189
ax2.set_xlabel('Age (Ma)')
190
ax2.set_ylabel('Heat Flow (mW/m$^2$)')
191
ax2.set_title('Surface Heat Flow')
192
ax2.legend(fontsize=8)
193
ax2.grid(True, alpha=0.3)
194
ax2.set_ylim([0, 500])
195
196
# Plot 3: Temperature profiles
197
ax3 = fig.add_subplot(gs[0, 2])
198
colors = plt.cm.viridis(np.linspace(0.2, 0.8, len(ages_profile)))
199
for age, color in zip(ages_profile, colors):
200
age_sec = age * Ma_to_s
201
T = Ts + (Tm - Ts) * erf(z / (2 * np.sqrt(kappa * age_sec)))
202
ax3.plot(T, z/1000, color=color, lw=2, label=f'{age} Ma')
203
204
ax3.axhline(y=lith_thickness[np.argmin(np.abs(age_Ma - 100))]/1000,
205
color='gray', ls='--', alpha=0.5)
206
ax3.set_xlabel('Temperature ($^\\circ$C)')
207
ax3.set_ylabel('Depth (km)')
208
ax3.set_title('Geotherm Evolution')
209
ax3.legend(fontsize=7)
210
ax3.invert_yaxis()
211
ax3.grid(True, alpha=0.3)
212
ax3.set_xlim([0, 1400])
213
214
# Plot 4: Lithosphere thickness
215
ax4 = fig.add_subplot(gs[1, 0])
216
ax4.plot(age_Ma, lith_thickness/1000, 'b-', lw=2)
217
ax4.plot(age_Ma, np.sqrt(age_Ma) * 10, 'r--', lw=1.5, alpha=0.7,
218
label='$\\propto \\sqrt{t}$')
219
ax4.set_xlabel('Age (Ma)')
220
ax4.set_ylabel('Thickness (km)')
221
ax4.set_title('Thermal Lithosphere Thickness')
222
ax4.legend(fontsize=8)
223
ax4.grid(True, alpha=0.3)
224
225
# Plot 5: Plate velocities
226
ax5 = fig.add_subplot(gs[1, 1])
227
names = list(plates.keys())
228
velocities = list(plates.values())
229
colors = plt.cm.plasma(np.linspace(0.2, 0.8, len(plates)))
230
y_pos = range(len(names))
231
ax5.barh(y_pos, velocities, color=colors, alpha=0.8)
232
ax5.set_yticks(y_pos)
233
ax5.set_yticklabels(names, fontsize=8)
234
ax5.set_xlabel('Velocity (mm/yr)')
235
ax5.set_title('Major Plate Velocities')
236
ax5.grid(True, alpha=0.3, axis='x')
237
238
# Plot 6: Depth vs sqrt(age)
239
ax6 = fig.add_subplot(gs[1, 2])
240
sqrt_age = np.sqrt(age_Ma)
241
ax6.plot(sqrt_age, depth_halfspace/1000, 'b-', lw=2)
242
# Linear fit
243
coeffs = np.polyfit(sqrt_age[10:], depth_halfspace[10:]/1000, 1)
244
ax6.plot(sqrt_age, np.polyval(coeffs, sqrt_age), 'r--', lw=1.5,
245
label=f'Slope = {coeffs[0]:.0f} m/Ma$^{{1/2}}$')
246
ax6.set_xlabel('$\\sqrt{\\mathrm{Age}}$ (Ma$^{1/2}$)')
247
ax6.set_ylabel('Depth (km)')
248
ax6.set_title('Depth vs $\\sqrt{t}$ (Parsons-Sclater)')
249
ax6.legend(fontsize=8)
250
ax6.invert_yaxis()
251
ax6.grid(True, alpha=0.3)
252
253
# Plot 7: Driving forces
254
ax7 = fig.add_subplot(gs[2, 0])
255
force_names = list(forces.keys())
256
force_vals = list(forces.values())
257
colors = ['blue', 'red', 'green', 'orange']
258
ax7.bar(range(len(forces)), force_vals, color=colors, alpha=0.7)
259
ax7.set_xticks(range(len(forces)))
260
ax7.set_xticklabels(force_names, fontsize=8, rotation=15)
261
ax7.set_ylabel('Relative Magnitude')
262
ax7.set_title('Plate Driving Forces')
263
ax7.grid(True, alpha=0.3, axis='y')
264
265
# Plot 8: Subsidence rate
266
ax8 = fig.add_subplot(gs[2, 1])
267
ax8.plot(age_Ma[1:], -subsidence_rate[1:] * 1000, 'purple', lw=2)
268
ax8.set_xlabel('Age (Ma)')
269
ax8.set_ylabel('Subsidence Rate (m/Ma)')
270
ax8.set_title('Subsidence Rate vs Age')
271
ax8.grid(True, alpha=0.3)
272
ax8.set_xlim([0, 200])
273
274
# Plot 9: Rayleigh-Benard stability
275
ax9 = fig.add_subplot(gs[2, 2])
276
Ra_range = np.logspace(2, 8, 100)
277
Nu = np.ones_like(Ra_range)
278
Nu[Ra_range > Ra_crit] = 0.28 * Ra_range[Ra_range > Ra_crit]**0.21
279
280
ax9.loglog(Ra_range, Nu, 'b-', lw=2)
281
ax9.axvline(x=Ra_crit, color='r', ls='--', label=f'Ra$_c$ = {Ra_crit}')
282
ax9.axvline(x=Ra, color='g', ls='--', alpha=0.7, label=f'Mantle Ra')
283
ax9.set_xlabel('Rayleigh Number')
284
ax9.set_ylabel('Nusselt Number')
285
ax9.set_title('Convection Heat Transfer')
286
ax9.legend(fontsize=8)
287
ax9.grid(True, alpha=0.3, which='both')
288
289
plt.savefig('plate_tectonics_plot.pdf', bbox_inches='tight', dpi=150)
290
print(r'\begin{center}')
291
print(r'\includegraphics[width=\textwidth]{plate_tectonics_plot.pdf}')
292
print(r'\end{center}')
293
plt.close()
294
295
# Summary calculations
296
depth_100Ma = halfspace_depth(100 * Ma_to_s)
297
heatflow_10Ma = halfspace_heatflow(10 * Ma_to_s)
298
lith_100Ma = lithosphere_thickness(100 * Ma_to_s)
299
max_velocity = max(velocities)
300
parsons_slope = coeffs[0]
301
\end{pycode}
302
303
\section{Results and Analysis}
304
305
\subsection{Thermal Evolution}
306
307
\begin{pycode}
308
print(r'\begin{table}[htbp]')
309
print(r'\centering')
310
print(r'\caption{Oceanic Lithosphere Properties vs Age}')
311
print(r'\begin{tabular}{ccccc}')
312
print(r'\toprule')
313
print(r'Age (Ma) & Depth (km) & Heat Flow (mW/m$^2$) & Lith. Thick. (km) & Subsidence (m/Ma) \\')
314
print(r'\midrule')
315
316
ages_table = [1, 10, 25, 50, 100, 150, 200]
317
for age in ages_table:
318
idx = np.argmin(np.abs(age_Ma - age))
319
d = depth_halfspace[idx]/1000
320
q = heatflow[idx]
321
l = lith_thickness[idx]/1000
322
s = -subsidence_rate[idx] * 1000 if idx > 0 else np.nan
323
s_str = f'{s:.0f}' if not np.isnan(s) else '--'
324
print(f'{age} & {d:.2f} & {q:.0f} & {l:.0f} & {s_str} \\\\')
325
326
print(r'\bottomrule')
327
print(r'\end{tabular}')
328
print(r'\end{table}')
329
\end{pycode}
330
331
\subsection{Model Comparison}
332
333
The half-space and plate models diverge for old lithosphere:
334
\begin{itemize}
335
\item Half-space predicts continuous deepening: $d \propto \sqrt{t}$
336
\item Plate model predicts asymptotic depth for $t > \py{f"{tau/Ma_to_s:.0f}"}$ Ma
337
\item Observed data favor plate model for ages $>$ 80 Ma
338
\item Parsons-Sclater slope: \py{f"{parsons_slope:.0f}"} m/Ma$^{1/2}$
339
\end{itemize}
340
341
\begin{remark}
342
The $\sqrt{t}$ dependence of seafloor depth is a diagnostic signature of conductive cooling. Deviations indicate convective or compositional effects.
343
\end{remark}
344
345
\subsection{Plate Kinematics}
346
347
\begin{pycode}
348
print(r'\begin{table}[htbp]')
349
print(r'\centering')
350
print(r'\caption{Plate Motion Statistics}')
351
print(r'\begin{tabular}{lcc}')
352
print(r'\toprule')
353
print(r'Statistic & Value & Units \\')
354
print(r'\midrule')
355
print(f'Maximum plate velocity & {max_velocity} & mm/yr \\\\')
356
print(f'Mean velocity & {np.mean(velocities):.1f} & mm/yr \\\\')
357
print(f'Fastest plate & Pacific & -- \\\\')
358
print(f'Slowest plate & Antarctic & -- \\\\')
359
print(f'Euler pole (Pac-NAm) & ({euler_lat}$^\\circ$N, {euler_lon}$^\\circ$E) & -- \\\\')
360
print(f'Angular velocity & {omega} & deg/Ma \\\\')
361
print(r'\bottomrule')
362
print(r'\end{tabular}')
363
print(r'\end{table}')
364
\end{pycode}
365
366
\section{Physical Processes}
367
368
\begin{example}[Ridge Push Force]
369
The elevation of mid-ocean ridges creates a gravitational driving force:
370
\begin{equation}
371
F_{RP} = g\rho_m \alpha_V (T_m - T_s) \kappa t \approx 2-3 \times 10^{12} \text{ N/m}
372
\end{equation}
373
This force acts throughout the lithosphere volume.
374
\end{example}
375
376
\begin{example}[Slab Pull Force]
377
Subducting lithosphere is denser than surrounding mantle:
378
\begin{equation}
379
F_{SP} = \Delta\rho \cdot g \cdot L \cdot h \approx 10^{13} \text{ N/m}
380
\end{equation}
381
where $L$ is slab length and $h$ is thickness. This is the dominant driving force.
382
\end{example}
383
384
\begin{theorem}[Mantle Convection]
385
Convection occurs when the Rayleigh number exceeds the critical value:
386
\begin{equation}
387
Ra = \frac{\rho g \alpha \Delta T d^3}{\kappa \nu} > Ra_c \approx 1000
388
\end{equation}
389
For Earth's mantle, $Ra \approx \py{f"{Ra:.1e}"}$, indicating vigorous convection.
390
\end{theorem}
391
392
\section{Discussion}
393
394
The analysis reveals several key features of plate tectonics:
395
396
\begin{enumerate}
397
\item \textbf{Thermal control}: Lithospheric properties are primarily controlled by conductive cooling from the mantle.
398
\item \textbf{Depth-age relationship}: The $\sqrt{t}$ subsidence law holds for ages $<$ 80 Ma; older lithosphere approaches thermal equilibrium.
399
\item \textbf{Velocity distribution}: Oceanic plates with attached slabs move faster than continental plates.
400
\item \textbf{Force balance}: Slab pull dominates over ridge push by a factor of $\sim$4.
401
\item \textbf{Vigorous convection}: The mantle Rayleigh number far exceeds critical, enabling plate recycling.
402
\end{enumerate}
403
404
\section{Conclusions}
405
406
This computational analysis demonstrates:
407
\begin{itemize}
408
\item Seafloor depth at 100 Ma: \py{f"{depth_100Ma/1000:.2f}"} km
409
\item Heat flow at 10 Ma: \py{f"{heatflow_10Ma:.0f}"} mW/m$^2$
410
\item Lithosphere thickness at 100 Ma: \py{f"{lith_100Ma/1000:.0f}"} km
411
\item Maximum plate velocity: \py{f"{max_velocity}"} mm/yr (Pacific)
412
\item Mantle Rayleigh number: \py{f"{Ra:.1e}"}
413
\end{itemize}
414
415
The thermal evolution of oceanic lithosphere provides fundamental constraints on mantle convection and the driving forces of plate tectonics.
416
417
\section{Further Reading}
418
\begin{itemize}
419
\item Turcotte, D.L., Schubert, G., \textit{Geodynamics}, 3rd Edition, Cambridge University Press, 2014
420
\item Fowler, C.M.R., \textit{The Solid Earth}, 2nd Edition, Cambridge University Press, 2004
421
\item Parsons, B., Sclater, J.G., An analysis of the variation of ocean floor bathymetry and heat flow with age, \textit{J. Geophys. Res.}, 1977
422
\end{itemize}
423
424
\end{document}
425
426