]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/propulsion/FGPiston.h
Update to the latest version of JSBSim which supports Lighter Than Air craft
[flightgear.git] / src / FDM / JSBSim / models / propulsion / FGPiston.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGPiston.h
4  Author:       Jon S. Berndt
5  Date started: 09/12/2000
6
7  ------------- Copyright (C) 2000  Jon S. Berndt (jsb@hal-pc.org) --------------
8
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU Lesser General Public License as published by the Free Software
11  Foundation; either version 2 of the License, or (at your option) any later
12  version.
13
14  This program is distributed in the hope that it will be useful, but WITHOUT
15  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16  FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
17  details.
18
19  You should have received a copy of the GNU Lesser General Public License along with
20  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21  Place - Suite 330, Boston, MA  02111-1307, USA.
22
23  Further information about the GNU Lesser General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25
26 HISTORY
27 --------------------------------------------------------------------------------
28 09/12/2000  JSB  Created
29 10/01/2001  DPM  Modified to use equations from Dave Luff's piston model.
30
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 SENTRY
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34
35 #ifndef FGPISTON_H
36 #define FGPISTON_H
37
38 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 INCLUDES
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41
42 #include "FGEngine.h"
43 #include <math/FGTable.h>
44 #include <input_output/FGXMLElement.h>
45
46 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 DEFINITIONS
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
49
50 #define ID_PISTON "$Id$";
51 #define FG_MAX_BOOST_SPEEDS 3
52
53 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54 FORWARD DECLARATIONS
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
56
57 namespace JSBSim {
58
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS DOCUMENTATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62
63 /** Models Dave Luff's Turbo/Supercharged Piston engine model.
64
65 <h3>Configuration File Format:</h3>
66
67 @code
68 <piston_engine name="{string}">
69   <minmp unit="{INHG | PA | ATM}"> {number} </minmp>
70   <maxmp unit="{INHG | PA | ATM}"> {number} </maxmp>
71   <displacement unit="{IN3 | LTR | CC}"> {number} </displacement>
72   <maxhp unit="{HP | WATTS}"> {number} </maxhp>
73   <cycles> {number} </cycles>
74   <idlerpm> {number} </idlerpm>
75   <maxthrottle> {number} </maxthrottle>
76   <minthrottle> {number} </minthrottle>
77   <numboostspeeds> {number} </numboostspeeds>
78   <boostoverride> {0 | 1} </boostoverride>
79   <ratedboost1 unit="{INHG | PA | ATM}"> {number} </ratedboost1>
80   <ratedpower1 unit="{HP | WATTS}"> {number} </ratedpower1>
81   <ratedrpm1> {number} </ratedrpm1>
82   <ratedaltitude1 unit="{FT | M}"> {number} </ratedaltitude1>
83   <ratedboost2 unit="{INHG | PA | ATM}"> {number} </ratedboost2>
84   <ratedpower2 unit="{HP | WATTS}"> {number} </ratedpower2>
85   <ratedrpm2> {number} </ratedrpm2>
86   <ratedaltitude2 unit="{FT | M}"> {number} </ratedaltitude2>
87   <ratedboost3 unit="{INHG | PA | ATM}"> {number} </ratedboost3>
88   <ratedpower3 unit="{HP | WATTS}"> {number} </ratedpower3>
89   <ratedrpm3> {number} </ratedrpm3>
90   <ratedaltitude3 unit="{FT | M}"> {number} </ratedaltitude3>
91   <takeoffboost unit="{INHG | PA | ATM}"> {number} </takeoffboost>
92 </piston_engine>
93 @endcode
94
95 <pre>
96     Additional elements are required for a supercharged engine.  These can be
97     left off a non-supercharged engine, ie. the changes are all backward
98     compatible at present.
99
100     - NUMBOOSTSPEEDS - zero (or not present) for a naturally-aspirated engine,
101       either 1, 2 or 3 for a boosted engine.  This corresponds to the number of
102       supercharger speeds.  Merlin XII had 1 speed, Merlin 61 had 2, a late
103       Griffon engine apparently had 3.  No known engine more than 3, although
104       some German engines apparently had a continuously variable-speed
105       supercharger.
106
107     - BOOSTOVERRIDE - whether the boost pressure control system (either a boost
108       control valve for superchargers or wastegate for turbochargers) can be
109       overriden by the pilot.  During wartime this was commonly possible, and
110       known as "War Emergency Power" by the Brits.  1 or 0 in the config file.
111       This isn't implemented in the model yet though, there would need to be
112       some way of getting the boost control cutout lever position (on or off)
113       from FlightGear first.
114
115     - The next items are all appended with either 1, 2 or 3 depending on which
116       boost speed they refer to, eg RATEDBOOST1.  The rated values seems to have
117       been a common convention at the time to express the maximum continuously
118       available power, and the conditions to attain that power.
119
120     - RATEDBOOST[123] - the absolute rated boost above sea level ambient for a
121       given boost speed, in psi.  Eg the Merlin XII had a rated boost of 9psi,
122       giving approximately 42inHg manifold pressure up to the rated altitude.
123
124     - RATEDALTITUDE[123] - The altitude up to which rated boost can be
125       maintained.  Up to this altitude the boost is maintained constant for a
126       given throttle position by the BCV or wastegate.  Beyond this altitude the
127       manifold pressure must drop, since the supercharger is now at maximum
128       unregulated output.  The actual pressure multiplier of the supercharger
129       system is calculated at initialisation from this value.
130
131     - RATEDPOWER[123] - The power developed at rated boost at rated altitude at
132       rated rpm.
133
134     - RATEDRPM[123] - The rpm at which rated power is developed.
135
136     - TAKEOFFBOOST - Takeoff boost in psi above ambient.  Many aircraft had an
137       extra boost setting beyond rated boost, but not totally uncontrolled as in
138       the already mentioned boost-control-cutout, typically attained by pushing
139       the throttle past a mechanical 'gate' preventing its inadvertant use. This
140       was typically used for takeoff, and emergency situations, generally for
141       not more than five minutes.  This is a change in the boost control
142       setting, not the actual supercharger speed, and so would only give extra
143       power below the rated altitude.  When TAKEOFFBOOST is specified in the
144       config file (and is above RATEDBOOST1), then the throttle position is
145       interpreted as:
146
147     - 0 to 0.95 : idle manifold pressure to rated boost (where attainable)
148     - 0.96, 0.97, 0.98 : rated boost (where attainable).
149     - 0.99, 1.0 : takeoff boost (where attainable).
150
151     A typical takeoff boost for an earlyish Merlin was about 12psi, compared
152     with a rated boost of 9psi.
153
154     It is quite possible that other boost control settings could have been used
155     on some aircraft, or that takeoff/extra boost could have activated by other
156     means than pushing the throttle full forward through a gate, but this will
157     suffice for now.
158
159     Note that MAXMP is still the non-boosted max manifold pressure even for
160     boosted engines - effectively this is simply a measure of the pressure drop
161     through the fully open throttle.
162 </pre>
163
164     @author Jon S. Berndt (Engine framework code and framework-related mods)
165     @author Dave Luff (engine operational code)
166     @author David Megginson (initial porting and additional code)
167     @version $Id$
168   */
169
170 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
171 CLASS DECLARATION
172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
173
174 class FGPiston : public FGEngine
175 {
176 public:
177   /// Constructor
178   FGPiston(FGFDMExec* exec, Element* el, int engine_number);
179   /// Destructor
180   ~FGPiston();
181
182   string GetEngineLabels(string delimeter);
183   string GetEngineValues(string delimeter);
184
185   double Calculate(void);
186   double GetPowerAvailable(void) {return PowerAvailable;}
187   double CalcFuelNeed(void);
188
189   void ResetToIC(void);
190   void SetMagnetos(int magnetos) {Magnetos = magnetos;}
191
192   double  GetEGT(void) { return EGT_degC; }
193   int     GetMagnetos(void) {return Magnetos;}
194
195   double getExhaustGasTemp_degF(void) {return KelvinToFahrenheit(ExhaustGasTemp_degK);}
196   double getManifoldPressure_inHg(void) const {return ManifoldPressure_inHg;}
197   double getCylinderHeadTemp_degF(void) {return KelvinToFahrenheit(CylinderHeadTemp_degK);}
198   double getOilPressure_psi(void) const {return OilPressure_psi;}
199   double getOilTemp_degF (void) {return KelvinToFahrenheit(OilTemp_degK);}
200   double getRPM(void) {return RPM;}
201
202 private:
203   int crank_counter;
204
205   double BrakeHorsePower;
206   double SpeedSlope;
207   double SpeedIntercept;
208   double AltitudeSlope;
209   double PowerAvailable;
210
211   // timestep
212   double dt;
213
214   void doEngineStartup(void);
215   void doBoostControl(void);
216   void doMAP(void);
217   void doAirFlow(void);
218   void doFuelFlow(void);
219   void doEnginePower(void);
220   void doEGT(void);
221   void doCHT(void);
222   void doOilPressure(void);
223   void doOilTemperature(void);
224
225   int InitRunning(void);
226
227   //
228   // constants
229   //
230
231   const double R_air;
232   const double rho_fuel;    // kg/m^3
233   const double calorific_value_fuel;  // W/Kg (approximate)
234   const double Cp_air;      // J/KgK
235   const double Cp_fuel;     // J/KgK
236
237   FGTable *Lookup_Combustion_Efficiency;
238   FGTable *Power_Mixture_Correlation;
239
240   //
241   // Configuration
242   //
243   double MinManifoldPressure_inHg; // Inches Hg
244   double MaxManifoldPressure_inHg; // Inches Hg
245   double Displacement;             // cubic inches
246   double MaxHP;                    // horsepower
247   double SparkFailDrop;            // drop of power due to spark failure
248   double Cycles;                   // cycles/power stroke
249   double IdleRPM;                  // revolutions per minute
250   double StarterHP;                // initial horsepower of starter motor 
251   int BoostSpeeds;      // Number of super/turbocharger boost speeds - zero implies no turbo/supercharging.
252   int BoostSpeed;       // The current boost-speed (zero-based).
253   bool Boosted;         // Set true for boosted engine.
254   int BoostOverride;    // The raw value read in from the config file - should be 1 or 0 - see description below.
255   bool bBoostOverride;  // Set true if pilot override of the boost regulator was fitted.
256               // (Typically called 'war emergency power').
257   bool bTakeoffBoost;   // Set true if extra takeoff / emergency boost above rated boost could be attained.
258               // (Typically by extra throttle movement past a mechanical 'gate').
259   double TakeoffBoost;  // Sea-level takeoff boost in psi. (if fitted).
260   double RatedBoost[FG_MAX_BOOST_SPEEDS];       // Sea-level rated boost in psi.
261   double RatedAltitude[FG_MAX_BOOST_SPEEDS];    // Altitude at which full boost is reached (boost regulation ends)
262                           // and at which power starts to fall with altitude [ft].
263   double RatedRPM[FG_MAX_BOOST_SPEEDS]; // Engine speed at which the rated power for each boost speed is delivered [rpm].
264   double RatedPower[FG_MAX_BOOST_SPEEDS];       // Power at rated throttle position at rated altitude [HP].
265   double BoostSwitchAltitude[FG_MAX_BOOST_SPEEDS - 1];  // Altitude at which switchover (currently assumed automatic)
266                               // from one boost speed to next occurs [ft].
267   double BoostSwitchPressure[FG_MAX_BOOST_SPEEDS - 1];  // Pressure at which boost speed switchover occurs [Pa]
268   double BoostMul[FG_MAX_BOOST_SPEEDS]; // Pressure multipier of unregulated supercharger
269   double RatedMAP[FG_MAX_BOOST_SPEEDS]; // Rated manifold absolute pressure [Pa] (BCV clamp)
270   double TakeoffMAP[FG_MAX_BOOST_SPEEDS];       // Takeoff setting manifold absolute pressure [Pa] (BCV clamp)
271   double BoostSwitchHysteresis; // Pa.
272
273   double minMAP;  // Pa
274   double maxMAP;  // Pa
275   double MAP;     // Pa
276
277   //
278   // Inputs (in addition to those in FGEngine).
279   //
280   double p_amb;              // Pascals
281   double p_amb_sea_level;    // Pascals
282   double T_amb;              // degrees Kelvin
283   double RPM;                // revolutions per minute
284   double IAS;                // knots
285   bool Magneto_Left;
286   bool Magneto_Right;
287   int Magnetos;
288
289   //
290   // Outputs (in addition to those in FGEngine).
291   //
292   double rho_air;
293   double volumetric_efficiency;
294   double m_dot_air;
295   double equivalence_ratio;
296   double m_dot_fuel;
297   double Percentage_Power;
298   double HP;
299   double combustion_efficiency;
300   double ExhaustGasTemp_degK;
301   double EGT_degC;
302   double ManifoldPressure_inHg;
303   double CylinderHeadTemp_degK;
304   double OilPressure_psi;
305   double OilTemp_degK;
306
307   void Debug(int from);
308 };
309 }
310 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
311 #endif