]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGGasCell.h
Bugfix: no automatic runway selection with --parkpos=
[flightgear.git] / src / FDM / JSBSim / models / FGGasCell.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGGasCell.h
4  Author:       Anders Gidenstam
5  Date started: 01/21/2006
6
7  ----- Copyright (C) 2006 - 2008  Anders Gidenstam (anders(at)gidenstam.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 FUNCTIONAL DESCRIPTION
27 --------------------------------------------------------------------------------
28
29 This class simulates a generic gas cell for static buoyancy.
30
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 SENTRY
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34
35 #ifndef FGGasCell_H
36 #define FGGasCell_H
37
38 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 INCLUDES
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41
42 #include "FGJSBBase.h"
43 #include "math/FGColumnVector3.h"
44 #include "models/propulsion/FGForce.h"
45 #include "math/FGFunction.h"
46
47 #include <string>
48
49 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 DEFINITIONS
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52
53 #define ID_GASCELL "$Id: FGGasCell.h,v 1.10 2009/10/24 22:59:30 jberndt Exp $"
54
55 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 FORWARD DECLARATIONS
57 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58
59 namespace JSBSim {
60
61 class FGBallonet;
62 class Element;
63
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 CLASS DOCUMENTATION
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67
68 /** Models a gas cell.
69     @author Anders Gidenstam
70
71 <h3>Configuration File Format:</h3>
72 @code
73 <buoyant_forces>
74   <gas_cell type="{HYDROGEN | HELIUM | AIR}">
75     <location unit="{M | IN}">
76       <x> {number} </x>
77       <y> {number} </y>
78       <z> {number} </z>
79     </location>
80     <x_width unit="{M | IN}"> {number} </x_width>
81     <y_radius unit="{M | IN}"> {number} </y_radius>
82     <z_radius unit="{M | IN}"> {number} </z_radius>
83     <max_overpressure unit="{PA | PSI}"> {number} </max_overpressure>
84     <valve_coefficient unit="{M4*SEC/KG | FT4*SEC/SLUG}"> {number} </valve_coefficient>
85     <fullness> {number} </fullness>  
86     <heat>
87       {heat transfer coefficients} [lbs ft / sec]
88     </heat>
89     <ballonet>
90       <location unit="{M | IN}">
91         <x> {number} </x>
92         <y> {number} </y>
93         <z> {number} </z>
94       </location>
95       <x_width unit="{M | IN}"> {number} </x_width>
96       <y_radius unit="{M | IN}"> {number} </y_radius>
97       <z_radius unit="{M | IN}"> {number} </z_radius>
98       <max_overpressure unit="{PA | PSI}"> {number} </max_overpressure>
99       <valve_coefficient unit="{M4*SEC/KG | FT4*SEC/SLUG}"> {number} </valve_coefficient>
100       <fullness> {number} </fullness>  
101       <heat>
102        {heat transfer coefficients} [lb ft / (sec Rankine)]
103       </heat>
104       <blower_input>
105        {input air flow function} [ft^3 / sec]
106       </blower_input>
107     </ballonet>
108   </gas_cell>
109 </buoyant_forces>
110 @endcode
111
112 Definition of the gas cell configuration file parameters:
113 - <b>type</b> -
114     One of HYDROGEN, HELIUM or AIR.
115 - <b>location</b> -
116     Location of cell center in the aircraft's structural frame.
117     Currently this is were the forces of the cell is applied.
118 - <b>{x|y|z}_radius</b> -
119     Radius along in the respective direction (both ends).
120 - <b>{x|y|z}_width</b> -
121     Width in the respective direction.
122     <b>NOTE:</b> A 'x', 'y', 'z'-radius/width combination must be specified.
123 - <b>fullness</b> -
124     Initial fullness of the cell, normally [0,1],
125     values >1 initialize the cell at pressure.
126 - <b>max_overpressure</b> -
127     Maximum cell overpressure (excess is automatically valved off).
128 - <b>valve_coefficient</b> -
129     Capacity of the manual valve. The valve is
130     considered to be located at the top of the cell.
131     The valve coefficient determine the flow out
132     of the cell according to:
133     <i>dVolume/dt = ValveCoefficient * DeltaPressure</i>.
134 - <b>heat</b> -
135     Zero or more FGFunction:s describing the heat flow from
136     the atmosphere into the gas cell.
137     Unit: [lb ft / (sec Rankine)].
138     If there are no heat transfer functions at all the gas cell
139     temperature will equal that of the surrounding atmosphere.
140     A constant function returning 0 results in adiabatic behaviour.
141 - <b>ballonet</b> -
142     Zero or more ballonets, i.e. air bags inside the gas cell.
143     Ballonets are used to maintain the volume of the gas cell
144     and keep its internal pressure higher than that of the
145     surrounding environment.
146   - <b>location</b> -
147       Location of ballonet center in the aircraft's structural frame.
148   - <b>{x|y|z}_radius</b> -
149       Radius along in the respective direction (both ends).
150   - <b>{x|y|z}_width</b> -
151       Width in the respective direction.
152   - <b>max_overpressure</b> -
153       Maximum ballonet overpressure (excess is automatically valved off).
154   - <b>valve_coefficient</b> -
155       Capacity of the exit valve between the ballonet
156       and the atmosphere. The valve coefficient
157       determine the flow out of the cell according to:
158       <i>dVolume/dt = ValveCoefficient * DeltaPressure</i>.
159   - <b>heat</b> -
160       Zero or more FGFunction:s describing the heat flow from
161       the enclosing gas cell into the ballonet.
162       Unit: [lb ft / (sec Rankine)]
163   - <b>blower_input</b> -
164       One FGFunction describing the air flow into the
165       ballonet. Unit: [ft<sup>3</sup> / sec] (at the temperature and
166       pressure of the ballonet.)
167   */
168
169 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
170 CLASS DECLARATION
171 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
172 class FGGasCell : public FGForce
173 {
174 public:
175   /** Constructor
176       @param exec Executive a pointer to the parent executive object
177       @param el   Pointer to configuration file XML node
178       @param num  Gas cell index number. */
179   FGGasCell(FGFDMExec* exec, Element* el, int num);
180   ~FGGasCell();
181
182   /** Runs the gas cell model; called by BuoyantForces
183    */
184   void Calculate(double dt);
185
186   /** Get the index of this gas cell
187       @return gas cell index. */
188   int GetIndex(void) const {return CellNum;}
189
190   /** Get the center of gravity location of the gas cell
191       (including any ballonets)
192       @return CoG location in the structural frame. */
193   const FGColumnVector3& GetXYZ(void) const {return vXYZ;}
194
195   /** Get the center of gravity location of the gas cell
196       (including any ballonets)
197       @return CoG location in the structural frame. */
198   double GetXYZ(int idx) const {return vXYZ(idx);}
199
200   /** Get the current mass of the gas cell (including any ballonets)
201       @return gas mass in slug. */
202   double GetMass(void) const {return Mass;}
203
204   /** Get the moments of inertia of the gas cell (including any ballonets)
205       @return moments of inertia matrix relative the gas cell location
206       in slug ft<sup>2</sup>. */
207   const FGMatrix33& GetInertia(void) const {return gasCellJ;}
208
209   /** Get the moment due to mass of the gas cell (including any ballonets)
210
211       Note that the buoyancy of the gas cell is handled separately by the
212       FGForce part and not included here.
213       @return moment vector in lbs ft. */
214   const FGColumnVector3& GetMassMoment(void) const {return gasCellM;}
215
216   /** Get the current gas temperature inside the gas cell
217       @return gas temperature in Rankine. */
218   double GetTemperature(void) const {return Temperature;}
219
220   /** Get the current gas pressure inside the gas cell
221       @return gas pressure in lbs / ft<sup>2</sup>. */
222   double GetPressure(void) const {return Pressure;}
223
224 private:
225
226   enum GasType {ttUNKNOWN, ttHYDROGEN, ttHELIUM, ttAIR};
227
228   GasType Type;
229   std::string type;
230   int CellNum;
231   // Structural constants
232   double MaxVolume;                 // [ft�]
233   double MaxOverpressure;           // [lbs/ft�]
234   FGColumnVector3 vXYZ;             // [in]
235   double Xradius, Yradius, Zradius; // [ft]
236   double Xwidth, Ywidth, Zwidth;    // [ft]
237   double ValveCoefficient;          // [ft^4 sec / slug]
238   typedef vector <FGFunction*> CoeffArray;
239   CoeffArray HeatTransferCoeff;
240   typedef vector <FGBallonet*> BallonetArray;
241   BallonetArray Ballonet;
242   // Variables
243   double Pressure;          // [lbs/ft�]
244   double Contents;          // [mol]
245   double Volume;            // [ft�]
246   double dVolumeIdeal;      // [ft�]
247   double Temperature;       // [Rankine]
248   double Buoyancy;          // [lbs] Note: Gross lift.
249                             // Does not include the weight of the gas itself.
250   double ValveOpen;         // 0 <= ValveOpen <= 1 (or higher).
251   double Mass;              // [slug]
252   FGMatrix33 gasCellJ;      // [slug foot�]
253   FGColumnVector3 gasCellM; // [lbs ft]
254
255   FGAuxiliary* Auxiliary;
256   FGAtmosphere* Atmosphere;
257   FGPropertyManager* PropertyManager;
258   FGInertial* Inertial;
259   FGMassBalance* MassBalance;
260   void Debug(int from);
261
262   /* Constants. */
263   const static double R;          // [lbs ft/(mol Rankine)]
264   const static double M_air;      // [slug/mol]
265   const static double M_hydrogen; // [slug/mol]
266   const static double M_helium;   // [slug/mol]
267
268   double M_gas() {                // [slug/mol]
269     switch (Type) {
270     case ttHYDROGEN:
271       return M_hydrogen;
272     case ttHELIUM:
273       return M_helium;
274     case ttAIR:
275       return M_air;
276     default:
277       return M_air;
278     }
279   }
280
281   double Cv_gas() {               // [??]
282     switch (Type) {
283     case ttHYDROGEN:
284       return 5.0/2.0;
285     case ttHELIUM:
286       return 3.0/2.0;
287     case ttAIR:
288       return 5.0/2.0;
289     default:
290       return 5.0/2.0;
291     }
292   }
293
294 };
295
296 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
297 /** Models a ballonet inside a gas cell.
298     Models a ballonet inside a gas cell.
299     Not intended to be used outside FGGasCell.
300     See FGGasCell for the configuration file format.
301     @author Anders Gidenstam
302 */
303 class FGBallonet : public FGJSBBase
304 {
305 public:
306   FGBallonet(FGFDMExec* exec, Element* el, int num, FGGasCell* parent);
307   ~FGBallonet();
308
309   /** Runs the ballonet model; called by FGGasCell
310    */
311   void Calculate(double dt);
312
313
314   /** Get the center of gravity location of the ballonet
315       @return CoG location in the structural frame. */
316   const FGColumnVector3& GetXYZ(void) const {return vXYZ;}
317   /** Get the center of gravity location of the ballonet
318       @return CoG location in the structural frame. */
319   double GetXYZ(int idx) const {return vXYZ(idx);}
320
321   /** Get the current mass of the ballonets
322       @return mass in slug. */
323   double GetMass(void) const {return Contents * M_air;}
324
325   /** Get the moments of inertia of the ballonet
326       @return moments of inertia matrix in slug ft<sup>2</sup>. */
327   const FGMatrix33& GetInertia(void) const {return ballonetJ;}
328
329   /** Get the current volume of the ballonet
330       @return volume in ft<sup>3</sup>. */
331   double GetVolume(void) const {return Volume;}
332   /** Get the current heat flow into the ballonet
333       @return heat flow in lbs ft / sec. */
334   double GetHeatFlow(void) const {return dU;}       // [lbs ft / sec]
335
336 private:
337   int CellNum;
338   // Structural constants
339   double MaxVolume;                 // [ft�]
340   double MaxOverpressure;           // [lbs/ft�]
341   FGColumnVector3 vXYZ;             // [in]
342   double Xradius, Yradius, Zradius; // [ft]
343   double Xwidth, Ywidth, Zwidth;    // [ft]
344   double ValveCoefficient;          // [ft^4 sec / slug]
345   typedef vector <FGFunction*> CoeffArray;
346   CoeffArray HeatTransferCoeff;     // [lbs ft / sec]
347   FGFunction* BlowerInput;          // [ft^3 / sec]
348   FGGasCell* Parent;
349   // Variables
350   double Pressure;         // [lbs/ft�]
351   double Contents;         // [mol]
352   double Volume;           // [ft�]
353   double dVolumeIdeal;     // [ft�]
354   double dU;               // [lbs ft / sec]
355   double Temperature;      // [Rankine]
356   double ValveOpen;        // 0 <= ValveOpen <= 1 (or higher).
357   FGMatrix33 ballonetJ;     // [slug foot�]
358
359   FGAuxiliary* Auxiliary;
360   FGAtmosphere* Atmosphere;
361   FGPropertyManager* PropertyManager;
362   FGInertial* Inertial;
363   void Debug(int from);
364
365   /* Constants. */
366   const static double R;          // [lbs ft/(mol Rankine)]
367   const static double M_air;      // [slug/mol]
368   const static double Cv_air;     // [??]
369 };
370 }
371 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
372 #endif