Jacchia 1977

The Jacchia 1977 model [1] is the last of the static models developed by L. G. Jacchia. It models the atmosphere between 90 km and 2000 km using per-species diffusion equations for N₂, O₂, O, Ar, He, and H, together with empirical corrections for the diurnal, geomagnetic, seasonal-latitudinal, and semiannual variations. Its signature feature is the per-species pseudo exospheric temperature that shifts the diurnal density maximum according to the molecular mass of each species.

Unlike the Jacchia-Roberts 1971 model, the Jacchia 1977 model does not have a closed-form solution. Hence, this package numerically integrates the barometric and diffusion equations, making this model considerably slower than AtmosphericModels.jr1971. The implementation follows the reference Fortran code developed at INPE [2] and is validated against its outputs.

In this package, we can evaluate the model using the following functions:

AtmosphericModels.jacchia1977(instant::DateTime, ϕ_gd::Number, λ::Number, h::Number[, F10::Number, F10ₐ::Number, Kp::Number]; kwargs...) -> Jacchia1977Output
AtmosphericModels.jacchia1977(jd::Number, ϕ_gd::Number, λ::Number, h::Number[, F10::Number, F10ₐ::Number, Kp::Number]; kwargs...) -> Jacchia1977Output

where:

  • jd::Number: Julian day to compute the model.
  • instant::DateTime: Instant to compute the model represented using DateTime.
  • ϕ_gd::Number: Geodetic latitude [rad].
  • λ::Number: Longitude [rad].
  • h::Number: Altitude [m], which must be between 90 km and 2000 km.
  • F10::Number: 10.7-cm solar flux [sfu], evaluated with the lag prescribed in [1] (from 0.9 day to 1.6 days, depending on the local solar time).
  • F10ₐ::Number: 10.7-cm averaged solar flux, Gaussian-weighted mean centered on the input time with a standard width of 71 days [sfu].
  • Kp::Number: Kp geomagnetic index, delayed by 0.1 day to 0.3 day depending on the geomagnetic latitude, as prescribed in [1].

If we omit all space indices, the system tries to obtain them automatically for the selected day jd or instant using the prescriptions in [1]. However, the indices must be already initialized using the function SpaceIndices.init(), and the Gaussian-weighted mean requires the indices to be available up to 213 days after the input time.

These functions return an object of type Jacchia1977Output that contains the following fields:

  • total_density::T: Total atmospheric density [kg / m³].
  • temperature::T: Local temperature at the selected position [K], including the diurnal and geomagnetic variations.
  • exospheric_temperature::T: Mean exospheric temperature above the selected position [K].
  • N2_number_density::T: Number density of N₂ [1 / m³].
  • O2_number_density::T: Number density of O₂ [1 / m³].
  • O_number_density::T: Number density of O [1 / m³].
  • Ar_number_density::T: Number density of Ar [1 / m³].
  • He_number_density::T: Number density of He [1 / m³].
  • H_number_density::T: Number density of H [1 / m³].

Examples

julia> AtmosphericModels.jacchia1977(
           DateTime("2018-06-19T18:35:00"),
           deg2rad(-22),
           deg2rad(-45),
           700e3,
           100,
           100,
           3
       )Jacchia 1977 Atmospheric Model Result:
      Total density :    2.21631e-14  kg / m³
        Temperature :         905.09  K
   Exospheric Temp. :         860.48  K
  N₂ number density :    2.28551e+08  1 / m³
  O₂ number density :    1.43746e+06  1 / m³
  O  number density :     4.0509e+11  1 / m³
  Ar number density :        156.637  1 / m³
  He number density :     1.6832e+12  1 / m³
  H  number density :    1.21185e+11  1 / m³
julia> SpaceIndices.init()
julia> AtmosphericModels.jacchia1977( DateTime("2023-01-01T10:00:00"), deg2rad(-22), deg2rad(-45), 700e3 )Jacchia 1977 Atmospheric Model Result: Total density : 3.71031e-14 kg / m³ Temperature : 1020.40 K Exospheric Temp. : 1079.37 K N₂ number density : 2.13151e+09 1 / m³ O₂ number density : 1.79527e+07 1 / m³ O number density : 1.20056e+12 1 / m³ Ar number density : 3510.22 1 / m³ He number density : 7.44225e+11 1 / m³ H number density : 9.59449e+10 1 / m³

If we use the automatic space index fetching mechanism, it is possible to obtain the fetched values by turning on the debugging logs according to the Julia documentation:

julia> using Logging
julia> with_logger(ConsoleLogger(stderr, Logging.Debug)) do AtmosphericModels.jacchia1977( DateTime("2023-01-01T10:00:00"), deg2rad(-22), deg2rad(-45), 700e3 ) end┌ Debug: Jacchia 1977 - Fetched Space Indices Lagged daily F10.7 : 159.5 sfu (lag = 1.1821357920055 days) Gaussian averaged F10.7 : 152.12946765567946 sfu (window = [-213, 213] days) Delayed Kp : 2.333 (lag = 0.2923920210717513 days) @ SatelliteToolboxAtmosphericModels.AtmosphericModels ~/work/SatelliteToolboxAtmosphericModels.jl/SatelliteToolboxAtmosphericModels.jl/src/jacchia1977/jacchia1977.jl:219 Jacchia 1977 Atmospheric Model Result: Total density : 3.71031e-14 kg / m³ Temperature : 1020.40 K Exospheric Temp. : 1079.37 K N₂ number density : 2.13151e+09 1 / m³ O₂ number density : 1.79527e+07 1 / m³ O number density : 1.20056e+12 1 / m³ Ar number density : 3510.22 1 / m³ He number density : 7.44225e+11 1 / m³ H number density : 9.59449e+10 1 / m³

STELA Variant

The CNES tools STELA and PATRIUS implement a simplified variant of the Jacchia 1977 model [3]: the static model, precomputed as a lookup table, is evaluated at a single local exospheric temperature computed with the hydrogen phase angle (-60°) and a fixed diurnal exponent of 3, the geomagnetic variation of the exospheric temperature is weighted by the altitude profile of eq. 32 of [1], only the semiannual variation is applied to the number densities, and the daily and averaged fluxes are swapped in eq. 20 of [1]. This assembly produces total densities a few percent higher on average than the report formulation, which directly affects, for example, orbital decay analyses.

The keyword variant selects the assembly: Val(:sr375) (default) follows the report [1], whereas Val(:stela) follows the CNES tools, allowing the reproduction of analyses performed with them:

julia> AtmosphericModels.jacchia1977(
           DateTime("2018-06-19T18:35:00"),
           deg2rad(-22),
           deg2rad(-45),
           700e3,
           100,
           100,
           3;
           variant = Val(:stela)
       )Jacchia 1977 Atmospheric Model Result:
      Total density :    1.19978e-14  kg / m³
        Temperature :         905.08  K
   Exospheric Temp. :         905.92  K
  N₂ number density :    1.74793e+08  1 / m³
  O₂ number density :    1.10343e+06  1 / m³
  O  number density :    2.69102e+11  1 / m³
  Ar number density :        121.313  1 / m³
  He number density :    7.03221e+11  1 / m³
  H  number density :    9.93394e+10  1 / m³

Our implementation of the variant evaluates the static model directly instead of interpolating the lookup table. It matches the total density of the reference Java implementation [3] within 0.3 %, which is the bilinear interpolation error of the table grid, and reproduces the decay time of a 500 km sun-synchronous satellite computed by STELA within 0.5 %. Notice that, in this variant, the field exospheric_temperature of the output holds the local exospheric temperature used to evaluate the static model instead of the mean exospheric temperature , and the keyword geomagnetic_profile is not supported.

References

  • [1] Jacchia, L. G (1977). Thermospheric temperature, density and composition: New models. SAO Special Report #375.
  • [2] de Matos, B. S., Carrara, V (1985-1987). Fortran implementation of the Jacchia 1977 model. INPE, São José dos Campos, BR. Available in INPE-atmosphere-models.
  • [3] CNES (2025). Java implementation of the Jacchia 1977 model used by the tools STELA and PATRIUS (class fr.cnes.sirius.patrius.stela.forces.atmospheres. Jacchia77, PATRIUS 4.16). Available in CNES/patrius.