public static double Calculate(double elevation, Atmosphere atmosphere)
        {
            double temperature = atmosphere.Temperature;
            double pressure = atmosphere.Pressure;
            double humidity = atmosphere.Humidity;

            // Process the input values
            double tf = 1.0*temperature; // temperature, deg F
            humidity = 1.0*humidity; // relative humidity, %
            pressure = 1.0*pressure; // altimeter setting, in-Hg
            double z = 1.0*elevation; // geometric elevation, feet

            // Convert to metric units
            const double MB_PER_IN = 33.86389;
            const double M_PER_FT = 0.304800;
            double tc = (5.0/9.0)*(tf - 32);
            double altsetmb = pressure*MB_PER_IN;
            double zm = z*M_PER_FT;

            // Calculate the vapor pressures (mb) given the ambient temperature (c) and relative humidity (c)
            double esmb = CalcVaporPressureWobus(tc);
            double emb = esmb*humidity/100;

            // Calculate geopotential altitude H (m) from geometric altitude (m) Z

            double hm = CalcH(zm);

            // Calculate the absolute pressure given the altimeter setting(mb) and geopotential elevation(meters)

            double actpressmb = CalcAs2Press(altsetmb, hm);

            // Calculate the air density (kg/m3) from absolute pressure (mb) vapor pressure (mb) and temp (c)

            double density = CalcDensity(actpressmb, emb, tc);
            //            double relden = 100*(density/1.225);

            // Calculate the geopotential altitude (m) in ISA with that same density (kg/m3)

            double densaltm = CalcAltitude(density);

            // Calculate geometric altitude Z (m) from geopotential altitude (m) H

            double densaltzm = CalcZ(densaltm);

            // Convert Units for output

            //            const double IN_PER_MB = (1/33.86389);
            //            double actpress = actpressmb*IN_PER_MB;
            const double FT_PER_M = (1/0.304800);
            double densalt = densaltzm*FT_PER_M;

            return RoundNum(densalt, 0);
        }
        public Conditions GetConditions()
        {
            var doc = XDocument.Load(uri.AbsoluteUri);
            doc.Save("results.xml");

            const string WEATHER = "{http://xml.weather.yahoo.com/ns/rss/1.0}";
            const string GEO = "{http://www.w3.org/2003/01/geo/wgs84_pos#}";
            const string ATMOSPHERE = "{0}atmosphere";
            const string CONDITION = "{0}condition";
            const string LATITUDE = "{0}lat";
            const string LONGITUDE = "{0}long";
            var atmosphere = doc.Descendants(string.Format(ATMOSPHERE, WEATHER)).FirstOrDefault();

            var hAttribute = atmosphere.Attribute("humidity");
            var pAttribute = atmosphere.Attribute("pressure");

            if (hAttribute == null || pAttribute == null)
            {
                return Conditions.Empty;
            }

            var h = double.Parse(hAttribute.Value);
            var p = double.Parse(pAttribute.Value);

            XElement condition = doc.Descendants(string.Format(CONDITION, WEATHER)).FirstOrDefault();

            var tAttribute = condition.Attribute("temp");
            if (tAttribute == null)
            {
                return Conditions.Empty;
            }

            var t = double.Parse(tAttribute.Value);

            XElement latitude = doc.Descendants(string.Format(LATITUDE, GEO)).FirstOrDefault();
            XElement longitude = doc.Descendants(string.Format(LONGITUDE, GEO)).FirstOrDefault();

            var lat = new Latitude(double.Parse(latitude.Value));
            var lon = new Longitude(double.Parse(longitude.Value));

            var a = new Atmosphere(t, h, p);
            var l = new Location(lat, lon);

            return new Conditions(a, l);
        }