]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/FGForce.h
Check return value of FDM::init().
[flightgear.git] / src / FDM / JSBSim / FGForce.h
1 /*******************************************************************************
2
3  Header:       FGForce.h
4  Author:       Tony Peden
5  Date started: 5/20/00
6
7  ------------- Copyright (C) 1999  Anthony K. Peden (apeden@earthlink.net) -------------
8
9  This program is free software; you can redistribute it and/or modify it under
10  the terms of the GNU 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 General Public License for more
17  details.
18
19  You should have received a copy of the GNU 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 General Public License can also be found on
24  the world wide web at http://www.gnu.org.
25
26
27  HISTORY
28 --------------------------------------------------------------------------------
29 5/20/00  TP   Created
30
31
32 FUNCTIONAL DESCRIPTION
33 --------------------------------------------------------------------------------
34
35 The purpose of this class is to provide storage for computed forces and
36 encapsulate all the functionality associated with transforming those
37 forces from their native coord system to the body system.  This includes
38 computing the moments due to the difference between the point of application
39 and the cg.
40
41 CAVEAT:  if the custom transform is used for wind-to-body transforms then the
42          user *must* always pass this class the negative of beta. This is true
43          because sideslip angle does not follow the right hand rule i.e. it is
44          positive for aircraft nose left sideslip.  Note that use of the custom
45          transform for this purpose shouldn't be necessary as it is already
46          provided by SetTransform(tWindBody) and is not subject to the same
47          restriction.
48
49 ********************************************************************************
50 SENTRY
51 *******************************************************************************/
52
53 #ifndef FGFORCE_H
54 #define FGFORCE_H
55
56 /*******************************************************************************
57 INCLUDES
58 *******************************************************************************/
59
60 #define ID_FORCE "$Header"
61
62 #include "FGFDMExec.h"
63 #include "FGMatrix.h"
64
65 /*******************************************************************************
66 CLASS DECLARATION
67 *******************************************************************************/
68
69 typedef enum { tNone, tWindBody, tLocalBody, tCustom } TransformType;
70
71 class FGForce {
72
73 public:
74
75   FGForce(FGFDMExec *FDMExec);
76   ~FGForce(void);
77
78   inline void SetNativeForces(float Fnx, float Fny, float Fnz) {
79     vFn(1)=Fnx;
80     vFn(2)=Fny;
81     vFn(3)=Fnz;
82   }
83   inline void SetNativeForces(FGColumnVector vv) { vFn = vv; };
84
85   inline void SetNativeMoments(float Ln,float Mn, float Nn) {
86     vMn(1)=Ln;
87     vMn(2)=Mn;
88     vMn(3)=Nn;
89   }
90   inline void SetNativeMoments(FGColumnVector vv) { vMn = vv; }
91
92   inline FGColumnVector GetNativeForces(void) { return vFn; }
93   inline FGColumnVector GetNativeMoments(void) { return vMn; }
94
95
96   FGColumnVector GetBodyForces(void);
97
98   inline FGColumnVector GetMoments(void) { return vM; }
99
100   //point of application, JSBsim structural coords
101   //(inches, x +back, y +right, z +up)
102   inline void SetLocation(float x, float y, float z) {
103     vXYZn(1) = x;
104     vXYZn(2) = y;
105     vXYZn(3) = z;
106   }
107   inline void SetLocation(FGColumnVector vv) { vXYZn = vv; }
108   FGColumnVector GetLocation(void) { return vXYZn; }
109
110   //these angles are relative to body axes, not earth!!!!!
111   //I'm using these because pitch, roll, and yaw are easy to visualize,
112   //there's no equivalent to roll in wind axes i.e. alpha, ? , beta
113   //making up new names or using these is a toss-up: either way people
114   //are going to get confused.
115   //They are in radians.
116
117   void SetAnglesToBody(float broll, float bpitch, float byaw);
118   inline void  SetAnglesToBody(FGColumnVector vv) { SetAnglesToBody(vv(1), vv(2), vv(3));}
119
120   inline void SetSense(float x, float y, float z) { vSense(1)=x, vSense(2)=y, vSense(3)=z; }
121   inline void SetSense(FGColumnVector vv) { vSense=vv; }
122
123   inline FGColumnVector GetSense(void) { return vSense; }
124
125   inline void SetTransformType(TransformType ii) { ttype=ii; }
126   inline TransformType GetTransformType(void) { return ttype; }
127
128   FGMatrix Transform(void);
129
130 protected:
131   FGColumnVector vFn;
132   FGColumnVector vMn;
133
134 private:
135   FGColumnVector vFb;
136   FGColumnVector vM;
137   FGColumnVector vXYZn;
138   FGColumnVector vDXYZ;
139   FGColumnVector vSense;
140
141   FGMatrix mT;
142
143   FGFDMExec *fdmex;
144   TransformType ttype;
145
146 };
147
148 #endif
149