]> git.mxchange.org Git - flightgear.git/commitdiff
Sync. with JSBSim again
authorErik Hofman <erik@ehofman.com>
Fri, 30 Oct 2015 09:10:01 +0000 (10:10 +0100)
committerErik Hofman <erik@ehofman.com>
Fri, 30 Oct 2015 09:10:01 +0000 (10:10 +0100)
65 files changed:
src/FDM/JSBSim/FGFDMExec.cpp
src/FDM/JSBSim/FGFDMExec.h
src/FDM/JSBSim/FGJSBBase.cpp
src/FDM/JSBSim/FGJSBBase.h
src/FDM/JSBSim/initialization/FGInitialCondition.cpp
src/FDM/JSBSim/initialization/FGTrim.cpp
src/FDM/JSBSim/initialization/FGTrimAxis.cpp
src/FDM/JSBSim/initialization/FGTrimmer.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/FGInputType.cpp
src/FDM/JSBSim/input_output/FGInputType.h
src/FDM/JSBSim/input_output/FGOutputType.cpp
src/FDM/JSBSim/input_output/FGOutputType.h
src/FDM/JSBSim/input_output/FGScript.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/FGScript.h
src/FDM/JSBSim/input_output/FGUDPInputSocket.cpp
src/FDM/JSBSim/input_output/FGUDPOutputSocket.cpp
src/FDM/JSBSim/input_output/FGXMLElement.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/FGXMLElement.h [changed mode: 0644->0755]
src/FDM/JSBSim/input_output/string_utilities.h
src/FDM/JSBSim/math/FGFunction.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGFunction.h [changed mode: 0644->0755]
src/FDM/JSBSim/math/FGLocation.cpp
src/FDM/JSBSim/math/FGLocation.h
src/FDM/JSBSim/math/FGStateSpace.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGAircraft.h
src/FDM/JSBSim/models/FGAuxiliary.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGAuxiliary.h
src/FDM/JSBSim/models/FGFCS.cpp
src/FDM/JSBSim/models/FGFCS.h
src/FDM/JSBSim/models/FGFCSChannel.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGInput.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGInput.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/FGLGear.cpp
src/FDM/JSBSim/models/FGMassBalance.h
src/FDM/JSBSim/models/FGModel.cpp
src/FDM/JSBSim/models/FGModel.h
src/FDM/JSBSim/models/FGOutput.cpp
src/FDM/JSBSim/models/FGOutput.h
src/FDM/JSBSim/models/FGPropagate.cpp
src/FDM/JSBSim/models/FGPropagate.h
src/FDM/JSBSim/models/flight_control/FGAccelerometer.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGActuator.cpp
src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp
src/FDM/JSBSim/models/flight_control/FGFCSComponent.h
src/FDM/JSBSim/models/flight_control/FGFilter.cpp
src/FDM/JSBSim/models/flight_control/FGGyro.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGMagnetometer.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGSensor.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGWaypoint.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/flight_control/FGWaypoint.h [changed mode: 0644->0755]
src/FDM/JSBSim/models/propulsion/FGElectric.cpp
src/FDM/JSBSim/models/propulsion/FGEngine.cpp
src/FDM/JSBSim/models/propulsion/FGEngine.h
src/FDM/JSBSim/models/propulsion/FGPiston.cpp
src/FDM/JSBSim/models/propulsion/FGPropeller.cpp
src/FDM/JSBSim/models/propulsion/FGRocket.cpp
src/FDM/JSBSim/models/propulsion/FGRocket.h
src/FDM/JSBSim/models/propulsion/FGRotor.cpp
src/FDM/JSBSim/models/propulsion/FGRotor.h
src/FDM/JSBSim/models/propulsion/FGThruster.cpp
src/FDM/JSBSim/models/propulsion/FGThruster.h
src/FDM/JSBSim/models/propulsion/FGTurbine.cpp
src/FDM/JSBSim/models/propulsion/FGTurbine.h
src/FDM/JSBSim/models/propulsion/FGTurboProp.cpp [changed mode: 0644->0755]
src/FDM/JSBSim/models/propulsion/FGTurboProp.h [changed mode: 0644->0755]

index d955bc9639c8171b3e75d0a189149421f8851550..0c73e8caeed864401ee43aedf1c70c74141bd894 100644 (file)
@@ -63,20 +63,17 @@ INCLUDES
 #include "models/FGAuxiliary.h"
 #include "models/FGInput.h"
 #include "models/FGOutput.h"
-#include "initialization/FGInitialCondition.h"
 #include "initialization/FGTrim.h"
 #include "initialization/FGSimplexTrim.h"
 #include "initialization/FGLinearization.h"
-#include "input_output/FGPropertyManager.h"
 #include "input_output/FGScript.h"
 #include "input_output/FGXMLFileRead.h"
-#include "input_output/FGXMLElement.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFDMExec.cpp,v 1.171 2015/02/15 12:03:21 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGFDMExec.cpp,v 1.181 2015/10/25 21:18:29 dpculp Exp $");
 IDENT(IdHdr,ID_FDMEXEC);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -162,6 +159,7 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root, unsigned int* fdmctr) : Root(root)
 
   trim_status = false;
   ta_mode     = 99;
+  trim_completed = 0;
 
   Constructing = true;
   typedef int (FGFDMExec::*iPMF)(void) const;
@@ -177,6 +175,7 @@ FGFDMExec::FGFDMExec(FGPropertyManager* root, unsigned int* fdmctr) : Root(root)
   instance->Tie("simulation/dt", this, &FGFDMExec::GetDeltaT);
   instance->Tie("simulation/jsbsim-debug", this, &FGFDMExec::GetDebugLevel, &FGFDMExec::SetDebugLevel);
   instance->Tie("simulation/frame", (int *)&Frame, false);
+  instance->Tie("simulation/trim-completed", (int *)&trim_completed, false);
 
   // simplex trim properties
   instanceRoot->SetDouble("trim/solver/rtol",0.0001);
@@ -451,7 +450,6 @@ void FGFDMExec::LoadInputs(unsigned int idx)
     // Dynamic inputs come into the components that FCS manages through properties
     break;
   case ePropulsion:
-    Propulsion->in.SLPressure       = Atmosphere->GetPressureSL();
     Propulsion->in.Pressure         = Atmosphere->GetPressure();
     Propulsion->in.PressureRatio    = Atmosphere->GetPressureRatio();
     Propulsion->in.Temperature      = Atmosphere->GetTemperature();
@@ -459,7 +457,6 @@ void FGFDMExec::LoadInputs(unsigned int idx)
     Propulsion->in.Density          = Atmosphere->GetDensity();
     Propulsion->in.Soundspeed       = Atmosphere->GetSoundSpeed();
     Propulsion->in.TotalPressure    = Auxiliary->GetTotalPressure();
-    Propulsion->in.TotalTempearture = Auxiliary->GetTotalTemperature();
     Propulsion->in.Vc               = Auxiliary->GetVcalibratedKTS();
     Propulsion->in.Vt               = Auxiliary->GetVt();
     Propulsion->in.qbar             = Auxiliary->Getqbar();
@@ -577,7 +574,6 @@ void FGFDMExec::LoadPlanetConstants(void)
   Propagate->in.SemiMajor        = Inertial->GetSemimajor();
   Propagate->in.SemiMinor        = Inertial->GetSemiminor();
   Auxiliary->in.SLGravity        = Inertial->SLgravity();
-  Auxiliary->in.ReferenceRadius  = Inertial->GetRefRadius();
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -585,7 +581,6 @@ void FGFDMExec::LoadPlanetConstants(void)
 void FGFDMExec::LoadModelConstants(void)
 {
   Winds->in.wingspan             = Aircraft->GetWingSpan();
-  FCS->in.NumGear                = GroundReactions->GetNumGearUnits();
   Aerodynamics->in.Wingarea      = Aircraft->GetWingArea();
   Aerodynamics->in.Wingchord     = Aircraft->Getcbar();
   Aerodynamics->in.Wingincidence = Aircraft->GetWingIncidence();
@@ -604,14 +599,24 @@ bool FGFDMExec::RunIC(void)
 {
   FGPropulsion* propulsion = (FGPropulsion*)Models[ePropulsion];
 
+  SuspendIntegration(); // saves the integration rate, dt, then sets it to 0.0.
+  Initialize(IC);
+
   Models[eInput]->InitModel();
   Models[eOutput]->InitModel();
 
-  SuspendIntegration(); // saves the integration rate, dt, then sets it to 0.0.
-  Initialize(IC);
   Run();
   ResumeIntegration(); // Restores the integration rate to what it was.
 
+  if (debug_lvl > 0) {
+    MassBalance->GetMassPropertiesReport(0);
+
+    cout << endl << fgblue << highint
+         << "End of vehicle configuration loading." << endl
+         << "-------------------------------------------------------------------------------"
+         << reset << setprecision(6) << endl;
+  }
+
   for (unsigned int n=0; n < propulsion->GetNumEngines(); ++n) {
     if (IC->IsEngineRunning(n)) {
       try {
@@ -628,20 +633,12 @@ bool FGFDMExec::RunIC(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGFDMExec::Initialize(FGInitialCondition *FGIC)
+void FGFDMExec::Initialize(FGInitialConditionFGIC)
 {
-  Setsim_time(0.0);
-
-  Propagate->SetInitialState( FGIC );
-  LoadInputs(eInertial);
-  Inertial->Run(false);
-  LoadInputs(eAccelerations);
-  Accelerations->Run(false);
-  LoadInputs(ePropagate);
-  Propagate->InitializeDerivatives();
+  Propagate->SetInitialState(FGIC);
   Winds->SetWindNED(FGIC->GetWindNEDFpsIC());
-  LoadInputs(eMassBalance);
-  MassBalance->Run(false);
+  Run();
+  Propagate->InitializeDerivatives();
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -660,9 +657,12 @@ void FGFDMExec::ResetToInitialConditions(int mode)
     Models[i]->InitModel();
   }
 
-  if (Script) Script->ResetEvents();
-
   RunIC();
+
+  if (Script)
+    Script->ResetEvents();
+  else
+    Setsim_time(0.0);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -829,7 +829,7 @@ bool FGFDMExec::LoadModel(const string& model, bool addModelToPath)
     // Process the system element[s]. This element is OPTIONAL, and there may be more than one.
     element = document->FindElement("system");
     while (element) {
-      result = ((FGFCS*)Models[eSystems])->Load(element, FGFCS::stSystem);
+      result = ((FGFCS*)Models[eSystems])->Load(element);
       if (!result) {
         cerr << endl << "Aircraft system element has problems in file " << aircraftCfgFileName << endl;
         return result;
@@ -840,7 +840,7 @@ bool FGFDMExec::LoadModel(const string& model, bool addModelToPath)
     // Process the autopilot element. This element is OPTIONAL.
     element = document->FindElement("autopilot");
     if (element) {
-      result = ((FGFCS*)Models[eSystems])->Load(element, FGFCS::stAutoPilot);
+      result = ((FGFCS*)Models[eSystems])->Load(element);
       if (!result) {
         cerr << endl << "Aircraft autopilot element has problems in file " << aircraftCfgFileName << endl;
         return result;
@@ -850,7 +850,7 @@ bool FGFDMExec::LoadModel(const string& model, bool addModelToPath)
     // Process the flight_control element. This element is OPTIONAL.
     element = document->FindElement("flight_control");
     if (element) {
-      result = ((FGFCS*)Models[eSystems])->Load(element, FGFCS::stFCS);
+      result = ((FGFCS*)Models[eSystems])->Load(element);
       if (!result) {
         cerr << endl << "Aircraft flight_control element has problems in file " << aircraftCfgFileName << endl;
         return result;
@@ -904,21 +904,6 @@ bool FGFDMExec::LoadModel(const string& model, bool addModelToPath)
 
     modelLoaded = true;
 
-    if (debug_lvl > 0) {
-      LoadInputs(eMassBalance); // Update all input mass properties for the report.
-      Models[eMassBalance]->Run(false);  // Update all mass properties for the report.
-      LoadInputs(ePropulsion); // Update propulsion properties for the report.
-      Models[ePropulsion]->Run(false);  // Update propulsion properties for the report.
-      LoadInputs(eMassBalance); // Update all (one more time) input mass properties for the report.
-      Models[eMassBalance]->Run(false);  // Update all (one more time) mass properties for the report.
-      ((FGMassBalance*)Models[eMassBalance])->GetMassPropertiesReport(0);
-
-      cout << endl << fgblue << highint
-           << "End of vehicle configuration loading." << endl
-           << "-------------------------------------------------------------------------------"
-           << reset << endl;
-    }
-
     if (IsChild) debug_lvl = saved_debug_lvl;
 
   } else {
@@ -1188,19 +1173,18 @@ void FGFDMExec::CheckIncrementalHold(void)
 
 void FGFDMExec::DoTrim(int mode)
 {
-  double saved_time;
-
   if (Constructing) return;
 
   if (mode < 0 || mode > JSBSim::tNone) {
     cerr << endl << "Illegal trimming mode!" << endl << endl;
     return;
   }
-  saved_time = sim_time;
+
   FGTrim trim(this, (JSBSim::TrimMode)mode);
   if ( !trim.DoTrim() ) cerr << endl << "Trim Failed" << endl << endl;
   trim.Report();
-  Setsim_time(saved_time);
+  trim_completed = 1;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1217,6 +1201,7 @@ void FGFDMExec::DoSimplexTrim(int mode)
   FGSimplexTrim trim(this, (JSBSim::TrimMode)mode);
   Setsim_time(saved_time);
   std::cout << "dT: " << dT << std::endl;
+  trim_completed = 1;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index d03f1b826f687858a432af01fd1cc6b5d21c3d0f..c1b4fc07c42f1427f4e7ea6bf573767d09c1c132 100644 (file)
@@ -54,7 +54,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FDMEXEC "$Id: FGFDMExec.h,v 1.95 2015/02/07 17:52:36 bcoconni Exp $"
+#define ID_FDMEXEC "$Id: FGFDMExec.h,v 1.102 2015/10/25 21:18:29 dpculp Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -178,7 +178,7 @@ CLASS DOCUMENTATION
                                 property actually maps toa function call of DoTrim().
 
     @author Jon S. Berndt
-    @version $Revision: 1.95 $
+    @version $Revision: 1.102 $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -361,6 +361,8 @@ public:
   FGAuxiliary* GetAuxiliary(void)      {return (FGAuxiliary*)Models[eAuxiliary];}
   /// Returns the FGInput pointer.
   FGInput* GetInput(void)              {return (FGInput*)Models[eInput];}
+  /// Returns the FGOutput pointer.
+  FGOutput* GetOutput(void)            {return (FGOutput*)Models[eOutput];}
   /** Get a pointer to the ground callback currently used. It is recommanded
       to store the returned pointer in a 'smart pointer' FGGroundCallback_ptr.
       @return A pointer to the current ground callback object.
@@ -432,8 +434,8 @@ public:
   /** Forces the specified output object to print its items once */
   void ForceOutput(int idx=0) { Output->ForceOutput(idx); }
 
-  /** Sets the logging rate for all output objects (if any). */
-  void SetLoggingRate(double rate) { Output->SetRate(rate); }
+  /** Sets the logging rate in Hz for all output objects (if any). */
+  void SetLoggingRate(double rate) { Output->SetRateHz(rate); }
 
   /** Sets (or overrides) the output filename
       @param n index of file
@@ -564,12 +566,17 @@ public:
       is also incremented.
       @return the new simulation time.     */
   double IncrTime(void) {
-    if (!holding) sim_time += dT;
-    GetGroundCallback()->SetTime(sim_time);
-    Frame++;
+    if (!holding && !IntegrationSuspended()) {
+      sim_time += dT;
+      GetGroundCallback()->SetTime(sim_time);
+      Frame++;
+    }
     return sim_time;
   }
 
+  /** Retrieves the current frame count. */
+  unsigned int GetFrame(void) const {return Frame;}
+
   /** Retrieves the current debug level setting. */
   int GetDebugLevel(void) const {return debug_lvl;};
 
@@ -621,6 +628,7 @@ private:
   bool trim_status;
   int ta_mode;
   unsigned int ResetMode;
+  int trim_completed;
 
   FGScript*           Script;
   FGInitialCondition* IC;
index 71ce71d6a9efad8c37d265ec0126b5d2eaad5685..d978da9cdc0fcc10dfc66404667d19b354ef3fdb 100644 (file)
@@ -42,9 +42,11 @@ INCLUDES
 #include <sstream>
 #include <cstdlib>
 
+using namespace std;
+
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGJSBBase.cpp,v 1.39 2014/09/03 17:35:04 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGJSBBase.cpp,v 1.40 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_JSBBASE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -108,7 +110,7 @@ const double FGJSBBase::kgtoslug = 0.06852168;
 const string FGJSBBase::needed_cfg_version = "2.0";
 const string FGJSBBase::JSBSim_version = "1.0 " __DATE__ " " __TIME__ ;
 
-std::queue <FGJSBBase::Message> FGJSBBase::Messages;
+queue <FGJSBBase::Message> FGJSBBase::Messages;
 FGJSBBase::Message FGJSBBase::localMsg;
 unsigned int FGJSBBase::messageId = 0;
 
@@ -116,10 +118,6 @@ int FGJSBBase::gaussian_random_number_phase = 0;
 
 short FGJSBBase::debug_lvl  = 1;
 
-using std::cerr;
-using std::cout;
-using std::endl;
-
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 void FGJSBBase::PutMessage(const Message& msg)
@@ -180,19 +178,12 @@ void FGJSBBase::PutMessage(const string& text, double dVal)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-int FGJSBBase::SomeMessages(void)
-{
-  return !Messages.empty();
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 void FGJSBBase::ProcessMessage(void)
 {
   if (Messages.empty()) return;
   localMsg = Messages.front();
 
-  while (Messages.size() > 0) {
+  while (SomeMessages()) {
       switch (localMsg.type) {
       case JSBSim::FGJSBBase::Message::eText:
         cout << localMsg.messageId << ": " << localMsg.text << endl;
@@ -211,7 +202,7 @@ void FGJSBBase::ProcessMessage(void)
         break;
       }
       Messages.pop();
-      if (Messages.size() > 0) localMsg = Messages.front();
+      if (SomeMessages()) localMsg = Messages.front();
       else break;
   }
 
@@ -249,7 +240,7 @@ void FGJSBBase::disableHighLighting(void)
 
 string FGJSBBase::CreateIndexedPropertyName(const string& Property, int index)
 {
-  std::ostringstream buf;
+  ostringstream buf;
   buf << Property << '[' << index << ']';
   return buf.str();
 }
index c0200d4840bdf01d4ecf5acc416f13ea21ac1715..b3a5cf21a3dd06a5cae03b3f49c25a0eaccc3ea9 100644 (file)
@@ -43,9 +43,6 @@ INCLUDES
 #include <string>
 #include <cmath>
 
-using std::min;
-using std::max;
-
 #include "input_output/string_utilities.h"
 
 #ifndef M_PI
@@ -57,7 +54,7 @@ using std::max;
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_JSBBASE "$Id: FGJSBBase.h,v 1.41 2014/09/03 17:35:04 bcoconni Exp $"
+#define ID_JSBBASE "$Id: FGJSBBase.h,v 1.44 2015/09/17 19:44:13 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -73,7 +70,7 @@ CLASS DOCUMENTATION
 *   This class provides universal constants, utility functions, messaging
 *   functions, and enumerated constants to JSBSim.
     @author Jon S. Berndt
-    @version $Id: FGJSBBase.h,v 1.41 2014/09/03 17:35:04 bcoconni Exp $
+    @version $Id: FGJSBBase.h,v 1.44 2015/09/17 19:44:13 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -175,7 +172,7 @@ public:
   void PutMessage(const std::string& text, double dVal);
   /** Reads the message on the queue (but does not delete it).
       @return 1 if some messages */
-  int SomeMessages(void);
+  int SomeMessages(void) { return !Messages.empty(); }
   /** Reads the message on the queue and removes it from the queue.
       This function also prints out the message.*/
   void ProcessMessage(void);
@@ -293,7 +290,7 @@ public:
       @return if the two values can be considered equal up to roundoff */
   static bool EqualToRoundoff(double a, double b) {
     double eps = 2.0*DBL_EPSILON;
-    return std::fabs(a - b) <= eps * max(std::fabs(a), std::fabs(b));
+    return std::fabs(a - b) <= eps * std::max<double>(std::fabs(a), std::fabs(b));
   }
 
   /** Finite precision comparison.
@@ -302,7 +299,7 @@ public:
       @return if the two values can be considered equal up to roundoff */
   static bool EqualToRoundoff(float a, float b) {
     float eps = 2.0*FLT_EPSILON;
-    return std::fabs(a - b) <= eps * max(std::fabs(a), std::fabs(b));
+    return std::fabs(a - b) <= eps * std::max<double>(std::fabs(a), std::fabs(b));
   }
 
   /** Finite precision comparison.
index 4fbac6f99f70adce7b46c650c31c72d24668e355..a230d1d92c7ded1794946f722858b555047586d8 100644 (file)
@@ -44,29 +44,20 @@ you have chosen your IC's wisely) even after setting it up with this class.
 INCLUDES
 *******************************************************************************/
 
-#include <iostream>
-#include <fstream>
 #include <cstdlib>
 
 #include "FGInitialCondition.h"
 #include "FGFDMExec.h"
-#include "math/FGQuaternion.h"
 #include "models/FGInertial.h"
 #include "models/FGAtmosphere.h"
-#include "models/FGPropagate.h"
-#include "models/FGPropulsion.h"
 #include "models/FGAccelerations.h"
-#include "models/FGFCS.h"
-#include "input_output/FGPropertyManager.h"
-#include "input_output/string_utilities.h"
 #include "input_output/FGXMLFileRead.h"
-#include "input_output/FGXMLElement.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGInitialCondition.cpp,v 1.99 2015/02/19 05:18:45 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGInitialCondition.cpp,v 1.101 2015/09/27 15:45:31 bcoconni Exp $");
 IDENT(IdHdr,ID_INITIALCONDITION);
 
 //******************************************************************************
@@ -919,9 +910,23 @@ bool FGInitialCondition::Load_v1(Element* document)
 {
   bool result = true;
 
-  if (document->FindElement("latitude")) {
+  Element* latitude_el = document->FindElement("latitude");
+  if (latitude_el) {
     double latitude = document->FindElementValueAsNumberConvertTo("latitude", "RAD");
-    string lat_type = document->FindElement("latitude")->GetAttributeValue("type");
+    if (fabs(latitude) > 0.5*M_PI) {
+      string unit_type = latitude_el->GetAttributeValue("unit");
+      if (unit_type.empty()) unit_type="RAD";
+      cerr << latitude_el->ReadFrom() << "The latitude value "
+           << latitude_el->GetDataAsNumber() << " " << unit_type
+           << " is outside the range [";
+      if (unit_type == "DEG")
+        cerr << "-90 DEG ; +90 DEG]" << endl;
+      else
+        cerr << "-PI/2 RAD; +PI/2 RAD]" << endl;
+      result = false;
+    }
+
+    string lat_type = latitude_el->GetAttributeValue("type");
     if (lat_type == "geod" || lat_type == "geodetic")
       position.SetPositionGeodetic(0.0, latitude, 0.0); // Longitude and altitude will be set later on
     else
index ff1601c36e1a81796c14e6b8589a22a1eff316f2..dc2e2f18f070f5137588df9eb28f8b1373ba2a50 100644 (file)
@@ -57,7 +57,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGTrim.cpp,v 1.24 2014/11/30 12:35:32 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGTrim.cpp,v 1.28 2015/09/28 20:50:41 bcoconni Exp $");
 IDENT(IdHdr,ID_TRIM);
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -202,8 +202,6 @@ bool FGTrim::DoTrim(void) {
     fdmex->GetGroundReactions()->GetGearUnit(i)->SetReport(false);
   }
 
-  fdmex->DisableOutput();
-
   fdmex->SetTrimStatus(true);
   fdmex->SuspendIntegration();
 
@@ -342,7 +340,6 @@ bool FGTrim::DoTrim(void) {
 
   fdmex->ResumeIntegration();
   fdmex->SetTrimStatus(false);
-  fdmex->EnableOutput();
 
   for(int i=0;i < fdmex->GetGroundReactions()->GetNumGearUnits();i++){
     fdmex->GetGroundReactions()->GetGearUnit(i)->SetReport(true);
index 4eb1d63d56807b51b952067207d34b8bc2773791..69a03ab4abd53bb91c162e4bd5603621af813116 100644 (file)
@@ -56,7 +56,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGTrimAxis.cpp,v 1.17 2014/01/13 10:46:00 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGTrimAxis.cpp,v 1.19 2015/09/28 20:50:41 bcoconni Exp $");
 IDENT(IdHdr,ID_TRIMAXIS);
 
 /*****************************************************************************/
old mode 100644 (file)
new mode 100755 (executable)
index 51a31ba75a1555488fb6a742ce8bf7afe7586b2f..2a7cb7ed7b630916b70b8515fc13c0167a7ec65a 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGInputType.cpp,v 1.2 2015/03/28 14:49:01 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGInputType.cpp,v 1.4 2015/08/23 09:43:31 bcoconni Exp $");
 IDENT(IdHdr,ID_INPUTTYPE);
 
 using namespace std;
@@ -106,9 +106,8 @@ bool FGInputType::InitModel(void)
 
 bool FGInputType::Run(bool Holding)
 {
-  if (!enabled) return true;
   if (FGModel::Run(Holding)) return true;
-  // if (Holding) return false;
+  if (!enabled) return true;
 
   RunPreFunctions();
   Read(Holding);
@@ -140,8 +139,6 @@ bool FGInputType::Run(bool Holding)
 
 void FGInputType::Debug(int from)
 {
-  string scratch="";
-
   if (debug_lvl <= 0) return;
 
   if (debug_lvl & 1) { // Standard console startup message input
index 40291f7656abe3e5371c5a91a7832f061a190ab6..ab55987c7d76680cade461001e449e882b5df532 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_INPUTTYPE "$Id: FGInputType.h,v 1.2 2015/03/28 14:49:01 bcoconni Exp $"
+#define ID_INPUTTYPE "$Id: FGInputType.h,v 1.3 2015/08/23 09:37:16 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -87,8 +87,8 @@ public:
   /// Destructor
   virtual ~FGInputType();
 
-  /** Set the idx for this output instance
-      @param idx ID of the output instance that is constructed
+  /** Set the idx for this input instance
+      @param idx ID of the input instance that is constructed
    */
   void SetIdx(unsigned int idx);
 
@@ -114,13 +114,13 @@ public:
    */
   virtual void Read(bool Holding) = 0;
 
-  /// Enables the output generation.
+  /// Enables the input generation.
   void Enable(void) { enabled = true; }
-  /// Disables the output generation.
+  /// Disables the input generation.
   void Disable(void) { enabled = false; }
-  /** Toggles the output generation.
-      @result the output generation status i.e. true if the output has been
-              enabled, false if the output has been disabled. */
+  /** Toggles the input generation.
+      @result the input generation status i.e. true if the input has been
+              enabled, false if the input has been disabled. */
   bool Toggle(void) {enabled = !enabled; return enabled;}
 
   /** Overwrites the name identifier under which the input will be read.
index 67c48ac9be9cc4b182091dd1293b2f520f26b911..25d2edd2d39d59546175bb85db9b86337f4142b5 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGOutputType.cpp,v 1.12 2015/03/28 14:49:01 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGOutputType.cpp,v 1.17 2015/08/23 09:43:31 bcoconni Exp $");
 IDENT(IdHdr,ID_OUTPUTTYPE);
 
 using namespace std;
@@ -89,10 +89,10 @@ FGOutputType::~FGOutputType()
 
 void FGOutputType::SetIdx(unsigned int idx)
 {
-  typedef double (FGOutputType::*iOPMF)(void) const;
-  string outputProp = CreateIndexedPropertyName("simulation/output", idx) + "/log_rate_hz";
+  string outputProp = CreateIndexedPropertyName("simulation/output", idx);
 
-  PropertyManager->Tie(outputProp, this, (iOPMF)0, &FGOutputType::SetRate, false);
+  PropertyManager->Tie(outputProp + "/log_rate_hz", this, &FGOutputType::GetRateHz, &FGOutputType::SetRateHz, false);
+  PropertyManager->Tie(outputProp + "/enabled", &enabled);
   OutputIdx = idx;
 }
 
@@ -130,7 +130,6 @@ bool FGOutputType::Load(Element* element)
   Element *property_element = element->FindElement("property");
 
   while (property_element) {
-    string caption="";
     string property_str = property_element->GetDataLine();
     FGPropertyNode* node = PropertyManager->GetNode(property_str);
     if (!node) {
@@ -153,7 +152,7 @@ bool FGOutputType::Load(Element* element)
   if (!element->GetAttributeValue("rate").empty()) {
     outRate = element->GetAttributeValueAsNumber("rate");
   }
-  SetRate(outRate);
+  SetRateHz(outRate);
 
   return true;
 }
@@ -170,11 +169,10 @@ bool FGOutputType::InitModel(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGOutputType::Run(bool Holding)
+bool FGOutputType::Run(void)
 {
+  if (FGModel::Run(false)) return true;
   if (!enabled) return true;
-  if (FGModel::Run(Holding)) return true;
-  if (Holding) return false;
 
   RunPreFunctions();
   Print();
@@ -187,18 +185,25 @@ bool FGOutputType::Run(bool Holding)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGOutputType::SetRate(double rtHz)
+void FGOutputType::SetRateHz(double rtHz)
 {
   rtHz = rtHz>1000?1000:(rtHz<0?0:rtHz);
   if (rtHz > 0) {
-    FGModel::SetRate(0.5 + 1.0/(FDMExec->GetDeltaT()*rtHz));
+    SetRate(0.5 + 1.0/(FDMExec->GetDeltaT()*rtHz));
     Enable();
   } else {
-    FGModel::SetRate(1);
+    SetRate(1);
     Disable();
   }
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGOutputType::GetRateHz(void) const
+{
+  return 1.0 / (rate * FDMExec->GetDeltaT());
+}
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 //    The bitmasked value choices are as follows:
 //    unset: In this case (the default) JSBSim would only print
@@ -220,8 +225,6 @@ void FGOutputType::SetRate(double rtHz)
 
 void FGOutputType::Debug(int from)
 {
-  string scratch="";
-
   if (debug_lvl <= 0) return;
 
   if (debug_lvl & 1) { // Standard console startup message output
index d9dd5590d4924012eb121d2df87eec2a560c85ef..1f3ccceb19dde13c960b86321e46427854d1deff 100644 (file)
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_OUTPUTTYPE "$Id: FGOutputType.h,v 1.6 2015/03/28 14:49:01 bcoconni Exp $"
+#define ID_OUTPUTTYPE "$Id: FGOutputType.h,v 1.11 2015/08/23 09:43:31 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -110,7 +110,10 @@ public:
 
   /** Set the output rate for this output instances.
       @param rtHz new output rate in Hz */
-  void SetRate(double rtHz);
+  void SetRateHz(double rtHz);
+
+  /// Get the output rate in Hz for this output.
+  double GetRateHz(void) const;
 
   /** Set the activated subsystems for this output instance.
       @param subSystems bitfield that describes the activated subsystems
@@ -151,7 +154,7 @@ public:
       generation and finally the "post" functions.
       @result false if no error.
    */
-  bool Run(bool Holding);
+  bool Run(void);
 
   /** Generate the output. This is a pure method so it must be implemented by
       the classes that inherits from FGOutputType. The Print name may not be
old mode 100644 (file)
new mode 100755 (executable)
index 1218586..61b5acd
@@ -58,7 +58,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGScript.cpp,v 1.60 2014/06/08 12:50:05 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGScript.cpp,v 1.63 2015/09/28 21:14:15 bcoconni Exp $");
 IDENT(IdHdr,ID_FGSCRIPT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -96,18 +96,15 @@ FGScript::~FGScript()
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGScript::LoadScript(string script, double deltaT, const string initfile)
+bool FGScript::LoadScript(const string& script, double default_dT,
+                          const string& initfile)
 {
-  string aircraft="", initialize="", comparison = "", prop_name="";
+  string aircraft="", initialize="", prop_name="";
   string notifyPropertyName="";
   Element *element=0, *run_element=0, *event_element=0;
-  Element *condition_element=0, *set_element=0, *delay_element=0;
+  Element *set_element=0;
   Element *notify_element = 0L, *notify_property_element = 0L;
-  Element *output_element = 0L;
-  Element *input_element = 0L;
-  bool result = false;
   double dt = 0.0, value = 0.0;
-  struct event *newEvent;
   FGCondition *newCondition;
 
   FGXMLFileRead XMLFileRead;
@@ -118,11 +115,6 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
     return false;
   }
 
-  // Set up input and output files if specified
-  
-  output_element = document->FindElement("output");
-  input_element = document->FindElement("input");
-
   if (document->GetName() != string("runscript")) {
     cerr << "File: " << script << " is not a script file" << endl;
     return false;
@@ -141,7 +133,10 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
 
   // Set sim timing
 
-  if (run_element->HasAttribute("start")) StartTime = run_element->GetAttributeValueAsNumber("start");
+  if (run_element->HasAttribute("start"))
+    StartTime = run_element->GetAttributeValueAsNumber("start");
+  else
+    StartTime = 0.0;
   FDMExec->Setsim_time(StartTime);
   if (run_element->HasAttribute("end")) {
     EndTime   = run_element->GetAttributeValueAsNumber("end");
@@ -153,12 +148,12 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
   // Make sure that the desired time is reached and executed.
   EndTime += 0.99*FDMExec->GetDeltaT();
 
-  if (deltaT == 0.0)
+  if (default_dT == 0.0)
     dt = run_element->GetAttributeValueAsNumber("dt");
   else {
-    dt = deltaT;
+    dt = default_dT;
     cout << endl << "Overriding simulation step size from the command line. New step size is: "
-         << deltaT << " seconds (" << 1/deltaT << " Hz)" << endl << endl;
+         << default_dT << " seconds (" << 1/default_dT << " Hz)" << endl << endl;
   }
 
   FDMExec->Setdt(dt);
@@ -169,8 +164,8 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
   if (element) {
     aircraft = element->GetAttributeValue("aircraft");
     if (!aircraft.empty()) {
-      result = FDMExec->LoadModel(aircraft);
-      if (!result) return false;
+      if (!FDMExec->LoadModel(aircraft))
+        return false;
     } else {
       cerr << "Aircraft must be specified in use element." << endl;
       return false;
@@ -196,22 +191,25 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
   FGInitialCondition *IC=FDMExec->GetIC();
   if ( ! IC->Load( initialize )) {
     cerr << "Initialization unsuccessful" << endl;
-    exit(-1);
+    return false;
   }
 
   // Now, read input spec if given.
-  if (input_element > 0) {
-    FDMExec->GetInput()->Load(input_element);
+  element = document->FindElement("input");
+  while (element) {
+    if (!FDMExec->GetInput()->Load(element))
+      return false;
+    element = document->FindNextElement("input");
   }
 
   // Now, read output spec if given.
-  if (output_element > 0) {
-    string output_file = output_element->GetAttributeValue("file");
-    if (output_file.empty()) {
-      cerr << "No logging directives file was specified." << endl;
-    } else {
-      if (!FDMExec->SetOutputDirectives(output_file)) return false;
-    }
+  element = document->FindElement("output");
+  while (element) {
+    if (!FDMExec->GetOutput()->Load(element))
+      return false;
+    element = document->FindNextElement("output");
   }
 
   // Read local property/value declarations
@@ -226,7 +224,7 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
   while (event_element) { // event processing
 
     // Create the event structure
-    newEvent = new struct event();
+    struct event *newEvent = new struct event();
 
     // Retrieve the event name if given
     newEvent->Name = event_element->GetAttributeValue("name");
@@ -243,11 +241,11 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
     }
 
     // Process the conditions
-    condition_element = event_element->FindElement("condition");
+    Element* condition_element = event_element->FindElement("condition");
     if (condition_element != 0) {
       try {
         newCondition = new FGCondition(condition_element, PropertyManager);
-      } catch(string str) {
+      } catch(string& str) {
         cout << endl << fgred << str << reset << endl << endl;
         delete newEvent;
         return false;
@@ -262,9 +260,11 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
     // Is there a delay between the time this event is triggered, and when the event
     // actions are executed?
 
-    delay_element = event_element->FindElement("delay");
-    if (delay_element) newEvent->Delay = event_element->FindElementValueAsNumber("delay");
-    else newEvent->Delay = 0.0;
+    Element* delay_element = event_element->FindElement("delay");
+    if (delay_element)
+      newEvent->Delay = event_element->FindElementValueAsNumber("delay");
+    else
+      newEvent->Delay = 0.0;
 
     // Notify about when this event is triggered?
     if ((notify_element = event_element->FindElement("notify")) != 0) {
@@ -299,7 +299,7 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
     while (set_element) {
       prop_name = set_element->GetAttributeValue("name");
       if (PropertyManager->HasNode(prop_name)) {
-      newEvent->SetParam.push_back( PropertyManager->GetNode(prop_name) );
+        newEvent->SetParam.push_back( PropertyManager->GetNode(prop_name) );
       } else {
         newEvent->SetParam.push_back( 0L );
       }
@@ -354,6 +354,7 @@ bool FGScript::LoadScript(string script, double deltaT, const string initfile)
 void FGScript::ResetEvents(void)
 {
   //LocalProperties.ResetToIC();
+  FDMExec->Setsim_time(StartTime);
 
   for (unsigned int i=0; i<Events.size(); i++)
     Events[i].reset();
@@ -397,7 +398,7 @@ bool FGScript::RunScript(void)
           if (thisEvent.Functions[i] != 0) { // Parameter should be set to a function value
             try {
               thisEvent.SetValue[i] = thisEvent.Functions[i]->GetValue();
-            } catch (string msg) {
+            } catch (string& msg) {
               std::cerr << std::endl << "A problem occurred in the execution of the script. " << msg << endl;
               throw;
             }
index e04ef368e344abf88be76b75c0ec8957b97da4df..c4920062993d7a778bcddc46dfa916ececf5134f 100644 (file)
@@ -48,7 +48,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FGSCRIPT "$Id: FGScript.h,v 1.29 2014/05/29 18:46:44 bcoconni Exp $"
+#define ID_FGSCRIPT "$Id: FGScript.h,v 1.30 2015/09/20 16:32:11 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -161,7 +161,7 @@ CLASS DOCUMENTATION
     comes the &quot;run&quot; section, where the conditions are
     described in &quot;event&quot; clauses.</p>
     @author Jon S. Berndt
-    @version "$Id: FGScript.h,v 1.29 2014/05/29 18:46:44 bcoconni Exp $"
+    @version "$Id: FGScript.h,v 1.30 2015/09/20 16:32:11 bcoconni Exp $"
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -178,16 +178,18 @@ public:
   ~FGScript();
 
   /** Loads a script to drive JSBSim (usually in standalone mode).
-      The language is the Script Directives for JSBSim. If a simulation step size
-      has been supplied on the command line, it will be override the script-
+      The language is the Script Directives for JSBSim. If a simulation step
+      size has been supplied on the command line, it will override the script
       specified simulation step size.
       @param script the filename (including path name, if any) for the script.
-      @param deltaT a simulation step size.
+      @param default_dT the default simulation step size if no value is specified
+                        in the script
       @param initfile An optional initialization file name passed in, empty by
                       default. If a file name is passed in, it will override the
                       one present in the script.
       @return true if successful */
-  bool LoadScript(std::string script, double deltaT, const std::string initfile);
+  bool LoadScript(const std::string& script, double default_dT,
+                  const std::string& initfile);
 
   /** This function is called each pass through the executive Run() method IF
       scripting is enabled.
index 3b7c8a4856b2b47b1f2f33f19ceff48fcb512fd3..679083477fe8ed8d914f5cf911562c824672757f 100644 (file)
@@ -80,7 +80,7 @@ bool FGUDPInputSocket::Load(Element* el)
     return false;
    
   rate = atoi(el->GetAttributeValue("rate").c_str());
-  FGModel::SetRate(0.5 + 1.0/(FDMExec->GetDeltaT()*rate));
+  SetRate(0.5 + 1.0/(FDMExec->GetDeltaT()*rate));
    
   SockPort = atoi(el->GetAttributeValue("port").c_str());
   if (SockPort == 0) {
index 056ea0c710944c0b91508f6226646126d0ad5d54..8ec0232afa47f2019a9b2f26a1232b92fc0224cb 100644 (file)
@@ -50,7 +50,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGUDPOutputSocket.cpp,v 1.1 2015/04/02 02:23:33 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGUDPOutputSocket.cpp,v 1.2 2015/08/16 13:19:52 bcoconni Exp $");
 IDENT(IdHdr,ID_UDPOUTPUTSOCKET);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -84,7 +84,6 @@ bool FGUDPOutputSocket::Load(Element* el)
   Element *property_element = el->FindElement("property");
 
   while (property_element) {
-    string caption="";
     string property_str = property_element->GetDataLine();
     FGPropertyNode* node = PropertyManager->GetNode(property_str);
     if (!node) {
@@ -98,7 +97,7 @@ bool FGUDPOutputSocket::Load(Element* el)
   if (!el->GetAttributeValue("rate").empty()) {
     outRate = el->GetAttributeValueAsNumber("rate");
   }
-  SetRate(outRate);
+  SetRateHz(outRate);
   
   SockPort = atoi(el->GetAttributeValue("port").c_str());
   if (SockPort == 0) {
old mode 100644 (file)
new mode 100755 (executable)
index dd9bce1..1aebb93
@@ -45,7 +45,7 @@ FORWARD DECLARATIONS
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGXMLElement.cpp,v 1.52 2014/06/29 10:13:18 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGXMLElement.cpp,v 1.54 2015/09/27 15:39:45 bcoconni Exp $");
 IDENT(IdHdr,ID_XMLELEMENT);
 
 bool Element::converterIsInitialized = false;
@@ -464,10 +464,31 @@ double Element::FindElementValueAsNumberConvertTo(const string& el, const string
   }
 
   double value = element->GetDataAsNumber();
+
+  // Sanity check for angular values
+  if ((supplied_units == "RAD") && (fabs(value) > 2 * M_PI)) {
+      cerr << element->ReadFrom() << "The value " << value
+           << " RAD is outside the range [ -2*M_PI RAD ; +2*M_PI RAD ]" << endl;
+  }
+  if ((supplied_units == "DEG") && (fabs(value) > 360.0)) {
+      cerr << element->ReadFrom() << "The value " << value
+           << " DEG is outside the range [ -360 DEG ; +360 DEG ]" << endl;
+  }
+  
+  
   if (!supplied_units.empty()) {
     value *= convert[supplied_units][target_units];
   }
 
+  if ((target_units == "RAD") && (fabs(value) > 2 * M_PI)) {
+      cerr << element->ReadFrom() << "The value " << value
+           << " RAD is outside the range [ -2*M_PI RAD ; +2*M_PI RAD ]" << endl;
+  }
+  if ((target_units == "DEG") && (fabs(value) > 360.0)) {
+      cerr << element->ReadFrom() << "The value " << value
+           << " DEG is outside the range [ -360 DEG ; +360 DEG ]" << endl;
+  }
+
   value = DisperseValue(element, value, supplied_units, target_units);
 
   return value;
@@ -569,10 +590,10 @@ FGColumnVector3 Element::FindElementTripletConvertTo( const string& target_units
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-double Element::DisperseValue(Element *e, double val, const std::string supplied_units, const std::string target_units)
+double Element::DisperseValue(Element *e, double val, const std::string& supplied_units,
+                              const std::string& target_units)
 {
   double value=val;
-  double disp=0.0;
 
   bool disperse = false;
   try {
@@ -586,7 +607,7 @@ double Element::DisperseValue(Element *e, double val, const std::string supplied
   }
 
   if (e->HasAttribute("dispersion") && disperse) {
-    disp = e->GetAttributeValueAsNumber("dispersion");
+    double disp = e->GetAttributeValueAsNumber("dispersion");
     if (!supplied_units.empty()) disp *= convert[supplied_units][target_units];
     string attType = e->GetAttributeValue("type");
     if (attType == "gaussian" || attType == "gaussiansigned") {
old mode 100644 (file)
new mode 100755 (executable)
index 22c1f39..ff9f62a
@@ -45,7 +45,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_XMLELEMENT "$Id: FGXMLElement.h,v 1.24 2014/06/29 10:13:18 bcoconni Exp $"
+#define ID_XMLELEMENT "$Id: FGXMLElement.h,v 1.25 2015/07/12 19:34:08 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -137,7 +137,7 @@ CLASS DOCUMENTATION
     - GAL = gallon (U.S. liquid) 
 
     @author Jon S. Berndt
-    @version $Id: FGXMLElement.h,v 1.24 2014/06/29 10:13:18 bcoconni Exp $
+    @version $Id: FGXMLElement.h,v 1.25 2015/07/12 19:34:08 bcoconni Exp $
 */
 
 class Element;
@@ -328,7 +328,8 @@ public:
       @return a column vector object built from the LOCATION or ORIENT components. */
   FGColumnVector3 FindElementTripletConvertTo( const std::string& target_units);
 
-  double DisperseValue(Element *e, double val, const std::string supplied_units="", const std::string target_units="");
+  double DisperseValue(Element *e, double val, const std::string& supplied_units="",
+                       const std::string& target_units="");
 
   /** This function sets the value of the parent class attribute to the supplied
       Element pointer.
index 3b263b4c833f4830b1ddf345f3628ffa50622139..f21b14db0d3936dfc9a98dbff723970edf899115 100644 (file)
@@ -49,7 +49,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_STRINGUTILS "$Id: string_utilities.h,v 1.22 2015/03/28 14:49:01 bcoconni Exp $"
+#define ID_STRINGUTILS "$Id: string_utilities.h,v 1.24 2015/08/16 16:06:28 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -88,32 +88,30 @@ CLASS DECLARATION
 #else
   #include <cctype>
 
-  using namespace std;
-
-  string& trim_left(string& str)
+  std::string& trim_left(std::string& str)
   {
-    while (str.size() && isspace((unsigned char)str[0])) {
+    while (!str.empty() && isspace((unsigned char)str[0])) {
       str = str.erase(0,1);
     }
     return str;
   }
 
-  string& trim_right(string& str)
+  std::string& trim_right(std::string& str)
   {
-    while (str.size() && isspace((unsigned char)str[str.size()-1])) {
+    while (!str.empty() && isspace((unsigned char)str[str.size()-1])) {
       str = str.erase(str.size()-1,1);
     }
     return str;
   }
 
-  string& trim(string& str)
+  std::string& trim(std::string& str)
   {
-    if (str.size() == 0) return str;
-    string temp_str = trim_right(str);
+    if (str.empty()) return str;
+    std::string temp_str = trim_right(str);
     return str = trim_left(temp_str);
   }
 
-  string& trim_all_space(string& str)
+  std::string& trim_all_space(std::string& str)
   {
     for (size_t i=0; i<str.size(); i++) {
       if (isspace((unsigned char)str[i])) {
@@ -124,44 +122,44 @@ CLASS DECLARATION
     return str;
   }
 
-  string& to_upper(string& str)
+  std::string& to_upper(std::string& str)
   {
     for (size_t i=0; i<str.size(); i++) str[i] = toupper(str[i]);
     return str;
   }
 
-  string& to_lower(string& str)
+  std::string& to_lower(std::string& str)
   {
     for (size_t i=0; i<str.size(); i++) str[i] = tolower(str[i]);
     return str;
   }
 
-  bool is_number(const string& str)
+  bool is_number(const std::string& str)
   {
-    if (str.size())
-      return (str.find_first_not_of("+-.0123456789Ee") == string::npos);
-    else
+    if (str.empty())
       return false;
+    else
+      return (str.find_first_not_of("+-.0123456789Ee") == std::string::npos);
   }
 
-  vector <string> split(string str, char d)
+  std::vector <std::string> split(std::string str, char d)
   {
-    vector <string> str_array;
+    std::vector <std::string> str_array;
     size_t index=0;
-    string temp = "";
+    std::string temp = "";
 
     trim(str);
     index = str.find(d);
-    while (index != string::npos) {
+    while (index != std::string::npos) {
       temp = str.substr(0,index);
       trim(temp);
-      if (temp.size() > 0) str_array.push_back(temp);
+      if (!temp.empty()) str_array.push_back(temp);
       str = str.erase(0,index+1);
       index = str.find(d);
     }
-    if (str.size() > 0) {
+    if (!str.empty()) {
       temp = trim(str);
-      if (temp.size() > 0) str_array.push_back(temp);
+      if (!temp.empty()) str_array.push_back(temp);
     }
 
     return str_array;
@@ -172,33 +170,33 @@ CLASS DECLARATION
   // * libc++ for all C++ language versions
   // * Visual Studio for versions greater than 2010 (1700 -> MSVC++ 11.0 and VS 2012)
 #if !defined(_LIBCPP_VERSION) && _MSC_VER < 1700 && __cplusplus < 201103L
-  string to_string(int i)
+  std::string to_string(int i)
   {
     char buffer[32];
     sprintf(buffer, "%d", i);
-    return string(buffer);
+    return std::string(buffer);
   }
 
-  string to_string(float x)
+  std::string to_string(float x)
   {
     std::ostringstream o;
-    if (!(o << x)) cerr << "Bad float to string conversion" << endl;
+    if (!(o << x)) std::cerr << "Bad float to string conversion" << std::endl;
     return o.str();
   }
 
-  string to_string(double x)
+  std::string to_string(double x)
   {
     std::ostringstream o;
-    if (!(o << x)) cerr << "Bad double to string conversion" << endl;
+    if (!(o << x)) std::cerr << "Bad double to string conversion" << std::endl;
     return o.str();
   }
 #endif
 
-  string replace(string str, const string& oldstr, const string& newstr)
+  std::string replace(std::string str, const std::string& oldstr, const std::string& newstr)
   {
-    string temp;
+    std::string temp = str;
     size_t old_idx = str.find(oldstr);
-    if (old_idx != string::npos) {
+    if (old_idx != std::string::npos) {
       temp = str.replace(old_idx, 1, newstr);
     }
     return temp;
old mode 100644 (file)
new mode 100755 (executable)
index 0b09b31..853b814
@@ -32,18 +32,18 @@ INCLUDES
 #include <iomanip>
 #include <cstdlib>
 #include <cmath>
+
 #include "FGFunction.h"
 #include "FGTable.h"
 #include "FGPropertyValue.h"
 #include "FGRealValue.h"
 #include "input_output/FGXMLElement.h"
-#include "input_output/FGPropertyManager.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFunction.cpp,v 1.57 2015/03/28 14:49:01 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGFunction.cpp,v 1.58 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_FUNCTION);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -254,9 +254,8 @@ FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, const string& pr
           property_name = replace(property_name,"#",Prefix);
         }
       }
-      FGPropertyNode* newNode = 0L;
       if (PropertyManager->HasNode(property_name)) {
-        newNode = PropertyManager->GetNode(property_name);
+        FGPropertyNode* newNode = PropertyManager->GetNode(property_name);
         Parameters.push_back(new FGPropertyValue( newNode ));
       } else {
         // cerr << fgcyan << "Warning: The property " + property_name + " is initially undefined."
old mode 100644 (file)
new mode 100755 (executable)
index 49d3e15..25fa9b4
@@ -43,7 +43,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FUNCTION "$Id: FGFunction.h,v 1.31 2013/06/20 04:37:27 jberndt Exp $"
+#define ID_FUNCTION "$Id: FGFunction.h,v 1.32 2015/07/12 13:03:23 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -76,7 +76,7 @@ A function definition consists of an operation, a value, a table, or a property
 - log2 (takes 1 arg)
 - ln (takes 1 arg)
 - log10 (takes 1 arg)
-- abs (takes n args)
+- abs (takes 1 arg)
 - sin (takes 1 arg)
 - cos (takes 1 arg)
 - tan (takes 1 arg)
index 2094ecd6029ef37bc1206b1ceca54a81f24201b5..49903ac0e7d078fd1e461d107ad4a0301259ecf0 100644 (file)
@@ -47,7 +47,7 @@ INCLUDES
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGLocation.cpp,v 1.33 2014/08/28 11:46:11 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGLocation.cpp,v 1.34 2015/09/20 20:53:13 bcoconni Exp $");
 IDENT(IdHdr,ID_LOCATION);
 
 // Set up the default ground callback object.
@@ -397,6 +397,68 @@ void FGLocation::ComputeDerivedUnconditional(void) const
   mCacheValid = true;
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//  The calculations, below, implement the Haversine formulas to calculate
+//  heading and distance to a set of lat/long coordinates from the current
+//  position.
+//
+//  The basic equations are (lat1, long1 are source positions; lat2
+//  long2 are target positions):
+//
+//  R = earth’s radius
+//  Î”lat = lat2 âˆ’ lat1
+//  Î”long = long2 âˆ’ long1
+//
+//  For the waypoint distance calculation:
+//
+//  a = sin²(Δlat/2) + cos(lat1)∙cos(lat2)∙sin²(Δlong/2)
+//  c = 2∙atan2(√a, âˆš(1−a))
+//  d = R∙c
+
+double FGLocation::GetDistanceTo(double target_longitude,
+                                 double target_latitude) const
+{
+  double delta_lat_rad = target_latitude  - GetLatitude();
+  double delta_lon_rad = target_longitude - GetLongitude();
+
+  double distance_a = pow(sin(0.5*delta_lat_rad), 2.0)
+    + (GetCosLatitude() * cos(target_latitude)
+       * (pow(sin(0.5*delta_lon_rad), 2.0)));
+
+  return 2.0 * GetRadius() * atan2(sqrt(distance_a), sqrt(1.0 - distance_a));
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+//  The calculations, below, implement the Haversine formulas to calculate
+//  heading and distance to a set of lat/long coordinates from the current
+//  position.
+//
+//  The basic equations are (lat1, long1 are source positions; lat2
+//  long2 are target positions):
+//
+//  R = earth’s radius
+//  Î”lat = lat2 âˆ’ lat1
+//  Î”long = long2 âˆ’ long1
+//
+//  For the heading angle calculation:
+//
+//  Î¸ = atan2(sin(Δlong)∙cos(lat2), cos(lat1)∙sin(lat2) âˆ’ sin(lat1)∙cos(lat2)∙cos(Δlong))
+
+double FGLocation::GetHeadingTo(double target_longitude,
+                                double target_latitude) const
+{
+  double delta_lon_rad = target_longitude - GetLongitude();
+
+  double Y = sin(delta_lon_rad) * cos(target_latitude);
+  double X = GetCosLatitude() * sin(target_latitude)
+    - GetSinLatitude() * cos(target_latitude) * cos(delta_lon_rad);
+
+  double heading_to_waypoint_rad = atan2(Y, X);
+  if (heading_to_waypoint_rad < 0) heading_to_waypoint_rad += 2.0*M_PI;
+
+  return heading_to_waypoint_rad;
+}
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 } // namespace JSBSim
index 9f086f6b8513617a0234ef58e2175a414d9bc05f..0ce83f453dcb16fb400e7a0f17b3e8c6a08279ea 100644 (file)
@@ -51,7 +51,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_LOCATION "$Id: FGLocation.h,v 1.34 2014/11/30 12:35:32 bcoconni Exp $"
+#define ID_LOCATION "$Id: FGLocation.h,v 1.35 2015/09/20 20:53:13 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -150,7 +150,7 @@ CLASS DOCUMENTATION
     @see W. C. Durham "Aircraft Dynamics & Control", section 2.2
 
     @author Mathias Froehlich
-    @version $Id: FGLocation.h,v 1.34 2014/11/30 12:35:32 bcoconni Exp $
+    @version $Id: FGLocation.h,v 1.35 2015/09/20 20:53:13 bcoconni Exp $
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -441,6 +441,23 @@ public:
       @see IncrementEarthPositionAngle */
   const FGMatrix33& GetTl2i(void) const {ComputeDerived(); return mTl2i;}
 
+  /** Get the geodetic distance between the current location and a given
+      location. This corresponds to the shortest distance between the two
+      locations. Earth curvature is taken into account.
+      @param target_longitude the target longitude
+      @param target_latitude the target latitude
+      @return The geodetic distance between the two locations */
+  double GetDistanceTo(double target_longitude, double target_latitude) const;
+  
+  /** Get the heading that should be followed from the current location to
+      a given location along the shortest path. Earth curvature is
+      taken into account.
+      @param target_longitude the target longitude
+      @param target_latitude the target latitude
+      @return The heading that should be followed to reach the targeted
+              location along the shortest path */
+  double GetHeadingTo(double target_longitude, double target_latitude) const;
+
   /** Conversion from Local frame coordinates to a location in the
       earth centered and fixed frame.
       This function calculates the FGLocation of an object which position
old mode 100644 (file)
new mode 100755 (executable)
index 58dfd03..5434e1b
@@ -221,7 +221,7 @@ public:
 
     void run() {
         // initialize
-        m_fdm->Initialize(m_fdm->GetIC());
+      m_fdm->Initialize(m_fdm->GetIC());
         for (unsigned int i=0; i<m_fdm->GetPropulsion()->GetNumEngines(); i++) {
             m_fdm->GetPropulsion()->GetEngine(i)->InitRunning();
         }
index 3d77b04540b93e3997d24de1768e185d1a9d6be6..0726166ecb0c6daf438f975631a0eae20c3cca22 100644 (file)
@@ -39,17 +39,15 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include <string>
-#include <vector>
 
 #include "FGModel.h"
-#include "math/FGColumnVector3.h"
 #include "math/FGMatrix33.h"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_AIRCRAFT "$Id: FGAircraft.h,v 1.24 2015/01/31 14:56:21 bcoconni Exp $"
+#define ID_AIRCRAFT "$Id: FGAircraft.h,v 1.25 2015/07/12 19:34:08 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -91,7 +89,7 @@ CLASS DOCUMENTATION
 @endcode
 
     @author Jon S. Berndt
-    @version $Id: FGAircraft.h,v 1.24 2015/01/31 14:56:21 bcoconni Exp $
+    @version $Id: FGAircraft.h,v 1.25 2015/07/12 19:34:08 bcoconni Exp $
     @see Cooke, Zyda, Pratt, and McGhee, "NPSNET: Flight Simulation Dynamic Modeling
      Using Quaternions", Presence, Vol. 1, No. 4, pp. 404-420  Naval Postgraduate
      School, January 1994
old mode 100644 (file)
new mode 100755 (executable)
index d710d8f..3492dea
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGAuxiliary.cpp,v 1.68 2014/12/27 05:41:11 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGAuxiliary.cpp,v 1.70 2015/09/20 20:53:13 bcoconni Exp $");
 IDENT(IdHdr,ID_AUXILIARY);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -78,7 +78,6 @@ FGAuxiliary::FGAuxiliary(FGFDMExec* fdmex) : FGModel(fdmex)
   hoverbmac = hoverbcg = 0.0;
   Re = 0.0;
   Nz = Ny = 0.0;
-  lon_relative_position = lat_relative_position = relative_position = 0.0;
 
   vPilotAccel.InitMatrix();
   vPilotAccelN.InitMatrix();
@@ -117,7 +116,6 @@ bool FGAuxiliary::InitModel(void)
   hoverbmac = hoverbcg = 0.0;
   Re = 0.0;
   Nz = Ny = 0.0;
-  lon_relative_position = lat_relative_position = relative_position = 0.0;
 
   vPilotAccel.InitMatrix();
   vPilotAccelN.InitMatrix();
@@ -259,9 +257,6 @@ bool FGAuxiliary::Run(bool Holding)
   FGColumnVector3 vMac = in.Tb2l * in.RPBody;
   hoverbmac = (in.DistanceAGL + vMac(3)) / in.Wingspan;
 
-  // When all models are executed calculate the distance from the initial point.
-  CalculateRelativePosition();
-
   return false;
 }
 
@@ -344,13 +339,6 @@ double FGAuxiliary::GetCrossWind(void) const
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-double FGAuxiliary::GethVRP(void) const
-{
-  return vLocationVRP.GetRadius() - in.ReferenceRadius;
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 double FGAuxiliary::GetNlf(void) const
 {
   if (in.Mass != 0)
@@ -361,13 +349,36 @@ double FGAuxiliary::GetNlf(void) const
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGAuxiliary::CalculateRelativePosition(void)  //ToDo: This belongs elsewhere - perhaps in FGPropagate or Exec
+double FGAuxiliary::GetLongitudeRelativePosition(void) const
 {
-  const double earth_radius_mt = in.ReferenceRadius*fttom;
-  lat_relative_position=(in.vLocation.GetLatitude()  - FDMExec->GetIC()->GetLatitudeDegIC() *degtorad)*earth_radius_mt;
-  lon_relative_position=(in.vLocation.GetLongitude() - FDMExec->GetIC()->GetLongitudeDegIC()*degtorad)*earth_radius_mt;
-  relative_position = sqrt(lat_relative_position*lat_relative_position + lon_relative_position*lon_relative_position);
-};
+  FGLocation source(FDMExec->GetIC()->GetLongitudeRadIC(),
+                    FDMExec->GetIC()->GetLatitudeRadIC(),
+                    in.vLocation.GetSeaLevelRadius());
+  return source.GetDistanceTo(in.vLocation.GetLongitude(),
+                              FDMExec->GetIC()->GetLatitudeRadIC()) * fttom;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGAuxiliary::GetLatitudeRelativePosition(void) const
+{
+  FGLocation source(FDMExec->GetIC()->GetLongitudeRadIC(),
+                    FDMExec->GetIC()->GetLatitudeRadIC(),
+                    in.vLocation.GetSeaLevelRadius());
+  return source.GetDistanceTo(FDMExec->GetIC()->GetLongitudeRadIC(),
+                              in.vLocation.GetLatitude()) * fttom;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGAuxiliary::GetDistanceRelativePosition(void) const
+{
+  FGLocation source(FDMExec->GetIC()->GetLongitudeRadIC(),
+                    FDMExec->GetIC()->GetLatitudeRadIC(),
+                    in.vLocation.GetSeaLevelRadius());
+  return source.GetDistanceTo(in.vLocation.GetLongitude(),
+                              in.vLocation.GetLatitude()) * fttom;
+}
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
index 462dbf676aad2fc79de85602f4703554aa6e1520..bb8c9f23f64bc62e3b5d70b26de040ad20525432 100644 (file)
@@ -48,7 +48,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_AUXILIARY "$Id: FGAuxiliary.h,v 1.29 2014/12/27 05:41:11 dpculp Exp $"
+#define ID_AUXILIARY "$Id: FGAuxiliary.h,v 1.31 2015/09/20 20:53:13 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -99,7 +99,7 @@ CLASS DOCUMENTATION
     to the JSBSim vPQRdot vector, and the w parameter is equivalent to vPQR.
 
     @author Tony Peden, Jon Berndt
-    @version $Id: FGAuxiliary.h,v 1.29 2014/12/27 05:41:11 dpculp Exp $
+    @version $Id: FGAuxiliary.h,v 1.31 2015/09/20 20:53:13 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -173,7 +173,7 @@ public:
   const FGColumnVector3& GetAeroUVW    (void) const { return vAeroUVW;     }
   const FGLocation&      GetLocationVRP(void) const { return vLocationVRP; }
 
-  double GethVRP(void) const;
+  double GethVRP(void) const { return vLocationVRP.GetAltitudeASL(); }
   double GetAeroUVW (int idx) const { return vAeroUVW(idx); }
   double Getalpha   (void) const { return alpha;      }
   double Getbeta    (void) const { return beta;       }
@@ -247,9 +247,9 @@ public:
   int    GetDayOfYear    (void) const { return day_of_year;    }
   double GetSecondsInDay (void) const { return seconds_in_day; }
 
-  double GetLongitudeRelativePosition (void) const { return lon_relative_position; }
-  double GetLatitudeRelativePosition  (void) const { return lat_relative_position; }
-  double GetDistanceRelativePosition  (void) const { return relative_position; }
+  double GetLongitudeRelativePosition (void) const;
+  double GetLatitudeRelativePosition  (void) const;
+  double GetDistanceRelativePosition  (void) const;
 
   void SetAeroPQR(const FGColumnVector3& tt) { vAeroPQR = tt; }
 
@@ -280,7 +280,6 @@ public:
     FGColumnVector3 VRPBody;
     FGColumnVector3 vFw;
     FGLocation vLocation;
-    double ReferenceRadius;
     double CosTht;
     double SinTht;
     double CosPhi;
@@ -327,12 +326,6 @@ private:
 
   double hoverbcg, hoverbmac;
 
-  // helper data, calculation of distance from initial position
-
-  double lon_relative_position;
-  double lat_relative_position;
-  double relative_position;
-
   void UpdateWindMatrices(void);
 
   void CalculateRelativePosition(void);
index 486f03e87f4df8b7d6e52049361cecae0fb13b5e..8e10abb97ee09f9e89683b520c1d64137cd7cf78 100644 (file)
@@ -44,7 +44,6 @@ INCLUDES
 #include "FGFCS.h"
 #include "FGFDMExec.h"
 #include "FGGroundReactions.h"
-#include "input_output/FGPropertyManager.h"
 #include "input_output/FGXMLElement.h"
 #include "input_output/FGModelLoader.h"
 
@@ -71,7 +70,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFCS.cpp,v 1.90 2014/06/09 11:52:07 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGFCS.cpp,v 1.92 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_FCS);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -82,6 +81,7 @@ FGFCS::FGFCS(FGFDMExec* fdmex) : FGModel(fdmex)
 {
   int i;
   Name = "FGFCS";
+  systype = stFCS;
 
   DaCmd = DeCmd = DrCmd = DsCmd = DfCmd = DsbCmd = DspCmd = 0;
   PTrimCmd = YTrimCmd = RTrimCmd = 0.0;
@@ -326,11 +326,10 @@ void FGFCS::SetDspPos( int form , double pos )
 
 void FGFCS::SetThrottleCmd(int engineNum, double setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<ThrottleCmd.size();ctr++) ThrottleCmd[ctr] = setting;
+      for (unsigned int ctr=0; ctr<ThrottleCmd.size(); ctr++)
+        ThrottleCmd[ctr] = setting;
     } else {
       ThrottleCmd[engineNum] = setting;
     }
@@ -345,11 +344,10 @@ void FGFCS::SetThrottleCmd(int engineNum, double setting)
 
 void FGFCS::SetThrottlePos(int engineNum, double setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<ThrottlePos.size();ctr++) ThrottlePos[ctr] = setting;
+      for (unsigned int ctr=0; ctr<ThrottlePos.size(); ctr++)
+        ThrottlePos[ctr] = setting;
     } else {
       ThrottlePos[engineNum] = setting;
     }
@@ -400,11 +398,10 @@ double FGFCS::GetThrottlePos(int engineNum) const
 
 void FGFCS::SetMixtureCmd(int engineNum, double setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<MixtureCmd.size();ctr++) MixtureCmd[ctr] = setting;
+      for (unsigned int ctr=0; ctr<MixtureCmd.size(); ctr++)
+        MixtureCmd[ctr] = setting;
     } else {
       MixtureCmd[engineNum] = setting;
     }
@@ -415,11 +412,10 @@ void FGFCS::SetMixtureCmd(int engineNum, double setting)
 
 void FGFCS::SetMixturePos(int engineNum, double setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<MixtureCmd.size();ctr++) MixturePos[ctr] = MixtureCmd[ctr];
+      for (unsigned int ctr=0; ctr<MixtureCmd.size(); ctr++)
+        MixturePos[ctr] = MixtureCmd[ctr];
     } else {
       MixturePos[engineNum] = setting;
     }
@@ -430,11 +426,10 @@ void FGFCS::SetMixturePos(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<PropAdvanceCmd.size();ctr++) PropAdvanceCmd[ctr] = setting;
+      for (unsigned int ctr=0; ctr<PropAdvanceCmd.size(); ctr++)
+        PropAdvanceCmd[ctr] = setting;
     } else {
       PropAdvanceCmd[engineNum] = setting;
     }
@@ -445,11 +440,10 @@ void FGFCS::SetPropAdvanceCmd(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<PropAdvanceCmd.size();ctr++) PropAdvance[ctr] = PropAdvanceCmd[ctr];
+      for (unsigned int ctr=0; ctr<PropAdvanceCmd.size(); ctr++)
+        PropAdvance[ctr] = PropAdvanceCmd[ctr];
     } else {
       PropAdvance[engineNum] = setting;
     }
@@ -460,11 +454,10 @@ void FGFCS::SetPropAdvance(int engineNum, double setting)
 
 void FGFCS::SetFeatherCmd(int engineNum, bool setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<PropFeatherCmd.size();ctr++) PropFeatherCmd[ctr] = setting;
+      for (unsigned int ctr=0; ctr<PropFeatherCmd.size(); ctr++)
+        PropFeatherCmd[ctr] = setting;
     } else {
       PropFeatherCmd[engineNum] = setting;
     }
@@ -475,11 +468,10 @@ void FGFCS::SetFeatherCmd(int engineNum, bool setting)
 
 void FGFCS::SetPropFeather(int engineNum, bool setting)
 {
-  unsigned int ctr;
-
   if (engineNum < (int)ThrottlePos.size()) {
     if (engineNum < 0) {
-      for (ctr=0;ctr<PropFeatherCmd.size();ctr++) PropFeather[ctr] = PropFeatherCmd[ctr];
+      for (unsigned int ctr=0; ctr<PropFeatherCmd.size(); ctr++)
+        PropFeather[ctr] = PropFeatherCmd[ctr];
     } else {
       PropFeather[engineNum] = setting;
     }
@@ -488,34 +480,30 @@ void FGFCS::SetPropFeather(int engineNum, bool setting)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-bool FGFCS::Load(Element* document, SystemType type)
+bool FGFCS::Load(Element* document)
 {
-  string name, parent_name;
-  Element *component_element;
-  Element *channel_element;
-  
-  systype = type;
+  if (document->GetName() == "autopilot") {
+    Name = "Autopilot: ";
+    systype = stAutoPilot;
+  } else if (document->GetName() == "flight_control") {
+    Name = "FCS: ";
+    systype = stFCS;
+  } else if (document->GetName() == "system") {
+    Name = "System: ";
+    systype = stSystem;
+  }
 
   // Load interface properties from document
   if (!FGModel::Load(document))
     return false;
 
-  name = document->GetAttributeValue("name");
-
-  Name = "Flight Control Systems Model: " + document->GetAttributeValue("name");
+  Name += document->GetAttributeValue("name");
 
-  if (document->GetName() == "autopilot") {
-    Name = "Autopilot: " + document->GetAttributeValue("name");
-  } else if (document->GetName() == "flight_control") {
-    Name = "FCS: " + document->GetAttributeValue("name");
-  } else if (document->GetName() == "system") {
-    Name = "System: " + document->GetAttributeValue("name");
-  }
   Debug(2);
 
-  if (document->GetName() == "flight_control") bindModel();
+  if (systype == stFCS) bindModel();
 
-  channel_element = document->FindElement("channel");
+  Element* channel_element = document->FindElement("channel");
   
   while (channel_element) {
   
@@ -523,9 +511,8 @@ bool FGFCS::Load(Element* document, SystemType type)
 
     string sOnOffProperty = channel_element->GetAttributeValue("execute");
     string sChannelName = channel_element->GetAttributeValue("name");
-    FGPropertyNode* OnOffPropertyNode = 0;
     if (sOnOffProperty.length() > 0) {
-      OnOffPropertyNode = PropertyManager->GetNode(sOnOffProperty);
+      FGPropertyNode* OnOffPropertyNode = PropertyManager->GetNode(sOnOffProperty);
       if (OnOffPropertyNode == 0) {
         cerr << highint << fgred
              << "The On/Off property, " << sOnOffProperty << " specified for channel "
@@ -545,7 +532,7 @@ bool FGFCS::Load(Element* document, SystemType type)
       cout << endl << highint << fgblue << "    Channel " 
          << normint << channel_element->GetAttributeValue("name") << reset << endl;
   
-    component_element = channel_element->GetElement();
+    Element* component_element = channel_element->GetElement();
     while (component_element) {
       try {
         if ((component_element->GetName() == string("lag_filter")) ||
@@ -593,7 +580,7 @@ bool FGFCS::Load(Element* document, SystemType type)
         } else {
           cerr << "Unknown FCS component: " << component_element->GetName() << endl;
         }
-      } catch(string s) {
+      } catch(string& s) {
         cerr << highint << fgred << endl << "  " << s << endl;
         cerr << reset << endl;
         return false;
index f86c1d1b24a2c46615d8715e8d91eb44288ff9f8..9f6543f9962712c88110dfe2b4a0c26085a01bb6 100644 (file)
@@ -40,9 +40,8 @@ INCLUDES
 
 #include <iosfwd>
 #include <vector>
-
 #include <string>
-#include "models/flight_control/FGFCSComponent.h"
+
 #include "models/FGModel.h"
 #include "models/FGLGear.h"
 
@@ -50,7 +49,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FCS "$Id: FGFCS.h,v 1.47 2015/02/27 20:36:47 bcoconni Exp $"
+#define ID_FCS "$Id: FGFCS.h,v 1.49 2015/07/12 19:34:08 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -168,7 +167,7 @@ CLASS DOCUMENTATION
     @property gear/tailhook-pos-norm
 
     @author Jon S. Berndt
-    @version $Revision: 1.47 $
+    @version $Revision: 1.49 $
     @see FGActuator
     @see FGDeadBand
     @see FGFCSFunction
@@ -551,9 +550,8 @@ public:
   /** Loads the Flight Control System.
       Load() is called from FGFDMExec.
       @param el pointer to the Element instance
-      @param systype type of system (FCS, Autopilot, System) 
       @return true if succesful */
-  bool Load(Element* el, SystemType systype);
+  bool Load(Element* el);
 
   std::string FindFullPathName(const std::string& system_filename) const;
 
@@ -565,10 +563,6 @@ public:
 
   bool GetTrimStatus(void) const { return FDMExec->GetTrimStatus(); }
 
-  struct Inputs {
-    unsigned int NumGear;
-  } in;
-
 private:
   double DaCmd, DeCmd, DrCmd, DsCmd, DfCmd, DsbCmd, DspCmd;
   double DePos[NForms], DaLPos[NForms], DaRPos[NForms], DrPos[NForms];
old mode 100644 (file)
new mode 100755 (executable)
index e469593..0eda671
@@ -70,7 +70,7 @@ typedef std::vector <FGFCSComponent*> FCSCompVec;
 class FGFCSChannel {
 public:
   /// Constructor
-  FGFCSChannel(string name, FGPropertyNode* node=0) :
+  FGFCSChannel(std::string name, FGPropertyNode* node=0) :
   OnOffNode(node), Name(name)
   {
   }
@@ -80,7 +80,7 @@ public:
     FCSComponents.clear();
   }
   /// Retrieves the name of the channel
-  string GetName() {return Name;}
+  std::string GetName() {return Name;}
 
   /// Adds a component to a channel
   void Add(FGFCSComponent* comp) {FCSComponents.push_back(comp);}
@@ -114,7 +114,7 @@ public:
   private:
     FCSCompVec FCSComponents;
     FGConstPropertyNode_ptr OnOffNode;
-    string Name;
+    std::string Name;
 };
 
 }
old mode 100644 (file)
new mode 100755 (executable)
index be62842..5bf66a4
@@ -50,7 +50,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGInput.cpp,v 1.33 2015/04/08 19:35:00 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGInput.cpp,v 1.34 2015/08/23 09:43:31 bcoconni Exp $");
 IDENT(IdHdr,ID_INPUT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -60,6 +60,7 @@ CLASS IMPLEMENTATION
 FGInput::FGInput(FGFDMExec* fdmex) : FGModel(fdmex)
 {
   Name = "FGInput";
+  enabled = true;
 
   Debug(0);
 }
@@ -139,7 +140,9 @@ bool FGInput::InitModel(void)
 
 bool FGInput::Run(bool Holding)
 {
+  if (FDMExec->GetTrimStatus()) return true;
   if (FGModel::Run(Holding)) return true;
+  if (!enabled) return true;
 
   vector<FGInputType*>::iterator it;
   for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
@@ -164,24 +167,6 @@ bool FGInput::SetDirectivesFile(const std::string& fname)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGInput::Enable(void)
-{
-  vector<FGInputType*>::iterator it;
-  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
-    (*it)->Enable();
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void FGInput::Disable(void)
-{
-  vector<FGInputType*>::iterator it;
-  for (it = InputTypes.begin(); it != InputTypes.end(); ++it)
-    (*it)->Disable();
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 bool FGInput::Toggle(int idx)
 {
   if (idx >= (int)0 && idx < (int)InputTypes.size())
old mode 100644 (file)
new mode 100755 (executable)
index e127bbe..e2b606d
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_INPUT "$Id: FGInput.h,v 1.11 2015/02/15 12:03:21 bcoconni Exp $"
+#define ID_INPUT "$Id: FGInput.h,v 1.13 2015/08/23 09:43:31 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -81,7 +81,7 @@ CLASS DOCUMENTATION
 
     The class FGInput is the manager of the inputs requested by the user. It
     manages a list of instances derived from the abstract class FGInputType.
-    @version $Id: FGInput.h,v 1.11 2015/02/15 12:03:21 bcoconni Exp $
+    @version $Id: FGInput.h,v 1.13 2015/08/23 09:43:31 bcoconni Exp $
  */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -125,10 +125,10 @@ public:
   bool SetDirectivesFile(const std::string& fname);
 
   /// Enables the input generation for all input instances.
-  void Enable(void);
+  void Enable(void) { enabled = true; }
   /// Disables the input generation for all input instances.
-  void Disable(void);
-  /** Toggles the input generation for an ouput instances.
+  void Disable(void) { enabled = false; }
+  /** Toggles the input generation of each input instance.
       @param idx ID of the input instance which input generation will be
                  toggled.
       @result false if the instance does not exist otherwise returns the status
@@ -152,6 +152,7 @@ public:
 
 private:
   std::vector<FGInputType*> InputTypes;
+  bool enabled;
 
   void Debug(int from);
 };
index 7ac687ee5103643a19a593cf4bf774068297efb7..d26ddbcbefd247938591b9ec12bbf8b35956b37e 100644 (file)
@@ -42,11 +42,9 @@ INCLUDES
 
 #include <cstdlib>
 #include <cstring>
-#include <sstream>
 
 #include "math/FGFunction.h"
 #include "FGLGear.h"
-#include "input_output/FGPropertyManager.h"
 #include "models/FGGroundReactions.h"
 #include "math/FGTable.h"
 #include "input_output/FGXMLElement.h"
@@ -63,7 +61,7 @@ DEFINITIONS
 GLOBAL DATA
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-IDENT(IdSrc,"$Id: FGLGear.cpp,v 1.118 2014/11/30 12:35:32 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGLGear.cpp,v 1.120 2015/08/16 16:13:31 bcoconni Exp $");
 IDENT(IdHdr,ID_LGEAR);
 
 // Body To Structural (body frame is rotated 180 deg about Y and lengths are given in
@@ -166,6 +164,23 @@ FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number, const struct Inputs&
   else
     eSteerType = stSteer;
 
+  Element* castering = el->FindElement("castered");
+  if (castering) {
+    if (castering->GetDataAsNumber() != 0.0) {
+      eSteerType = stCaster;
+      Castered = true;
+    }
+    else {
+      if (maxSteerAngle == 0.0) {
+        eSteerType = stFixed;
+      }
+      else {
+        eSteerType = stSteer;
+      }
+      Castered = false;
+    }
+  }
+
   GroundReactions = fdmex->GetGroundReactions();
 
   ForceY_Table = 0;
@@ -262,7 +277,13 @@ void FGLGear::ResetToIC(void)
   WheelSlip = 0.0;
 
   // Initialize Lagrange multipliers
-  memset(LMultiplier, 0, sizeof(LMultiplier));
+  for (int i=0; i < 3; i++) {
+    LMultiplier[i].ForceJacobian.InitMatrix();
+    LMultiplier[i].MomentJacobian.InitMatrix();
+    LMultiplier[i].Min = 0.0;
+    LMultiplier[i].Max = 0.0;
+    LMultiplier[i].value = 0.0;
+  }
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
index ca8f3b16c6659b54804e26f3faa9f88e69b893c1..56b1f68495d0c787d0e50ca91ee6c05fa14f6f6e 100644 (file)
@@ -48,14 +48,12 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_MASSBALANCE "$Id: FGMassBalance.h,v 1.35 2015/03/28 14:49:02 bcoconni Exp $"
+#define ID_MASSBALANCE "$Id: FGMassBalance.h,v 1.36 2015/08/22 18:09:00 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONSS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-using std::string;
-
 namespace JSBSim {
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -248,7 +246,7 @@ private:
     double Weight; /// Weight in pounds.
     double Radius; /// Radius in feet.
     double Length; /// Length in feet.
-    string Name;
+    std::string Name;
     FGMatrix33 mPMInertia;
 
     double GetPointMassLocation(int axis) const {return Location(axis);}
@@ -256,7 +254,7 @@ private:
     esShape GetShapeType(void) {return eShapeType;}
     const FGColumnVector3& GetLocation(void) {return Location;}
     const FGMatrix33& GetPointMassInertia(void) {return mPMInertia;}
-    const string& GetName(void) {return Name;}
+    const std::string& GetName(void) {return Name;}
 
     void SetPointMassLocation(int axis, double value) {Location(axis) = value;}
     void SetPointMassWeight(double wt) {
@@ -266,7 +264,7 @@ private:
     void SetPointMassShapeType(esShape st) {eShapeType = st;}
     void SetRadius(double r) {Radius = r;}
     void SetLength(double l) {Length = l;}
-    void SetName(string name) {Name = name;}
+    void SetName(const std::string& name) {Name = name;}
     void SetPointMassMoI(const FGMatrix33& MoI) { mPMInertia = MoI; }
     double GetPointMassMoI(int r, int c) {return mPMInertia(r,c);}
 
index ba05a71e1bde526f827a1087b0aece493d61575c..943444ac310ac040df63391ea3b25085f2ac8920 100644 (file)
@@ -46,7 +46,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGModel.cpp,v 1.25 2014/06/09 11:52:07 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGModel.cpp,v 1.26 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_MODEL);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -142,8 +142,6 @@ bool FGModel::Load(Element* el)
       element->SetParent(el);
       element = document->FindNextElement();
     }
-
-    document = el;
   }
 
   return result;
index 86b576b467321cbe7917a7db41aab42f3750edb9..b7ad17bcaef82dd64a0cda0a6cab26712a8d2f4e 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_MODEL "$Id: FGModel.h,v 1.22 2014/06/09 11:52:07 bcoconni Exp $"
+#define ID_MODEL "$Id: FGModel.h,v 1.25 2015/08/16 13:19:52 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -93,16 +93,18 @@ public:
   virtual bool Run(bool Holding);
 
   virtual bool InitModel(void);
-  virtual void SetRate(int tt) {rate = tt;}
-  virtual int  GetRate(void)   {return rate;}
+  /// Set the ouput rate for the model in frames
+  void SetRate(unsigned int tt) {rate = tt;}
+  /// Get the output rate for the model in frames
+  unsigned int GetRate(void)   {return rate;}
   FGFDMExec* GetExec(void)     {return FDMExec;}
 
   void SetPropertyManager(FGPropertyManager *fgpm) { PropertyManager=fgpm;}
   virtual std::string FindFullPathName(const std::string& filename) const;
 
 protected:
-  int exe_ctr;
-  int rate;
+  unsigned int exe_ctr;
+  unsigned int rate;
 
   /** Loads this model.
       @param el a pointer to the element
index d5221ca9ecd18cc564c960f5232bdbfa48074a56..6d682bac90033eae9f3c710102367926df63503a 100644 (file)
@@ -53,7 +53,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGOutput.cpp,v 1.82 2015/04/02 02:20:50 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGOutput.cpp,v 1.86 2015/08/23 09:43:31 bcoconni Exp $");
 IDENT(IdHdr,ID_OUTPUT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -65,6 +65,7 @@ FGOutput::FGOutput(FGFDMExec* fdmex) : FGModel(fdmex)
   typedef int (FGOutput::*iOPV)(void) const;
 
   Name = "FGOutput";
+  enabled = true;
 
   PropertyManager->Tie("simulation/force-output", this, (iOPV)0, &FGOutput::ForceOutput, false);
 
@@ -101,11 +102,14 @@ bool FGOutput::InitModel(void)
 
 bool FGOutput::Run(bool Holding)
 {
+  if (FDMExec->GetTrimStatus()) return true;
   if (FGModel::Run(Holding)) return true;
+  if (Holding) return false;
+  if (!enabled) return true;
 
   vector<FGOutputType*>::iterator it;
   for (it = OutputTypes.begin(); it != OutputTypes.end(); ++it)
-    (*it)->Run(Holding);
+    (*it)->Run();
 
   return false;
 }
@@ -130,24 +134,6 @@ void FGOutput::SetStartNewOutput(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGOutput::Enable(void)
-{
-  vector<FGOutputType*>::iterator it;
-  for (it = OutputTypes.begin(); it != OutputTypes.end(); ++it)
-    (*it)->Enable();
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-void FGOutput::Disable(void)
-{
-  vector<FGOutputType*>::iterator it;
-  for (it = OutputTypes.begin(); it != OutputTypes.end(); ++it)
-    (*it)->Disable();
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 bool FGOutput::Toggle(int idx)
 {
   if (idx >= (int)0 && idx < (int)OutputTypes.size())
@@ -158,11 +144,11 @@ bool FGOutput::Toggle(int idx)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGOutput::SetRate(double rate)
+void FGOutput::SetRateHz(double rate)
 {
   vector<FGOutputType*>::iterator it;
   for (it = OutputTypes.begin(); it != OutputTypes.end(); ++it)
-    (*it)->SetRate(rate);
+    (*it)->SetRateHz(rate);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -248,7 +234,7 @@ bool FGOutput::Load(int subSystems, std::string protocol, std::string type,
 
   Output->SetIdx(idx);
   Output->SetOutputName(name);
-  Output->SetRate(outRate);
+  Output->SetRateHz(outRate);
   Output->SetSubSystems(subSystems);
   Output->SetOutputProperties(outputProperties);
 
index 86e14c1ff437bf865c391753fbb8b4fcdaf51409..7a68a84404b3c5f1b618ef2d3b3d68c6b70d0ba0 100644 (file)
@@ -47,7 +47,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_OUTPUT "$Id: FGOutput.h,v 1.29 2013/11/24 11:40:56 bcoconni Exp $"
+#define ID_OUTPUT "$Id: FGOutput.h,v 1.33 2015/08/23 09:43:31 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -121,7 +121,7 @@ CLASS DOCUMENTATION
 
     The class FGOutput is the manager of the outputs requested by the user. It
     manages a list of instances derived from the abstract class FGOutputType.
-    @version $Id: FGOutput.h,v 1.29 2013/11/24 11:40:56 bcoconni Exp $
+    @version $Id: FGOutput.h,v 1.33 2015/08/23 09:43:31 bcoconni Exp $
  */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -183,10 +183,10 @@ public:
       @return true if the execution succeeded. */
   bool SetDirectivesFile(const std::string& fname);
   /// Enables the output generation for all output instances.
-  void Enable(void);
+  void Enable(void) { enabled = true; }
   /// Disables the output generation for all output instances.
-  void Disable(void);
-  /** Toggles the output generation for an ouput instances.
+  void Disable(void) { enabled = false; }
+  /** Toggles the output generation of each ouput instance.
       @param idx ID of the output instance which output generation will be
                  toggled.
       @result false if the instance does not exist otherwise returns the status
@@ -195,7 +195,7 @@ public:
   bool Toggle(int idx);
   /** Modifies the output rate for all output instances.
       @param rate new output rate in Hz */
-  void SetRate(double rate);
+  void SetRateHz(double rate);
   /** Load the output directives and adds a new output instance to the Output
       Manager list.
       @param el XMLElement that is pointing to the output directives
@@ -224,6 +224,7 @@ public:
 
 private:
   std::vector<FGOutputType*> OutputTypes;
+  bool enabled;
 
   void Debug(int from);
 };
index c0d20fdb6d62379f07ca7a6e70105cd9bb501f99..a2aebf58ca750ec5edac538744f5670d03ad023c 100644 (file)
@@ -79,7 +79,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPropagate.cpp,v 1.126 2014/11/30 12:35:32 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGPropagate.cpp,v 1.127 2015/08/22 18:09:00 bcoconni Exp $");
 IDENT(IdHdr,ID_PROPAGATE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -188,12 +188,10 @@ void FGPropagate::SetInitialState(const FGInitialCondition *FGIC)
 
 void FGPropagate::InitializeDerivatives()
 {
-  for (int i=0; i<5; i++) {
-    VState.dqPQRidot[i] = in.vPQRidot;
-    VState.dqUVWidot[i] = in.vUVWidot;
-    VState.dqInertialVelocity[i] = VState.vInertialVelocity;
-    VState.dqQtrndot[i] = in.vQtrndot;
-  }
+  VState.dqPQRidot.assign(5, in.vPQRidot);
+  VState.dqUVWidot.assign(5, in.vUVWidot);
+  VState.dqInertialVelocity.assign(5, VState.vInertialVelocity);
+  VState.dqQtrndot.assign(5, in.vQtrndot);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -636,7 +634,6 @@ void FGPropagate::WriteStateFile(int num)
 
   string filename = FDMExec->GetFullAircraftPath();
 
-  string sim_time = to_string((double)FDMExec->GetSimTime());
   if (filename.empty()) filename = "initfile.";
   else                  filename.append("/initfile.");
 
index a3c3a2702ac3cf0bcd137666bb1e7cd0e29cdfb8..682c555b50b42186ab128d72879c2e4b11d0fd2b 100644 (file)
@@ -49,7 +49,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_PROPAGATE "$Id: FGPropagate.h,v 1.81 2014/05/17 15:15:53 jberndt Exp $"
+#define ID_PROPAGATE "$Id: FGPropagate.h,v 1.82 2015/08/22 18:09:00 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -57,7 +57,6 @@ FORWARD DECLARATIONS
 
 namespace JSBSim {
 
-using std::deque;
 class FGInitialCondition;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -93,7 +92,7 @@ CLASS DOCUMENTATION
     @endcode
 
     @author Jon S. Berndt, Mathias Froehlich, Bertrand Coconnier
-    @version $Id: FGPropagate.h,v 1.81 2014/05/17 15:15:53 jberndt Exp $
+    @version $Id: FGPropagate.h,v 1.82 2015/08/22 18:09:00 bcoconni Exp $
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -138,10 +137,10 @@ public:
 
     FGColumnVector3 vInertialPosition;
 
-    deque <FGColumnVector3> dqPQRidot;
-    deque <FGColumnVector3> dqUVWidot;
-    deque <FGColumnVector3> dqInertialVelocity;
-    deque <FGQuaternion>    dqQtrndot;
+    std::deque <FGColumnVector3> dqPQRidot;
+    std::deque <FGColumnVector3> dqUVWidot;
+    std::deque <FGColumnVector3> dqInertialVelocity;
+    std::deque <FGQuaternion>    dqQtrndot;
   };
 
   /** Constructor.
@@ -567,7 +566,7 @@ public:
   void SetDistanceAGL(double tt);
   void SetDistanceAGLKm(double tt);
 
-  void SetInitialState(const FGInitialCondition *);
+  void SetInitialState(const FGInitialCondition*);
   void SetLocation(const FGLocation& l);
   void SetLocation(const FGColumnVector3& lv)
   {
@@ -632,13 +631,13 @@ private:
 
   void Integrate( FGColumnVector3& Integrand,
                   FGColumnVector3& Val,
-                  deque <FGColumnVector3>& ValDot,
+                  std::deque <FGColumnVector3>& ValDot,
                   double dt,
                   eIntegrateType integration_type);
 
   void Integrate( FGQuaternion& Integrand,
                   FGQuaternion& Val,
-                  deque <FGQuaternion>& ValDot,
+                  std::deque <FGQuaternion>& ValDot,
                   double dt,
                   eIntegrateType integration_type);
 
old mode 100644 (file)
new mode 100755 (executable)
index 2b9b4c5..eceac67
@@ -44,14 +44,14 @@ INCLUDES
 #include "models/FGPropagate.h"
 #include "models/FGAccelerations.h"
 #include "models/FGMassBalance.h"
-#include "models/FGInertial.h"
 #include "input_output/FGXMLElement.h"
+#include "models/FGFCS.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGAccelerometer.cpp,v 1.15 2014/01/13 10:46:07 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGAccelerometer.cpp,v 1.17 2015/08/09 17:29:48 bcoconni Exp $");
 IDENT(IdHdr,ID_ACCELEROMETER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -92,8 +92,8 @@ bool FGAccelerometer::Run(void )
     
   //aircraft forces
   vAccel = (Accelerations->GetBodyAccel()
-              + Accelerations->GetPQRidot() * vRadius
-              + Propagate->GetPQRi() * (Propagate->GetPQRi() * vRadius));
+            + Accelerations->GetPQRidot() * vRadius
+            + Propagate->GetPQRi() * (Propagate->GetPQRi() * vRadius));
 
   // transform to the specified orientation
   vAccel = mT * vAccel;
index dd492c4aff6a35806a2999e430d952dc883e3494..4537527758c3411a41972806c0fddc75a902ec38 100644 (file)
@@ -42,12 +42,13 @@ INCLUDES
 #include "FGActuator.h"
 #include "input_output/FGXMLElement.h"
 #include "math/FGRealValue.h"
+#include "models/FGFCS.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGActuator.cpp,v 1.37 2014/08/28 13:44:28 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGActuator.cpp,v 1.38 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_ACTUATOR);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -57,8 +58,6 @@ CLASS IMPLEMENTATION
 
 FGActuator::FGActuator(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
 {
-  double denom;
-
   // inputs are read from the base class constructor
 
   PreviousOutput = 0.0;
@@ -119,7 +118,7 @@ FGActuator::FGActuator(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, eleme
   }
   if ( element->FindElement("lag") ) {
     lag = element->FindElementValueAsNumber("lag");
-    denom = 2.00 + dt*lag;
+    double denom = 2.00 + dt*lag;
     ca = dt*lag / denom;
     cb = (2.00 - dt*lag) / denom;
   }
index 39d586972895227d1a1329789ed8c7052c860e45..5152a558b91b9f2d13df7ded14e084a6f8797bf0 100644 (file)
@@ -37,18 +37,19 @@ COMMENTS, REFERENCES,  and NOTES
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
+#include <iostream>
+#include <cstdlib>
+
 #include "FGFCSComponent.h"
-#include "input_output/FGPropertyManager.h"
 #include "input_output/FGXMLElement.h"
 #include "math/FGPropertyValue.h"
-#include <iostream>
-#include <cstdlib>
+#include "models/FGFCS.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFCSComponent.cpp,v 1.40 2014/01/13 10:46:08 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGFCSComponent.cpp,v 1.41 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_FCSCOMPONENT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -129,9 +130,9 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
     } else {
       InitSigns.push_back( 1.0);
     }
-    FGPropertyNode* node = 0L;
+
     if (PropertyManager->HasNode(init)) {
-      node = PropertyManager->GetNode(init);
+      FGPropertyNode* node = PropertyManager->GetNode(init);
       InitNodes.push_back(new FGPropertyValue( node ));
     } else {
       InitNodes.push_back(new FGPropertyValue( init,
@@ -151,9 +152,9 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
     } else {
       InputSigns.push_back( 1.0);
     }
-    FGPropertyNode* node = 0L;
+
     if (PropertyManager->HasNode(input)) {
-      node = PropertyManager->GetNode(input);
+      FGPropertyNode* node = PropertyManager->GetNode(input);
       InputNodes.push_back(new FGPropertyValue( node ));
     } else {
       InputNodes.push_back(new FGPropertyValue( input,
@@ -319,8 +320,6 @@ void FGFCSComponent::bind(void)
 
 void FGFCSComponent::Debug(int from)
 {
-  string propsign="";
-
   if (debug_lvl <= 0) return;
 
   if (debug_lvl & 1) { // Standard console startup message output
@@ -329,17 +328,20 @@ void FGFCSComponent::Debug(int from)
                    << "\" of type: " << Type << endl;
 
       if (clip) {
+        string propsign;
+
         if (ClipMinPropertyNode != 0L) {
           if (clipMinSign < 0.0) propsign="-";
           cout << "      Minimum limit: " << propsign << ClipMinPropertyNode->GetName() << endl;
-          propsign="";
         } else {
           cout << "      Minimum limit: " << clipmin << endl;
         }
+
+        propsign="";
+
         if (ClipMaxPropertyNode != 0L) {
           if (clipMaxSign < 0.0) propsign="-";
           cout << "      Maximum limit: " << propsign << ClipMaxPropertyNode->GetName() << endl;
-          propsign="";
         } else {
           cout << "      Maximum limit: " << clipmax << endl;
         }
index 4e1680a9554187e2734ca4ab44d1c2abcf6bd045..70ae0b6e6ed42dff55a48231741756129e3a359e 100644 (file)
@@ -37,16 +37,17 @@ SENTRY
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#include "FGJSBBase.h"
-#include "math/FGPropertyValue.h"
 #include <string>
 #include <vector>
 
+#include "FGJSBBase.h"
+#include "math/FGPropertyValue.h"
+
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_FCSCOMPONENT "$Id: FGFCSComponent.h,v 1.26 2014/02/17 05:33:25 jberndt Exp $"
+#define ID_FCSCOMPONENT "$Id: FGFCSComponent.h,v 1.27 2015/07/12 19:34:08 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -82,7 +83,7 @@ CLASS DOCUMENTATION
     - FGAngle
 
     @author Jon S. Berndt
-    @version $Id: FGFCSComponent.h,v 1.26 2014/02/17 05:33:25 jberndt Exp $
+    @version $Id: FGFCSComponent.h,v 1.27 2015/07/12 19:34:08 bcoconni Exp $
     @see Documentation for the FGFCS class, and for the configuration file class
 */
 
@@ -141,7 +142,4 @@ protected:
 
 } //namespace JSBSim
 
-#include "../FGFCS.h"
-
 #endif
-
index 9060688968a19b2f55aaa2ceebf8d2e452ea6ae9..2d7902287e06035a2ec16c29790f3a609dd59872 100644 (file)
@@ -48,7 +48,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGFilter.cpp,v 1.20 2014/01/13 10:46:09 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGFilter.cpp,v 1.21 2015/09/27 20:26:23 bcoconni Exp $");
 IDENT(IdHdr,ID_FILTER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -188,11 +188,9 @@ void FGFilter::CalculateDynamicFilters(void)
 
 bool FGFilter::Run(void)
 {
-  double test = 0.0;
-
   if (Initialize) {
 
-    PreviousOutput1 = PreviousInput1 = Output = Input;
+    PreviousOutput2 = PreviousInput2 = PreviousOutput1 = PreviousInput1 = Output = Input;
     Initialize = false;
 
   } else {
@@ -217,7 +215,7 @@ bool FGFilter::Run(void)
         break;
       case eIntegrator:
         if (Trigger != 0) {
-          test = Trigger->getDoubleValue();
+          double test = Trigger->getDoubleValue();
           if (fabs(test) > 0.000001) {
             Input  = PreviousInput1 = PreviousInput2 = 0.0;
           }
old mode 100644 (file)
new mode 100755 (executable)
index ceaafef..d184946
@@ -42,12 +42,13 @@ INCLUDES
 #include "FGGyro.h"
 #include "models/FGAccelerations.h"
 #include "input_output/FGXMLElement.h"
+#include "models/FGFCS.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGGyro.cpp,v 1.10 2014/01/13 10:46:09 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGGyro.cpp,v 1.11 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_GYRO);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
old mode 100644 (file)
new mode 100755 (executable)
index eeb2b1c..b7203e5
@@ -44,12 +44,13 @@ INCLUDES
 #include "FGMagnetometer.h"
 #include "simgear/magvar/coremag.hxx"
 #include "input_output/FGXMLElement.h"
+#include "models/FGFCS.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGMagnetometer.cpp,v 1.9 2014/01/13 10:46:09 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGMagnetometer.cpp,v 1.10 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_MAGNETOMETER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
old mode 100644 (file)
new mode 100755 (executable)
index 9318795..9692199
@@ -37,16 +37,17 @@ COMMENTS, REFERENCES,  and NOTES
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#include "FGSensor.h"
-#include "input_output/FGXMLElement.h"
 #include <iostream>
 #include <cstdlib>
 
+#include "FGSensor.h"
+#include "input_output/FGXMLElement.h"
+
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGSensor.cpp,v 1.27 2014/01/13 10:46:10 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGSensor.cpp,v 1.28 2015/07/12 19:34:08 bcoconni Exp $");
 IDENT(IdHdr,ID_SENSOR);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -56,8 +57,6 @@ CLASS IMPLEMENTATION
 
 FGSensor::FGSensor(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
 {
-  double denom;
-
   // inputs are read from the base class constructor
 
   bits = quantized = divisions = 0;
@@ -94,7 +93,7 @@ FGSensor::FGSensor(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element)
   }
   if ( element->FindElement("lag") ) {
     lag = element->FindElementValueAsNumber("lag");
-    denom = 2.00 + dt*lag;
+    double denom = 2.00 + dt*lag;
     ca = dt*lag / denom;
     cb = (2.00 - dt*lag) / denom;
   }
old mode 100644 (file)
new mode 100755 (executable)
index 5f4d623..0173ade
@@ -40,12 +40,13 @@ INCLUDES
 #include "FGWaypoint.h"
 #include "input_output/FGXMLElement.h"
 #include "input_output/FGPropertyManager.h"
+#include "math/FGLocation.h"
 
 using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGWaypoint.cpp,v 1.5 2014/01/13 10:46:10 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGWaypoint.cpp,v 1.6 2015/09/20 20:53:13 bcoconni Exp $");
 IDENT(IdHdr,ID_WAYPOINT);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -71,9 +72,8 @@ FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, eleme
         target_latitude_unit = 0.017453293;
       }
     }
-  } else {
+  } else
     throw("Target latitude is required for waypoint component: "+Name);
-  }
 
   if (element->FindElement("target_longitude") ) {
     target_longitude_pNode = PropertyManager->GetNode(element->FindElementValue("target_longitude"));
@@ -82,9 +82,8 @@ FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, eleme
         target_longitude_unit = 0.017453293;
       }
     }
-  } else {
+  } else
     throw("Target longitude is required for waypoint component: "+Name);
-  }
 
   if (element->FindElement("source_latitude") ) {
     source_latitude_pNode = PropertyManager->GetNode(element->FindElementValue("source_latitude"));
@@ -93,9 +92,8 @@ FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, eleme
         source_latitude_unit = 0.017453293;
       }
     }
-  } else {
+  } else
     throw("Source latitude is required for waypoint component: "+Name);
-  }
 
   if (element->FindElement("source_longitude") ) {
     source_longitude_pNode = PropertyManager->GetNode(element->FindElementValue("source_longitude"));
@@ -104,30 +102,28 @@ FGWaypoint::FGWaypoint(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, eleme
         source_longitude_unit = 0.017453293;
       }
     }
-  } else {
+  } else
     throw("Source longitude is required for waypoint component: "+Name);
-  }
 
-  if (element->FindElement("radius")) {
+  if (element->FindElement("radius"))
     radius = element->FindElementValueAsNumberConvertTo("radius", "FT");
-  } else {
+  else
     radius = 21144000; // Radius of Earth in feet.
-  }
 
   unit = element->GetAttributeValue("unit");
   if (WaypointType == eHeading) {
     if (!unit.empty()) {
-    if      (unit == "DEG") eUnit = eDeg;
-    else if (unit == "RAD") eUnit = eRad;
-    else throw("Unknown unit "+unit+" in HEADING waypoint component, "+Name);
-  } else {
+      if      (unit == "DEG") eUnit = eDeg;
+      else if (unit == "RAD") eUnit = eRad;
+      else throw("Unknown unit "+unit+" in HEADING waypoint component, "+Name);
+    } else {
       eUnit = eRad; // Default is radians if unspecified
     }
   } else {
     if (!unit.empty()) {
-    if      (unit == "FT") eUnit = eFeet;
-    else if (unit == "M")  eUnit = eMeters;
-    else throw("Unknown unit "+unit+" in DISTANCE waypoint component, "+Name);
+      if      (unit == "FT") eUnit = eFeet;
+      else if (unit == "M")  eUnit = eMeters;
+      else throw("Unknown unit "+unit+" in DISTANCE waypoint component, "+Name);
     } else {
       eUnit = eFeet; // Default is feet if unspecified
     }
@@ -145,47 +141,18 @@ FGWaypoint::~FGWaypoint()
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-//  The calculations, below, implement the Haversine formulas to calculate
-//  heading and distance to a set of lat/long coordinates from the current
-//  position. The latitude and longitude are expected to be in radian units
-//  and are measured from the 0 meridian and the equator, with positive 
-//  longitude being east from there, and positive latitude being north.
-//
-//  The basic equations are (lat1, long1 are source positions; lat2
-//  long2 are target positions):
-//
-//  R = earth’s radius
-//  Î”lat = lat2 âˆ’ lat1
-//  Î”long = long2 âˆ’ long1
-//
-//  For the heading angle calculation:
-//
-//  Î¸ = atan2(sin(Δlong)∙cos(lat2), cos(lat1)∙sin(lat2) âˆ’ sin(lat1) âˆ™cos(lat2)∙cos(Δlong) )
-//
-//  For the waypoint distance calculation:
-//
-//  a = sin²(Δlat/2) + cos(lat1)∙cos(lat2)∙sin²(Δlong/2)
-//  c = 2∙atan2(√a, âˆš(1−a))
-//  d = R∙c
 
 bool FGWaypoint::Run(void )
 {
-  target_latitude = target_latitude_pNode->getDoubleValue() * target_latitude_unit;
-  target_longitude = target_longitude_pNode->getDoubleValue() * target_longitude_unit;
-  source_latitude = source_latitude_pNode->getDoubleValue() * source_latitude_unit;
-  source_longitude = source_longitude_pNode->getDoubleValue() * source_longitude_unit;
-
-  double delta_lat_rad = target_latitude  - source_latitude;
-  double delta_lon_rad = target_longitude - source_longitude;
+  double target_latitude = target_latitude_pNode->getDoubleValue() * target_latitude_unit;
+  double target_longitude = target_longitude_pNode->getDoubleValue() * target_longitude_unit;
+  double source_latitude = source_latitude_pNode->getDoubleValue() * source_latitude_unit;
+  double source_longitude = source_longitude_pNode->getDoubleValue() * source_longitude_unit;
+  FGLocation source(source_longitude, source_latitude, radius);
 
   if (WaypointType == eHeading) {     // Calculate Heading
-
-    double Y = sin(delta_lon_rad) * cos(target_latitude);
-    double X = (cos(source_latitude) * sin(target_latitude))
-               - (sin(source_latitude) * cos(target_latitude) * cos(delta_lon_rad));
-
-    double heading_to_waypoint_rad = atan2(Y, X);
-    if (heading_to_waypoint_rad < 0) heading_to_waypoint_rad += 2.0*M_PI;
+    double heading_to_waypoint_rad = source.GetHeadingTo(target_longitude,
+                                                         target_latitude);
 
     double heading_to_waypoint = 0;
     if (eUnit == eDeg) heading_to_waypoint = heading_to_waypoint_rad * radtodeg;
@@ -194,12 +161,7 @@ bool FGWaypoint::Run(void )
     Output = heading_to_waypoint;
 
   } else {                            // Calculate Distance
-
-    double distance_a = pow(sin(delta_lat_rad/2.0), 2.0)
-                        + (cos(source_latitude) * cos(target_latitude)
-                          * (pow(sin(delta_lon_rad/2.0), 2.0)));
-
-    double wp_distance = 2.0 * radius * atan2(pow(distance_a, 0.5), pow((1.0 - distance_a), 0.5));
+    double wp_distance = source.GetDistanceTo(target_longitude, target_latitude);
 
     if (eUnit == eMeters) {
       Output = FeetToMeters(wp_distance);
old mode 100644 (file)
new mode 100755 (executable)
index bf7ba66..999e973
@@ -44,7 +44,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_WAYPOINT "$Id: FGWaypoint.h,v 1.1 2013/06/20 04:37:28 jberndt Exp $"
+#define ID_WAYPOINT "$Id: FGWaypoint.h,v 1.3 2015/09/20 20:53:13 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -92,7 +92,7 @@ CLASS DOCUMENTATION
     @endcode
 
     @author Jon S. Berndt
-    @version $Id: FGWaypoint.h,v 1.1 2013/06/20 04:37:28 jberndt Exp $
+    @version $Id: FGWaypoint.h,v 1.3 2015/09/20 20:53:13 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -112,10 +112,6 @@ private:
   FGPropertyNode_ptr target_longitude_pNode;
   FGPropertyNode_ptr source_latitude_pNode;
   FGPropertyNode_ptr source_longitude_pNode;
-  double target_latitude;
-  double target_longitude;
-  double source_latitude;
-  double source_longitude;
   double target_latitude_unit;
   double target_longitude_unit;
   double source_latitude_unit;
index 41fba7d7fc603e451f974faa2f0480b2d7cf9a63..9273a97bc886de45b166433225fec70d29ed2cdb 100644 (file)
@@ -50,7 +50,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGElectric.cpp,v 1.18 2014/06/08 12:00:35 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGElectric.cpp,v 1.20 2015/09/27 09:54:21 bcoconni Exp $");
 IDENT(IdHdr,ID_ELECTRIC);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -58,10 +58,8 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGElectric::FGElectric(FGFDMExec* exec, Element *el, int engine_number, struct FGEngine::Inputs& input)
-  : FGEngine(exec, engine_number, input)
+  : FGEngine(engine_number, input)
 {
-  string token;
-
   Load(exec,el);
 
   Type = etElectric;
@@ -71,10 +69,9 @@ FGElectric::FGElectric(FGFDMExec* exec, Element *el, int engine_number, struct F
   if (el->FindElement("power"))
     PowerWatts = el->FindElementValueAsNumberConvertTo("power","WATTS");
 
-  string property_name, base_property_name;
-  base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNumber);
-  property_name = base_property_name + "/power-hp";
-  PropertyManager->Tie(property_name, &HP);
+  string base_property_name = CreateIndexedPropertyName("propulsion/engine",
+                                                        EngineNumber);
+  exec->GetPropertyManager()->Tie(base_property_name + "/power-hp", &HP);
 
   Debug(0); // Call Debug() routine from constructor if needed
 }
index b3257d148f8d8e95433150949b04a931e9a8ca52..61834f2ade2e5a8becf12ae14c67668fc4f8170c 100644 (file)
@@ -53,17 +53,16 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGEngine.cpp,v 1.62 2015/02/27 20:42:55 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGEngine.cpp,v 1.67 2015/09/27 09:54:21 bcoconni Exp $");
 IDENT(IdHdr,ID_ENGINE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-FGEngine::FGEngine(FGFDMExec* exec, int engine_number, struct Inputs& input)
+FGEngine::FGEngine(int engine_number, struct Inputs& input)
                       : in(input), EngineNumber(engine_number)
 {
-  Name = "";
   Type = etUnknown;
   X = Y = Z = 0.0;
   EnginePitch = EngineYaw = 0.0;
@@ -172,27 +171,25 @@ void FGEngine::LoadThrusterInputs()
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGEngine::LoadThruster(Element *thruster_element)
+void FGEngine::LoadThruster(FGFDMExec* exec, Element *thruster_element)
 {
   if (thruster_element->FindElement("propeller")) {
     Element *document = thruster_element->FindElement("propeller");
-    Thruster = new FGPropeller(FDMExec, document, EngineNumber);
+    Thruster = new FGPropeller(exec, document, EngineNumber);
   } else if (thruster_element->FindElement("nozzle")) {
     Element *document = thruster_element->FindElement("nozzle");
-    Thruster = new FGNozzle(FDMExec, document, EngineNumber);
+    Thruster = new FGNozzle(exec, document, EngineNumber);
   } else if (thruster_element->FindElement("rotor")) {
     Element *document = thruster_element->FindElement("rotor");
-    Thruster = new FGRotor(FDMExec, document, EngineNumber);
+    Thruster = new FGRotor(exec, document, EngineNumber);
   } else if (thruster_element->FindElement("direct")) {
     Element *document = thruster_element->FindElement("direct");
-    Thruster = new FGThruster( FDMExec, document, EngineNumber);
+    Thruster = new FGThruster(exec, document, EngineNumber);
   } else {
     cerr << thruster_element->ReadFrom() << " Unknown thruster type" << endl;
     throw("Failed to load the thruster");
   }
 
-  Thruster->SetdeltaT(in.TotalDeltaT);
-
   Debug(2);
 }
 
@@ -204,9 +201,7 @@ bool FGEngine::Load(FGFDMExec *exec, Element *engine_element)
   Element* local_element;
   FGColumnVector3 location, orientation;
 
-  FDMExec = exec;
-
-  PropertyManager = FDMExec->GetPropertyManager();
+  FGPropertyManager* PropertyManager = exec->GetPropertyManager();
 
   Name = engine_element->GetAttributeValue("name");
 
@@ -230,8 +225,8 @@ bool FGEngine::Load(FGFDMExec *exec, Element *engine_element)
   local_element = parent_element->FindElement("thruster");
   if (local_element) {
     try {
-      LoadThruster(local_element);
-    } catch (std::string str) {
+      LoadThruster(exec, local_element);
+    } catch (std::string& str) {
       throw("Error loading engine " + Name + ". " + str);
     }
   } else {
index 472798a254428a3aaf694a80068d212aa949c896..511f322b3653506e4b237dc5cb3934e73ae1b0c0 100644 (file)
@@ -53,7 +53,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ENGINE "$Id: FGEngine.h,v 1.44 2015/03/28 14:49:02 bcoconni Exp $"
+#define ID_ENGINE "$Id: FGEngine.h,v 1.47 2015/09/27 10:16:57 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -111,7 +111,7 @@ CLASS DOCUMENTATION
   documentation for engine and thruster classes.
 </pre>     
     @author Jon S. Berndt
-    @version $Id: FGEngine.h,v 1.44 2015/03/28 14:49:02 bcoconni Exp $
+    @version $Id: FGEngine.h,v 1.47 2015/09/27 10:16:57 bcoconni Exp $
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -122,7 +122,6 @@ class FGEngine : public FGModelFunctions
 {
 public:
   struct Inputs {
-    double SLPressure;
     double Pressure;
     double PressureRatio;
     double Temperature;
@@ -130,7 +129,6 @@ public:
     double DensityRatio;
     double Soundspeed;
     double TotalPressure;
-    double TotalTempearture;
     double TAT_c;
     double Vt;
     double Vc;
@@ -150,7 +148,7 @@ public:
     double TotalDeltaT;
   };
 
-  FGEngine(FGFDMExec* exec, int engine_number, struct Inputs& input);
+  FGEngine(int engine_number, struct Inputs& input);
   virtual ~FGEngine();
 
   enum EngineType {etUnknown, etRocket, etPiston, etTurbine, etTurboprop, etElectric};
@@ -208,7 +206,7 @@ public:
   virtual const FGColumnVector3& GetBodyForces(void);
   virtual const FGColumnVector3& GetMoments(void);
 
-  void LoadThruster(Element *el);
+  void LoadThruster(FGFDMExec* exec, Element *el);
   FGThruster* GetThruster(void) const {return Thruster;}
 
   unsigned int GetSourceTank(unsigned int i) const;
@@ -221,14 +219,7 @@ public:
   void LoadThrusterInputs();
 
 protected:
-  /** Reduces the fuel in the active tanks by the amount required.
-      This function should be called from within the
-      derived class' Calculate() function before any other calculations are
-      done. This base class method removes fuel from the fuel tanks as
-      appropriate, and sets the starved flag if necessary. * /
-  virtual void ConsumeFuel(void); */
-
-  FGPropertyManager* PropertyManager;
+
   std::string Name;
   const int   EngineNumber;
   EngineType Type;
@@ -253,8 +244,7 @@ protected:
   double FuelUsedLbs;
   double FuelDensity;
 
-  FGFDMExec*      FDMExec;
-  FGThruster*     Thruster;
+  FGThruster* Thruster;
 
   std::vector <int> SourceTanks;
 
index f6de734195882c6624d671d2fc2b33c6002b9bee..5880881e78c8a1e68a0a4989ff83ae253b4491c4 100644 (file)
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPiston.cpp,v 1.79 2015/02/27 20:36:47 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGPiston.cpp,v 1.81 2015/09/27 09:54:21 bcoconni Exp $");
 IDENT(IdHdr,ID_PISTON);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -59,7 +59,7 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Inputs& input)
-  : FGEngine(exec, engine_number, input),
+  : FGEngine(engine_number, input),
   R_air(287.3),                  // Gas constant for air J/Kg/K
   calorific_value_fuel(47.3e6),  // J/Kg
   Cp_air(1005),                  // Specific heat (constant pressure) J/Kg/K
@@ -69,8 +69,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Input
   Load(exec, el);
 
   Element *table_element;
-  string token;
-  string name="";
+  FGPropertyManager* PropertyManager = exec->GetPropertyManager();
 
   // Defaults and initializations
 
@@ -236,7 +235,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Input
   }
 
   while((table_element = el->FindNextElement("table")) != 0) {
-    name = table_element->GetAttributeValue("name");
+    string name = table_element->GetAttributeValue("name");
     try {
       if (name == "COMBUSTION") {
         Lookup_Combustion_Efficiency = new FGTable(PropertyManager, table_element);
@@ -245,7 +244,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Input
       } else {
         cerr << "Unknown table type: " << name << " in piston engine definition." << endl;
       }
-    } catch (std::string str) {
+    } catch (std::string& str) {
       // Make sure allocated resources are freed before rethrowing.
       // (C++ standard guarantees that a null pointer deletion is no-op).
       delete Lookup_Combustion_Efficiency;
index 6b36d5dec0bfcbb67c5b0dffc7754ddca3b60b35..510d67f0fcd377fb91932de30ce99dc921d2dbd0 100644 (file)
@@ -45,7 +45,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGPropeller.cpp,v 1.51 2015/04/20 12:12:49 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGPropeller.cpp,v 1.54 2015/09/27 09:29:41 bcoconni Exp $");
 IDENT(IdHdr,ID_PROPELLER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -60,7 +60,6 @@ CLASS IMPLEMENTATION
 FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
                        : FGThruster(exec, prop_element, num)
 {
-  string token;
   Element *table_element, *local_element;
   string name="";
   FGPropertyManager* PropertyManager = exec->GetPropertyManager();
@@ -78,7 +77,7 @@ FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
   Vinduced = 0.0;
 
   if (prop_element->FindElement("ixx"))
-    Ixx = prop_element->FindElementValueAsNumberConvertTo("ixx", "SLUG*FT2");
+    Ixx = max(prop_element->FindElementValueAsNumberConvertTo("ixx", "SLUG*FT2"), 0.001);
 
   Sense_multiplier = 1.0;
   if (prop_element->HasAttribute("version"))
@@ -86,11 +85,11 @@ FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
       Sense_multiplier = -1.0;
 
   if (prop_element->FindElement("diameter"))
-    Diameter = prop_element->FindElementValueAsNumberConvertTo("diameter", "FT");
+    Diameter = max(prop_element->FindElementValueAsNumberConvertTo("diameter", "FT"), 0.001);
   if (prop_element->FindElement("numblades"))
     numBlades = (int)prop_element->FindElementValueAsNumber("numblades");
   if (prop_element->FindElement("gearratio"))
-    GearRatio = prop_element->FindElementValueAsNumber("gearratio");
+    GearRatio = max(prop_element->FindElementValueAsNumber("gearratio"), 0.001);
   if (prop_element->FindElement("minpitch"))
     MinPitch = prop_element->FindElementValueAsNumber("minpitch");
   if (prop_element->FindElement("maxpitch"))
@@ -119,7 +118,7 @@ FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
       } else {
         cerr << "Unknown table type: " << name << " in propeller definition." << endl;
       }
-    } catch (std::string str) {
+    } catch (std::string& str) {
       throw("Error loading propeller table:" + name + ". " + str);
     }
   }
@@ -203,7 +202,7 @@ double FGPropeller::Calculate(double EnginePower)
   FGColumnVector3 localAeroVel = Transform().Transposed() * in.AeroUVW;
   double omega, PowerAvailable;
 
-  double Vel = localAeroVel(eU);
+  double Vel = localAeroVel(eU) + Vinduced;
   double rho = in.Density;
   double RPS = RPM/60.0;
 
@@ -286,7 +285,7 @@ double FGPropeller::Calculate(double EnginePower)
   if (omega > 0.0) ExcessTorque = PowerAvailable / omega;
   else             ExcessTorque = PowerAvailable / 1.0;
 
-  RPM = (RPS + ((ExcessTorque / Ixx) / (2.0 * M_PI)) * deltaT) * 60.0;
+  RPM = (RPS + ((ExcessTorque / Ixx) / (2.0 * M_PI)) * in.TotalDeltaT) * 60.0;
 
   if (RPM < 0.0) RPM = 0.0; // Engine won't turn backwards
 
@@ -303,7 +302,7 @@ double FGPropeller::GetPowerRequired(void)
 {
   double cPReq, J;
   double rho = in.Density;
-  double Vel = in.AeroUVW(eU);
+  double Vel = in.AeroUVW(eU) + Vinduced;
   double RPS = RPM / 60.0;
 
   if (RPS != 0.0) J = Vel / (Diameter * RPS);
@@ -327,7 +326,7 @@ double FGPropeller::GetPowerRequired(void)
           double dRPM = rpmReq - RPM;
           // The pitch of a variable propeller cannot be changed when the RPMs are
           // too low - the oil pump does not work.
-          if (RPM > 200) Pitch -= dRPM * deltaT;
+          if (RPM > 200) Pitch -= dRPM * in.TotalDeltaT;
           if (Pitch < MinPitch)       Pitch = MinPitch;
           else if (Pitch > MaxPitch)  Pitch = MaxPitch;
 
index 220d1bbd4c37e46a0bda3286881e1e1a14565f9a..69f72d776362e599da5d04c4b2809dcf7e05ac27 100644 (file)
@@ -49,7 +49,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGRocket.cpp,v 1.37 2014/06/08 12:00:35 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGRocket.cpp,v 1.39 2015/09/27 09:54:21 bcoconni Exp $");
 IDENT(IdHdr,ID_ROCKET);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -57,7 +57,7 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number, struct Inputs& input)
-  : FGEngine(exec, engine_number, input), isp_function(0L)
+  : FGEngine(engine_number, input), isp_function(0L), FDMExec(exec)
 {
   Load(exec, el);
 
@@ -84,19 +84,17 @@ FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number, struct Input
    MinThrottle = 0.0;
    MaxThrottle = 1.0;
 
-  string base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNumber);
-
   std::stringstream strEngineNumber;
   strEngineNumber << EngineNumber;
 
-  Element* isp_el = el->FindElement("isp");
-  Element* isp_func_el=0;
+  FGPropertyManager* PropertyManager = exec->GetPropertyManager();
+  bindmodel(PropertyManager); // Bind model properties first, since they might be needed in functions.
 
-  bindmodel(); // Bind model properties first, since they might be needed in functions.
+  Element* isp_el = el->FindElement("isp");
 
   // Specific impulse may be specified as a constant value or as a function - perhaps as a function of mixture ratio.
   if (isp_el) {
-    isp_func_el = isp_el->FindElement("function");
+    Element* isp_func_el = isp_el->FindElement("function");
     if (isp_func_el) {
       isp_function = new FGFunction(exec->GetPropertyManager(),isp_func_el, strEngineNumber.str());
     } else {
@@ -286,7 +284,7 @@ string FGRocket::GetEngineValues(const string& delimiter)
 // This function should tie properties to rocket engine specific properties
 // that are not bound in the base class (FGEngine) code.
 //
-void FGRocket::bindmodel()
+void FGRocket::bindmodel(FGPropertyManager* PropertyManager)
 {
   string property_name, base_property_name;
   base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNumber);
index b93f1519346bc0a9e83617eb68a58cee3969f410..d258c660aada4ca9873fa1b010905dfaaea18639 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ROCKET "$Id: FGRocket.h,v 1.20 2013/11/24 11:40:57 bcoconni Exp $"
+#define ID_ROCKET "$Id: FGRocket.h,v 1.22 2015/09/27 09:54:21 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -118,7 +118,7 @@ for the rocket engine to be throttle up to 1. At that time, the solid rocket
 fuel begins burning and thrust is provided.
 
     @author Jon S. Berndt
-    $Id: FGRocket.h,v 1.20 2013/11/24 11:40:57 bcoconni Exp $
+    $Id: FGRocket.h,v 1.22 2015/09/27 09:54:21 bcoconni Exp $
     @see FGNozzle,
     FGThruster,
     FGForce,
@@ -214,7 +214,7 @@ private:
       @return The vacuum thrust in lbs. */
   double GetVacThrust(void) const {return VacThrust;}
 
-  void bindmodel(void);
+  void bindmodel(FGPropertyManager* pm);
 
   double Isp; // Vacuum Isp
   double It;    // Total actual Isp
@@ -236,6 +236,7 @@ private:
   double BuildupTime;
   FGTable* ThrustTable;
   FGFunction* isp_function;
+  FGFDMExec* FDMExec;
 
   void Debug(int from);
 };
index 2c6141330b647864d3d41efd40c908b21abf9c3b..29eae17707dfcb6f25e181c04a0b7ec3c2be0123 100644 (file)
@@ -43,6 +43,7 @@ HISTORY
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
+#include <string>
 #include <sstream>
 
 #include "FGRotor.h"
@@ -53,11 +54,12 @@ INCLUDES
 using std::cerr;
 using std::cout;
 using std::endl;
+using std::string;
 using std::ostringstream;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGRotor.cpp,v 1.23 2014/01/13 10:46:10 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGRotor.cpp,v 1.24 2015/09/27 10:03:53 bcoconni Exp $");
 IDENT(IdHdr,ID_ROTOR);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -101,7 +103,6 @@ FGRotor::FGRotor(FGFDMExec *exec, Element* rotor_element, int num)
 
   // initialise/set remaining variables
   SetTransformType(FGForce::tCustom);
-  PropertyManager = exec->GetPropertyManager();
   Type = ttRotor;
   GearRatio = 1.0;
 
@@ -211,7 +212,7 @@ FGRotor::FGRotor(FGFDMExec *exec, Element* rotor_element, int num)
   damp_hagl = Filter(1.0, dt);
 
   // enable import-export
-  BindModel();
+  bindmodel(exec->GetPropertyManager());
 
   Debug(0);
 
@@ -693,7 +694,7 @@ double FGRotor::Calculate(double EnginePower)
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 
-bool FGRotor::BindModel(void)
+bool FGRotor::bindmodel(FGPropertyManager* PropertyManager)
 {
   string property_name, base_property_name;
   base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNum);
index 50c9072ff83d48ba9831325c10070f3f955763d8..fc2cf107de1a78b434f610d4212da6c69bb247ee 100644 (file)
@@ -48,7 +48,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ROTOR "$Id: FGRotor.h,v 1.15 2013/01/26 17:06:50 bcoconni Exp $"
+#define ID_ROTOR "$Id: FGRotor.h,v 1.17 2015/09/27 10:03:53 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -230,7 +230,7 @@ CLASS DOCUMENTATION
     </dl>
 
     @author Thomas Kreitler
-    @version $Id: FGRotor.h,v 1.15 2013/01/26 17:06:50 bcoconni Exp $
+    @version $Id: FGRotor.h,v 1.17 2015/09/27 10:03:53 bcoconni Exp $
   */
 
 
@@ -350,7 +350,7 @@ private:
   FGColumnVector3 body_moments(double a_ic = 0.0 , double b_ic = 0.0 );
 
   // interface
-  bool BindModel(void);
+  bool bindmodel(FGPropertyManager* pm);
   void Debug(int from);
 
   // environment
index 516f1b4e082920ec447b751aac85644c55b92216..b01cd6eecfc5416bc319727565eaa9bd0477b85c 100644 (file)
@@ -45,7 +45,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGThruster.cpp,v 1.21 2014/01/13 10:46:10 ehofman Exp $");
+IDENT(IdSrc,"$Id: FGThruster.cpp,v 1.22 2015/09/27 10:03:53 bcoconni Exp $");
 IDENT(IdHdr,ID_THRUSTER);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -66,7 +66,7 @@ FGThruster::FGThruster(FGFDMExec *FDMExec, Element *el, int num ): FGForce(FDMEx
 
   GearRatio = 1.0;
   EngineNum = num;
-  PropertyManager = FDMExec->GetPropertyManager();
+  FGPropertyManager* PropertyManager = FDMExec->GetPropertyManager();
 
 // Determine the initial location and orientation of this thruster and load the
 // thruster with this information.
index 0ac1dafe6652e7b112f3a32772a3ea7d572d6fef..27a157fd5014b049b1da17640d6eb9999ee05f3d 100644 (file)
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_THRUSTER "$Id: FGThruster.h,v 1.22 2013/12/22 17:14:37 bcoconni Exp $"
+#define ID_THRUSTER "$Id: FGThruster.h,v 1.26 2015/09/27 10:03:53 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -74,7 +74,7 @@ CLASS DOCUMENTATION
     1.57 (pi/2) results in no thrust at all.
  
     @author Jon Berndt
-    @version $Id: FGThruster.h,v 1.22 2013/12/22 17:14:37 bcoconni Exp $
+    @version $Id: FGThruster.h,v 1.26 2015/09/27 10:03:53 bcoconni Exp $
     */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -100,7 +100,6 @@ public:
   virtual void SetRPM(double rpm) {};
   virtual void SetEngineRPM(double rpm) {};
   virtual double GetPowerRequired(void) {return 0.0;}
-  virtual void SetdeltaT(double dt) {deltaT = dt;}
   double GetThrust(void) const {return Thrust;}
   eType GetType(void) {return Type;}
   std::string GetName(void) {return Name;}
@@ -133,12 +132,10 @@ protected:
   std::string Name;
   double Thrust;
   double PowerRequired;
-  double deltaT;
   double GearRatio;
   double ThrustCoeff;
   double ReverserAngle;
   int EngineNum;
-  FGPropertyManager* PropertyManager;
   virtual void Debug(int from);
 };
 }
index 2fce543aaf5ab9f86c23b58954d4d0826d5556e2..0b3171b07a9fa0cf75eb1b19df8162ed0dd7b272 100644 (file)
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGTurbine.cpp,v 1.44 2014/12/12 01:21:17 dpculp Exp $");
+IDENT(IdSrc,"$Id: FGTurbine.cpp,v 1.47 2015/09/27 10:07:53 bcoconni Exp $");
 IDENT(IdHdr,ID_TURBINE);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -60,7 +60,7 @@ CLASS IMPLEMENTATION
 
 
 FGTurbine::FGTurbine(FGFDMExec* exec, Element *el, int engine_number, struct Inputs& input)
-  : FGEngine(exec, engine_number, input)
+  : FGEngine(engine_number, input), FDMExec(exec)
 {
   Type = etTurbine;
 
@@ -104,9 +104,8 @@ void FGTurbine::ResetToIC(void)
   Stalled = Seized = Overtemp = Fire = Augmentation = Injection = Reversed = false;
   Cutoff = true;
   phase = tpOff;
-  TAT = (in.TotalTempearture - 491.69) * 0.5555556;
-  EGT_degC = TAT;
-  OilTemp_degK = TAT + 273.0;
+  EGT_degC = in.TAT_c;
+  OilTemp_degK = in.TAT_c + 273.0;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -121,7 +120,6 @@ void FGTurbine::Calculate(void)
 
   ThrottlePos = in.ThrottlePos[EngineNumber];
 
-  TAT = (in.TotalTempearture - 491.69) * 0.5555556;
   if (ThrottlePos > 1.0) {
     AugmentCmd = ThrottlePos - 1.0;
     ThrottlePos -= AugmentCmd;
@@ -142,7 +140,7 @@ void FGTurbine::Calculate(void)
     } else {
       phase = tpOff;
       Cutoff = true;
-      EGT_degC = TAT;
+      EGT_degC = in.TAT_c;
     }
   }
 
@@ -185,8 +183,8 @@ double FGTurbine::Off(void)
   FuelFlow_pph = Seek(&FuelFlow_pph, 0, 1000.0, 10000.0);
   N1 = Seek(&N1, in.qbar/10.0, N1/2.0, N1/2.0);
   N2 = Seek(&N2, in.qbar/15.0, N2/2.0, N2/2.0);
-  EGT_degC = Seek(&EGT_degC, TAT, 11.7, 7.3);
-  OilTemp_degK = Seek(&OilTemp_degK, TAT + 273.0, 0.2, 0.2);
+  EGT_degC = Seek(&EGT_degC, in.TAT_c, 11.7, 7.3);
+  OilTemp_degK = Seek(&OilTemp_degK, in.TAT_c + 273.0, 0.2, 0.2);
   OilPressure_psi = N2 * 0.62;
   NozzlePosition = Seek(&NozzlePosition, 1.0, 0.8, 0.8);
   EPR = Seek(&EPR, 1.0, 0.2, 0.2);
@@ -223,7 +221,7 @@ double FGTurbine::Run()
   N1 = Seek(&N1, IdleN1 + ThrottlePos * N1_factor, spoolup, spoolup * 2.4);
   N2norm = (N2 - IdleN2) / N2_factor;
   thrust = idlethrust + (milthrust * N2norm * N2norm);
-  EGT_degC = TAT + 363.1 + ThrottlePos * 357.1;
+  EGT_degC = in.TAT_c + 363.1 + ThrottlePos * 357.1;
   OilPressure_psi = N2 * 0.62;
   OilTemp_degK = Seek(&OilTemp_degK, 366.0, 1.2, 0.1);
 
@@ -284,9 +282,9 @@ double FGTurbine::SpinUp(void)
   FuelFlow_pph = 0.0;
   N2 = Seek(&N2, 25.18, N2_spinup, N2/2.0);
   N1 = Seek(&N1, 5.21, N1_spinup, N1/2.0);
-  EGT_degC = Seek(&EGT_degC, TAT, 11.7, 7.3);
+  EGT_degC = Seek(&EGT_degC, in.TAT_c, 11.7, 7.3);
   OilPressure_psi = N2 * 0.62;
-  OilTemp_degK = Seek(&OilTemp_degK, TAT + 273.0, 0.2, 0.2);
+  OilTemp_degK = Seek(&OilTemp_degK, in.TAT_c + 273.0, 0.2, 0.2);
   EPR = 1.0;
   NozzlePosition = 1.0;
   if (Starter == false) phase = tpOff;
@@ -302,7 +300,7 @@ double FGTurbine::Start(void)
     if (N2 < IdleN2) {
       N2 = Seek(&N2, IdleN2, 2.0, N2/2.0);
       N1 = Seek(&N1, IdleN1, 1.4, N1/2.0);
-      EGT_degC = Seek(&EGT_degC, TAT + 363.1, 21.3, 7.3);
+      EGT_degC = Seek(&EGT_degC, in.TAT_c + 363.1, 21.3, 7.3);
       FuelFlow_pph = IdleFF * N2 / IdleN2;
       OilPressure_psi = N2 * 0.62;
       if ((Starter == false) && (in.qbar < 30.0)) phase = tpOff; // aborted start
@@ -326,7 +324,7 @@ double FGTurbine::Start(void)
 
 double FGTurbine::Stall(void)
 {
-  EGT_degC = TAT + 903.14;
+  EGT_degC = in.TAT_c + 903.14;
   FuelFlow_pph = IdleFF;
   N1 = Seek(&N1, in.qbar/10.0, 0, N1/10.0);
   N2 = Seek(&N2, in.qbar/15.0, 0, N2/10.0);
@@ -345,7 +343,7 @@ double FGTurbine::Seize(void)
     N1 = Seek(&N1, in.qbar/20.0, 0, N1/15.0);
     FuelFlow_pph = Cutoff ? 0.0 : IdleFF;
     OilPressure_psi = 0.0;
-    OilTemp_degK = Seek(&OilTemp_degK, TAT + 273.0, 0, 0.2);
+    OilTemp_degK = Seek(&OilTemp_degK, in.TAT_c + 273.0, 0, 0.2);
     Running = false;
     return 0.0;
 }
@@ -354,12 +352,11 @@ double FGTurbine::Seize(void)
 
 double FGTurbine::Trim()
 {
-    double idlethrust, milthrust, thrust, tdiff, N2, N2norm;
-    idlethrust = MilThrust * IdleThrustLookup->GetValue();
-    milthrust = (MilThrust - idlethrust) * MilThrustLookup->GetValue();
-    N2 = IdleN2 + ThrottlePos * N2_factor;
-    N2norm = (N2 - IdleN2) / N2_factor;
-    thrust = (idlethrust + (milthrust * N2norm * N2norm))
+    double idlethrust = MilThrust * IdleThrustLookup->GetValue();
+    double milthrust = (MilThrust - idlethrust) * MilThrustLookup->GetValue();
+    double N2 = IdleN2 + ThrottlePos * N2_factor;
+    double N2norm = (N2 - IdleN2) / N2_factor;
+    double thrust = (idlethrust + (milthrust * N2norm * N2norm))
           * (1.0 - BleedDemand);
 
     if (AugMethod == 1) {
@@ -373,7 +370,7 @@ double FGTurbine::Trim()
 
     if (AugMethod == 2) {
       if (AugmentCmd > 0.0) {
-        tdiff = (MaxThrust * MaxThrustLookup->GetValue()) - thrust;
+        double tdiff = (MaxThrust * MaxThrustLookup->GetValue()) - thrust;
         thrust += (tdiff * AugmentCmd);
       }
     }
@@ -487,10 +484,10 @@ bool FGTurbine::Load(FGFDMExec* exec, Element *el)
   delay = 90.0 / (BypassRatio + 3.0);
   N1_factor = MaxN1 - IdleN1;
   N2_factor = MaxN2 - IdleN2;
-  OilTemp_degK = (in.TotalTempearture - 491.69) * 0.5555556 + 273.0;
+  OilTemp_degK = in.TAT_c + 273.0;
   IdleFF = pow(MilThrust, 0.2) * 107.0;  // just an estimate
 
-  bindmodel();
+  bindmodel(exec->GetPropertyManager());
   return true;
 }
 
@@ -522,7 +519,7 @@ string FGTurbine::GetEngineValues(const string& delimiter)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGTurbine::bindmodel()
+void FGTurbine::bindmodel(FGPropertyManager* PropertyManager)
 {
   string property_name, base_property_name;
   base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNumber);
index d7f03434e88e8810f31ba1e255e1c41bfad5da67..1aab10deeff56b9c98cf0af82e4be4d699fe437b 100644 (file)
@@ -42,7 +42,7 @@ INCLUDES
 
 #include "FGEngine.h"
 
-#define ID_TURBINE "$Id: FGTurbine.h,v 1.23 2014/12/12 01:21:17 dpculp Exp $"
+#define ID_TURBINE "$Id: FGTurbine.h,v 1.26 2015/09/27 10:07:53 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -152,7 +152,7 @@ CLASS DOCUMENTATION
     /engine/direct.xml
 </pre>
     @author David P. Culp
-    @version "$Id: FGTurbine.h,v 1.23 2014/12/12 01:21:17 dpculp Exp $"
+    @version "$Id: FGTurbine.h,v 1.26 2015/09/27 10:07:53 bcoconni Exp $"
 */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -252,7 +252,6 @@ private:
   double N2_factor;        ///< factor to tie N2 and throttle
   double ThrottlePos;      ///< FCS-supplied throttle position - modified for local use!
   double AugmentCmd;       ///< modulated afterburner command (0.0 to 1.0)
-  double TAT;              ///< total air temperature (deg C)
   double N1_spinup;        ///< N1 spin up rate from starter (per second)
   double N2_spinup;        ///< N2 spin up rate from starter (per second)
   bool Stalled;            ///< true if engine is compressor-stalled
@@ -295,9 +294,10 @@ private:
   FGFunction *MilThrustLookup;
   FGFunction *MaxThrustLookup;
   FGFunction *InjectionLookup;
+  FGFDMExec* FDMExec;
 
   bool Load(FGFDMExec *exec, Element *el);
-  void bindmodel(void);
+  void bindmodel(FGPropertyManager* pm);
   void Debug(int from);
 
 };
old mode 100644 (file)
new mode 100755 (executable)
index 8216a5c..10e0a94
@@ -54,7 +54,7 @@ using namespace std;
 
 namespace JSBSim {
 
-IDENT(IdSrc,"$Id: FGTurboProp.cpp,v 1.30 2014/06/08 12:00:35 bcoconni Exp $");
+IDENT(IdSrc,"$Id: FGTurboProp.cpp,v 1.32 2015/09/27 09:54:21 bcoconni Exp $");
 IDENT(IdHdr,ID_TURBOPROP);
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -62,15 +62,16 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGTurboProp::FGTurboProp(FGFDMExec* exec, Element *el, int engine_number, struct Inputs& input)
-  : FGEngine(exec, engine_number, input),
-    ITT_N1(NULL), EnginePowerRPM_N1(NULL), EnginePowerVC(NULL), CombustionEfficiency_N1(NULL)
+  : FGEngine(engine_number, input),
+    ITT_N1(NULL), EnginePowerRPM_N1(NULL), EnginePowerVC(NULL), CombustionEfficiency_N1(NULL),
+    FDMExec(exec)
 {
   FGEngine::Load(exec, el);
   SetDefaults();
   thrusterType = Thruster->GetType();
 
   Load(exec, el);
-  bindmodel();
+  bindmodel(exec->GetPropertyManager());
   Debug(0);
 }
 
@@ -541,7 +542,7 @@ int FGTurboProp::InitRunning(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGTurboProp::bindmodel()
+void FGTurboProp::bindmodel(FGPropertyManager* PropertyManager)
 {
   string property_name, base_property_name;
   base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNumber);
old mode 100644 (file)
new mode 100755 (executable)
index b41a35f..97b69c1
@@ -46,7 +46,7 @@ INCLUDES
 #include "FGEngine.h"
 #include "math/FGTable.h"
 
-#define ID_TURBOPROP "$Id: FGTurboProp.h,v 1.19 2015/02/27 20:36:48 bcoconni Exp $"
+#define ID_TURBOPROP "$Id: FGTurboProp.h,v 1.21 2015/09/27 09:54:21 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -215,13 +215,14 @@ private:
 
   void SetDefaults(void);
   bool Load(FGFDMExec *exec, Element *el);
-  void bindmodel(void);
+  void bindmodel(FGPropertyManager* pm);
   void Debug(int from);
 
   FGTable* ITT_N1;             // ITT temperature depending on throttle command
   FGTable* EnginePowerRPM_N1;
   FGTable* EnginePowerVC;
   FGTable* CombustionEfficiency_N1;
+  FGFDMExec* FDMExec;
 };
 }
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%