]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/YASim/PropEngine.cpp
Port over remaining Point3D usage to the more type and unit safe SG* classes.
[flightgear.git] / src / FDM / YASim / PropEngine.cpp
index 7930f26cab5f4eecfd079111e5d016aeb528e00f..c6581f4453e03980c5dab72ae38ad42e9594a02a 100644 (file)
@@ -119,14 +119,27 @@ void PropEngine::stabilize()
 
     bool goingUp = false;
     float step = 10;
-    while(true) {
+
+    // If we cannot manage this in 100 iterations, give up.
+    for (int n = 0; n < 100; n++) {
        float ptau, thrust;
        _prop->calc(_rho, speed, _omega * _gearRatio, &thrust, &ptau);
        _eng->calc(_pressure, _temp, _omega);
         _eng->stabilize();
 
-        // Compute torque as seen by the engine's end of the
-        // gearbox.
+        // Do it again -- the turbo sets the target MP in the first
+        // run, stabilize sets the current to the target, then we need
+        // to run again to get the correct output torque.  Clumsy, but
+        // it works without side effects (other than solver
+        // performance).  In the future, the Engine objects should
+        // store state to allow them to do the work themselves.
+       _eng->calc(_pressure, _temp, _omega);
+
+        // Compute torque as seen by the engine's end of the gearbox.
+        // The propeller will be moving more slowly (for gear ratios
+        // less than one), so it's torque will be higher than the
+        // engine's, so multiply by _gearRatio to get the engine-side
+        // value.
         ptau *= _gearRatio;
         float etau = _eng->getTorque();
        float tdiff = etau - ptau;
@@ -173,6 +186,9 @@ void PropEngine::integrate(float dt)
     _eng->setFuelState(_fuel);
     
     _prop->calc(_rho, speed, _omega * _gearRatio, &thrust, &propTorque);
+    if(_omega == 0.0)
+        _omega = 0.001; // hack to get around reports of NaNs somewhere...
+    propTorque *= _gearRatio;
     _eng->calc(_pressure, _temp, _omega);
     _eng->integrate(dt);
     engTorque = _eng->getTorque();