]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/propulsion/FGRocket.h
Merge branch 'ehofman/version'
[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   /** Sets the thrust variation for a solid rocket engine. 
166       Solid propellant rocket motor thrust characteristics are typically
167       defined at 70 degrees F temperature. At any other temperature,
168       performance will be different. Warmer propellant grain will
169       burn quicker and at higher thrust.  Total motor impulse is
170       not changed for change in thrust.
171       @param var the variation in percent. That is, a 2 percent
172       variation would be specified as 0.02. A positive 2% variation
173       in thrust would increase the thrust by 2%, and shorten the burn time. */
174   void SetThrustVariation(double var) {ThrustVariation = var;}
175
176   /** Sets the variation in total motor energy.
177       The total energy present in a solid rocket motor can be modified
178       (such as might happen with manufacturing variations) by setting
179       the total Isp variation. 
180       @param var the variation in percent. That is, a 2 percent
181       variation would be specified as 0.02. This variation will 
182       affect the total thrust, but not the burn time.*/
183   void SetTotalIspVariation(double var) {TotalIspVariation = var;}
184
185   /** Returns the thrust variation, if any. */
186   double GetThrustVariation(void) const {return ThrustVariation;}
187
188   /** Returns the Total Isp variation, if any. */
189   double GetTotalIspVariation(void) const {return TotalIspVariation;}
190
191 private:
192   /** Reduces the fuel in the active tanks by the amount required.
193       This function should be called from within the
194       derived class' Calculate() function before any other calculations are
195       done. This base class method removes fuel from the fuel tanks as
196       appropriate, and sets the starved flag if necessary. */
197   void ConsumeFuel(void);
198
199   /** The fuel need is calculated based on power levels and flow rate for that
200       power level. It is also turned from a rate into an actual amount (pounds)
201       by multiplying it by the delta T and the rate.
202       @return Total fuel requirement for this engine in pounds. */
203   double CalcFuelNeed(void);
204
205   /** The oxidizer need is calculated based on power levels and flow rate for that
206       power level. It is also turned from a rate into an actual amount (pounds)
207       by multiplying it by the delta T and the rate.
208       @return Total oxidizer requirement for this engine in pounds. */
209   double CalcOxidizerNeed(void);
210
211   /** Returns the vacuum thrust.
212       @return The vacuum thrust in lbs. */
213   double GetVacThrust(void) const {return VacThrust;}
214
215   void bindmodel(void);
216
217   double Isp; // Vacuum Isp
218   double It;
219   double MxR; // Mixture Ratio
220   double BurnTime;
221   double ThrustVariation;
222   double TotalIspVariation;
223   double VacThrust;
224   double previousFuelNeedPerTank;
225   double previousOxiNeedPerTank;
226   double OxidizerExpended;
227   double SLOxiFlowMax;
228   double OxidizerFlowRate;
229   double PropellantFlowRate;
230   bool Flameout;
231   double BuildupTime;
232   FGTable* ThrustTable;
233
234   void Debug(int from);
235 };
236 }
237 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
238 #endif
239