Branch data Line data Source code
1 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 : :
3 : : Header: FGPropulsion.h
4 : : Author: Jon S. Berndt
5 : : Date started: 08/20/00
6 : :
7 : : ------------- Copyright (C) 1999 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 : : 08/20/00 JSB Created
29 : :
30 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 : : SENTRY
32 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33 : :
34 : : #ifndef FGPROPULSION_H
35 : : #define FGPROPULSION_H
36 : :
37 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 : : INCLUDES
39 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40 : :
41 : : #include <vector>
42 : : #include <iosfwd>
43 : :
44 : : #include "FGModel.h"
45 : : #include "math/FGMatrix33.h"
46 : : #include "input_output/FGXMLFileRead.h"
47 : :
48 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 : : DEFINITIONS
50 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51 : :
52 : : #define ID_PROPULSION "$Id: FGPropulsion.h,v 1.25 2010/01/02 17:58:01 andgi Exp $"
53 : :
54 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55 : : FORWARD DECLARATIONS
56 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
57 : :
58 : : namespace JSBSim {
59 : :
60 : : class FGTank;
61 : : class FGEngine;
62 : :
63 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64 : : CLASS DOCUMENTATION
65 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
66 : :
67 : : /** Propulsion management class.
68 : : The Propulsion class is the container for the entire propulsion system, which is
69 : : comprised of engines, and tanks. Once the Propulsion class gets the config file,
70 : : it reads in the \<propulsion> section. Then:
71 : :
72 : : -# The appropriate engine type instance is created
73 : : -# At least one tank object is created, and is linked to an engine.
74 : :
75 : : At Run time each engine's Calculate() method is called.
76 : :
77 : : <h3>Configuration File Format:</h3>
78 : :
79 : : @code
80 : : <propulsion>
81 : : <engine file="{string}">
82 : : ... see FGEngine, FGThruster, and class for engine type ...
83 : : </engine>
84 : : ... more engines ...
85 : : <tank type="{FUEL | OXIDIZER}">
86 : : ... see FGTank ...
87 : : </tank>
88 : : ... more tanks ...
89 : : <dump-rate unit="{LBS/MIN | KG/MIN}"> {number} </dump-rate>
90 : : </propulsion>
91 : : @endcode
92 : :
93 : : @author Jon S. Berndt
94 : : @version $Id: FGPropulsion.h,v 1.25 2010/01/02 17:58:01 andgi Exp $
95 : : @see
96 : : FGEngine
97 : : FGTank
98 : : */
99 : :
100 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101 : : CLASS DECLARATION
102 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
103 : :
104 : : class FGPropulsion : public FGModel, public FGXMLFileRead
105 : : {
106 : : public:
107 : : /// Constructor
108 : : FGPropulsion(FGFDMExec*);
109 : : /// Destructor
110 : : ~FGPropulsion();
111 : :
112 : : /** Executes the propulsion model.
113 : : The initial plan for the FGPropulsion class calls for Run() to be executed,
114 : : calculating the power available from the engine.
115 : :
116 : : [Note: Should we be checking the Starved flag here?] */
117 : : bool Run(void);
118 : :
119 : : bool InitModel(void);
120 : :
121 : : /** Loads the propulsion system (engine[s] and tank[s]).
122 : : Characteristics of the propulsion system are read in from the config file.
123 : : @param el pointer to an XML element that contains the engine information.
124 : : @return true if successfully loaded, otherwise false */
125 : : bool Load(Element* el);
126 : :
127 : : /// Retrieves the number of engines defined for the aircraft.
128 : 9820 : inline unsigned int GetNumEngines(void) const {return (unsigned int)Engines.size();}
129 : :
130 : : /** Retrieves an engine object pointer from the list of engines.
131 : : @param index the engine index within the vector container
132 : : @return the address of the specific engine, or zero if no such engine is
133 : : available */
134 : : inline FGEngine* GetEngine(unsigned int index) {
135 [ # # ][ # # ]: 0 : if (index < Engines.size()) return Engines[index];
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
136 : 0 : else return 0L; }
137 : :
138 : : /// Retrieves the number of tanks defined for the aircraft.
139 : 182 : inline unsigned int GetNumTanks(void) const {return (unsigned int)Tanks.size();}
140 : :
141 : : /** Retrieves a tank object pointer from the list of tanks.
142 : : @param index the tank index within the vector container
143 : : @return the address of the specific tank, or zero if no such tank is
144 : : available */
145 : : inline FGTank* GetTank(unsigned int index) {
146 [ + - ][ + - ]: 6746968 : if (index < Tanks.size()) return Tanks[index];
[ # # ]
[ + - + - ]
147 : 0 : else return 0L; }
148 : :
149 : : /** Returns the number of fuel tanks currently actively supplying fuel */
150 : : inline int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
151 : :
152 : : /** Returns the number of oxidizer tanks currently actively supplying oxidizer */
153 : : inline int GetnumSelectedOxiTanks(void) const {return numSelectedOxiTanks;}
154 : :
155 : : /** Loops the engines until thrust output steady (used for trimming) */
156 : : bool GetSteadyState(void);
157 : :
158 : : /** Sets up the engines as running */
159 : : void InitRunning(int n);
160 : :
161 : : std::string GetPropulsionStrings(const std::string& delimiter);
162 : : std::string GetPropulsionValues(const std::string& delimiter);
163 : :
164 : 110563 : inline FGColumnVector3& GetForces(void) {return vForces; }
165 : 54006 : inline double GetForces(int n) const { return vForces(n);}
166 : 57460 : inline FGColumnVector3& GetMoments(void) {return vMoments;}
167 : 3 : inline double GetMoments(int n) const {return vMoments(n);}
168 : :
169 : 1 : inline bool GetRefuel(void) const {return refuel;}
170 : 0 : inline void SetRefuel(bool setting) {refuel = setting;}
171 : 1 : inline bool GetFuelDump(void) const {return dump;}
172 : 0 : inline void SetFuelDump(bool setting) {dump = setting;}
173 : : double Transfer(int source, int target, double amount);
174 : : void DoRefuel(double time_slice);
175 : : void DumpFuel(double time_slice);
176 : :
177 : : FGColumnVector3& GetTanksMoment(void);
178 : : double GetTanksWeight(void);
179 : :
180 : : std::ifstream* FindEngineFile(const std::string& filename);
181 : : std::string FindEngineFullPathname(const std::string& engine_filename);
182 : 1 : inline int GetActiveEngine(void) const {return ActiveEngine;}
183 : : inline bool GetFuelFreeze(void) {return fuel_freeze;}
184 : 1 : double GetTotalFuelQuantity(void) const {return TotalFuelQuantity;}
185 : :
186 : : void SetMagnetos(int setting);
187 : : void SetStarter(int setting);
188 : : void SetCutoff(int setting=0);
189 : : void SetActiveEngine(int engine);
190 : : void SetFuelFreeze(bool f);
191 : : FGMatrix33& CalculateTankInertias(void);
192 : :
193 : : private:
194 : : std::vector <FGEngine*> Engines;
195 : : std::vector <FGTank*> Tanks;
196 : : unsigned int numSelectedFuelTanks;
197 : : unsigned int numSelectedOxiTanks;
198 : : unsigned int numFuelTanks;
199 : : unsigned int numOxiTanks;
200 : : unsigned int numEngines;
201 : : unsigned int numTanks;
202 : : int ActiveEngine;
203 : : FGColumnVector3 vForces;
204 : : FGColumnVector3 vMoments;
205 : : FGColumnVector3 vTankXYZ;
206 : : FGColumnVector3 vXYZtank_arm;
207 : : FGMatrix33 tankJ;
208 : : bool refuel;
209 : : bool dump;
210 : : bool fuel_freeze;
211 : : double TotalFuelQuantity;
212 : : double DumpRate;
213 : : bool IsBound;
214 : : bool HavePistonEngine;
215 : : bool HaveTurbineEngine;
216 : : bool HaveTurboPropEngine;
217 : : bool HaveRocketEngine;
218 : : bool HaveElectricEngine;
219 : :
220 : : int InitializedEngines;
221 : : bool HasInitializedEngines;
222 : :
223 : : void bind();
224 : : void Debug(int from);
225 : : };
226 : : }
227 : : //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
228 : : #endif
229 : :
|