]> git.mxchange.org Git - flightgear.git/commitdiff
Sync with latest JSBSim.
authorcurt <curt>
Wed, 5 Dec 2001 03:10:20 +0000 (03:10 +0000)
committercurt <curt>
Wed, 5 Dec 2001 03:10:20 +0000 (03:10 +0000)
src/FDM/JSBSim.cxx
src/FDM/JSBSim/FGFCS.cpp
src/FDM/JSBSim/FGFCS.h
src/FDM/JSBSim/FGPropeller.cpp
src/FDM/JSBSim/FGPropeller.h
src/FDM/JSBSim/FGPropulsion.cpp
src/FDM/JSBSim/FGThruster.cpp
src/FDM/JSBSim/FGThruster.h

index a481c7dc1c2c391700ed6f7b035c1fada267df1d..b4c2c7340cbed0dea3415d81254a52305b46d377 100644 (file)
@@ -212,7 +212,7 @@ void FGJSBsim::init() {
     SG_LOG( SG_FLIGHT, SG_INFO, "  Longitude: "
             << Position->GetLongitude() << " deg" );
     SG_LOG( SG_FLIGHT, SG_INFO, "  Altitude: "
-           << Position->Geth() << " feet" );
+        << Position->Geth() << " feet" );
     SG_LOG( SG_FLIGHT, SG_INFO, "  loaded initial conditions" );
 
     SG_LOG( SG_FLIGHT, SG_INFO, "  set dt" );
@@ -330,7 +330,7 @@ bool FGJSBsim::copy_to_JSBsim() {
     for (int i = 0; i < get_num_engines(); i++) {
       FCS->SetThrottleCmd(i, globals->get_controls()->get_throttle(i));
       FCS->SetMixtureCmd(i, globals->get_controls()->get_mixture(i));
-      FCS->SetPropPitchCmd(i, globals->get_controls()->get_prop_advance(i));
+      FCS->SetPropAdvanceCmd(i, globals->get_controls()->get_prop_advance(i));
     }
 
     Position->SetSeaLevelRadius( get_Sea_level_radius() );
@@ -473,13 +473,12 @@ bool FGJSBsim::ToggleDataLogging(bool state) {
 
 //Positions
 void FGJSBsim::set_Latitude(double lat) {
-    static const SGPropertyNode *altitude
-       = fgGetNode("/position/altitude-ft");
+    static const SGPropertyNode *altitude = fgGetNode("/position/altitude-ft");
     double alt;
     if ( altitude->getDoubleValue() > -9990 ) {
-       alt = altitude->getDoubleValue();
+      alt = altitude->getDoubleValue();
     } else {
-       alt = 0.0;
+      alt = 0.0;
     }
 
     double sea_level_radius_meters, lat_geoc;
@@ -487,8 +486,7 @@ void FGJSBsim::set_Latitude(double lat) {
     SG_LOG(SG_FLIGHT,SG_INFO,"FGJSBsim::set_Latitude: " << lat );
     SG_LOG(SG_FLIGHT,SG_INFO," cur alt (ft) =  " << alt );
 
-    sgGeodToGeoc( lat, alt * SG_FEET_TO_METER,
-                 &sea_level_radius_meters, &lat_geoc );
+    sgGeodToGeoc( lat, alt * SG_FEET_TO_METER, &sea_level_radius_meters, &lat_geoc );
     
     _set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET  );
     fgic->SetSeaLevelRadiusFtIC( sea_level_radius_meters * SG_METER_TO_FEET  );
@@ -505,8 +503,7 @@ void FGJSBsim::set_Longitude(double lon) {
 }
 
 void FGJSBsim::set_Altitude(double alt) {
-    static const SGPropertyNode *latitude
-       = fgGetNode("/position/latitude-deg");
+    static const SGPropertyNode *latitude = fgGetNode("/position/latitude-deg");
 
     double sea_level_radius_meters,lat_geoc;
 
@@ -514,7 +511,7 @@ void FGJSBsim::set_Altitude(double alt) {
     SG_LOG(SG_FLIGHT,SG_INFO, "  lat (deg) = " << latitude->getDoubleValue() );
 
     sgGeodToGeoc( latitude->getDoubleValue() * SGD_DEGREES_TO_RADIANS, alt,
-                 &sea_level_radius_meters, &lat_geoc);
+      &sea_level_radius_meters, &lat_geoc);
     _set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET  );
     fgic->SetSeaLevelRadiusFtIC( sea_level_radius_meters * SG_METER_TO_FEET );
     fgic->SetLatitudeRadIC( lat_geoc );
index 7535589a93cb578a872f5e82eaf0ad57d740940a..b08c7c96704af61bc5cd90b3b1f75e84dadcaf48 100644 (file)
@@ -83,8 +83,8 @@ FGFCS::~FGFCS()
   ThrottlePos.clear();
   MixtureCmd.clear();
   MixturePos.clear();
-  PropPitchCmd.clear();
-  PropPitchPos.clear();
+  PropAdvanceCmd.clear();
+  PropAdvance.clear();
 
   unsigned int i;
 
@@ -101,7 +101,7 @@ bool FGFCS::Run(void)
   if (!FGModel::Run()) {
     for (i=0; i<ThrottlePos.size(); i++) ThrottlePos[i] = ThrottleCmd[i];
     for (i=0; i<MixturePos.size(); i++) MixturePos[i] = MixtureCmd[i];
-    for (i=0; i<PropPitchPos.size(); i++) PropPitchPos[i] = PropPitchCmd[i];
+    for (i=0; i<PropAdvance.size(); i++) PropAdvance[i] = PropAdvanceCmd[i];
     for (i=0; i<Components.size(); i++)  Components[i]->Run();
   } else {
   }
@@ -160,7 +160,7 @@ double FGFCS::GetThrottleCmd(int engineNum)
   } else {
     cerr << "Throttle " << engineNum << " does not exist! " << ThrottleCmd.size()
          << " engines exist, but throttle setting for engine " << engineNum
-              << " is selected" << endl;
+         << " is selected" << endl;
   }
   return 0.0;
 }
@@ -215,30 +215,30 @@ void FGFCS::SetMixturePos(int engineNum, double setting)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGFCS::SetPropPitchCmd(int engineNum, double setting)
+void FGFCS::SetPropAdvanceCmd(int engineNum, double setting)
 {
   unsigned int ctr;
 
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<PropPitchCmd.size();ctr++) PropPitchCmd[ctr] = setting;
+      for (ctr=0;ctr<PropAdvanceCmd.size();ctr++) PropAdvanceCmd[ctr] = setting;
     } else {
-      PropPitchCmd[engineNum] = setting;
+      PropAdvanceCmd[engineNum] = setting;
     }
   }
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGFCS::SetPropPitchPos(int engineNum, double setting)
+void FGFCS::SetPropAdvance(int engineNum, double setting)
 {
   unsigned int ctr;
 
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<=PropPitchCmd.size();ctr++) PropPitchPos[ctr] = PropPitchCmd[ctr];
+      for (ctr=0;ctr<=PropAdvanceCmd.size();ctr++) PropAdvance[ctr] = PropAdvanceCmd[ctr];
     } else {
-      PropPitchPos[engineNum] = setting;
+      PropAdvance[engineNum] = setting;
     }
   }
 }
@@ -257,7 +257,7 @@ bool FGFCS::Load(FGConfigFile* AC_cfg)
       token = AC_cfg->GetValue("TYPE");
       if (debug_lvl > 0) cout << "    Loading Component \""
                               << AC_cfg->GetValue("NAME")
-                                               << "\" of type: " << token << endl;
+                              << "\" of type: " << token << endl;
       if ((token == "LAG_FILTER") ||
           (token == "LEAD_LAG_FILTER") ||
           (token == "SECOND_ORDER_FILTER") ||
@@ -364,10 +364,10 @@ void FGFCS::AddThrottle(void)
 {
   ThrottleCmd.push_back(0.0);
   ThrottlePos.push_back(0.0);
-  MixtureCmd.push_back(0.0);   // assume throttle and mixture are coupled
+  MixtureCmd.push_back(0.0);     // assume throttle and mixture are coupled
   MixturePos.push_back(0.0);
-  PropPitchCmd.push_back(0.0); // assume throttle and prop pitch are coupled
-  PropPitchPos.push_back(0.0);
+  PropAdvanceCmd.push_back(0.0); // assume throttle and prop pitch are coupled
+  PropAdvance.push_back(0.0);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index 76b541ce698072b70bf55260cf788aff5b5fba76..edd0b6ef77d09b3a3e371c4250dd5c9022a0a5fe 100644 (file)
@@ -206,7 +206,7 @@ public:
   /** Gets the prop pitch command.
       @param engine engine ID number
       @return pitch command in percent ( 0.0 - 1.0) for the given engine */
-  inline double GetPropPitchCmd(int engine) { return PropPitchCmd[engine]; }
+  inline double GetPropAdvanceCmd(int engine) { return PropAdvanceCmd[engine]; }
 
   /** Gets the pitch trim command.
       @return pitch trim command in radians */
@@ -261,7 +261,7 @@ public:
   /** Gets the prop pitch position.
       @param engine engine ID number
       @return prop pitch position for the given engine in percent ( 0.0-1.0)*/
-  inline double GetPropPitchPos(int engine) { return PropPitchPos[engine]; }
+  inline double GetPropAdvance(int engine) { return PropAdvance[engine]; }
   //@}
 
   /** Retrieves the State object pointer.
@@ -332,7 +332,7 @@ public:
   /** Sets the propeller pitch command for the specified engine
       @param engine engine ID number
       @param cmd mixture command in percent (0.0 - 1.0)*/
-  void SetPropPitchCmd(int engine, double cmd);
+  void SetPropAdvanceCmd(int engine, double cmd);
   //@}
 
   /// @name Aerosurface position setting
@@ -379,7 +379,7 @@ public:
   /** Sets the actual prop pitch setting for the specified engine
       @param engine engine ID number
       @param cmd prop pitch setting in percent (0.0 - 1.0)*/
-  void SetPropPitchPos(int engine, double cmd);
+  void SetPropAdvance(int engine, double cmd);
   //@}
 
   /// @name Landing Gear brakes
@@ -420,8 +420,8 @@ private:
   vector <double> ThrottlePos;
   vector <double> MixtureCmd;
   vector <double> MixturePos;
-  vector <double> PropPitchCmd;
-  vector <double> PropPitchPos;
+  vector <double> PropAdvanceCmd;
+  vector <double> PropAdvance;
   double LeftBrake, RightBrake, CenterBrake; // Brake settings
   double GearCmd,GearPos;
 
index e2080e3889bc009b47cdcdb1e5b9e2756be1491f..f5dad334f556269c6be08977fb4cf658d7ebb8a8 100644 (file)
@@ -36,6 +36,7 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGPropeller.h"
+#include "FGFCS.h"
 
 static const char *IdSrc = "$Id$";
 static const char *IdHdr = ID_PROPELLER;
@@ -67,20 +68,19 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e
       *Prop_cfg >> MinPitch;
     } else if (token == "MAXPITCH") {
       *Prop_cfg >> MaxPitch;
-    } else if (token == "EFFICIENCY") {
-      *Prop_cfg >> rows >> cols;
-      if (cols == 1) Efficiency = new FGTable(rows);
-           else           Efficiency = new FGTable(rows, cols);
-      *Efficiency << *Prop_cfg;
+    } else if (token == "MINRPM") {
+      *Prop_cfg >> MinRPM;
+    } else if (token == "MAXRPM") {
+      *Prop_cfg >> MaxRPM;
     } else if (token == "C_THRUST") {
       *Prop_cfg >> rows >> cols;
       if (cols == 1) cThrust = new FGTable(rows);
-           else           cThrust = new FGTable(rows, cols);
+      else           cThrust = new FGTable(rows, cols);
       *cThrust << *Prop_cfg;
     } else if (token == "C_POWER") {
       *Prop_cfg >> rows >> cols;
       if (cols == 1) cPower = new FGTable(rows);
-           else           cPower = new FGTable(rows, cols);
+      else           cPower = new FGTable(rows, cols);
       *cPower << *Prop_cfg;
     } else if (token == "EOF") {
       cerr << "      End of file reached" <<  endl;
@@ -97,8 +97,6 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e
     cout << "      Number of Blades  = " << numBlades << endl;
     cout << "      Minimum Pitch  = " << MinPitch << endl;
     cout << "      Maximum Pitch  = " << MaxPitch << endl;
-    cout << "      Efficiency: " <<  endl;
-    Efficiency->Print();
     cout << "      Thrust Coefficient: " <<  endl;
     cThrust->Print();
     cout << "      Power Coefficient: " <<  endl;
@@ -115,7 +113,6 @@ FGPropeller::FGPropeller(FGFDMExec* exec, FGConfigFile* Prop_cfg) : FGThruster(e
 
 FGPropeller::~FGPropeller()
 {
-  if (Efficiency) delete Efficiency;
   if (cThrust)    delete cThrust;
   if (cPower)     delete cPower;
   if (debug_lvl & 2) cout << "Destroyed:    FGPropeller" << endl;
@@ -144,7 +141,7 @@ double FGPropeller::Calculate(double PowerAvailable)
   double alpha, beta;
 
   if (RPM > 0.10) {
-    J = Vel / (Diameter * RPM / 60.0);
+    J = Vel / (Diameter * RPS);
   } else {
     J = 0.0;
   }
@@ -200,6 +197,20 @@ double FGPropeller::GetPowerRequired(void)
   if (MaxPitch == MinPitch) { // Fixed pitch prop
     cPReq = cPower->GetValue(J);
   } else {                    // Variable pitch prop
+    double advance = fdmex->GetFCS()->GetPropAdvance(ThrusterNumber);
+
+    if (MaxRPM != MinRPM) {   // fixed-speed prop
+      double rpmReq = MinRPM + (MaxRPM - MinRPM) * advance;
+      double dRPM = rpmReq - RPM;
+
+      Pitch -= dRPM / 10;
+
+      if (Pitch < MinPitch)       Pitch = MinPitch;
+      else if (Pitch > MaxPitch)  Pitch = MaxPitch;
+
+    } else {
+      Pitch = MaxPitch - (MaxPitch - MinPitch) * advance;
+    }
     cPReq = cPower->GetValue(J, Pitch);
   }
 
index ff65142e3131b2200354c57d9aca474e78455e50..3c0d92f0a767e1b5e7963c1385735f5a53e583c5 100644 (file)
@@ -62,8 +62,8 @@ CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 /** Propeller modeling class.
-    FGPropeller models a propeller given the tabular data for Ct, Cp, and
-    efficiency indexed by advance ratio "J". The data for the propeller is
+    FGPropeller models a propeller given the tabular data for Ct and Cp\r
+    indexed by advance ratio "J". The data for the propeller is\r
     stored in a config file named "prop_name.xml". The propeller config file
     is referenced from the main aircraft config file in the "Propulsion" section.
     See the constructor for FGPropeller to see what is read in and what should
@@ -111,8 +111,7 @@ public:
       control system (perhaps to maintain constant RPM for a constant-speed
       propeller). This value will be limited to be within whatever is specified
       in the config file for Max and Min pitch. It is also one of the lookup
-      indices to the power, thrust, and efficiency tables for variable-pitch
-      propellers.
+      indices to the power and thrust tables for variable-pitch propellers.\r
       @param pitch the pitch of the blade in degrees. */
   void SetPitch(double pitch) {Pitch = pitch;}
   
@@ -145,7 +144,7 @@ public:
       @param PowerAvailable this is the excess power provided by the engine to
       accelerate the prop. It could be negative, dictating that the propeller
       would be slowed.
-                 @return the thrust in pounds */
+      @return the thrust in pounds */
   double Calculate(double PowerAvailable);
 
 private:
@@ -155,11 +154,12 @@ private:
   double Diameter;
   double MaxPitch;
   double MinPitch;
+  double MinRPM;
+  double MaxRPM;
   double P_Factor;
   double Sense;
   double Pitch;
   double Torque;
-  FGTable *Efficiency;
   FGTable *cThrust;
   FGTable *cPower;
   void Debug(void);
index 33c6594f25c0c1e6b030042fefa833817db9d903..9dcc78e6910763a961f92585dcf5892d60dd4c9c 100644 (file)
@@ -255,7 +255,7 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg)
           cout << "      Pitch = " << Pitch << endl;
           cout << "      Yaw = " << Yaw << endl;
         }
-       
+
         Engines[numEngines]->SetPlacement(xLoc, yLoc, zLoc, Pitch, Yaw);
         Engines[numEngines]->SetEngineNumber(numEngines);
         numEngines++;
@@ -325,7 +325,7 @@ bool FGPropulsion::Load(FGConfigFile* AC_cfg)
           cout << "      Sense: " << Sense <<  endl;
         }
         Thrusters[numThrusters]->SetdeltaT(dt*rate);
-
+        Thrusters[numThrusters]->SetThrusterNumber(numThrusters);
         numThrusters++;
 
       } else {
index 108889403f61e70619e3ed256a563a9630632317..07cb48f3b8d0ed58015cb8d84dd45e91c5a7e037 100644 (file)
@@ -45,7 +45,8 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 
-FGThruster::FGThruster(FGFDMExec *FDMExec) : FGForce(FDMExec)
+FGThruster::FGThruster(FGFDMExec *FDMExec) : FGForce(FDMExec),
+                                             ThrusterNumber(0)
 {
   SetTransformType(FGForce::tCustom);
 
index cb06a03ff5925c7233bf8024936346381408e6fa..bf0eb1a9b6a851b1872e171eb1433f79967b3023 100644 (file)
@@ -76,16 +76,19 @@ public:
 
   virtual double Calculate(double) {return 0.0;}
   void SetName(string name) {Name = name;}
+  void SetThrusterNumber(int nn) {ThrusterNumber = nn;}
   virtual double GetPowerRequired(void) {return 0.0;}
   virtual void SetdeltaT(double dt) {deltaT = dt;}
   double GetThrust(void) {return Thrust;}
   eType GetType(void) {return Type;}
   string GetName(void) {return Name;}
+  int GetThrusterNumber(void) {return ThrusterNumber;}
   virtual double GetRPM(void) { return 0.0; };
 
 protected:
   eType Type;
   string Name;
+  int ThrusterNumber;
   double Thrust;
   double PowerRequired;
   double deltaT;