]> 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 f05831b73a0bf6ab7129a32784644f16cb781d0c..6c53d56f2b68b4bf8f4efa6e30dd3145549416a5 100644 (file)
@@ -38,7 +38,6 @@ INCLUDES
 
 #include "FGTank.h"
 #include "FGFDMExec.h"
-#include "models/FGAuxiliary.h"
 #include "input_output/FGXMLElement.h"
 #include "input_output/FGPropertyManager.h"
 #include <iostream>
@@ -48,7 +47,7 @@ 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;
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -66,6 +65,9 @@ FGTank::FGTank(FGFDMExec* exec, Element* el, int tank_number)
   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();
@@ -99,7 +101,7 @@ 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"))
@@ -161,6 +163,9 @@ 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);
@@ -187,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));
 }
@@ -207,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.
@@ -219,7 +226,7 @@ double FGTank::Drain(double used)
     Contents = 0.0;
     PctFull = 0.0;
   }
-
+//  PreviousUsed = AmountToDrain;
   if (grainType != gtUNKNOWN) CalculateInertias();
 
   return remaining;
@@ -266,17 +273,20 @@ void FGTank::SetContentsGallons(double gallons)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-double FGTank::Calculate(double dt)
+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
 }
 
@@ -321,7 +331,7 @@ void FGTank::CalculateInertias(void)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-double FGTank::ProcessFuelName(std::string const& name)
+double FGTank::ProcessFuelName(const std::string& name)
 {
    if      (name == "AVGAS")    return 6.02; 
    else if (name == "JET-A")    return 6.74;