1
0
Fork 0

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).
This commit is contained in:
Bertrand Coconnier 2018-07-07 18:34:19 +02:00
parent 7178b3ef6a
commit 64f3c1d3b6
8 changed files with 104 additions and 39 deletions

View file

@ -94,12 +94,7 @@ bool FGAtmosphere::InitModel(void)
SLtemperature = Temperature = 518.67; SLtemperature = Temperature = 518.67;
SLpressure = Pressure = 2116.228; SLpressure = Pressure = 2116.228;
SLdensity = Density = Pressure/(Reng*Temperature); SLdensity = Density = Pressure/(Reng*Temperature);
SLsoundspeed = Soundspeed = sqrt(SHRatio*Reng*(Temperature)); SLsoundspeed = Soundspeed = sqrt(SHRatio*Reng*Temperature);
rSLtemperature = 1/SLtemperature ;
rSLpressure = 1/SLpressure ;
rSLdensity = 1/SLdensity ;
rSLsoundspeed = 1/SLsoundspeed ;
return true; return true;
} }
@ -137,7 +132,7 @@ void FGAtmosphere::Calculate(double altitude)
else else
Density = node->GetDouble("atmosphere/override/density"); Density = node->GetDouble("atmosphere/override/density");
Soundspeed = sqrt(SHRatio*Reng*(Temperature)); Soundspeed = sqrt(SHRatio*Reng*Temperature);
PressureAltitude = CalculatePressureAltitude(Pressure, altitude); PressureAltitude = CalculatePressureAltitude(Pressure, altitude);
DensityAltitude = CalculateDensityAltitude(Density, altitude); DensityAltitude = CalculateDensityAltitude(Density, altitude);

View file

@ -116,15 +116,15 @@ public:
/// Returns the actual, modeled sea level temperature in degrees Rankine. /// Returns the actual, modeled sea level temperature in degrees Rankine.
/// @return The modeled temperature in degrees Rankine at sea level. /// @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 /// Returns the ratio of the at-current-altitude temperature as modeled
/// over the sea level value. /// 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 /// Returns the ratio of the temperature as modeled at the supplied altitude
/// over the sea level value. /// 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. /// Sets the Sea Level temperature.
/// @param t the temperature value in the unit provided. /// @param t the temperature value in the unit provided.
@ -142,7 +142,7 @@ public:
/// @name Pressure access functions. /// @name Pressure access functions.
//@{ //@{
/// Returns the pressure in psf. /// 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. /// Returns the pressure at a specified altitude in psf.
virtual double GetPressure(double altitude) const = 0; virtual double GetPressure(double altitude) const = 0;
@ -151,7 +151,7 @@ public:
virtual double GetPressureSL(ePressure to=ePSF) const { return ConvertFromPSF(SLpressure, to); } virtual double GetPressureSL(ePressure to=ePSF) const { return ConvertFromPSF(SLpressure, to); }
/// Returns the ratio of at-altitude pressure over the sea level value. /// 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. /** Sets the sea level pressure for modeling.
@param pressure The pressure in the units specified. @param pressure The pressure in the units specified.
@ -174,7 +174,7 @@ public:
virtual double GetDensitySL(void) const { return SLdensity; } virtual double GetDensitySL(void) const { return SLdensity; }
/// Returns the ratio of at-altitude density over the sea level value. /// 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; } virtual double GetSoundSpeedSL(void) const { return SLsoundspeed; }
/// Returns the ratio of at-altitude sound speed over the sea level value. /// 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: protected:
double SLtemperature, SLdensity, SLpressure, SLsoundspeed; // Sea level conditions double SLtemperature, SLdensity, SLpressure, SLsoundspeed; // Sea level conditions
double Temperature, Density, Pressure, Soundspeed; // Current actual conditions at altitude double Temperature, Density, Pressure, Soundspeed; // Current actual conditions at altitude
double rSLtemperature, rSLdensity, rSLpressure, rSLsoundspeed; // Reciprocal of sea level conditions
double PressureAltitude; double PressureAltitude;
double DensityAltitude; double DensityAltitude;

View file

@ -636,6 +636,21 @@ void FGPropulsion::SetStarter(int setting)
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
int FGPropulsion::GetStarter(void) const
{
if (ActiveEngine < 0) {
bool starter = true;
for (unsigned i=0; i<Engines.size(); i++)
starter &= Engines[i]->GetStarter();
return starter ? 1 : 0;
} else
return Engines[ActiveEngine]->GetStarter() ? 1: 0;
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGPropulsion::SetCutoff(int setting) void FGPropulsion::SetCutoff(int setting)
{ {
bool bsetting = setting == 0 ? false : true; 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; i<Engines.size(); i++) {
switch (Engines[i]->GetType()) {
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) void FGPropulsion::SetActiveEngine(int engine)
{ {
if (engine >= (int)Engines.size() || engine < 0) if (engine >= (int)Engines.size() || engine < 0)
@ -760,12 +811,12 @@ void FGPropulsion::bind(void)
IsBound = true; IsBound = true;
PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, false); PropertyManager->Tie("propulsion/set-running", this, (iPMF)0, &FGPropulsion::InitRunning, false);
if (HaveTurbineEngine || HaveTurboPropEngine) { if (HaveTurbineEngine || HaveTurboPropEngine) {
PropertyManager->Tie("propulsion/starter_cmd", this, (iPMF)0, &FGPropulsion::SetStarter, false); PropertyManager->Tie("propulsion/starter_cmd", this, &FGPropulsion::GetStarter, &FGPropulsion::SetStarter);
PropertyManager->Tie("propulsion/cutoff_cmd", this, (iPMF)0, &FGPropulsion::SetCutoff, false); PropertyManager->Tie("propulsion/cutoff_cmd", this, &FGPropulsion::GetCutoff, &FGPropulsion::SetCutoff);
} }
if (HavePistonEngine) { 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); PropertyManager->Tie("propulsion/magneto_cmd", this, (iPMF)0, &FGPropulsion::SetMagnetos, false);
} }

View file

@ -179,7 +179,9 @@ public:
void SetMagnetos(int setting); void SetMagnetos(int setting);
void SetStarter(int setting); void SetStarter(int setting);
int GetStarter(void) const;
void SetCutoff(int setting=0); void SetCutoff(int setting=0);
int GetCutoff(void) const;
void SetActiveEngine(int engine); void SetActiveEngine(int engine);
void SetFuelFreeze(bool f); void SetFuelFreeze(bool f);
const FGMatrix33& CalculateTankInertias(void); const FGMatrix33& CalculateTankInertias(void);

View file

@ -143,10 +143,6 @@ bool MSIS::InitModel(void)
// SLpressure = intPressure = 2116.7; // SLpressure = intPressure = 2116.7;
// SLdensity = intDensity = 0.002378; // SLdensity = intDensity = 0.002378;
// SLsoundspeed = sqrt(2403.0832 * SLtemperature); // SLsoundspeed = sqrt(2403.0832 * SLtemperature);
// rSLtemperature = 1.0/intTemperature;
// rSLpressure = 1.0/intPressure;
// rSLdensity = 1.0/intDensity;
// rSLsoundspeed = 1.0/SLsoundspeed;
return true; return true;
} }
@ -172,10 +168,6 @@ bool MSIS::Run(bool Holding)
SLdensity = output.d[5] * 1.940321; SLdensity = output.d[5] * 1.940321;
SLpressure = 1716.488 * SLdensity * SLtemperature; SLpressure = 1716.488 * SLdensity * SLtemperature;
SLsoundspeed = sqrt(2403.0832 * 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 // get at-altitude values
Calculate(FDMExec->GetAuxiliary()->GetDayOfYear(), Calculate(FDMExec->GetAuxiliary()->GetDayOfYear(),

View file

@ -146,11 +146,6 @@ bool FGStandardAtmosphere::InitModel(void)
StdSLsoundspeed = SLsoundspeed = Soundspeed; StdSLsoundspeed = SLsoundspeed = Soundspeed;
rSLtemperature = 1/SLtemperature ;
rSLpressure = 1/SLpressure ;
rSLdensity = 1/SLdensity ;
rSLsoundspeed = 1/SLsoundspeed ;
// PrintStandardAtmosphereTable(); // PrintStandardAtmosphereTable();
return true; return true;
@ -211,11 +206,19 @@ void FGStandardAtmosphere::SetPressureSL(ePressure unit, double pressure)
{ {
double press = ConvertToPSF(pressure, unit); double press = ConvertToPSF(pressure, unit);
PressureBreakpoints[0] = press; SLpressure = press;
SLpressure = PressureBreakpoints[0]; CalculateSLDensity();
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGStandardAtmosphere::CalculateSLSoundSpeedAndDensity(void)
{
SLsoundspeed = sqrt(SHRatio*Reng*SLtemperature);
CalculateSLDensity();
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// Get the modeled temperature at a specified altitude, including any bias or gradient // Get the modeled temperature at a specified altitude, including any bias or gradient
// effects. // effects.
@ -349,6 +352,9 @@ void FGStandardAtmosphere::SetTemperature(double t, double h, eTemperature unit)
TemperatureBias -= TemperatureDeltaGradient * (GradientFadeoutAltitude - GeoPotAlt); TemperatureBias -= TemperatureDeltaGradient * (GradientFadeoutAltitude - GeoPotAlt);
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
SLtemperature = GetTemperature(0.0);
CalculateSLSoundSpeedAndDensity();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -360,6 +366,9 @@ void FGStandardAtmosphere::SetTemperatureBias(eTemperature unit, double t)
TemperatureBias = t; TemperatureBias = t;
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
SLtemperature = GetTemperature(0.0);
CalculateSLSoundSpeedAndDensity();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -396,6 +405,9 @@ void FGStandardAtmosphere::SetTemperatureGradedDelta(double deltemp, double h, e
TemperatureDeltaGradient = deltemp/(GradientFadeoutAltitude - GeopotentialAltitude(h)); TemperatureDeltaGradient = deltemp/(GradientFadeoutAltitude - GeopotentialAltitude(h));
CalculateLapseRates(); CalculateLapseRates();
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
SLtemperature = GetTemperature(0.0);
CalculateSLSoundSpeedAndDensity();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -443,6 +455,8 @@ void FGStandardAtmosphere::CalculateLapseRates()
void FGStandardAtmosphere::CalculatePressureBreakpoints() void FGStandardAtmosphere::CalculatePressureBreakpoints()
{ {
PressureBreakpoints[0] = SLpressure;
for (unsigned int b=0; b<PressureBreakpoints.size()-1; b++) { for (unsigned int b=0; b<PressureBreakpoints.size()-1; b++) {
double BaseTemp = StdAtmosTemperatureTable(b+1,1); double BaseTemp = StdAtmosTemperatureTable(b+1,1);
double BaseAlt = StdAtmosTemperatureTable(b+1,0); double BaseAlt = StdAtmosTemperatureTable(b+1,0);
@ -469,13 +483,17 @@ void FGStandardAtmosphere::ResetSLTemperature()
TemperatureBias = TemperatureDeltaGradient = 0.0; TemperatureBias = TemperatureDeltaGradient = 0.0;
CalculateLapseRates(); CalculateLapseRates();
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
SLtemperature = StdSLtemperature;
CalculateSLSoundSpeedAndDensity();
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void FGStandardAtmosphere::ResetSLPressure() void FGStandardAtmosphere::ResetSLPressure()
{ {
PressureBreakpoints[0] = StdSLpressure; // psf SLpressure = StdSLpressure;
CalculateSLDensity();
CalculatePressureBreakpoints(); CalculatePressureBreakpoints();
} }
@ -484,9 +502,8 @@ void FGStandardAtmosphere::ResetSLPressure()
void FGStandardAtmosphere::CalculateStdDensityBreakpoints() void FGStandardAtmosphere::CalculateStdDensityBreakpoints()
{ {
StdDensityBreakpoints.clear(); StdDensityBreakpoints.clear();
for (unsigned int i = 0; i < StdPressureBreakpoints.size(); i++) { for (unsigned int i = 0; i < StdPressureBreakpoints.size(); i++)
StdDensityBreakpoints.push_back(StdPressureBreakpoints[i] / (Reng * StdAtmosTemperatureTable(i + 1, 1))); StdDensityBreakpoints.push_back(StdPressureBreakpoints[i] / (Reng * StdAtmosTemperatureTable(i + 1, 1)));
}
} }
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View file

@ -125,11 +125,11 @@ public:
/// Returns the standard sea level temperature in degrees Rankine. /// Returns the standard sea level temperature in degrees Rankine.
/// @return The STANDARD temperature at sea level in degrees Rankine. /// @return The STANDARD temperature at sea level in degrees Rankine.
virtual double GetStdTemperatureSL() const { return GetStdTemperature(0.0); } virtual double GetStdTemperatureSL() const { return StdSLtemperature; }
/// Returns the ratio of the standard temperature at the supplied altitude /// Returns the ratio of the standard temperature at the supplied altitude
/// over the standard sea level temperature. /// over the standard sea level temperature.
virtual double GetStdTemperatureRatio(double h) const { return GetStdTemperature(h)*rSLtemperature; } virtual double GetStdTemperatureRatio(double h) const { return GetStdTemperature(h)/StdSLtemperature; }
/// Returns the temperature bias over the sea level value in degrees Rankine. /// Returns the temperature bias over the sea level value in degrees Rankine.
virtual double GetTemperatureBias(eTemperature to) const virtual double GetTemperatureBias(eTemperature to) const
@ -329,6 +329,12 @@ protected:
/// Calculate the pressure of water vapor with the Magnus formula. /// Calculate the pressure of water vapor with the Magnus formula.
double CalculateVaporPressure(double temperature); double CalculateVaporPressure(double temperature);
/// Calculate the SL density
void CalculateSLDensity(void) { SLdensity = SLpressure / (Reng * SLtemperature); }
/// Calculate the SL density and sound speed
void CalculateSLSoundSpeedAndDensity(void);
virtual void bind(void); virtual void bind(void);
void Debug(int from); void Debug(int from);

View file

@ -255,7 +255,10 @@ double FGPropeller::Calculate(double EnginePower)
double tangentialVel = localAeroVel.Magnitude(eV, eW); double tangentialVel = localAeroVel.Magnitude(eV, eW);
if (tangentialVel > 0.0001) { if (tangentialVel > 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; double factor = Sense * P_Factor * angle / tangentialVel;
SetActingLocationY( GetLocationY() + factor * localAeroVel(eW)); SetActingLocationY( GetLocationY() + factor * localAeroVel(eW));
SetActingLocationZ( GetLocationZ() + factor * localAeroVel(eV)); SetActingLocationZ( GetLocationZ() + factor * localAeroVel(eV));