1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 Header: FGMassBalance.h
5 Date started: 09/12/2000
7 ------------- Copyright (C) 2000 Jon S. Berndt (jsb@hal-pc.org) --------------
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
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
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.
23 Further information about the GNU General Public License can also be found on
24 the world wide web at http://www.gnu.org.
27 --------------------------------------------------------------------------------
28 09/12/2000 JSB Created
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
34 #ifndef FGMASSBALANCE_H
35 #define FGMASSBALANCE_H
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
42 #include <math/FGColumnVector3.h>
43 #include <math/FGMatrix33.h>
44 #include <input_output/FGXMLElement.h>
47 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
51 #define ID_MASSBALANCE "$Id$"
53 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
59 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63 /** Models weight and balance information.
66 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
68 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
70 class FGMassBalance : public FGModel
74 FGMassBalance(FGFDMExec*);
77 bool Load(Element* el);
81 inline double GetMass(void) const {return Mass;}
82 inline double GetWeight(void) const {return Weight;}
83 inline FGColumnVector3& GetXYZcg(void) {return vXYZcg;}
84 inline double GetXYZcg(int axis) const {return vXYZcg(axis);}
86 /** Computes the inertia contribution of a pointmass.
87 Computes and returns the inertia matrix of a pointmass of mass
88 slugs at the given vector r in the structural frame. The units
89 should be for the mass in slug and the vector in the structural
90 frame as usual in inches.
91 @param slugs the mass of this single pointmass given in slugs
92 @param r the location of this single pointmass in the structural frame
94 FGMatrix33 GetPointmassInertia(double slugs, const FGColumnVector3& r) const
96 FGColumnVector3 v = StructuralToBody( r );
97 FGColumnVector3 sv = slugs*v;
98 double xx = sv(1)*v(1);
99 double yy = sv(2)*v(2);
100 double zz = sv(3)*v(3);
101 double xy = -sv(1)*v(2);
102 double xz = -sv(1)*v(3);
103 double yz = -sv(2)*v(3);
104 return FGMatrix33( yy+zz, xy, xz,
109 /** Conversion from the structural frame to the body frame.
110 Converts the location given in the structural frame
111 coordinate system to the body frame. The units of the structural
112 frame are assumed to be in inches. The unit of the result is in
114 @param r vector coordinate in the structural reference frame (X positive
115 aft, measurements in inches).
116 @return vector coordinate in the body frame, in feet.
118 FGColumnVector3 StructuralToBody(const FGColumnVector3& r) const;
120 inline void SetEmptyWeight(double EW) { EmptyWeight = EW;}
121 inline void SetBaseCG(const FGColumnVector3& CG) {vbaseXYZcg = vXYZcg = CG;}
123 void AddPointMass(Element* el);
124 double GetPointMassWeight(void);
125 FGColumnVector3& GetPointMassMoment(void);
126 FGMatrix33& GetJ(void) {return mJ;}
127 FGMatrix33& GetJinv(void) {return mJinv;}
128 void SetAircraftBaseInertias(FGMatrix33 BaseJ) {baseJ = BaseJ;}
141 FGColumnVector3 vXYZcg;
142 FGColumnVector3 vXYZtank;
143 FGColumnVector3 vbaseXYZcg;
144 FGColumnVector3 vPMxyz;
145 FGColumnVector3 PointMassCG;
146 FGMatrix33& CalculatePMInertias(void);
149 PointMass(double w, double x, double y, double z) {
151 Location.InitMatrix(x, y, z);
153 FGColumnVector3 Location;
157 vector <struct PointMass> PointMasses;
159 void Debug(int from);
162 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%