JSBSim Flight Dynamics Model  1.2.0 (05 Nov 2023)
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 (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 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.
 
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 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)
 
- 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. 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__
 

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

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

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

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