Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Forked from [SceneryStackTemplate](https://github.com/OpenPhysics/SceneryStackTe
| `src/common/data/hotspots.ts` | Hand-maintained hotspot list |
| `src/common/data/generated/` | **Generated — do not edit.** `npm run build-data` owns it |
| `src/common/data/generated/motionFrameData.ts` | Rotations belonging to boundaries rather than plates |
| `src/common/data/generated/seafloorAgeData.ts` | Isochrons of the ocean floor, and the ages they are drawn at |
| `src/plate-tectonics/model/PlateTectonicsModel.ts` | All AXON state |
| `src/plate-tectonics/model/EarthquakeDepthFilter.ts` | Depth bands and the filter predicate |
| `src/plate-tectonics/view/PlateTectonicsScreenView.ts` | Layout, view switching, `pdomOrder` |
Expand All @@ -42,7 +43,7 @@ Forked from [SceneryStackTemplate](https://github.com/OpenPhysics/SceneryStackTe
| `src/plate-tectonics/view/CrossSectionNode.ts` | Section + localized annotations |
| `src/plate-tectonics/view/LegendSwatches.ts` | Map symbols, shared by legend and checkboxes |
| `scripts/build-data.ts` | Fetches and reshapes every dataset |
| `scripts/data/` | Fetch cache, GeoTIFF reader, geodesy, emitters |
| `scripts/data/` | Fetch cache, GeoTIFF and netCDF readers, geodesy, contouring, emitters |

## Working on this sim

Expand All @@ -55,15 +56,16 @@ keyed by URL hash, so re-runs are fast and a changed query parameter re-fetches.

`tests/geophysicalData.test.ts` guards the regeneration: it checks structural
integrity and a few facts about the Earth (deep earthquakes cluster around the
Pacific; the Chile profile's deep events sit inland of its shallow ones). Run
`npm test` after any regeneration.
Pacific; the Chile profile's deep events sit inland of its shallow ones; the Atlantic
isochrons step out symmetrically from the ridge as they get older). Run `npm test`
after any regeneration.

`npm run build-data` with no arguments rebuilds everything. Naming steps —
`plate-model`, `land`, `earthquakes`, `volcanoes`, `relief`, `cross-sections` —
rebuilds only those, which is how the PB2002 model can be regenerated without also
pulling a newer earthquake catalogue and a fresh DEM into an unrelated diff.
`plate-model` covers the plates, their boundaries and the motion frames together,
because those three index into each other.
`plate-model`, `land`, `earthquakes`, `volcanoes`, `seafloor-age`, `relief`,
`cross-sections` — rebuilds only those, which is how the PB2002 model can be
regenerated without also pulling a newer earthquake catalogue and a fresh DEM into an
unrelated diff. `plate-model` covers the plates, their boundaries and the motion frames
together, because those three index into each other.

### What moves when the clock runs

Expand Down Expand Up @@ -126,6 +128,12 @@ Boundary colors (red / cyan / violet) and earthquake-depth colors (yellow → or
magenta) have to stay mutually distinguishable *and* readable over the relief raster.
Check both profiles after changing any of them.

`seafloorAgeRampColorProperties` is a five-stop red → blue ramp, interpolated by age
rather than indexed, so the number of isochron ages and the number of color stops are
independent. Its young end deliberately sits near the divergent-boundary red — the
youngest crust *is* the crust at the ridge — and the two are kept apart by line width
and draw order instead of by hue.

## Common components

### PlateTectonicsPanel
Expand Down
17 changes: 16 additions & 1 deletion CREDITS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ GNU Affero General Public License v3.0 or later — see [org LICENSE](https://gi

## Data sources

The simulation renders published observational data. Two of these sources ask for
The simulation renders published observational data. Three of these sources ask for
attribution and all of them deserve it; they are credited on screen, in the About
dialog, and here.

Expand Down Expand Up @@ -52,6 +52,21 @@ Program holdings. Public domain.
Public domain. The shaded relief raster shipped with the sim is rendered from it by
`npm run build-data`.

### Seafloor age — EarthByte

Seton, M., Müller, R. D., Zahirovic, S., Williams, S., Wright, N. M., Cannon, J.,
Whittaker, J. M., Matthews, K. J., & McGirr, R. (2020). *A global data set of
present-day oceanic crustal age and seafloor spreading parameters.* Geochemistry,
Geophysics, Geosystems, 21, e2020GC009214.
[doi:10.1029/2020GC009214](https://doi.org/10.1029/2020GC009214)

The 6-arc-minute present-day age grid (version 2020.1, GTS2012 timescale) published by
the [EarthByte group](https://www.earthbyte.org/category/resources/data-models/seafloor-age/)
at the University of Sydney, under the
[Creative Commons Attribution 4.0 licence](https://creativecommons.org/licenses/by/4.0/).
The isochrons shipped with the sim are contoured from it by `npm run build-data`; the
grid itself is not redistributed.

## Acknowledgments

Built with [SceneryStack](https://scenerystack.org/), from the
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ fitted to the earthquakes that trace it.
- **Volcanoes and hotspots**: ~1 600 Holocene volcanoes plus the major mantle plumes.
- **Topography / bathymetry**: shaded relief rendered from the NOAA global DEM, so
trenches, ridges and mountain belts are visible rather than implied.
- **Seafloor age (isochrons)**: lines of equal crustal age at 10, 20, 40 … 180 Ma,
contoured from the EarthByte age grid. The youngest crust hugs every spreading
ridge and the same ages appear at the same distance on both flanks, getting older
out to the continental margins — seafloor spreading, drawn from the measurements.

**Cross-sections** — the Chile trench, the Mid-Atlantic Ridge, and the San Andreas
fault. The surface profile comes from the DEM, the earthquakes and volcanoes are real
Expand Down Expand Up @@ -82,6 +86,7 @@ and full Interactive Description support.
| Earthquakes | [USGS ANSS ComCat](https://earthquake.usgs.gov/fdsnws/event/1/) | Public domain |
| Volcanoes | [NOAA NCEI](https://www.ngdc.noaa.gov/hazel/) / Smithsonian GVP Holocene volcano list | Public domain |
| Elevation and bathymetry | [NOAA NCEI global DEM mosaic](https://gis.ngdc.noaa.gov/arcgis/rest/services/DEM_mosaics/DEM_global_mosaic/ImageServer) | Public domain |
| Age of the ocean floor | [EarthByte](https://www.earthbyte.org/category/resources/data-models/seafloor-age/) / Seton et al. (2020), doi:10.1029/2020GC009214 | CC BY 4.0 |

## License

Expand Down
13 changes: 12 additions & 1 deletion doc/implementation-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ src/
LegendSwatches.ts the symbols, shared by legend and checkboxes
scripts/
build-data.ts fetches and reshapes every dataset
data/ fetch cache, GeoTIFF reader, geodesy, emitters
data/ fetch cache, GeoTIFF + netCDF readers, geodesy,
marching-squares contouring, emitters
```

## Why the map is a canvas
Expand Down Expand Up @@ -174,6 +175,16 @@ Notable pieces:
- `scripts/data/dem.ts` contains a ~120-line GeoTIFF reader. NOAA's image service
returns an uncompressed, tiled, signed-16-bit TIFF, which is little enough format to
parse directly and saves a dependency.
- `scripts/data/netcdf.ts` reads the classic netCDF-3 format, for the same reason: the
EarthByte age grid is published as a header of big-endian counted fields followed by
the raw values, which is small enough to parse directly and saves the build a
dependency on the netCDF/HDF5 stack.
- `scripts/data/contour.ts` is marching squares, used once, to turn that age grid into
isochron polylines. Cells with a missing corner are skipped whole, so a contour stops
at the edge of the ocean instead of being interpolated onto land, and it works in
grid coordinates so that two neighbouring cells produce bit-identical crossings on
their shared edge — which is what lets the segments be strung together by exact key
match rather than by proximity.
- Boundary segments are rebuilt from PB2002's *step* file rather than its boundary
file, because only the steps carry the class (`OSR`, `SUB`, `CTF`, …) that the
divergent / convergent / transform colouring needs.
Expand Down
43 changes: 42 additions & 1 deletion doc/model.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ the map show, and it is why the Nazca arrow is long and the Antarctic arrow is a
| Volcanoes | NOAA NCEI Holocene volcano list (Smithsonian GVP holdings) | ~1 600 volcanoes |
| Hotspots | Hand-maintained list of the plumes named in introductory texts | `src/common/data/hotspots.ts` |
| Topography and bathymetry | NOAA NCEI global DEM mosaic | rendered to a shaded relief raster, and sampled along each cross-section |
| Age of the ocean floor | EarthByte / Seton et al. (2020) present-day age grid, doi:10.1029/2020GC009214 | contoured into isochrons at 10, 20, 40 … 180 Ma |

### From PB2002's poles to absolute plate motion

Expand Down Expand Up @@ -102,6 +103,37 @@ The outlines are subdivided until this stops showing: an edge whose ends ride mo
far enough apart to stretch it by more than 200 km over the slider's range is split
and reconsidered. `tests/PlateEvolution.test.ts` holds the whole scheme in place.

## Seafloor isochrons

The **Seafloor age** layer draws the ocean floor's isochrons: the lines along which
the crust is all one age, at 10, 20, 40 … 180 Ma. They come from the EarthByte
present-day age grid, which is built by identifying marine magnetic anomalies —
stripes of alternating remanent magnetisation frozen into basalt as it cools through
the Curie point — and dating them against the geomagnetic polarity timescale, itself
calibrated on radiometrically dated rock. `scripts/build-data.ts` contours the
6-arc-minute grid with marching squares on a 0.3° mesh and simplifies what comes out.

The picture is the argument for seafloor spreading, and it is worth reading in three
steps:

1. **The youngest crust is at the ridges.** The 10 Ma line runs a degree or two either
side of every spreading axis and nowhere else.
2. **The pattern is symmetric.** The same age appears at about the same distance on
*both* flanks, because both plates take roughly half the new crust. Across the
Atlantic at 24° N the 40 Ma line sits about 5° west and 7° east of the axis, the
80 Ma line about 12° and 13°; `tests/geophysicalData.test.ts` asserts that ordering
and that symmetry.
3. **It stops at about 180 Ma.** There is no older ocean floor to find, because it has
all been subducted, while the continents carry rock a *hundred* times older. The
sea floor is not old and permanent; it is a conveyor.

An isochron is frozen into the crust, so unlike a plate boundary it rides its plate —
vertex by vertex, because one isochron can cross several. Two consequences follow when
the clock runs, and both are honest rather than cosmetic. The two flanks of a pair walk
back towards the ridge that made them. And crust younger than the reconstruction has
reached did not exist yet, so at 50 Myr ago the 10, 20 and 40 Ma isochrons are simply
not drawn.

## Earthquake depth bands

Hypocentres are grouped at **70 km** and **300 km**, the conventional shallow /
Expand Down Expand Up @@ -156,7 +188,10 @@ distorting the picture silently.
and watch the events step down along the slab from the trench to 600 km.
3. **Seafloor spreading.** Switch on boundaries and topography, and follow the ridges:
a continuous mountain range down the middle of the Atlantic, marked by shallow
earthquakes and no deep ones at all.
earthquakes and no deep ones at all. Then add **Seafloor age** and turn the other
layers off: the isochrons fan out from that same mountain range, matched pair by
matched pair, red at the axis and blue at the margins. Run the clock back and watch
the young ones disappear into the ridge that had not yet made them.

## What this model is not

Expand Down Expand Up @@ -186,6 +221,12 @@ distorting the picture silently.
- **The relief raster is present-day.** It is hidden as soon as the reconstruction
moves off the present day, because sea floor that has not been created yet cannot be
shown.
- **Isochrons are carried rigidly, not un-made.** Hiding the ones younger than the
reconstruction is right, but the ones that remain are only *rotated* back with their
plates: the ocean between them should also be closing up, and here it is not, because
the model has no way to un-make crust. So running to 50 Myr ago narrows the Atlantic
isochron fan by rather less than it should. The 10 Ma pair walking together onto the
ridge is the honest part of that picture; the 160 Ma pair barely moving is not.
- **Hotspots do not move.** That is deliberate, and it is the physics: a plume is
anchored in the deep mantle while the plate slides over it, which is why the Hawaiian
chain gets older to the north-west.
Loading
Loading