Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ok-landscape
GitHub Repository: Ok-landscape/computational-pipeline
Path: blob/main/latex-templates/templates/geophysics/seismic_waves.tex
51 views
unlisted
1
% Seismic Wave Propagation Template
2
% Topics: P-waves, S-waves, travel times, Earth structure, ray tracing
3
% Style: Technical report with observational data analysis
4
5
\documentclass[a4paper, 11pt]{article}
6
\usepackage[utf8]{inputenc}
7
\usepackage[T1]{fontenc}
8
\usepackage{amsmath, amssymb}
9
\usepackage{graphicx}
10
\usepackage{siunitx}
11
\usepackage{booktabs}
12
\usepackage{subcaption}
13
\usepackage[makestderr]{pythontex}
14
15
% Theorem environments
16
\newtheorem{definition}{Definition}[section]
17
\newtheorem{theorem}{Theorem}[section]
18
\newtheorem{example}{Example}[section]
19
\newtheorem{remark}{Remark}[section]
20
21
\title{Seismic Wave Propagation: Earth Structure and Travel Time Analysis}
22
\author{Geophysical Observatory}
23
\date{\today}
24
25
\begin{document}
26
\maketitle
27
28
\begin{abstract}
29
This technical report presents a comprehensive analysis of seismic wave propagation
30
through Earth's interior. We examine P-wave and S-wave velocities in different Earth
31
layers, compute travel times using ray theory, and analyze seismograms to determine
32
Earth structure. The analysis includes velocity-depth profiles based on the PREM model,
33
Snell's law for ray tracing, and the interpretation of seismic shadow zones that reveal
34
Earth's liquid outer core.
35
\end{abstract}
36
37
\section{Introduction}
38
39
Seismic waves generated by earthquakes provide the primary means of probing Earth's
40
deep interior. The velocity and attenuation of these waves depend on the elastic
41
properties and density of the materials through which they propagate.
42
43
\begin{definition}[Seismic Wave Types]
44
The two main body wave types are:
45
\begin{itemize}
46
\item \textbf{P-waves} (Primary): Compressional waves with particle motion parallel to propagation
47
\item \textbf{S-waves} (Secondary): Shear waves with particle motion perpendicular to propagation
48
\end{itemize}
49
S-waves cannot propagate through liquids (zero shear modulus).
50
\end{definition}
51
52
\section{Theoretical Framework}
53
54
\subsection{Wave Velocities}
55
56
\begin{theorem}[Seismic Velocities]
57
For an isotropic elastic medium with bulk modulus $K$, shear modulus $\mu$, and density $\rho$:
58
\begin{align}
59
V_P &= \sqrt{\frac{K + \frac{4}{3}\mu}{\rho}} \\
60
V_S &= \sqrt{\frac{\mu}{\rho}}
61
\end{align}
62
The ratio $V_P/V_S = \sqrt{(K/\mu + 4/3)} \approx 1.7$ for typical rocks.
63
\end{theorem}
64
65
\begin{definition}[Poisson's Ratio]
66
Poisson's ratio relates to seismic velocities:
67
\begin{equation}
68
\nu = \frac{V_P^2 - 2V_S^2}{2(V_P^2 - V_S^2)}
69
\end{equation}
70
For fluids, $\nu = 0.5$; for typical rocks, $\nu \approx 0.25$.
71
\end{definition}
72
73
\subsection{Ray Theory}
74
75
\begin{theorem}[Snell's Law for Seismic Rays]
76
At an interface between layers with velocities $V_1$ and $V_2$:
77
\begin{equation}
78
\frac{\sin i_1}{V_1} = \frac{\sin i_2}{V_2} = p
79
\end{equation}
80
where $p$ is the ray parameter (constant along a ray path).
81
\end{theorem}
82
83
\begin{remark}[Critical Angle]
84
When $V_2 > V_1$, a critical angle $i_c = \arcsin(V_1/V_2)$ exists. For incidence
85
angles greater than $i_c$, total internal reflection occurs.
86
\end{remark}
87
88
\subsection{Travel Time Equations}
89
90
\begin{theorem}[Travel Time for Constant Velocity Layer]
91
For a horizontal layer of thickness $h$ and velocity $V$:
92
\begin{equation}
93
T(x) = \frac{1}{V}\sqrt{x^2 + 4h^2}
94
\end{equation}
95
where $x$ is the horizontal distance (epicentral distance).
96
\end{theorem}
97
98
\section{Computational Analysis}
99
100
\begin{pycode}
101
import numpy as np
102
import matplotlib.pyplot as plt
103
from scipy.integrate import odeint
104
105
np.random.seed(42)
106
107
# PREM-like Earth model (Preliminary Reference Earth Model)
108
def prem_velocities(depth):
109
"""Return Vp, Vs (km/s) for given depth (km)."""
110
if depth < 15: # Upper crust
111
return 5.8, 3.2
112
elif depth < 35: # Lower crust
113
return 6.8, 3.9
114
elif depth < 220: # Lithosphere/Upper mantle
115
return 8.0, 4.4
116
elif depth < 400: # Upper mantle
117
return 8.5, 4.6
118
elif depth < 670: # Transition zone
119
return 9.9, 5.4
120
elif depth < 2891: # Lower mantle
121
return 13.0 - (depth - 670) * 0.001, 7.0 - (depth - 670) * 0.0005
122
elif depth < 5150: # Outer core (liquid)
123
return 10.0 + (depth - 2891) * 0.0004, 0.0
124
else: # Inner core
125
return 11.0, 3.5
126
127
# Create velocity profile
128
depths = np.linspace(0, 6371, 1000)
129
Vp = np.array([prem_velocities(d)[0] for d in depths])
130
Vs = np.array([prem_velocities(d)[1] for d in depths])
131
132
# Density profile (simplified)
133
def prem_density(depth):
134
if depth < 35:
135
return 2.7
136
elif depth < 670:
137
return 3.4 + depth * 0.0005
138
elif depth < 2891:
139
return 4.4 + (depth - 670) * 0.001
140
elif depth < 5150:
141
return 10.0 + (depth - 2891) * 0.001
142
else:
143
return 13.0
144
145
rho = np.array([prem_density(d) for d in depths])
146
147
# Travel time calculation (simplified ray tracing)
148
def travel_time(distance_deg, wave_type='P'):
149
"""Calculate travel time for given epicentral distance."""
150
# Simplified: average velocity approximation
151
distance_km = distance_deg * 111.19
152
if wave_type == 'P':
153
# P-wave average velocity varies with distance
154
if distance_deg < 100:
155
v_avg = 8.5 + distance_deg * 0.02
156
else:
157
v_avg = 13.0 # Core phases
158
return distance_km / v_avg
159
else: # S-wave
160
if distance_deg < 100:
161
v_avg = 4.8 + distance_deg * 0.01
162
return distance_km / v_avg
163
else:
164
return np.nan # S-wave shadow zone
165
166
# Calculate travel times
167
distances = np.linspace(0, 180, 181)
168
tt_P = np.array([travel_time(d, 'P') for d in distances])
169
tt_S = np.array([travel_time(d, 'S') for d in distances])
170
171
# Generate synthetic seismogram
172
def synthetic_seismogram(distance_deg, duration=600):
173
t = np.linspace(0, duration, duration * 10)
174
signal = np.zeros_like(t)
175
176
# P-wave arrival
177
t_p = travel_time(distance_deg, 'P')
178
if not np.isnan(t_p):
179
idx_p = int(t_p * 10)
180
if idx_p < len(signal) - 50:
181
signal[idx_p:idx_p+50] = np.sin(2*np.pi*np.arange(50)/10) * np.exp(-np.arange(50)/15)
182
183
# S-wave arrival
184
t_s = travel_time(distance_deg, 'S')
185
if not np.isnan(t_s):
186
idx_s = int(t_s * 10)
187
if idx_s < len(signal) - 100:
188
signal[idx_s:idx_s+100] = 1.5 * np.sin(2*np.pi*np.arange(100)/15) * np.exp(-np.arange(100)/25)
189
190
# Add noise
191
signal += 0.05 * np.random.randn(len(t))
192
return t, signal
193
194
# Calculate Poisson's ratio
195
nu = np.zeros_like(depths)
196
for i in range(len(depths)):
197
if Vs[i] > 0:
198
nu[i] = (Vp[i]**2 - 2*Vs[i]**2) / (2*(Vp[i]**2 - Vs[i]**2))
199
else:
200
nu[i] = 0.5 # Liquid
201
202
# Vp/Vs ratio
203
Vp_Vs = np.where(Vs > 0, Vp / Vs, np.nan)
204
205
# Ray parameter calculation
206
def ray_parameter(takeoff_angle, v_surface=6.0):
207
return np.sin(np.radians(takeoff_angle)) / v_surface
208
209
# Impedance contrast
210
impedance = rho * Vp
211
212
# Create figure
213
fig = plt.figure(figsize=(14, 12))
214
215
# Plot 1: Velocity profile
216
ax1 = fig.add_subplot(3, 3, 1)
217
ax1.plot(Vp, depths, 'b-', linewidth=2, label='$V_P$')
218
ax1.plot(Vs, depths, 'r-', linewidth=2, label='$V_S$')
219
ax1.axhline(y=2891, color='gray', linestyle='--', alpha=0.7, label='CMB')
220
ax1.axhline(y=5150, color='gray', linestyle=':', alpha=0.7, label='ICB')
221
ax1.set_xlabel('Velocity (km/s)')
222
ax1.set_ylabel('Depth (km)')
223
ax1.set_title('PREM Velocity Profile')
224
ax1.legend(fontsize=8)
225
ax1.invert_yaxis()
226
227
# Plot 2: Travel time curves
228
ax2 = fig.add_subplot(3, 3, 2)
229
ax2.plot(distances, tt_P, 'b-', linewidth=2, label='P-wave')
230
ax2.plot(distances, tt_S, 'r-', linewidth=2, label='S-wave')
231
ax2.axvline(x=103, color='gray', linestyle='--', alpha=0.7)
232
ax2.axvline(x=143, color='gray', linestyle=':', alpha=0.7)
233
ax2.set_xlabel('Epicentral Distance (deg)')
234
ax2.set_ylabel('Travel Time (s)')
235
ax2.set_title('Travel Time Curves')
236
ax2.legend(fontsize=8)
237
ax2.text(115, 800, 'Shadow\nZone', fontsize=8, ha='center')
238
239
# Plot 3: Synthetic seismogram
240
ax3 = fig.add_subplot(3, 3, 3)
241
t_seis, signal = synthetic_seismogram(60)
242
ax3.plot(t_seis, signal, 'k-', linewidth=0.5)
243
t_p_60 = travel_time(60, 'P')
244
t_s_60 = travel_time(60, 'S')
245
ax3.axvline(x=t_p_60, color='blue', linestyle='--', label=f'P: {t_p_60:.0f}s')
246
ax3.axvline(x=t_s_60, color='red', linestyle='--', label=f'S: {t_s_60:.0f}s')
247
ax3.set_xlabel('Time (s)')
248
ax3.set_ylabel('Amplitude')
249
ax3.set_title('Synthetic Seismogram (60 deg)')
250
ax3.legend(fontsize=8)
251
ax3.set_xlim([0, 600])
252
253
# Plot 4: Poisson's ratio
254
ax4 = fig.add_subplot(3, 3, 4)
255
ax4.plot(nu, depths, 'g-', linewidth=2)
256
ax4.axhline(y=2891, color='gray', linestyle='--', alpha=0.7)
257
ax4.axvline(x=0.5, color='red', linestyle=':', alpha=0.7, label='Liquid')
258
ax4.set_xlabel("Poisson's Ratio")
259
ax4.set_ylabel('Depth (km)')
260
ax4.set_title("Poisson's Ratio Profile")
261
ax4.invert_yaxis()
262
ax4.set_xlim([0.2, 0.52])
263
ax4.legend(fontsize=8)
264
265
# Plot 5: Vp/Vs ratio
266
ax5 = fig.add_subplot(3, 3, 5)
267
ax5.plot(Vp_Vs, depths, 'purple', linewidth=2)
268
ax5.axhline(y=2891, color='gray', linestyle='--', alpha=0.7)
269
ax5.set_xlabel('$V_P/V_S$')
270
ax5.set_ylabel('Depth (km)')
271
ax5.set_title('Velocity Ratio Profile')
272
ax5.invert_yaxis()
273
ax5.set_xlim([1.5, 2.5])
274
275
# Plot 6: Density profile
276
ax6 = fig.add_subplot(3, 3, 6)
277
ax6.plot(rho, depths, 'brown', linewidth=2)
278
ax6.axhline(y=2891, color='gray', linestyle='--', alpha=0.7)
279
ax6.set_xlabel('Density (g/cm$^3$)')
280
ax6.set_ylabel('Depth (km)')
281
ax6.set_title('Density Profile')
282
ax6.invert_yaxis()
283
284
# Plot 7: S-P time difference
285
ax7 = fig.add_subplot(3, 3, 7)
286
ts_tp = tt_S - tt_P
287
ax7.plot(distances[:100], ts_tp[:100], 'purple', linewidth=2)
288
ax7.set_xlabel('Epicentral Distance (deg)')
289
ax7.set_ylabel('S-P Time (s)')
290
ax7.set_title('S-P Time Difference')
291
292
# Plot 8: Record section
293
ax8 = fig.add_subplot(3, 3, 8)
294
for i, dist in enumerate(range(20, 100, 10)):
295
t_rec, sig = synthetic_seismogram(dist, 500)
296
ax8.plot(t_rec, sig * 0.3 + dist, 'k-', linewidth=0.5)
297
ax8.set_xlabel('Time (s)')
298
ax8.set_ylabel('Distance (deg)')
299
ax8.set_title('Record Section')
300
ax8.set_xlim([0, 500])
301
302
# Plot 9: Impedance contrast
303
ax9 = fig.add_subplot(3, 3, 9)
304
ax9.plot(impedance, depths, 'orange', linewidth=2)
305
ax9.axhline(y=2891, color='gray', linestyle='--', alpha=0.7)
306
ax9.axhline(y=35, color='blue', linestyle=':', alpha=0.7, label='Moho')
307
ax9.set_xlabel('Impedance (kg/m$^2$/s)')
308
ax9.set_ylabel('Depth (km)')
309
ax9.set_title('Acoustic Impedance')
310
ax9.invert_yaxis()
311
ax9.legend(fontsize=8)
312
313
plt.tight_layout()
314
plt.savefig('seismic_waves_analysis.pdf', dpi=150, bbox_inches='tight')
315
plt.close()
316
317
# Key values
318
Vp_mantle = 8.0
319
Vs_mantle = 4.4
320
Vp_Vs_mantle = Vp_mantle / Vs_mantle
321
CMB_depth = 2891
322
\end{pycode}
323
324
\begin{figure}[htbp]
325
\centering
326
\includegraphics[width=\textwidth]{seismic_waves_analysis.pdf}
327
\caption{Seismic wave analysis: (a) PREM velocity profile; (b) Travel time curves showing
328
shadow zone; (c) Synthetic seismogram at 60 degrees; (d) Poisson's ratio showing liquid
329
outer core; (e) $V_P/V_S$ ratio; (f) Density profile; (g) S-P time difference for
330
earthquake location; (h) Record section; (i) Acoustic impedance contrasts.}
331
\label{fig:seismic}
332
\end{figure}
333
334
\section{Results}
335
336
\subsection{Earth Structure}
337
338
\begin{pycode}
339
print(r"\begin{table}[htbp]")
340
print(r"\centering")
341
print(r"\caption{Earth Layer Properties from PREM}")
342
print(r"\begin{tabular}{lcccc}")
343
print(r"\toprule")
344
print(r"Layer & Depth (km) & $V_P$ (km/s) & $V_S$ (km/s) & $\rho$ (g/cm$^3$) \\")
345
print(r"\midrule")
346
print(r"Upper Crust & 0--15 & 5.8 & 3.2 & 2.7 \\")
347
print(r"Lower Crust & 15--35 & 6.8 & 3.9 & 2.9 \\")
348
print(r"Upper Mantle & 35--670 & 8.0--9.9 & 4.4--5.4 & 3.4--4.4 \\")
349
print(r"Lower Mantle & 670--2891 & 13.0 & 7.0 & 4.4--5.6 \\")
350
print(r"Outer Core & 2891--5150 & 10.0 & 0 & 10.0--12.2 \\")
351
print(r"Inner Core & 5150--6371 & 11.0 & 3.5 & 13.0 \\")
352
print(r"\bottomrule")
353
print(r"\end{tabular}")
354
print(r"\label{tab:layers}")
355
print(r"\end{table}")
356
\end{pycode}
357
358
\section{Discussion}
359
360
\begin{example}[S-Wave Shadow Zone]
361
The absence of S-waves between 103 and 180 degrees epicentral distance proves
362
that Earth's outer core is liquid:
363
\begin{itemize}
364
\item S-waves require shear strength to propagate
365
\item Liquids have zero shear modulus
366
\item P-waves are refracted through the core, creating a separate shadow zone
367
\end{itemize}
368
\end{example}
369
370
\begin{remark}[Earthquake Location]
371
The S-P time difference is used to estimate distance to an earthquake:
372
\begin{equation}
373
\Delta t_{S-P} = D \left(\frac{1}{V_S} - \frac{1}{V_P}\right)
374
\end{equation}
375
With three or more stations, the epicenter can be triangulated.
376
\end{remark}
377
378
\begin{example}[Moho Discontinuity]
379
The Mohorovicic discontinuity marks the crust-mantle boundary:
380
\begin{itemize}
381
\item Sharp velocity increase: $V_P$ from 6.8 to 8.0 km/s
382
\item Depth varies: 35 km (continents), 7 km (oceans)
383
\item Reflection coefficient depends on impedance contrast
384
\end{itemize}
385
\end{example}
386
387
\section{Conclusions}
388
389
This seismic wave analysis demonstrates:
390
\begin{enumerate}
391
\item Upper mantle velocities: $V_P = \py{f"{Vp_mantle}"}$ km/s, $V_S = \py{f"{Vs_mantle}"}$ km/s
392
\item $V_P/V_S$ ratio: $\py{f"{Vp_Vs_mantle:.2f}"}$ (typical of silicate rocks)
393
\item Core-mantle boundary at $\py{f"{CMB_depth}"}$ km depth
394
\item S-wave shadow zone beyond 103 degrees proves liquid outer core
395
\item Seismic tomography can map 3D velocity variations
396
\end{enumerate}
397
398
\section*{Further Reading}
399
400
\begin{itemize}
401
\item Stein, S. \& Wysession, M. \textit{An Introduction to Seismology, Earthquakes, and Earth Structure}. Blackwell, 2003.
402
\item Shearer, P.M. \textit{Introduction to Seismology}, 3rd ed. Cambridge, 2019.
403
\item Dziewonski, A.M. \& Anderson, D.L. Preliminary reference Earth model. \textit{Phys. Earth Planet. Inter.} 25, 297--356, 1981.
404
\end{itemize}
405
406
\end{document}
407
408