Branch data Line data Source code
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: FGAuxiliary.h,v 1.18 2010/07/25 17:35:20 jberndt Exp $"
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: FGAuxiliary.h,v 1.18 2010/07/25 17:35:20 jberndt Exp $
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 : 1 : double GetVcalibratedFPS(void) const { return vcas; }
130 : : /** Returns Calibrated airspeed in knots.*/
131 : 46 : double GetVcalibratedKTS(void) const { return vcas*fpstokts; }
132 : : /** Returns equivalent airspeed in feet/second. */
133 : 1 : double GetVequivalentFPS(void) const { return veas; }
134 : : /** Returns equivalent airspeed in knots. */
135 : 1 : 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 : 1 : 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 : 1 : double GetTotalTemperature(void) const { return tat; }
151 : 1 : double GetTAT_C(void) const { return tatc; }
152 : :
153 : 3 : double GetPilotAccel(int idx) const { return vPilotAccel(idx); }
154 : 3 : double GetNpilot(int idx) const { return vPilotAccelN(idx); }
155 : 3 : double GetAeroPQR(int axis) const { return vAeroPQR(axis); }
156 : 3 : 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 : 0 : const FGColumnVector3& GetAeroPQR (void) const { return vAeroPQR; }
161 : : const FGColumnVector3& GetEulerRates (void) const { return vEulerRates; }
162 : 4909 : 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 : 3 : double GetAeroUVW (int idx) const { return vAeroUVW(idx); }
167 : 324031 : double Getalpha (void) const { return alpha; }
168 : 270026 : double Getbeta (void) const { return beta; }
169 : 1 : double Getadot (void) const { return adot; }
170 : 1 : double Getbdot (void) const { return bdot; }
171 : 1 : double GetMagBeta (void) const { return fabs(beta); }
172 : :
173 [ + - ][ # # ]: 4910 : double Getalpha (int unit) const { if (unit == inDegrees) return alpha*radtodeg;
[ + - ]
174 : 1 : else return BadUnits(); }
175 [ + - ][ # # ]: 4910 : double Getbeta (int unit) const { if (unit == inDegrees) return beta*radtodeg;
[ # # ][ + - ]
176 : 1 : else return BadUnits(); }
177 [ + - ]: 1 : double Getadot (int unit) const { if (unit == inDegrees) return adot*radtodeg;
178 : 1 : else return BadUnits(); }
179 [ + - ]: 1 : double Getbdot (int unit) const { if (unit == inDegrees) return bdot*radtodeg;
180 : 1 : else return BadUnits(); }
181 [ + - ]: 1 : double GetMagBeta (int unit) const { if (unit == inDegrees) return fabs(beta)*radtodeg;
182 : 1 : else return BadUnits(); }
183 : :
184 : 345067 : double Getqbar (void) const { return qbar; }
185 : 1 : double GetqbarUW (void) const { return qbarUW; }
186 : 1 : double GetqbarUV (void) const { return qbarUV; }
187 : 4910 : double GetReynoldsNumber(void) const { return Re; }
188 : :
189 : : /** Gets the magnitude of total vehicle velocity including wind effects in feet per second. */
190 : 58915 : 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 : 1 : double GetVground (void) const { return Vground; }
197 : :
198 : : /** Gets the Mach number. */
199 : 162019 : double GetMach (void) const { return Mach; }
200 : :
201 : : /** The mach number calculated using the vehicle X axis velocity. */
202 : 1 : double GetMachU (void) const { return MachU; }
203 : :
204 : : /** The vertical acceleration in g's of the aircraft center of gravity. */
205 : 1 : double GetNz (void) const { return Nz; }
206 : :
207 : 1 : double GetHOverBCG(void) const { return hoverbcg; }
208 : 1 : double GetHOverBMAC(void) const { return hoverbmac; }
209 : :
210 : 54006 : double GetGamma(void) const { return gamma; }
211 : 1 : 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 : 0 : void Setalpha (double tt) { alpha = tt; }
221 : 0 : void Setbeta (double tt) { beta = tt; }
222 : 1 : void Setqbar (double tt) { qbar = tt; }
223 : 0 : void SetqbarUW (double tt) { qbarUW = tt; }
224 : 0 : void SetqbarUV (double tt) { qbarUV = tt; }
225 : 1 : void SetVt (double tt) { Vt = tt; }
226 : 1 : void SetMach (double tt) { Mach=tt; }
227 : 0 : void Setadot (double tt) { adot = tt; }
228 : 0 : void Setbdot (double tt) { bdot = tt; }
229 : :
230 : 1 : void SetAB (double t1, double t2) { alpha=t1; beta=t2; }
231 : 0 : 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 : 0 : int GetDayOfYear (void) const { return day_of_year; }
239 : 0 : double GetSecondsInDay (void) const { return seconds_in_day; }
240 : :
241 : 1 : double GetLongitudeRelativePosition (void) const { return lon_relative_position; }
242 : 1 : double GetLatitudeRelativePosition (void) const { return lat_relative_position; }
243 : 1 : 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
|