]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/models/propulsion/FGTank.cpp
Better fix for a compilation problem with MSVC 2012
[flightgear.git] / src / FDM / JSBSim / models / propulsion / FGTank.cpp
index 56e68d08fd18f2015b1c41fcdb93d1b5c5e47d14..6c53d56f2b68b4bf8f4efa6e30dd3145549416a5 100644 (file)
@@ -37,15 +37,17 @@ INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
 #include "FGTank.h"
-#include "models/FGAuxiliary.h"
+#include "FGFDMExec.h"
+#include "input_output/FGXMLElement.h"
+#include "input_output/FGPropertyManager.h"
+#include <iostream>
+#include <cstdlib>
 
-using std::cerr;
-using std::endl;
-using std::cout;
+using namespace std;
 
 namespace JSBSim {
 
-static const char *IdSrc = "$Id$";
+static const char *IdSrc = "$Id: FGTank.cpp,v 1.33 2011/10/31 14:54:41 bcoconni Exp $";
 static const char *IdHdr = ID_TANK;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -55,13 +57,17 @@ CLASS IMPLEMENTATION
 FGTank::FGTank(FGFDMExec* exec, Element* el, int tank_number)
                   : TankNumber(tank_number), Exec(exec)
 {
-  string token;
+  string token, strFuelName;
   Element* element;
   Element* element_Grain;
   Area = 1.0;
-  Temperature = -9999.0;
+  Density = 6.6;
+  InitialTemperature = Temperature = -9999.0;
   Ixx = Iyy = Izz = 0.0;
   Radius = Contents = Standpipe = Length = InnerRadius = 0.0;
+  PreviousUsed = 0.0;
+  ExternalFlow = 0.0;
+  InitialStandpipe = 0.0;
   Capacity = 0.00001;
   Priority = InitialPriority = 1;
   PropertyManager = Exec->GetPropertyManager();
@@ -95,7 +101,12 @@ FGTank::FGTank(FGFDMExec* exec, Element* el, int tank_number)
   if (el->FindElement("standpipe"))
     InitialStandpipe = Standpipe = el->FindElementValueAsNumberConvertTo("standpipe", "LBS");
   if (el->FindElement("priority"))
-    InitialPriority = Priority = el->FindElementValueAsNumber("priority");
+    InitialPriority = Priority = (int)el->FindElementValueAsNumber("priority");
+  if (el->FindElement("density"))
+    Density = el->FindElementValueAsNumberConvertTo("density", "LBS/GAL");
+  if (el->FindElement("type"))
+    strFuelName = el->FindElementValue("type");
+
 
   SetPriority( InitialPriority );     // this will also set the Selected flag
 
@@ -152,10 +163,16 @@ FGTank::FGTank(FGFDMExec* exec, Element* el, int tank_number)
   property_name = base_property_name + "/priority";
   PropertyManager->Tie( property_name.c_str(), (FGTank*)this, &FGTank::GetPriority,
                                        &FGTank::SetPriority );
+  property_name = base_property_name + "/external-flow-rate-pps";
+  PropertyManager->Tie( property_name.c_str(), (FGTank*)this, &FGTank::GetExternalFlow,
+                                       &FGTank::SetExternalFlow );
 
   if (Temperature != -9999.0)  InitialTemperature = Temperature = FahrenheitToCelsius(Temperature);
   Area = 40.0 * pow(Capacity/1975, 0.666666667);
 
+  // A named fuel type will override a previous density value
+  if (!strFuelName.empty()) Density = ProcessFuelName(strFuelName); 
+
   Debug(0);
 }
 
@@ -175,18 +192,19 @@ void FGTank::ResetToIC(void)
   SetContents ( InitialContents );
   PctFull = 100.0*Contents/Capacity;
   SetPriority( InitialPriority );
+  PreviousUsed = 0.0;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-const FGColumnVector3 FGTank::GetXYZ(void)
+FGColumnVector3 FGTank::GetXYZ(void) const
 {
   return vXYZ_drain + (Contents/Capacity)*(vXYZ - vXYZ_drain);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-const double FGTank::GetXYZ(int idx)
+double FGTank::GetXYZ(int idx) const
 {
   return vXYZ_drain(idx) + (Contents/Capacity)*(vXYZ(idx)-vXYZ_drain(idx));
 }
@@ -195,6 +213,7 @@ const double FGTank::GetXYZ(int idx)
 
 double FGTank::Drain(double used)
 {
+//  double AmountToDrain = 2.0*used - PreviousUsed;
   double remaining = Contents - used;
 
   if (remaining >= 0) { // Reduce contents by amount used.
@@ -206,9 +225,8 @@ double FGTank::Drain(double used)
 
     Contents = 0.0;
     PctFull = 0.0;
-    SetPriority(0);
   }
-
+//  PreviousUsed = AmountToDrain;
   if (grainType != gtUNKNOWN) CalculateInertias();
 
   return remaining;
@@ -247,17 +265,28 @@ void FGTank::SetContents(double amount)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-double FGTank::Calculate(double dt)
+void FGTank::SetContentsGallons(double gallons)
+{
+  SetContents(gallons * Density);
+}
+
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGTank::Calculate(double dt, double TAT_C)
 {
+  if(ExternalFlow < 0.) Drain( -ExternalFlow *dt);
+  else Fill(ExternalFlow * dt);
+
   if (Temperature == -9999.0) return 0.0;
   double HeatCapacity = 900.0;        // Joules/lbm/C
   double TempFlowFactor = 1.115;      // Watts/sqft/C
-  double TAT = Exec->GetAuxiliary()->GetTAT_C();
-  double Tdiff = TAT - Temperature;
+  double Tdiff = TAT_C - Temperature;
   double dTemp = 0.0;                 // Temp change due to one surface
   if (fabs(Tdiff) > 0.1) {
     dTemp = (TempFlowFactor * Area * Tdiff * dt) / (Contents * HeatCapacity);
   }
+
   return Temperature += (dTemp + dTemp);    // For now, assume upper/lower the same
 }
 
@@ -300,6 +329,43 @@ void FGTank::CalculateInertias(void)
 
 }
 
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGTank::ProcessFuelName(const std::string& name)
+{
+   if      (name == "AVGAS")    return 6.02; 
+   else if (name == "JET-A")    return 6.74;
+   else if (name == "JET-A1")   return 6.74;
+   else if (name == "JET-B")    return 6.48;
+   else if (name == "JP-1")     return 6.76;
+   else if (name == "JP-2")     return 6.38;
+   else if (name == "JP-3")     return 6.34;
+   else if (name == "JP-4")     return 6.48;
+   else if (name == "JP-5")     return 6.81;
+   else if (name == "JP-6")     return 6.55;
+   else if (name == "JP-7")     return 6.61;
+   else if (name == "JP-8")     return 6.66;
+   else if (name == "JP-8+100") return 6.66;
+ //else if (name == "JP-9")     return 6.74;
+ //else if (name == "JPTS")     return 6.74;
+   else if (name == "RP-1")     return 6.73;
+   else if (name == "T-1")      return 6.88;
+   else if (name == "ETHANOL")  return 6.58;
+   else if (name == "HYDRAZINE")return 8.61;
+   else if (name == "F-34")     return 6.66;
+   else if (name == "F-35")     return 6.74;
+   else if (name == "F-40")     return 6.48;
+   else if (name == "F-44")     return 6.81;
+   else if (name == "AVTAG")    return 6.48;
+   else if (name == "AVCAT")    return 6.81;
+   else {
+     cerr << "Unknown fuel type specified: "<< name << endl;
+   } 
+
+   return 6.6;
+}
+
+
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 //    The bitmasked value choices are as follows:
 //    unset: In this case (the default) JSBSim would only print