]> git.mxchange.org Git - flightgear.git/commitdiff
rocket engine and piston engine fixes
authorehofman <ehofman>
Mon, 2 Nov 2009 12:22:45 +0000 (12:22 +0000)
committerTim Moore <timoore@redhat.com>
Mon, 2 Nov 2009 22:30:56 +0000 (23:30 +0100)
src/FDM/JSBSim/models/propulsion/FGPiston.cpp
src/FDM/JSBSim/models/propulsion/FGRocket.cpp
src/FDM/JSBSim/models/propulsion/FGRocket.h

index 116d20cc037b45caa8c9530ccfb49abc57e1a6e9..7f484e6b9e97ae5594abef65ca45e505f3b29084 100644 (file)
@@ -88,7 +88,7 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number)
   MinManifoldPressure_inHg = 6.5;
   MaxManifoldPressure_inHg = 28.5;
   ISFC = -1;
-  volumetric_efficiency = -0.1;
+  volumetric_efficiency = 0.85;
   Bore = 5.125;
   Stroke = 4.375;
   Cylinders = 4;
@@ -239,32 +239,41 @@ FGPiston::FGPiston(FGFDMExec* exec, Element* el, int engine_number)
 
   StarterHP = sqrt(MaxHP) * 0.4;
   displacement_SI = Displacement * in3tom3;
+  RatedMeanPistonSpeed_fps =  ( MaxRPM * Stroke) / (360); // AKA 2 * (RPM/60) * ( Stroke / 12) or 2NS
 
-  // Create IFSC and VE to match the engine if not provided
-  int calculated_ve=0;
-  if (volumetric_efficiency < 0) {
-      volumetric_efficiency = MaxManifoldPressure_inHg / 29.92;
-      calculated_ve=1;
-  }
+  // Create IFSC to match the engine if not provided
   if (ISFC < 0) {
-      double pmep = MaxManifoldPressure_inHg > 29.92 ? 0 : 29.92 - MaxManifoldPressure_inHg;
+      double pmep = 29.92 - MaxManifoldPressure_inHg;
       pmep *= inhgtopa;
-      double fmep = (18400 * (2*(Stroke/12)*(MaxRPM/60)) * fttom + 46500)/2;
+      double fmep = (18400 * RatedMeanPistonSpeed_fps * fttom + 46500);
       double hp_loss = ((pmep + fmep) * displacement_SI * MaxRPM)/(Cycles*22371);
-      ISFC = ( Displacement * MaxRPM * volumetric_efficiency ) / (9411 * (MaxHP+hp_loss));
+      ISFC = ( 1.1*Displacement * MaxRPM * volumetric_efficiency *(MaxManifoldPressure_inHg / 29.92) ) / (9411 * (MaxHP+hp_loss));
 // cout <<"FMEP: "<< fmep <<" PMEP: "<< pmep << " hp_loss: " <<hp_loss <<endl;
   }
   if ( MaxManifoldPressure_inHg > 29.9 ) {   // Don't allow boosting with a bogus number
       MaxManifoldPressure_inHg = 29.9;
-      if (calculated_ve) volumetric_efficiency = 1.0;
   }
   minMAP = MinManifoldPressure_inHg * inhgtopa;  // inHg to Pa
   maxMAP = MaxManifoldPressure_inHg * inhgtopa;
 
 // For throttle
-  RatedMeanPistonSpeed_fps =  ( MaxRPM * Stroke) / (360); // AKA 2 * (RPM/60) * ( Stroke / 12) or 2NS
-  if(Z_airbox < 998){
-    double Ze=RatedMeanPistonSpeed_fps/PeakMeanPistonSpeed_fps; // engine impedence
+/*
+ * Pm = ( Ze / ( Ze + Zi + Zt ) ) * Pa
+ * Where:
+ * Pm = Manifold Pressure
+ * Pa = Ambient Pressre
+ * Ze = engine impedance, Ze is effectively 1 / Mean Piston Speed  
+ * Zi = airbox impedance
+ * Zt = throttle impedance
+ * 
+ * For the calculation below throttle is fully open or Zt = 0
+ *
+ * 
+ *
+ */
+
+  if(Z_airbox < 0.0){
+    double Ze=PeakMeanPistonSpeed_fps/RatedMeanPistonSpeed_fps; // engine impedence
     Z_airbox = (standard_pressure *Ze / maxMAP) - Ze; // impedence of airbox
   }
   Z_throttle=(((MaxRPM * Stroke) / 360)/((IdleRPM * Stroke) / 360))*(standard_pressure/minMAP - 1) - Z_airbox; // Constant for Throttle impedence
@@ -913,7 +922,9 @@ void FGPiston::Debug(int from)
       cout << "      MaxThrottle: "         << MaxThrottle              << endl;
       cout << "      MinThrottle: "         << MinThrottle              << endl;
       cout << "      ISFC: "                << ISFC                     << endl;
-      cout << "      Volumentric Efficiency: " << volumetric_efficiency    << endl;
+      cout << "      Volumetric Efficiency: " << volumetric_efficiency    << endl;
+      cout << "      PeakMeanPistonSpeed_fps: " << PeakMeanPistonSpeed_fps << endl;
+      cout << "      Intake Impedance Factor: " << Z_airbox << endl;
 
       cout << endl;
       cout << "      Combustion Efficiency table:" << endl;
index 7a72c9fe9fd01e45ff62e218c5cc8d9e75c08394..eab01be1529c2d30939481ee56b17e200cd525c4 100644 (file)
@@ -69,6 +69,7 @@ FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number)
   FuelFlowRate = 0.0;
   OxidizerFlowRate = 0.0;
   SLOxiFlowMax = 0.0;
+  BuildupTime = 0.0;
   It = 0.0;
 
   // Defaults
@@ -77,6 +78,8 @@ FGRocket::FGRocket(FGFDMExec* exec, Element *el, int engine_number)
 
   if (el->FindElement("isp"))
     Isp = el->FindElementValueAsNumber("isp");
+  if (el->FindElement("builduptime"))
+    BuildupTime = el->FindElementValueAsNumber("builduptime");
   if (el->FindElement("maxthrottle"))
     MaxThrottle = el->FindElementValueAsNumber("maxthrottle");
   if (el->FindElement("minthrottle"))
@@ -127,7 +130,6 @@ double FGRocket::Calculate(void)
   if (ThrustTable != 0L) { // Thrust table given -> Solid fuel used
 
     if ((Throttle == 1 || BurnTime > 0.0 ) && !Starved) {
-      BurnTime += State->Getdt();
       double TotalEngineFuelBurned=0.0;
       for (int i=0; i<(int)SourceTanks.size(); i++) {
         FGTank* tank = Propulsion->GetTank(i);
@@ -137,6 +139,11 @@ double FGRocket::Calculate(void)
       }
 
       VacThrust = ThrustTable->GetValue(TotalEngineFuelBurned);
+      if (BurnTime <= BuildupTime && BuildupTime > 0.0) {
+        VacThrust *= sin((BurnTime/BuildupTime)*M_PI/2.0);
+        // VacThrust *= (1-cos((BurnTime/BuildupTime)*M_PI))/2.0; // 1 - cos approach
+      }
+      BurnTime += State->Getdt(); // Increment burn time
     } else {
       VacThrust = 0.0;
     }
index 15235575b9e77aa003c178c3d0da5483950c0b29..b2cb76f4e8cc827969bd5f1d981464fffcdb8ef8 100644 (file)
@@ -200,6 +200,7 @@ private:
   double OxidizerFlowRate;
   double PropellantFlowRate;
   bool Flameout;
+  double BuildupTime;
   FGTable* ThrustTable;
 
   void Debug(int from);