Atmospheric for Ruby (ISO Standard Atmosphere / ICAO Standard Atmosphere (ISA))
Purpose
This repository provides Ruby code for calculating values defined in the following standards:
-
International Standard Atmosphere (ISA) from ISO 2533:1975, ISO 2533:1975/ADD 1:1985 and ISO 2533:1975/ADD 2:1997
Which are technically identical standards but different in presentation and
units (the ICAO document includes ft in addition to m).
This library serves as a reference implementation for the values defined in ISO CD 2533:2025.
Usage
General
This library contains code for two separate, but related, purposes.
-
Calculating atmospheric properties at different altitudes. The algorithms are based on ISO 2533.
-
Generating tables of atmospheric properties at different altitudes. This library is used to data tables provided by the full ISO 2533 series:
-
ISO 2533:1975
-
ISO 2533:1975/ADD 1:1985
-
ISO 2533:1975/ADD 2:1997
-
ISO CD 2533:2025
-
For the typical user who wishes to calculate atmospheric properties, there is no need to worry about how the tables work.
To calculate atmospheric properties, either use the formulas directly or use the
Atmospheric::Export::AltitudeAttrs class to bulk obtain the values needed.
Prerequisites
Include the atmospheric gem in your Gemfile:
gem 'atmospheric'Then use require in code:
require 'atmospheric'Atmospheric attributes by altitude
The Atmospheric::Export::AltitudeAttrs class provides a way to obtain the
atmospheric properties at a particular given altitude, geopotential or
geometric.
The resulting object can also be easily serialized, courtesy of the
lutaml-model library.
Syntax:
require 'atmospheric'
Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: {altitude-value} (1)
type: {altitude-type} (2)
unit: {altitude-unit} <3>,
precision: {precision-mode} (4)
)-
Value of the altitude desired. Integer.
-
Type of altitude. Symbol. One of
:geometric,:geopotential. -
Unit of the altitude. Symbol. One of
:meters,:feet. -
Precision mode. Symbol. One of
:normal,:high,:reduced. Default is:normal.
Each attribute of the AltitudeAttrs object is wrapped in a defined
data class which is associated with a UnitsML unit.
Behavior of the precision mode:
:reduced-
(default) Uses Isa::NormalPrecision for calculations with signficant digits rounding according to the original ISO 2533 specification.
:normal-
Uses Isa::NormalPrecision for calculations without value modification.
:high-
Uses Isa::HighPrecision for calculations without value modifications. This mode uses BigDecimal.
Depending on the type of the value, it is in one of the following classes:
-
Integer. Class:
UnitValueInteger -
Float. Class:
UnitValueFloat
The AltitudeAttrs object provides the following attributes:
All attributes are represented as collections (arrays) to support multiple units:
geometric_altitudes-
Array of geometric altitude values. Units: m, ft.
geopotential_altitudes-
Array of geopotential altitude values. Units: m, ft.
temperatures-
Array of temperature values. Units: K, degC.
pressures-
Array of pressure values. Units: mbar, mm_Hg.
densities-
Array of density values. Units: kg*m^-3.
accelerations-
Array of acceleration values. Units: m*s^-2.
ppns-
Array of pressure ratio values (unitless).
rhorhons-
Array of density ratio values (unitless).
sqrt_rhorhons-
Array of sqrt of density ratio values (unitless).
speeds_of_sound-
Array of speed of sound values. Units: m*s^-1.
dynamic_viscosities-
Array of dynamic viscosity values. Units: Pa*s.
kinematic_viscosities-
Array of kinematic viscosity values. Units: m2*s-1.
thermal_conductivities-
Array of thermal conductivity values. Units: W*m-1*K-1.
pressure_scale_heights-
Array of pressure scale height values. Units: m.
specific_weights-
Array of specific weight values. Units: N*m^-3.
air_number_densities-
Array of air number density values. Units: m^-3.
mean_speeds-
Array of mean speed values. Units: m*s^-1.
frequencies-
Array of frequency values. Units: s^-1.
mean_free_paths-
Array of mean free path values. Units: m.
Each attribute value is wrapped in UnitValueFloat or UnitValueInteger with UnitsML unit metadata.
require 'atmospheric'
attrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
# Access collection values
attrs.geometric_altitudes[0].value #=> -1999 (meters)
attrs.geometric_altitudes[1].value #=> -6560 (feet)
attrs.geopotential_altitudes[0].value #=> -2000 (meters)
attrs.geopotential_altitudes[1].value #=> -6562 (feet)
attrs.temperatures[0].value #=> 301.15 (Kelvin)
attrs.temperatures[1].value #=> 28.0 (Celsius)
attrs.pressures[0].value #=> 1277.74 (mbar)
attrs.pressures[1].value #=> 958.382 (mm_Hg)The object can be serialized into YAML or XML.
attrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
attrs.to_yamlgeometric-altitude:
- value: -1999
unitsml: m
type: integer
- value: -6560
unitsml: ft
type: integer
geopotential-altitude:
- value: -2000
unitsml: m
type: integer
- value: -6562
unitsml: ft
type: integer
temperature:
- value: 301.15
unitsml: K
type: float
- value: 28.0
unitsml: degC
type: float
pressure:
- value: 1277.74
unitsml: mbar
type: float
- value: 958.382
unitsml: mm_Hg
type: float
density:
- value: 1.47808
unitsml: kg*m^-3
type: float
acceleration:
- value: 9.8128
unitsml: m*s^-2
type: float
ppn:
- value: 1.26103
type: float
rhorhon:
- value: 1.20659
type: float
sqrt-rhorhon:
- value: 1.09845
type: float
speed-of-sound:
- value: 347.886
unitsml: m*s^-1
type: float
dynamic-viscosity:
- value: 1.8514e-05
unitsml: Pa*s
type: float
kinematic-viscosity:
- value: 1.2526e-05
unitsml: m^2*s^-1
type: float
thermal-conductivity:
- value: 0.026359
unitsml: W*m^-1*K^-1
type: float
pressure-scale-height:
- value: 8809.5
unitsml: m
type: float
specific-weight:
- value: 14.504
unitsml: N*m^-3
type: float
air-number-density:
- value: 3.0734e+25
unitsml: m^-3
type: float
mean-speed:
- value: 469.18
unitsml: m*s^-1
type: float
frequency:
- value: 8535100000.0
unitsml: s^-1
type: float
mean-free-path:
- value: 5.4971e-08
unitsml: m
type: float
precision: reducedattrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
attrs.to_xml<atmosphere-attributes>
<geometric-altitude unitsml="m" type="integer">-1999</geometric-altitude>
<geometric-altitude unitsml="ft" type="integer">-6560</geometric-altitude>
<geopotential-altitude unitsml="m" type="integer">-2000</geopotential-altitude>
<geopotential-altitude unitsml="ft" type="integer">-6562</geopotential-altitude>
<temperature unitsml="K" type="float">301.15</temperature>
<temperature unitsml="degC" type="float">28.0</temperature>
<pressure unitsml="mbar" type="float">1277.74</pressure>
<pressure unitsml="mm_Hg" type="float">958.382</pressure>
<density unitsml="kg*m^-3" type="float">1.47808</density>
<acceleration unitsml="m*s^-2" type="float">9.8128</acceleration>
<ppn type="float">1.26103</ppn>
<rhorhon type="float">1.20659</rhorhon>
<sqrt-rhorhon type="float">1.09845</sqrt-rhorhon>
<speed-of-sound unitsml="m*s^-1" type="float">347.886</speed-of-sound>
<dynamic-viscosity unitsml="Pa*s" type="float">1.8514e-05</dynamic-viscosity>
<kinematic-viscosity unitsml="m^2*s^-1" type="float">1.2526e-05</kinematic-viscosity>
<thermal-conductivity unitsml="W*m^-1*K^-1" type="float">0.026359</thermal-conductivity>
<pressure-scale-height unitsml="m" type="float">8809.5</pressure-scale-height>
<specific-weight unitsml="N*m^-3" type="float">14.504</specific-weight>
<air-number-density unitsml="m^-3" type="float">3.0734e+25</air-number-density>
<mean-speed unitsml="m*s^-1" type="float">469.18</mean-speed>
<frequency unitsml="s^-1" type="float">8535100000.0</frequency>
<mean-free-path unitsml="m" type="float">5.4971e-08</mean-free-path>
<precision>reduced</precision>
</atmosphere-attributes>Altitude by pressure
The Atmospheric::Export::PressureAttrs class provides a way to obtain the
altitude at a given pressure value (mbar, mmhg).
Syntax:
require 'atmospheric'
Atmospheric::Export::PressureAttrs.new.set_pressure(
value: {pressure-value}, (1)
unit: {pressure-unit}, (2)
precision: {precision-mode} (3)
)-
Value of the pressure desired. Float.
-
Unit of the pressure. Symbol. One of
:mbar,:mmhg.
|
Note
|
The set_pressure method does not yet support high-precision mode.
|
Behavior of the precision mode:
:reduced-
(default) Uses Isa::NormalPrecision for calculations with signficant digits rounding according to the original ISO 2533/ADD 2 specification.
:normal-
Uses Isa::NormalPrecision for calculations without value modification.
:high-
Uses Isa::HighPrecision for calculations without value modifications. This mode uses BigDecimal.
Each attribute of the PressureAttrs object is wrapped in a defined
data class which is associated with a UnitsML unit.
Depending on the type of the value, it is in one of the following classes:
-
Integer. Class:
UnitValueInteger -
Float. Class:
UnitValueFloat
The PressureAttrs object provides the following attributes:
All attributes are represented as collections (arrays) to support multiple units:
pressures-
Array of pressure values. Units: mbar, mm_Hg.
geometric_altitudes-
Array of geometric altitude values. Units: m, ft.
geopotential_altitudes-
Array of geopotential altitude values. Units: m, ft.
attrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
# Access collection values
attrs.pressures[0].value #=> 5.0 (mbar)
attrs.pressures[1].value #=> 3.7503084135 (mm_Hg)
attrs.geopotential_altitudes[0].value #=> 35776.5 (meters)
attrs.geopotential_altitudes[1].value #=> 117377.0 (feet)
attrs.geometric_altitudes[0].value #=> 35979.0 (meters)
attrs.geometric_altitudes[1].value #=> 118041.0 (feet)The object can be serialized into YAML or XML.
attrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
attrs.to_yamlpressure:
- value: 5.0
unitsml: mbar
type: float
- value: 3.7503084135
unitsml: mm_Hg
type: float
geopotential-altitude:
- value: 35776.5
unitsml: m
type: float
- value: 117377.0
unitsml: ft
type: float
geometric-altitude:
- value: 35979.0
unitsml: m
type: float
- value: 118041.0
unitsml: ft
type: floatattrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
attrs.to_xml<hypsometrical-attributes>
<pressure unitsml="mbar" type="float">5.0</pressure>
<pressure unitsml="mm_Hg" type="float">3.7503084135</pressure>
<geometric-altitude unitsml="m" type="float">35979</geometric-altitude>
<geometric-altitude unitsml="ft" type="float">118041</geometric-altitude>
<geopotential-altitude unitsml="m" type="float">35776</geopotential-altitude>
<geopotential-altitude unitsml="ft" type="float">117377</geopotential-altitude>
</hypsometrical-attributes>Algorithms
General
For users who wish to access the algorithms directly, the
Atmospheric::Isa::Algorithms class provides a set of methods for calculating
atmospheric properties at different altitudes.
ISO 2533 specifies a number of formulas for the calculation of atmospheric properties at different altitudes.
These algorithms are implemented in the Atmospheric::Isa::Algorithms class.
There are two ways to use the Atmospheric::Isa::Algorithms class:
-
as a singleton class, using one of the precision modes (see below)
-
as a class instance
require 'atmospheric'
# Singleton class
instance = Atmospheric::Isa::NormalPrecision.instance.instance
instance.geometric_altitude_from_geopotential(100).to_f
=> 100.00157315171192
# Class instance
instance = Atmospheric::Isa::Algorithms.new(precision: :high)
instance.geometric_altitude_from_geopotential(100).to_f
=> 100.00157315171192Formulas and calculations
The Algorithms class supports the following methods for calculating
atmospheric properties.
Syntax:
require 'atmospheric'
instance = Atmospheric::Isa::Algorithms.new.{method_name} (1)-
method_nameis one of the methods listed below.
The available methods are:
Converting between geometric and geopotential altitudes:
-
geometric_altitude_from_geopotential(geopotential_altitude) -
geopotential_altitude_from_geometric(geometric_altitude)
Obtaining the temperature value from an altitude:
-
temperature_at_layer_from_geopotential(geopotential_altitude)(Kelvin) -
temperature_at_layer_celcius(geopotential_altitude)(Celcius)
Obtaining the pressure value from an altitude:
-
pressure_from_geopotential_mbar(geopotential_altitude)(mbar/hPa) -
pressure_from_geopotential_mmhg(geopotential_altitude)(mmHg)
Obtaining other atmospheric properties from an altitude:
-
density_from_geopotential(geopotential_altitude) -
gravity_at_geopotential(geopotential_altitude) -
p_p_n_from_geopotential(geopotential_altitude) -
rho_rho_n_from_geopotential(geopotential_altitude) -
root_rho_rho_n_from_geopotential(geopotential_altitude) -
speed_of_sound_from_geopotential(geopotential_altitude) -
dynamic_viscosity_from_geopotential(geopotential_altitude) -
kinematic_viscosity_from_geopotential(geopotential_altitude) -
thermal_conductivity_from_geopotential(geopotential_altitude) -
pressure_scale_height_from_geopotential(geopotential_altitude) -
specific_weight_from_geopotential(geopotential_altitude) -
air_number_density_from_geopotential(geopotential_altitude) -
mean_air_particle_speed_from_geopotential(geopotential_altitude) -
air_particle_collision_frequency_from_geopotential(geopotential_altitude) -
mean_free_path_of_air_particles_from_geopotential(geopotential_altitude)
Obtaining thermal conductivity from temperature:
-
thermal_conductivity_from_temp(temp)
Obtaining geopotential altitude from a given pressure:
-
geopotential_altitude_from_pressure_mbar(mbar) -
geopotential_altitude_from_pressure_mmhg(mmhg)
Precision modes
There are two precision modes available for calculations.
- High precision mode
-
Uses more accurate constants and number calculations through Ruby’s BigDecimal to provide results with higher precision. Suitable for applications where the utmost accuracy is required.
- Normal precision mode (default)
-
Uses standard constants and number calculations to provide results with sufficient accuracy for most applications.
To use the high precision mode, you can either:
-
use the
Atmospheric::Isa::HighPrecisionclass -
use the
Atmospheric::Isa::Algorithmsclass then call theset_precision(:high)method
require 'atmospheric'
# High precision mode
high_precision_instance = Atmospheric::Isa::HighPrecision.instance
speed_h = Atmospheric::Isa::HighPrecision.instance.speed_of_sound_from_temp(100)
=> 0.200467958523516054299360531511514627125051490111885121917578012786288944852326625441743718038552367514555018117e3
speed_h.class
=> BigDecimal
# Normal precision mode (default)
normal_precision_instance = Atmospheric::Isa::NormalPrecision.instance.instance
speed_n = Atmospheric::Isa::NormalPrecision.instance.instance.speed_of_sound_from_temp(100)
=> 200.46795852351607
speed_n.class
=> FloatGenerating ISO 2533 tables
ISO 2533:1975
All tables in the 1975 edition are arranged in these steps in meters:
(-2000..31999).step(50) + (32000..50999).step(100) + (51000..80000).step(200)
Tables 5 to 7 all have height information as collections (arrays) with UnitsML unit metadata:
-
geometric-altitude(collection: m, ft) -
geopotential-altitude(collection: m, ft)
All YAML tables generated contain these two keys which group altitude values as the ISO 2533 tables are rendered in both types of altitudes:
-
by-geopotential-altitude -
by-geometric-altitude
Table 5
Title: "Temperature (T and t), Pressure (p), Density (p) and Acceleration of free fall (g) in terms of geometric altitude (h) and geopotential altitude (H)"
Provides the following values in addition to geopotential and geometric height:
-
temperature(collection: K, degC) -
pressure(collection: mbar, mm_Hg) -
density -
acceleration
Atmospheric::Export::Iso25331975.table_5 #=> Lutaml::Model
Atmospheric::Export::Iso25331975.table_5.to_yaml #=> YAMLTable 6
Title: "Relations of p’pn, p/pn and bar(p/pn), Speed of sound (a), Dynamic viscosity (p), Kinematic viscosity (v) and Thermal conductivity (lambda) in terms of geometric altitude (h), and geopotential altitude (H)"
Provides the following values in addition to geopotential and geometric height:
-
ppn -
rhorhon -
sqrt-rhorhon -
speed-of-sound -
dynamic-viscosity -
kinematic-viscosity -
thermal-conductivity
Atmospheric::Export::Iso25331975.table_6 #=> Lutaml::Model
Atmospheric::Export::Iso25331975.table_6.to_yaml #=> YAMLTable 7
Title: "Pressure scale height (H_p) Specific weight (gamma), Air number density (n), Mean air-particle speed (v), Air-particle collision frequency (omega) and Mean free path of air particles (l) in terms of geometric altitude (h) and geopotential altitude (H)"
-
pressure-scale-height -
specific-weight -
air-number-density -
mean-speed -
frequency -
mean-free-path
Atmospheric::Export::Iso25331975.table_7 #=> Lutaml::Model
Atmospheric::Export::Iso25331975.table_7.to_yaml #=> YAMLISO 2533 ADD 1:1985
Addendum 1 adds "Hypsometrical tables".
Table 1 (hPa)
Title: "Geopotential altitude as a function of barometric pressure for 5 ⇐ p < 20 hPa at intervals of 0.01 hPa"
For the range of (5.0..19.99).step(0.01) in hPa.
Provides:
-
pressure(collection: mbar, mm_Hg) -
geopotential-altitude
Atmospheric::Export::Iso25331985.table_1 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_1.to_yaml #=> YAMLTable 2 (hPa)
Title: "Geopotential altitude as a function of barometric pressure for 20 ⇐ p < 1200 hPa at intervals of 0.1 hPa"
Same as Table 1 but for the range of (20.0..1199.9).step(0.1) in hPa.
Atmospheric::Export::Iso25331985.table_2 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_2.to_yaml #=> YAMLTable 3 (mmHg)
Title: "Geopotential altitude as a function of barometric pressure for 4 ⇐ p < 10 mmHg at intervals of 0.01 mmHg"
Same as Table 1 but for the range of (4.0..9.99).step(0.01) and results in mmhg.
Provides:
-
pressure(collection: mbar, mm_Hg) -
geopotential-altitude
Atmospheric::Export::Iso25331985.table_3 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_3.to_yaml #=> YAMLTable 4 (mmHg)
Title: "Geopotential altitude as a function of barometric pressure for 10 ⇐ p < 900 mmHg at intervals of 0.1 mmHg"
Same as Table 3 but for the range of (10.0..899.9).step(0.1) and results in mmhg.
Atmospheric::Export::Iso25331985.table_4 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_4.to_yaml #=> YAMLTable 5 (hPa) and Table 6 (mmHg)
The difference is Table 5 is in hPa while Table 6 is in mmHg.
Title: "Barometric pressure, in hectopascals, as a function of geopotential altitude for -1000 ⇐ H < +4600 m at intervals of 1m"
Provides:
-
geopotential-altitude -
pressure(collection: mbar, mm_Hg)
Range of (-1000..4599).step(1).
Atmospheric::Export::Iso25331985.table_56 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_56.to_yaml #=> YAMLISO 2533 ADD 2:1997
Addendum 2 is exactly like ISO 2533:1975 with the tables but extended the tables:
-
1975’s range is -2km to 80km. 1997 provides -5km to 2km (yes -2km to 2km overlaps…)
-
1975 tables only provide H and h in meters. 1997 adds a lookup table of H and h in feet.
(-5000..2000).step(50)
(-16500..-13999).step(250) + (-14000..104999).step(200) + (105000..262500).step(500)
Table 1 (-5km to 2km)
Title: "Temperature (T and t), pressure (p), density (p) and acceleration of free fall (g) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in metres"
Exactly same as ISO 2533:1975 Table 5, but with a different height range.
In addition, pressure at mmHg is no longer produced, but the implementation still provides it for completeness.
Atmospheric::Export::Iso25331997.table_1 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_1.to_yaml #=> YAMLTable 2 (-5km to 2km)
Title: "Relations of p’pn, p/pn and bar(p/pn), Speed of sound (a), Dynamic viscosity (p), Kinematic viscosity (v) and Thermal conductivity (lambda) in terms of geometric altitude (h), and geopotential altitude (H) — Altitudes in metres"
Exactly same as ISO 2533:1975 Table 6, but with a different height range.
Atmospheric::Export::Iso25331997.table_2 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_2.to_yaml #=> YAMLTable 3 (-5km to 2km)
Title: "Pressure scale height (H_p) Specific weight (gamma), Air number density (n), Mean air-particle speed (v), Air-particle collision frequency (omega) and Mean free path of air particles (l) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in metres"
Exactly same as ISO 2533:1975 Table 7, but with a different height range.
Atmospheric::Export::Iso25331997.table_3 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_3.to_yaml #=> YAMLTable 4 (-16.5kft to 262.5kft)
Title: "Temperature (T and t), pressure (p), density (p) and acceleration of free fall (g) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 5, but in feet and different range.
Pressure at mmHg is not produced, but the implementation still provides it for completeness.
Atmospheric::Export::Iso25331997.table_4 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_4.to_yaml #=> YAMLTable 5 (-16.5kft to 262.5kft)
Title: "Relations of p’pn, p/pn and bar(p/pn), Speed of sound (a), Dynamic viscosity (p), Kinematic viscosity (v) and Thermal conductivity (lambda) in terms of geometric altitude (h), and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 6, but in feet and different range.
Atmospheric::Export::Iso25331997.table_5 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_5.to_yaml #=> YAMLTable 6 (-16.5kft to 262.5kft)
Title: "Pressure scale height (H_p) Specific weight (gamma), Air number density (n), Mean air-particle speed (v), Air-particle collision frequency (omega) and Mean free path of air particles (l) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 7, but in feet and different range.
Atmospheric::Export::Iso25331997.table_6 #=> Lutaml::Model
Atmospheric::Export::Iso25331997.table_6.to_yaml #=> YAMLISO 2533:2025
General
ISO 2533 is now being revised targeting a 2025 publication, which will be 50 years since the last edition (1975) and 28 years since it was last updated (1997).
It is currently in the CD stage (Committee Draft) and is expected to be published in 2025.
-
ISO NP 2533:2024. approved in 2024.
-
ISO WD 2533:2024. launched: 2024-11-22, closed: 2025-02-17.
-
ISO CD 2533:2024. pending.
ISO 2533:2025 covers all content in the previously published Addenda, including:
-
Standard atmosphere values from altitude -5km to 80km (geometric and geopotential)
NoteThe 1975 edition provided values from -2km to 80km (even though it said 32km in the title). NoteThe 1997 ADD 2 provided values from -5km to 2km. -
Standard atmosphere values from altitude -16,500ft to 262,500ft (geometric and geopotential)
NoteThe 1997 ADD 2 provided these values. -
Hypsometrical tables (altitude as a function of barometric pressure) (geometric and geopotential; hPa/mbar)
NoteThe 1985 ADD 1 provided these hypsometrical tables in hPa/mbar and mmHg. In the 2024 edition only hPa/mbar is provided.
This document will also align to the values provided in ICAO Doc 7488/3.
All YAML tables generated contain these two keys which group altitude values as the ISO 2533 tables are rendered in both types of altitudes:
-
by-geopotential-altitude -
by-geometric-altitude
The Iso25332025 class provides the following methods to generate tables:
table_atmosphere_meters-
Atmosphere attributes by altitude (m). Grouped by
by-geopotential-altitudeandby-geometric-altitude. Each entry underneath is anAltitudeAttrsobject. The altitude interval values follow these steps:Step 50 from -5k, 100 from 32k, 200 from 51k to 80k.(-5000..31950).step(50) + (32000..50900).step(100) + (51000..80000).step(200)
table_atmosphere_feet-
Atmosphere attributes by altitude (ft). Grouped by
by-geopotential-altitudeandby-geometric-altitude. Each entry underneath is anAltitudeAttrsobject. The altitude interval values follow these steps:Step 250 from -16500, 200 from -14000, 500 from 105000 to 262500(-16500..-13750).step(250) + (-14000..104800).step(200) + (105000..262500).step(500)
table_hypsometrical_altitude-
Atmosphere attributes by altitude (m). This is the same as
table_atmosphere_metersexcept with a modified step.Step 1 from -1000 to 4599(-1000..4599).step(1)
table_hypsometrical_mbar-
Hypsometrical table by pressure (mbar). This is a table that provides altitude values per unit of pressure. Each entry underneath is a
PressureAttrsobject. It follows this step schedule:Step 0.01 from 5 to 20, 0.1 from 20 to 1770.9(5.0..19.99).step(0.01) + (20.0..1770.9).step(0.1)
# Defaults to precision mode `:reduced`
Atmospheric::Export::Iso25332025.table_atmosphere_meters #=> Lutaml::Model
Atmospheric::Export::Iso25332025.table_atmosphere_meters.to_yaml #=> YAML
# To use precision mode `:high`
x = Atmospheric::Export::Iso25332025.table_atmosphere_meters(precision: :high)
x.to_yaml #=> YAMLThe above table methods are used as the data sources for the data tables in ISO 2533:2025:
-
table_atmosphere_meters: Table 5 (meters), Table 6 (meters), Table 7 (meters). This data table is split into 3 tables for readability reasons. -
table_atmosphere_feet: Table 8 (feet), Table 9 (feet), Table 10 (feet). Similarly, this data table is split into 3 tables for readability reasons. -
table_hypsometrical_altitude: Table 11 (mbar). -
table_hypsometrical_mbar: Table 12 (geopotential), Table 13 (geometric).
Table 5 (meters)
|
Note
|
This corresponds to ISO 2533:1975 Table 5 combined with ISO 2533:1975/ADD 1:1997 Table 1. |
Title: "Temperature (T and t), Pressure (p), Density (p) and Acceleration of free fall (g) in terms of geometric altitude (h) and geopotential altitude (H)"
This table is a subset of the table_atmosphere_meters method.
Table 6 (meters)
|
Note
|
This corresponds to ISO 2533:1975 Table 6 combined with ISO 2533:1975/ADD 1:1997 Table 2. |
Title: "Relations of p’pn, p/pn and bar(p/pn), Speed of sound (a), Dynamic viscosity (p), Kinematic viscosity (v) and Thermal conductivity (lambda) in terms of geometric altitude (h), and geopotential altitude (H)"
This table is a subset of the table_atmosphere_meters method.
Table 7 (meters)
|
Note
|
This corresponds to ISO 2533:1975 Table 7 combined with ISO 2533:1975/ADD 1:1997 Table 3. |
Title: "Pressure scale height (H_p) Specific weight (gamma), Air number density (n), Mean air-particle speed (v), Air-particle collision frequency (omega) and Mean free path of air particles (l) in terms of geometric altitude (h) and geopotential altitude (H)"
This table is a subset of the table_atmosphere_meters method.
Table 8 (-16.5kft to 262.5kft)
|
Note
|
This corresponds to ISO 2533:1975/ADD 2:1997 Table 4. |
Title: "Temperature (T and t), pressure (p), density (p) and acceleration of free fall (g) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 5, but in feet and different range.
Pressure at mmHg is not produced, but the implementation still provides it for completeness.
This table is a subset of the table_atmosphere_feet method.
Table 9 (-16.5kft to 262.5kft)
|
Note
|
This corresponds to ISO 2533:1975/ADD 2:1997 Table 5. |
Title: "Relations of p’pn, p/pn and bar(p/pn), Speed of sound (a), Dynamic viscosity (p), Kinematic viscosity (v) and Thermal conductivity (lambda) in terms of geometric altitude (h), and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 6, but in feet and different range.
This table is a subset of the table_atmosphere_feet method.
Table 10 (-16.5kft to 262.5kft)
|
Note
|
This corresponds to ISO 2533:1975/ADD 2:1997 Table 6. |
Title: "Pressure scale height (H_p) Specific weight (gamma), Air number density (n), Mean air-particle speed (v), Air-particle collision frequency (omega) and Mean free path of air particles (l) in terms of geometric altitude (h) and geopotential altitude (H) — Altitudes in feet"
Exactly same as ISO 2533:1975 Table 7, but in feet and different range.
This table is a subset of the table_atmosphere_feet method.
Table 11 (mbar)
|
Note
|
This corresponds to ISO 2533:1975/ADD 1:1985 Table 1 combined with Table 2. |
Title: "Geometric and geopotential altitude as a function of barometric pressure for 5 ⇐ p < 20 hPa at intervals of 0.01 hPa and 20 ⇐ p < 1200 hPa at intervals of 0.1 hPa_"
For the range of (5.0..19.99).step(0.01) + (20.0..1199.9).step(0.1) in hPa.
Provides:
-
pressure(collection: mbar, mm_Hg) -
geopotential-altitude(collection: m, ft) -
geometric-altitude(collection: m, ft)
# Defaults to precision mode `:reduced`
Atmospheric::Export::Iso25332025.table_hypsometrical_mbar #=> Lutaml::Model
Atmospheric::Export::Iso25332025.table_hypsometrical_mbar.to_yaml #=> YAML
# To use precision mode `:high`
x = Atmospheric::Export::Iso25332025.table_hypsometrical_mbar(precision: :high)
x.to_yaml #=> YAMLTable 12 (geopotential altitude, m)
|
Note
|
This corresponds to ISO 2533:1975/ADD 1:1985 Table 5 but in geopotential altitude. |
Title: "Barometric pressure, in hectopascals, as a function of geopotential altitude for -1000 ⇐ H < +4600 m at intervals of 1m"
This table is a subset of the table_atmosphere_meters method.
Table 13 (geometric altitude, m)
|
Note
|
This corresponds to ISO 2533:1975/ADD 1:1985 Table 5, in geometric altitude. |
Title: "Barometric pressure, in hectopascals, as a function of geometric altitude for -1000 ⇐ H < +4600 m at intervals of 1m"
This table is a subset of the table_atmosphere_meters method.
XML Schema
An XSD schema for the XML serialization format is provided at
schema/atmospheric.xsd.
The schema defines the following root elements:
atmospheric-
Polymorphic root element. Two variants:
-
Hypsometrical table: contains
<hypsometrical-attributes>records (pressure → altitude lookup). -
ISO 2533:2025 table: contains
<by-geometric-altitude>and<by-geopotential-altitude>sections, each with<atmospheric-attributes>records.
<!-- Hypsometrical table variant --> <atmospheric> <hypsometrical-attributes> <pressure unitsml="mbar" type="float">1013.25</pressure> <pressure unitsml="mm_Hg" type="float">760.0</pressure> <geometric-altitude unitsml="m" type="float">0.0</geometric-altitude> <geometric-altitude unitsml="ft" type="float">0.0</geometric-altitude> <geopotential-altitude unitsml="m" type="float">0.0</geopotential-altitude> <geopotential-altitude unitsml="ft" type="float">0.0</geopotential-altitude> </hypsometrical-attributes> </atmospheric> <!-- ISO 2533:2025 table variant --> <atmospheric> <by-geometric-altitude> <atmospheric-attributes>...</atmospheric-attributes> </by-geometric-altitude> <by-geopotential-altitude> <atmospheric-attributes>...</atmospheric-attributes> </by-geopotential-altitude> </atmospheric>
-
atmosphere-attributes-
Full atmospheric property record (ISO 2533:2025). Contains all altitude, temperature, pressure, density, and derived properties.
hypsometrical-attributes-
Pressure-to-altitude record. Contains pressure and altitude values.
group-one-attrs-
ISO 2533:1975 Group One record (temperature, pressure, density, acceleration). Temperature values use integer type (scaled by 1000).
attributes-group-
Wrapper for a collection of
<atmospheric-attributes>.
All value elements share a common pattern:
-
Text content: the numeric value
-
unitsmlattribute (optional): the UnitsML unit identifier (e.g.,m,ft,K,mbar) -
typeattribute (required): either"float"or"integer"
<temperature unitsml="K" type="float">288.15</temperature>
<geometric-altitude unitsml="m" type="integer">5000</geometric-altitude>
<ppn type="float">0.53338</ppn> <!-- dimensionless, no unitsml -->Testing
General
$ bundle exec rakeRe-generate fixture tables
The spec/fixtures/iso* directories contains YAML files that are used to
generate the ISO 2533 tables.
To re-generate the tables, run:
$ bundle exec rake clean generateThese tasks are defined in the Rakefile.
Algorithms
Tests are encoded in spec/fixtures/tests.yml in the following format:
- H: -2000.0
h: -1999.0
TK: 301.15
TC: 28.0
p_mbar: 1277.74
p_mmhg: 958.382
rho: 1.47808
g: 9.8128
p_p_n: 1.26103
rho_rho_n: 1.20659
root_rho_rho_n: 1.09845
a: 347.886
mu: 1.8514e-05
v: 1.2526e-05
lambda: 0.026359
H_p: 8809.5
gamma: 14.504
n: 3.0734e+25
v_bar: 469.18
omega: 8535100000.0
l: 549710000.0Each of these values are associated with a cell in the tables of the source documents.
The only defining value in a tests is H (geopotential altitude).
It is used to generate all the other values.
Copyright and license
Copyright Ribose. Licensed under the 3-clause BSD license.