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 Lesser 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 Lesser General Public License for more
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.
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.
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 #if defined(WIN32) && !defined(__CYGWIN__)
54 #define snprintf _snprintf
57 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
63 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67 /** Models weight, balance and moment of inertia information. Maintains a vector
68 of point masses. Sums the contribution of all, and provides this to FGPropagate.
69 Loads the \<mass_balance> section of the aircraft configuration file.
71 <h3>Configuration File Format:</h3>
74 <ixx unit="{SLUG*FT2 | KG*M2}"> {number} </ixx>
75 <iyy unit="{SLUG*FT2 | KG*M2}"> {number} </iyy>
76 <izz unit="{SLUG*FT2 | KG*M2}"> {number} </izz>
77 <ixy unit="{SLUG*FT2 | KG*M2}"> {number} </ixy>
78 <ixz unit="{SLUG*FT2 | KG*M2}"> {number} </ixz>
79 <iyz unit="{SLUG*FT2 | KG*M2}"> {number} </iyz>
80 <emptywt unit="{LBS | KG"> {number} </emptywt>
81 <location name="CG" unit="{IN | M}">
86 <pointmass name="{string}">
87 <weight unit="{LBS | KG}"> {number} </weight>
88 <location name="POINTMASS" unit="{IN | M}">
94 ... other point masses ...
99 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
101 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
103 class FGMassBalance : public FGModel
107 FGMassBalance(FGFDMExec*);
110 bool Load(Element* el);
111 bool InitModel(void);
114 inline double GetMass(void) const {return Mass;}
115 inline double GetWeight(void) const {return Weight;}
116 inline FGColumnVector3& GetXYZcg(void) {return vXYZcg;}
117 inline double GetXYZcg(int axis) const {return vXYZcg(axis);}
119 /** Computes the inertia contribution of a pointmass.
120 Computes and returns the inertia matrix of a pointmass of mass
121 slugs at the given vector r in the structural frame. The units
122 should be for the mass in slug and the vector in the structural
123 frame as usual in inches.
124 @param slugs the mass of this single pointmass given in slugs
125 @param r the location of this single pointmass in the structural frame
127 FGMatrix33 GetPointmassInertia(double slugs, const FGColumnVector3& r) const
129 FGColumnVector3 v = StructuralToBody( r );
130 FGColumnVector3 sv = slugs*v;
131 double xx = sv(1)*v(1);
132 double yy = sv(2)*v(2);
133 double zz = sv(3)*v(3);
134 double xy = -sv(1)*v(2);
135 double xz = -sv(1)*v(3);
136 double yz = -sv(2)*v(3);
137 return FGMatrix33( yy+zz, xy, xz,
142 /** Conversion from the structural frame to the body frame.
143 Converts the location given in the structural frame
144 coordinate system to the body frame. The units of the structural
145 frame are assumed to be in inches. The unit of the result is in
147 @param r vector coordinate in the structural reference frame (X positive
148 aft, measurements in inches).
149 @return vector coordinate in the body frame, in feet.
151 FGColumnVector3 StructuralToBody(const FGColumnVector3& r) const;
153 inline void SetEmptyWeight(double EW) { EmptyWeight = EW;}
154 inline void SetBaseCG(const FGColumnVector3& CG) {vbaseXYZcg = vXYZcg = CG;}
156 void AddPointMass(Element* el);
157 double GetTotalPointMassWeight(void);
159 FGColumnVector3& GetPointMassMoment(void);
160 FGMatrix33& GetJ(void) {return mJ;}
161 FGMatrix33& GetJinv(void) {return mJinv;}
162 void SetAircraftBaseInertias(FGMatrix33 BaseJ) {baseJ = BaseJ;}
172 FGColumnVector3 vXYZcg;
173 FGColumnVector3 vXYZtank;
174 FGColumnVector3 vbaseXYZcg;
175 FGColumnVector3 vPMxyz;
176 FGColumnVector3 PointMassCG;
177 FGMatrix33& CalculatePMInertias(void);
181 PointMass(double w, FGColumnVector3& vXYZ) {
185 FGColumnVector3 Location;
187 double GetPointMassLocation(int axis) const {return Location(axis);}
188 void SetPointMassLocation(int axis, double value) {Location(axis) = value;}
189 void SetPointMassWeight(double wt) {Weight = wt;}
190 double GetPointMassWeight(void) const {return Weight;}
192 void bind(FGPropertyManager* PropertyManager, int num) {
193 snprintf(tmp, 80, "inertia/pointmass-weight-lbs[%u]", num);
194 PropertyManager->Tie( tmp, this, &PointMass::GetPointMassWeight,
195 &PointMass::SetPointMassWeight);
197 snprintf(tmp, 80, "inertia/pointmass-location-X-inches[%u]", num);
198 PropertyManager->Tie( tmp, this, eX, &PointMass::GetPointMassLocation,
199 &PointMass::SetPointMassLocation);
200 snprintf(tmp, 80, "inertia/pointmass-location-Y-inches[%u]", num);
201 PropertyManager->Tie( tmp, this, eY, &PointMass::GetPointMassLocation,
202 &PointMass::SetPointMassLocation);
203 snprintf(tmp, 80, "inertia/pointmass-location-Z-inches[%u]", num);
204 PropertyManager->Tie( tmp, this, eZ, &PointMass::GetPointMassLocation,
205 &PointMass::SetPointMassLocation);
209 vector <struct PointMass*> PointMasses;
212 void Debug(int from);
215 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%