From 64f3c1d3b69dd918a4305eee8813bb88c0c591e4 Mon Sep 17 00:00:00 2001 From: Bertrand Coconnier Date: Sat, 7 Jul 2018 18:34:19 +0200 Subject: [PATCH] Sync'ed JSBSim - Now all the sea level properties from the standard atmosphere are updated along with the other atmosphere properties. - The properties propulsion/start_cmd and propulsion/cutoff_cmd are now read/write (they were read only before). --- src/FDM/JSBSim/models/FGAtmosphere.cpp | 9 +-- src/FDM/JSBSim/models/FGAtmosphere.h | 15 +++-- src/FDM/JSBSim/models/FGPropulsion.cpp | 57 ++++++++++++++++++- src/FDM/JSBSim/models/FGPropulsion.h | 2 + src/FDM/JSBSim/models/atmosphere/FGMSIS.cpp | 8 --- .../atmosphere/FGStandardAtmosphere.cpp | 37 ++++++++---- .../models/atmosphere/FGStandardAtmosphere.h | 10 +++- .../JSBSim/models/propulsion/FGPropeller.cpp | 5 +- 8 files changed, 104 insertions(+), 39 deletions(-) diff --git a/src/FDM/JSBSim/models/FGAtmosphere.cpp b/src/FDM/JSBSim/models/FGAtmosphere.cpp index b971eece0..cd78b87e0 100644 --- a/src/FDM/JSBSim/models/FGAtmosphere.cpp +++ b/src/FDM/JSBSim/models/FGAtmosphere.cpp @@ -94,12 +94,7 @@ bool FGAtmosphere::InitModel(void) SLtemperature = Temperature = 518.67; SLpressure = Pressure = 2116.228; SLdensity = Density = Pressure/(Reng*Temperature); - SLsoundspeed = Soundspeed = sqrt(SHRatio*Reng*(Temperature)); - - rSLtemperature = 1/SLtemperature ; - rSLpressure = 1/SLpressure ; - rSLdensity = 1/SLdensity ; - rSLsoundspeed = 1/SLsoundspeed ; + SLsoundspeed = Soundspeed = sqrt(SHRatio*Reng*Temperature); return true; } @@ -137,7 +132,7 @@ void FGAtmosphere::Calculate(double altitude) else Density = node->GetDouble("atmosphere/override/density"); - Soundspeed = sqrt(SHRatio*Reng*(Temperature)); + Soundspeed = sqrt(SHRatio*Reng*Temperature); PressureAltitude = CalculatePressureAltitude(Pressure, altitude); DensityAltitude = CalculateDensityAltitude(Density, altitude); diff --git a/src/FDM/JSBSim/models/FGAtmosphere.h b/src/FDM/JSBSim/models/FGAtmosphere.h index be017af18..b3eaa2551 100644 --- a/src/FDM/JSBSim/models/FGAtmosphere.h +++ b/src/FDM/JSBSim/models/FGAtmosphere.h @@ -116,15 +116,15 @@ public: /// Returns the actual, modeled sea level temperature in degrees Rankine. /// @return The modeled temperature in degrees Rankine at sea level. - virtual double GetTemperatureSL() const { return GetTemperature(0.0); } + virtual double GetTemperatureSL() const { return SLtemperature; } /// Returns the ratio of the at-current-altitude temperature as modeled /// over the sea level value. - virtual double GetTemperatureRatio() const { return GetTemperature()*rSLtemperature; } + virtual double GetTemperatureRatio() const { return GetTemperature()/SLtemperature; } /// Returns the ratio of the temperature as modeled at the supplied altitude /// over the sea level value. - virtual double GetTemperatureRatio(double h) const { return GetTemperature(h)*rSLtemperature; } + virtual double GetTemperatureRatio(double h) const { return GetTemperature(h)/SLtemperature; } /// Sets the Sea Level temperature. /// @param t the temperature value in the unit provided. @@ -142,7 +142,7 @@ public: /// @name Pressure access functions. //@{ /// Returns the pressure in psf. - virtual double GetPressure(void) const {return Pressure;} + virtual double GetPressure(void) const {return Pressure;} /// Returns the pressure at a specified altitude in psf. virtual double GetPressure(double altitude) const = 0; @@ -151,7 +151,7 @@ public: virtual double GetPressureSL(ePressure to=ePSF) const { return ConvertFromPSF(SLpressure, to); } /// Returns the ratio of at-altitude pressure over the sea level value. - virtual double GetPressureRatio(void) const { return Pressure*rSLpressure; } + virtual double GetPressureRatio(void) const { return Pressure/SLpressure; } /** Sets the sea level pressure for modeling. @param pressure The pressure in the units specified. @@ -174,7 +174,7 @@ public: virtual double GetDensitySL(void) const { return SLdensity; } /// Returns the ratio of at-altitude density over the sea level value. - virtual double GetDensityRatio(void) const { return Density*rSLdensity; } + virtual double GetDensityRatio(void) const { return Density/SLdensity; } //@} // ************************************************************************* @@ -190,7 +190,7 @@ public: virtual double GetSoundSpeedSL(void) const { return SLsoundspeed; } /// Returns the ratio of at-altitude sound speed over the sea level value. - virtual double GetSoundSpeedRatio(void) const { return Soundspeed*rSLsoundspeed; } + virtual double GetSoundSpeedRatio(void) const { return Soundspeed/SLsoundspeed; } //@} // ************************************************************************* @@ -214,7 +214,6 @@ public: protected: double SLtemperature, SLdensity, SLpressure, SLsoundspeed; // Sea level conditions double Temperature, Density, Pressure, Soundspeed; // Current actual conditions at altitude - double rSLtemperature, rSLdensity, rSLpressure, rSLsoundspeed; // Reciprocal of sea level conditions double PressureAltitude; double DensityAltitude; diff --git a/src/FDM/JSBSim/models/FGPropulsion.cpp b/src/FDM/JSBSim/models/FGPropulsion.cpp index 6aae33d20..208461f20 100644 --- a/src/FDM/JSBSim/models/FGPropulsion.cpp +++ b/src/FDM/JSBSim/models/FGPropulsion.cpp @@ -636,6 +636,21 @@ void FGPropulsion::SetStarter(int setting) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +int FGPropulsion::GetStarter(void) const +{ + if (ActiveEngine < 0) { + bool starter = true; + + for (unsigned i=0; iGetStarter(); + + return starter ? 1 : 0; + } else + return Engines[ActiveEngine]->GetStarter() ? 1: 0; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + void FGPropulsion::SetCutoff(int setting) { bool bsetting = setting == 0 ? false : true; @@ -669,6 +684,42 @@ void FGPropulsion::SetCutoff(int setting) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +int FGPropulsion::GetCutoff(void) const +{ + if (ActiveEngine < 0) { + bool cutoff = true; + + for (unsigned i=0; iGetType()) { + case FGEngine::etTurbine: + cutoff &= ((FGTurbine*)Engines[i])->GetCutoff(); + break; + case FGEngine::etTurboprop: + cutoff &= ((FGTurboProp*)Engines[i])->GetCutoff(); + break; + default: + return -1; + } + } + + return cutoff ? 1 : 0; + } else { + switch (Engines[ActiveEngine]->GetType()) { + case FGEngine::etTurbine: + return ((FGTurbine*)Engines[ActiveEngine])->GetCutoff() ? 1 : 0; + case FGEngine::etTurboprop: + return ((FGTurboProp*)Engines[ActiveEngine])->GetCutoff() ? 1 : 0; + break; + default: + break; + } + } + + return -1; +} + +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + void FGPropulsion::SetActiveEngine(int engine) { if (engine >= (int)Engines.size() || engine < 0) @@ -760,12 +811,12 @@ void FGPropulsion::bind(void) IsBound = true; PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, false); if (HaveTurbineEngine || HaveTurboPropEngine) { - PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, false); - PropertyManager->Tie("propulsion/cutoff_cmd", this, (iPMF)0, &FGPropulsion::SetCutoff, false); + PropertyManager->Tie("propulsion/starter_cmd", this, &FGPropulsion::GetStarter, &FGPropulsion::SetStarter); + PropertyManager->Tie("propulsion/cutoff_cmd", this, &FGPropulsion::GetCutoff, &FGPropulsion::SetCutoff); } if (HavePistonEngine) { - PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, false); + PropertyManager->Tie("propulsion/starter_cmd", this, &FGPropulsion::GetStarter, &FGPropulsion::SetStarter); PropertyManager->Tie("propulsion/magneto_cmd", this, (iPMF)0, &FGPropulsion::SetMagnetos, false); } diff --git a/src/FDM/JSBSim/models/FGPropulsion.h b/src/FDM/JSBSim/models/FGPropulsion.h index 5bd69ff7d..4a7d67e23 100644 --- a/src/FDM/JSBSim/models/FGPropulsion.h +++ b/src/FDM/JSBSim/models/FGPropulsion.h @@ -179,7 +179,9 @@ public: void SetMagnetos(int setting); void SetStarter(int setting); + int GetStarter(void) const; void SetCutoff(int setting=0); + int GetCutoff(void) const; void SetActiveEngine(int engine); void SetFuelFreeze(bool f); const FGMatrix33& CalculateTankInertias(void); diff --git a/src/FDM/JSBSim/models/atmosphere/FGMSIS.cpp b/src/FDM/JSBSim/models/atmosphere/FGMSIS.cpp index eb22ae780..41be26913 100644 --- a/src/FDM/JSBSim/models/atmosphere/FGMSIS.cpp +++ b/src/FDM/JSBSim/models/atmosphere/FGMSIS.cpp @@ -143,10 +143,6 @@ bool MSIS::InitModel(void) // SLpressure = intPressure = 2116.7; // SLdensity = intDensity = 0.002378; // SLsoundspeed = sqrt(2403.0832 * SLtemperature); -// rSLtemperature = 1.0/intTemperature; -// rSLpressure = 1.0/intPressure; -// rSLdensity = 1.0/intDensity; -// rSLsoundspeed = 1.0/SLsoundspeed; return true; } @@ -172,10 +168,6 @@ bool MSIS::Run(bool Holding) SLdensity = output.d[5] * 1.940321; SLpressure = 1716.488 * SLdensity * SLtemperature; SLsoundspeed = sqrt(2403.0832 * SLtemperature); - rSLtemperature = 1.0/SLtemperature; - rSLpressure = 1.0/SLpressure; - rSLdensity = 1.0/SLdensity; - rSLsoundspeed = 1.0/SLsoundspeed; // get at-altitude values Calculate(FDMExec->GetAuxiliary()->GetDayOfYear(), diff --git a/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp b/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp index edf02e382..3e455c7a6 100644 --- a/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp +++ b/src/FDM/JSBSim/models/atmosphere/FGStandardAtmosphere.cpp @@ -146,11 +146,6 @@ bool FGStandardAtmosphere::InitModel(void) StdSLsoundspeed = SLsoundspeed = Soundspeed; - rSLtemperature = 1/SLtemperature ; - rSLpressure = 1/SLpressure ; - rSLdensity = 1/SLdensity ; - rSLsoundspeed = 1/SLsoundspeed ; - // PrintStandardAtmosphereTable(); return true; @@ -211,11 +206,19 @@ void FGStandardAtmosphere::SetPressureSL(ePressure unit, double pressure) { double press = ConvertToPSF(pressure, unit); - PressureBreakpoints[0] = press; - SLpressure = PressureBreakpoints[0]; + SLpressure = press; + CalculateSLDensity(); CalculatePressureBreakpoints(); } +//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +void FGStandardAtmosphere::CalculateSLSoundSpeedAndDensity(void) +{ + SLsoundspeed = sqrt(SHRatio*Reng*SLtemperature); + CalculateSLDensity(); +} + //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% // Get the modeled temperature at a specified altitude, including any bias or gradient // effects. @@ -349,6 +352,9 @@ void FGStandardAtmosphere::SetTemperature(double t, double h, eTemperature unit) TemperatureBias -= TemperatureDeltaGradient * (GradientFadeoutAltitude - GeoPotAlt); CalculatePressureBreakpoints(); + + SLtemperature = GetTemperature(0.0); + CalculateSLSoundSpeedAndDensity(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -360,6 +366,9 @@ void FGStandardAtmosphere::SetTemperatureBias(eTemperature unit, double t) TemperatureBias = t; CalculatePressureBreakpoints(); + + SLtemperature = GetTemperature(0.0); + CalculateSLSoundSpeedAndDensity(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -396,6 +405,9 @@ void FGStandardAtmosphere::SetTemperatureGradedDelta(double deltemp, double h, e TemperatureDeltaGradient = deltemp/(GradientFadeoutAltitude - GeopotentialAltitude(h)); CalculateLapseRates(); CalculatePressureBreakpoints(); + + SLtemperature = GetTemperature(0.0); + CalculateSLSoundSpeedAndDensity(); } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -443,6 +455,8 @@ void FGStandardAtmosphere::CalculateLapseRates() void FGStandardAtmosphere::CalculatePressureBreakpoints() { + PressureBreakpoints[0] = SLpressure; + for (unsigned int b=0; b 0.0001) { - double angle = atan2(tangentialVel, localAeroVel(eU) + Vinduced); + // The angle made locally by the air flow with respect to the propeller + // axis is influenced by the induced velocity. This attenuates the + // influence of a string cross wind and gives a more realistic behavior. + double angle = atan2(tangentialVel, Vel+Vinduced); double factor = Sense * P_Factor * angle / tangentialVel; SetActingLocationY( GetLocationY() + factor * localAeroVel(eW)); SetActingLocationZ( GetLocationZ() + factor * localAeroVel(eV));