# Pressure as a function of altitude above 11 km

I need to calculate the force that causes a weather balloon with a specific volume to rise. Having searched for quite a few hours, I found the needed formula that can be used to calculate the pressure at a certain altitude. (surprisingly, the formula given on the German Wikipedia gives better values than that from the English one )

This is needed to get the density of the air, which can then be used with Archimedes' principle to get the buoyancy force of the balloon a that height.

However, it is stated that the formula only returns valid values for altitudes up to 11 km. Is there a way to calculate the air pressure at a higher altitude?

• Really not surprising the Germany page has better formulas. The atmospheric scientists in Germany are remarkable. – farrenthorpe Jan 11 '15 at 1:16
• How did you determine one gave better answers than the other? – Isopycnal Oscillation Jan 11 '15 at 7:53
• @farrenthorpe - The quality of wikipedia pages in different languages has very little to do with the quality of scientists who speak that language. – David Hammen Jan 11 '15 at 8:30
• The formula given on the German wikipedia was much easier to use than the other one; however, that (two) formulars can be used to caclulate the pressure (there are others for the density, too) up to 84 km. – Tacticus Jan 11 '15 at 12:52
• @Tacticus can you add the two equations (German vs English wiki) to the question? Entries in Wikipedia change with time. – Gimelist Nov 26 '16 at 12:01

Those formulas are based on an assumption that the pressure is hydrostatic and the ideal gas law. The example given is limited to 11km but uses the tables from the U.S. Standard Atmosphere which actually go up to $1000$ km. Starting at Page 58 one can find values for pressure density and temperature above 11km.

The original description of the US. Standard Atmosphere 1976 turns out to include much more and detailed information than the Wikipedia article. I've now, finally, got it working using the fixed variables $H_b$, $\rho_b$, $T_b$ and $L_b$, which determine the standard height, (air) density, temperature and lapse rate at layer $b$, respectively. A sufficient overview of those values can be found on the wikipedia.

This approach gives quite accurate results, which fit to the values supplied by Isopycnal Oscillation.

There doesn't seem to be central reference for standard temperature and atmospheric pressure at high altitudes. Below is the code I wrote after combining two resources that can be found in the comments. This C++ code calculates standard atmospheric pressure all the way up to 86km.

  float getStandardPressure(float altitude /* meters */)   //return Pa
{
//Below 51km: Practical Meteorology by Roland Stull, pg 12
//Above 51km: http://www.braeunig.us/space/atmmodel.htm

altitude = altitude / 1000.0f;  //convert meters to km
float geopot_height = getGeopotential(altitude);

float t = getStandardTemperature(geopot_height);

if (geopot_height <= 11)
return  101325 * pow(288.15f / t, -5.255877f);
else if (geopot_height <= 20)
return 22632.06 * exp(-0.1577f * (geopot_height - 11));
else if (geopot_height <= 32)
return 5474.889f * pow(216.65f / t, 34.16319f);
else if (geopot_height <= 47)
return 868.0187f * pow(228.65f / t, 12.2011f);
else if (geopot_height <= 51)
return 110.9063f * exp(-0.1262f * (geopot_height - 47));
else if (geopot_height <= 71)
return 66.93887f * pow(270.65f / t, -12.2011f);
else if (geopot_height <= 84.85)
return 3.956420f * pow(214.65f / t, -17.0816f);

throw std::out_of_range("altitude must be less than 86km. Space domain is not supported yet!");
}

//geopot_height = earth_radius * altitude / (earth_radius + altitude) /// all in kilometers
//temperature is in Kelvin = 273.15 + celcius
float getStandardTemperature(float geopot_height)
{
//standard atmospheric pressure
//Below 51km: Practical Meteorology by Roland Stull, pg 12
//Above 51km: http://www.braeunig.us/space/atmmodel.htm
if (geopot_height <= 11)          //troposphere
return 288.15f - (6.5 * geopot_height);
else if (geopot_height <= 20)     //Staroshere starts
return 216.65f;
else if (geopot_height <= 32)
return 196.65f + geopot_height;
else if (geopot_height <= 47)
return 228.65f + 2.8 * (geopot_height - 32);
else if (geopot_height <= 51)     //Mesosphere starts
return 270.65f;
else if (geopot_height <= 71)
return 270.65f - 2.8 * (geopot_height - 51);
else if (geopot_height <= 84.85)
return 214.65f - 2 * (geopot_height - 71);
//Thermospehere has high kinetic temperature (500c to 2000c) but temperature
//as measured by thermometer would be very low because of almost vaccume
throw std::out_of_range("geopot_height must be less than 85km. Space domain is not supported yet!");
}

float getGeopotential(float altitude_km)
{
constexpr float EARTH_RADIUS =  6356.766; //km
return EARTH_RADIUS * altitude_km / (EARTH_RADIUS + altitude_km);
}