]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGAuxiliary.h
Merge branch 'vivian/trainz'
[flightgear.git] / src / FDM / JSBSim / models / FGAuxiliary.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGAuxiliary.h
4  Author:       Jon Berndt
5  Date started: 01/26/99
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 11/22/98   JSB   Created
29   1/1/00   TP    Added calcs and getters for VTAS, VCAS, VEAS, Vground, in knots
30
31 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 SENTRY
33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34
35 #ifndef FGAUXILIARY_H
36 #define FGAUXILIARY_H
37
38 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 INCLUDES
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
41
42 #include "FGModel.h"
43 #include "math/FGColumnVector3.h"
44 #include "math/FGLocation.h"
45 #include "FGPropagate.h"
46
47 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 DEFINITIONS
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50
51 #define ID_AUXILIARY "$Id$"
52
53 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54 FORWARD DECLARATIONS
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
56
57 namespace JSBSim {
58
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60 CLASS DOCUMENTATION
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62
63 /** Encapsulates various uncategorized scheduled functions.
64     Pilot sensed accelerations are calculated here. This is used
65     for the coordinated turn ball instrument. Motion base platforms sometimes
66     use the derivative of pilot sensed accelerations as the driving parameter,
67     rather than straight accelerations.
68
69     The theory behind pilot-sensed calculations is presented:
70
71     For purposes of discussion and calculation, assume for a minute that the
72     pilot is in space and motionless in inertial space. She will feel
73     no accelerations. If the aircraft begins to accelerate along any axis or
74     axes (without rotating), the pilot will sense those accelerations. If
75     any rotational moment is applied, the pilot will sense an acceleration
76     due to that motion in the amount:
77
78     [wdot X R]  +  [w X (w X R)]
79     Term I          Term II
80
81     where:
82
83     wdot = omegadot, the rotational acceleration rate vector
84     w    = omega, the rotational rate vector
85     R    = the vector from the aircraft CG to the pilot eyepoint
86
87     The sum total of these two terms plus the acceleration of the aircraft
88     body axis gives the acceleration the pilot senses in inertial space.
89     In the presence of a large body such as a planet, a gravity field also
90     provides an accelerating attraction. This acceleration can be transformed
91     from the reference frame of the planet so as to be expressed in the frame
92     of reference of the aircraft. This gravity field accelerating attraction
93     is felt by the pilot as a force on her tushie as she sits in her aircraft
94     on the runway awaiting takeoff clearance.
95
96     In JSBSim the acceleration of the body frame in inertial space is given
97     by the F = ma relation. If the vForces vector is divided by the aircraft
98     mass, the acceleration vector is calculated. The term wdot is equivalent
99     to the JSBSim vPQRdot vector, and the w parameter is equivalent to vPQR.
100     The radius R is calculated below in the vector vToEyePt.
101
102     @author Tony Peden, Jon Berndt
103     @version $Id$
104 */
105
106 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
107 CLASS DECLARATION
108 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
109
110 class FGAuxiliary : public FGModel {
111 public:
112   /** Constructor
113       @param Executive a pointer to the parent executive object */
114   FGAuxiliary(FGFDMExec* Executive);
115
116   /// Destructor
117   ~FGAuxiliary();
118
119   bool InitModel(void);
120
121   /** Runs the Auxiliary routines; called by the Executive
122       @return false if no error */
123   bool Run(void);
124
125 // GET functions
126
127   // Atmospheric parameters GET functions
128   /** Returns Calibrated airspeed in feet/second.*/
129   double GetVcalibratedFPS(void) const { return vcas; }
130   /** Returns Calibrated airspeed in knots.*/
131   double GetVcalibratedKTS(void) const { return vcas*fpstokts; }
132   /** Returns equivalent airspeed in feet/second. */
133   double GetVequivalentFPS(void) const { return veas; }
134   /** Returns equivalent airspeed in knots. */
135   double GetVequivalentKTS(void) const { return veas*fpstokts; }
136
137   /** Returns the total pressure.
138       Total pressure is freestream total pressure for
139       subsonic only. For supersonic it is the 1D total pressure
140       behind a normal shock. */
141   double GetTotalPressure(void) const { return pt; }
142
143   /** Returns the total temperature.
144     The total temperature ("tat", isentropic flow) is calculated:
145     @code
146     tat = sat*(1 + 0.2*Mach*Mach)
147     @endcode
148     (where "sat" is standard temperature) */
149
150   double GetTotalTemperature(void) const { return tat; }
151   double GetTAT_C(void) const { return tatc; }
152
153   double GetPilotAccel(int idx)  const { return vPilotAccel(idx);  }
154   double GetNpilot(int idx)      const { return vPilotAccelN(idx); }
155   double GetAeroPQR(int axis)    const { return vAeroPQR(axis);    }
156   double GetEulerRates(int axis) const { return vEulerRates(axis); }
157
158   const FGColumnVector3& GetPilotAccel (void) const { return vPilotAccel;  }
159   const FGColumnVector3& GetNpilot     (void) const { return vPilotAccelN; }
160   const FGColumnVector3& GetAeroPQR    (void) const { return vAeroPQR;     }
161   const FGColumnVector3& GetEulerRates (void) const { return vEulerRates;  }
162   const FGColumnVector3& GetAeroUVW    (void) const { return vAeroUVW;     }
163   const FGLocation&      GetLocationVRP(void) const { return vLocationVRP; }
164
165   double GethVRP(void) const { return vLocationVRP.GetRadius() - Propagate->GetSeaLevelRadius(); }
166   double GetAeroUVW (int idx) const { return vAeroUVW(idx); }
167   double Getalpha   (void) const { return alpha;      }
168   double Getbeta    (void) const { return beta;       }
169   double Getadot    (void) const { return adot;       }
170   double Getbdot    (void) const { return bdot;       }
171   double GetMagBeta (void) const { return fabs(beta); }
172
173   double Getalpha   (int unit) const { if (unit == inDegrees) return alpha*radtodeg;
174                                        else return BadUnits(); }
175   double Getbeta    (int unit) const { if (unit == inDegrees) return beta*radtodeg;
176                                        else return BadUnits(); }
177   double Getadot    (int unit) const { if (unit == inDegrees) return adot*radtodeg;
178                                        else return BadUnits(); }
179   double Getbdot    (int unit) const { if (unit == inDegrees) return bdot*radtodeg;
180                                        else return BadUnits(); }
181   double GetMagBeta (int unit) const { if (unit == inDegrees) return fabs(beta)*radtodeg;
182                                        else return BadUnits(); }
183
184   double Getqbar          (void) const { return qbar;       }
185   double GetqbarUW        (void) const { return qbarUW;     }
186   double GetqbarUV        (void) const { return qbarUV;     }
187   double GetReynoldsNumber(void) const { return Re;         }
188
189   /** Gets the magnitude of total vehicle velocity including wind effects in feet per second. */
190   double GetVt            (void) const { return Vt;         }
191
192   /** Gets the ground speed in feet per second.
193       The magnitude is the square root of the sum of the squares (RSS) of the 
194       vehicle north and east velocity components.
195       @return The magnitude of the vehicle velocity in the horizontal plane. */
196   double GetVground       (void) const { return Vground;    }
197
198   /** Gets the Mach number. */
199   double GetMach          (void) const { return Mach;       }
200
201   /** The mach number calculated using the vehicle X axis velocity. */
202   double GetMachU         (void) const { return MachU;      }
203
204   /** The vertical acceleration in g's of the aircraft center of gravity. */
205   double GetNz            (void) const { return Nz;         }
206
207   double GetHOverBCG(void) const { return hoverbcg; }
208   double GetHOverBMAC(void) const { return hoverbmac; }
209
210   double GetGamma(void)              const { return gamma;         }
211   double GetGroundTrack(void)        const { return psigt;         }
212
213   double GetHeadWind(void) const;
214   double GetCrossWind(void) const;
215
216 // SET functions
217
218   void SetAeroUVW(FGColumnVector3 tt) { vAeroUVW = tt; }
219
220   void Setalpha  (double tt) { alpha = tt;  }
221   void Setbeta   (double tt) { beta  = tt;  }
222   void Setqbar   (double tt) { qbar = tt;   }
223   void SetqbarUW (double tt) { qbarUW = tt; }
224   void SetqbarUV (double tt) { qbarUV = tt; }
225   void SetVt     (double tt) { Vt = tt;     }
226   void SetMach   (double tt) { Mach=tt;     }
227   void Setadot   (double tt) { adot = tt;   }
228   void Setbdot   (double tt) { bdot = tt;   }
229
230   void SetAB    (double t1, double t2) { alpha=t1; beta=t2; }
231   void SetGamma (double tt)            { gamma = tt;        }
232
233 // Time routines, SET and GET functions, used by FGMSIS atmosphere
234
235   void SetDayOfYear    (int doy)    { day_of_year = doy;    }
236   void SetSecondsInDay (double sid) { seconds_in_day = sid; }
237
238   int    GetDayOfYear    (void) const { return day_of_year;    }
239   double GetSecondsInDay (void) const { return seconds_in_day; }
240
241   double GetLongitudeRelativePosition (void) const { return lon_relative_position; }
242   double GetLatitudeRelativePosition  (void) const { return lat_relative_position; }
243   double GetDistanceRelativePosition  (void) const { return relative_position; }
244
245   void SetAeroPQR(FGColumnVector3 tt) { vAeroPQR = tt; }
246
247 private:
248   double vcas, veas;
249   double rhosl, rho, p, psl, pt, tat, sat, tatc; // Don't add a getter for pt!
250
251   FGColumnVector3 vPilotAccel;
252   FGColumnVector3 vPilotAccelN;
253   FGColumnVector3 vToEyePt;
254   FGColumnVector3 vAeroPQR;
255   FGColumnVector3 vAeroUVW;
256   FGColumnVector3 vEuler;
257   FGColumnVector3 vEulerRates;
258   FGColumnVector3 vMachUVW;
259   FGColumnVector3 vAircraftAccel;
260   FGLocation vLocationVRP;
261
262   double Vt, Vground, Mach, MachU;
263   double qbar, qbarUW, qbarUV;
264   double Re; // Reynolds Number = V*c/mu
265   double alpha, beta;
266   double adot,bdot;
267   double psigt, gamma;
268   double Nz;
269   double seconds_in_day;  // seconds since current GMT day began
270   int    day_of_year;     // GMT day, 1 .. 366
271
272   double hoverbcg, hoverbmac;
273
274   // helper data, calculation of distance from initial position
275
276   double lon_relative_position;
277   double lat_relative_position;
278   double relative_position;
279
280   void CalculateRelativePosition(void);
281
282   void bind(void);
283   double BadUnits(void) const;
284   void Debug(int from);
285 };
286
287 } // namespace JSBSim
288
289 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
290 #endif