X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FFDM%2FJSBSim%2Fmodels%2FFGPropulsion.cpp;h=32d8b42a1df129d58b4b7f022b926f9d6a9107f7;hb=c5c895dae250898d667ae29641c51a550be7ee90;hp=82092f8ade19785820f81653be09810bc9449132;hpb=8be4e97f54121260feb292e1fcbe3d072d28c941;p=flightgear.git diff --git a/src/FDM/JSBSim/models/FGPropulsion.cpp b/src/FDM/JSBSim/models/FGPropulsion.cpp index 82092f8ad..32d8b42a1 100644 --- a/src/FDM/JSBSim/models/FGPropulsion.cpp +++ b/src/FDM/JSBSim/models/FGPropulsion.cpp @@ -6,7 +6,7 @@ Purpose: Encapsulates the set of engines and tanks associated with this aircraft - ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) ------------- + ------------- Copyright (C) 2000 Jon S. Berndt (jon@jsbsim.org) ------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software @@ -45,19 +45,27 @@ INCLUDES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ #include "FGPropulsion.h" -#include -#include -#include -#include -#include -#include -#include -#include +#include "models/FGFCS.h" +#include "models/FGMassBalance.h" +#include "models/propulsion/FGThruster.h" +#include "models/propulsion/FGRocket.h" +#include "models/propulsion/FGTurbine.h" +#include "models/propulsion/FGPiston.h" +#include "models/propulsion/FGElectric.h" +#include "models/propulsion/FGTurboProp.h" +#include "models/propulsion/FGTank.h" +#include "input_output/FGPropertyManager.h" +#include "input_output/FGXMLParse.h" +#include "math/FGColumnVector3.h" +#include #include +#include + +using namespace std; namespace JSBSim { -static const char *IdSrc = "$Id$"; +static const char *IdSrc = "$Id: FGPropulsion.cpp,v 1.43 2010/11/18 12:38:06 jberndt Exp $"; static const char *IdHdr = ID_PROPULSION; extern short debug_lvl; @@ -107,6 +115,8 @@ FGPropulsion::~FGPropulsion() bool FGPropulsion::InitModel(void) { + bool result = true; + if (!FGModel::InitModel()) return false; for (unsigned int i=0; iResetToIC(); @@ -115,18 +125,28 @@ bool FGPropulsion::InitModel(void) switch (Engines[i]->GetType()) { case FGEngine::etPiston: ((FGPiston*)Engines[i])->ResetToIC(); - if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i); + try { + if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i); + } catch (string str) { + cerr << str << endl; + result = false; + } break; case FGEngine::etTurbine: ((FGTurbine*)Engines[i])->ResetToIC(); - if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i); + try { + if (HasInitializedEngines && (InitializedEngines & i)) InitRunning(i); + } catch (string str) { + cerr << str << endl; + result = false; + } break; default: break; } } - return true; + return result; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -138,7 +158,9 @@ bool FGPropulsion::Run(void) if (FGModel::Run()) return true; if (FDMExec->Holding()) return false; - double dt = State->Getdt(); + RunPreFunctions(); + + double dt = FDMExec->GetDeltaT(); vForces.InitMatrix(); vMoments.InitMatrix(); @@ -160,6 +182,8 @@ bool FGPropulsion::Run(void) if (refuel) DoRefuel( dt * rate ); if (dump) DumpFuel( dt * rate ); + RunPostFunctions(); + return false; } @@ -214,14 +238,13 @@ bool FGPropulsion::GetSteadyState(void) void FGPropulsion::InitRunning(int n) { - if (n > 0) { // A specific engine is supposed to be initialized + if (n >= 0) { // A specific engine is supposed to be initialized - if (n >= GetNumEngines() ) { - cerr << "Tried to initialize a non-existent engine!" << endl; - throw; + if (n >= (int)GetNumEngines() ) { + throw(string("Tried to initialize a non-existent engine!")); } - FCS->SetThrottleCmd(n,1); - FCS->SetMixtureCmd(n,1); + FDMExec->GetFCS()->SetThrottleCmd(n,1); + FDMExec->GetFCS()->SetMixtureCmd(n,1); GetEngine(n)->InitRunning(); GetSteadyState(); @@ -231,16 +254,14 @@ void FGPropulsion::InitRunning(int n) } else if (n < 0) { // -1 refers to "All Engines" for (unsigned int i=0; iSetThrottleCmd(i,1); - FCS->SetMixtureCmd(i,1); + FDMExec->GetFCS()->SetThrottleCmd(i,1); + FDMExec->GetFCS()->SetMixtureCmd(i,1); GetEngine(i)->InitRunning(); } GetSteadyState(); InitializedEngines = -1; HasInitializedEngines = true; - } else if (n == 0) { // No engines are to be initialized - // Do nothing } } @@ -253,6 +274,22 @@ bool FGPropulsion::Load(Element* el) 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"); @@ -267,32 +304,37 @@ bool FGPropulsion::Load(Element* el) 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); + try { + 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); + } + } catch (std::string str) { + cerr << endl << fgred << str << reset << endl; + return false; } - FCS->AddThrottle(); + FDMExec->GetFCS()->AddThrottle(); ThrottleAdded = true; numEngines++; @@ -301,34 +343,21 @@ bool FGPropulsion::Load(Element* el) ResetParser(); } - // Process tank definitions - - 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; - CalculateTankInertias(); - if (!ThrottleAdded) FCS->AddThrottle(); // need to have at least one throttle + if (!ThrottleAdded) FDMExec->GetFCS()->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; } //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGPropulsion::FindEngineFullPathname(string engine_filename) +string FGPropulsion::FindEngineFullPathname(const string& engine_filename) { string fullpath, localpath; string enginePath = FDMExec->GetEnginePath(); @@ -356,7 +385,7 @@ string FGPropulsion::FindEngineFullPathname(string engine_filename) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -ifstream* FGPropulsion::FindEngineFile(string engine_filename) +ifstream* FGPropulsion::FindEngineFile(const string& engine_filename) { string fullpath, localpath; string enginePath = FDMExec->GetEnginePath(); @@ -381,7 +410,7 @@ ifstream* FGPropulsion::FindEngineFile(string engine_filename) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGPropulsion::GetPropulsionStrings(string delimeter) +string FGPropulsion::GetPropulsionStrings(const string& delimiter) const { unsigned int i; @@ -391,13 +420,13 @@ string FGPropulsion::GetPropulsionStrings(string delimeter) for (i=0; iGetEngineLabels(delimeter); + PropulsionStrings += Engines[i]->GetEngineLabels(delimiter); } for (i=0; iGetType() == FGTank::ttFUEL) buf << delimeter << "Fuel Tank " << i; - else if (Tanks[i]->GetType() == FGTank::ttOXIDIZER) buf << delimeter << "Oxidizer Tank " << i; + if (Tanks[i]->GetType() == FGTank::ttFUEL) buf << delimiter << "Fuel Tank " << i; + else if (Tanks[i]->GetType() == FGTank::ttOXIDIZER) buf << delimiter << "Oxidizer Tank " << i; } return PropulsionStrings; @@ -405,7 +434,7 @@ string FGPropulsion::GetPropulsionStrings(string delimeter) //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -string FGPropulsion::GetPropulsionValues(string delimeter) +string FGPropulsion::GetPropulsionValues(const string& delimiter) const { unsigned int i; @@ -415,12 +444,12 @@ string FGPropulsion::GetPropulsionValues(string delimeter) for (i=0; iGetEngineValues(delimeter); + PropulsionValues += Engines[i]->GetEngineValues(delimiter); } for (i=0; iGetContents(); } @@ -463,7 +492,7 @@ FGMatrix33& FGPropulsion::CalculateTankInertias(void) tankJ = FGMatrix33(); for (unsigned int i=0; iGetPointmassInertia( lbtoslug * Tanks[i]->GetContents(), + tankJ += FDMExec->GetMassBalance()->GetPointmassInertia( lbtoslug * Tanks[i]->GetContents(), Tanks[i]->GetXYZ() ); tankJ(1,1) += Tanks[i]->GetIxx(); tankJ(2,2) += Tanks[i]->GetIyy();