]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGTurbine.cpp
Fix for X-15 crash.
[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 static const char *IdSrc = "$Id$";
46 static const char *IdHdr = ID_TURBINE;
47
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 CLASS IMPLEMENTATION
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51
52
53 FGTurbine::FGTurbine(FGFDMExec* exec, FGConfigFile* cfg) : FGEngine(exec)
54 {
55   Load(cfg);
56   PowerCommand=0;
57   Debug(0);
58 }
59
60 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61
62 FGTurbine::~FGTurbine()
63 {
64   Debug(1);
65 }
66
67 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
68
69 double FGTurbine::Calculate(double dummy)
70 {
71   double idle,mil,aug;
72   double throttle=FCS->GetThrottlePos(EngineNumber);
73   double dt=State->Getdt();
74   if( dt > 0 ) {
75     PowerCommand+=dt*PowerLag( PowerCommand, 
76                          ThrottleToPowerCommand(throttle) );
77     if(PowerCommand > 100 )
78       PowerCommand=100;
79     else if(PowerCommand < 0 )
80       PowerCommand=0;
81                     
82   } else {
83     PowerCommand=ThrottleToPowerCommand(throttle);
84   }                         
85   
86   mil=MaxMilThrust*ThrustTables[1]->TotalValue();
87   
88   if( PowerCommand <= 50 ) {
89     idle=MaxMilThrust*ThrustTables[0]->TotalValue();
90     Thrust = idle + (mil-idle)*PowerCommand*0.02;
91   } else {
92     aug=MaxAugThrust*ThrustTables[2]->TotalValue();
93     Thrust = mil + (aug-mil)*(PowerCommand-50)*0.02;
94   }    
95   
96   ConsumeFuel();
97   
98   return Thrust;
99 }
100
101 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
102
103 double FGTurbine::ThrottleToPowerCommand(double throttle) {
104   if( throttle <= 0.77 ) 
105     return 64.94*throttle;
106   else
107     return 217.38*throttle - 117.38;
108 }      
109
110 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
111
112 double FGTurbine::PowerLag(double actual_power, double power_command) {
113   double t, p2;
114   if( power_command >= 50 ) {
115     if( actual_power >= 50 ) {
116       t=5;
117       p2=power_command;
118     } else {
119       p2=60;
120       t=rtau(p2-actual_power);
121     }
122   } else {
123     if( actual_power >= 50 ) {
124       t=5;
125       p2=40;
126     } else {
127       p2=power_command;
128       t=rtau(p2-actual_power);
129     }
130   }
131   return t*(p2-actual_power);
132 }    
133  
134 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
135
136 double FGTurbine::rtau(double delta_power) {
137   if( delta_power <= 25 ) 
138     return 1.0;
139   else if ( delta_power >= 50)
140     return 0.1;
141   else
142     return 1.9-0.036*delta_power;
143 }
144         
145 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146
147 void FGTurbine::doInlet(void)
148 {
149 }
150
151 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152
153 void FGTurbine::doCompressor(void)
154 {
155 }
156
157 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
158
159 void FGTurbine::doBleedDuct(void)
160 {
161 }
162
163 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
164
165 void FGTurbine::doCombustor(void)
166 {
167 }
168
169 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
170
171 void FGTurbine::doTurbine(void)
172 {
173 }
174
175 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
176
177 void FGTurbine::doConvergingNozzle(void)
178 {
179 }
180
181 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
182
183 void FGTurbine::doTransition(void)
184 {
185 }
186
187 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
188
189
190 bool FGTurbine::Load(FGConfigFile *Eng_cfg)
191 {
192   int i;
193   string token;
194   Name = Eng_cfg->GetValue("NAME");
195   cout << Name << endl;
196   Eng_cfg->GetNextConfigLine();
197   *Eng_cfg >> token >> MaxMilThrust;
198   *Eng_cfg >> token >> MaxAugThrust;
199   i=0;
200   while( Eng_cfg->GetValue() != string("/FG_TURBINE") && i < 10){
201     ThrustTables.push_back( new FGCoefficient(FDMExec) );
202     ThrustTables.back()->Load(Eng_cfg);
203     i++;
204   }
205
206   return true;
207 }
208
209 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
210 //    The bitmasked value choices are as follows:
211 //    unset: In this case (the default) JSBSim would only print
212 //       out the normally expected messages, essentially echoing
213 //       the config files as they are read. If the environment
214 //       variable is not set, debug_lvl is set to 1 internally
215 //    0: This requests JSBSim not to output any messages
216 //       whatsoever.
217 //    1: This value explicity requests the normal JSBSim
218 //       startup messages
219 //    2: This value asks for a message to be printed out when
220 //       a class is instantiated
221 //    4: When this value is set, a message is displayed when a
222 //       FGModel object executes its Run() method
223 //    8: When this value is set, various runtime state variables
224 //       are printed out periodically
225 //    16: When set various parameters are sanity checked and
226 //       a message is printed out when they go out of bounds
227
228 void FGTurbine::Debug(int from)
229 {
230   if (debug_lvl <= 0) return;
231
232   if (debug_lvl & 1) { // Standard console startup message output
233     if (from == 0) { // Constructor
234
235     }
236   }
237   if (debug_lvl & 2 ) { // Instantiation/Destruction notification
238     if (from == 0) cout << "Instantiated: FGTurbine" << endl;
239     if (from == 1) cout << "Destroyed:    FGTurbine" << endl;
240   }
241   if (debug_lvl & 4 ) { // Run() method entry print for FGModel-derived objects
242   }
243   if (debug_lvl & 8 ) { // Runtime state variables
244   }
245   if (debug_lvl & 16) { // Sanity checking
246   }
247   if (debug_lvl & 64) {
248     if (from == 0) { // Constructor
249       cout << IdSrc << endl;
250       cout << IdHdr << endl;
251     }
252   }
253 }
254