]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGCoefficient.cpp
builddir -> srcdir so builds can be done outside the master source directory.
[flightgear.git] / src / FDM / JSBSim / FGCoefficient.cpp
index 565b089492793230c24ee16345e67747b17b70fe..849611ea0d27e43a254cec34403a7a57aa2c4df4 100644 (file)
@@ -30,69 +30,6 @@ FUNCTIONAL DESCRIPTION
 This class models the stability derivative coefficient lookup tables or
 equations. Note that the coefficients need not be calculated each delta-t.
 
-The coefficient files are located in the axis subdirectory for each aircraft.
-For instance, for the X-15, you would find subdirectories under the
-aircraft/X-15/ directory named CLIFT, CDRAG, CSIDE, CROLL, CPITCH, CYAW. Under
-each of these directories would be files named a, a0, q, and so on. The file
-named "a" under the CLIFT directory would contain data for the stability
-derivative modeling lift due to a change in alpha. See the FGAircraft.cpp file
-for additional information. The coefficient files have the following format:
-
-<name of coefficient>
-<short description of coefficient with no embedded spaces>
-<method used in calculating the coefficient: TABLE | EQUATION | VECTOR | VALUE>
-  <parameter identifier for table row (if required)>
-  <parameter identifier for table column (if required)>
-<OR'ed list of parameter identifiers needed to turn this coefficient into a force>
-<number of rows in table (if required)>
-<number of columns in table (if required)>
-
-<value of parameter indexing into the column of a table or vector - or value
-  itself for a VALUE coefficient>
-<values of parameter indexing into row of a table if TABLE type> <Value of
-  coefficient at this row and column>
-
-<... repeat above for each column of data in table ...>
-
-As an example for the X-15, for the lift due to mach:
-
-CLa0
-Lift_at_zero_alpha
-Table 8 3
-16384
-32768
-16387
-
-0.00
-0.0 0.0
-0.5 0.4
-0.9 0.9
-1.0 1.6
-1.1 1.3
-1.4 1.0
-2.0 0.5
-3.0 0.5
-
-30000.00
-0.0 0.0
-0.5 0.5
-0.9 1.0
-1.0 1.7
-1.1 1.4
-1.4 1.1
-2.0 0.6
-3.0 0.6
-
-70000.00
-0.0 0.0
-0.5 0.6
-0.9 1.1
-1.0 1.7
-1.1 1.5
-1.4 1.2
-2.0 0.7
-3.0 0.7
-
 Note that the values in a row which index into the table must be the same value
 for each column of data, so the first column of numbers for each altitude are
 seen to be equal, and there are the same number of values for each altitude.
@@ -108,211 +45,151 @@ INCLUDES
 *******************************************************************************/
 
 #include "FGCoefficient.h"
-#include "FGAtmosphere.h"
 #include "FGState.h"
 #include "FGFDMExec.h"
-#include "FGFCS.h"
-#include "FGAircraft.h"
-#include "FGTranslation.h"
-#include "FGRotation.h"
-#include "FGPosition.h"
-#include "FGAuxiliary.h"
-#include "FGOutput.h"
 
 /*******************************************************************************
 ************************************ CODE **************************************
 *******************************************************************************/
 
-FGCoefficient::FGCoefficient(FGFDMExec* fdex, ifstream& coeffDefFile)
+FGCoefficient::FGCoefficient(FGFDMExec* fdex, FGConfigFile* AC_cfg)
 {
-  int r, c;
+  int r, c, start, end, n;
   float ftrashcan;
-  string strashcan;
+  string multparms;
 
   FDMExec     = fdex;
   State       = FDMExec->GetState();
-  Atmosphere  = FDMExec->GetAtmosphere();
-  FCS         = FDMExec->GetFCS();
-  Aircraft    = FDMExec->GetAircraft();
-  Translation = FDMExec->GetTranslation();
-  Rotation    = FDMExec->GetRotation();
-  Position    = FDMExec->GetPosition();
-  Auxiliary   = FDMExec->GetAuxiliary();
-  Output      = FDMExec->GetOutput();
-
-  if (coeffDefFile) {
-    if (!coeffDefFile.fail()) {
-      coeffDefFile >> name;
-      cout << "   " << name << endl;
-      coeffDefFile >> strashcan;
-      coeffDefFile >> description;
-      cout << "   " << description << endl;
-      coeffDefFile >> method;
-      cout << "   " << method << endl;
-
-      if      (method == "EQUATION") type = EQUATION;
-      else if (method == "TABLE")    type = TABLE;
-      else if (method == "VECTOR")   type = VECTOR;
-      else if (method == "VALUE")    type = VALUE;
-      else                           type = UNKNOWN;
-
-      if (type == VECTOR || type == TABLE) {
-        coeffDefFile >> rows;
-        cout << "   Rows: " << rows << " ";
-        if (type == TABLE) {
-          coeffDefFile >> columns;
-          cout << "Cols: " << columns;
-        }
-        coeffDefFile >> LookupR;
-        cout << endl;
-        cout << "   Row indexing parameter: " << LookupR << endl;
-      }
 
+  if (AC_cfg) {
+    name = AC_cfg->GetValue("NAME");
+    method = AC_cfg->GetValue("TYPE");
+
+    AC_cfg->GetNextConfigLine();
+    *AC_cfg >> description;
+
+    cout << "   " << name << endl;
+    cout << "   " << description << endl;
+    cout << "   " << method << endl;
+
+    if      (method == "EQUATION") type = EQUATION;
+    else if (method == "TABLE")    type = TABLE;
+    else if (method == "VECTOR")   type = VECTOR;
+    else if (method == "VALUE")    type = VALUE;
+    else                           type = UNKNOWN;
+
+    if (type == VECTOR || type == TABLE) {
+      *AC_cfg >> rows;
+      cout << "   Rows: " << rows << " ";
       if (type == TABLE) {
-        coeffDefFile >> LookupC;
-        cout << "   Column indexing parameter: " << LookupC << endl;
+        *AC_cfg >> columns;
+        cout << "Cols: " << columns;
       }
 
-      coeffDefFile >> multipliers;
-      cout << "   Non-Dimensionalized by: ";
-      
-      mult_count = 0;
-      if (multipliers & FG_QBAR) {
-        mult_idx[mult_count] = FG_QBAR;
-        mult_count++;
-        cout << "qbar ";
-      }
-      if (multipliers & FG_WINGAREA) {
-        mult_idx[mult_count] = FG_WINGAREA;
-        mult_count++;
-        cout << "S ";
-      }
-      if (multipliers & FG_WINGSPAN) {
-        mult_idx[mult_count] = FG_WINGSPAN;
-        mult_count++;
-        cout << "b ";
-      }
-      if (multipliers & FG_CBAR) {
-        mult_idx[mult_count] = FG_CBAR;
-        mult_count++;
-        cout << "c ";
-      }
-      if (multipliers & FG_ALPHA) {
-        mult_idx[mult_count] = FG_ALPHA;
-        mult_count++;
-        cout << "alpha ";
-      }
-      if (multipliers & FG_ALPHADOT) {
-        mult_idx[mult_count] = FG_ALPHADOT;
-        mult_count++;
-        cout << "alphadot ";
-      }
-      if (multipliers & FG_BETA) {
-        mult_idx[mult_count] = FG_BETA;
-        mult_count++;
-        cout << "beta ";
-      }
-      if (multipliers & FG_BETADOT) {
-        mult_idx[mult_count] = FG_BETADOT;
-        mult_count++;
-        cout << "betadot ";
-      }
-      if (multipliers & FG_PITCHRATE) {
-        mult_idx[mult_count] = FG_PITCHRATE;
-        mult_count++;
-        cout << "q ";
-      }
-      if (multipliers & FG_ROLLRATE) {
-        mult_idx[mult_count] = FG_ROLLRATE;
-        mult_count++;
-        cout << "p ";
-      }
-      if (multipliers & FG_YAWRATE) {
-        mult_idx[mult_count] = FG_YAWRATE;
-        mult_count++;
-        cout << "r ";
-      }
-      if (multipliers & FG_ELEVATOR) {
-        mult_idx[mult_count] = FG_ELEVATOR;
-        mult_count++;
-        cout << "De ";
-      }
-      if (multipliers & FG_AILERON) {
-        mult_idx[mult_count] = FG_AILERON;
-        mult_count++;
-        cout << "Da ";
-      }
-      if (multipliers & FG_RUDDER) {
-        mult_idx[mult_count] = FG_RUDDER;
-        mult_count++;
-        cout << "Dr ";
+      cout << endl;
+
+      *AC_cfg >> multparms;
+      if (multparms.substr(0,1) == "F") {
+        LookupR = State->GetParameterIndex(multparms);
+        cout << "   Row indexing parameter: " << multparms << endl;
+      } else {
+        LookupR = atoi(multparms.c_str());
+        cout << "   Row indexing parameter: " << LookupR << endl;
       }
-      if (multipliers & FG_MACH) {
-        mult_idx[mult_count] = FG_MACH;
-        mult_count++;
-        cout << "Mach ";
+
+    }
+
+    if (type == TABLE) {
+      *AC_cfg >> multparms;
+      if (multparms.substr(0,1) == "F") {
+        LookupC = State->GetParameterIndex(multparms);
+        cout << "   Column indexing parameter: " << multparms << endl;
+      } else {
+        LookupC = atoi(multparms.c_str());
+        cout << "   Column indexing parameter: " << LookupC << endl;
       }
-      if (multipliers & FG_ALTITUDE) {
-        mult_idx[mult_count] = FG_ALTITUDE;
-        mult_count++;
-        cout << "h ";
+    }
+
+    // Here, read in the line of the form (e.g.) FG_MACH|FG_QBAR|FG_ALPHA
+    // where each non-dimensionalizing parameter for this coefficient is
+    // separated by a | character
+
+    *AC_cfg >> multparms;
+
+    end   = multparms.length();
+    n     = multparms.find("|");
+    start = mult_count = multipliers = 0;
+
+    while (n < end && n >= 0) {
+      n -= start;
+      mult_idx[mult_count] = State->GetParameterIndex(multparms.substr(start,n));
+      multipliers += mult_idx[mult_count];
+      mult_count++;
+      start += n+1;
+      n = multparms.find("|",start);
+    }
+    mult_idx[mult_count] = State->GetParameterIndex(multparms.substr(start,n));
+    multipliers += mult_idx[mult_count];
+    mult_count++;
+
+    // End of non-dimensionalizing parameter read-in
+
+    switch(type) {
+    case VALUE:
+      *AC_cfg >> StaticValue;
+      cout << "      Value = " << StaticValue << endl;
+      break;
+    case VECTOR:
+      Allocate(rows,2);
+
+      for (r=1;r<=rows;r++) {
+        *AC_cfg >> Table3D[r][0];
+        *AC_cfg >> Table3D[r][1];
       }
-                       cout << endl;
-                       
-      switch(type) {
-      case VALUE:
-        coeffDefFile >> StaticValue;
-        break;
-      case VECTOR:
-        Allocate(rows,2);
 
-        for (r=1;r<=rows;r++) {
-          coeffDefFile >> Table3D[r][0];
-          coeffDefFile >> Table3D[r][1];
+      for (r=1;r<=rows;r++) {
+        cout << "      ";
+        for (c=0;c<columns;c++) {
+          cout << Table3D[r][c] << "   ";
         }
+        cout << endl;
+      }
 
-        for (r=0;r<=rows;r++) {
-               cout << "       ";
-               for (c=0;c<=columns;c++) {
-                       cout << Table3D[r][c] << "      ";
-               }
-               cout << endl;
-        }
+      break;
+    case TABLE:
+      Allocate(rows, columns);
 
-        break;
-      case TABLE:
-        Allocate(rows, columns);
-
-        for (c=1;c<=columns;c++) {
-          coeffDefFile >> Table3D[0][c];
-          for (r=1;r<=rows;r++) {
-            if ( c==1 ) coeffDefFile >> Table3D[r][0];
-            else coeffDefFile >> ftrashcan;
-            coeffDefFile >> Table3D[r][c];
-          }
+      Table3D[0][0] = 0.0;
+      for (c=1;c<=columns;c++) {
+        *AC_cfg >> Table3D[0][c];
+        for (r=1;r<=rows;r++) {
+          if ( c==1 ) *AC_cfg >> Table3D[r][0];
+          else *AC_cfg >> ftrashcan;
+          *AC_cfg >> Table3D[r][c];
         }
+      }
 
-        for (r=0;r<=rows;r++) {
-               cout << "       ";
-               for (c=0;c<=columns;c++) {
-                       cout << Table3D[r][c] << "      ";
-               }
-               cout << endl;
+      for (r=0;r<=rows;r++) {
+        cout << "      ";
+        for (c=0;c<=columns;c++) {
+          cout << Table3D[r][c] << "   ";
         }
-        
-        break;
+        cout << endl;
       }
-    } else {
-      cerr << "Empty file" << endl;
+
+      break;
     }
+    AC_cfg->GetNextConfigLine();
   }
 }
 
+/******************************************************************************/
 
 FGCoefficient::~FGCoefficient(void)
 {
 }
 
+/******************************************************************************/
 
 bool FGCoefficient::Allocate(int r, int c)
 {
@@ -323,6 +200,7 @@ bool FGCoefficient::Allocate(int r, int c)
   return true;
 }
 
+/******************************************************************************/
 
 bool FGCoefficient::Allocate(int n)
 {
@@ -332,6 +210,7 @@ bool FGCoefficient::Allocate(int n)
   return true;
 }
 
+/******************************************************************************/
 
 float FGCoefficient::Value(float rVal, float cVal)
 {
@@ -352,19 +231,16 @@ float FGCoefficient::Value(float rVal, float cVal)
   col1temp = rFactor*(Table3D[r][c-1] - Table3D[r-1][c-1]) + Table3D[r-1][c-1];
   col2temp = rFactor*(Table3D[r][c] - Table3D[r-1][c]) + Table3D[r-1][c];
 
-  Value = col1temp + cFactor*(col2temp - col1temp);
-  
-//cout << "Value for " << description << " is " << Value;
+  SD = Value = col1temp + cFactor*(col2temp - col1temp);
+
   for (midx=0;midx<mult_count;midx++) {
-    Value *= GetCoeffVal(mult_idx[midx]);
+    Value *= State->GetParameter(mult_idx[midx]);
   }
 
-//cout << " after multipliers it is: " << Value << endl;
-
   return Value;
 }
 
+/******************************************************************************/
 
 float FGCoefficient::Value(float Val)
 {
@@ -372,7 +248,7 @@ float FGCoefficient::Value(float Val)
   int r, midx;
 
   if (rows < 2) return 0.0;
-  
+
   for (r=1;r<=rows;r++) if (Table3D[r][0] >= Val) break;
   r = r < 2 ? 2 : (r > rows    ? rows    : r);
 
@@ -383,38 +259,33 @@ float FGCoefficient::Value(float Val)
     Factor = 1.0;
   }
 
-  Value = Factor*(Table3D[r][1] - Table3D[r-1][1]) + Table3D[r-1][1];
+  SD = Value = Factor*(Table3D[r][1] - Table3D[r-1][1]) + Table3D[r-1][1];
 
-// cout << "Value for " << description << " is " << Value;
   for (midx=0;midx<mult_count;midx++) {
-    Value *= GetCoeffVal(mult_idx[midx]);
+    Value *= State->GetParameter(mult_idx[midx]);
   }
 
-//cout << " after multipliers it is: " << Value << endl;
-
   return Value;
 }
 
+/******************************************************************************/
 
 float FGCoefficient::Value(void)
 {
        float Value;
        int midx;
-       
-       Value = StaticValue;
 
-// cout << "Value for " << description << " is " << Value << endl;
+       SD = Value = StaticValue;
+
   for (midx=0;midx<mult_count;midx++) {
-    Value *= GetCoeffVal(mult_idx[midx]);
+    Value *= State->GetParameter(mult_idx[midx]);
   }
 
-// cout << " after multipliers it is: " << Value << endl;
-
   return Value;
 }
 
+/******************************************************************************/
+
 float FGCoefficient::TotalValue()
 {
   switch(type) {
@@ -423,66 +294,21 @@ float FGCoefficient::TotalValue()
   case 1:
     return (Value());
   case 2:
-    return (Value(GetCoeffVal(LookupR)));
+    return (Value(State->GetParameter(LookupR)));
   case 3:
-    return (Value(GetCoeffVal(LookupR),GetCoeffVal(LookupC)));
+    return (Value(State->GetParameter(LookupR),State->GetParameter(LookupC)));
   case 4:
     return 0.0;
   }
   return 0;
 }
 
-float FGCoefficient::GetCoeffVal(int val_idx)
+/******************************************************************************/
+
+void FGCoefficient::DumpSD(void)
 {
-  switch(val_idx) {
-  case FG_QBAR:
-//cout << "Qbar: " << State->Getqbar() << endl;
-    return State->Getqbar();
-  case FG_WINGAREA:
-//cout << "S: " << Aircraft->GetWingArea() << endl;  
-    return Aircraft->GetWingArea();
-  case FG_WINGSPAN:
-//cout << "b: " << Aircraft->GetWingSpan() << endl;
-    return Aircraft->GetWingSpan();
-  case FG_CBAR:
-//cout << "Cbar: " << Aircraft->Getcbar() << endl;
-    return Aircraft->Getcbar();
-  case FG_ALPHA:
-//cout << "Alpha: " << Translation->Getalpha() << endl;
-    return Translation->Getalpha();
-  case FG_ALPHADOT:
-//cout << "Adot: " << State->Getadot() << endl;
-    return State->Getadot();
-  case FG_BETA:
-//cout << "Beta: " << Translation->Getbeta() << endl;
-    return Translation->Getbeta();
-  case FG_BETADOT:
-//cout << "Bdot: " << State->Getbdot() << endl;
-    return State->Getbdot();
-  case FG_PITCHRATE:
-//cout << "Q: " << Rotation->GetQ() << endl;
-    return Rotation->GetQ();
-  case FG_ROLLRATE:
-//cout << "P: " << Rotation->GetP() << endl;
-    return Rotation->GetP();
-  case FG_YAWRATE:
-//cout << "R: " << Rotation->GetR() << endl;
-    return Rotation->GetR();
-  case FG_ELEVATOR:
-//cout << "De: " << FCS->GetDe() << endl;
-    return FCS->GetDe();
-  case FG_AILERON:
-//cout << "Da: " << FCS->GetDa() << endl;
-    return FCS->GetDa();
-  case FG_RUDDER:
-//cout << "Dr: " << FCS->GetDr() << endl;
-    return FCS->GetDr();
-  case FG_MACH:
-//cout << "Mach: " << State->GetMach() << endl;
-    return State->GetMach();
-  case FG_ALTITUDE:
-//cout << "h: " << State->Geth() << endl;
-    return State->Geth();
-  }
-  return 0;
+  cout << "   " << name << ": " << SD << endl;
 }
+
+/******************************************************************************/
+