- double slope, reftemp, refpress;
- int i = lastIndex;
-
- if (altitude < htab[lastIndex]) {
- if (altitude <= 0) {
- i = 0;
- altitude=0;
- } else {
- i = lastIndex-1;
- while (htab[i] > altitude) i--;
- }
- } else if (altitude > htab[lastIndex+1]) {
- if (altitude >= htab[7]) {
- i = 7;
- altitude = htab[7];
- } else {
- i = lastIndex+1;
- while (htab[i+1] < altitude) i++;
- }
- }
-
- switch(i) {
- case 0: // Sea level
- slope = -0.00356616; // R/ft.
- reftemp = 518.67; // in degrees Rankine, 288.15 Kelvin
- refpress = 2116.22; // psf
- //refdens = 0.00237767; // slugs/cubic ft.
- break;
- case 1: // 36089 ft. or 11 km
- slope = 0;
- reftemp = 389.97; // in degrees Rankine, 216.65 Kelvin
- refpress = 472.763;
- //refdens = 0.000706032;
- break;
- case 2: // 65616 ft. or 20 km
- slope = 0.00054864;
- reftemp = 389.97; // in degrees Rankine, 216.65 Kelvin
- refpress = 114.636;
- //refdens = 0.000171306;
- break;
- case 3: // 104986 ft. or 32 km
- slope = 0.001536192;
- reftemp = 411.57; // in degrees Rankine, 228.65 Kelvin
- refpress = 18.128;
- //refdens = 1.18422e-05;
- break;
- case 4: // 154199 ft. 47 km
- slope = 0;
- reftemp = 487.17; // in degrees Rankine, 270.65 Kelvin
- refpress = 2.316;
- //refdens = 4.00585e-7;
- break;
- case 5: // 167322 ft. or 51 km
- slope = -0.001536192;
- reftemp = 487.17; // in degrees Rankine, 270.65 Kelvin
- refpress = 1.398;
- //refdens = 8.17102e-7;
- break;
- case 6: // 232940 ft. or 71 km
- slope = -0.00109728;
- reftemp = 386.368; // in degrees Rankine, 214.649 Kelvin
- refpress = 0.0826;
- //refdens = 8.77702e-9;
- break;
- case 7: // 278385 ft. or 84.8520 km
- slope = 0;
- reftemp = 336.5; // in degrees Rankine, 186.94 Kelvin
- refpress = 0.00831;
- //refdens = 2.19541e-10;
- break;
- default: // sea level
- slope = -0.00356616; // R/ft.
- reftemp = 518.67; // in degrees Rankine, 288.15 Kelvin
- refpress = 2116.22; // psf
- //refdens = 0.00237767; // slugs/cubic ft.
- break;
-
- }
-
- // If delta_T is set, then that is our temperature deviation at any altitude.
- // If not, then we'll estimate a deviation based on the sea level deviation (if set).
-
- if(!StandardTempOnly) {
- T_dev = 0.0;
- if (delta_T != 0.0) {
- T_dev = delta_T;
- } else {
- if ((altitude < 36089.239) && (T_dev_sl != 0.0)) {
- T_dev = T_dev_sl * ( 1.0 - (altitude/36089.239));
- }
- }
- reftemp+=T_dev;
- }
-
- if (slope == 0) {
- intTemperature = reftemp;
- intPressure = refpress*exp(-Inertial->SLgravity()/(reftemp*Reng)*(altitude-htab[i]));
- intDensity = intPressure/(Reng*intTemperature);
- } else {
- intTemperature = reftemp+slope*(altitude-htab[i]);
- intPressure = refpress*pow(intTemperature/reftemp,-Inertial->SLgravity()/(slope*Reng));
- intDensity = intPressure/(Reng*intTemperature);
- }
-
- lastIndex=i;
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-// Calculate parameters derived from T, P and rho
-// Sum gust and turbulence values in NED frame into the wind vector.
-
-void FGAtmosphere::CalculateDerived(void)
-{
- T_dev = (*temperature) - GetTemperature(h);
- density_altitude = h + T_dev * 66.7;
-
- if (turbType != ttNone) Turbulence();
-
- vTotalWindNED = vWindNED + vGustNED + vTurbulenceNED;
-
- // psiw (Wind heading) is the direction the wind is blowing towards
- if (vWindNED(eX) != 0.0) psiw = atan2( vWindNED(eY), vWindNED(eX) );
- if (psiw < 0) psiw += 2*M_PI;
-
- soundspeed = sqrt(SHRatio*Reng*(*temperature));
-
- intViscosity = Beta * pow(intTemperature, 1.5) / (SutherlandConstant + intTemperature);
- intKinematicViscosity = intViscosity / intDensity;
-}
-
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-// Get the standard atmospheric properties at a specified altitude
-
-void FGAtmosphere::GetStdAtmosphere(double altitude) {
- StandardTempOnly = true;
- Calculate(altitude);
- StandardTempOnly = false;
- atmosphere.Temperature = intTemperature;
- atmosphere.Pressure = intPressure;
- atmosphere.Density = intDensity;
-
- // Reset the internal atmospheric state
- Calculate(h);
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-// Get the standard pressure at a specified altitude
-
-double FGAtmosphere::GetPressure(double altitude) {
- GetStdAtmosphere(altitude);
- return atmosphere.Pressure;