]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/propulsion/FGPiston.h
add a reference for memset()
[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 protected:
203   double ThrottlePos;
204
205
206 private:
207   int crank_counter;
208
209   double BrakeHorsePower;
210   double SpeedSlope;
211   double SpeedIntercept;
212   double AltitudeSlope;
213   double PowerAvailable;
214
215   // timestep
216   double dt;
217
218   void doEngineStartup(void);
219   void doBoostControl(void);
220   void doMAP(void);
221   void doAirFlow(void);
222   void doFuelFlow(void);
223   void doEnginePower(void);
224   void doEGT(void);
225   void doCHT(void);
226   void doOilPressure(void);
227   void doOilTemperature(void);
228
229   int InitRunning(void);
230
231   //
232   // constants
233   //
234
235   const double R_air;
236   const double rho_fuel;    // kg/m^3
237   const double calorific_value_fuel;  // W/Kg (approximate)
238   const double Cp_air;      // J/KgK
239   const double Cp_fuel;     // J/KgK
240
241   FGTable *Lookup_Combustion_Efficiency;
242   FGTable *Power_Mixture_Correlation;
243   FGTable *Mixture_Efficiency_Correlation;
244
245   //
246   // Configuration
247   //
248   double MinManifoldPressure_inHg; // Inches Hg
249   double MaxManifoldPressure_inHg; // Inches Hg
250   double Displacement;             // cubic inches
251   double MaxHP;                    // horsepower
252   double SparkFailDrop;            // drop of power due to spark failure
253   double Cycles;                   // cycles/power stroke
254   double IdleRPM;                  // revolutions per minute
255   double MaxRPM;                   // revolutions per minute
256   double StarterHP;                // initial horsepower of starter motor
257   int BoostSpeeds;      // Number of super/turbocharger boost speeds - zero implies no turbo/supercharging.
258   int BoostSpeed;       // The current boost-speed (zero-based).
259   bool Boosted;         // Set true for boosted engine.
260   int BoostOverride;    // The raw value read in from the config file - should be 1 or 0 - see description below.
261   bool bBoostOverride;  // Set true if pilot override of the boost regulator was fitted.
262               // (Typically called 'war emergency power').
263   bool bTakeoffBoost;   // Set true if extra takeoff / emergency boost above rated boost could be attained.
264               // (Typically by extra throttle movement past a mechanical 'gate').
265   double TakeoffBoost;  // Sea-level takeoff boost in psi. (if fitted).
266   double RatedBoost[FG_MAX_BOOST_SPEEDS];       // Sea-level rated boost in psi.
267   double RatedAltitude[FG_MAX_BOOST_SPEEDS];    // Altitude at which full boost is reached (boost regulation ends)
268                           // and at which power starts to fall with altitude [ft].
269   double RatedRPM[FG_MAX_BOOST_SPEEDS]; // Engine speed at which the rated power for each boost speed is delivered [rpm].
270   double RatedPower[FG_MAX_BOOST_SPEEDS];       // Power at rated throttle position at rated altitude [HP].
271   double BoostSwitchAltitude[FG_MAX_BOOST_SPEEDS - 1];  // Altitude at which switchover (currently assumed automatic)
272                               // from one boost speed to next occurs [ft].
273   double BoostSwitchPressure[FG_MAX_BOOST_SPEEDS - 1];  // Pressure at which boost speed switchover occurs [Pa]
274   double BoostMul[FG_MAX_BOOST_SPEEDS]; // Pressure multipier of unregulated supercharger
275   double RatedMAP[FG_MAX_BOOST_SPEEDS]; // Rated manifold absolute pressure [Pa] (BCV clamp)
276   double TakeoffMAP[FG_MAX_BOOST_SPEEDS];       // Takeoff setting manifold absolute pressure [Pa] (BCV clamp)
277   double BoostSwitchHysteresis; // Pa.
278
279   double minMAP;  // Pa
280   double maxMAP;  // Pa
281   double MAP;     // Pa
282   double BSFC;    // unitless
283
284   //
285   // Inputs (in addition to those in FGEngine).
286   //
287   double p_amb;              // Pascals
288   double p_amb_sea_level;    // Pascals
289   double T_amb;              // degrees Kelvin
290   double RPM;                // revolutions per minute
291   double IAS;                // knots
292   bool Magneto_Left;
293   bool Magneto_Right;
294   int Magnetos;
295
296
297   //
298   // Outputs (in addition to those in FGEngine).
299   //
300   double rho_air;
301   double volumetric_efficiency;
302   double suction_loss;
303   double m_dot_air;
304   double equivalence_ratio;
305   double m_dot_fuel;
306   double Percentage_Power;
307   double HP;
308   double combustion_efficiency;
309   double ExhaustGasTemp_degK;
310   double EGT_degC;
311   double ManifoldPressure_inHg;
312   double CylinderHeadTemp_degK;
313   double OilPressure_psi;
314   double OilTemp_degK;
315
316   void Debug(int from);
317 };
318 }
319 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
320 #endif