JSBSim Flight Dynamics Model  1.1.11 (13 Feb 2022)
An Open Source Flight Dynamics and Control Software Library in C++
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. More...
 
 ~FGPropeller ()
 Destructor for FGPropeller - deletes the FGTable objects.
 
double Calculate (double EnginePower)
 Calculates and returns the thrust produced by this propeller. More...
 
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. More...
 
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. More...
 
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. More...
 
void SetReverse (bool r)
 If true, sets the propeller in reversed position.
 
void SetReverseCoef (double c)
 Set the propeller reverse pitch. More...
 
void SetRPM (double rpm)
 Sets the Revolutions Per Minute for the propeller. More...
 
void SetSense (double s)
 Sets the rotation sense of the propeller. More...
 
- 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 (const FGForce &force)
 
 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. More...
 
double SetActingLocationX (double x)
 
double SetActingLocationY (double y)
 
double 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 PutMessage (const Message &msg)
 Places a Message structure on the Message queue. More...
 
void PutMessage (const std::string &text)
 Creates a message with the given text and places it on the queue. More...
 
void PutMessage (const std::string &text, bool bVal)
 Creates a message with the given text and boolean value and places it on the queue. More...
 
void PutMessage (const std::string &text, int iVal)
 Creates a message with the given text and integer value and places it on the queue. More...
 
void PutMessage (const std::string &text, double dVal)
 Creates a message with the given text and double value and places it on the queue. More...
 
int SomeMessages (void) const
 Reads the message on the queue (but does not delete it). More...
 
void ProcessMessage (void)
 Reads the message on the queue and removes it from the queue. More...
 
MessageProcessNextMessage (void)
 Reads the next message on the queue and removes it from the queue. More...
 
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, tCustom }
 
- Public Types inherited from FGJSBBase
enum  { eL = 1, eM, eN }
 Moments L, M, N.
 
enum  { eP = 1, eQ, eR }
 Rates P, Q, R.
 
enum  { eU = 1, eV, eW }
 Velocities U, V, W.
 
enum  { eX = 1, eY, eZ }
 Positions X, Y, Z.
 
enum  { ePhi = 1, eTht, ePsi }
 Euler angles Phi, Theta, Psi.
 
enum  { eDrag = 1, eSide, eLift }
 Stability axis forces, Drag, Side force, Lift.
 
enum  { eRoll = 1, ePitch, eYaw }
 Local frame orientation Roll, Pitch, Yaw.
 
enum  { eNorth = 1, eEast, eDown }
 Local frame position North, East, Down.
 
enum  { eLat = 1, eLong, eRad }
 Locations Radius, Latitude, Longitude.
 
enum  {
  inNone = 0, inDegrees, inRadians, inMeters,
  inFeet
}
 Conversion specifiers.
 
- Static Public Member Functions inherited from FGJSBBase
static const std::string & GetVersion (void)
 Returns the version number of JSBSim. More...
 
static constexpr double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit. More...
 
static constexpr double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine. More...
 
static constexpr double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius. More...
 
static constexpr double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine. More...
 
static constexpr double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin. More...
 
static constexpr double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius. More...
 
static constexpr double CelsiusToFahrenheit (double celsius)
 Converts from degrees Celsius to degrees Fahrenheit. More...
 
static constexpr double CelsiusToKelvin (double celsius)
 Converts from degrees Celsius to degrees Kelvin. More...
 
static constexpr double KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius. More...
 
static constexpr double FeetToMeters (double measure)
 Converts from feet to meters. More...
 
static double PitotTotalPressure (double mach, double p)
 Compute the total pressure in front of the Pitot tube. More...
 
static double MachFromImpactPressure (double qc, double p)
 Compute the Mach number from the differential pressure (qc) and the static pressure. More...
 
static double VcalibratedFromMach (double mach, double p)
 Calculate the calibrated airspeed from the Mach number. More...
 
static double MachFromVcalibrated (double vcas, double p)
 Calculate the Mach number from the calibrated airspeed.Based on the formulas in the US Air Force Aircraft Performance Flight Testing Manual (AFFTC-TIH-99-01). More...
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (float a, float b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (float a, double b)
 Finite precision comparison. More...
 
static bool EqualToRoundoff (double a, float b)
 Finite precision comparison. More...
 
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)
 
static double GaussianRandomNumber (void)
 
- 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
 
FGMassBalanceMassBalance
 
FGMatrix33 mT
 
TransformType ttype
 
FGColumnVector3 vActingXYZn
 
FGColumnVector3 vFn
 
FGColumnVector3 vMn
 
FGColumnVector3 vOrient
 
FGColumnVector3 vXYZn
 
- Static Protected Attributes inherited from FGJSBBase
static Message localMsg
 
static std::queue< MessageMessages
 
static unsigned int messageId = 0
 
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 ktstofps = 1.68781
 
static constexpr double fpstokts = 1.0 / ktstofps
 
static constexpr double inchtoft = 1.0/12.0
 
static constexpr double fttom = 0.3048
 
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. More...
 
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__
 
static int gaussian_random_number_phase = 0
 

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

55  : FGThruster(exec, prop_element, num)
56 {
57  Element *table_element, *local_element;
58  string name="";
59  FGPropertyManager* PropertyManager = exec->GetPropertyManager();
60 
61  MaxPitch = MinPitch = P_Factor = Pitch = Advance = MinRPM = MaxRPM = 0.0;
62  Sense = 1; // default clockwise rotation
63  ReversePitch = 0.0;
64  Reversed = false;
65  Feathered = false;
66  Reverse_coef = 0.0;
67  GearRatio = 1.0;
68  CtFactor = CpFactor = 1.0;
69  ConstantSpeed = 0;
70  cThrust = cPower = CtMach = CpMach = 0;
71  Vinduced = 0.0;
72 
73  if (prop_element->FindElement("ixx"))
74  Ixx = max(prop_element->FindElementValueAsNumberConvertTo("ixx", "SLUG*FT2"), 1e-06);
75 
76  Sense_multiplier = 1.0;
77  if (prop_element->HasAttribute("version")
78  && prop_element->GetAttributeValueAsNumber("version") > 1.0)
79  Sense_multiplier = -1.0;
80 
81  if (prop_element->FindElement("diameter"))
82  Diameter = max(prop_element->FindElementValueAsNumberConvertTo("diameter", "FT"), 0.001);
83  if (prop_element->FindElement("numblades"))
84  numBlades = (int)prop_element->FindElementValueAsNumber("numblades");
85  if (prop_element->FindElement("gearratio"))
86  GearRatio = max(prop_element->FindElementValueAsNumber("gearratio"), 0.001);
87  if (prop_element->FindElement("minpitch"))
88  MinPitch = prop_element->FindElementValueAsNumber("minpitch");
89  if (prop_element->FindElement("maxpitch"))
90  MaxPitch = prop_element->FindElementValueAsNumber("maxpitch");
91  if (prop_element->FindElement("minrpm"))
92  MinRPM = prop_element->FindElementValueAsNumber("minrpm");
93  if (prop_element->FindElement("maxrpm")) {
94  MaxRPM = prop_element->FindElementValueAsNumber("maxrpm");
95  ConstantSpeed = 1;
96  }
97  if (prop_element->FindElement("constspeed"))
98  ConstantSpeed = (int)prop_element->FindElementValueAsNumber("constspeed");
99  if (prop_element->FindElement("reversepitch"))
100  ReversePitch = prop_element->FindElementValueAsNumber("reversepitch");
101  while((table_element = prop_element->FindNextElement("table")) != 0) {
102  name = table_element->GetAttributeValue("name");
103  try {
104  if (name == "C_THRUST") {
105  cThrust = new FGTable(PropertyManager, table_element);
106  } else if (name == "C_POWER") {
107  cPower = new FGTable(PropertyManager, table_element);
108  } else if (name == "CT_MACH") {
109  CtMach = new FGTable(PropertyManager, table_element);
110  } else if (name == "CP_MACH") {
111  CpMach = new FGTable(PropertyManager, table_element);
112  } else {
113  cerr << "Unknown table type: " << name << " in propeller definition." << endl;
114  }
115  } catch (std::string& str) {
116  throw("Error loading propeller table:" + name + ". " + str);
117  }
118  }
119  if( (cPower == 0) || (cThrust == 0)){
120  cerr << "Propeller configuration must contain C_THRUST and C_POWER tables!" << endl;
121  }
122 
123  local_element = prop_element->GetParent()->FindElement("sense");
124  if (local_element) {
125  double Sense = local_element->GetDataAsNumber();
126  SetSense(Sense >= 0.0 ? 1.0 : -1.0);
127  }
128  local_element = prop_element->GetParent()->FindElement("p_factor");
129  if (local_element) {
130  P_Factor = local_element->GetDataAsNumber();
131  }
132  if (P_Factor < 0) {
133  cerr << "P-Factor value in propeller configuration file must be greater than zero" << endl;
134  }
135  if (prop_element->FindElement("ct_factor"))
136  SetCtFactor( prop_element->FindElementValueAsNumber("ct_factor") );
137  if (prop_element->FindElement("cp_factor"))
138  SetCpFactor( prop_element->FindElementValueAsNumber("cp_factor") );
139 
140  Type = ttPropeller;
141  RPM = 0;
142  vTorque.InitMatrix();
143  D4 = Diameter*Diameter*Diameter*Diameter;
144  D5 = D4*Diameter;
145  Pitch = MinPitch;
146 
147  string property_name, base_property_name;
148  base_property_name = CreateIndexedPropertyName("propulsion/engine", EngineNum);
149  property_name = base_property_name + "/engine-rpm";
150  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetEngineRPM );
151  property_name = base_property_name + "/advance-ratio";
152  PropertyManager->Tie( property_name.c_str(), &J );
153  property_name = base_property_name + "/blade-angle";
154  PropertyManager->Tie( property_name.c_str(), &Pitch );
155  property_name = base_property_name + "/thrust-coefficient";
156  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetThrustCoefficient );
157  property_name = base_property_name + "/propeller-rpm";
158  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetRPM );
159  property_name = base_property_name + "/helical-tip-Mach";
160  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetHelicalTipMach );
161  property_name = base_property_name + "/constant-speed-mode";
162  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetConstantSpeed,
164  property_name = base_property_name + "/prop-induced-velocity_fps"; // [ft/sec]
165  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetInducedVelocity,
167  property_name = base_property_name + "/propeller-power-ftlbps"; // [ft-lbs/sec]
168  PropertyManager->Tie( property_name.c_str(), &PowerRequired );
169  property_name = base_property_name + "/propeller-torque-ftlb"; // [ft-lbs]
170  PropertyManager->Tie( property_name.c_str(), this, &FGPropeller::GetTorque);
171  property_name = base_property_name + "/propeller-sense";
172  PropertyManager->Tie( property_name.c_str(), &Sense );
173 
174  Debug(0);
175 }
+ Here is the call graph for this function:

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

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

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

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

◆ 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;}

◆ 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;}

◆ 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:
JSBSim::FGPropeller::GetHelicalTipMach
double GetHelicalTipMach(void) const
Retrieves the Mach number at the propeller tips.
Definition: FGPropeller.h:303
JSBSim::FGPropeller::GetThrustCoefficient
double GetThrustCoefficient(void) const
Retrieves the thrust coefficient.
Definition: FGPropeller.h:301
JSBSim::FGPropeller::SetSense
void SetSense(double s)
Sets the rotation sense of the propeller.
Definition: FGPropeller.h:229
JSBSim::FGMassBalance::StructuralToBody
FGColumnVector3 StructuralToBody(const FGColumnVector3 &r) const
Conversion from the structural frame to the body frame.
Definition: FGMassBalance.cpp:364
JSBSim::FGPropeller::SetInducedVelocity
void SetInducedVelocity(double Vi)
Set the propeller induced velocity.
Definition: FGPropeller.h:307
JSBSim::FGPropeller::GetTorque
double GetTorque(void) const
Retrieves the Torque in foot-pounds (Don't you love the English system?)
Definition: FGPropeller.h:263
JSBSim::FGPropeller::GetConstantSpeed
int GetConstantSpeed(void) const
Returns a non-zero value if the propeller is constant speed.
Definition: FGPropeller.h:305
JSBSim::FGPropeller::SetCtFactor
void SetCtFactor(double ctf)
Sets coefficient of thrust multiplier.
Definition: FGPropeller.h:220
JSBSim::FGPropeller::GetEngineRPM
double GetEngineRPM(void) const
Calculates the RPMs of the engine based on gear ratio.
Definition: FGPropeller.h:238
JSBSim::FGPropeller::SetCpFactor
void SetCpFactor(double cpf)
Sets coefficient of power multiplier.
Definition: FGPropeller.h:223
JSBSim::FGPropeller::GetPowerRequired
double GetPowerRequired(void)
Retrieves the power required (or "absorbed") by the propeller - i.e.
Definition: FGPropeller.cpp:303
JSBSim::FGThruster::FGThruster
FGThruster(FGFDMExec *FDMExec, Element *el, int num)
Constructor.
Definition: FGThruster.cpp:55
JSBSim::FGPropeller::GetRPM
double GetRPM(void) const
Retrieves the RPMs of the propeller.
Definition: FGPropeller.h:235
JSBSim::FGPropeller::SetConstantSpeed
void SetConstantSpeed(int mode)
Sets propeller into constant speed mode, or manual pitch mode.
Definition: FGPropeller.h:217
JSBSim::FGPropeller::GetInducedVelocity
double GetInducedVelocity(void) const
Get the propeller induced velocity.
Definition: FGPropeller.h:309