| #!/usr/bin/python3 |
| |
| # SPDX-License-Identifier: Apache-2.0 |
| # Copyright 2020 IBM Corp. |
| |
| # https://en.wikipedia.org/wiki/Barometric_formula |
| |
| from math import exp, log |
| import sys |
| import argparse |
| |
| Pb = 101325.00 |
| Tb = 288.15 |
| Lb = -0.0065 |
| hb = 0 |
| Rstar = 8.3144598 |
| g0 = 9.80665 |
| M = 0.0289644 |
| C0 = 273.15 |
| |
| def P(h): |
| return Pb * exp((-g0 * M * (h - hb)) / (Rstar * Tb)) |
| |
| def T(h): |
| return (h - hb) * Lb + Tb |
| |
| def Hp(p): |
| return (log(p / Pb) * (Rstar * Tb)) / (-g0 * M) + hb |
| |
| def Ht(t): |
| return ((t - Tb) / Lb) + hb |
| |
| def K(c): |
| return C0 + c |
| |
| def C(k): |
| return k - C0 |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--height", type=float, default=None, help="Height above sea level in metres") |
| parser.add_argument("--temperature", type=float, default=None, help="Temperature in Celcius") |
| parser.add_argument("--pressure", type=float, default=None, help="Atmospheric pressure in Pascals") |
| args = parser.parse_args() |
| out = [] |
| if args.height is not None: |
| local = [] |
| local.append("Height") |
| p = P(args.height) |
| local.append("Pressure at {:.2f}m: {:.2f}Pa".format(args.height, p)) |
| c = C(T(args.height)) |
| local.append("Temperature at {:.2f}m: {:.2f}C".format(args.height, c)) |
| out.append("\n\t".join(local)) |
| if args.temperature is not None: |
| local = [] |
| local.append("Temperature") |
| ht = Ht(K(args.temperature)) |
| local.append("Height at {:.2f}C: {:.2f}m".format(args.temperature, ht)) |
| p = P(ht) |
| local.append("Pressure at {:.2f}m: {:.2f}Pa".format(ht, p)) |
| out.append("\n\t".join(local)) |
| if args.pressure is not None: |
| local = [] |
| local.append("Pressure") |
| hp = Hp(args.pressure) |
| local.append("Height at {:.2f}Pa: {:.2f}m".format(args.pressure, hp)) |
| t = C(T(hp)) |
| local.append("Temperature at {:.2f}m: {:.2f}C".format(hp, t)) |
| out.append("\n\t".join(local)) |
| print("\n\n".join(out)) |
| |
| if __name__ == "__main__": |
| main() |