1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
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
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
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.
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.
27 --------------------------------------------------------------------------------
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34 #ifndef FGPROPULSION_H
35 #define FGPROPULSION_H
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
45 #include "propulsion/FGEngine.h"
46 #include "math/FGMatrix33.h"
47 #include "input_output/FGXMLFileRead.h"
49 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
53 #define ID_PROPULSION "$Id: FGPropulsion.h,v 1.30 2011/08/03 03:21:06 jberndt Exp $"
55 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
68 /** Propulsion management class.
69 The Propulsion class is the container for the entire propulsion system, which is
70 comprised of engines, and tanks. Once the Propulsion class gets the config file,
71 it reads in the \<propulsion> section. Then:
73 -# The appropriate engine type instance is created
74 -# At least one tank object is created, and is linked to an engine.
76 At Run time each engine's Calculate() method is called.
78 <h3>Configuration File Format:</h3>
82 <engine file="{string}">
83 ... see FGEngine, FGThruster, and class for engine type ...
86 <tank type="{FUEL | OXIDIZER}">
90 <dump-rate unit="{LBS/MIN | KG/MIN}"> {number} </dump-rate>
95 @version $Id: FGPropulsion.h,v 1.30 2011/08/03 03:21:06 jberndt Exp $
101 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
105 class FGPropulsion : public FGModel, public FGXMLFileRead
109 FGPropulsion(FGFDMExec*);
113 /** Executes the propulsion model.
114 The initial plan for the FGPropulsion class calls for Run() to be executed,
115 calculating the power available from the engine.
116 Can pass in a value indicating if the executive is directing the simulation to Hold.
117 @param Holding if true, the executive has been directed to hold the sim from
118 advancing time. Some models may ignore this flag, such as the Input
119 model, which may need to be active to listen on a socket for the
120 "Resume" command to be given.
121 @return false if no error */
122 bool Run(bool Holding);
124 bool InitModel(void);
126 /** Loads the propulsion system (engine[s] and tank[s]).
127 Characteristics of the propulsion system are read in from the config file.
128 @param el pointer to an XML element that contains the engine information.
129 @return true if successfully loaded, otherwise false */
130 bool Load(Element* el);
132 /// Retrieves the number of engines defined for the aircraft.
133 unsigned int GetNumEngines(void) const {return (unsigned int)Engines.size();}
135 /** Retrieves an engine object pointer from the list of engines.
136 @param index the engine index within the vector container
137 @return the address of the specific engine, or zero if no such engine is
139 FGEngine* GetEngine(unsigned int index) const {
140 if (index < Engines.size()) return Engines[index];
143 /// Retrieves the number of tanks defined for the aircraft.
144 unsigned int GetNumTanks(void) const {return (unsigned int)Tanks.size();}
146 /** Retrieves a tank object pointer from the list of tanks.
147 @param index the tank index within the vector container
148 @return the address of the specific tank, or zero if no such tank is
150 FGTank* GetTank(unsigned int index) const {
151 if (index < Tanks.size()) return Tanks[index];
154 /** Returns the number of fuel tanks currently actively supplying fuel */
155 int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
157 /** Returns the number of oxidizer tanks currently actively supplying oxidizer */
158 int GetnumSelectedOxiTanks(void) const {return numSelectedOxiTanks;}
160 /** Loops the engines until thrust output steady (used for trimming) */
161 bool GetSteadyState(void);
163 /** Sets up the engines as running */
164 void InitRunning(int n);
166 std::string GetPropulsionStrings(const std::string& delimiter) const;
167 std::string GetPropulsionValues(const std::string& delimiter) const;
168 std::string GetPropulsionTankReport();
170 const FGColumnVector3& GetForces(void) const {return vForces; }
171 double GetForces(int n) const { return vForces(n);}
172 const FGColumnVector3& GetMoments(void) const {return vMoments;}
173 double GetMoments(int n) const {return vMoments(n);}
175 bool GetRefuel(void) const {return refuel;}
176 void SetRefuel(bool setting) {refuel = setting;}
177 bool GetFuelDump(void) const {return dump;}
178 void SetFuelDump(bool setting) {dump = setting;}
179 double Transfer(int source, int target, double amount);
180 void DoRefuel(double time_slice);
181 void DumpFuel(double time_slice);
183 FGColumnVector3& GetTanksMoment(void);
184 double GetTanksWeight(void);
186 std::ifstream* FindEngineFile(const std::string& filename);
187 std::string FindEngineFullPathname(const std::string& engine_filename);
188 inline int GetActiveEngine(void) const {return ActiveEngine;}
189 inline bool GetFuelFreeze(void) {return FuelFreeze;}
190 double GetTotalFuelQuantity(void) const {return TotalFuelQuantity;}
192 void SetMagnetos(int setting);
193 void SetStarter(int setting);
194 void SetCutoff(int setting=0);
195 void SetActiveEngine(int engine);
196 void SetFuelFreeze(bool f);
197 FGMatrix33& CalculateTankInertias(void);
199 struct FGEngine::Inputs in;
202 std::vector <FGEngine*> Engines;
203 std::vector <FGTank*> Tanks;
204 unsigned int numSelectedFuelTanks;
205 unsigned int numSelectedOxiTanks;
206 unsigned int numFuelTanks;
207 unsigned int numOxiTanks;
208 unsigned int numEngines;
209 unsigned int numTanks;
211 FGColumnVector3 vForces;
212 FGColumnVector3 vMoments;
213 FGColumnVector3 vTankXYZ;
214 FGColumnVector3 vXYZtank_arm;
219 double TotalFuelQuantity;
222 bool HavePistonEngine;
223 bool HaveTurbineEngine;
224 bool HaveTurboPropEngine;
225 bool HaveRocketEngine;
226 bool HaveElectricEngine;
227 void ConsumeFuel(FGEngine* engine);
229 int InitializedEngines;
230 bool HasInitializedEngines;
233 void Debug(int from);
236 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%