#include "FGTank.h"
+#if !defined ( sgi ) || defined( __GNUC__ ) && (_COMPILER_VERSION < 740)
+using std::cerr;
+using std::endl;
+using std::cout;
+#endif
+
+namespace JSBSim {
+
static const char *IdSrc = "$Id$";
static const char *IdHdr = ID_TANK;
CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-#if !defined ( sgi ) || defined( __GNUC__ )
-using std::cerr;
-using std::endl;
-using std::cout;
-#endif
-
-FGTank::FGTank(FGConfigFile* AC_cfg)
+FGTank::FGTank(FGConfigFile* AC_cfg, FGFDMExec* exec)
{
string token;
-
+ double X, Y, Z;
+ Area = 1.0;
+ Temperature = -9999.0;
+ Auxiliary = exec->GetAuxiliary();
+
type = AC_cfg->GetValue("TYPE");
if (type == "FUEL") Type = ttFUEL;
else if (type == "OXIDIZER") Type = ttOXIDIZER;
else Type = ttUNKNOWN;
-
+
AC_cfg->GetNextConfigLine();
while ((token = AC_cfg->GetValue()) != string("/AC_TANK")) {
if (token == "XLOC") *AC_cfg >> X;
else if (token == "RADIUS") *AC_cfg >> Radius;
else if (token == "CAPACITY") *AC_cfg >> Capacity;
else if (token == "CONTENTS") *AC_cfg >> Contents;
+ else if (token == "TEMPERATURE") *AC_cfg >> Temperature;
else cerr << "Unknown identifier: " << token << " in tank definition." << endl;
}
-
+
+ vXYZ << X << Y << Z;
+
Selected = true;
if (Capacity != 0) {
} else {
Contents = 0;
PctFull = 0;
- }
+ }
+
+ if (Temperature != -9999.0) Temperature = FahrenheitToCelsius(Temperature);
+ Area = 40.0 * pow(Capacity/1975, 0.666666667);
Debug(0);
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-double FGTank::Reduce(double used)
+double FGTank::Drain(double used)
{
- double shortage;
+ double shortage = Contents - used;
- if (used < Contents) {
+ if (shortage >= 0) {
Contents -= used;
PctFull = 100.0*Contents/Capacity;
- return 0.0;
} else {
- shortage = Contents - used;
Contents = 0.0;
PctFull = 0.0;
Selected = false;
- return shortage;
}
+ return shortage;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGTank::Fill(double amount)
+{
+ double overage = 0.0;
+
+ Contents += amount;
+
+ if (Contents > Capacity) {
+ overage = Contents - Capacity;
+ Contents = Capacity;
+ PctFull = 100.0;
+ } else {
+ PctFull = Contents/Capacity*100.0;
+ }
+ return overage;
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+void FGTank::SetContents(double amount)
+{
+ Contents = amount;
+ if (Contents > Capacity) {
+ Contents = Capacity;
+ PctFull = 100.0;
+ } else {
+ PctFull = Contents/Capacity*100.0;
+ }
+}
+
+//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+double FGTank::Calculate(double dt)
+{
+ if (Temperature == -9999.0) return 0.0;
+ double HeatCapacity = 900.0; // Joules/lbm/C
+ double TempFlowFactor = 1.115; // Watts/sqft/C
+ double TAT = Auxiliary->GetTAT_C();
+ double Tdiff = TAT - Temperature;
+ double dT = 0.0; // Temp change due to one surface
+ if (fabs(Tdiff) > 0.1) {
+ dT = (TempFlowFactor * Area * Tdiff * dt) / (Contents * HeatCapacity);
+ }
+ return Temperature += (dT + dT); // For now, assume upper/lower the same
}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if (from == 0) { // Constructor
cout << " " << type << " tank holds " << Capacity << " lbs. " << type << endl;
cout << " currently at " << PctFull << "% of maximum capacity" << endl;
- cout << " Tank location (X, Y, Z): " << X << ", " << Y << ", " << Z << endl;
+ cout << " Tank location (X, Y, Z): " << vXYZ(eX) << ", " << vXYZ(eY) << ", " << vXYZ(eZ) << endl;
cout << " Effective radius: " << Radius << " inches" << endl;
}
}
}
}
}
-
+}