CLASS IMPLEMENTATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-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");
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;
}
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 = Contents - used;
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
+}
+
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
// The bitmasked value choices are as follows:
// unset: In this case (the default) JSBSim would only print