]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGAuxiliary.h
Sync. with JSBSim CVS
[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 (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 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 cerr << "Bad units" << endl; return 0.0;}
175   double Getbeta    (int unit) const { if (unit == inDegrees) return beta*radtodeg;
176                                        else cerr << "Bad units" << endl; return 0.0;}
177   double Getadot    (int unit) const { if (unit == inDegrees) return adot*radtodeg;
178                                        else cerr << "Bad units" << endl; return 0.0;}
179   double Getbdot    (int unit) const { if (unit == inDegrees) return bdot*radtodeg;
180                                        else cerr << "Bad units" << endl; return 0.0;}
181   double GetMagBeta (int unit) const { if (unit == inDegrees) return fabs(beta)*radtodeg;
182                                        else cerr << "Bad units" << endl; return 0.0;}
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   double GetVt            (void) const { return Vt;         }
189   double GetVground       (void) const { return Vground;    }
190   double GetMach          (void) const { return Mach;       }
191   double GetMachU         (void) const { return MachU;      }
192   double GetNz            (void) const { return Nz;         }
193
194   double GetHOverBCG(void) const { return hoverbcg; }
195   double GetHOverBMAC(void) const { return hoverbmac; }
196
197   double GetGamma(void)              const { return gamma;         }
198   double GetGroundTrack(void)        const { return psigt;         }
199
200   double GetHeadWind(void) const;
201   double GetCrossWind(void) const;
202
203 // SET functions
204
205   void SetAeroUVW(FGColumnVector3 tt) { vAeroUVW = tt; }
206
207   void Setalpha  (double tt) { alpha = tt;  }
208   void Setbeta   (double tt) { beta  = tt;  }
209   void Setqbar   (double tt) { qbar = tt;   }
210   void SetqbarUW (double tt) { qbarUW = tt; }
211   void SetqbarUV (double tt) { qbarUV = tt; }
212   void SetVt     (double tt) { Vt = tt;     }
213   void SetMach   (double tt) { Mach=tt;     }
214   void Setadot   (double tt) { adot = tt;   }
215   void Setbdot   (double tt) { bdot = tt;   }
216
217   void SetAB    (double t1, double t2) { alpha=t1; beta=t2; }
218   void SetGamma (double tt)            { gamma = tt;        }
219
220 // Time routines, SET and GET functions, used by FGMSIS atmosphere
221
222   void SetDayOfYear    (int doy)    { day_of_year = doy;    }
223   void SetSecondsInDay (double sid) { seconds_in_day = sid; }
224
225   int    GetDayOfYear    (void) const { return day_of_year;    }
226   double GetSecondsInDay (void) const { return seconds_in_day; }
227
228   double GetLongitudeRelativePosition (void) const { return lon_relative_position; }
229   double GetLatitudeRelativePosition  (void) const { return lat_relative_position; }
230   double GetDistanceRelativePosition  (void) const { return relative_position; }
231
232   void SetAeroPQR(FGColumnVector3 tt) { vAeroPQR = tt; }
233
234 private:
235   double vcas, veas;
236   double rhosl, rho, p, psl, pt, tat, sat, tatc; // Don't add a getter for pt!
237
238   FGColumnVector3 vPilotAccel;
239   FGColumnVector3 vPilotAccelN;
240   FGColumnVector3 vToEyePt;
241   FGColumnVector3 vAeroPQR;
242   FGColumnVector3 vAeroUVW;
243   FGColumnVector3 vEuler;
244   FGColumnVector3 vEulerRates;
245   FGColumnVector3 vMachUVW;
246   FGColumnVector3 vAircraftAccel;
247   FGLocation vLocationVRP;
248
249   double Vt, Vground, Mach, MachU;
250   double qbar, qbarUW, qbarUV;
251   double Re; // Reynolds Number = V*c/mu
252   double alpha, beta;
253   double adot,bdot;
254   double psigt, gamma;
255   double Nz;
256   double seconds_in_day;  // seconds since current GMT day began
257   int    day_of_year;     // GMT day, 1 .. 366
258
259   double hoverbcg, hoverbmac;
260
261   // helper data, calculation of distance from initial position
262
263   double lon_relative_position;
264   double lat_relative_position;
265   double relative_position;
266
267   void CalculateRelativePosition(void);
268
269   void bind(void);
270   void Debug(int from);
271 };
272
273 } // namespace JSBSim
274
275 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276 #endif