]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGPropulsion.h
Merge branch 'next' into durk-atc
[flightgear.git] / src / FDM / JSBSim / models / FGPropulsion.h
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.26 2010/11/18 12:38:06 jberndt 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.26 2010/11/18 12:38:06 jberndt 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   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   FGEngine* GetEngine(unsigned int index) const {
135                       if (index < Engines.size()) return Engines[index];
136                       else                        return 0L;      }
137
138   /// Retrieves the number of tanks defined for the aircraft.
139   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   FGTank* GetTank(unsigned int index) const {
146                       if (index < Tanks.size()) return Tanks[index];
147                       else                      return 0L;        }
148
149   /** Returns the number of fuel tanks currently actively supplying fuel */
150   int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
151
152   /** Returns the number of oxidizer tanks currently actively supplying oxidizer */
153   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) const;
162   std::string GetPropulsionValues(const std::string& delimiter) const;
163
164   const FGColumnVector3& GetForces(void) const {return vForces; }
165   double GetForces(int n) const { return vForces(n);}
166   const FGColumnVector3& GetMoments(void) const {return vMoments;}
167   double GetMoments(int n) const {return vMoments(n);}
168
169   bool GetRefuel(void) const {return refuel;}
170   void SetRefuel(bool setting) {refuel = setting;}
171   bool GetFuelDump(void) const {return dump;}
172   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   inline int GetActiveEngine(void) const {return ActiveEngine;}
183   inline bool GetFuelFreeze(void) {return fuel_freeze;}
184   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