JSBSim Flight Dynamics Model 1.3.3 (16 Oct 2026)
An Open Source Flight Dynamics and Control Software Library in C++
Loading...
Searching...
No Matches
FGPropeller Class Reference

Detailed Description

FGPropeller models a propeller given the tabular data for Ct (thrust) and Cp (power), indexed by the advance ratio "J".

Configuration File Format

<sense> {1 | -1} </sense>
<p_factor> {number} </p_factor>
<propeller name="{string}" version="{string}">
<ixx> {number} </ixx>
<diameter unit="IN"> {number} </diameter>
<numblades> {number} </numblades>
<gearratio> {number} </gearratio>
<minpitch> {number} </minpitch>
<maxpitch> {number} </maxpitch>
<minrpm> {number} </minrpm>
<maxrpm> {number} </maxrpm>
<constspeed> {number} </constspeed>
<reversepitch> {number} </reversepitch>
<ct_factor> {number} </ct_factor>
<cp_factor> {number} </cp_factor>
<table name="C_THRUST" type="internal">
<tableData>
{numbers}
</tableData>
</table>
<table name="C_POWER" type="internal">
<tableData>
{numbers}
</tableData>
</table>
<table name="CT_MACH" type="internal">
<tableData>
{numbers}
</tableData>
</table>
<table name="CP_MACH" type="internal">
<tableData>
{numbers}
</tableData>
</table>
<table name="CT_RPM_FACTOR" type="internal">
<tableData>
{numbers}
</tableData>
</table>
<table name="CP_RPM_FACTOR" type="internal">
<tableData>
{numbers}
</tableData>
</table>
</propeller>

Configuration Parameters

    <ixx>           - Propeller rotational inertia.
    <diameter>      - Propeller disk diameter.
    <numblades>     - Number of blades.
    <gearratio>     - Ratio of (engine rpm) / (prop rpm).
    <minpitch>      - Minimum blade pitch angle.
    <maxpitch>      - Maximum blade pitch angle.
    <minrpm>        - Minimum rpm target for constant speed propeller.
    <maxrpm>        - Maximum rpm target for constant speed propeller.
    <constspeed>    - 1 = constant speed mode, 0 = manual pitch mode.
    <reversepitch>  - Blade pitch angle for reverse.
    <sense>         - Direction of rotation (1=clockwise as viewed from cockpit,
                        -1=anti-clockwise as viewed from cockpit). Sense is
                       specified in the parent tag of the propeller.
    <p_factor>      - P factor. It is specified in the parent tag of
                       the propeller.
    <ct_factor>     - A multiplier for the coefficients of thrust.
    <cp_factor>     - A multiplier for the coefficients of power.

Two tables are needed. One for coefficient of thrust (Ct) and one for coefficient of power (Cp).

Four tables are optional. CT_MACH and CP_MACH apply a factor to Ct and Cp based on helical tip Mach. CT_RPM_FACTOR and CP_RPM_FACTOR apply a Reynolds-number correction factor indexed by propeller RPM, normalised to 1.0 at the RPM for which the baseline C_THRUST/C_POWER data were measured.

The RPM-indexed Reynolds correction is intended for very small propellers, such as those used on UAVs and MAVs. It assumes that the air viscosity is effectively constant (as is generally reasonable for low-altitude operation) and that the blade-relative airflow is dominated by circumferential velocity, rather than the vehicle's translational velocity. RPM is therefore used as a proxy for the change in Reynolds number; the correction tables do not account for changes in atmospheric properties or flight speed. They should be calibrated for the propeller and operating atmosphere in question, and may need retuning when used in substantially different conditions, for example in the Martian atmosphere.

The parameters <sense> and <p_factor> must be specified at the parent level i.e. in the <thruster> element. This allows to specify different sense and P factor values for each propeller of the model while using the same definition file for all the propellers.

In addition to thrust, the propeller applies two moments to the aircraft:

  • The torque that tends to roll the aircraft in the direction opposite to the propeller rotation,
  • and the gyroscopic moment.

It should be noted that historically the gyroscopic moment had an incorrect sign. The correct sign can be obtained by specifying a version attribute higher than 1.0 to the propeller definition

<propeller name="a_prop" version="1.1">
<!-- propeller definition -->
</propeller>

For backward compatibility, the absence of the version attribute will result in the gyroscopic moment to be computed with the legacy incorrect sign.

Several references were helpful, here:

  • Barnes W. McCormick, "Aerodynamics, Aeronautics, and Flight Mechanics", Wiley & Sons, 1979 ISBN 0-471-03032-5
  • Edwin Hartman, David Biermann, "The Aerodynamic Characteristics of Full Scale Propellers Having 2, 3, and 4 Blades of Clark Y and R.A.F. 6 Airfoil Sections", NACA Report TN-640, 1938 (?)
  • Various NACA Technical Notes and Reports
Author
Jon S. Berndt
See also
FGEngine
FGThruster

Definition at line 194 of file FGPropeller.h.

#include <FGPropeller.h>

+ Inheritance diagram for FGPropeller:
+ Collaboration diagram for FGPropeller:

Public Member Functions

 FGPropeller (FGFDMExec *exec, Element *el, int num=0)
 Constructor for FGPropeller.
 
 ~FGPropeller ()
 Destructor for FGPropeller - deletes the FGTable objects.
 
double Calculate (double EnginePower)
 Calculates and returns the thrust produced by this propeller.
 
int GetConstantSpeed (void) const
 Returns a non-zero value if the propeller is constant speed.
 
double GetCpFactor (void) const
 Retrieves the coefficient of power multiplier.
 
FGTable * GetCpMachTable (void) const
 Retrieves propeller power Mach effects factor.
 
FGTable * GetCPowerRPMTable (void) const
 Retrieves propeller power RPM correction factor table.
 
FGTable * GetCPowerTable (void) const
 Retrieves propeller power table.
 
double GetCtFactor (void) const
 Retrieves the coefficient of thrust multiplier.
 
FGTable * GetCThrustRPMTable (void) const
 Retrieves propeller thrust RPM correction factor table.
 
FGTable * GetCThrustTable (void) const
 Retrieves propeller thrust table.
 
FGTable * GetCtMachTable (void) const
 Retrieves propeller thrust Mach effects factor.
 
double GetDiameter (void) const
 Retrieves the propeller diameter.
 
double GetEngineRPM (void) const
 Calculates the RPMs of the engine based on gear ratio.
 
bool GetFeather (void) const
 Returns true if the propeller is in feathered position.
 
double GetHelicalTipMach (void) const
 Retrieves the Mach number at the propeller tips.
 
double GetInducedVelocity (void) const
 Get the propeller induced velocity.
 
double GetIxx (void) const
 Retrieves the propeller moment of inertia.
 
FGColumnVector3 GetPFactor (void) const
 Retrieves the P-Factor constant.
 
double GetPitch (void) const
 Retrieves the pitch of the propeller in degrees.
 
double GetPowerRequired (void)
 Retrieves the power required (or "absorbed") by the propeller - i.e.
 
bool GetReverse (void) const
 Returns true if the propeller is in reverse position.
 
double GetReverseCoef (void) const
 Retrieves the reverse pitch command.
 
double GetRPM (void) const
 Retrieves the RPMs of the propeller.
 
double GetThrustCoefficient (void) const
 Retrieves the thrust coefficient.
 
std::string GetThrusterLabels (int id, const std::string &delimeter)
 Generate the labels for the thruster standard CSV output.
 
std::string GetThrusterValues (int id, const std::string &delimeter)
 Generate the values for the thruster standard CSV output.
 
double GetTorque (void) const
 Retrieves the Torque in foot-pounds (Don't you love the English system?)
 
bool IsVPitch (void) const
 Returns true of this propeller is variable pitch.
 
void ResetToIC (void)
 Reset the initial conditions.
 
void SetAdvance (double advance)
 Set the propeller pitch.
 
void SetConstantSpeed (int mode)
 Sets propeller into constant speed mode, or manual pitch mode.
 
void SetCpFactor (double cpf)
 Sets coefficient of power multiplier.
 
void SetCtFactor (double ctf)
 Sets coefficient of thrust multiplier.
 
void SetEngineRPM (double rpm)
 Sets the Revolutions Per Minute for the propeller using the engine gear ratio.
 
void SetFeather (bool f)
 If true, sets the propeller in feathered position.
 
void SetInducedVelocity (double Vi)
 Set the propeller induced velocity.
 
void SetPFactor (double pf)
 Sets the P-Factor constant.
 
void SetPitch (double pitch)
 This commands the pitch of the blade to change to the value supplied.
 
void SetReverse (bool r)
 If true, sets the propeller in reversed position.
 
void SetReverseCoef (double c)
 Set the propeller reverse pitch.
 
void SetRPM (double rpm)
 Sets the Revolutions Per Minute for the propeller.
 
void SetSense (double s)
 Sets the rotation sense of the propeller.
 
- Public Member Functions inherited from FGThruster
 FGThruster (FGFDMExec *FDMExec, Element *el, int num)
 Constructor.
 
virtual ~FGThruster ()
 Destructor.
 
double GetGearRatio (void)
 
std::string GetName (void)
 
double GetReverserAngle (void) const
 
double GetThrust (void) const
 
eType GetType (void)
 
void SetName (std::string name)
 
void SetReverserAngle (double angle)
 
- Public Member Functions inherited from FGForce
 FGForce (FGFDMExec *FDMExec)
 Constructor.
 
virtual ~FGForce ()
 Destructor.
 
const FGColumnVector3 & GetActingLocation (void) const
 
double GetActingLocationX (void) const
 
double GetActingLocationY (void) const
 
double GetActingLocationZ (void) const
 
double GetAnglesToBody (int axis) const
 
const FGColumnVector3 & GetAnglesToBody (void) const
 
virtual const FGColumnVector3 & GetBodyForces (void)
 
double GetBodyXForce (void) const
 
double GetBodyYForce (void) const
 
double GetBodyZForce (void) const
 
const FGColumnVector3 & GetLocation (void) const
 
double GetLocationX (void) const
 
double GetLocationY (void) const
 
double GetLocationZ (void) const
 
const FGColumnVector3 & GetMoments (void) const
 
double GetPitch (void) const
 
TransformType GetTransformType (void) const
 
double GetYaw (void) const
 
void SetActingLocation (const FGColumnVector3 &vv)
 
void SetActingLocation (double x, double y, double z)
 Acting point of application.
 
void SetActingLocationX (double x)
 
void SetActingLocationY (double y)
 
void SetActingLocationZ (double z)
 
void SetAnglesToBody (const FGColumnVector3 &vv)
 
void SetAnglesToBody (double broll, double bpitch, double byaw)
 
void SetLocation (const FGColumnVector3 &vv)
 
void SetLocation (double x, double y, double z)
 
void SetLocationX (double x)
 
void SetLocationY (double y)
 
void SetLocationZ (double z)
 
void SetPitch (double pitch)
 
void SetTransformType (TransformType ii)
 
void SetYaw (double yaw)
 
const FGMatrix33 & Transform (void) const
 
void UpdateCustomTransformMatrix (void)
 
- Public Member Functions inherited from FGJSBBase
 FGJSBBase ()
 Constructor for FGJSBBase.
 
virtual ~FGJSBBase ()
 Destructor for FGJSBBase.
 

Additional Inherited Members

- Public Types inherited from FGThruster
enum  eType { ttNozzle , ttRotor , ttPropeller , ttDirect }
 
- Public Types inherited from FGForce
enum  TransformType {
  tNone , tWindBody , tLocalBody , tInertialBody ,
  tCustom
}
 
- Public Types inherited from FGJSBBase
enum  { eL = 1 , eM , eN }
 Moments L, M, N. More...
 
enum  { eP = 1 , eQ , eR }
 Rates P, Q, R. More...
 
enum  { eU = 1 , eV , eW }
 Velocities U, V, W. More...
 
enum  { eX = 1 , eY , eZ }
 Positions X, Y, Z. More...
 
enum  { ePhi = 1 , eTht , ePsi }
 Euler angles Phi, Theta, Psi. More...
 
enum  { eDrag = 1 , eSide , eLift }
 Stability axis forces, Drag, Side force, Lift. More...
 
enum  { eRoll = 1 , ePitch , eYaw }
 Local frame orientation Roll, Pitch, Yaw. More...
 
enum  { eNorth = 1 , eEast , eDown }
 Local frame position North, East, Down. More...
 
enum  { eLat = 1 , eLong , eRad }
 Locations Radius, Latitude, Longitude. More...
 
enum  {
  inNone = 0 , inDegrees , inRadians , inMeters ,
  inFeet
}
 Conversion specifiers. More...
 
- Static Public Member Functions inherited from FGJSBBase
static constexpr double CelsiusToFahrenheit (double celsius)
 Converts from degrees Celsius to degrees Fahrenheit.
 
static constexpr double CelsiusToKelvin (double celsius)
 Converts from degrees Celsius to degrees Kelvin.
 
static constexpr double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine.
 
static constexpr double Constrain (double min, double value, double max)
 Constrain a value between a minimum and a maximum value.
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (double a, float b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, float b)
 Finite precision comparison.
 
static constexpr double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius.
 
static constexpr double FeetToMeters (double measure)
 Converts from feet to meters.
 
static const std::string & GetVersion (void)
 Returns the version number of JSBSim.
 
static constexpr double KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius.
 
static constexpr double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit.
 
static constexpr double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine.
 
static constexpr double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius.
 
static constexpr double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin.
 
static constexpr double sign (double num)
 
- Public Attributes inherited from FGThruster
struct JSBSim::FGThruster::Inputs in
 
- Static Public Attributes inherited from FGJSBBase
static short debug_lvl = 1
 
- Static Protected Member Functions inherited from FGJSBBase
static std::string CreateIndexedPropertyName (const std::string &Property, int index)
 
- Protected Attributes inherited from FGThruster
int EngineNum
 
double GearRatio
 
std::string Name
 
double PowerRequired
 
double ReverserAngle
 
double Thrust
 
double ThrustCoeff
 
eType Type
 
- Protected Attributes inherited from FGForce
FGFDMExec * fdmex
 
std::shared_ptr< FGMassBalance > MassBalance
 
FGMatrix33 mT
 
TransformType ttype
 
FGColumnVector3 vActingXYZn
 
FGColumnVector3 vFn
 
FGColumnVector3 vMn
 
FGColumnVector3 vOrient
 
FGColumnVector3 vXYZn
 
- Static Protected Attributes inherited from FGJSBBase
static constexpr double degtorad = M_PI / 180.
 
static constexpr double fpstokts = 1.0 / ktstofps
 
static constexpr double fttom = 0.3048
 
static constexpr double hptoftlbssec = 550.0
 
static constexpr double in3tom3 = inchtoft*inchtoft*inchtoft/m3toft3
 
static constexpr double inchtoft = 1.0/12.0
 
static constexpr double inhgtopa = 3386.38
 
static const std::string JSBSim_version = JSBSIM_VERSION " " __DATE__ " " __TIME__
 
static constexpr double kgtolb = 2.20462
 
static constexpr double kgtoslug = 0.06852168
 
static constexpr double ktstofps = 1852./(3600*fttom)
 
static constexpr double lbtoslug = 1.0/slugtolb
 
static constexpr double m3toft3 = 1.0/(fttom*fttom*fttom)
 
static const std::string needed_cfg_version = "2.0"
 
static constexpr double psftoinhg = 0.014138
 
static constexpr double psftopa = 47.88
 
static constexpr double radtodeg = 180. / M_PI
 
static constexpr double slugtolb = 32.174049
 Note that definition of lbtoslug by the inverse of slugtolb and not to a different constant you can also get from some tables will make lbtoslug*slugtolb == 1 up to the magnitude of roundoff.
 

Constructor & Destructor Documentation

◆ FGPropeller()

FGPropeller ( FGFDMExec *  exec,
Element *  el,
int  num = 0 
)

Constructor for FGPropeller.

Parameters
execa pointer to the main executive object
ela pointer to the thruster config file XML element
numthe number of this propeller

Definition at line 51 of file FGPropeller.cpp.

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 = 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 = cThrustRPM = cPowerRPM = 0;
68
69 if (prop_element->FindElement("ixx"))
70 Ixx = max(prop_element->FindElementValueAsNumberConvertTo("ixx", "SLUG*FT2"), 1e-06);
71
72 Sense_multiplier = 1.0;
73 if (prop_element->HasAttribute("version")
74 && prop_element->GetAttributeValueAsNumber("version") > 1.0)
75 Sense_multiplier = -1.0;
76
77 if (prop_element->FindElement("diameter"))
78 Diameter = max(prop_element->FindElementValueAsNumberConvertTo("diameter", "FT"), 0.001);
79 if (prop_element->FindElement("numblades"))
80 numBlades = (int)prop_element->FindElementValueAsNumber("numblades");
81 if (prop_element->FindElement("gearratio"))
82 GearRatio = max(prop_element->FindElementValueAsNumber("gearratio"), 0.001);
83 if (prop_element->FindElement("minpitch"))
84 MinPitch = prop_element->FindElementValueAsNumber("minpitch");
85 if (prop_element->FindElement("maxpitch"))
86 MaxPitch = prop_element->FindElementValueAsNumber("maxpitch");
87 if (prop_element->FindElement("minrpm"))
88 MinRPM = prop_element->FindElementValueAsNumber("minrpm");
89 if (prop_element->FindElement("maxrpm")) {
90 MaxRPM = prop_element->FindElementValueAsNumber("maxrpm");
91 ConstantSpeed = 1;
92 }
93 if (prop_element->FindElement("constspeed"))
94 ConstantSpeed = (int)prop_element->FindElementValueAsNumber("constspeed");
95 if (prop_element->FindElement("reversepitch"))
96 ReversePitch = prop_element->FindElementValueAsNumber("reversepitch");
97 while((table_element = prop_element->FindNextElement("table")) != 0) {
98 name = table_element->GetAttributeValue("name");
99 try {
100 if (name == "C_THRUST") {
101 cThrust = new FGTable(PropertyManager, table_element);
102 } else if (name == "C_POWER") {
103 cPower = new FGTable(PropertyManager, table_element);
104 } else if (name == "CT_MACH") {
105 CtMach = new FGTable(PropertyManager, table_element);
106 } else if (name == "CP_MACH") {
107 CpMach = new FGTable(PropertyManager, table_element);
108 } else if (name == "CT_RPM_FACTOR") {
109 cThrustRPM = new FGTable(PropertyManager, table_element);
110 } else if (name == "CP_RPM_FACTOR") {
111 cPowerRPM = new FGTable(PropertyManager, table_element);
112 } else {
113 FGXMLLogging log(table_element, LogLevel::ERROR);
114 log << "Unknown table type: " << name << " in propeller definition.\n";
115 }
116 } catch (BaseException& e) {
117 XMLLogException err(table_element);
118 err << "Error loading propeller table:" << name << ". " << e.what() << "\n";
119 throw err;
120 }
121 }
122 if( (cPower == nullptr) || (cThrust == nullptr)){
123 XMLLogException err(prop_element);
124 err << "Propeller configuration must contain C_THRUST and C_POWER tables!\n";
125 throw err;
126 }
127
128 local_element = prop_element->GetParent()->FindElement("sense");
129 if (local_element) {
130 double Sense = local_element->GetDataAsNumber();
131 SetSense(Sense >= 0.0 ? 1.0 : -1.0);
132 }
133 local_element = prop_element->GetParent()->FindElement("p_factor");
134 if (local_element) {
135 P_Factor = local_element->GetDataAsNumber();
136 }
137 if (P_Factor < 0) {
138 XMLLogException err(local_element);
139 err << "P-Factor value in propeller configuration file must be greater than zero\n";
140 throw err;
141 }
142 if (prop_element->FindElement("ct_factor"))
143 SetCtFactor( prop_element->FindElementValueAsNumber("ct_factor") );
144 if (prop_element->FindElement("cp_factor"))
145 SetCpFactor( prop_element->FindElementValueAsNumber("cp_factor") );
146
147 Type = ttPropeller;
148 vTorque.InitMatrix();
149 D4 = Diameter*Diameter*Diameter*Diameter;
150 D5 = D4*Diameter;
151 InitDynamics();
152
153 string property_name, base_property_name;
154 base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNum);
155 property_name = base_property_name + "/engine-rpm";
156 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetEngineRPM );
157 property_name = base_property_name + "/advance-ratio";
158 PropertyManager->Tie( property_name.c_str(), &J );
159 property_name = base_property_name + "/blade-angle";
160 PropertyManager->Tie( property_name.c_str(), &Pitch );
161 property_name = base_property_name + "/thrust-coefficient";
162 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetThrustCoefficient );
163 property_name = base_property_name + "/propeller-rpm";
164 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetRPM );
165 property_name = base_property_name + "/helical-tip-Mach";
166 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetHelicalTipMach );
167 property_name = base_property_name + "/constant-speed-mode";
168 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetConstantSpeed,
170 property_name = base_property_name + "/prop-induced-velocity_fps"; // [ft/sec]
171 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetInducedVelocity,
173 property_name = base_property_name + "/propeller-power-ftlbps"; // [ft-lbs/sec]
174 PropertyManager->Tie( property_name.c_str(), &PowerRequired );
175 property_name = base_property_name + "/propeller-torque-ftlb"; // [ft-lbs]
176 PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetTorque);
177 property_name = base_property_name + "/propeller-sense";
178 PropertyManager->Tie( property_name.c_str(), &Sense );
179
180 Debug(0);
181}
void SetInducedVelocity(double Vi)
Set the propeller induced velocity.
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.
void SetCtFactor(double ctf)
Sets coefficient of thrust multiplier.
void SetConstantSpeed(int mode)
Sets propeller into constant speed mode, or manual pitch mode.
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.
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.
double GetThrustCoefficient(void) const
Retrieves the thrust coefficient.
FGThruster(FGFDMExec *FDMExec, Element *el, int num)
Constructor.
+ Here is the call graph for this function:

◆ ~FGPropeller()

Destructor for FGPropeller - deletes the FGTable objects.

Definition at line 185 of file FGPropeller.cpp.

186{
187 delete cThrust;
188 delete cPower;
189 delete CtMach;
190 delete CpMach;
191 delete cThrustRPM;
192 delete cPowerRPM;
193
194 Debug(1);
195}

Member Function Documentation

◆ Calculate()

double Calculate ( double  EnginePower)
virtual

Calculates and returns the thrust produced by this propeller.

Given the excess power available from the engine (in foot-pounds), the thrust is calculated, as well as the current RPM. The RPM is calculated by integrating the torque provided by the engine over what the propeller "absorbs" (essentially the "drag" of the propeller).

Parameters
PowerAvailablethis is the excess power provided by the engine to accelerate the prop. It could be negative, dictating that the propeller would be slowed.
Returns
the thrust in pounds

Reimplemented from FGThruster.

Definition at line 225 of file FGPropeller.cpp.

226{
227 FGColumnVector3 vDXYZ = MassBalance->StructuralToBody(vXYZn);
228 const FGMatrix33& mT = Transform();
229 // Local air velocity is obtained from Stevens & Lewis' "Aircraft Control and
230 // Simualtion (3rd edition)" eqn 8.2-1
231 // Variables in.AeroUVW and in.AeroPQR include the wind and turbulence effects
232 // as computed by FGAuxiliary.
233 FGColumnVector3 localAeroVel = mT.Transposed() * (in.AeroUVW + in.AeroPQR*vDXYZ);
234 double omega, PowerAvailable;
235
236 double Vel = localAeroVel(eU);
237 double rho = in.Density;
238 double RPS = RPM/60.0;
239
240 // Calculate helical tip Mach
241 double Area = 0.25*Diameter*Diameter*M_PI;
242 double Vtip = RPS * Diameter * M_PI;
243 HelicalTipMach = sqrt(Vtip*Vtip + Vel*Vel) / in.Soundspeed;
244
245 if (RPS > 0.01) J = Vel / (Diameter * RPS); // Calculate J normally
246 else J = Vel / Diameter;
247
248 PowerAvailable = EnginePower - GetPowerRequired();
249
250 if (MaxPitch == MinPitch) { // Fixed pitch prop
251 ThrustCoeff = cThrust->GetValue(J);
252 } else { // Variable pitch prop
253 ThrustCoeff = cThrust->GetValue(J, Pitch);
254 }
255
256 // Apply optional scaling factor to Ct (default value = 1)
257 ThrustCoeff *= CtFactor;
258
259 // Apply optional Mach effects from CT_MACH table
260 if (CtMach) ThrustCoeff *= CtMach->GetValue(HelicalTipMach);
261
262 // Apply optional Reynolds-number correction indexed by RPM
263 if (cThrustRPM) ThrustCoeff *= cThrustRPM->GetValue(RPM);
264
265 Thrust = ThrustCoeff*RPS*RPS*D4*rho;
266
267 // Induced velocity in the propeller disk area. This formula is obtained
268 // from momentum theory - see B. W. McCormick, "Aerodynamics, Aeronautics,
269 // and Flight Mechanics" 1st edition, eqn. 6.15 (propeller analysis chapter).
270 // Since Thrust and Vel can both be negative we need to adjust this formula
271 // To handle sign (direction) separately from magnitude.
272 double Vel2sum = Vel*abs(Vel) + 2.0*Thrust/(rho*Area);
273
274 if( Vel2sum > 0.0)
275 Vinduced = 0.5 * (-Vel + sqrt(Vel2sum));
276 else
277 Vinduced = 0.5 * (-Vel - sqrt(-Vel2sum));
278
279 // P-factor is simulated by a shift of the acting location of the thrust.
280 // The shift is a multiple of the angle between the propeller shaft axis
281 // and the relative wind that goes through the propeller disk.
282 if (P_Factor > 0.0001) {
283 double tangentialVel = localAeroVel.Magnitude(eV, eW);
284
285 if (tangentialVel > 0.0001) {
286 // The angle made locally by the air flow with respect to the propeller
287 // axis is influenced by the induced velocity. This attenuates the
288 // influence of a string cross wind and gives a more realistic behavior.
289 double angle = atan2(tangentialVel, Vel+Vinduced);
290 double factor = Sense * P_Factor * angle / tangentialVel;
291 SetActingLocationY( GetLocationY() + factor * localAeroVel(eW));
292 SetActingLocationZ( GetLocationZ() + factor * localAeroVel(eV));
293 }
294 }
295
296 omega = RPS*2.0*M_PI;
297
298 vFn(eX) = Thrust;
299 vTorque(eX) = -Sense*EnginePower / max(0.01, omega);
300
301 // The Ixx value and rotation speed given below are for rotation about the
302 // natural axis of the engine. The transform takes place in the base class
303 // FGForce::GetBodyForces() function.
304
305 FGColumnVector3 vH(Ixx*omega*Sense*Sense_multiplier, 0.0, 0.0);
306
307 if (omega > 0.01) ExcessTorque = PowerAvailable / omega;
308 else ExcessTorque = PowerAvailable / 1.0;
309
310 RPM = (RPS + ((ExcessTorque / Ixx) / (2.0 * M_PI)) * in.TotalDeltaT) * 60.0;
311
312 if (RPM < 0.0) RPM = 0.0; // Engine won't turn backwards
313
314 // Transform Torque and momentum first, as PQR is used in this
315 // equation and cannot be transformed itself.
316 vMn = in.PQRi*(mT*vH) + mT*vTorque;
317
318 return Thrust; // return thrust in pounds
319}
double GetPowerRequired(void)
Retrieves the power required (or "absorbed") by the propeller - i.e.
double GetValue(void) const
Get the current table value.
Definition FGTable.cpp:552
+ Here is the call graph for this function:

◆ GetConstantSpeed()

int GetConstantSpeed ( void  ) const
inline

Returns a non-zero value if the propeller is constant speed.

Definition at line 335 of file FGPropeller.h.

335{return ConstantSpeed;}
+ Here is the caller graph for this function:

◆ GetCpFactor()

double GetCpFactor ( void  ) const
inline

Retrieves the coefficient of power multiplier.

Definition at line 272 of file FGPropeller.h.

272{ return CpFactor; }

◆ GetCpMachTable()

FGTable * GetCpMachTable ( void  ) const
inline

Retrieves propeller power Mach effects factor.

Definition at line 285 of file FGPropeller.h.

285{ return CpMach; }

◆ GetCPowerRPMTable()

FGTable * GetCPowerRPMTable ( void  ) const
inline

Retrieves propeller power RPM correction factor table.

Definition at line 290 of file FGPropeller.h.

290{ return cPowerRPM; }

◆ GetCPowerTable()

FGTable * GetCPowerTable ( void  ) const
inline

Retrieves propeller power table.

Definition at line 280 of file FGPropeller.h.

280{ return cPower; }

◆ GetCtFactor()

double GetCtFactor ( void  ) const
inline

Retrieves the coefficient of thrust multiplier.

Definition at line 269 of file FGPropeller.h.

269{ return CtFactor; }

◆ GetCThrustRPMTable()

FGTable * GetCThrustRPMTable ( void  ) const
inline

Retrieves propeller thrust RPM correction factor table.

Definition at line 288 of file FGPropeller.h.

288{ return cThrustRPM; }

◆ GetCThrustTable()

FGTable * GetCThrustTable ( void  ) const
inline

Retrieves propeller thrust table.

Definition at line 278 of file FGPropeller.h.

278{ return cThrust;}

◆ GetCtMachTable()

FGTable * GetCtMachTable ( void  ) const
inline

Retrieves propeller thrust Mach effects factor.

Definition at line 283 of file FGPropeller.h.

283{ return CtMach; }

◆ GetDiameter()

double GetDiameter ( void  ) const
inline

Retrieves the propeller diameter.

Definition at line 275 of file FGPropeller.h.

275{ return Diameter; }

◆ GetEngineRPM()

double GetEngineRPM ( void  ) const
inlinevirtual

Calculates the RPMs of the engine based on gear ratio.

Reimplemented from FGThruster.

Definition at line 263 of file FGPropeller.h.

263{ return RPM * GearRatio; }
+ Here is the caller graph for this function:

◆ GetFeather()

bool GetFeather ( void  ) const
inline

Returns true if the propeller is in feathered position.

Definition at line 329 of file FGPropeller.h.

329{ return Feathered; }

◆ GetHelicalTipMach()

double GetHelicalTipMach ( void  ) const
inline

Retrieves the Mach number at the propeller tips.

Definition at line 333 of file FGPropeller.h.

333{return HelicalTipMach;}
+ Here is the caller graph for this function:

◆ GetInducedVelocity()

double GetInducedVelocity ( void  ) const
inline

Get the propeller induced velocity.

Definition at line 339 of file FGPropeller.h.

339{return Vinduced;}
+ Here is the caller graph for this function:

◆ GetIxx()

double GetIxx ( void  ) const
inline

Retrieves the propeller moment of inertia.

Definition at line 266 of file FGPropeller.h.

266{ return Ixx; }

◆ GetPFactor()

FGColumnVector3 GetPFactor ( void  ) const

Retrieves the P-Factor constant.

Definition at line 395 of file FGPropeller.cpp.

396{
397 // These are moments in lbf per ft : the lever arm along Z generates a moment
398 // along the pitch direction.
399 double p_pitch = Thrust * Sense * (GetActingLocationZ() - GetLocationZ()) / 12.0;
400 // The lever arm along Y generates a moment along the yaw direction.
401 double p_yaw = Thrust * Sense * (GetActingLocationY() - GetLocationY()) / 12.0;
402
403 return FGColumnVector3(0.0, p_pitch, p_yaw);
404}
+ Here is the caller graph for this function:

◆ GetPitch()

double GetPitch ( void  ) const
inline

Retrieves the pitch of the propeller in degrees.

Definition at line 257 of file FGPropeller.h.

257{ return Pitch; }

◆ GetPowerRequired()

double GetPowerRequired ( void  )
virtual

Retrieves the power required (or "absorbed") by the propeller - i.e.

the power required to keep spinning the propeller at the current velocity, air density, and rotational rate.

Reimplemented from FGThruster.

Definition at line 323 of file FGPropeller.cpp.

324{
325 double cPReq;
326
327 if (MaxPitch == MinPitch) { // Fixed pitch prop
328 cPReq = cPower->GetValue(J);
329
330 } else { // Variable pitch prop
331
332 if (ConstantSpeed != 0) { // Constant Speed Mode
333
334 // do normal calculation when propeller is neither feathered nor reversed
335 // Note: This method of feathering and reversing was added to support the
336 // turboprop model. It's left here for backward compatiblity, but
337 // now feathering and reversing should be done in Manual Pitch Mode.
338 if (!Feathered) {
339 if (!Reversed) {
340
341 double rpmReq = MinRPM + (MaxRPM - MinRPM) * Advance;
342 double dRPM = rpmReq - RPM;
343 // The pitch of a variable propeller cannot be changed when the RPMs are
344 // too low - the oil pump does not work.
345 if (RPM > 200) Pitch -= dRPM * in.TotalDeltaT;
346 if (Pitch < MinPitch) Pitch = MinPitch;
347 else if (Pitch > MaxPitch) Pitch = MaxPitch;
348
349 } else { // Reversed propeller
350
351 // when reversed calculate propeller pitch depending on throttle lever position
352 // (beta range for taxing full reverse for braking)
353 double PitchReq = MinPitch - ( MinPitch - ReversePitch ) * Reverse_coef;
354 // The pitch of a variable propeller cannot be changed when the RPMs are
355 // too low - the oil pump does not work.
356 if (RPM > 200) Pitch += (PitchReq - Pitch) / 200;
357 if (RPM > MaxRPM) {
358 Pitch += (MaxRPM - RPM) / 50;
359 if (Pitch < ReversePitch) Pitch = ReversePitch;
360 else if (Pitch > MaxPitch) Pitch = MaxPitch;
361 }
362 }
363
364 } else { // Feathered propeller
365 // ToDo: Make feathered and reverse settings done via FGKinemat
366 Pitch += (MaxPitch - Pitch) / 300; // just a guess (about 5 sec to fully feathered)
367 }
368
369 } else { // Manual Pitch Mode, pitch is controlled externally
370
371 }
372
373 cPReq = cPower->GetValue(J, Pitch);
374 }
375
376 // Apply optional scaling factor to Cp (default value = 1)
377 cPReq *= CpFactor;
378
379 // Apply optional Mach effects from CP_MACH table
380 if (CpMach) cPReq *= CpMach->GetValue(HelicalTipMach);
381
382 // Apply optional Reynolds-number correction indexed by RPM
383 if (cPowerRPM) cPReq *= cPowerRPM->GetValue(RPM);
384
385 double RPS = RPM / 60.0;
386 double local_RPS = RPS < 0.01 ? 0.01 : RPS;
387
388 PowerRequired = cPReq*local_RPS*local_RPS*local_RPS*D5*in.Density;
389
390 return PowerRequired;
391}
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ GetReverse()

bool GetReverse ( void  ) const
inline

Returns true if the propeller is in reverse position.

Definition at line 325 of file FGPropeller.h.

325{ return Reversed; }

◆ GetReverseCoef()

double GetReverseCoef ( void  ) const
inline

Retrieves the reverse pitch command.

Definition at line 321 of file FGPropeller.h.

321{ return Reverse_coef; }

◆ GetRPM()

double GetRPM ( void  ) const
inlinevirtual

Retrieves the RPMs of the propeller.

Reimplemented from FGThruster.

Definition at line 260 of file FGPropeller.h.

260{ return RPM; }
+ Here is the caller graph for this function:

◆ GetThrustCoefficient()

double GetThrustCoefficient ( void  ) const
inline

Retrieves the thrust coefficient.

Definition at line 331 of file FGPropeller.h.

331{return ThrustCoeff;}
+ Here is the caller graph for this function:

◆ GetThrusterLabels()

string GetThrusterLabels ( int  id,
const std::string &  delimeter 
)
virtual

Generate the labels for the thruster standard CSV output.

Reimplemented from FGThruster.

Definition at line 408 of file FGPropeller.cpp.

409{
410 std::ostringstream buf;
411
412 buf << Name << " Torque (engine " << id << ")" << delimeter
413 << Name << " PFactor Pitch (engine " << id << ")" << delimeter
414 << Name << " PFactor Yaw (engine " << id << ")" << delimeter
415 << Name << " Thrust (engine " << id << " in lbs)" << delimeter;
416 if (IsVPitch())
417 buf << Name << " Pitch (engine " << id << ")" << delimeter;
418 buf << Name << " RPM (engine " << id << ")";
419
420 return buf.str();
421}
bool IsVPitch(void) const
Returns true of this propeller is variable pitch.
+ Here is the call graph for this function:

◆ GetThrusterValues()

string GetThrusterValues ( int  id,
const std::string &  delimeter 
)
virtual

Generate the values for the thruster standard CSV output.

Reimplemented from FGThruster.

Definition at line 425 of file FGPropeller.cpp.

426{
427 std::ostringstream buf;
428
429 FGColumnVector3 vPFactor = GetPFactor();
430 buf << vTorque(eX) << delimeter
431 << vPFactor(ePitch) << delimeter
432 << vPFactor(eYaw) << delimeter
433 << Thrust << delimeter;
434 if (IsVPitch())
435 buf << Pitch << delimeter;
436 buf << RPM;
437
438 return buf.str();
439}
FGColumnVector3 GetPFactor(void) const
Retrieves the P-Factor constant.
+ Here is the call graph for this function:

◆ GetTorque()

double GetTorque ( void  ) const
inline

Retrieves the Torque in foot-pounds (Don't you love the English system?)

Definition at line 293 of file FGPropeller.h.

293{ return vTorque(eX); }
+ Here is the caller graph for this function:

◆ IsVPitch()

bool IsVPitch ( void  ) const
inline

Returns true of this propeller is variable pitch.

Definition at line 222 of file FGPropeller.h.

222{return MaxPitch != MinPitch;}
+ Here is the caller graph for this function:

◆ ResetToIC()

void ResetToIC ( void  )
virtual

Reset the initial conditions.

Reimplemented from FGThruster.

Definition at line 199 of file FGPropeller.cpp.

200{
201 FGThruster::ResetToIC();
202 InitDynamics();
203}

◆ SetAdvance()

void SetAdvance ( double  advance)
inline

Set the propeller pitch.

Parameters
advancethe pitch command in percent (0.0 - 1.0)

Definition at line 236 of file FGPropeller.h.

236{Advance = advance;}

◆ SetConstantSpeed()

void SetConstantSpeed ( int  mode)
inline

Sets propeller into constant speed mode, or manual pitch mode.

Definition at line 242 of file FGPropeller.h.

242{ConstantSpeed = mode;}
+ Here is the caller graph for this function:

◆ SetCpFactor()

void SetCpFactor ( double  cpf)
inline

Sets coefficient of power multiplier.

Definition at line 248 of file FGPropeller.h.

248{CpFactor = cpf;}
+ Here is the caller graph for this function:

◆ SetCtFactor()

void SetCtFactor ( double  ctf)
inline

Sets coefficient of thrust multiplier.

Definition at line 245 of file FGPropeller.h.

245{CtFactor = ctf;}
+ Here is the caller graph for this function:

◆ SetEngineRPM()

void SetEngineRPM ( double  rpm)
inlinevirtual

Sets the Revolutions Per Minute for the propeller using the engine gear ratio.

Reimplemented from FGThruster.

Definition at line 219 of file FGPropeller.h.

219{RPM = rpm/GearRatio;}

◆ SetFeather()

void SetFeather ( bool  f)
inline

If true, sets the propeller in feathered position.

Definition at line 327 of file FGPropeller.h.

327{ Feathered = f; }

◆ SetInducedVelocity()

void SetInducedVelocity ( double  Vi)
inline

Set the propeller induced velocity.

Definition at line 337 of file FGPropeller.h.

337{Vinduced = Vi;}
+ Here is the caller graph for this function:

◆ SetPFactor()

void SetPFactor ( double  pf)
inline

Sets the P-Factor constant.

Definition at line 239 of file FGPropeller.h.

239{P_Factor = pf;}

◆ SetPitch()

void SetPitch ( double  pitch)
inline

This commands the pitch of the blade to change to the value supplied.

This call is meant to be issued either from the cockpit or by the flight control system (perhaps to maintain constant RPM for a constant-speed propeller). This value will be limited to be within whatever is specified in the config file for Max and Min pitch. It is also one of the lookup indices to the power and thrust tables for variable-pitch propellers.

Parameters
pitchthe pitch of the blade in degrees.

Definition at line 231 of file FGPropeller.h.

231{Pitch = pitch;}

◆ SetReverse()

void SetReverse ( bool  r)
inline

If true, sets the propeller in reversed position.

Definition at line 323 of file FGPropeller.h.

323{ Reversed = r; }

◆ SetReverseCoef()

void SetReverseCoef ( double  c)
inline

Set the propeller reverse pitch.

Parameters
cthe reverse pitch command in percent (0.0 - 1.0)

Definition at line 319 of file FGPropeller.h.

319{ Reverse_coef = c; }

◆ SetRPM()

void SetRPM ( double  rpm)
inlinevirtual

Sets the Revolutions Per Minute for the propeller.

Normally the propeller instance will calculate its own rotational velocity, given the Torque produced by the engine and integrating over time using the standard equation for rotational acceleration \(a\): \(a = Q/I\) , where \(Q\) is Torque and \(I\) is moment of inertia for the propeller.

Parameters
rpmthe rotational velocity of the propeller

Reimplemented from FGThruster.

Definition at line 215 of file FGPropeller.h.

215{RPM = rpm;}

◆ SetSense()

void SetSense ( double  s)
inline

Sets the rotation sense of the propeller.

Parameters
sthis value should be +/- 1 ONLY. +1 indicates clockwise rotation as viewed by someone standing behind the engine looking forward into the direction of flight.

Definition at line 254 of file FGPropeller.h.

254{ Sense = s;}
+ Here is the caller graph for this function:

The documentation for this class was generated from the following files: