]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGAtmosphere.cpp
JSBSim tweaks.
[flightgear.git] / src / FDM / JSBSim / FGAtmosphere.cpp
index c73da976504bc56923abc0d4080e982ffff2d503..770e6a5c3d16a84686af846048eb3f15f537b69d 100644 (file)
@@ -1,4 +1,4 @@
-/*******************************************************************************
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
  Module:       FGAtmosphere.cpp
  Author:       Jon Berndt
@@ -36,15 +36,15 @@ HISTORY
 11/24/98   JSB   Created
 07/23/99   TP    Added implementation of 1959 Standard Atmosphere
                  Moved calculation of Mach number to FGTranslation
-********************************************************************************
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 COMMENTS, REFERENCES,  and NOTES
-********************************************************************************
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 [1]   Anderson, John D. "Introduction to Flight, Third Edition", McGraw-Hill,
       1989, ISBN 0-07-001641-0
 
-********************************************************************************
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 INCLUDES
-*******************************************************************************/
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGAtmosphere.h"
 #include "FGState.h"
@@ -57,13 +57,20 @@ INCLUDES
 #include "FGAuxiliary.h"
 #include "FGOutput.h"
 #include "FGDefs.h"
+#include "FGMatrix.h"
 
-/*******************************************************************************
-************************************ CODE **************************************
-*******************************************************************************/
+static const char *IdSrc = "$Id$";
+static const char *IdHdr = ID_ATMOSPHERE;
 
+extern short debug_lvl;
 
-FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex)
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS IMPLEMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+
+FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex),
+                                               vWindNED(3)
 {
   Name = "FGAtmosphere";
   h = 0;
@@ -73,115 +80,138 @@ FGAtmosphere::FGAtmosphere(FGFDMExec* fdmex) : FGModel(fdmex)
   SLdensity     = density;
   SLsoundspeed  = sqrt(SHRATIO*Reng*temperature);
   useExternal=false;
+
+  if (debug_lvl & 2) cout << "Instantiated: " << Name << endl;
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 FGAtmosphere::~FGAtmosphere()
 {
+  if (debug_lvl & 2) cout << "Destroyed:    FGAtmosphere" << endl;
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 bool FGAtmosphere::Run(void)
 {
+  //cout << "In FGAtmosphere::Run(void)" << endl;
   if (!FGModel::Run()) {                 // if false then execute this Run()
+    //do temp, pressure, and density first
     if (!useExternal) {
-      h = State->Geth();
+      //cout << "Atmosphere: Using internal model, altitude= ";
+      h = Position->Geth();
+
       Calculate(h);
     } else {
       density = exDensity;
       pressure = exPressure;
       temperature = exTemperature;
     }
+
+    if (vWindNED(1) != 0.0) psiw = atan2( vWindNED(2), vWindNED(1) );
+
+    if (psiw < 0) psiw += 2*M_PI;
+
     soundspeed = sqrt(SHRATIO*Reng*temperature);
+    //cout << "Atmosphere: soundspeed: " << soundspeed << endl;
     State->Seta(soundspeed);
+
   } else {                               // skip Run() execution this time
   }
   return false;
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
 void FGAtmosphere::Calculate(float altitude)
 {
   //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++;
-      }
+  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;
-    }
+  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)*(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));
+  }
 
+  //cout << "Atmosphere:  h=" << altitude << " rho= " << density << endl;
 
-    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));
-    }
+}
 
-   //cout << "Atmosphere:  h=" << altitude << " rho= " << density << endl;
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+void FGAtmosphere::Debug(void)
+{
+    //TODO: Add your source code here
 }