Skip to content

NRLMSISE-00

NRLMSISE-00 atmospheric density model.

See the Drag User Guide for concepts and usage.

NRLMSISE-00 atmospheric density model in pure JAX.

Provides temperature and density profiles of the Earth's atmosphere from ground to thermospheric heights using the NRLMSISE-00 empirical model. All functions are JIT-compatible and work with jax.jit, jax.vmap, and jax.grad.

This implementation is based on Dominik Brodowski's C implementation (https://www.brodo.de/space/nrlmsise/), translated through SatelliteDynamics.jl and the brahe Rust crate to pure JAX.

Typical usage::

from astrojax.space_weather import load_default_sw
from astrojax.orbit_dynamics.nrlmsise00 import density_nrlmsise00
from astrojax.epoch import Epoch

sw = load_default_sw()
epc = Epoch.from_datetime(2020, 6, 1, 12, 0, 0.0)
r_ecef = jnp.array([6778137.0, 0.0, 0.0])
rho = density_nrlmsise00(sw, epc, r_ecef)

density_nrlmsise00(sw, epc, r_ecef)

Atmospheric density [kg/m^3] from ECEF position using NRLMSISE-00.

Functional interface: space weather data is passed as an argument (not global state), enabling use in Monte Carlo simulations where each sample may use different space weather conditions.

Uses gtd7d which includes the contribution of anomalous oxygen in total density (important above ~500 km).

Parameters:

Name Type Description Default
sw SpaceWeatherData

Space weather data (loaded via :func:~astrojax.space_weather.load_default_sw or similar).

required
epc Epoch

Epoch of computation.

required
r_ecef ArrayLike

Satellite position in ECEF frame [m], shape (3,).

required

Returns:

Type Description
Array

Atmospheric density [kg/m^3] (scalar).

Examples:

import jax.numpy as jnp
from astrojax.space_weather import load_default_sw
from astrojax.orbit_dynamics.nrlmsise00 import density_nrlmsise00
from astrojax.epoch import Epoch

sw = load_default_sw()
epc = Epoch.from_datetime(2020, 6, 1, 12, 0, 0.0)
r_ecef = jnp.array([6778137.0, 0.0, 0.0])
rho = density_nrlmsise00(sw, epc, r_ecef)

density_nrlmsise00_geod(sw, epc, geod)

Atmospheric density [kg/m^3] from geodetic coordinates using NRLMSISE-00.

Functional interface: space weather data is passed as an argument.

Parameters:

Name Type Description Default
sw SpaceWeatherData

Space weather data.

required
epc Epoch

Epoch of computation.

required
geod ArrayLike

Geodetic position as [lon_deg, lat_deg, alt_m] where longitude and latitude are in degrees and altitude is in metres.

required

Returns:

Type Description
Array

Atmospheric density [kg/m^3] (scalar).

Examples:

import jax.numpy as jnp
from astrojax.space_weather import load_default_sw
from astrojax.orbit_dynamics.nrlmsise00 import density_nrlmsise00_geod
from astrojax.epoch import Epoch

sw = load_default_sw()
epc = Epoch.from_datetime(2020, 6, 1, 12, 0, 0.0)
geod = jnp.array([-74.0, 40.7, 400e3])
rho = density_nrlmsise00_geod(sw, epc, geod)

gtd7(doy, sec, alt, g_lat, g_lon, lst, f107a, f107, ap, ap_array, use_ap_array=True)

NRLMSISE-00 main driver (thermosphere + lower atmosphere).

Computes atmospheric density and temperature at a given location and time. For altitudes above 72.5 km the thermospheric model is used directly; below that, mesospheric/stratospheric/tropospheric profiles are blended in.

All model switches are set to 1 (full model), with switch[0]=1 (SI units) and switch[9]=-1 (use AP array).

Parameters:

Name Type Description Default
doy ArrayLike

Day of year (1-366).

required
sec ArrayLike

Seconds in day (UT).

required
alt ArrayLike

Altitude [km].

required
g_lat ArrayLike

Geodetic latitude [degrees].

required
g_lon ArrayLike

Geodetic longitude [degrees].

required
lst ArrayLike

Local apparent solar time [hours].

required
f107a ArrayLike

81-day average F10.7 flux.

required
f107 ArrayLike

Daily F10.7 flux.

required
ap ArrayLike

Daily Ap magnetic index.

required
ap_array Array

7-element Ap array for NRLMSISE-00.

required

Returns:

Type Description
tuple[Array, Array]

Tuple of (temperatures [2], densities [9]) where: - temperatures[0]: Exospheric temperature [K] - temperatures[1]: Temperature at altitude [K] - densities[0]: He number density [m^-3] - densities[1]: O number density [m^-3] - densities[2]: N2 number density [m^-3] - densities[3]: O2 number density [m^-3] - densities[4]: Ar number density [m^-3] - densities[5]: Total mass density [kg/m^3] - densities[6]: H number density [m^-3] - densities[7]: N number density [m^-3] - densities[8]: Anomalous O number density [m^-3]

gtd7d(doy, sec, alt, g_lat, g_lon, lst, f107a, f107, ap, ap_array, use_ap_array=True)

NRLMSISE-00 driver with anomalous oxygen in total density.

Same as :func:gtd7 but recalculates total mass density d[5] to include the contribution from anomalous oxygen d[8], which is important above ~500 km.

Parameters:

Name Type Description Default
doy ArrayLike

Day of year (1-366).

required
sec ArrayLike

Seconds in day (UT).

required
alt ArrayLike

Altitude [km].

required
g_lat ArrayLike

Geodetic latitude [degrees].

required
g_lon ArrayLike

Geodetic longitude [degrees].

required
lst ArrayLike

Local apparent solar time [hours].

required
f107a ArrayLike

81-day average F10.7 flux.

required
f107 ArrayLike

Daily F10.7 flux.

required
ap ArrayLike

Daily Ap magnetic index.

required
ap_array Array

7-element Ap array for NRLMSISE-00.

required

Returns:

Name Type Description
Array

Tuple of (temperatures [2], densities [9]).

See Array

func:gtd7 for field descriptions.