JSBSim Flight Dynamics Model 1.3.0 (09 Apr 2026)
An Open Source Flight Dynamics and Control Software Library in C++
Loading...
Searching...
No Matches
FGPropeller.cpp
1/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3 Module: FGPropeller.cpp
4 Author: Jon S. Berndt
5 Date started: 08/24/00
6 Purpose: Encapsulates the propeller object
7
8 ------------- Copyright (C) 2000 Jon S. Berndt (jon@jsbsim.org) -------------
9
10 This program is free software; you can redistribute it and/or modify it under
11 the terms of the GNU Lesser General Public License as published by the Free Software
12 Foundation; either version 2 of the License, or (at your option) any later
13 version.
14
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
18 details.
19
20 You should have received a copy of the GNU Lesser General Public License along with
21 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22 Place - Suite 330, Boston, MA 02111-1307, USA.
23
24 Further information about the GNU Lesser General Public License can also be found on
25 the world wide web at http://www.gnu.org.
26
27FUNCTIONAL DESCRIPTION
28--------------------------------------------------------------------------------
29
30HISTORY
31--------------------------------------------------------------------------------
3208/24/00 JSB Created
33
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35INCLUDES
36%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
37
38#include "FGFDMExec.h"
39#include "FGPropeller.h"
40#include "input_output/FGXMLElement.h"
41#include "input_output/FGLog.h"
42
43using namespace std;
44
45namespace JSBSim {
46
47/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48CLASS IMPLEMENTATION
49%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50
51FGPropeller::FGPropeller(FGFDMExec* exec, Element* prop_element, int num)
52 : FGThruster(exec, prop_element, num)
53{
54 Element *table_element, *local_element;
55 string name="";
56 auto PropertyManager = exec->GetPropertyManager();
57
58 MaxPitch = MinPitch = P_Factor = Pitch = Advance = MinRPM = MaxRPM = 0.0;
59 Sense = 1; // default clockwise rotation
60 ReversePitch = 0.0;
61 Reversed = false;
62 Feathered = false;
63 Reverse_coef = 0.0;
64 GearRatio = 1.0;
65 CtFactor = CpFactor = 1.0;
66 ConstantSpeed = 0;
67 cThrust = cPower = CtMach = CpMach = 0;
68 Vinduced = 0.0;
69
70 if (prop_element->FindElement("ixx"))
71 Ixx = max(prop_element->FindElementValueAsNumberConvertTo("ixx", "SLUG*FT2"), 1e-06);
72
73 Sense_multiplier = 1.0;
74 if (prop_element->HasAttribute("version")
75 && prop_element->GetAttributeValueAsNumber("version") > 1.0)
76 Sense_multiplier = -1.0;
77
78 if (prop_element->FindElement("diameter"))
79 Diameter = max(prop_element->FindElementValueAsNumberConvertTo("diameter", "FT"), 0.001);
80 if (prop_element->FindElement("numblades"))
81 numBlades = (int)prop_element->FindElementValueAsNumber("numblades");
82 if (prop_element->FindElement("gearratio"))
83 GearRatio = max(prop_element->FindElementValueAsNumber("gearratio"), 0.001);
84 if (prop_element->FindElement("minpitch"))
85 MinPitch = prop_element->FindElementValueAsNumber("minpitch");
86 if (prop_element->FindElement("maxpitch"))
87 MaxPitch = prop_element->FindElementValueAsNumber("maxpitch");
88 if (prop_element->FindElement("minrpm"))
89 MinRPM = prop_element->FindElementValueAsNumber("minrpm");
90 if (prop_element->FindElement("maxrpm")) {
91 MaxRPM = prop_element->FindElementValueAsNumber("maxrpm");
92 ConstantSpeed = 1;
93 }
94 if (prop_element->FindElement("constspeed"))
95 ConstantSpeed = (int)prop_element->FindElementValueAsNumber("constspeed");
96 if (prop_element->FindElement("reversepitch"))
97 ReversePitch = prop_element->FindElementValueAsNumber("reversepitch");
98 while((table_element = prop_element->FindNextElement("table")) != 0) {
99 name = table_element->GetAttributeValue("name");
100 try {
101 if (name == "C_THRUST") {
102 cThrust = new FGTable(PropertyManager, table_element);
103 } else if (name == "C_POWER") {
104 cPower = new FGTable(PropertyManager, table_element);
105 } else if (name == "CT_MACH") {
106 CtMach = new FGTable(PropertyManager, table_element);
107 } else if (name == "CP_MACH") {
108 CpMach = new FGTable(PropertyManager, table_element);
109 } else {
110 FGXMLLogging log(table_element, LogLevel::ERROR);
111 log << "Unknown table type: " << name << " in propeller definition.\n";
112 }
113 } catch (BaseException& e) {
114 XMLLogException err(table_element);
115 err << "Error loading propeller table:" << name << ". " << e.what() << "\n";
116 throw err;
117 }
118 }
119 if( (cPower == nullptr) || (cThrust == nullptr)){
120 XMLLogException err(prop_element);
121 err << "Propeller configuration must contain C_THRUST and C_POWER tables!\n";
122 throw err;
123 }
124
125 local_element = prop_element->GetParent()->FindElement("sense");
126 if (local_element) {
127 double Sense = local_element->GetDataAsNumber();
128 SetSense(Sense >= 0.0 ? 1.0 : -1.0);
129 }
130 local_element = prop_element->GetParent()->FindElement("p_factor");
131 if (local_element) {
132 P_Factor = local_element->GetDataAsNumber();
133 }
134 if (P_Factor < 0) {
135 XMLLogException err(local_element);
136 err << "P-Factor value in propeller configuration file must be greater than zero\n";
137 throw err;
138 }
139 if (prop_element->FindElement("ct_factor"))
140 SetCtFactor( prop_element->FindElementValueAsNumber("ct_factor") );
141 if (prop_element->FindElement("cp_factor"))
142 SetCpFactor( prop_element->FindElementValueAsNumber("cp_factor") );
143
144 Type = ttPropeller;
145 RPM = 0;
146 vTorque.InitMatrix();
147 D4 = Diameter*Diameter*Diameter*Diameter;
148 D5 = D4*Diameter;
149 Pitch = MinPitch;
150
151 string property_name, base_property_name;
152 base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNum);
153 property_name = base_property_name + "/engine-rpm";
154 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetEngineRPM );
155 property_name = base_property_name + "/advance-ratio";
156 PropertyManager->Tie( property_name.c_str(), &J );
157 property_name = base_property_name + "/blade-angle";
158 PropertyManager->Tie( property_name.c_str(), &Pitch );
159 property_name = base_property_name + "/thrust-coefficient";
160 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetThrustCoefficient );
161 property_name = base_property_name + "/propeller-rpm";
162 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetRPM );
163 property_name = base_property_name + "/helical-tip-Mach";
164 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetHelicalTipMach );
165 property_name = base_property_name + "/constant-speed-mode";
166 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetConstantSpeed,
168 property_name = base_property_name + "/prop-induced-velocity_fps"; // [ft/sec]
169 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetInducedVelocity,
171 property_name = base_property_name + "/propeller-power-ftlbps"; // [ft-lbs/sec]
172 PropertyManager->Tie( property_name.c_str(), &PowerRequired );
173 property_name = base_property_name + "/propeller-torque-ftlb"; // [ft-lbs]
174 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetTorque);
175 property_name = base_property_name + "/propeller-sense";
176 PropertyManager->Tie( property_name.c_str(), &Sense );
177
178 Debug(0);
179}
180
181//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
182
184{
185 delete cThrust;
186 delete cPower;
187 delete CtMach;
188 delete CpMach;
189
190 Debug(1);
191}
192
193//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
194
196{
197 FGThruster::ResetToIC();
198 Vinduced = 0.0;
199}
200
201//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
202//
203// We must be getting the aerodynamic velocity here, NOT the inertial velocity.
204// We need the velocity with respect to the wind.
205//
206// Remembering that Torque * omega = Power, we can derive the torque on the
207// propeller and its acceleration to give a new RPM. The current RPM will be
208// used to calculate thrust.
209//
210// Because RPM could be zero, we need to be creative about what RPM is stated as.
211
212double FGPropeller::Calculate(double EnginePower)
213{
214 FGColumnVector3 vDXYZ = MassBalance->StructuralToBody(vXYZn);
215 const FGMatrix33& mT = Transform();
216 // Local air velocity is obtained from Stevens & Lewis' "Aircraft Control and
217 // Simualtion (3rd edition)" eqn 8.2-1
218 // Variables in.AeroUVW and in.AeroPQR include the wind and turbulence effects
219 // as computed by FGAuxiliary.
220 FGColumnVector3 localAeroVel = mT.Transposed() * (in.AeroUVW + in.AeroPQR*vDXYZ);
221 double omega, PowerAvailable;
222
223 double Vel = localAeroVel(eU);
224 double rho = in.Density;
225 double RPS = RPM/60.0;
226
227 // Calculate helical tip Mach
228 double Area = 0.25*Diameter*Diameter*M_PI;
229 double Vtip = RPS * Diameter * M_PI;
230 HelicalTipMach = sqrt(Vtip*Vtip + Vel*Vel) / in.Soundspeed;
231
232 if (RPS > 0.01) J = Vel / (Diameter * RPS); // Calculate J normally
233 else J = Vel / Diameter;
234
235 PowerAvailable = EnginePower - GetPowerRequired();
236
237 if (MaxPitch == MinPitch) { // Fixed pitch prop
238 ThrustCoeff = cThrust->GetValue(J);
239 } else { // Variable pitch prop
240 ThrustCoeff = cThrust->GetValue(J, Pitch);
241 }
242
243 // Apply optional scaling factor to Ct (default value = 1)
244 ThrustCoeff *= CtFactor;
245
246 // Apply optional Mach effects from CT_MACH table
247 if (CtMach) ThrustCoeff *= CtMach->GetValue(HelicalTipMach);
248
249 Thrust = ThrustCoeff*RPS*RPS*D4*rho;
250
251 // Induced velocity in the propeller disk area. This formula is obtained
252 // from momentum theory - see B. W. McCormick, "Aerodynamics, Aeronautics,
253 // and Flight Mechanics" 1st edition, eqn. 6.15 (propeller analysis chapter).
254 // Since Thrust and Vel can both be negative we need to adjust this formula
255 // To handle sign (direction) separately from magnitude.
256 double Vel2sum = Vel*abs(Vel) + 2.0*Thrust/(rho*Area);
257
258 if( Vel2sum > 0.0)
259 Vinduced = 0.5 * (-Vel + sqrt(Vel2sum));
260 else
261 Vinduced = 0.5 * (-Vel - sqrt(-Vel2sum));
262
263 // P-factor is simulated by a shift of the acting location of the thrust.
264 // The shift is a multiple of the angle between the propeller shaft axis
265 // and the relative wind that goes through the propeller disk.
266 if (P_Factor > 0.0001) {
267 double tangentialVel = localAeroVel.Magnitude(eV, eW);
268
269 if (tangentialVel > 0.0001) {
270 // The angle made locally by the air flow with respect to the propeller
271 // axis is influenced by the induced velocity. This attenuates the
272 // influence of a string cross wind and gives a more realistic behavior.
273 double angle = atan2(tangentialVel, Vel+Vinduced);
274 double factor = Sense * P_Factor * angle / tangentialVel;
275 SetActingLocationY( GetLocationY() + factor * localAeroVel(eW));
276 SetActingLocationZ( GetLocationZ() + factor * localAeroVel(eV));
277 }
278 }
279
280 omega = RPS*2.0*M_PI;
281
282 vFn(eX) = Thrust;
283 vTorque(eX) = -Sense*EnginePower / max(0.01, omega);
284
285 // The Ixx value and rotation speed given below are for rotation about the
286 // natural axis of the engine. The transform takes place in the base class
287 // FGForce::GetBodyForces() function.
288
289 FGColumnVector3 vH(Ixx*omega*Sense*Sense_multiplier, 0.0, 0.0);
290
291 if (omega > 0.01) ExcessTorque = PowerAvailable / omega;
292 else ExcessTorque = PowerAvailable / 1.0;
293
294 RPM = (RPS + ((ExcessTorque / Ixx) / (2.0 * M_PI)) * in.TotalDeltaT) * 60.0;
295
296 if (RPM < 0.0) RPM = 0.0; // Engine won't turn backwards
297
298 // Transform Torque and momentum first, as PQR is used in this
299 // equation and cannot be transformed itself.
300 vMn = in.PQRi*(mT*vH) + mT*vTorque;
301
302 return Thrust; // return thrust in pounds
303}
304
305//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
306
308{
309 double cPReq;
310
311 if (MaxPitch == MinPitch) { // Fixed pitch prop
312 cPReq = cPower->GetValue(J);
313
314 } else { // Variable pitch prop
315
316 if (ConstantSpeed != 0) { // Constant Speed Mode
317
318 // do normal calculation when propeller is neither feathered nor reversed
319 // Note: This method of feathering and reversing was added to support the
320 // turboprop model. It's left here for backward compatiblity, but
321 // now feathering and reversing should be done in Manual Pitch Mode.
322 if (!Feathered) {
323 if (!Reversed) {
324
325 double rpmReq = MinRPM + (MaxRPM - MinRPM) * Advance;
326 double dRPM = rpmReq - RPM;
327 // The pitch of a variable propeller cannot be changed when the RPMs are
328 // too low - the oil pump does not work.
329 if (RPM > 200) Pitch -= dRPM * in.TotalDeltaT;
330 if (Pitch < MinPitch) Pitch = MinPitch;
331 else if (Pitch > MaxPitch) Pitch = MaxPitch;
332
333 } else { // Reversed propeller
334
335 // when reversed calculate propeller pitch depending on throttle lever position
336 // (beta range for taxing full reverse for braking)
337 double PitchReq = MinPitch - ( MinPitch - ReversePitch ) * Reverse_coef;
338 // The pitch of a variable propeller cannot be changed when the RPMs are
339 // too low - the oil pump does not work.
340 if (RPM > 200) Pitch += (PitchReq - Pitch) / 200;
341 if (RPM > MaxRPM) {
342 Pitch += (MaxRPM - RPM) / 50;
343 if (Pitch < ReversePitch) Pitch = ReversePitch;
344 else if (Pitch > MaxPitch) Pitch = MaxPitch;
345 }
346 }
347
348 } else { // Feathered propeller
349 // ToDo: Make feathered and reverse settings done via FGKinemat
350 Pitch += (MaxPitch - Pitch) / 300; // just a guess (about 5 sec to fully feathered)
351 }
352
353 } else { // Manual Pitch Mode, pitch is controlled externally
354
355 }
356
357 cPReq = cPower->GetValue(J, Pitch);
358 }
359
360 // Apply optional scaling factor to Cp (default value = 1)
361 cPReq *= CpFactor;
362
363 // Apply optional Mach effects from CP_MACH table
364 if (CpMach) cPReq *= CpMach->GetValue(HelicalTipMach);
365
366 double RPS = RPM / 60.0;
367 double local_RPS = RPS < 0.01 ? 0.01 : RPS;
368
369 PowerRequired = cPReq*local_RPS*local_RPS*local_RPS*D5*in.Density;
370
371 return PowerRequired;
372}
373
374//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
375
377{
378 // These are moments in lbf per ft : the lever arm along Z generates a moment
379 // along the pitch direction.
380 double p_pitch = Thrust * Sense * (GetActingLocationZ() - GetLocationZ()) / 12.0;
381 // The lever arm along Y generates a moment along the yaw direction.
382 double p_yaw = Thrust * Sense * (GetActingLocationY() - GetLocationY()) / 12.0;
383
384 return FGColumnVector3(0.0, p_pitch, p_yaw);
385}
386
387//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
388
389string FGPropeller::GetThrusterLabels(int id, const string& delimeter)
390{
391 std::ostringstream buf;
392
393 buf << Name << " Torque (engine " << id << ")" << delimeter
394 << Name << " PFactor Pitch (engine " << id << ")" << delimeter
395 << Name << " PFactor Yaw (engine " << id << ")" << delimeter
396 << Name << " Thrust (engine " << id << " in lbs)" << delimeter;
397 if (IsVPitch())
398 buf << Name << " Pitch (engine " << id << ")" << delimeter;
399 buf << Name << " RPM (engine " << id << ")";
400
401 return buf.str();
402}
403
404//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
405
406string FGPropeller::GetThrusterValues(int id, const string& delimeter)
407{
408 std::ostringstream buf;
409
410 FGColumnVector3 vPFactor = GetPFactor();
411 buf << vTorque(eX) << delimeter
412 << vPFactor(ePitch) << delimeter
413 << vPFactor(eYaw) << delimeter
414 << Thrust << delimeter;
415 if (IsVPitch())
416 buf << Pitch << delimeter;
417 buf << RPM;
418
419 return buf.str();
420}
421
422//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
423// The bitmasked value choices are as follows:
424// unset: In this case (the default) JSBSim would only print
425// out the normally expected messages, essentially echoing
426// the config files as they are read. If the environment
427// variable is not set, debug_lvl is set to 1 internally
428// 0: This requests JSBSim not to output any messages
429// whatsoever.
430// 1: This value explicity requests the normal JSBSim
431// startup messages
432// 2: This value asks for a message to be printed out when
433// a class is instantiated
434// 4: When this value is set, a message is displayed when a
435// FGModel object executes its Run() method
436// 8: When this value is set, various runtime state variables
437// are printed out periodically
438// 16: When set various parameters are sanity checked and
439// a message is printed out when they go out of bounds
440
441void FGPropeller::Debug(int from)
442{
443 if (debug_lvl <= 0) return;
444
445 if (debug_lvl & 1) { // Standard console startup message output
446 if (from == 0) { // Constructor
447 FGLogging log(LogLevel::DEBUG);
448 log << "\n Propeller Name: " << Name << "\n";
449 log << " IXX = " << Ixx << "\n";
450 log << " Diameter = " << Diameter << " ft." << "\n";
451 log << " Number of Blades = " << numBlades << "\n";
452 log << " Gear Ratio = " << GearRatio << "\n";
453 log << " Minimum Pitch = " << MinPitch << "\n";
454 log << " Maximum Pitch = " << MaxPitch << "\n";
455 log << " Minimum RPM = " << MinRPM << "\n";
456 log << " Maximum RPM = " << MaxRPM << "\n";
457 }
458 }
459 if (debug_lvl & 2 ) { // Instantiation/Destruction notification
460 FGLogging log(LogLevel::DEBUG);
461 if (from == 0) log << "Instantiated: FGPropeller\n";
462 if (from == 1) log << "Destroyed: FGPropeller\n";
463 }
464 if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
465 }
466 if (debug_lvl & 8 ) { // Runtime state variables
467 }
468 if (debug_lvl & 16) { // Sanity checking
469 }
470 if (debug_lvl & 64) {
471 if (from == 0) { // Constructor
472 }
473 }
474}
475}
Element * FindElement(const std::string &el="")
Searches for a specified element.
double GetAttributeValueAsNumber(const std::string &key)
Retrieves an attribute value as a double precision real number.
std::string GetAttributeValue(const std::string &key)
Retrieves an attribute.
Element * GetParent(void)
Returns a pointer to the parent of an element.
double FindElementValueAsNumberConvertTo(const std::string &el, const std::string &target_units)
Searches for the named element and converts and returns the data belonging to it.
Element * FindNextElement(const std::string &el="")
Searches for the next element as specified.
double GetDataAsNumber(void)
Converts the element data to a number.
bool HasAttribute(const std::string &key)
Determines if an element has the supplied attribute.
double FindElementValueAsNumber(const std::string &el="")
Searches for the named element and returns the data belonging to it as a number.
This class implements a 3 element column vector.
double Magnitude(void) const
Length of the vector.
Encapsulates the JSBSim simulation executive.
Definition FGFDMExec.h:185
std::shared_ptr< FGPropertyManager > GetPropertyManager(void) const
Returns a pointer to the property manager object.
Definition FGFDMExec.h:422
Handles matrix math operations.
Definition FGMatrix33.h:70
FGMatrix33 Transposed(void) const
Transposed matrix.
Definition FGMatrix33.h:221
void SetInducedVelocity(double Vi)
Set the propeller induced velocity.
~FGPropeller()
Destructor for FGPropeller - deletes the FGTable objects.
double Calculate(double EnginePower)
Calculates and returns the thrust produced by this propeller.
double GetPowerRequired(void)
Retrieves the power required (or "absorbed") by the propeller - i.e.
int GetConstantSpeed(void) const
Returns a non-zero value if the propeller is constant speed.
double GetRPM(void) const
Retrieves the RPMs of the propeller.
std::string GetThrusterValues(int id, const std::string &delimeter)
Generate the values for the thruster standard CSV output.
void ResetToIC(void)
Reset the initial conditions.
void SetCtFactor(double ctf)
Sets coefficient of thrust multiplier.
void SetConstantSpeed(int mode)
Sets propeller into constant speed mode, or manual pitch mode.
FGColumnVector3 GetPFactor(void) const
Retrieves the P-Factor constant.
void SetCpFactor(double cpf)
Sets coefficient of power multiplier.
double GetInducedVelocity(void) const
Get the propeller induced velocity.
void SetSense(double s)
Sets the rotation sense of the propeller.
double GetHelicalTipMach(void) const
Retrieves the Mach number at the propeller tips.
std::string GetThrusterLabels(int id, const std::string &delimeter)
Generate the labels for the thruster standard CSV output.
double GetTorque(void) const
Retrieves the Torque in foot-pounds (Don't you love the English system?)
double GetEngineRPM(void) const
Calculates the RPMs of the engine based on gear ratio.
FGPropeller(FGFDMExec *exec, Element *el, int num=0)
Constructor for FGPropeller.
bool IsVPitch(void) const
Returns true of this propeller is variable pitch.
double GetThrustCoefficient(void) const
Retrieves the thrust coefficient.
Lookup table class.
Definition FGTable.h:234
double GetValue(void) const
Get the current table value.
Definition FGTable.cpp:465
Base class for specific thrusting devices such as propellers, nozzles, etc.
Definition FGThruster.h:77
Main namespace for the JSBSim Flight Dynamics Model.
Definition FGFDMExec.cpp:71