42#include "FGPropeller.h"
45#include "input_output/FGXMLElement.h"
55FGEngine::FGEngine(
int engine_number,
struct Inputs& input)
56 : in(input), EngineNumber(engine_number)
77void FGEngine::ResetToIC(
void)
81 Starved = Running = Cranking =
false;
88 Thruster->ResetToIC();
93double FGEngine::CalcFuelNeed(
void)
95 FuelFlowRate = SLFuelFlowMax*PctPower;
96 FuelExpended = FuelFlowRate*in.TotalDeltaT;
97 if (!Starved) FuelUsedLbs += FuelExpended;
103unsigned int FGEngine::GetSourceTank(
unsigned int i)
const
105 if (i < SourceTanks.size()) {
106 return SourceTanks[i];
108 throw(
"No such source tank is available for this engine");
114double FGEngine::GetThrust(
void)
const
116 return Thruster->GetThrust();
121const FGColumnVector3& FGEngine::GetBodyForces(
void)
123 return Thruster->GetBodyForces();
128const FGColumnVector3& FGEngine::GetMoments(
void)
130 return Thruster->GetMoments();
135void FGEngine::LoadThrusterInputs()
137 Thruster->in.TotalDeltaT = in.TotalDeltaT;
138 Thruster->in.H_agl = in.H_agl;
139 Thruster->in.PQRi = in.PQRi;
140 Thruster->in.AeroPQR = in.AeroPQR;
141 Thruster->in.AeroUVW = in.AeroUVW;
142 Thruster->in.Density = in.Density;
143 Thruster->in.Pressure = in.Pressure;
144 Thruster->in.Soundspeed = in.Soundspeed;
145 Thruster->in.Alpha = in.alpha;
146 Thruster->in.Beta = in.beta;
147 Thruster->in.Vt = in.Vt;
152void FGEngine::LoadThruster(FGFDMExec* exec, Element *thruster_element)
154 if (thruster_element->FindElement(
"propeller")) {
155 Element *document = thruster_element->FindElement(
"propeller");
156 Thruster =
new FGPropeller(exec, document, EngineNumber);
157 }
else if (thruster_element->FindElement(
"nozzle")) {
158 Element *document = thruster_element->FindElement(
"nozzle");
159 Thruster =
new FGNozzle(exec, document, EngineNumber);
160 }
else if (thruster_element->FindElement(
"rotor")) {
161 Element *document = thruster_element->FindElement(
"rotor");
162 Thruster =
new FGRotor(exec, document, EngineNumber);
163 }
else if (thruster_element->FindElement(
"direct")) {
164 Element *document = thruster_element->FindElement(
"direct");
165 Thruster =
new FGThruster(exec, document, EngineNumber);
167 XMLLogException err(thruster_element);
168 err <<
" Unknown thruster type\n";
177bool FGEngine::Load(FGFDMExec *exec, Element *engine_element)
179 Element* parent_element = engine_element->GetParent();
180 Element* local_element;
181 FGColumnVector3 location, orientation;
183 auto PropertyManager = exec->GetPropertyManager();
185 Name = engine_element->GetAttributeValue(
"name");
188 FGModelFunctions::Load(engine_element, exec, to_string((
int)EngineNumber));
192 local_element = parent_element->FindElement(
"location");
194 FGLogging log(LogLevel::WARN);
195 log <<
"Engine location ignored, only thruster location is used.\n";
198 local_element = parent_element->FindElement(
"orient");
200 FGLogging log(LogLevel::WARN);
201 log <<
"Engine orientation ignored, only thruster orientation is used.\n";
205 local_element = parent_element->FindElement(
"thruster");
208 LoadThruster(exec, local_element);
209 }
catch (std::string& str) {
210 XMLLogException err(local_element);
211 err <<
"Error loading engine " << Name <<
". " << str <<
"\n";
213 }
catch (LogException &e) {
214 XMLLogException err(e, local_element);
218 FGLogging log(LogLevel::ERROR);
219 log <<
"No thruster definition supplied with engine definition.\n";
225 local_element = parent_element->FindElement(
"feed");
226 while (local_element) {
227 int tankID = (int)local_element->GetDataAsNumber();
228 SourceTanks.push_back(tankID);
229 local_element = parent_element->FindNextElement(
"feed");
232 string property_name, base_property_name;
233 base_property_name = CreateIndexedPropertyName(
"propulsion/engine", EngineNumber);
235 property_name = base_property_name +
"/set-running";
236 PropertyManager->Tie( property_name.c_str(),
this, &FGEngine::GetRunning, &FGEngine::SetRunning );
237 property_name = base_property_name +
"/thrust-lbs";
238 PropertyManager->Tie( property_name.c_str(), Thruster, &FGThruster::GetThrust);
239 property_name = base_property_name +
"/fuel-flow-rate-pps";
240 PropertyManager->Tie( property_name.c_str(),
this, &FGEngine::GetFuelFlowRate);
241 property_name = base_property_name +
"/fuel-flow-rate-gph";
242 PropertyManager->Tie( property_name.c_str(),
this, &FGEngine::GetFuelFlowRateGPH);
243 property_name = base_property_name +
"/fuel-used-lbs";
244 PropertyManager->Tie( property_name.c_str(),
this, &FGEngine::GetFuelUsedLbs);
246 PostLoad(engine_element, exec, to_string((
int)EngineNumber));
272void FGEngine::Debug(
int from)
274 if (debug_lvl <= 0)
return;
281 FGLogging log(LogLevel::DEBUG);
282 log <<
" X = " << Thruster->GetLocationX() <<
"\n";
283 log <<
" Y = " << Thruster->GetLocationY() <<
"\n";
284 log <<
" Z = " << Thruster->GetLocationZ() <<
"\n";
285 log <<
" Pitch = " << radtodeg*Thruster->GetAnglesToBody(ePitch) <<
" degrees\n";
286 log <<
" Yaw = " << radtodeg*Thruster->GetAnglesToBody(eYaw) <<
" degrees\n";
289 if (debug_lvl & 2 ) {
290 FGLogging log(LogLevel::DEBUG);
291 if (from == 0) log <<
"Instantiated: FGEngine\n";
292 if (from == 1) log <<
"Destroyed: FGEngine\n";
294 if (debug_lvl & 4 ) {
296 if (debug_lvl & 8 ) {
298 if (debug_lvl & 16) {
300 if (debug_lvl & 64) {
Main namespace for the JSBSim Flight Dynamics Model.
Type
The possible types of an SGPropertyNode.