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