]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGTurbine.cpp
Updates from JSBSim, including new turbine engine model from David Culp
[flightgear.git] / src / FDM / JSBSim / FGTurbine.cpp
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Module:       FGTurbine.cpp
4  Author:       Jon S. Berndt
5  Date started: 08/23/2002
6  Purpose:      This module models a turbine engine.
7
8  ------------- Copyright (C) 2002  Jon S. Berndt (jsb@hal-pc.org) --------------
9
10  This program is free software; you can redistribute it and/or modify it under
11  the terms of the GNU General Public License as published by the Free Software
12  Foundation; either version 2 of the License, or (at your option) any later
13  version.
14
15  This program is distributed in the hope that it will be useful, but WITHOUT
16  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
18  details.
19
20  You should have received a copy of the GNU General Public License along with
21  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
22  Place - Suite 330, Boston, MA  02111-1307, USA.
23
24  Further information about the GNU General Public License can also be found on
25  the world wide web at http://www.gnu.org.
26
27 FUNCTIONAL DESCRIPTION
28 --------------------------------------------------------------------------------
29
30 This class descends from the FGEngine class and models a Turbine engine based
31 on parameters given in the engine config file for this class
32
33 HISTORY
34 --------------------------------------------------------------------------------
35 08/23/2002  JSB  Created
36
37 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #include <vector>
42 #include "FGTurbine.h"
43
44
45 namespace JSBSim {
46
47 static const char *IdSrc = "$Id$";
48 static const char *IdHdr = ID_TURBINE;
49
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 CLASS IMPLEMENTATION
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
53
54
55 FGTurbine::FGTurbine(FGFDMExec* exec, FGConfigFile* cfg) : FGEngine(exec)
56 {
57   Load(cfg);
58   PowerCommand=0;
59   Debug(0);
60 }
61
62 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63
64 FGTurbine::~FGTurbine()
65 {
66   Debug(1);
67 }
68
69 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
70
71 double FGTurbine::Calculate(double dummy)
72 {
73   double idle,mil,aug;
74   double throttle=FCS->GetThrottlePos(EngineNumber);
75   double dt=State->Getdt();
76   if( dt > 0 ) {
77     PowerCommand+=dt*PowerLag( PowerCommand, 
78                          ThrottleToPowerCommand(throttle) );
79     if(PowerCommand > 100 )
80       PowerCommand=100;
81     else if(PowerCommand < 0 )
82       PowerCommand=0;
83                     
84   } else {
85     PowerCommand=ThrottleToPowerCommand(throttle);
86   }                         
87   
88   mil=MaxMilThrust*ThrustTables[1]->TotalValue();
89   
90   if( PowerCommand <= 50 ) {
91     idle=MaxMilThrust*ThrustTables[0]->TotalValue();
92     Thrust = idle + (mil-idle)*PowerCommand*0.02;
93   } else {
94     aug=MaxAugThrust*ThrustTables[2]->TotalValue();
95     Thrust = mil + (aug-mil)*(PowerCommand-50)*0.02;
96   }    
97   
98   ConsumeFuel();
99   
100   return Thrust;
101 }
102
103 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104
105 double FGTurbine::ThrottleToPowerCommand(double throttle) {
106   if( throttle <= 0.77 ) 
107     return 64.94*throttle;
108   else
109     return 217.38*throttle - 117.38;
110 }      
111
112 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
113
114 double FGTurbine::PowerLag(double actual_power, double power_command) {
115   double t, p2;
116   if( power_command >= 50 ) {
117     if( actual_power >= 50 ) {
118       t=5;
119       p2=power_command;
120     } else {
121       p2=60;
122       t=rtau(p2-actual_power);
123     }
124   } else {
125     if( actual_power >= 50 ) {
126       t=5;
127       p2=40;
128     } else {
129       p2=power_command;
130       t=rtau(p2-actual_power);
131     }
132   }
133   return t*(p2-actual_power);
134 }    
135  
136 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
137
138 double FGTurbine::rtau(double delta_power) {
139   if( delta_power <= 25 ) 
140     return 1.0;
141   else if ( delta_power >= 50)
142     return 0.1;
143   else
144     return 1.9-0.036*delta_power;
145 }
146         
147 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
148
149 void FGTurbine::doInlet(void)
150 {
151 }
152
153 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
154
155 void FGTurbine::doCompressor(void)
156 {
157 }
158
159 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160
161 void FGTurbine::doBleedDuct(void)
162 {
163 }
164
165 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
166
167 void FGTurbine::doCombustor(void)
168 {
169 }
170
171 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
172
173 void FGTurbine::doTurbine(void)
174 {
175 }
176
177 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
178
179 void FGTurbine::doConvergingNozzle(void)
180 {
181 }
182
183 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184
185 void FGTurbine::doTransition(void)
186 {
187 }
188
189 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
190
191
192 bool FGTurbine::Load(FGConfigFile *Eng_cfg)
193 {
194   int i;
195   string token;
196   Name = Eng_cfg->GetValue("NAME");
197   cout << Name << endl;
198   Eng_cfg->GetNextConfigLine();
199   *Eng_cfg >> token >> MaxMilThrust;
200   *Eng_cfg >> token >> MaxAugThrust;
201   i=0;
202   while( Eng_cfg->GetValue() != string("/FG_TURBINE") && i < 10){
203     ThrustTables.push_back( new FGCoefficient(FDMExec) );
204     ThrustTables.back()->Load(Eng_cfg);
205     i++;
206   }
207
208   return true;
209 }
210
211 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
212 //    The bitmasked value choices are as follows:
213 //    unset: In this case (the default) JSBSim would only print
214 //       out the normally expected messages, essentially echoing
215 //       the config files as they are read. If the environment
216 //       variable is not set, debug_lvl is set to 1 internally
217 //    0: This requests JSBSim not to output any messages
218 //       whatsoever.
219 //    1: This value explicity requests the normal JSBSim
220 //       startup messages
221 //    2: This value asks for a message to be printed out when
222 //       a class is instantiated
223 //    4: When this value is set, a message is displayed when a
224 //       FGModel object executes its Run() method
225 //    8: When this value is set, various runtime state variables
226 //       are printed out periodically
227 //    16: When set various parameters are sanity checked and
228 //       a message is printed out when they go out of bounds
229
230 void FGTurbine::Debug(int from)
231 {
232   if (debug_lvl <= 0) return;
233
234   if (debug_lvl & 1) { // Standard console startup message output
235     if (from == 0) { // Constructor
236
237     }
238   }
239   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
240     if (from == 0) cout << "Instantiated: FGTurbine" << endl;
241     if (from == 1) cout << "Destroyed:    FGTurbine" << endl;
242   }
243   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
244   }
245   if (debug_lvl & 8 ) { // Runtime state variables
246   }
247   if (debug_lvl & 16) { // Sanity checking
248   }
249   if (debug_lvl & 64) {
250     if (from == 0) { // Constructor
251       cout << IdSrc << endl;
252       cout << IdHdr << endl;
253     }
254   }
255 }
256 }