1
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
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
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
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.
23
Further information about the GNU 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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42
# include <simgear/compiler.h>
43
# ifdef SG_HAVE_STD_INCLUDES
48
# include <iterator.h>
59
#include "FGTurboShaft.h"
60
#include "FGTurboJet.h"
61
#include "FGTurboProp.h"
63
#include "FGPropeller.h"
66
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
68
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
70
#define ID_PROPULSION "$Id: FGPropulsion.h,v 1.24 2002/01/19 04:32:28 david Exp $"
72
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
74
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
76
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
77
COMMENTS, REFERENCES, and NOTES [use "class documentation" below for API docs]
78
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
80
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
84
/** Propulsion management class.
85
FGPropulsion manages all aspects of propulsive force generation, including
86
containment of engines, tanks, and thruster class instances in STL vectors,
87
and the interaction and communication between them.
89
@version $Id: FGPropulsion.h,v 1.24 2002/01/19 04:32:28 david Exp $
95
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
97
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
99
class FGPropulsion : public FGModel {
101
FGPropulsion(FGFDMExec*);
104
/** Executes the propulsion model.
105
The initial plan for the FGPropulsion class calls for Run() to be executed,
106
performing the following tasks:
108
<li>Determine the drag - or power required - for the attached thrust effector
109
for this engine so that any feedback to the engine can be performed. This
110
is done by calling FGThruster::CalculatePReq()</li>
111
<li>Given 1, above, calculate the power available from the engine. This is
112
done by calling FGEngine::CalculatePAvail()</li>
113
<li>Next, calculate the thrust output from the thruster model given the power
114
available and the power required. This may also result in new performance
115
numbers for the thruster in the case of the propeller, at least. This
116
result is returned from a call to Calculate().</li></ol>
118
[Note: Should we be checking the Starved flag here?] */
121
/** Loads the propulsion system (engine[s], tank[s], thruster[s]).
122
Characteristics of the propulsion system are read in from the config file.
123
@param AC_cfg pointer to the config file instance that describes the
124
aircraft being modeled.
125
@return true if successfully loaded, otherwise false */
126
bool Load(FGConfigFile* AC_cfg);
128
/// Retrieves the number of engines defined for the aircraft.
129
inline unsigned int GetNumEngines(void) {return Engines.size();}
131
/** Retrieves an engine object pointer from the list of engines.
132
@param index the engine index within the vector container
133
@return the address of the specific engine, or zero if no such engine is
135
inline FGEngine* GetEngine(unsigned int index) {
136
if (index <= Engines.size()-1) return Engines[index];
139
// Retrieves the number of tanks defined for the aircraft.
140
inline unsigned int GetNumTanks(void) {return Tanks.size();}
142
/** Retrieves a tank object pointer from the list of tanks.
143
@param index the tank index within the vector container
144
@return the address of the specific tank, or zero if no such tank is
146
inline FGTank* GetTank(unsigned int index) {
147
if (index <= Tanks.size()-1) return Tanks[index];
150
/** Retrieves a thruster object pointer from the list of thrusters.
151
@param index the thruster index within the vector container
152
@return the address of the specific thruster, or zero if no such thruster is
154
inline FGThruster* GetThruster(unsigned int index) {
155
if (index <= Thrusters.size()-1) return Thrusters[index];
158
/** Returns the number of fuel tanks currently actively supplying fuel */
159
inline int GetnumSelectedFuelTanks(void) {return numSelectedFuelTanks;}
161
/** Returns the number of oxidizer tanks currently actively supplying oxidizer */
162
inline int GetnumSelectedOxiTanks(void) {return numSelectedOxiTanks;}
164
/** Loops the engines/thrusters until thrust output steady (used for trimming) */
165
bool GetSteadyState(void);
167
/** starts the engines in IC mode (dt=0). All engine-specific setup must
168
be done before calling this (i.e. magnetos, starter engage, etc.) */
169
bool ICEngineStart(void);
171
string GetPropulsionStrings(void);
172
string GetPropulsionValues(void);
174
inline FGColumnVector3& GetForces(void) {return vForces; }
175
inline double GetForces(int n) { return vForces(n);}
176
inline FGColumnVector3& GetMoments(void) {return vMoments;}
177
inline double GetMoments(int n) {return vMoments(n);}
179
FGColumnVector3& GetTanksCG(void);
180
double GetTanksWeight(void);
182
double GetTanksIxx(const FGColumnVector3& vXYZcg);
183
double GetTanksIyy(const FGColumnVector3& vXYZcg);
184
double GetTanksIzz(const FGColumnVector3& vXYZcg);
185
double GetTanksIxz(const FGColumnVector3& vXYZcg);
186
double GetTanksIxy(const FGColumnVector3& vXYZcg);
189
vector <FGEngine*> Engines;
190
vector <FGTank*> Tanks;
191
vector <FGTank*>::iterator iTank;
192
vector <FGThruster*> Thrusters;
193
unsigned int numSelectedFuelTanks;
194
unsigned int numSelectedOxiTanks;
195
unsigned int numFuelTanks;
196
unsigned int numOxiTanks;
197
unsigned int numEngines;
198
unsigned int numTanks;
199
unsigned int numThrusters;
201
FGColumnVector3 vForces;
202
FGColumnVector3 vMoments;
203
FGColumnVector3 vXYZtank;
204
void Debug(int from);
207
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%