ATMOS_NRLMSISE00
Overview
The ATMOS_NRLMSISE00 function calculates atmospheric temperature, density, and pressure using the NRLMSISE-00 (Naval Research Laboratory Mass Spectrometer and Incoherent Scatter Radar Exosphere) model. This empirical atmospheric model is valid from ground level to 1000 km altitude and accounts for variations due to geographic location, time of year, time of day, and solar activity. For detailed documentation, see the fluids library atmosphere module.
NRLMSISE-00 was developed by the U.S. Naval Research Laboratory and released in 2001, superseding earlier MSIS models. Unlike simpler standard atmosphere models, NRLMSISE-00 incorporates real-world atmospheric variability driven by solar and geomagnetic activity. The model is described in Picone et al. (2002), published in the Journal of Geophysical Research.
The function accepts a 10.7 cm solar flux parameter (daily_flux and avg_flux), which measures solar radio emissions at 2800 MHz. This index, often called F10.7, serves as a proxy for extreme ultraviolet radiation that heats the upper atmosphere. Typical quiet-sun values are around 70 sfu (solar flux units), while active-sun values can exceed 200 sfu. For more on F10.7, see Tapping (2013).
This implementation uses the fluids Python library, which provides a convenient interface to the NRLMSISE-00 model. The function returns temperature in Kelvin (K), mass density in kg/m³, and pressure in Pascals (Pa), with pressure calculated using the ideal gas law from the model’s temperature and density outputs.
This example function is provided as-is without any representation of accuracy.
Excel Usage
=ATMOS_NRLMSISE00(z, latitude, longitude, day, seconds, daily_flux, avg_flux)
z(float, required): Elevation above sea level in meters.latitude(float, optional, default: 0): Latitude in degrees (-90 to 90).longitude(float, optional, default: 0): Longitude in degrees (-180 to 180).day(int, optional, default: 0): Day of year (0-366).seconds(float, optional, default: 0): Seconds since start of day (UT1 time).daily_flux(float, optional, default: 150): Daily average 10.7 cm solar flux.avg_flux(float, optional, default: 150): 81-day average solar flux.
Returns (list[list]): 2D list [[Temperature, Density, Pressure]], or error string.
Examples
Example 1: Standard Atmosphere at 1 km
Inputs:
| z | latitude | longitude | day | seconds | daily_flux | avg_flux |
|---|---|---|---|---|---|---|
| 1000 | 0 | 0 | 0 | 0 | 150 | 150 |
Excel formula:
=ATMOS_NRLMSISE00(1000, 0, 0, 0, 0, 150, 150)
Expected output:
| Result | ||
|---|---|---|
| 293.7 | 1.058 | 89220 |
Example 2: Mid-latitude Summer Day at 5 km
Inputs:
| z | latitude | longitude | day | seconds | daily_flux | avg_flux |
|---|---|---|---|---|---|---|
| 5000 | 45 | 45 | 180 | 0 | 150 | 150 |
Excel formula:
=ATMOS_NRLMSISE00(5000, 45, 45, 180, 0, 150, 150)
Expected output:
| Result | ||
|---|---|---|
| 263.5 | 0.7333 | 55510 |
Example 3: High Altitude at Equator (20 km)
Inputs:
| z | latitude | longitude | day | seconds | daily_flux | avg_flux |
|---|---|---|---|---|---|---|
| 20000 | 0 | 0 | 100 | 0 | 150 | 150 |
Excel formula:
=ATMOS_NRLMSISE00(20000, 0, 0, 100, 0, 150, 150)
Expected output:
| Result | ||
|---|---|---|
| 206.3 | 0.09556 | 5663 |
Example 4: Custom Solar Flux at 10 km
Inputs:
| z | latitude | longitude | day | seconds | daily_flux | avg_flux |
|---|---|---|---|---|---|---|
| 10000 | 30 | -90 | 50 | 36000 | 200 | 180 |
Excel formula:
=ATMOS_NRLMSISE00(10000, 30, -90, 50, 36000, 200, 180)
Expected output:
| Result | ||
|---|---|---|
| 227.9 | 0.4245 | 27800 |
Python Code
import micropip
await micropip.install(["fluids"])
from fluids.atmosphere import ATMOSPHERE_NRLMSISE00 as fluids_ATMOSPHERE_NRLMSISE00
def atmos_nrlmsise00(z, latitude=0, longitude=0, day=0, seconds=0, daily_flux=150, avg_flux=150):
"""
Compute temperature, density, and pressure using the NRLMSISE-00 atmospheric model.
See: https://fluids.readthedocs.io/fluids.atmosphere.html
This example function is provided as-is without any representation of accuracy.
Args:
z (float): Elevation above sea level in meters.
latitude (float, optional): Latitude in degrees (-90 to 90). Default is 0.
longitude (float, optional): Longitude in degrees (-180 to 180). Default is 0.
day (int, optional): Day of year (0-366). Default is 0.
seconds (float, optional): Seconds since start of day (UT1 time). Default is 0.
daily_flux (float, optional): Daily average 10.7 cm solar flux. Default is 150.
avg_flux (float, optional): 81-day average solar flux. Default is 150.
Returns:
list[list]: 2D list [[Temperature, Density, Pressure]], or error string.
"""
# Validate input types and ranges
try:
z = float(z)
latitude = float(latitude)
longitude = float(longitude)
day = int(day)
seconds = float(seconds)
daily_flux = float(daily_flux)
avg_flux = float(avg_flux)
except Exception:
return "Error: Invalid input types."
if not (-90 <= latitude <= 90):
return "Error: latitude must be between -90 and 90 degrees."
if not (-180 <= longitude <= 180):
return "Error: longitude must be between -180 and 180 degrees."
if not (0 <= day <= 366):
return "Error: day must be between 0 and 366."
try:
result = fluids_ATMOSPHERE_NRLMSISE00(z, latitude, longitude, day, seconds, daily_flux, avg_flux)
T = float(result.T)
rho = float(result.rho)
P = float(result.P)
return [[T, rho, P]]
except Exception as e:
return f"Error: {str(e)}"