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