]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGAtmosphere.cpp
builddir -> srcdir so builds can be done outside the master source directory.
[flightgear.git] / src / FDM / JSBSim / FGAtmosphere.cpp
index 4d4b4744ffc655ceb7799394a8bc5ad222e61dc5..71025aef72e95fefb6ff5b0959b1c03ceb8d7d18 100644 (file)
@@ -57,17 +57,25 @@ INCLUDES
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
 #include "FGDefs.h"
+#include "FGMatrix.h"
 
 /*******************************************************************************
 ************************************ CODE **************************************
 *******************************************************************************/
 
 
-FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex)
+FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex),vWindUVW(3),vWindNED(3)
 {
-  Name = "FGAtmosphere";
-  h=0;
-  Calculate();
+    Name = "FGAtmosphere";
+    h = 0;
+    Calculate(h);
+    SLtemperature = temperature;
+    SLpressure    = pressure;
+    SLdensity     = density;
+    SLsoundspeed  = sqrt(SHRATIO*Reng*temperature);
+    useExternal=false;
+    vWindUVW(1)=0;vWindUVW(2)=0;vWindUVW(3)=0;
+    vWindNED(1)=0;vWindNED(2)=0;vWindNED(3)=0;
 }
 
 
@@ -78,148 +86,127 @@ FGAtmosphere::~FGAtmosphere()
 
 bool FGAtmosphere::Run(void)
 {
-  if (!FGModel::Run()) {                 // if false then execute this Run()
-    h = State->Geth();
-    Calculate();
-    State->Seta(soundspeed);
-  } else {                               // skip Run() execution this time
-  }
-  return false;
-}
-
-
-float FGAtmosphere::CalcRho(float altitude)
-{
-  return (0.00237 - 7.0E-08*altitude
-        + 7.0E-13*altitude*altitude
-        - 2.0E-18*altitude*altitude*altitude);
-}
-
-
-void FGAtmosphere::Calculate(void)
-{
-  //see reference [1]
-
-  float slope,reftemp,refpress,refdens;
-  int i=0;
-  float htab[]={0,36089,82020,154198,173882,259183,295272,344484}; //ft.
-
-  if (h <= htab[0]) {
-    h=0;
-  } else if (h >= htab[7]){
-    i = 7;
-    h = htab[7];
-  } else {
-    while (htab[i+1] < h) {
-      i++;
+    //cout << "In FGAtmosphere::Run(void)" << endl;
+    if (!FGModel::Run()) {                 // if false then execute this Run()
+        //do temp, pressure, and density first
+        if (!useExternal) {
+            //cout << "Atmosphere: Using internal model, altitude= ";
+            h = Position->Geth();
+
+            Calculate(h);
+        } else {
+            density = exDensity;
+            pressure = exPressure;
+            temperature = exTemperature;
+            //switch sign of wind components so that they are
+            //in aircraft reference frame.  The classic example is
+            //takeoff or landing where you always want to fly
+            //into the wind.  Suppose that an aircraft is
+            //taking off into the wind on the runway heading
+            //of pure north.  Into the wind means the wind is
+            //flowing to the south (or negative) direction,
+            //and we know that headwinds increase the relative
+            //velocity, so to make a positive delta U from the
+            //southerly wind the sign must be switched.
+            vWindNED *= -1;
+            vWindUVW  = State->GetTl2b()*vWindNED;
+        }
+        soundspeed = sqrt(SHRATIO*Reng*temperature);
+        //cout << "Atmosphere: soundspeed: " << soundspeed << endl;
+        State->Seta(soundspeed);
+
+
+    } else {                               // skip Run() execution this time
     }
-  }
-
-  switch(i) {
-  case 0:     // sea level
-    slope     = -0.0035662; // R/ft.
-    reftemp   = 518.688;    // R
-    refpress  = 2116.17;    // psf
-    refdens   = 0.0023765;  // slugs/cubic ft.
-    break;
-  case 1:     // 36089 ft.
-    slope     = 0;
-    reftemp   = 389.988;
-    refpress  = 474.1;
-    refdens   = 0.0007078;
-    break;
-  case 2:     // 82020 ft.
-    slope     = 0.00164594;
-    reftemp   = 389.988;
-    refpress  = 52.7838;
-    refdens   = 7.8849E-5;
-    break;
-  case 3:     // 154198 ft.
-    slope     = 0;
-    reftemp   = 508.788;
-    refpress  = 2.62274;
-    refdens   = 3.01379E-6;
-    break;
-  case 4:     // 173882 ft.
-    slope     = -0.00246891;
-    reftemp   = 508.788;
-    refpress  = 1.28428;
-    refdens   = 1.47035e-06;
-    break;
-  case 5:     // 259183 ft.
-    slope     = 0;
-    reftemp   = 298.188;
-    refpress  = 0.0222008;
-    refdens   = 4.33396e-08;
-    break;
-  case 6:     // 295272 ft.
-    slope     = 0.00219459;
-    reftemp   = 298.188;
-    refpress  = 0.00215742;
-    refdens   = 4.21368e-09;
-    break;
-  case 7:     // 344484 ft.
-    slope     = 0;
-    reftemp   = 406.188;
-    refpress  = 0.000153755;
-    refdens   = 2.20384e-10;
-    break;
-  }
-
-
-  if (slope == 0) {
-    temperature = reftemp;
-    pressure = refpress*exp(-GRAVITY/(reftemp*Reng)*(h-htab[i]));
-    density = refdens*exp(-GRAVITY/(reftemp*Reng)*(h-htab[i]));
-  } else {
-    temperature = reftemp+slope*(h-htab[i]);
-    pressure = refpress*pow(temperature/reftemp,-GRAVITY/(slope*Reng));
-    density = refdens*pow(temperature/reftemp,-(GRAVITY/(slope*Reng)+1));
-  }
-
-  soundspeed = sqrt(SHRATIO*Reng*temperature);
-
+    return false;
 }
 
 
-float FGAtmosphere::GetTemperature(float altitude)
+void FGAtmosphere::Calculate(float altitude)
 {
-  if (altitude != h) {
-    h = altitude;
-    Calculate();
-  }
-  return temperature;
-}
+    //see reference [1]
+
+    float slope,reftemp,refpress,refdens;
+    int i=0;
+    float htab[]={0,36089,82020,154198,173882,259183,295272,344484}; //ft.
+    // cout << "Atmosphere:  h=" << altitude << " rho= " << density << endl;
+    if (altitude <= htab[0]) {
+        altitude=0;
+    } else if (altitude >= htab[7]){
+        i = 7;
+        altitude = htab[7];
+    } else {
+        while (htab[i+1] < altitude) {
+            i++;
+        }
+    }
 
+    switch(i) {
+    case 0:     // sea level
+        slope     = -0.0035662; // R/ft.
+        reftemp   = 518.688;    // R
+        refpress  = 2116.17;    // psf
+        refdens   = 0.0023765;  // slugs/cubic ft.
+        break;
+    case 1:     // 36089 ft.
+        slope     = 0;
+        reftemp   = 389.988;
+        refpress  = 474.1;
+        refdens   = 0.0007078;
+        break;
+    case 2:     // 82020 ft.
+        slope     = 0.00164594;
+        reftemp   = 389.988;
+        refpress  = 52.7838;
+        refdens   = 7.8849E-5;
+        break;
+    case 3:     // 154198 ft.
+        slope     = 0;
+        reftemp   = 508.788;
+        refpress  = 2.62274;
+        refdens   = 3.01379E-6;
+        break;
+    case 4:     // 173882 ft.
+        slope     = -0.00246891;
+        reftemp   = 508.788;
+        refpress  = 1.28428;
+        refdens   = 1.47035e-06;
+        break;
+    case 5:     // 259183 ft.
+        slope     = 0;
+        reftemp   = 298.188;
+        refpress  = 0.0222008;
+        refdens   = 4.33396e-08;
+        break;
+    case 6:     // 295272 ft.
+        slope     = 0.00219459;
+        reftemp   = 298.188;
+        refpress  = 0.00215742;
+        refdens   = 4.21368e-09;
+        break;
+    case 7:     // 344484 ft.
+        slope     = 0;
+        reftemp   = 406.188;
+        refpress  = 0.000153755;
+        refdens   = 2.20384e-10;
+        break;
+    }
 
-float FGAtmosphere::GetPressure(float altitude)
-{
-  if (altitude != h) {
-    h = altitude;
-    Calculate();
-  }
 
-  return pressure;
-}
+    if (slope == 0) {
+        temperature = reftemp;
+        pressure = refpress*exp(-GRAVITY/(reftemp*Reng)*(altitude-htab[i]));
+        density = refdens*exp(-GRAVITY/(reftemp*Reng)*(altitude-htab[i]));
+    } else {
+        temperature = reftemp+slope*(altitude-htab[i]);
+        pressure = refpress*pow(temperature/reftemp,-GRAVITY/(slope*Reng));
+        density = refdens*pow(temperature/reftemp,-(GRAVITY/(slope*Reng)+1));
+    }
 
-float FGAtmosphere::GetDensity(float altitude)
-{
-  if (altitude != h) {
-    h = altitude;
-    Calculate();
-  }
+    //cout << "Atmosphere:  h=" << altitude << " rho= " << density << endl;
 
-  return density;
 }
 
 
-float FGAtmosphere::GetSoundSpeed(float altitude)
-{
-  if (altitude != h) {
-    h = altitude;
-    Calculate();
-  }
 
-  return soundspeed;
-}