]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGPropulsion.h
#include <config.h> where needed for cygwin/gcc-3.2.
[flightgear.git] / src / FDM / JSBSim / 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 (jsb@hal-pc.org) -------------
8  
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU 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 General Public License for more
17  details.
18  
19  You should have received a copy of the GNU 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 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 #ifdef FGFS
42 #  include <simgear/compiler.h>
43 #  ifdef SG_HAVE_STD_INCLUDES
44 #    include <vector>
45 #    include <iterator>
46 #  else
47 #    include <vector.h>
48 #    include <iterator.h>
49 #  endif
50 #else
51 #  include <vector>
52 #  include <iterator>
53 #endif
54
55 #include "FGModel.h"
56
57 #include "FGRocket.h"
58 #include "FGPiston.h"
59 #include "FGTurbine.h"
60 #include "FGTank.h"
61 #include "FGPropeller.h"
62 #include "FGNozzle.h"
63
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 DEFINITIONS
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67
68 #define ID_PROPULSION "$Id$"
69
70 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71 FORWARD DECLARATIONS
72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
73
74 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75 COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
77
78 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79 CLASS DOCUMENTATION
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
81
82 /** Propulsion management class.
83     FGPropulsion manages all aspects of propulsive force generation, including
84     containment of engines, tanks, and thruster class instances in STL vectors,
85     and the interaction and communication between them.
86     @author Jon S. Berndt
87     @version $Id$
88     @see FGEngine
89     @see FGTank
90     @see FGThruster
91     @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropulsion.h?rev=HEAD&content-type=text/vnd.viewcvs-markup">
92          Header File </a>
93     @see <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/jsbsim/JSBSim/FGPropulsion.cpp?rev=HEAD&content-type=text/vnd.viewcvs-markup">
94          Source File </a>
95 */
96
97 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
98 CLASS DECLARATION
99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
100
101 class FGPropulsion : public FGModel
102 {
103 public:
104   /// Constructor
105   FGPropulsion(FGFDMExec*);
106   /// Destructor
107   ~FGPropulsion();
108
109   /** Executes the propulsion model.
110       The initial plan for the FGPropulsion class calls for Run() to be executed,
111       performing the following tasks:
112       <ol>
113   <li>Determine the drag - or power required - for the attached thrust effector
114       for this engine so that any feedback to the engine can be performed. This
115       is done by calling FGThruster::CalculatePReq()</li>
116   <li>Given 1, above, calculate the power available from the engine. This is
117       done by calling FGEngine::CalculatePAvail()</li>
118   <li>Next, calculate the thrust output from the thruster model given the power
119       available and the power required. This may also result in new performance
120       numbers for the thruster in the case of the propeller, at least. This
121       result is returned from a call to Calculate().</li></ol>
122
123       [Note: Should we be checking the Starved flag here?] */
124   bool Run(void);
125
126   /** Loads the propulsion system (engine[s], tank[s], thruster[s]).
127       Characteristics of the propulsion system are read in from the config file.
128       @param AC_cfg pointer to the config file instance that describes the
129              aircraft being modeled.
130       @return true if successfully loaded, otherwise false */
131   bool Load(FGConfigFile* AC_cfg);
132
133   /// Retrieves the number of engines defined for the aircraft.
134   inline unsigned int GetNumEngines(void) const {return Engines.size();}
135
136   /** Retrieves an engine object pointer from the list of engines.
137       @param index the engine index within the vector container
138       @return the address of the specific engine, or zero if no such engine is
139               available */
140   inline FGEngine* GetEngine(unsigned int index) {
141                       if (index <= Engines.size()-1) return Engines[index];
142                       else                           return 0L;      }
143
144   // Retrieves the number of tanks defined for the aircraft.
145   inline unsigned int GetNumTanks(void) const {return Tanks.size();}
146
147   /** Retrieves a tank object pointer from the list of tanks.
148       @param index the tank index within the vector container
149       @return the address of the specific tank, or zero if no such tank is
150               available */
151   inline FGTank* GetTank(unsigned int index) {
152                       if (index <= Tanks.size()-1) return Tanks[index];
153                       else                         return 0L;        }
154
155   /** Retrieves a thruster object pointer from the list of thrusters.
156       @param index the thruster index within the vector container
157       @return the address of the specific thruster, or zero if no such thruster is
158               available */
159   inline FGThruster* GetThruster(unsigned int index) {
160                       if (index <= Thrusters.size()-1) return Thrusters[index];
161                       else                             return 0L;    }
162
163   /** Returns the number of fuel tanks currently actively supplying fuel */
164   inline int GetnumSelectedFuelTanks(void) const {return numSelectedFuelTanks;}
165
166   /** Returns the number of oxidizer tanks currently actively supplying oxidizer */
167   inline int GetnumSelectedOxiTanks(void) const {return numSelectedOxiTanks;}
168
169   /** Loops the engines/thrusters until thrust output steady (used for trimming) */
170   bool GetSteadyState(void);
171   
172   /** starts the engines in IC mode (dt=0).  All engine-specific setup must
173       be done before calling this (i.e. magnetos, starter engage, etc.) */
174   bool ICEngineStart(void);
175   
176   string GetPropulsionStrings(void);
177   string GetPropulsionValues(void);
178
179   inline FGColumnVector3& GetForces(void)  {return vForces; }
180   inline double GetForces(int n) const { return vForces(n);}
181   inline FGColumnVector3& GetMoments(void) {return vMoments;}
182   inline double GetMoments(int n) const {return vMoments(n);}
183   
184   FGColumnVector3& GetTanksMoment(void);
185   double GetTanksWeight(void);
186
187   double GetTanksIxx(const FGColumnVector3& vXYZcg);
188   double GetTanksIyy(const FGColumnVector3& vXYZcg);
189   double GetTanksIzz(const FGColumnVector3& vXYZcg);
190   double GetTanksIxz(const FGColumnVector3& vXYZcg);
191   double GetTanksIxy(const FGColumnVector3& vXYZcg);
192   
193   void SetMagnetos(int setting);
194   void SetStarter(int setting);
195   void SetActiveEngine(int engine);
196   
197   void bind();
198   void unbind();
199    
200 private:
201   vector <FGEngine*>   Engines;
202   vector <FGTank*>     Tanks;
203   vector <FGTank*>::iterator iTank;
204   vector <FGThruster*> Thrusters;
205   unsigned int numSelectedFuelTanks;
206   unsigned int numSelectedOxiTanks;
207   unsigned int numFuelTanks;
208   unsigned int numOxiTanks;
209   unsigned int numEngines;
210   unsigned int numTanks;
211   unsigned int numThrusters;
212   int ActiveEngine;
213   double dt;
214   FGColumnVector3 vForces;
215   FGColumnVector3 vMoments;
216   FGColumnVector3 vXYZtank;
217   void Debug(int from);
218 };
219
220 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
221 #endif
222