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