]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/propulsion/FGRocket.h
Merge branch 'ehofman/sound'
[flightgear.git] / src / FDM / JSBSim / models / propulsion / FGRocket.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGRocket.h
4  Author:       Jon S. Berndt
5  Date started: 09/12/2000
6
7  ------------- Copyright (C) 2000  Jon S. Berndt (jon@jsbsim.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
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 SENTRY
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33
34 #ifndef FGROCKET_H
35 #define FGROCKET_H
36
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #include "FGEngine.h"
42 #include "math/FGTable.h"
43 #include "input_output/FGXMLElement.h"
44
45 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 DEFINITIONS
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
48
49 #define ID_ROCKET "$Id$"
50
51 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 FORWARD DECLARATIONS
53 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54
55 namespace JSBSim {
56
57 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 CLASS DOCUMENTATION
59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
60
61 /** Models a generic rocket engine.
62     The rocket engine is modeled given the following parameters:
63     <ul>
64         <li>Specific Impulse (in sec)</li>
65     </ul>
66     Additionally, the following control inputs, operating characteristics, and
67     location are required, as with all other engine types:
68     <ul>
69         <li>Throttle setting (in percent, from 0 to 1.0)</li>
70         <li>Maximum allowable throttle setting</li>
71         <li>Minimum working throttle setting</li>
72         <li>Sea level fuel flow at maximum thrust</li>
73         <li>Sea level oxidizer flow at maximum thrust</li>
74         <li>X, Y, Z location in structural coordinate frame</li>
75         <li>Pitch and Yaw</li>
76     </ul>
77     The nozzle exit pressure (p2) is returned via a
78     call to FGNozzle::GetPowerRequired(). This exit pressure is used
79     to get the at-altitude thrust level.
80     
81     One can model the thrust of a solid rocket by providing a normalized thrust table
82     as a function of time. For instance, the space shuttle solid rocket booster
83     normalized thrust value looks roughly like this:
84
85 <pre>    
86  \<thrust_table name="propulsion/thrust_time" type="internal">
87    \<tableData>
88       0.0   0.00
89       0.2   0.91
90       8.0   0.97
91      16.0   0.99
92      20.0   1.00
93      21.0   1.00
94      24.0   0.95
95      32.0   0.85
96      40.0   0.78
97      48.0   0.72
98      50.0   0.71
99      52.0   0.71
100      56.0   0.73
101      64.0   0.78
102      72.0   0.82
103      80.0   0.81
104      88.0   0.73
105      96.0   0.69
106     104.0   0.59
107     112.0   0.46
108     120.0   0.09
109     132.0   0.00
110    \</tableData>
111  \</thrust_table>
112 </pre>
113
114 The left column is time, the right column is normalized thrust. Inside the
115 FGRocket class code, the maximum thrust is calculated, and multiplied by this
116 table. The Rocket class also tracks burn time. All that needs to be done is
117 for the rocket engine to be throttle up to 1. At that time, the solid rocket
118 fuel begins burning and thrust is provided.
119
120     @author Jon S. Berndt
121     $Id$
122     @see FGNozzle,
123     FGThruster,
124     FGForce,
125     FGEngine,
126     FGPropulsion,
127     FGTank
128 */
129
130 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
131 CLASS DECLARATION
132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
133
134 class FGRocket : public FGEngine
135 {
136 public:
137   /** Constructor.
138       @param exec pointer to JSBSim parent object, the FDM Executive.
139       @param el a pointer to the XML Element instance representing the engine.
140       @param engine_number engine number */
141   FGRocket(FGFDMExec* exec, Element *el, int engine_number);
142
143   /** Destructor */
144   ~FGRocket(void);
145
146   /** Determines the thrust.
147       @return thrust */
148   double Calculate(void);
149
150   /** Gets the total impulse of the rocket.
151       @return The cumulative total impulse of the rocket up to this time.*/
152   double GetTotalImpulse(void) const {return It;}
153
154   /** Gets the flame-out status.
155       The engine will "flame out" if the throttle is set below the minimum
156       sustainable-thrust setting.
157       @return true if engine has flamed out. */
158   bool GetFlameout(void) {return Flameout;}
159
160   double GetOxiFlowRate(void) const {return OxidizerFlowRate;}
161
162   std::string GetEngineLabels(const std::string& delimiter);
163   std::string GetEngineValues(const std::string& delimiter);
164
165 private:
166   /** Reduces the fuel in the active tanks by the amount required.
167       This function should be called from within the
168       derived class' Calculate() function before any other calculations are
169       done. This base class method removes fuel from the fuel tanks as
170       appropriate, and sets the starved flag if necessary. */
171   void ConsumeFuel(void);
172
173   /** The fuel need is calculated based on power levels and flow rate for that
174       power level. It is also turned from a rate into an actual amount (pounds)
175       by multiplying it by the delta T and the rate.
176       @return Total fuel requirement for this engine in pounds. */
177   double CalcFuelNeed(void);
178
179   /** The oxidizer need is calculated based on power levels and flow rate for that
180       power level. It is also turned from a rate into an actual amount (pounds)
181       by multiplying it by the delta T and the rate.
182       @return Total oxidizer requirement for this engine in pounds. */
183   double CalcOxidizerNeed(void);
184
185   /** Returns the vacuum thrust.
186       @return The vacuum thrust in lbs. */
187   double GetVacThrust(void) const {return VacThrust;}
188
189   void bindmodel(void);
190
191   double Isp; // Vacuum Isp
192   double It;
193   double MxR; // Mixture Ratio
194   double BurnTime;
195   double VacThrust;
196   double previousFuelNeedPerTank;
197   double previousOxiNeedPerTank;
198   double OxidizerExpended;
199   double SLOxiFlowMax;
200   double OxidizerFlowRate;
201   double PropellantFlowRate;
202   bool Flameout;
203   double BuildupTime;
204   FGTable* ThrustTable;
205
206   void Debug(int from);
207 };
208 }
209 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
210 #endif
211