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 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>
</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).

Two tables are optional. They apply a factor to Ct and Cp based on the helical tip Mach.

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 169 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.
 
FGTableGetCpMachTable (void) const
 Retrieves propeller power Mach effects factor.
 
FGTableGetCPowerTable (void) const
 Retrieves propeller power table.
 
double GetCtFactor (void) const
 Retrieves the coefficient of thrust multiplier.
 
FGTableGetCThrustTable (void) const
 Retrieves propeller thrust table.
 
FGTableGetCtMachTable (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 FGColumnVector3GetActingLocation (void) const
 
double GetActingLocationX (void) const
 
double GetActingLocationY (void) const
 
double GetActingLocationZ (void) const
 
double GetAnglesToBody (int axis) const
 
const FGColumnVector3GetAnglesToBody (void) const
 
virtual const FGColumnVector3GetBodyForces (void)
 
double GetBodyXForce (void) const
 
double GetBodyYForce (void) const
 
double GetBodyZForce (void) const
 
const FGColumnVector3GetLocation (void) const
 
double GetLocationX (void) const
 
double GetLocationY (void) const
 
double GetLocationZ (void) const
 
const FGColumnVector3GetMoments (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 FGMatrix33Transform (void) const
 
void UpdateCustomTransformMatrix (void)
 
- Public Member Functions inherited from FGJSBBase
 FGJSBBase ()
 Constructor for FGJSBBase.
 
virtual ~FGJSBBase ()
 Destructor for FGJSBBase.
 
void disableHighLighting (void)
 Disables highlighting in the console output.
 

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 const std::string & GetVersion (void)
 Returns the version number of JSBSim.
 
static constexpr double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit.
 
static constexpr double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine.
 
static constexpr double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius.
 
static constexpr double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine.
 
static constexpr double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin.
 
static constexpr double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius.
 
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 KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius.
 
static constexpr double FeetToMeters (double measure)
 Converts from feet to meters.
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, float b)
 Finite precision comparison.
 
static bool EqualToRoundoff (float a, double b)
 Finite precision comparison.
 
static bool EqualToRoundoff (double a, float b)
 Finite precision comparison.
 
static constexpr double Constrain (double min, double value, double max)
 Constrain a value between a minimum and a maximum value.
 
static constexpr double sign (double num)
 
- Public Attributes inherited from FGThruster
struct JSBSim::FGThruster::Inputs in
 
- Static Public Attributes inherited from FGJSBBase
static char highint [5] = {27, '[', '1', 'm', '\0' }
 highlights text
 
static char halfint [5] = {27, '[', '2', 'm', '\0' }
 low intensity text
 
static char normint [6] = {27, '[', '2', '2', 'm', '\0' }
 normal intensity text
 
static char reset [5] = {27, '[', '0', 'm', '\0' }
 resets text properties
 
static char underon [5] = {27, '[', '4', 'm', '\0' }
 underlines text
 
static char underoff [6] = {27, '[', '2', '4', 'm', '\0' }
 underline off
 
static char fgblue [6] = {27, '[', '3', '4', 'm', '\0' }
 blue text
 
static char fgcyan [6] = {27, '[', '3', '6', 'm', '\0' }
 cyan text
 
static char fgred [6] = {27, '[', '3', '1', 'm', '\0' }
 red text
 
static char fggreen [6] = {27, '[', '3', '2', 'm', '\0' }
 green text
 
static char fgdef [6] = {27, '[', '3', '9', 'm', '\0' }
 default text
 
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
FGFDMExecfdmex
 
std::shared_ptr< FGMassBalanceMassBalance
 
FGMatrix33 mT
 
TransformType ttype
 
FGColumnVector3 vActingXYZn
 
FGColumnVector3 vFn
 
FGColumnVector3 vMn
 
FGColumnVector3 vOrient
 
FGColumnVector3 vXYZn
 
- Static Protected Attributes inherited from FGJSBBase
static constexpr double radtodeg = 180. / M_PI
 
static constexpr double degtorad = M_PI / 180.
 
static constexpr double hptoftlbssec = 550.0
 
static constexpr double psftoinhg = 0.014138
 
static constexpr double psftopa = 47.88
 
static constexpr double fttom = 0.3048
 
static constexpr double ktstofps = 1852./(3600*fttom)
 
static constexpr double fpstokts = 1.0 / ktstofps
 
static constexpr double inchtoft = 1.0/12.0
 
static constexpr double m3toft3 = 1.0/(fttom*fttom*fttom)
 
static constexpr double in3tom3 = inchtoft*inchtoft*inchtoft/m3toft3
 
static constexpr double inhgtopa = 3386.38
 
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.
 
static constexpr double lbtoslug = 1.0/slugtolb
 
static constexpr double kgtolb = 2.20462
 
static constexpr double kgtoslug = 0.06852168
 
static const std::string needed_cfg_version = "2.0"
 
static const std::string JSBSim_version = JSBSIM_VERSION " " __DATE__ " " __TIME__
 

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 = 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}
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 183 of file FGPropeller.cpp.

184{
185 delete cThrust;
186 delete cPower;
187 delete CtMach;
188 delete CpMach;
189
190 Debug(1);
191}

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 212 of file FGPropeller.cpp.

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}
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:465
+ 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 305 of file FGPropeller.h.

305{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 247 of file FGPropeller.h.

247{ return CpFactor; }

◆ GetCpMachTable()

FGTable * GetCpMachTable ( void  ) const
inline

Retrieves propeller power Mach effects factor.

Definition at line 260 of file FGPropeller.h.

260{ return CpMach; }

◆ GetCPowerTable()

FGTable * GetCPowerTable ( void  ) const
inline

Retrieves propeller power table.

Definition at line 255 of file FGPropeller.h.

255{ return cPower; }

◆ GetCtFactor()

double GetCtFactor ( void  ) const
inline

Retrieves the coefficient of thrust multiplier.

Definition at line 244 of file FGPropeller.h.

244{ return CtFactor; }

◆ GetCThrustTable()

FGTable * GetCThrustTable ( void  ) const
inline

Retrieves propeller thrust table.

Definition at line 253 of file FGPropeller.h.

253{ return cThrust;}

◆ GetCtMachTable()

FGTable * GetCtMachTable ( void  ) const
inline

Retrieves propeller thrust Mach effects factor.

Definition at line 258 of file FGPropeller.h.

258{ return CtMach; }

◆ GetDiameter()

double GetDiameter ( void  ) const
inline

Retrieves the propeller diameter.

Definition at line 250 of file FGPropeller.h.

250{ return Diameter; }

◆ GetEngineRPM()

double GetEngineRPM ( void  ) const
inlinevirtual

Calculates the RPMs of the engine based on gear ratio.

Reimplemented from FGThruster.

Definition at line 238 of file FGPropeller.h.

238{ 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 299 of file FGPropeller.h.

299{ return Feathered; }

◆ GetHelicalTipMach()

double GetHelicalTipMach ( void  ) const
inline

Retrieves the Mach number at the propeller tips.

Definition at line 303 of file FGPropeller.h.

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

◆ GetInducedVelocity()

double GetInducedVelocity ( void  ) const
inline

Get the propeller induced velocity.

Definition at line 309 of file FGPropeller.h.

309{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 241 of file FGPropeller.h.

241{ return Ixx; }

◆ GetPFactor()

FGColumnVector3 GetPFactor ( void  ) const

Retrieves the P-Factor constant.

Definition at line 376 of file FGPropeller.cpp.

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}
+ 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 232 of file FGPropeller.h.

232{ 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 307 of file FGPropeller.cpp.

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}
+ 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 295 of file FGPropeller.h.

295{ return Reversed; }

◆ GetReverseCoef()

double GetReverseCoef ( void  ) const
inline

Retrieves the reverse pitch command.

Definition at line 291 of file FGPropeller.h.

291{ return Reverse_coef; }

◆ GetRPM()

double GetRPM ( void  ) const
inlinevirtual

Retrieves the RPMs of the propeller.

Reimplemented from FGThruster.

Definition at line 235 of file FGPropeller.h.

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

◆ GetThrustCoefficient()

double GetThrustCoefficient ( void  ) const
inline

Retrieves the thrust coefficient.

Definition at line 301 of file FGPropeller.h.

301{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 389 of file FGPropeller.cpp.

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}
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 406 of file FGPropeller.cpp.

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}
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 263 of file FGPropeller.h.

263{ 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 197 of file FGPropeller.h.

197{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 195 of file FGPropeller.cpp.

196{
197 FGThruster::ResetToIC();
198 Vinduced = 0.0;
199}

◆ SetAdvance()

void SetAdvance ( double  advance)
inline

Set the propeller pitch.

Parameters
advancethe pitch command in percent (0.0 - 1.0)

Definition at line 211 of file FGPropeller.h.

211{Advance = advance;}

◆ SetConstantSpeed()

void SetConstantSpeed ( int  mode)
inline

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

Definition at line 217 of file FGPropeller.h.

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

◆ SetCpFactor()

void SetCpFactor ( double  cpf)
inline

Sets coefficient of power multiplier.

Definition at line 223 of file FGPropeller.h.

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

◆ SetCtFactor()

void SetCtFactor ( double  ctf)
inline

Sets coefficient of thrust multiplier.

Definition at line 220 of file FGPropeller.h.

220{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 194 of file FGPropeller.h.

194{RPM = rpm/GearRatio;}

◆ SetFeather()

void SetFeather ( bool  f)
inline

If true, sets the propeller in feathered position.

Definition at line 297 of file FGPropeller.h.

297{ Feathered = f; }

◆ SetInducedVelocity()

void SetInducedVelocity ( double  Vi)
inline

Set the propeller induced velocity.

Definition at line 307 of file FGPropeller.h.

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

◆ SetPFactor()

void SetPFactor ( double  pf)
inline

Sets the P-Factor constant.

Definition at line 214 of file FGPropeller.h.

214{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 206 of file FGPropeller.h.

206{Pitch = pitch;}

◆ SetReverse()

void SetReverse ( bool  r)
inline

If true, sets the propeller in reversed position.

Definition at line 293 of file FGPropeller.h.

293{ 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 289 of file FGPropeller.h.

289{ 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 190 of file FGPropeller.h.

190{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 229 of file FGPropeller.h.

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

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