]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/propulsion/FGTurbine.h
Update to the latest version of JSBSim which supports Lighter Than Air craft
[flightgear.git] / src / FDM / JSBSim / models / propulsion / FGTurbine.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGTurbine.h
4  Author:       David Culp
5  Date started: 03/11/2003
6
7  ------------- Copyright (C) 2003  David Culp (davidculp2@comcast.net)----------
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 03/11/2003  DPC  Created, based on FGTurbine
29 09/22/2003  DPC  Added starting, stopping, new framework
30 04/29/2004  DPC  Renamed from FGSimTurbine to FGTurbine
31
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33 SENTRY
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
35
36 #ifndef FGTURBINE_H
37 #define FGTURBINE_H
38
39 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 INCLUDES
41 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42
43 #include <vector>
44 #include "FGEngine.h"
45 #include <input_output/FGXMLElement.h>
46 #include <math/FGFunction.h>
47
48 #define ID_TURBINE "$Id$"
49
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 FORWARD DECLARATIONS
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
53
54 namespace JSBSim {
55
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 CLASS DOCUMENTATION
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
59
60 /** This class models a turbine engine.  Based on Jon Berndt's FGTurbine module.
61     Here the term "phase" signifies the engine's mode of operation.  At any given
62     time the engine is in only one phase.  At simulator startup the engine will be
63     placed in the Trim phase in order to provide a simplified thrust value without
64     throttle lag.  When trimming is complete the engine will go to the Off phase,
65     unless the value FGEngine::Running has been previously set to true, in which
66     case the engine will go to the Run phase.  Once an engine is in the Off phase
67     the full starting procedure (or airstart) must be used to get it running.
68 <P>
69     - STARTING (on ground):
70       -# Set the control FGEngine::Starter to true.  The engine will spin up to
71          a maximum of about %25 N2 (%5.2 N1).  This simulates the action of a
72          pneumatic starter.
73       -# After reaching %15 N2 set the control FGEngine::Cutoff to false. If fuel
74          is available the engine will now accelerate to idle.  The starter will
75          automatically be set to false after the start cycle.
76 <P>
77     - STARTING (in air):
78       -# Increase speed to obtain a minimum of %15 N2.  If this is not possible,
79          the starter may be used to assist.
80       -# Place the control FGEngine::Cutoff to false.
81 <P>
82     Ignition is assumed to be on anytime the Cutoff control is set to false,
83     therefore a seperate ignition system is not modeled.
84
85 <h3>Configuration File Format:</h3>
86 @code
87  <turbine_engine name="{string}">
88   <milthrust unit="{LBS | N}"> {number} </milthrust>
89   <maxthrust unit="{LBS | N}"> {number} </maxthrust>
90   <bypassratio> {number} </bypassratio>
91   <bleed> {number} </bleed>
92   <tsfc> {number} </tsfc>
93   <atsfc> {number} </atsfc>
94   <idlen1> {number} </idlen1>
95   <idlen2> {number} </idlen2>
96   <maxn1> {number} </maxn1>
97   <maxn2> {number} </maxn2>
98   <augmented> {0 | 1} </augmented>
99   <augmethod> {0 | 1 | 2} </augmethod>
100   <injected> {0 | 1} </injected>
101   <injection-time> {number} </injection-time>
102  </turbine_engine>
103 @endcode
104
105 <h3>Definition of the turbine engine configuration file parameters:</h3>
106
107 <pre>
108   milthrust   - Maximum thrust, static, at sea level.
109   maxthrust   - Afterburning thrust, static, at sea level.
110   bypassratio - Ratio of bypass air flow to core air flow.
111   bleed       - Thrust reduction factor due to losses (0.0 to 1.0).
112   tsfc        - Thrust-specific fuel consumption at cruise, lbm/hr/lbf
113   atsfc       - Afterburning TSFC, lbm/hr/lbf
114   idlen1      - Fan rotor rpm (% of max) at idle
115   idlen2      - Core rotor rpm (% of max) at idle
116   maxn1       - Fan rotor rpm (% of max) at full throttle 
117   maxn2       - Core rotor rpm (% of max) at full throttle
118   augmented
119               0 = afterburner not installed
120               1 = afterburner installed
121   augmethod
122               0 = afterburner activated by property /engines/engine[n]/augmentation
123               1 = afterburner activated by pushing throttle above 99% position
124               2 = throttle range is expanded in the FCS, and values above 1.0 are afterburner range
125   injected
126               0 = Water injection not installed
127               1 = Water injection installed
128   injection-time - Time, in seconds, of water injection duration 
129 </pre>
130
131 <h3>NOTES:</h3>  
132 <pre>
133     Bypass ratio is used only to estimate engine acceleration time.  The
134     effect of bypass ratio on engine efficiency is already included in
135     the TSFC value.  Feel free to set this parameter (even for turbojets) to
136     whatever value gives a desired spool-up rate. Default value is 0.
137
138     The bleed factor is multiplied by thrust to give a resulting thrust
139     after losses.  This can represent losses due to bleed, or any other cause.
140     Default value is 0.  A common value would be 0.04.
141
142     Nozzle position, for variable area exhaust nozzles, is provided for users
143     needing to drive a nozzle gauge or animate a virtual nozzle.
144
145     This model can only be used with the "direct" thruster.  See the file:
146     /engine/direct.xml
147 </pre>
148     @author David P. Culp
149     @version "$Id$"
150 */
151
152 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153 CLASS DECLARATION
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
155
156 class FGTurbine : public FGEngine
157 {
158 public:
159   /** Constructor
160       @param Executive pointer to executive structure
161       @param el pointer to the XML element representing the turbine engine
162       @param engine_number engine number  */
163   FGTurbine(FGFDMExec* Executive, Element *el, int engine_number);
164   /// Destructor
165   ~FGTurbine();
166
167   enum phaseType { tpOff, tpRun, tpSpinUp, tpStart, tpStall, tpSeize, tpTrim };
168
169   double Calculate(void);
170   double CalcFuelNeed(void);
171   double GetPowerAvailable(void);
172   double GetThrust(void) const {return Thrust;}
173   /** A lag filter.
174       Used to control the rate at which values are allowed to change.
175       @param var a pointer to a variable of type double
176       @param target the desired (target) value
177       @param accel the rate, per second, the value may increase
178       @param decel the rate, per second, the value may decrease    */
179   double Seek(double* var, double target, double accel, double decel);
180
181   phaseType GetPhase(void) { return phase; }
182
183   bool GetOvertemp(void)  const {return Overtemp; }
184   bool GetInjection(void) const {return Injection;}
185   bool GetFire(void) const { return Fire; }
186   bool GetAugmentation(void) const {return Augmentation;}
187   bool GetReversed(void) const { return Reversed; }
188   bool GetCutoff(void) const { return Cutoff; }
189   int GetIgnition(void) const {return Ignition;}
190
191   double GetInlet(void) const { return InletPosition; }
192   double GetNozzle(void) const { return NozzlePosition; }
193   double GetBleedDemand(void) const {return BleedDemand;}
194   double GetN1(void) const {return N1;}
195   double GetN2(void) const {return N2;}
196   double GetEPR(void) const {return EPR;}
197   double GetEGT(void) const {return EGT_degC;}
198
199   double getOilPressure_psi () const {return OilPressure_psi;}
200   double getOilTemp_degF (void) {return KelvinToFahrenheit(OilTemp_degK);}
201
202   void SetInjection(bool injection) {Injection = injection;}
203   void SetIgnition(int ignition) {Ignition = ignition;}
204   void SetAugmentation(bool augmentation) {Augmentation = augmentation;}
205   void SetPhase( phaseType p ) { phase = p; }
206   void SetEPR(double epr) {EPR = epr;}
207   void SetBleedDemand(double bleedDemand) {BleedDemand = bleedDemand;}
208   void SetReverse(bool reversed) { Reversed = reversed; }
209   void SetCutoff(bool cutoff) { Cutoff = cutoff; }
210   int InitRunning(void);
211   void ResetToIC(void);
212
213   string GetEngineLabels(string delimeter);
214   string GetEngineValues(string delimeter);
215
216 private:
217
218   phaseType phase;         ///< Operating mode, or "phase"
219   double MilThrust;        ///< Maximum Unaugmented Thrust, static @ S.L. (lbf)
220   double MaxThrust;        ///< Maximum Augmented Thrust, static @ S.L. (lbf)
221   double BypassRatio;      ///< Bypass Ratio
222   double TSFC;             ///< Thrust Specific Fuel Consumption (lbm/hr/lbf)
223   double ATSFC;            ///< Augmented TSFC (lbm/hr/lbf)
224   double IdleN1;           ///< Idle N1
225   double IdleN2;           ///< Idle N2
226   double N1;               ///< N1
227   double N2;               ///< N2
228   double MaxN1;            ///< N1 at 100% throttle
229   double MaxN2;            ///< N2 at 100% throttle
230   double IdleFF;           ///< Idle Fuel Flow (lbm/hr)
231   double delay;            ///< Inverse spool-up time from idle to 100% (seconds)
232   double dt;               ///< Simulator time slice
233   double N1_factor;        ///< factor to tie N1 and throttle
234   double N2_factor;        ///< factor to tie N2 and throttle
235   double ThrottlePos;      ///< FCS-supplied throttle position
236   double AugmentCmd;       ///< modulated afterburner command (0.0 to 1.0)
237   double TAT;              ///< total air temperature (deg C)
238   bool Stalled;            ///< true if engine is compressor-stalled
239   bool Seized;             ///< true if inner spool is seized
240   bool Overtemp;           ///< true if EGT exceeds limits
241   bool Fire;               ///< true if engine fire detected
242   bool Injection;
243   bool Augmentation;
244   bool Reversed;
245   bool Cutoff;
246   int Injected;            ///< = 1 if water injection installed
247   int Ignition;
248   int Augmented;           ///< = 1 if augmentation installed
249   int AugMethod;           ///< = 0 if using property /engine[n]/augmentation
250                            ///< = 1 if using last 1% of throttle movement
251                            ///< = 2 if using FCS-defined throttle
252   double EGT_degC;
253   double EPR;
254   double OilPressure_psi;
255   double OilTemp_degK;
256   double BleedDemand;
257   double InletPosition;
258   double NozzlePosition;
259   double correctedTSFC;
260   double InjectionTimer;
261   double InjectionTime;
262
263   double Off(void);
264   double Run();
265   double SpinUp(void);
266   double Start(void);
267   double Stall(void);
268   double Seize(void);
269   double Trim();
270
271   FGFunction *IdleThrustLookup;
272   FGFunction *MilThrustLookup;
273   FGFunction *MaxThrustLookup;
274   FGFunction *InjectionLookup;
275
276   bool Load(FGFDMExec *exec, Element *el);
277   void bindmodel(void);
278   void Debug(int from);
279
280 };
281 }
282 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
283 #endif
284