Despite the static appearance of Earth’s continental crust on human timescales, the composition and structure of the crust has changed markedly throughout Earth history. My group applies a wide range of integrated computational, field, and thermo/geochronological approaches to better understand the history of the solid Earth, particularly including the formation of the continental crust and its coevolution with the biosphere and the surface Earth system.

Research group

Jannitta Yao
Graduate Student

Reina Harding
Graduate Student

Alexander Cox
Graduate Student

Ke Gao
Visiting Graduate Student

Kalin McDannell
Postdoctoral Fellow

Graham Edwards
Postdoctoral Fellow


Theodore Green
Dartmouth Senior Fellow
Class of 2021

Gailin Pease
Master of Science
Class of 2021

Akshay Mehra
Postdoctoral Fellow


For mineral (especially zircon) eruption/deposition age estimation, there is a simple example in this BayeZirChron demo notebook based on Keller, Schoene, & Samperton (2018), or the Chron.jl version of the same notebook:

  • Standalone eruption/deposition age modelling Binder

While originally developed for zircon eruption age estimation, an analagous approach is also applicable to plutonic settings (e.g., Ratschbacher et al., 2018), or to the problem of finding the distribution of the limits of a highly dispersed mineral crystallization (or closure) age spectrum more broadly.

Other Chron.jl example notebooks demonstrate the integration of this eruption/deposition approach with age-depth modelling, or standalone age-depth models.

  • Coupled eruption-age and age-depth modelling Binder

  • Age-depth modelling with simple Gaussian age constraints Binder

  • Age-depth modelling with radiocarbon age constraints Binder

If you’re interested in “statistical geochemistry”, especially weighted bootstrap resampling of whole-rock geochemical data, try StatGeochem.jl (Julia), or else StatisticalGeochemistry (Matlab, no longer actively developed). A number of example usage notebooks are available in the StatGeochem.jl repo, including

  • Weighted bootstrap resampling Binder

  • Julia-alphaMELTS interface demo Binder

  • Julia-Perple_X interface demo Binder

  • Constant-silica reference crustal model (see Keller & Harrison, 2020) Binder

Over the past few years, I have transitioned most of my computational research from a C-and-Matlab two-language workflow (C for heavy lifting / parallel work, and Matlab everything else) to a pure Julia workflow, using MPI.jl for most parallel/HPC work, along with packages like LoopVectoriztion.jl and VectorizedRNG.jl for SIMD performance. I have written up a few notes of advice for anyone else who is interested in doing the same. The short version: efficient multiple dispatch really does provide a solution to the “two-language problem”, but the dispatch-centric programming paradigm can take quite a while to fully internalize; beware type instability.