xref: /openbmc/openbmc-tools/altitude/altitude (revision a3db66b3)
1#!/usr/bin/python3
2
3# SPDX-License-Identifier: Apache-2.0
4# Copyright 2020 IBM Corp.
5
6# https://en.wikipedia.org/wiki/Barometric_formula
7
8import argparse
9from math import exp, log
10
11Pb = 101325.00
12Tb = 288.15
13Lb = -0.0065
14hb = 0
15Rstar = 8.3144598
16g0 = 9.80665
17M = 0.0289644
18C0 = 273.15
19
20
21def P(h):
22    return Pb * exp((-g0 * M * (h - hb)) / (Rstar * Tb))
23
24
25def T(h):
26    return (h - hb) * Lb + Tb
27
28
29def Hp(p):
30    return (log(p / Pb) * (Rstar * Tb)) / (-g0 * M) + hb
31
32
33def Ht(t):
34    return ((t - Tb) / Lb) + hb
35
36
37def K(c):
38    return C0 + c
39
40
41def C(k):
42    return k - C0
43
44
45def main():
46    parser = argparse.ArgumentParser()
47    parser.add_argument(
48        "--height",
49        type=float,
50        default=None,
51        help="Height above sea level in metres",
52    )
53    parser.add_argument(
54        "--temperature",
55        type=float,
56        default=None,
57        help="Temperature in Celcius",
58    )
59    parser.add_argument(
60        "--pressure",
61        type=float,
62        default=None,
63        help="Atmospheric pressure in Pascals",
64    )
65    args = parser.parse_args()
66    out = []
67    if args.height is not None:
68        local = []
69        local.append("Height")
70        p = P(args.height)
71        local.append("Pressure at {:.2f}m: {:.2f}Pa".format(args.height, p))
72        c = C(T(args.height))
73        local.append("Temperature at {:.2f}m: {:.2f}C".format(args.height, c))
74        out.append("\n\t".join(local))
75    if args.temperature is not None:
76        local = []
77        local.append("Temperature")
78        ht = Ht(K(args.temperature))
79        local.append("Height at {:.2f}C: {:.2f}m".format(args.temperature, ht))
80        p = P(ht)
81        local.append("Pressure at {:.2f}m: {:.2f}Pa".format(ht, p))
82        out.append("\n\t".join(local))
83    if args.pressure is not None:
84        local = []
85        local.append("Pressure")
86        hp = Hp(args.pressure)
87        local.append("Height at {:.2f}Pa: {:.2f}m".format(args.pressure, hp))
88        t = C(T(hp))
89        local.append("Temperature at {:.2f}m: {:.2f}C".format(hp, t))
90        out.append("\n\t".join(local))
91    print("\n\n".join(out))
92
93
94if __name__ == "__main__":
95    main()
96