Atmospheric for Ruby (International 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.
Prerequsites
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:
geometric_altitude_m
-
Geometric altitude in meters.
geometric_altitude_ft
-
Geometric altitude in feet.
geopotential_altitude_m
-
Geopotential altitude in meters.
geopotential_altitude_ft
-
Geopotential altitude in feet.
temperature_k
-
Temperature in Kelvin. This value is multiplied by 1000.
temperature_c
-
Temperature in Celsius. This value is multiplied by 1000.
pressure_mbar
-
Pressure in millibar.
pressure_mmhg
-
Pressure in mmHg.
density
-
Density in kg/m^3.
acceleration
-
Acceleration in m/s^2.
ppn
-
Ratio of pressure at altitude to pressure at sea level.
rhorhon
-
Ratio of density at altitude to density at sea level.
sqrt_rhorhon
-
Square root of the ratio of density at altitude to density at sea level.
speed_of_sound
-
Speed of sound in m/s.
dynamic_viscosity
-
Dynamic viscosity in kg/(m·s).
kinematic_viscosity
-
Kinematic viscosity in m^2/s.
thermal_conductivity
-
Thermal conductivity in W/(m·K).
pressure_scale_height
-
Pressure scale height in meters.
specific_weight
-
Specific weight in N/m^3.
air_number_density
-
Air number density in particles/m^3.
mean_speed
-
Mean speed of air particles in m/s.
frequency
-
Frequency of air particle collisions in 1/s.
mean_free_path
-
Mean free path of air particles in meters.
require 'atmospheric'
attrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
attrs.geopotential_altitude_m #=> -2000
attrs.geopotential_altitude_ft #=> -6561.68
attrs.geometric_altitude_m #=> -1999
attrs.geometric_altitude_ft #=> -6560
The object can be serialized into YAML or XML.
attrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
attrs.to_yaml
geometric-altitude-m:
value: -1999
unitsml: m
type: integer
geometric-altitude-ft:
value: -6560
unitsml: ft
type: integer
geopotential-altitude-m:
value: -2000
unitsml: m
type: integer
geopotential-altitude-ft:
value: -6562
unitsml: ft
type: integer
temperature-k:
value: 301150
unitsml: K
type: integer
temperature-c:
value: 28000
unitsml: degC
type: integer
pressure-mbar:
value: 1277.74
unitsml: mbar
type: float
pressure-mmhg:
value: 958.382
unitsml: u: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: 347886
unitsml: m*s^-1
type: integer
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
attrs = Atmospheric::Export::AltitudeAttrs.new.set_altitude(
value: -2000,
type: :geopotential,
unit: :meters
)
attrs.to_xml
<atmosphere-attributes>
<geometric-altitude-m unitsml="m" type="integer">-1999</geometric-altitude-m>
<geometric-altitude-ft unitsml="ft" type="integer">-6560</geometric-altitude-ft>
<geopotential-altitude-m unitsml="m" type="integer">-2000</geopotential-altitude-m>
<geopotential-altitude-ft unitsml="ft" type="integer">-6562</geopotential-altitude-ft>
<temperature-k unitsml="K" type="integer">301150</temperature-k>
<temperature-c unitsml="degC" type="integer">28000</temperature-c>
<pressure-mbar unitsml="mbar" type="float">1277.74</pressure-mbar>
<pressure-mmhg unitsml="u:mm_Hg" type="float">958.382</pressure-mmhg>
<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="integer">347886</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>
</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:
pressure_mbar
-
Pressure in millibar.
pressure_mmhg
-
Pressure in mmHg.
geometric_altitude_m
-
Geometric altitude in meters.
geometric_altitude_ft
-
Geometric altitude in feet.
geopotential_altitude_m
-
Geopotential altitude in meters.
geopotential_altitude_ft
-
Geopotential altitude in feet.
attrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
attrs.pressure_mbar #=> 5.0
attrs.pressure_mmhg #=> 3.7503084135
attrs.geopotential_altitude_m #=> 35776
attrs.geopotential_altitude_ft #=> 117377
attrs.geometric_altitude_m #=> 35979
attrs.geometric_altitude_ft #=> 118041
The object can be serialized into YAML or XML.
attrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
attrs.to_yaml
pressure-mbar:
value: 5.0
unitsml: mbar
type: float
pressure-mmhg:
value: 3.7503084135
unitsml: mmhg
type: float
geopotential-altitude-m:
value: 35776
unitsml: m
type: integer
geopotential-altitude-ft:
value: 117377
unitsml: ft
type: integer
geometric-altitude-m:
value: 35979
unitsml: m
type: integer
geometric-altitude-ft:
value: 118041
unitsml: ft
type: integer
attrs = Atmospheric::Export::PressureAttrs.new.set_pressure(
value: 5.0,
unit: :mbar
)
attrs.to_xml
<hypsometrical-attributes>
<pressure-mbar unitsml="mbar" type="float">5.0</pressure-mbar>
<pressure-mmhg unitsml="mmhg" type="float">3.7503084135</pressure-mmhg>
<geometric-altitude-m unitsml="m" type="integer">35979</geometric-altitude-m>
<geometric-altitude-ft unitsml="ft" type="integer">118041</geometric-altitude-ft>
<geopotential-altitude-m unitsml="m" type="integer">35776</geopotential-altitude-m>
<geopotential-altitude-ft unitsml="ft" type="integer">117377</geopotential-altitude-ft>
</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.00157315171192
Formulas 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_name
is 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::HighPrecision
class -
use the
Atmospheric::Isa::Algorithms
class 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
=> Float
Generating 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 of the following keys in the hash:
-
geopotential-altitude-m
-
geopotential-altitude-ft
-
geometric-altitude-m
-
geometric-altitude-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-k
-
temperature-c
-
pressure-mbar
-
pressure-mmhg
-
density
-
acceleration
Atmospheric::Export::Iso25331975.table_5 #=> Lutaml::Model
Atmospheric::Export::Iso25331975.table_5.to_yaml #=> YAML
Table 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 #=> YAML
Table 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 #=> YAML
ISO 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-mbar
-
geopotential-altitude
Atmospheric::Export::Iso25331985.table_1 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_1.to_yaml #=> YAML
Table 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 #=> YAML
Table 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-mmhg
-
geopotential-altitude
Atmospheric::Export::Iso25331985.table_3 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_3.to_yaml #=> YAML
Table 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 #=> YAML
Table 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-mbar
-
pressure-mmhg
Range of (-1000..4599).step(1)
.
Atmospheric::Export::Iso25331985.table_56 #=> Lutaml::Model
Atmospheric::Export::Iso25331985.table_56.to_yaml #=> YAML
ISO 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 #=> YAML
Table 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 #=> YAML
Table 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 #=> YAML
Table 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 #=> YAML
Table 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 #=> YAML
Table 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 #=> YAML
ISO 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-altitude
andby-geometric-altitude
. Each entry underneath is anAltitudeAttrs
object. 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-altitude
andby-geometric-altitude
. Each entry underneath is anAltitudeAttrs
object. 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_meters
except 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
PressureAttrs
object. 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 #=> YAML
The 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-mbar
-
pressure-mmhg
-
geopotential-altitude-m
-
geopotential-altitude-ft
-
geometric-altitude-m
-
geometric-altitude-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 #=> YAML
Table 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.
Testing
General
$ bundle exec rake
Re-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 generate
These 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.0
Each 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.
License
Copyright Ribose.