From: <sv...@ww...> - 2005-12-23 19:53:57
|
Author: mkrose Date: 2005-12-23 11:53:51 -0800 (Fri, 23 Dec 2005) New Revision: 1804 Modified: trunk/CSP/csp/cspsim/f16/F16Engine.cpp trunk/CSP/csp/cspsim/f16/F16Engine.h Log: Minor refactoring of the f16 engine spooling model. No change to the behavior. Browse at: https://www.zerobar.net/viewcvs/viewcvs.cgi?view=rev&rev=1804 Modified: trunk/CSP/csp/cspsim/f16/F16Engine.cpp =================================================================== --- trunk/CSP/csp/cspsim/f16/F16Engine.cpp 2005-12-23 19:52:58 UTC (rev 1803) +++ trunk/CSP/csp/cspsim/f16/F16Engine.cpp 2005-12-23 19:53:51 UTC (rev 1804) @@ -89,6 +89,7 @@ m_StartElapsedTime(0.0), m_HangTime(0.0), m_Blend(0.0), + m_Power(0.0), m_NormalStart(true) { // TODO set defaults @@ -201,31 +202,30 @@ } void F16Engine::update(double dt) { - double fdt = static_cast<double>(dt); // jfs->update(fdt); - updateTemperature(fdt); + updateTemperature(dt); switch (m_Status) { case STATUS_OFF: - updateOff(fdt); + updateOff(dt); break; case STATUS_PRESTART: - updatePrestart(fdt); + updatePrestart(dt); break; case STATUS_RUNNING: - updateRunning(fdt); + updateRunning(dt); break; case STATUS_STALL: - //updateStall(fdt); + //updateStall(dt); break; case STATUS_FIRE: - //updateFire(fdt); + //updateFire(dt); break; case STATUS_FAIL: - //updateFail(fdt); + //updateFail(dt); break; } - updateNozzle(fdt); - updateFuel(fdt); + updateNozzle(dt); + updateFuel(dt); updateThrust(); } @@ -332,50 +332,39 @@ const double effective_thrust = (thrust - getIdleThrust()) * thrust_scale; updateFuelConsumption(m_IdleFuelConsumption + std::max(0.0, effective_thrust * m_ThrustSpecificFuelConsumption), dt); } - const double throttle = getEffectiveThrottle(); - /* - double target = 1.0; - if (throttle <= 0.95) { - const double f = throttle / 0.95; - target = m_IdleRPM * (1.0 - f) + f; - if (rpm <= m_AfterburnerCutoffRPM) setAfterburner(false); - } else if (!m_AfterburnerFailure) { - const double f = (throttle - 0.95) * 20.0; - if (m_Afterburner) { - target = (1.0 - f) + f * m_AfterburnerRPM; - } else { - if (rpm >= m_AfterburnerMinRPM) { - if (m_AfterburnerTime <= 0.0) m_AfterburnerTime = m_AfterburnerDelay; - m_AfterburnerTime -= dt; - if (m_AfterburnerTime <= 0.0) setAfterburner(true); - } - } - } else { - setAfterburner(false); - } + spoolEngine(dt); updateTemperatureTargets(); - b_RPM->value() = rpm + (target - rpm) * m_SpoolRate * dt; - */ - double p1 = throttle * (0.625) + std::max(0.0, (throttle - 0.8) * 1.875); - static double p3 = 0.0; // XXX +} + +// Engine spooling simulation based on fig. 66 of NASA 1979. +void F16Engine::spoolEngine(double dt) { + const double throttle = getEffectiveThrottle(); + // Fig. 66(b) commanded power versus throttle position, taking the military + // setting at 80 percent rather than roughly 76 percent. + double power = throttle * (0.625) + std::max(0.0, (throttle - 0.8) * 1.875); + // TODO externalize the rate constants double r = 0.0; - if (p1 < 0.5) { - if (p3 < 0.5) { - r = (p1 - p3) * clampTo(2.0 - (p1-p3)*4.0, 0.1, 1.0); + if (power < 0.5) { + if (m_Power < 0.5) { + r = (power - m_Power) * clampTo(2.0 - (power - m_Power)*4.0, 0.1, 1.0); } else { - r = 5.0 * (0.4 - p3); + r = 5.0 * (0.4 - m_Power); } } else { - if (p3 < 0.5) { - r = (0.6 - p3) * clampTo(2.0 - (0.6-p3)*4.0, 0.1, 1.0); + if (m_Power < 0.5) { + r = (0.6 - m_Power) * clampTo(2.0 - (0.6-m_Power)*4.0, 0.1, 1.0); } else { - r = 5.0 * (p1 - p3); + r = 5.0 * (power - m_Power); } } - p3 += r * dt; - setAfterburner(p3 >= 0.5); - updateTemperatureTargets(); - b_RPM->value() = (p3 < 0.5) ? m_IdleRPM * (1.0 - 2*p3) + 2*p3 : (1.0 - p3)*2 + m_AfterburnerRPM * (2*p3 - 1.0); + m_Power = clampTo(m_Power + r * dt, 0.0, 1.0); + if (m_Power < 0.5) { // non-AB + setAfterburner(false); + b_RPM->value() = m_IdleRPM * (1.0 - 2*m_Power) + 2*m_Power; + } else { // AB + setAfterburner(true); + b_RPM->value() = (1.0 - m_Power)*2 + m_AfterburnerRPM * (2*m_Power - 1.0); + } } void F16Engine::driveEngine(double drive, double dt) { Modified: trunk/CSP/csp/cspsim/f16/F16Engine.h =================================================================== --- trunk/CSP/csp/cspsim/f16/F16Engine.h 2005-12-23 19:52:58 UTC (rev 1803) +++ trunk/CSP/csp/cspsim/f16/F16Engine.h 2005-12-23 19:53:51 UTC (rev 1804) @@ -65,6 +65,7 @@ void setAfterburner(bool on); void updateFuel(double dt); void updateNozzle(double dt); + void spoolEngine(double dt); double getEffectiveThrottle(); bool isFuelPressurized(); bool isFuelDepressurized(); @@ -94,13 +95,12 @@ double m_StartElapsedTime; double m_HangTime; double m_Blend; + double m_Power; bool m_NormalStart; DataChannel< Ref<FuelManagementSystem> >::CRefT b_FuelManagementSystem; DataChannel<double>::RefT b_FuelFlow; - // TODO add Link<jfs> - void regen(); Real m_WindSpin; Real m_DragRate; |