]> git.mxchange.org Git - flightgear.git/commitdiff
Piston engine oil temperature model from David Luff:
authorandy <andy>
Wed, 19 Oct 2005 18:52:57 +0000 (18:52 +0000)
committerandy <andy>
Wed, 19 Oct 2005 18:52:57 +0000 (18:52 +0000)
Attached is a patch to add oil temperature to the YASim piston engine
model.  This brings to life one of the pa28-161's otherwise 'dead'
guages.  It's a pretty simple 'model' based on temperatures and warmup
times I've observed in the labs on auto engines and run through my
dodgy-memory filter.  It does the job of populating the guage with
something plausible though.

src/FDM/YASim/FGFDM.cpp
src/FDM/YASim/PistonEngine.cpp
src/FDM/YASim/PistonEngine.hpp
src/FDM/YASim/YASim.cxx

index cd24f7b7f380a0cb796d90dee732f7274b8c1938..19846f8d66db020692491067adbae30f4c169f8e 100644 (file)
@@ -529,6 +529,8 @@ void FGFDM::setOutputProperties(float dt)
                 node->setFloatValue("mp-inhg", pe->getMP() * (1/INHG2PA));
                 node->setFloatValue("egt-degf",
                                     pe->getEGT() * K2DEGF + K2DEGFOFFSET);
+                node->setFloatValue("oil-temperature-degf",
+                                    pe->getOilTemp() * K2DEGF + K2DEGFOFFSET);
                 node->setFloatValue("boost-gauge-inhg",
                                     pe->getBoost() * (1/INHG2PA));
             } else if(p->getEngine()->isTurbineEngine()) {
index 4a86362b89783b30eb5fea13f138b77b5e92ff16..6bb297c11d15b6a990e75b4f92cd1d0bc5c57b40 100644 (file)
@@ -13,6 +13,10 @@ PistonEngine::PistonEngine(float power, float speed)
     _running = false;
     _fuel = true;
     _boostPressure = 0;
+    
+    _oilTemp = Atmosphere::getStdTemperature(0);
+    _oilTempTarget = _oilTemp;
+    _dOilTempdt = 0;
 
     // Presume a BSFC (in lb/hour per HP) of 0.45.  In SI that becomes
     // (2.2 lb/kg, 745.7 W/hp, 3600 sec/hour) 7.62e-08 kg/Ws.
@@ -93,6 +97,16 @@ float PistonEngine::getEGT()
     return _egt;
 }
 
+void PistonEngine::stabilize()
+{
+    _oilTemp = _oilTempTarget;
+}
+
+void PistonEngine::integrate(float dt) 
+{
+    _oilTemp += (_dOilTempdt * dt);
+}
+
 void PistonEngine::calc(float pressure, float temp, float speed)
 {
     if(_magnetos == 0 || speed < 60*RPM2RADPS)
@@ -208,12 +222,31 @@ void PistonEngine::calc(float pressure, float temp, float speed)
     // what we'd expect.  And diddle the work done by the gas a bit to
     // account for non-thermodynamic losses like internal friction;
     // 10% should do it.
-
     float massFlow = _fuelFlow + (rho * 0.5f * _displacement * speed);
     float specHeat = 1300;
     float corr = 1.0f/(Math::pow(_compression, 0.4f) - 1.0f);
     _egt = corr * (power * 1.1f) / (massFlow * specHeat);
     if(_egt < temp) _egt = temp;
+    
+    
+    // Oil temperature.
+    // Assume a linear variation between ~90degC at idle and ~120degC
+    // at full power.  No attempt to correct for airflow over the
+    // engine is made.  Make the time constant to attain target steady-
+    // state oil temp greater at engine off than on to reflect no
+    // circulation.  Nothing fancy, but populates the guage with a
+    // plausible value.
+    float tau; // secs 
+    if(_running) {
+       _oilTempTarget = 363.0f + (30.0f * (power/_power0));
+       tau = 600;
+       // Reduce tau linearly to 300 at max power
+       tau -= (power/_power0) * 300.0f;
+    } else {
+       _oilTempTarget = temp;
+       tau = 1500;             
+    }
+    _dOilTempdt = (_oilTempTarget - _oilTemp) / tau;
 }
 
 }; // namespace yasim
index 8c6690a4ff346552e90bfdf72c4c3c0534bc4912..7ce647acd62eb94f11763a8d8e22e49e84143c97 100644 (file)
@@ -20,8 +20,11 @@ public:
     float getEGT();
     float getMaxPower(); // max sea-level power
     float getBoost() { return _boostPressure; }
+    float getOilTemp() { return _oilTemp; }
 
     virtual void calc(float pressure, float temp, float speed);
+    virtual void stabilize();
+    virtual void integrate(float dt);
     virtual float getTorque();
     virtual float getFuelFlow();
 
@@ -43,6 +46,9 @@ private:
     float _fuelFlow;
     float _egt;
     float _boostPressure;
+    float _oilTemp;
+    float _oilTempTarget;
+    float _dOilTempdt;
 };
 
 }; // namespace yasim
index ad02f3782b84ca1e4dfef25736d3b97ecd942c81..febabc481bbc2dc51907f2e46103d3de7dc0f113 100644 (file)
@@ -91,10 +91,11 @@ void YASim::bind()
 
     char buf[256];
     for(int i=0; i<_fdm->getAirplane()->getModel()->numThrusters(); i++) {
-       sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i); fgUntie(buf);
-       sprintf(buf, "/engines/engine[%d]/rpm", i);           fgUntie(buf);
-       sprintf(buf, "/engines/engine[%d]/mp-osi", i);        fgUntie(buf);
-       sprintf(buf, "/engines/engine[%d]/egt-degf", i);      fgUntie(buf);
+       sprintf(buf, "/engines/engine[%d]/fuel-flow-gph", i);        fgUntie(buf);
+       sprintf(buf, "/engines/engine[%d]/rpm", i);                  fgUntie(buf);
+       sprintf(buf, "/engines/engine[%d]/mp-osi", i);               fgUntie(buf);
+       sprintf(buf, "/engines/engine[%d]/egt-degf", i);             fgUntie(buf);
+       sprintf(buf, "/engines/engine[%d]/oil-temperature-degf", i); fgUntie(buf);
     }
 }