Quickstart
This page walks through the core workflows of vplanet_inference, from running a single
forward model to setting up full Bayesian inference.
import vplanet_inference as vpi
import numpy as np
import astropy.units as u
Running a forward model
VplanetModel wraps a VPLanet simulation. You specify which
input parameters to vary, their units, which outputs to collect, and where to read/write
the infiles.
1. Point to a template infile directory
vplanet_inference ships with several template infile sets under vpi.INFILE_DIR.
You can also supply your own:
import os
inpath = os.path.join(vpi.INFILE_DIR, "stellar/")
2. Declare input and output parameters with units
Input parameters follow the VPLanet <body>.<parameter> naming convention.
"vpl.*" parameters belong to vpl.in; all other prefixes correspond to body infiles:
inparams = {
"star.dMass": u.Msun, # stellar mass [solar masses]
"vpl.dStopTime": u.Gyr, # simulation duration [Gyr]
}
Output parameters are addressed as "final.<body>.<quantity>" or
"initial.<body>.<quantity>":
outparams = {
"final.star.Radius": u.Rsun, # final stellar radius [solar radii]
"final.star.Luminosity": u.Lsun, # final stellar luminosity [solar luminosities]
}
3. Initialize the model and run it
vpm = vpi.VplanetModel(
inparams=inparams,
outparams=outparams,
inpath=inpath,
outpath="output/",
)
theta = np.array([1.0, 2.5]) # [M_sun, Gyr]
output = vpm.run_model(theta)
print(output) # array of final values in the units declared above
Tracking time evolution
Pass timesteps to record output at regular intervals throughout the simulation:
vpm = vpi.VplanetModel(
inparams=inparams,
outparams=outparams,
inpath=inpath,
outpath="output/",
timesteps=1e7 * u.yr, # record every 10 Myr
)
output = vpm.run_model(theta)
# output is now a dict: {"Time": ..., "final.star.Radius": ..., ...}
time = output["Time"]
radius_evol = output["final.star.Radius"]
Two-body tidal evolution example
The snippet below models tidal spin-down and circularisation for a stellar binary using the CTL tidal model:
inpath = os.path.join(vpi.INFILE_DIR, "stellar_eqtide/ctl")
inparams = {
"primary.dMass": u.Msun,
"secondary.dMass": u.Msun,
"primary.dRotPeriod": u.day,
"secondary.dRotPeriod": u.day,
"primary.dTidalTau": u.dex(u.s),
"secondary.dTidalTau": u.dex(u.s),
"secondary.dEcc": u.dimensionless_unscaled,
"secondary.dOrbPeriod": u.day,
"vpl.dStopTime": u.Gyr,
}
outparams = {
"final.primary.RotPer": u.day,
"final.secondary.RotPer": u.day,
"final.secondary.OrbPeriod": u.day,
"final.secondary.Eccentricity": u.dimensionless_unscaled,
}
vpm = vpi.VplanetModel(inparams, inpath=inpath, outparams=outparams,
timesteps=1e7 * u.yr, time_init=1e6 * u.yr)
theta = np.array([1.08, 1.07, 5.0, 5.0, -1.0, -1.0, 0.5, 6.0, 5.0])
output = vpm.run_model(theta)