]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGPiston.cpp
Latest JSBSim changes, including some gear tweaking from Jon and some
[flightgear.git] / src / FDM / JSBSim / FGPiston.cpp
index 725499f1a68ecc21032fb64eabe5a9171e5e33a7..56f511a479e11b2e9785dbbfc1c504b276a3772a 100644 (file)
@@ -1,7 +1,8 @@
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
  Module:       FGPiston.cpp
- Author:       Jon S. Berndt
+ Author:       Jon S. Berndt, JSBSim framework
+               Dave Luff, Piston engine model
  Date started: 09/12/2000
  Purpose:      This module models a Piston engine
 
@@ -77,7 +78,6 @@ FGPiston::FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg) : FGEngine(exec),
     else if (token == "IDLERPM") *Eng_cfg >> IdleRPM;
     else if (token == "MAXTHROTTLE") *Eng_cfg >> MaxThrottle;
     else if (token == "MINTHROTTLE") *Eng_cfg >> MinThrottle;
-    else if (token == "SLFUELFLOWMAX") *Eng_cfg >> SLFuelFlowMax;
     else cerr << "Unhandled token in Engine config file: " << token << endl;
   }
 
@@ -85,6 +85,7 @@ FGPiston::FGPiston(FGFDMExec* exec, FGConfigFile* Eng_cfg) : FGEngine(exec),
   crank_counter = 0;
   EngineNumber = 0;
   OilTemp_degK = 298;
+  ManifoldPressure_inHg = Atmosphere->GetPressure() * 0.014138; // psf to in Hg
 
   dt = State->Getdt();
 
@@ -154,7 +155,7 @@ double FGPiston::Calculate(double PowerRequired)
     
   IAS = Auxiliary->GetVcalibratedKTS();
 
-  if (Mixture >= 0.5) {
+  if (Mixture >= 0.3) {
     doEngineStartup();
     doManifoldPressure();
     doAirFlow();
@@ -285,14 +286,21 @@ void FGPiston::doEngineStartup(void)
 
 void FGPiston::doManifoldPressure(void)
 {
-  ManifoldPressure_inHg = MinManifoldPressure_inHg +
-    (Throttle * (MaxManifoldPressure_inHg - MinManifoldPressure_inHg));
+  if (Running || Cranking) {
+    ManifoldPressure_inHg = MinManifoldPressure_inHg +
+            (Throttle * (MaxManifoldPressure_inHg - MinManifoldPressure_inHg));
+  } else {
+    ManifoldPressure_inHg = Atmosphere->GetPressure() * 0.014138; // psf to in Hg
+  }  
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 /**
  * Calculate the air flow through the engine.
  *
+ * At this point, ManifoldPressure_inHg still represents the sea-level
+ * MP, not adjusted for altitude.
+ *
  * Inputs: p_amb, R_air, T_amb, ManifoldPressure_inHg, Displacement,
  *   RPM, volumetric_efficiency
  *
@@ -323,6 +331,10 @@ void FGPiston::doFuelFlow(void)
   double thi_sea_level = 1.3 * Mixture;
   equivalence_ratio = thi_sea_level * p_amb_sea_level / p_amb;
   m_dot_fuel = m_dot_air / 14.7 * equivalence_ratio;
+  FuelFlow_gph = m_dot_fuel
+    * 3600                     // seconds to hours
+    * 2.2046                   // kg to lb
+    / 6.6;                     // lb to gal_us of kerosene
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -342,8 +354,8 @@ void FGPiston::doFuelFlow(void)
 
 void FGPiston::doEnginePower(void)
 {
-  double True_ManifoldPressure_inHg = ManifoldPressure_inHg * p_amb / p_amb_sea_level;
-  double ManXRPM = True_ManifoldPressure_inHg * RPM;
+  ManifoldPressure_inHg *= p_amb / p_amb_sea_level;
+  double ManXRPM = ManifoldPressure_inHg * RPM;
         // FIXME: this needs to be generalized
   Percentage_Power = (6e-9 * ManXRPM * ManXRPM) + (8e-4 * ManXRPM) - 1.0;
   double T_amb_degF = (T_amb * 1.8) - 459.67;
@@ -390,13 +402,24 @@ void FGPiston::doEnginePower(void)
 
 void FGPiston::doEGT(void)
 {
-  combustion_efficiency = Lookup_Combustion_Efficiency->GetValue(equivalence_ratio);
-  double enthalpy_exhaust = m_dot_fuel * calorific_value_fuel * 
-    combustion_efficiency * 0.33;
-  double heat_capacity_exhaust = (Cp_air * m_dot_air) + (Cp_fuel * m_dot_fuel);
-  double delta_T_exhaust = enthalpy_exhaust / heat_capacity_exhaust;
-  ExhaustGasTemp_degK = T_amb + delta_T_exhaust;
-  ExhaustGasTemp_degK *= 0.444 + ((0.544 - 0.444) * Percentage_Power / 100.0);
+  double delta_T_exhaust;
+  double enthalpy_exhaust;
+  double heat_capacity_exhaust;
+  double dEGTdt;
+
+  if ((Running) && (m_dot_air > 0.0)) {  // do the energy balance
+    combustion_efficiency = Lookup_Combustion_Efficiency->GetValue(equivalence_ratio);
+    enthalpy_exhaust = m_dot_fuel * calorific_value_fuel * 
+                              combustion_efficiency * 0.33;
+    heat_capacity_exhaust = (Cp_air * m_dot_air) + (Cp_fuel * m_dot_fuel);
+    delta_T_exhaust = enthalpy_exhaust / heat_capacity_exhaust;
+    ExhaustGasTemp_degK = T_amb + delta_T_exhaust;
+    ExhaustGasTemp_degK *= 0.444 + ((0.544 - 0.444) * Percentage_Power / 100.0);
+  } else {  // Drop towards ambient - guess an appropriate time constant for now
+    dEGTdt = (298.0 - ExhaustGasTemp_degK) / 100.0;
+    delta_T_exhaust = dEGTdt * dt;
+    ExhaustGasTemp_degK += delta_T_exhaust;
+  }
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -529,7 +552,6 @@ void FGPiston::Debug(int from)
       cout << "      IdleRPM: "             << IdleRPM                  << endl;
       cout << "      MaxThrottle: "         << MaxThrottle              << endl;
       cout << "      MinThrottle: "         << MinThrottle              << endl;
-      cout << "      SLFuelFlowMax: "       << SLFuelFlowMax            << endl;
 
       cout << endl;
       cout << "      Combustion Efficiency table:" << endl;
@@ -553,5 +575,17 @@ void FGPiston::Debug(int from)
   }
   if (debug_lvl & 16) { // Sanity checking
   }
+  if (debug_lvl & 64) {
+    if (from == 0) { // Constructor
+      cout << IdSrc << endl;
+      cout << IdHdr << endl;
+    }
+  }
 }
 
+double
+FGPiston::CalcFuelNeed(void)
+{
+                               // FIXME: is this right?
+  return FuelFlow_gph * State->Getdt() * Propulsion->GetRate();
+}