From e1d5a52a3a535007d4249aeba84fc645158997a7 Mon Sep 17 00:00:00 2001
From: Erik Hofman <erik@ehofman.com>
Date: Sun, 18 Sep 2011 11:06:54 +0200
Subject: [PATCH] resync JSBSim

---
 src/FDM/JSBSim/FGFDMExec.cpp                  |  6 ++--
 src/FDM/JSBSim/JSBSim.cxx                     | 30 +++++++++----------
 src/FDM/JSBSim/JSBSim.hxx                     |  1 -
 src/FDM/JSBSim/models/FGAtmosphere.cpp        |  5 +++-
 src/FDM/JSBSim/models/FGLGear.cpp             |  6 ++--
 src/FDM/JSBSim/models/FGOutput.cpp            |  5 +---
 src/FDM/JSBSim/models/FGPropagate.cpp         | 10 +++----
 src/FDM/JSBSim/models/FGPropulsion.cpp        |  3 +-
 .../atmosphere/FGStandardAtmosphere.cpp       |  6 ++--
 src/FDM/JSBSim/models/atmosphere/FGWinds.cpp  |  8 +++--
 .../models/flight_control/FGFCSComponent.cpp  |  4 +--
 src/FDM/JSBSim/models/propulsion/FGEngine.cpp |  4 +--
 src/FDM/JSBSim/models/propulsion/FGPiston.cpp |  4 +--
 .../JSBSim/models/propulsion/FGPropeller.cpp  |  4 +--
 src/FDM/JSBSim/models/propulsion/FGRotor.cpp  | 23 +++++++++-----
 src/FDM/JSBSim/models/propulsion/FGRotor.h    | 12 ++++++--
 16 files changed, 73 insertions(+), 58 deletions(-)

diff --git a/src/FDM/JSBSim/FGFDMExec.cpp b/src/FDM/JSBSim/FGFDMExec.cpp
index 624f10354..8d29a688f 100644
--- a/src/FDM/JSBSim/FGFDMExec.cpp
+++ b/src/FDM/JSBSim/FGFDMExec.cpp
@@ -70,7 +70,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGFDMExec.cpp,v 1.113 2011/09/07 02:37:04 jberndt Exp $";
+static const char *IdSrc = "$Id: FGFDMExec.cpp,v 1.114 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_FDMEXEC;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -441,7 +441,7 @@ void FGFDMExec::LoadInputs(unsigned int idx)
     GroundReactions->in.TotalDeltaT     = dT * GroundReactions->GetRate();
     GroundReactions->in.WOW             = GroundReactions->GetWOW();
     GroundReactions->in.Location        = Propagate->GetLocation();
-    for (unsigned int i=0; i<GroundReactions->GetNumGearUnits(); i++) {
+    for (int i=0; i<GroundReactions->GetNumGearUnits(); i++) {
       GroundReactions->in.vWhlBodyVec[i] = MassBalance->StructuralToBody(GroundReactions->GetGearUnit(i)->GetLocation());
     }
     break;
@@ -530,7 +530,7 @@ void FGFDMExec::LoadModelConstants(void)
   Aerodynamics->in.Wingspan      = Aircraft->GetWingSpan();
   Auxiliary->in.Wingspan         = Aircraft->GetWingSpan();
   Auxiliary->in.Wingchord        = Aircraft->Getcbar();
-  for (unsigned int i=0; i<GroundReactions->GetNumGearUnits(); i++) {
+  for (int i=0; i<GroundReactions->GetNumGearUnits(); i++) {
     GroundReactions->in.vWhlBodyVec[i] = MassBalance->StructuralToBody(GroundReactions->GetGearUnit(i)->GetLocation());
   }
 
diff --git a/src/FDM/JSBSim/JSBSim.cxx b/src/FDM/JSBSim/JSBSim.cxx
index eed3c6873..77b006f09 100644
--- a/src/FDM/JSBSim/JSBSim.cxx
+++ b/src/FDM/JSBSim/JSBSim.cxx
@@ -311,7 +311,6 @@ FGJSBsim::FGJSBsim( double dt )
     temperature = fgGetNode("/environment/temperature-degc",true);
     pressure = fgGetNode("/environment/pressure-inhg",true);
     pressureSL = fgGetNode("/environment/pressure-sea-level-inhg",true);
-    density = fgGetNode("/environment/density-slugft3",true);
     ground_wind = fgGetNode("/environment/config/boundary/entry[0]/wind-speed-kt",true);
     turbulence_gain = fgGetNode("/environment/turbulence/magnitude-norm",true);
     turbulence_rate = fgGetNode("/environment/turbulence/rate-hz",true);
@@ -368,7 +367,6 @@ void FGJSBsim::init()
       Winds->SetProbabilityOfExceedence(0.0);
     }
 
-    fgic->SetSeaLevelRadiusFtIC( get_Sea_level_radius() );
     fgic->SetWindNEDFpsIC( -wind_from_north->getDoubleValue(),
                            -wind_from_east->getDoubleValue(),
                            -wind_from_down->getDoubleValue() );
@@ -376,9 +374,9 @@ void FGJSBsim::init()
     //Atmosphere->SetExTemperature(get_Static_temperature());
     //Atmosphere->SetExPressure(get_Static_pressure());
     //Atmosphere->SetExDensity(get_Density());
-    SG_LOG(SG_FLIGHT,SG_INFO,"T,p,rho: " << fdmex->GetAtmosphere()->GetTemperature()
-     << ", " << fdmex->GetAtmosphere()->GetPressure()
-     << ", " << fdmex->GetAtmosphere()->GetDensity() );
+    SG_LOG(SG_FLIGHT,SG_INFO,"T,p,rho: " << Atmosphere->GetTemperature()
+     << ", " << Atmosphere->GetPressure()
+     << ", " << Atmosphere->GetDensity() );
 
 // deprecate egt_degf for egt-degf to have consistent naming
 // TODO: remove this for 2.6.0
@@ -394,7 +392,9 @@ void FGJSBsim::init()
 
     FCS->SetDfPos( ofNorm, globals->get_controls()->get_flaps() );
 
+    needTrim = startup_trim->getBoolValue();
     common_init();
+    fgic->SetSeaLevelRadiusFtIC( get_Sea_level_radius() );
 
     copy_to_JSBsim();
     fdmex->RunIC();     //loop JSBSim once w/o integrating
@@ -407,7 +407,7 @@ void FGJSBsim::init()
       }
     }
 
-    if ( startup_trim->getBoolValue() ) {
+    if ( needTrim ) {
       FGLocation cart(fgic->GetLongitudeRadIC(), fgic->GetLatitudeRadIC(),
                       get_Sea_level_radius() + fgic->GetAltitudeASLFtIC());
       double cart_pos[3], contact[3], d[3], vel[3], agl;
@@ -785,8 +785,8 @@ bool FGJSBsim::copy_from_JSBsim()
 
     // Positions of Visual Reference Point
     FGLocation l = Auxiliary->GetLocationVRP();
-    _updateGeocentricPosition( l.GetLatitude(), l.GetLongitude(),
-                               l.GetRadius() - get_Sea_level_radius() );
+    _updatePosition(SGGeoc::fromRadFt( l.GetLongitude(), l.GetLatitude(),
+                                       l.GetRadius() ));
 
     _set_Altitude_AGL( Propagate->GetDistanceAGL() );
     {
@@ -1006,26 +1006,26 @@ bool FGJSBsim::ToggleDataLogging(bool state)
 void FGJSBsim::set_Latitude(double lat)
 {
   static SGConstPropertyNode_ptr altitude = fgGetNode("/position/altitude-ft");
-  double alt;
+  double alt = altitude->getDoubleValue();
   double sea_level_radius_meters, lat_geoc;
 
-  if ( altitude->getDoubleValue() > -9990 )
-    alt = altitude->getDoubleValue();
-  else
-    alt = 0.0;
+  if ( alt < -9990 ) alt = 0.0;
 
   SG_LOG(SG_FLIGHT,SG_INFO,"FGJSBsim::set_Latitude: " << lat );
   SG_LOG(SG_FLIGHT,SG_INFO," cur alt (ft) =  " << alt );
 
   sgGeodToGeoc( lat, alt * SG_FEET_TO_METER,
                     &sea_level_radius_meters, &lat_geoc );
-  _set_Sea_level_radius( sea_level_radius_meters * SG_METER_TO_FEET  );
+
+  double sea_level_radius_ft = sea_level_radius_meters * SG_METER_TO_FEET;
+  _set_Sea_level_radius( sea_level_radius_ft );
 
   if (needTrim) {
-    fgic->SetSeaLevelRadiusFtIC( sea_level_radius_meters * SG_METER_TO_FEET  );
+    fgic->SetSeaLevelRadiusFtIC( sea_level_radius_ft );
     fgic->SetLatitudeRadIC( lat_geoc );
   }
   else {
+    Propagate->SetSeaLevelRadius( sea_level_radius_ft );
     Propagate->SetLatitude(lat_geoc);
     FGInterface::set_Latitude(lat);
   }
diff --git a/src/FDM/JSBSim/JSBSim.hxx b/src/FDM/JSBSim/JSBSim.hxx
index a0294d5b5..1e6e09355 100644
--- a/src/FDM/JSBSim/JSBSim.hxx
+++ b/src/FDM/JSBSim/JSBSim.hxx
@@ -274,7 +274,6 @@ private:
     SGPropertyNode_ptr temperature;
     SGPropertyNode_ptr pressure;
     SGPropertyNode_ptr pressureSL;
-    SGPropertyNode_ptr density;
     SGPropertyNode_ptr ground_wind;
     SGPropertyNode_ptr turbulence_gain;
     SGPropertyNode_ptr turbulence_rate;
diff --git a/src/FDM/JSBSim/models/FGAtmosphere.cpp b/src/FDM/JSBSim/models/FGAtmosphere.cpp
index 1387f013f..38622f037 100644
--- a/src/FDM/JSBSim/models/FGAtmosphere.cpp
+++ b/src/FDM/JSBSim/models/FGAtmosphere.cpp
@@ -50,7 +50,7 @@ INCLUDES
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGAtmosphere.cpp,v 1.48 2011/07/10 20:18:14 jberndt Exp $";
+static const char *IdSrc = "$Id: FGAtmosphere.cpp,v 1.49 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_ATMOSPHERE;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -171,6 +171,9 @@ double FGAtmosphere::ConvertToRankine(double t, eTemperature unit) const
     break;
   case eKelvin:
     targetTemp = t*9.0/5.0;
+    break;
+  default:
+    break;
   }
 
   return targetTemp;
diff --git a/src/FDM/JSBSim/models/FGLGear.cpp b/src/FDM/JSBSim/models/FGLGear.cpp
index f3fd05df7..cb3d8f521 100644
--- a/src/FDM/JSBSim/models/FGLGear.cpp
+++ b/src/FDM/JSBSim/models/FGLGear.cpp
@@ -60,7 +60,7 @@ DEFINITIONS
 GLOBAL DATA
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-static const char *IdSrc = "$Id: FGLGear.cpp,v 1.88 2011/08/30 21:05:56 bcoconni Exp $";
+static const char *IdSrc = "$Id: FGLGear.cpp,v 1.89 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_LGEAR;
 
 // Body To Structural (body frame is rotated 180 deg about Y and lengths are given in
@@ -73,11 +73,11 @@ CLASS IMPLEMENTATION
 
 FGLGear::FGLGear(Element* el, FGFDMExec* fdmex, int number, const struct Inputs& inputs) :
   FGForce(fdmex),
+  in(inputs),
   GearNumber(number),
   SteerAngle(0.0),
   Castered(false),
-  StaticFriction(false),
-  in(inputs)
+  StaticFriction(false)
 {
   Element *force_table=0;
   Element *dampCoeff=0;
diff --git a/src/FDM/JSBSim/models/FGOutput.cpp b/src/FDM/JSBSim/models/FGOutput.cpp
index 36dc45ed3..aa30ad07a 100644
--- a/src/FDM/JSBSim/models/FGOutput.cpp
+++ b/src/FDM/JSBSim/models/FGOutput.cpp
@@ -77,7 +77,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGOutput.cpp,v 1.59 2011/08/14 20:15:56 jberndt Exp $";
+static const char *IdSrc = "$Id: FGOutput.cpp,v 1.60 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_OUTPUT;
 
 // (stolen from FGFS native_fdm.cxx)
@@ -255,7 +255,6 @@ void FGOutput::DelimitedOutput(const string& fname)
   const FGPropagate* Propagate = FDMExec->GetPropagate();
   const FGAccelerations* Accelerations = FDMExec->GetAccelerations();
   const FGFCS* FCS = FDMExec->GetFCS();
-  const FGInertial* Inertial = FDMExec->GetInertial();
   const FGGroundReactions* GroundReactions = FDMExec->GetGroundReactions();
   const FGExternalReactions* ExternalReactions = FDMExec->GetExternalReactions();
   const FGBuoyantForces* BuoyantForces = FDMExec->GetBuoyantForces();
@@ -518,10 +517,8 @@ void FGOutput::DelimitedOutput(const string& fname)
 
 void FGOutput::SocketDataFill(FGNetFDM* net)
 {
-  const FGAerodynamics* Aerodynamics = FDMExec->GetAerodynamics();
   const FGAuxiliary* Auxiliary = FDMExec->GetAuxiliary();
   const FGPropulsion* Propulsion = FDMExec->GetPropulsion();
-  const FGMassBalance* MassBalance = FDMExec->GetMassBalance();
   const FGPropagate* Propagate = FDMExec->GetPropagate();
   const FGFCS* FCS = FDMExec->GetFCS();
   const FGGroundReactions* GroundReactions = FDMExec->GetGroundReactions();
diff --git a/src/FDM/JSBSim/models/FGPropagate.cpp b/src/FDM/JSBSim/models/FGPropagate.cpp
index 96545104d..0668ac682 100644
--- a/src/FDM/JSBSim/models/FGPropagate.cpp
+++ b/src/FDM/JSBSim/models/FGPropagate.cpp
@@ -68,7 +68,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGPropagate.cpp,v 1.95 2011/08/21 16:11:25 bcoconni Exp $";
+static const char *IdSrc = "$Id: FGPropagate.cpp,v 1.96 2011/09/17 15:36:35 bcoconni Exp $";
 static const char *IdHdr = ID_PROPAGATE;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -552,10 +552,10 @@ void FGPropagate::bind(void)
 
   PropertyManager->Tie("position/h-sl-ft", this, &FGPropagate::GetAltitudeASL, &FGPropagate::SetAltitudeASL, true);
   PropertyManager->Tie("position/h-sl-meters", this, &FGPropagate::GetAltitudeASLmeters, &FGPropagate::SetAltitudeASLmeters, true);
-  PropertyManager->Tie("position/lat-gc-rad", this, &FGPropagate::GetLatitude, &FGPropagate::SetLatitude);
-  PropertyManager->Tie("position/long-gc-rad", this, &FGPropagate::GetLongitude, &FGPropagate::SetLongitude);
-  PropertyManager->Tie("position/lat-gc-deg", this, &FGPropagate::GetLatitudeDeg, &FGPropagate::SetLatitudeDeg);
-  PropertyManager->Tie("position/long-gc-deg", this, &FGPropagate::GetLongitudeDeg, &FGPropagate::SetLongitudeDeg);
+  PropertyManager->Tie("position/lat-gc-rad", this, &FGPropagate::GetLatitude, &FGPropagate::SetLatitude, false);
+  PropertyManager->Tie("position/long-gc-rad", this, &FGPropagate::GetLongitude, &FGPropagate::SetLongitude, false);
+  PropertyManager->Tie("position/lat-gc-deg", this, &FGPropagate::GetLatitudeDeg, &FGPropagate::SetLatitudeDeg, false);
+  PropertyManager->Tie("position/long-gc-deg", this, &FGPropagate::GetLongitudeDeg, &FGPropagate::SetLongitudeDeg, false);
   PropertyManager->Tie("position/lat-geod-rad", this, &FGPropagate::GetGeodLatitudeRad);
   PropertyManager->Tie("position/lat-geod-deg", this, &FGPropagate::GetGeodLatitudeDeg);
   PropertyManager->Tie("position/geod-alt-ft", this, &FGPropagate::GetGeodeticAltitude);
diff --git a/src/FDM/JSBSim/models/FGPropulsion.cpp b/src/FDM/JSBSim/models/FGPropulsion.cpp
index 6c5942e8d..2021c822e 100644
--- a/src/FDM/JSBSim/models/FGPropulsion.cpp
+++ b/src/FDM/JSBSim/models/FGPropulsion.cpp
@@ -66,7 +66,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGPropulsion.cpp,v 1.50 2011/08/03 03:21:06 jberndt Exp $";
+static const char *IdSrc = "$Id: FGPropulsion.cpp,v 1.51 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_PROPULSION;
 
 extern short debug_lvl;
@@ -368,7 +368,6 @@ void FGPropulsion::InitRunning(int n)
 bool FGPropulsion::Load(Element* el)
 {
   string type, engine_filename;
-  bool ThrottleAdded = false;
 
   Debug(2);
 
diff --git a/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp b/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp
index 5c8d93c87..e25a7138b 100644
--- a/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp
+++ b/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp
@@ -50,7 +50,7 @@ INCLUDES
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGStandardAtmosphere.cpp,v 1.18 2011/08/17 23:56:01 jberndt Exp $";
+static const char *IdSrc = "$Id: FGStandardAtmosphere.cpp,v 1.19 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_STANDARDATMOSPHERE;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -58,8 +58,8 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGStandardAtmosphere::FGStandardAtmosphere(FGFDMExec* fdmex) : FGAtmosphere(fdmex),
-                                                               TemperatureDeltaGradient(0.0),
-                                                               TemperatureBias(0.0)
+                                                               TemperatureBias(0.0),
+                                                               TemperatureDeltaGradient(0.0)
 {
   Name = "FGStandardAtmosphere";
 
diff --git a/src/FDM/JSBSim/models/atmosphere/FGWinds.cpp b/src/FDM/JSBSim/models/atmosphere/FGWinds.cpp
index d6c55afde..c24648e3a 100644
--- a/src/FDM/JSBSim/models/atmosphere/FGWinds.cpp
+++ b/src/FDM/JSBSim/models/atmosphere/FGWinds.cpp
@@ -51,7 +51,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGWinds.cpp,v 1.4 2011/09/07 02:37:04 jberndt Exp $";
+static const char *IdSrc = "$Id: FGWinds.cpp,v 1.5 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_WINDS;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -284,8 +284,8 @@ void FGWinds::Turbulence(double h)
     double
       T_V = in.totalDeltaT, // for compatibility of nomenclature
       sig_p = 1.9/sqrt(L_w*b_w)*sig_w, // Yeager1998, eq. (8)
-      sig_q = sqrt(M_PI/2/L_w/b_w), // eq. (14)
-      sig_r = sqrt(2*M_PI/3/L_w/b_w), // eq. (17)
+      //sig_q = sqrt(M_PI/2/L_w/b_w), // eq. (14)
+      //sig_r = sqrt(2*M_PI/3/L_w/b_w), // eq. (17)
       L_p = sqrt(L_w*b_w)/2.6, // eq. (10)
       tau_u = L_u/in.V, // eq. (6)
       tau_w = L_w/in.V, // eq. (3)
@@ -416,6 +416,8 @@ void FGWinds::CosineGust()
       // this is the native frame - and the default.
       oneMinusCosineGust.vWindTransformed = oneMinusCosineGust.vWind;
       break;
+    default:
+      break;
     }
   }
 
diff --git a/src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp b/src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp
index 68e699adf..dfa2e46b1 100644
--- a/src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp
+++ b/src/FDM/JSBSim/models/flight_control/FGFCSComponent.cpp
@@ -48,7 +48,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGFCSComponent.cpp,v 1.33 2011/06/21 04:41:54 jberndt Exp $";
+static const char *IdSrc = "$Id: FGFCSComponent.cpp,v 1.34 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_FCSCOMPONENT;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -223,7 +223,7 @@ bool FGFCSComponent::Run(void)
 void FGFCSComponent::Delay(void)
 {
   output_array[index] = Output;
-  if (index == delay-1) index = 0;
+  if ((unsigned int)index == delay-1) index = 0;
   else index++;
   Output = output_array[index];
 }
diff --git a/src/FDM/JSBSim/models/propulsion/FGEngine.cpp b/src/FDM/JSBSim/models/propulsion/FGEngine.cpp
index 4d8c2dc41..e0c056b37 100644
--- a/src/FDM/JSBSim/models/propulsion/FGEngine.cpp
+++ b/src/FDM/JSBSim/models/propulsion/FGEngine.cpp
@@ -53,7 +53,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGEngine.cpp,v 1.46 2011/08/17 23:56:01 jberndt Exp $";
+static const char *IdSrc = "$Id: FGEngine.cpp,v 1.47 2011/09/11 11:36:04 bcoconni Exp $";
 static const char *IdHdr = ID_ENGINE;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -61,7 +61,7 @@ CLASS IMPLEMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 FGEngine::FGEngine(FGFDMExec* exec, Element* engine_element, int engine_number, struct Inputs& input)
-                      : EngineNumber(engine_number), in(input)
+                      : in(input), EngineNumber(engine_number)
 {
   Element* local_element;
   FGColumnVector3 location, orientation;
diff --git a/src/FDM/JSBSim/models/propulsion/FGPiston.cpp b/src/FDM/JSBSim/models/propulsion/FGPiston.cpp
index 2220cacd1..c3cb90800 100644
--- a/src/FDM/JSBSim/models/propulsion/FGPiston.cpp
+++ b/src/FDM/JSBSim/models/propulsion/FGPiston.cpp
@@ -50,7 +50,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGPiston.cpp,v 1.64 2011/08/04 13:45:42 jberndt Exp $";
+static const char *IdSrc = "$Id: FGPiston.cpp,v 1.65 2011/09/11 12:06:54 bcoconni Exp $";
 static const char *IdHdr = ID_PISTON;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -219,7 +219,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number, struct Input
       RatedAltitude[2] = el->FindElementValueAsNumberConvertTo("ratedaltitude3", "FT");
   }
 
-  while(table_element = el->FindNextElement("table")) {
+  while((table_element = el->FindNextElement("table")) != 0) {
     name = table_element->GetAttributeValue("name");
     try {
       if (name == "COMBUSTION") {
diff --git a/src/FDM/JSBSim/models/propulsion/FGPropeller.cpp b/src/FDM/JSBSim/models/propulsion/FGPropeller.cpp
index 6d86d134d..411f12a65 100644
--- a/src/FDM/JSBSim/models/propulsion/FGPropeller.cpp
+++ b/src/FDM/JSBSim/models/propulsion/FGPropeller.cpp
@@ -45,7 +45,7 @@ using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGPropeller.cpp,v 1.36 2011/08/03 03:21:06 jberndt Exp $";
+static const char *IdSrc = "$Id: FGPropeller.cpp,v 1.37 2011/09/11 12:06:54 bcoconni Exp $";
 static const char *IdHdr = ID_PROPELLER;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -99,7 +99,7 @@ FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
     ConstantSpeed = (int)prop_element->FindElementValueAsNumber("constspeed");
   if (prop_element->FindElement("reversepitch"))
     ReversePitch = prop_element->FindElementValueAsNumber("reversepitch");
-  while(table_element = prop_element->FindNextElement("table")) {
+  while((table_element = prop_element->FindNextElement("table")) != 0) {
     name = table_element->GetAttributeValue("name");
     try {
       if (name == "C_THRUST") {
diff --git a/src/FDM/JSBSim/models/propulsion/FGRotor.cpp b/src/FDM/JSBSim/models/propulsion/FGRotor.cpp
index 401d6a0b9..55a711cee 100644
--- a/src/FDM/JSBSim/models/propulsion/FGRotor.cpp
+++ b/src/FDM/JSBSim/models/propulsion/FGRotor.cpp
@@ -55,7 +55,7 @@ using std::cout;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id: FGRotor.cpp,v 1.13 2011/08/03 03:21:06 jberndt Exp $";
+static const char *IdSrc = "$Id: FGRotor.cpp,v 1.16 2011/09/17 16:39:19 bcoconni Exp $";
 static const char *IdHdr = ID_ROTOR;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -77,8 +77,8 @@ FGRotor::FGRotor(FGFDMExec *exec, Element* rotor_element, int num)
   : FGThruster(exec, rotor_element, num),
     rho(0.002356),                                  // environment
     Radius(0.0), BladeNum(0),                       // configuration parameters
-    Sense(1.0), NominalRPM(0.0), ExternalRPM(0),
-    RPMdefinition(0), ExtRPMsource(NULL),
+    Sense(1.0), NominalRPM(0.0), MinimalRPM(0.0), MaximalRPM(0.0), 
+    ExternalRPM(0), RPMdefinition(0), ExtRPMsource(NULL),
     BladeChord(0.0), LiftCurveSlope(0.0), BladeTwist(0.0), HingeOffset(0.0),
     BladeFlappingMoment(0.0), BladeMassMoment(0.0), PolarMoment(0.0),
     InflowLag(0.0), TipLossB(0.0),
@@ -255,6 +255,13 @@ void FGRotor::Configure(Element* rotor_element)
   // make sure that v_tip (omega*r) is below 0.7mach ~ 750ft/s
   estimate = (750.0/Radius)/(2.0*M_PI) * 60.0;  // 7160/Radius
   NominalRPM = ConfigValue(rotor_element, "nominalrpm", estimate, yell);
+  NominalRPM = Constrain(2.0, NominalRPM, 1e9);
+
+  MinimalRPM = ConfigValue(rotor_element, "minrpm", 1.0);
+  MinimalRPM = Constrain(1.0, MinimalRPM, NominalRPM - 1.0);
+
+  MaximalRPM = ConfigValue(rotor_element, "maxrpm", 2.0*NominalRPM);
+  MaximalRPM = Constrain(NominalRPM, MaximalRPM, 1e9);
 
   estimate = Constrain(0.07, 2.0/Radius , 0.14); // guess solidity
   estimate = estimate * M_PI*Radius/BladeNum;
@@ -393,6 +400,7 @@ void FGRotor::calc_flow_and_thrust( double theta_0, double Uw, double Ww,
   double mu2;
 
   mu = Uw/(Omega*Radius); // /SH79/ eqn(24)
+  if (mu > 0.7) mu = 0.7;
   mu2 = sqr(mu);
   
   ct_t0 = (1.0/3.0*B[3] + 1.0/2.0 * TipLossB*mu2 - 4.0/(9.0*M_PI) * mu*mu2 ) * theta_0;
@@ -578,9 +586,8 @@ void FGRotor::CalcStatePart1(void)
     RPM = ExtRPMsource->getDoubleValue() / GearRatio;
   }
 
-  if (RPM < 1.0) { // kludge, otherwise calculations go bananas 
-    RPM = 1.0;
-  }
+  // MinimalRPM is always >= 1. MaximalRPM is always >= NominalRPM
+  RPM = Constrain(MinimalRPM, RPM, MaximalRPM);
 
   Omega = (RPM/60.0)*2.0*M_PI;
 
@@ -632,8 +639,8 @@ void FGRotor::CalcStatePart2(double PowerAvailable)
     double ExcessTorque = PowerAvailable / Omega;
     double deltaOmega   = ExcessTorque / PolarMoment * in.TotalDeltaT;
     RPM += deltaOmega/(2.0*M_PI) * 60.0;
-    if (RPM < 0.0) RPM = 0.0; // Engine won't turn backwards
   }
+  RPM = Constrain(MinimalRPM, RPM, MaximalRPM); // trim again
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -846,6 +853,8 @@ void FGRotor::Debug(int from)
       cout << "      Gear Ratio = " << GearRatio << endl;
       cout << "      Sense = " << Sense << endl;
       cout << "      Nominal RPM = " << NominalRPM << endl;
+      cout << "      Minimal RPM = " << MinimalRPM << endl;
+      cout << "      Maximal RPM = " << MaximalRPM << endl;
 
       if (ExternalRPM) {
         if (RPMdefinition == -1) {
diff --git a/src/FDM/JSBSim/models/propulsion/FGRotor.h b/src/FDM/JSBSim/models/propulsion/FGRotor.h
index 02fbf9295..85d1b3e6e 100644
--- a/src/FDM/JSBSim/models/propulsion/FGRotor.h
+++ b/src/FDM/JSBSim/models/propulsion/FGRotor.h
@@ -46,7 +46,7 @@ INCLUDES
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_ROTOR "$Id: FGRotor.h,v 1.9 2011/03/10 01:35:25 dpculp Exp $"
+#define ID_ROTOR "$Id: FGRotor.h,v 1.10 2011/09/17 16:39:19 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -68,6 +68,8 @@ CLASS DOCUMENTATION
   <numblades> {number} </numblades>
   <gearratio> {number} </gearratio>
   <nominalrpm> {number} </nominalrpm>
+  <minrpm> {number} </minrpm>
+  <maxrpm> {number} </maxrpm>
   <chord unit="{LENGTH}"> {number} </chord>
   <liftcurveslope Xunit="1/RAD"> {number} </liftcurveslope>
   <twist unit="{ANGLE}"> {number} </twist>
@@ -102,7 +104,9 @@ CLASS DOCUMENTATION
     \<diameter>           - Rotor disk diameter (2x R).
     \<numblades>          - Number of blades (b).
     \<gearratio>          - Ratio of (engine rpm) / (rotor rpm), usually > 1.
-    \<nominalrpm>         - RPM at which the rotor usally operates. 
+    \<nominalrpm>         - RPM at which the rotor usally operates.
+    \<minrpm>             - Lowest RPM used in the model, optional and defaults to 1.
+    \<maxrpm>             - Largest RPM used in the model, optional and defaults to 2 x nominalrpm.
     \<chord>              - Blade chord, (c).
     \<liftcurveslope>     - Slope of curve of section lift against section angle of attack,
                              per rad (a).
@@ -201,7 +205,7 @@ CLASS DOCUMENTATION
     </dl>
 
     @author Thomas Kreitler
-    @version $Id: FGRotor.h,v 1.9 2011/03/10 01:35:25 dpculp Exp $
+    @version $Id: FGRotor.h,v 1.10 2011/09/17 16:39:19 bcoconni Exp $
   */
 
 
@@ -339,6 +343,8 @@ private:
 
   double Sense;
   double NominalRPM;
+  double MinimalRPM;
+  double MaximalRPM;
   int    ExternalRPM;
   int    RPMdefinition;
   FGPropertyManager* ExtRPMsource;