string FGPropulsion::GetPropulsionTankReport() { string out=""; stringstream outstream; /*const FGMatrix33& mTkI =*/ CalculateTankInertias(); for (unsigned int i=0; i<numTanks; i++) { FGTank* tank = Tanks[i]; string tankname=""; if (tank->GetType() == FGTank::ttFUEL && tank->GetGrainType() != FGTank::gtUNKNOWN) { tankname = "Solid Fuel"; } else if (tank->GetType() == FGTank::ttFUEL) { tankname = "Fuel"; } else if (tank->GetType() == FGTank::ttOXIDIZER) { tankname = "Oxidizer"; } else { tankname = "(Unknown tank type)"; } outstream << highint << left << setw(4) << i << setw(30) << tankname << normint << right << setw(10) << tank->GetContents() << setw(8) << tank->GetXYZ(eX) << setw(8) << tank->GetXYZ(eY) << setw(8) << tank->GetXYZ(eZ) << setw(12) << tank->GetIxx() << setw(12) << tank->GetIyy() << setw(12) << tank->GetIzz() << endl; } return outstream.str(); }
bool FGPropulsion::Load(Element* el) { string type, engine_filename; bool ThrottleAdded = false; Debug(2); FGModel::Load(el); // Perform base class Load. // Process tank definitions first to establish the number of fuel tanks Element* tank_element = el->FindElement("tank"); while (tank_element) { Tanks.push_back(new FGTank(FDMExec, tank_element, numTanks)); if (Tanks.back()->GetType() == FGTank::ttFUEL) numFuelTanks++; else if (Tanks.back()->GetType() == FGTank::ttOXIDIZER) numOxiTanks++; else {cerr << "Unknown tank type specified." << endl; return false;} numTanks++; tank_element = el->FindNextElement("tank"); } numSelectedFuelTanks = numFuelTanks; numSelectedOxiTanks = numOxiTanks; Element* engine_element = el->FindElement("engine"); while (engine_element) { engine_filename = engine_element->GetAttributeValue("file"); if (engine_filename.empty()) { cerr << "Engine definition did not supply an engine file." << endl; return false; } engine_filename = FindEngineFullPathname(engine_filename); document = LoadXMLDocument(engine_filename); document->SetParent(engine_element); type = document->GetName(); if (type == "piston_engine") { HavePistonEngine = true; if (!IsBound) bind(); Engines.push_back(new FGPiston(FDMExec, document, numEngines)); } else if (type == "turbine_engine") { HaveTurbineEngine = true; if (!IsBound) bind(); Engines.push_back(new FGTurbine(FDMExec, document, numEngines)); } else if (type == "turboprop_engine") { HaveTurboPropEngine = true; if (!IsBound) bind(); Engines.push_back(new FGTurboProp(FDMExec, document, numEngines)); } else if (type == "rocket_engine") { HaveRocketEngine = true; if (!IsBound) bind(); Engines.push_back(new FGRocket(FDMExec, document, numEngines)); } else if (type == "electric_engine") { HaveElectricEngine = true; if (!IsBound) bind(); Engines.push_back(new FGElectric(FDMExec, document, numEngines)); } else { cerr << "Unknown engine type: " << type << endl; exit(-5); } FCS->AddThrottle(); ThrottleAdded = true; numEngines++; engine_element = el->FindNextElement("engine"); ResetParser(); } CalculateTankInertias(); if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle // Process fuel dump rate if (el->FindElement("dump-rate")) DumpRate = el->FindElementValueAsNumberConvertTo("dump-rate", "LBS/MIN"); PostLoad(el, PropertyManager); return true; }
bool FGPropulsion::Load(Element* el) { FGModelLoader ModelLoader(this); Debug(2); ReadingEngine = false; double FuelDensity = 6.0; Name = "Propulsion Model: " + el->GetAttributeValue("name"); // Perform base class Pre-Load if (!FGModel::Load(el)) return false; // Process tank definitions first to establish the number of fuel tanks Element* tank_element = el->FindElement("tank"); while (tank_element) { Tanks.push_back(new FGTank(FDMExec, tank_element, numTanks)); if (Tanks.back()->GetType() == FGTank::ttFUEL) { FuelDensity = Tanks[numFuelTanks]->GetDensity(); numFuelTanks++; } else if (Tanks.back()->GetType() == FGTank::ttOXIDIZER) numOxiTanks++; else {cerr << "Unknown tank type specified." << endl; return false;} numTanks++; tank_element = el->FindNextElement("tank"); } numSelectedFuelTanks = numFuelTanks; numSelectedOxiTanks = numOxiTanks; ReadingEngine = true; Element* engine_element = el->FindElement("engine"); while (engine_element) { if (!ModelLoader.Open(engine_element)) return false; try { // Locate the thruster definition Element* thruster_element = engine_element->FindElement("thruster"); if (!thruster_element || !ModelLoader.Open(thruster_element)) throw("No thruster definition supplied with engine definition."); if (engine_element->FindElement("piston_engine")) { HavePistonEngine = true; if (!IsBound) bind(); Element *element = engine_element->FindElement("piston_engine"); Engines.push_back(new FGPiston(FDMExec, element, numEngines, in)); } else if (engine_element->FindElement("turbine_engine")) { HaveTurbineEngine = true; if (!IsBound) bind(); Element *element = engine_element->FindElement("turbine_engine"); Engines.push_back(new FGTurbine(FDMExec, element, numEngines, in)); } else if (engine_element->FindElement("turboprop_engine")) { HaveTurboPropEngine = true; if (!IsBound) bind(); Element *element = engine_element->FindElement("turboprop_engine"); Engines.push_back(new FGTurboProp(FDMExec, element, numEngines, in)); } else if (engine_element->FindElement("rocket_engine")) { HaveRocketEngine = true; if (!IsBound) bind(); Element *element = engine_element->FindElement("rocket_engine"); Engines.push_back(new FGRocket(FDMExec, element, numEngines, in)); } else if (engine_element->FindElement("electric_engine")) { HaveElectricEngine = true; if (!IsBound) bind(); Element *element = engine_element->FindElement("electric_engine"); Engines.push_back(new FGElectric(FDMExec, element, numEngines, in)); } else { cerr << engine_element->ReadFrom() << " Unknown engine type" << endl; return false; } } catch (std::string& str) { cerr << endl << fgred << str << reset << endl; return false; } numEngines++; engine_element = el->FindNextElement("engine"); } CalculateTankInertias(); if (el->FindElement("dump-rate")) DumpRate = el->FindElementValueAsNumberConvertTo("dump-rate", "LBS/MIN"); if (el->FindElement("refuel-rate")) RefuelRate = el->FindElementValueAsNumberConvertTo("refuel-rate", "LBS/MIN"); unsigned int i; for (i=0; i<Engines.size(); i++) { Engines[i]->SetFuelDensity(FuelDensity); } PostLoad(el, PropertyManager); return true; }