47 #include "FGPropeller.h" 48 #include "input_output/FGXMLElement.h" 54 IDENT(IdSrc,
"$Id: FGPiston.cpp,v 1.82 2016/01/02 17:42:53 bcoconni Exp $");
55 IDENT(IdHdr,ID_PISTON);
64 calorific_value_fuel(47.3e6),
67 standard_pressure(101320.73)
87 MinManifoldPressure_inHg = 6.5;
88 MaxManifoldPressure_inHg = 28.5;
89 ManifoldPressureLag=1.0;
91 volumetric_efficiency = 0.85;
96 CompressionRatio = 8.5;
99 PeakMeanPistonSpeed_fps = 100;
102 Cooling_Factor = 0.5144444;
103 StaticFriction_HP = 1.5;
110 Lookup_Combustion_Efficiency = 0;
111 Mixture_Efficiency_Correlation = 0;
125 bBoostOverride =
false;
126 bTakeoffBoost =
false;
128 BoostLossFactor = 0.0;
131 for (i=0; i<FG_MAX_BOOST_SPEEDS; i++) {
134 RatedAltitude[i] = 0.0;
136 RatedMAP[i] = 100000;
138 TakeoffMAP[i] = 100000;
140 for (i=0; i<FG_MAX_BOOST_SPEEDS-1; i++) {
141 BoostSwitchAltitude[i] = 0.0;
142 BoostSwitchPressure[i] = 0.0;
185 if (el->
FindElement(
"air-intake-impedance-factor"))
240 if (name ==
"COMBUSTION") {
241 Lookup_Combustion_Efficiency =
new FGTable(PropertyManager, table_element);
242 }
else if (name ==
"MIXTURE") {
243 Mixture_Efficiency_Correlation =
new FGTable(PropertyManager, table_element);
245 cerr <<
"Unknown table type: " << name <<
" in piston engine definition." << endl;
247 }
catch (std::string& str) {
250 delete Lookup_Combustion_Efficiency;
251 delete Mixture_Efficiency_Correlation;
252 throw(
"Error loading piston engine table:" + name +
". " + str);
257 volumetric_efficiency_reduced = volumetric_efficiency;
259 if(StarterRPM < 0.) StarterRPM = 2*IdleRPM;
260 if(StarterTorque < 0)
261 StarterTorque = (MaxHP)*0.4;
263 displacement_SI = Displacement * in3tom3;
264 RatedMeanPistonSpeed_fps = ( MaxRPM * Stroke) / (360);
268 double pmep = 29.92 - MaxManifoldPressure_inHg;
269 pmep *= inhgtopa * volumetric_efficiency;
270 double fmep = (FMEPDynamic * RatedMeanPistonSpeed_fps * fttom + FMEPStatic);
271 double hp_loss = ((pmep + fmep) * displacement_SI * MaxRPM)/(Cycles*22371);
272 ISFC = ( 1.1*Displacement * MaxRPM * volumetric_efficiency *(MaxManifoldPressure_inHg / 29.92) ) / (9411 * (MaxHP+hp_loss-StaticFriction_HP));
275 if ( MaxManifoldPressure_inHg > 29.9 ) {
276 MaxManifoldPressure_inHg = 29.9;
278 minMAP = MinManifoldPressure_inHg * inhgtopa;
279 maxMAP = MaxManifoldPressure_inHg * inhgtopa;
297 double Ze=PeakMeanPistonSpeed_fps/RatedMeanPistonSpeed_fps;
298 Z_airbox = (standard_pressure *Ze / maxMAP) - Ze;
301 Z_throttle=(PeakMeanPistonSpeed_fps/((IdleRPM * Stroke) / 360))*(standard_pressure/minMAP - 1) - Z_airbox;
305 if(Lookup_Combustion_Efficiency == 0) {
307 Lookup_Combustion_Efficiency =
new FGTable(12);
308 *Lookup_Combustion_Efficiency << 0.00 << 0.980;
309 *Lookup_Combustion_Efficiency << 0.90 << 0.980;
310 *Lookup_Combustion_Efficiency << 1.00 << 0.970;
311 *Lookup_Combustion_Efficiency << 1.05 << 0.950;
312 *Lookup_Combustion_Efficiency << 1.10 << 0.900;
313 *Lookup_Combustion_Efficiency << 1.15 << 0.850;
314 *Lookup_Combustion_Efficiency << 1.20 << 0.790;
315 *Lookup_Combustion_Efficiency << 1.30 << 0.700;
316 *Lookup_Combustion_Efficiency << 1.40 << 0.630;
317 *Lookup_Combustion_Efficiency << 1.50 << 0.570;
318 *Lookup_Combustion_Efficiency << 1.60 << 0.525;
319 *Lookup_Combustion_Efficiency << 2.00 << 0.345;
323 if( Mixture_Efficiency_Correlation == 0) {
324 Mixture_Efficiency_Correlation =
new FGTable(15);
325 *Mixture_Efficiency_Correlation << 0.05000 << 0.00000;
326 *Mixture_Efficiency_Correlation << 0.05137 << 0.00862;
327 *Mixture_Efficiency_Correlation << 0.05179 << 0.21552;
328 *Mixture_Efficiency_Correlation << 0.05430 << 0.48276;
329 *Mixture_Efficiency_Correlation << 0.05842 << 0.70690;
330 *Mixture_Efficiency_Correlation << 0.06312 << 0.83621;
331 *Mixture_Efficiency_Correlation << 0.06942 << 0.93103;
332 *Mixture_Efficiency_Correlation << 0.07786 << 1.00000;
333 *Mixture_Efficiency_Correlation << 0.08845 << 1.00000;
334 *Mixture_Efficiency_Correlation << 0.09270 << 0.98276;
335 *Mixture_Efficiency_Correlation << 0.10120 << 0.93103;
336 *Mixture_Efficiency_Correlation << 0.11455 << 0.72414;
337 *Mixture_Efficiency_Correlation << 0.12158 << 0.45690;
338 *Mixture_Efficiency_Correlation << 0.12435 << 0.23276;
339 *Mixture_Efficiency_Correlation << 0.12500 << 0.00000;
342 string property_name, base_property_name;
343 base_property_name = CreateIndexedPropertyName(
"propulsion/engine", EngineNumber);
344 property_name = base_property_name +
"/power-hp";
345 PropertyManager->
Tie(property_name, &HP);
346 property_name = base_property_name +
"/friction-hp";
347 PropertyManager->
Tie(property_name, &StaticFriction_HP);
348 property_name = base_property_name +
"/bsfc-lbs_hphr";
349 PropertyManager->
Tie(property_name, &ISFC);
350 property_name = base_property_name +
"/starter-norm";
351 PropertyManager->
Tie(property_name, &StarterGain);
352 property_name = base_property_name +
"/volumetric-efficiency";
353 PropertyManager->
Tie(property_name, &volumetric_efficiency);
354 property_name = base_property_name +
"/map-pa";
355 PropertyManager->
Tie(property_name, &MAP);
356 property_name = base_property_name +
"/map-inhg";
357 PropertyManager->
Tie(property_name, &ManifoldPressure_inHg);
358 property_name = base_property_name +
"/air-intake-impedance-factor";
359 PropertyManager->
Tie(property_name, &Z_airbox);
360 property_name = base_property_name +
"/ram-air-factor";
361 PropertyManager->
Tie(property_name, &Ram_Air_Factor);
362 property_name = base_property_name +
"/cooling-factor";
363 PropertyManager->
Tie(property_name, &Cooling_Factor);
364 property_name = base_property_name +
"/boost-speed";
365 PropertyManager->
Tie(property_name, &BoostSpeed);
366 property_name = base_property_name +
"/cht-degF";
367 PropertyManager->
Tie(property_name,
this, &FGPiston::getCylinderHeadTemp_degF);
368 property_name = base_property_name +
"/oil-temperature-degF";
369 PropertyManager->
Tie(property_name,
this, &FGPiston::getOilTemp_degF);
370 property_name = base_property_name +
"/oil-pressure-psi";
371 PropertyManager->
Tie(property_name,
this, &FGPiston::getOilPressure_psi);
372 property_name = base_property_name +
"/egt-degF";
373 PropertyManager->
Tie(property_name,
this, &FGPiston::getExhaustGasTemp_degF);
374 if(BoostLossFactor > 0.0) {
375 property_name = base_property_name +
"/boostloss-factor";
376 PropertyManager->
Tie(property_name, &BoostLossFactor);
377 property_name = base_property_name +
"/boostloss-hp";
378 PropertyManager->
Tie(property_name, &BoostLossHP);
382 if (TakeoffBoost > RatedBoost[0]) bTakeoffBoost =
true;
383 for (i=0; i<BoostSpeeds; ++i) {
385 if (RatedBoost[i] <= 0.0) bad =
true;
386 if (RatedPower[i] <= 0.0) bad =
true;
387 if (RatedAltitude[i] < 0.0) bad =
true;
388 if (i > 0 && RatedAltitude[i] < RatedAltitude[i - 1]) bad =
true;
396 if (i < BoostSpeeds - 1) {
397 if (BoostSwitchAltitude[i] < RatedAltitude[i]) {
400 BoostSwitchAltitude[i] = RatedAltitude[i] + 1000;
402 BoostSwitchPressure[i] = GetStdPressure100K(BoostSwitchAltitude[i]) * psftopa;
405 BoostSwitchHysteresis = 1000;
408 RatedMAP[i] = standard_pressure + RatedBoost[i] * 6895;
410 if (TakeoffBoost > RatedBoost[0]) {
412 TakeoffMAP[i] = RatedMAP[i] + ((TakeoffBoost - RatedBoost[0]) * 6895);
413 bTakeoffBoost =
true;
415 TakeoffMAP[i] = RatedMAP[i];
416 bTakeoffBoost =
false;
418 BoostMul[i] = RatedMAP[i] / (GetStdPressure100K(RatedAltitude[i]) * psftopa);
422 if (BoostSpeeds > 0) {
426 bBoostOverride = (BoostOverride == 1 ? true :
false);
427 bBoostManual = (BoostManual == 1 ? true :
false);
435 delete Lookup_Combustion_Efficiency;
436 delete Mixture_Efficiency_Correlation;
446 ManifoldPressure_inHg = in.Pressure * psftoinhg;
447 MAP = in.Pressure * psftopa;
450 OilTemp_degK = airTemperature_degK;
451 CylinderHeadTemp_degK = airTemperature_degK;
452 ExhaustGasTemp_degK = airTemperature_degK;
453 EGT_degC = ExhaustGasTemp_degK - 273;
454 Thruster->SetRPM(0.0);
456 OilPressure_psi = 0.0;
466 p_amb = in.Pressure * psftopa;
467 double p = in.TotalPressure * psftopa;
468 p_ram = (p - p_amb) * Ram_Air_Factor + p_amb;
474 RPM = Thruster->GetEngineRPM();
476 MeanPistonSpeed_fps = ( RPM * Stroke) / (360);
481 if (Boosted) doBoostControl();
495 if (IndicatedHorsePower < 0.1250) Running =
false;
502 if (Thruster->GetType() == FGThruster::ttPropeller) {
503 ((
FGPropeller*)Thruster)->SetAdvance(in.PropAdvance[EngineNumber]);
504 ((
FGPropeller*)Thruster)->SetFeather(in.PropFeather[EngineNumber]);
507 LoadThrusterInputs();
508 Thruster->Calculate(HP * hptoftlbssec);
517 FuelExpended = FuelFlowRate * in.TotalDeltaT;
518 if (!Starved) FuelUsedLbs += FuelExpended;
524 int FGPiston::InitRunning(
void)
527 in.MixtureCmd[EngineNumber] = in.PressureRatio*1.3;
528 in.MixturePos[EngineNumber] = in.PressureRatio*1.3;
529 Thruster->SetRPM( 2.0*IdleRPM/Thruster->GetGearRatio() );
539 void FGPiston::doEngineStartup(
void)
546 Magneto_Left =
false;
547 Magneto_Right =
false;
559 if ((Magnetos == 1) || (Magnetos > 2)) Magneto_Left =
true;
560 if (Magnetos > 1) Magneto_Right =
true;
563 fuel = FuelFlowRate > 0.0 ? 1 : 0;
566 if (Cranking != Starter) {
577 if (!spark || !fuel) Running =
false;
578 if (RPM < IdleRPM*0.8 ) Running =
false;
580 if ( spark && fuel) {
581 if (RPM > IdleRPM*0.8)
601 void FGPiston::doBoostControl(
void)
604 if(BoostSpeed > BoostSpeeds-1) BoostSpeed = BoostSpeeds-1;
605 if(BoostSpeed < 0) BoostSpeed = 0;
607 if(BoostSpeed < BoostSpeeds - 1) {
609 if(p_amb < BoostSwitchPressure[BoostSpeed] - BoostSwitchHysteresis) {
612 }
if(BoostSpeed > 0) {
614 if(p_amb > BoostSwitchPressure[BoostSpeed - 1] + BoostSwitchHysteresis) {
636 void FGPiston::doMAP(
void)
638 double Zt = (1 - in.ThrottlePos[EngineNumber])*(1 - in.ThrottlePos[EngineNumber])*Z_throttle;
639 double Ze= MeanPistonSpeed_fps > 0 ? PeakMeanPistonSpeed_fps/MeanPistonSpeed_fps : 999999;
641 double map_coefficient = Ze/(Ze+Z_airbox+Zt);
644 double dMAP=(TMAP - p_ram * map_coefficient);
645 if (ManifoldPressureLag > in.TotalDeltaT) dMAP *= in.TotalDeltaT/ManifoldPressureLag;
652 PMEP = (TMAP - p_amb) * volumetric_efficiency;
661 bool bTakeoffPos =
false;
663 if (in.ThrottlePos[EngineNumber] > 0.98) {
668 double boost_factor = (( BoostMul[BoostSpeed] - 1 ) / RatedRPM[BoostSpeed] ) * RPM + 1;
669 MAP = TMAP * boost_factor;
671 if(!bBoostOverride) {
673 if (MAP > TakeoffMAP[BoostSpeed]) MAP = TakeoffMAP[BoostSpeed];
675 if (MAP > RatedMAP[BoostSpeed]) MAP = RatedMAP[BoostSpeed];
682 if( BoostLossFactor > 0.0 )
684 double gamma = 1.414;
686 BoostLossHP = ((Nstage * TMAP * v_dot_air * gamma) / (gamma - 1)) * (pow((MAP/TMAP),((gamma-1)/(Nstage * gamma))) - 1) * BoostLossFactor / 745.7 ;
692 ManifoldPressure_inHg = MAP / inhgtopa;
709 void FGPiston::doAirFlow(
void)
714 double mratio = MAP < 1. ? CompressionRatio : p_amb/MAP;
715 if (mratio > CompressionRatio) mratio = CompressionRatio;
716 double ve =((gamma-1)/gamma) +( CompressionRatio -(mratio))/(gamma*( CompressionRatio - 1));
718 rho_air = p_amb / (R_air * T_amb);
719 double swept_volume = (displacement_SI * (RPM/60)) / 2;
720 volumetric_efficiency_reduced = volumetric_efficiency *ve;
721 v_dot_air = swept_volume * volumetric_efficiency_reduced;
723 double rho_air_manifold = MAP / (R_air * T_amb);
724 m_dot_air = v_dot_air * rho_air_manifold;
737 void FGPiston::doFuelFlow(
void)
739 double thi_sea_level = 1.3 * in.MixturePos[EngineNumber];
740 equivalence_ratio = thi_sea_level * 101325.0 / p_amb;
743 m_dot_fuel = (m_dot_air * equivalence_ratio) / 14.7;
744 FuelFlowRate = m_dot_fuel * 2.2046;
747 equivalence_ratio = 0.0;
751 FuelFlow_pph = FuelFlowRate * 3600;
752 FuelFlow_gph = FuelFlow_pph / FuelDensity;
766 void FGPiston::doEnginePower(
void)
768 IndicatedHorsePower = -StaticFriction_HP;
772 ME = Mixture_Efficiency_Correlation->GetValue(m_dot_fuel/m_dot_air);
775 FMEP = (-FMEPDynamic * MeanPistonSpeed_fps * fttom - FMEPStatic);
779 if ( Magnetos != 3 ) power *= SparkFailDrop;
782 IndicatedHorsePower = (FuelFlow_pph / ISFC )* ME * power - StaticFriction_HP;
786 double torque, k_torque, rpm;
788 rpm = RPM < 1.0 ? 1.0 : RPM;
790 if(RPM<StarterRPM) k_torque = 1.0-RPM/(StarterRPM);
792 torque = StarterTorque*k_torque*StarterGain;
793 IndicatedHorsePower = torque * rpm / 5252;
799 double pumping_hp = ((PMEP + FMEP) * displacement_SI * RPM)/(Cycles*22371);
801 HP = IndicatedHorsePower + pumping_hp - BoostLossHP;
803 PctPower = HP / MaxHP ;
817 void FGPiston::doEGT(
void)
819 double delta_T_exhaust;
820 double enthalpy_exhaust;
821 double heat_capacity_exhaust;
824 if ((Running) && (m_dot_air > 0.0)) {
825 combustion_efficiency = Lookup_Combustion_Efficiency->GetValue(equivalence_ratio);
826 enthalpy_exhaust = m_dot_fuel * calorific_value_fuel *
827 combustion_efficiency * 0.30;
828 heat_capacity_exhaust = (Cp_air * m_dot_air) + (Cp_fuel * m_dot_fuel);
829 delta_T_exhaust = enthalpy_exhaust / heat_capacity_exhaust;
830 ExhaustGasTemp_degK = T_amb + delta_T_exhaust;
832 combustion_efficiency = 0;
833 dEGTdt = (
RankineToKelvin(in.Temperature) - ExhaustGasTemp_degK) / 100.0;
834 delta_T_exhaust = dEGTdt * in.TotalDeltaT;
836 ExhaustGasTemp_degK += delta_T_exhaust;
850 void FGPiston::doCHT(
void)
856 double arbitary_area = Displacement/360.0;
857 double CpCylinderHead = 800.0;
858 double MassCylinderHead = CylinderHeadMass * Cylinders;
860 double temperature_difference = CylinderHeadTemp_degK - T_amb;
861 double v_apparent = IAS * Cooling_Factor;
862 double v_dot_cooling_air = arbitary_area * v_apparent;
863 double m_dot_cooling_air = v_dot_cooling_air * rho_air;
864 double dqdt_from_combustion =
865 m_dot_fuel * calorific_value_fuel * combustion_efficiency * 0.33;
866 double dqdt_forced = (h2 * m_dot_cooling_air * temperature_difference) +
867 (h3 * RPM * temperature_difference / MaxRPM);
868 double dqdt_free = h1 * temperature_difference * arbitary_area;
869 double dqdt_cylinder_head = dqdt_from_combustion + dqdt_forced + dqdt_free;
871 double HeatCapacityCylinderHead = CpCylinderHead * MassCylinderHead;
873 CylinderHeadTemp_degK +=
874 (dqdt_cylinder_head / HeatCapacityCylinderHead) * in.TotalDeltaT;
887 void FGPiston::doOilTemperature(
void)
889 double target_oil_temp;
890 double time_constant;
891 double efficiency = 0.667;
895 target_oil_temp = CylinderHeadTemp_degK + efficiency * (T_amb - CylinderHeadTemp_degK) ;
897 if (OilPressure_psi > 5.0 ) {
898 time_constant = 5000 / OilPressure_psi;
903 time_constant = 1000;
907 double dOilTempdt = (target_oil_temp - OilTemp_degK) / time_constant;
909 OilTemp_degK += (dOilTempdt * in.TotalDeltaT);
921 void FGPiston::doOilPressure(
void)
923 double Oil_Press_Relief_Valve = 60;
924 double Oil_Press_RPM_Max = MaxRPM * 0.75;
925 double Design_Oil_Temp = 358;
926 double Oil_Viscosity_Index = 0.25;
928 OilPressure_psi = (Oil_Press_Relief_Valve / Oil_Press_RPM_Max) * RPM;
930 if (OilPressure_psi >= Oil_Press_Relief_Valve) {
931 OilPressure_psi = Oil_Press_Relief_Valve;
934 OilPressure_psi += (Design_Oil_Temp - OilTemp_degK) * Oil_Viscosity_Index * OilPressure_psi / Oil_Press_Relief_Valve;
941 double FGPiston::GetStdPressure100K(
double altitude)
const 944 if (altitude > 100000.0) altitude = 100000.0;
947 const double coef[5] = { 2116.217,
954 for (
int pwr=1; pwr<=4; pwr++) alt[pwr] = alt[pwr-1]*altitude;
957 for (
int ctr=0; ctr<=4; ctr++) press += coef[ctr]*alt[ctr];
963 string FGPiston::GetEngineLabels(
const string& delimiter)
965 std::ostringstream buf;
967 buf << Name <<
" Power Available (engine " << EngineNumber <<
" in ft-lbs/sec)" << delimiter
968 << Name <<
" HP (engine " << EngineNumber <<
")" << delimiter
969 << Name <<
" equivalent ratio (engine " << EngineNumber <<
")" << delimiter
970 << Name <<
" MAP (engine " << EngineNumber <<
" in inHg)" << delimiter
971 << Thruster->GetThrusterLabels(EngineNumber, delimiter);
978 string FGPiston::GetEngineValues(
const string& delimiter)
980 std::ostringstream buf;
982 buf << (HP * hptoftlbssec) << delimiter << HP << delimiter
983 << equivalence_ratio << delimiter << ManifoldPressure_inHg << delimiter
984 << Thruster->GetThrusterValues(EngineNumber, delimiter);
1009 void FGPiston::Debug(
int from)
1011 if (debug_lvl <= 0)
return;
1013 if (debug_lvl & 1) {
1016 cout <<
"\n Engine Name: " << Name << endl;
1017 cout <<
" MinManifoldPressure: " << MinManifoldPressure_inHg << endl;
1018 cout <<
" MaxManifoldPressure: " << MaxManifoldPressure_inHg << endl;
1019 cout <<
" MinMaP (Pa): " << minMAP << endl;
1020 cout <<
" MaxMaP (Pa): " << maxMAP << endl;
1021 cout <<
" Displacement: " << Displacement << endl;
1022 cout <<
" Bore: " << Bore << endl;
1023 cout <<
" Stroke: " << Stroke << endl;
1024 cout <<
" Cylinders: " << Cylinders << endl;
1025 cout <<
" Cylinders Head Mass: " << CylinderHeadMass << endl;
1026 cout <<
" Compression Ratio: " << CompressionRatio << endl;
1027 cout <<
" MaxHP: " << MaxHP << endl;
1028 cout <<
" Cycles: " << Cycles << endl;
1029 cout <<
" IdleRPM: " << IdleRPM << endl;
1030 cout <<
" MaxRPM: " << MaxRPM << endl;
1031 cout <<
" Throttle Constant: " << Z_throttle << endl;
1032 cout <<
" ISFC: " << ISFC << endl;
1033 cout <<
" Volumetric Efficiency: " << volumetric_efficiency << endl;
1034 cout <<
" PeakMeanPistonSpeed_fps: " << PeakMeanPistonSpeed_fps << endl;
1035 cout <<
" Intake Impedance Factor: " << Z_airbox << endl;
1036 cout <<
" Dynamic FMEP Factor: " << FMEPDynamic << endl;
1037 cout <<
" Static FMEP Factor: " << FMEPStatic << endl;
1039 cout <<
" Starter Motor Torque: " << StarterTorque << endl;
1040 cout <<
" Starter Motor RPM: " << StarterRPM << endl;
1043 cout <<
" Combustion Efficiency table:" << endl;
1044 Lookup_Combustion_Efficiency->Print();
1048 cout <<
" Mixture Efficiency Correlation table:" << endl;
1049 Mixture_Efficiency_Correlation->Print();
1054 if (debug_lvl & 2 ) {
1055 if (from == 0) cout <<
"Instantiated: FGPiston" << endl;
1056 if (from == 1) cout <<
"Destroyed: FGPiston" << endl;
1058 if (debug_lvl & 4 ) {
1060 if (debug_lvl & 8 ) {
1062 if (debug_lvl & 16) {
1064 if (debug_lvl & 64) {
1066 cout << IdSrc << endl;
1067 cout << IdHdr << endl;
static double Constrain(double min, double value, double max)
Constrain a value between a minimum and a maximum value.
double CalcFuelNeed(void)
The fuel need is calculated based on power levels and flow rate for that power level.
std::string GetAttributeValue(const std::string &key)
Retrieves an attribute.
double FindElementValueAsNumberConvertTo(const std::string &el, const std::string &target_units)
Searches for the named element and converts and returns the data belonging to it. ...
FGPropeller models a propeller given the tabular data for Ct (thrust) and Cp (power), indexed by the advance ratio "J".
Element * FindElement(const std::string &el="")
Searches for a specified element.
double FindElementValueAsNumber(const std::string &el="")
Searches for the named element and returns the data belonging to it as a number.
FGPropertyManager * GetPropertyManager(void)
Returns a pointer to the property manager object.
void Tie(const std::string &name, bool *pointer, bool useDefault=true)
Tie a property to an external bool variable.
static double RankineToKelvin(double rankine)
Converts from degrees Rankine to degrees Kelvin.
void Calculate(void)
Calculates the thrust of the engine, and other engine functions.
Base class for all engines.
Element * FindNextElement(const std::string &el="")
Searches for the next element as specified.
void ResetToIC(void)
Resets the Engine parameters to the initial conditions.
Encapsulates the JSBSim simulation executive.
virtual void ResetToIC(void)
Resets the Engine parameters to the initial conditions.