JSBSim Flight Dynamics Model  1.0 (02 March 2017)
An Open Source Flight Dynamics and Control Software Library in C++
FGPropeller Class Reference

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

#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.
 
 FGForce (const FGForce &force)
 
 ~FGForce ()
 Destructor.
 
const FGColumnVector3GetActingLocation (void) const
 
double GetActingLocationX (void) const
 
double GetActingLocationY (void) const
 
double GetActingLocationZ (void) const
 
const FGColumnVector3GetAnglesToBody (void) const
 
double GetAnglesToBody (int axis) 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 (double x, double y, double z)
 Acting point of application. More...
 
void SetActingLocation (const FGColumnVector3 &vv)
 
double SetActingLocationX (double x)
 
double SetActingLocationY (double y)
 
double SetActingLocationZ (double z)
 
void SetAnglesToBody (double broll, double bpitch, double byaw)
 
void SetAnglesToBody (const FGColumnVector3 &vv)
 
void SetLocation (double x, double y, double z)
 
void SetLocation (const FGColumnVector3 &vv)
 
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.
 
std::string GetVersion (void)
 Returns the version number of JSBSim. More...
 
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)
 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...
 

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 double CelsiusToFahrenheit (double celsius)
 Converts from degrees Celsius to degrees Fahrenheit. More...
 
static double CelsiusToKelvin (double celsius)
 Converts from degrees Celsius to degrees Kelvin. More...
 
static double CelsiusToRankine (double celsius)
 Converts from degrees Celsius to degrees Rankine. More...
 
static double Constrain (double min, double value, double max)
 Constrain a value between a minimum and a maximum value.
 
static bool EqualToRoundoff (double a, double b)
 Finite precision comparison. 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 double FahrenheitToCelsius (double fahrenheit)
 Converts from degrees Fahrenheit to degrees Celsius. More...
 
static double FeetToMeters (double measure)
 Converts from feet to meters. More...
 
static double GaussianRandomNumber (void)
 
static double KelvinToCelsius (double kelvin)
 Converts from degrees Kelvin to degrees Celsius. More...
 
static double KelvinToFahrenheit (double kelvin)
 Converts from degrees Kelvin to degrees Fahrenheit. More...
 
static double KelvinToRankine (double kelvin)
 Converts from degrees Kelvin to degrees Rankine. More...
 
static double MachFromVcalibrated (double vcas, double p, double psl, double rhosl)
 Calculate the Mach number from the calibrated airspeed. More...
 
static double PitotTotalPressure (double mach, double p)
 Compute the total pressure in front of the Pitot tube. More...
 
static double RankineToCelsius (double rankine)
 Converts from degrees Rankine to degrees Celsius. More...
 
static double RankineToKelvin (double rankine)
 Converts from degrees Rankine to degrees Kelvin. More...
 
static double sign (double num)
 
static double VcalibratedFromMach (double mach, double p, double psl, double rhosl)
 Calculate the calibrated airspeed from the Mach number. More...
 
- Public Attributes inherited from FGThruster
struct JSBSim::FGThruster::Inputs in
 
- Static Public Attributes inherited from FGJSBBase
static short debug_lvl = 1
 
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
 
- Protected Member Functions inherited from FGJSBBase
void Debug (int)
 
- 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
 
FGMatrix33 mT
 
TransformType ttype
 
FGColumnVector3 vActingXYZn
 
FGColumnVector3 vFn
 
FGColumnVector3 vH
 
FGColumnVector3 vMn
 
FGColumnVector3 vOrient
 
FGColumnVector3 vXYZn
 
- Static Protected Attributes inherited from FGJSBBase
static const double degtorad = 0.017453292519943295769236907684886
 
static const double fpstokts = 1.0/ktstofps
 
static const double fttom = 0.3048
 
static int gaussian_random_number_phase = 0
 
static const double hptoftlbssec = 550.0
 
static const double in3tom3 = 1.638706E-5
 
static const double inchtoft = 0.08333333
 
static const double inhgtopa = 3386.38
 
static const std::string JSBSim_version = "1.0 " __DATE__ " " __TIME__
 
static const double kgtolb = 2.20462
 
static const double kgtoslug = 0.06852168
 
static const double ktstofps = 1.68781
 
static const double lbtoslug = 1.0/slugtolb
 
static Message localMsg
 
static const double m3toft3 = 1.0/(fttom*fttom*fttom)
 
static double Mair = 28.9645
 
static unsigned int messageId = 0
 
static std::queue< MessageMessages
 
static const std::string needed_cfg_version = "2.0"
 
static const double psftoinhg = 0.014138
 
static const double psftopa = 47.88
 
static const double radtodeg = 57.295779513082320876798154814105
 
static double Reng = 1716.56
 
static double Rstar = 1545.348
 
static const double SHRatio = 1.40
 
static const double slugtolb = 32.174049
 

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>
<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>
<p_factor> {number} </p_factor>
<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.
    <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.

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>

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
Version
Id
FGPropeller.h,v 1.27 2017/02/26 12:09:46 bcoconni Exp
See also
FGEngine
FGThruster

Definition at line 170 of file FGPropeller.h.

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

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

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

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

212 {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 207 of file FGPropeller.h.

207 {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 290 of file FGPropeller.h.

290 { 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 191 of file FGPropeller.h.

191 {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 230 of file FGPropeller.h.

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

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