Skip to content

Commit b4de30e

Browse files
Lecture 8: three course-original sketches for the interior concept frames
The moment of inertia factors of the five bodies, the viscosity ranges of the two creep mechanisms, and the Rayleigh number against mantle viscosity join the notes with one lead-in sentence each and the deck as hero frames after the concept frames they illustrate. Every number comes from the notes or the deck text, and the scripts pass the text-ink collision check.
1 parent 6cf9b04 commit b4de30e

13 files changed

Lines changed: 337 additions & 0 deletions
24.7 KB
Binary file not shown.
27.9 KB
Binary file not shown.
28 KB
Binary file not shown.

book/08_interiors/interiors.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ The measured value is $C/MR^2 = 0.3307$, close to our two-layer estimate, with t
145145
**Key insight:** A single number, $C/MR^2$, immediately distinguishes an undifferentiated rubble pile (0.4) from a strongly differentiated body like Earth (0.33). This is often the first constraint available for a newly characterised planet or moon.
146146
````
147147

148+
{numref}`fig:moment-of-inertia-factors` sorts the five bodies by this factor.
149+
150+
<!-- Generated by scripts/figures/L08_interiors/fig_moment_of_inertia_factors.py -->
151+
```{figure} figures/moment_of_inertia_factors.avif
152+
:name: fig:moment-of-inertia-factors
153+
:width: 100%
154+
:align: center
155+
156+
The moment of inertia factor $C/MR^2$ for a uniform sphere (0.400), the Moon (0.393), Mars (0.364), Mercury (0.346) and Earth (0.331): a lower value means more mass concentrated toward the centre, from a homogeneous body to one with a large iron core. Values after de Pater and Lissauer (2010). Course-original figure.
157+
```
158+
148159
## Equations of state
149160

150161
To construct a quantitative model of a planetary interior, we need an **equation of state** (EOS) that relates pressure $P$, density $\rho$, and temperature $T$ at every depth. The starting point is **hydrostatic equilibrium**: the condition that pressure at each depth supports the weight of the overlying material. In spherical symmetry {cite:p}`Turcotte2002`:
@@ -280,6 +291,26 @@ The boundary still shapes the flow, however. Global tomographic surveys show tha
280291
End-member regimes of mantle convection. **(a) Whole-mantle convection**: a single circulation pattern carries material from the core-mantle boundary all the way to the surface, and the arrows cross the 660 km discontinuity, drawn dashed because it only weakly impedes the flow. **(b) Layered convection**: separate cells operate above and below the boundary, drawn solid because it blocks the flow, decoupled by the negative Clapeyron slope (the pressure of the phase boundary decreases as temperature increases) of the ringwoodite-to-bridgmanite phase transition at 660 km. Both end members are idealisations: seismic tomography shows slabs crossing the boundary in some subduction zones and stagnating above it in others, favouring whole-mantle circulation with regionally variable resistance at 660 km {cite:p}`Fukao2013`. Schematic; not to scale, and the radius of the 660 km boundary is exaggerated so that a circulation cell fits above it. Course-original figure.
281292
```
282293
294+
{numref}`fig:creep-viscosity-ranges` places the two creep mechanisms on the viscosity axis, and {numref}`fig:rayleigh-viscosity` shows how far Earth's mantle sits above the onset of convection.
295+
296+
<!-- Generated by scripts/figures/L08_interiors/fig_creep_viscosity_ranges.py -->
297+
```{figure} figures/creep_viscosity_ranges.avif
298+
:name: fig:creep-viscosity-ranges
299+
:width: 100%
300+
:align: center
301+
302+
Mantle viscosity by creep mechanism: dislocation creep (defect glide) dominates the upper mantle at $10^{20}$ to $10^{21}$ Pa s, diffusion creep (vacancy migration) the lower mantle at $10^{22}$ to $10^{23}$ Pa s; solid rock flows by solid-state creep once the temperature exceeds about half the melting temperature. Course-original figure.
303+
```
304+
305+
<!-- Generated by scripts/figures/L08_interiors/fig_rayleigh_viscosity.py -->
306+
```{figure} figures/rayleigh_viscosity.avif
307+
:name: fig:rayleigh-viscosity
308+
:width: 100%
309+
:align: center
310+
311+
The Rayleigh number against mantle viscosity for the course's Earth-mantle values ($\alpha = 2 \times 10^{-5}$ K$^{-1}$, $\rho = 4000$ kg m$^{-3}$, $g = 10$ m s$^{-2}$, $\Delta T = 2500$ K, $d = 3 \times 10^6$ m, $\kappa = 10^{-6}$ m$^2$ s$^{-1}$): convection sets in above $\mathrm{Ra}_c \approx 10^3$, and Earth's mantle at $\eta = 10^{21}$ to $10^{22}$ Pa s sits at $\mathrm{Ra} \approx 10^7$ to $10^8$, far above the threshold. Course-original figure.
312+
```
313+
283314
(phase-transitions-section)=
284315
## Phase transitions
285316

book/_static/slides/lecture08.pdf

322 KB
Binary file not shown.
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
"""Mantle viscosity ranges by solid-state creep mechanism.
2+
3+
Silicate rock flows by solid-state creep when temperature exceeds about
4+
0.5 T_melt via dislocation creep in the upper mantle and diffusion creep
5+
in the lower mantle.
6+
"""
7+
8+
from __future__ import annotations
9+
10+
from pathlib import Path
11+
12+
import matplotlib.pyplot as plt
13+
from matplotlib.patches import FancyArrowPatch, Rectangle
14+
15+
from scripts.figures._shared.style import apply_style, save_figure
16+
17+
REPO_ROOT = Path(__file__).resolve().parents[3]
18+
OUT_AVIF = REPO_ROOT / "book/08_interiors/figures/creep_viscosity_ranges.avif"
19+
20+
21+
def make_plot() -> plt.Figure:
22+
"""Build the figure, save it and return it."""
23+
apply_style()
24+
fig, ax = plt.subplots(figsize=(8.8, 4.4))
25+
26+
# Note text above the two rows
27+
ax.text(
28+
10**21.5,
29+
3.45,
30+
"solid rock flows by solid-state creep when T exceeds about 0.5 T_melt",
31+
ha="center",
32+
va="center",
33+
fontsize=10,
34+
fontstyle="italic",
35+
color="0.25",
36+
)
37+
38+
# Upper mantle: dislocation creep (defect glide) from 1e20 to 1e21 Pa s
39+
y_up = 2.05
40+
h = 0.28
41+
r_up = Rectangle(
42+
(1e20, y_up - h / 2),
43+
1e21 - 1e20,
44+
h,
45+
facecolor="#e8f1fa",
46+
edgecolor="#1f6db8",
47+
lw=1.5,
48+
zorder=2,
49+
)
50+
ax.add_patch(r_up)
51+
ax.text(
52+
10**20.5,
53+
y_up + h / 2 + 0.35,
54+
"dislocation creep, upper mantle: 1e20 to 1e21 Pa s\n(defect glide)",
55+
ha="center",
56+
va="bottom",
57+
fontsize=10,
58+
color="#1f6db8",
59+
linespacing=1.3,
60+
)
61+
62+
# Lower mantle: diffusion creep (vacancy migration) from 1e22 to 1e23 Pa s
63+
y_lo = 0.65
64+
r_lo = Rectangle(
65+
(1e22, y_lo - h / 2),
66+
1e23 - 1e22,
67+
h,
68+
facecolor="#fdebd0",
69+
edgecolor="#c46b1a",
70+
lw=1.5,
71+
zorder=2,
72+
)
73+
ax.add_patch(r_lo)
74+
ax.text(
75+
10**22.5,
76+
y_lo + h / 2 + 0.35,
77+
"diffusion creep, lower mantle: 1e22 to 1e23 Pa s\n(vacancy migration)",
78+
ha="center",
79+
va="bottom",
80+
fontsize=10,
81+
color="#c46b1a",
82+
linespacing=1.3,
83+
)
84+
85+
# Viscosity log axis from 1e19 to 1e24 Pa s
86+
ax.set_xscale("log")
87+
ax.set_xlim(1e19, 1e24)
88+
ax.set_xticks([1e19, 1e20, 1e21, 1e22, 1e23, 1e24])
89+
ax.set_xlabel(r"Dynamic viscosity $\eta$ (Pa s)", fontsize=10)
90+
91+
# Vertical limits and aesthetics
92+
ax.set_ylim(0.0, 3.8)
93+
ax.set_yticks([])
94+
ax.spines["left"].set_visible(False)
95+
ax.grid(axis="x", alpha=0.3, linestyle=":")
96+
97+
# Title
98+
ax.set_title("Mantle viscosity by creep mechanism", fontsize=11)
99+
100+
fig.tight_layout()
101+
save_figure(fig, OUT_AVIF)
102+
return fig
103+
104+
105+
def main() -> None:
106+
"""Generate the figure and report its path."""
107+
fig = make_plot()
108+
print(f" plot : {OUT_AVIF}")
109+
plt.close(fig)
110+
111+
112+
if __name__ == "__main__":
113+
main()
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
"""The moment of inertia factor measures central mass concentration.
2+
3+
A uniform sphere has C/MR^2 = 0.400, while differentiated bodies have lower
4+
values down to 0.331 for Earth (de Pater and Lissauer 2010).
5+
"""
6+
7+
from __future__ import annotations
8+
9+
from pathlib import Path
10+
11+
import matplotlib.pyplot as plt
12+
import numpy as np
13+
14+
from scripts.figures._shared.style import apply_style, save_figure, text_color_on
15+
16+
REPO_ROOT = Path(__file__).resolve().parents[3]
17+
OUT_AVIF = REPO_ROOT / "book/08_interiors/figures/moment_of_inertia_factors.avif"
18+
19+
# Data
20+
# "Uniform sphere 0.400 homogeneous; Moon 0.393 small core; Mars 0.364 moderate core;
21+
# Mercury 0.346 large core; Earth 0.331 iron core (de Pater and Lissauer 2010)."
22+
BODIES = ["Uniform sphere", "Moon", "Mars", "Mercury", "Earth"]
23+
FACTORS = [0.400, 0.393, 0.364, 0.346, 0.331]
24+
STATES = ["homogeneous", "small core", "moderate core", "large core", "iron core"]
25+
26+
# Colours from approved palette (Rule 4): grey-blue, blue, orange, green, red
27+
COLORS = ["#4a6984", "#1f6db8", "#c46b1a", "#2ca25f", "#c0392b"]
28+
29+
30+
def make_plot() -> plt.Figure:
31+
"""Build the figure, save it and return it."""
32+
apply_style()
33+
fig, ax = plt.subplots(figsize=(8.0, 4.2))
34+
35+
# Bars sorted from 0.400 down: Uniform sphere at top, Earth at bottom
36+
y_pos = np.arange(len(BODIES))[::-1]
37+
ax.barh(y_pos, FACTORS, height=0.50, color=COLORS, edgecolor="none")
38+
39+
# Inscribed numerical values inside bars with contrast-checked text color
40+
for yi, val, c in zip(y_pos, FACTORS, COLORS):
41+
ax.text(val - 0.015, yi, f"{val:.3f}", ha="right", va="center",
42+
color=text_color_on(c), fontsize=10, weight="bold")
43+
44+
# Dashed vertical line at 0.400 labelled 'uniform sphere'
45+
ax.axvline(0.400, color="0.4", linestyle="--", lw=1.2)
46+
ax.text(0.400, 4.6, "uniform sphere", ha="center", va="center",
47+
fontsize=10, color="0.3", bbox=dict(facecolor="white", edgecolor="none", pad=1.5))
48+
49+
# Right-hand annotation column for physical state
50+
for yi, st in zip(y_pos, STATES):
51+
ax.text(0.415, yi, st, ha="left", va="center", fontsize=10, color="0.2")
52+
53+
ax.set_yticks(y_pos)
54+
ax.set_yticklabels(BODIES, fontsize=10)
55+
ax.set_xticks([0.0, 0.1, 0.2, 0.3, 0.4])
56+
ax.set_xlabel(r"Moment of inertia factor $C/MR^2$", fontsize=10)
57+
ax.set_xlim(0.0, 0.52)
58+
ax.set_ylim(-0.6, 5.0)
59+
60+
# Title
61+
ax.set_title("The moment of inertia factor sorts bodies by central concentration", fontsize=11)
62+
ax.grid(axis="x", linestyle=":", alpha=0.3)
63+
ax.grid(axis="y", visible=False)
64+
65+
# Note below the axis
66+
fig.text(0.5, 0.02, r"lower $C/MR^2$ means more mass concentrated toward the centre",
67+
ha="center", va="bottom", fontsize=10, color="0.3")
68+
69+
fig.tight_layout(rect=[0, 0.06, 1, 1])
70+
save_figure(fig, OUT_AVIF)
71+
return fig
72+
73+
74+
def main() -> None:
75+
"""Generate the figure and report its path."""
76+
fig = make_plot()
77+
print(f" plot : {OUT_AVIF}")
78+
plt.close(fig)
79+
80+
81+
if __name__ == "__main__":
82+
main()
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
"""The Rayleigh number governing mantle convection against dynamic viscosity.
2+
3+
Course Earth mantle values: alpha = 2e-5 per K, rho = 4000 kg/m^3, g = 10 m/s^2,
4+
Delta T = 2500 K, d = 3e6 m, kappa = 1e-6 m^2/s, with eta from 1e18 to 1e25 Pa s.
5+
"""
6+
7+
from __future__ import annotations
8+
9+
from pathlib import Path
10+
11+
import matplotlib.pyplot as plt
12+
import numpy as np
13+
14+
from scripts.figures._shared.style import apply_style, save_figure
15+
16+
REPO_ROOT = Path(__file__).resolve().parents[3]
17+
OUT_AVIF = REPO_ROOT / "book/08_interiors/figures/rayleigh_viscosity.avif"
18+
19+
# Earth mantle parameters, "Ra = alpha rho g Delta T d^3 / (kappa eta)")
20+
ALPHA = 2e-5 # Thermal expansivity [K^-1]
21+
RHO = 4000.0 # Mantle density [kg m^-3]
22+
G = 10.0 # Gravitational acceleration [m s^-2]
23+
DELTA_T = 2500.0 # Temperature difference [K]
24+
D = 3e6 # Mantle layer thickness [m]
25+
KAPPA = 1e-6 # Thermal diffusivity [m^2 s^-1]
26+
RA_C = 1e3 # Critical Rayleigh number, Ra_c about 1e3
27+
28+
29+
def make_plot() -> plt.Figure:
30+
"""Build the figure, save it and return it."""
31+
apply_style()
32+
fig, ax = plt.subplots(figsize=(8.2, 4.6))
33+
34+
# Viscosity range: 1e18 to 1e25 Pa s
35+
eta = np.logspace(18, 25, 300)
36+
# Ra = alpha rho g Delta T d^3 / (kappa eta)
37+
ra = (ALPHA * RHO * G * DELTA_T * D**3) / (KAPPA * eta)
38+
39+
ax.set_xscale("log")
40+
ax.set_yscale("log")
41+
ax.set_xlim(1e18, 1e25)
42+
ax.set_ylim(1e2, 1e12)
43+
44+
# Shaded convective regime Ra >= Ra_c
45+
ax.axhspan(RA_C, 1e12, facecolor="#e8f1fa", edgecolor="none", zorder=0)
46+
47+
# Earth mantle band eta = 1e21 to 1e22 Pa s,268,)
48+
ax.axvspan(1e21, 1e22, facecolor="#fdebd0", edgecolor="none", alpha=0.7, zorder=1)
49+
50+
# Critical Rayleigh number onset line,)
51+
ax.axhline(RA_C, color="#c0392b", linestyle="--", lw=1.5, zorder=2)
52+
53+
# Rayleigh number curve,)
54+
ax.plot(eta, ra, color="#1f6db8", lw=2.5, zorder=3)
55+
56+
# Labels placed in empty space
57+
ax.text(
58+
1.5e18, 1.8e3,
59+
"onset of convection, Ra_c about 1e3",
60+
color="#c0392b", fontsize=10, ha="left", va="bottom", zorder=4,
61+
)
62+
ax.text(
63+
2e23, 2e10,
64+
"convects",
65+
color="#1f6db8", fontsize=10, ha="center", va="center", weight="bold", zorder=4,
66+
)
67+
ax.text(
68+
3.16e21, 2e11,
69+
"Earth: Ra about 1e7 to 1e8",
70+
color="#c46b1a", fontsize=10, ha="center", va="center", weight="bold", zorder=4,
71+
)
72+
73+
ax.set_xlabel(r"Mantle dynamic viscosity $\eta$ (Pa s)")
74+
ax.set_ylabel(r"Rayleigh number $\mathrm{Ra}$")
75+
ax.set_title("Convection is decided by the Rayleigh number", fontsize=11)
76+
77+
fig.tight_layout()
78+
save_figure(fig, OUT_AVIF)
79+
return fig
80+
81+
82+
def main() -> None:
83+
"""Generate the figure and report its path."""
84+
fig = make_plot()
85+
print(f" plot : {OUT_AVIF}")
86+
plt.close(fig)
87+
88+
89+
if __name__ == "__main__":
90+
main()

scripts/figures/manifest.csv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,6 @@ fig:radial-velocity-signal,L13_exoplanets,book/13_exoplanets/exoplanets.md,book/
9393
fig:astrometric-signal,L13_exoplanets,book/13_exoplanets/exoplanets.md,book/13_exoplanets/figures/astrometric_signal.avif,self_made_plot,scripts/figures/L13_exoplanets/fig_astrometric_signal.py,,,Course-original sketch for the subsection that had no figure.
9494
fig:microlensing-lightcurve,L13_exoplanets,book/13_exoplanets/exoplanets.md,book/13_exoplanets/figures/microlensing_lightcurve.avif,self_made_plot,scripts/figures/L13_exoplanets/fig_microlensing_lightcurve.py,,,Course-original sketch for the subsection that had no figure.
9595
fig:transit-timing-variations,L13_exoplanets,book/13_exoplanets/exoplanets.md,book/13_exoplanets/figures/transit_timing_variations.avif,self_made_plot,scripts/figures/L13_exoplanets/fig_transit_timing_variations.py,,,Course-original sketch for the subsection that had no figure.
96+
fig:moment-of-inertia-factors,L08_interiors,book/08_interiors/interiors.md,book/08_interiors/figures/moment_of_inertia_factors.avif,self_made_data,scripts/figures/L08_interiors/fig_moment_of_inertia_factors.py,,,Course-original sketch for a concept frame of the deck.
97+
fig:creep-viscosity-ranges,L08_interiors,book/08_interiors/interiors.md,book/08_interiors/figures/creep_viscosity_ranges.avif,self_made_schematic,scripts/figures/L08_interiors/fig_creep_viscosity_ranges.py,,,Course-original sketch for a concept frame of the deck.
98+
fig:rayleigh-viscosity,L08_interiors,book/08_interiors/interiors.md,book/08_interiors/figures/rayleigh_viscosity.avif,self_made_plot,scripts/figures/L08_interiors/fig_rayleigh_viscosity.py,,,Course-original sketch for a concept frame of the deck.
24.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)