Пример #1
0
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();
}
Пример #2
0
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;
}
Пример #3
0
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;
}