--------------------------------------------------------------------------------
09/12/2000 JSB Created
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-COMMENTS, REFERENCES, and NOTES
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
SENTRY
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "FGModel.h"
-#include "FGPropulsion.h"
+#include "FGColumnVector3.h"
+#include "FGMatrix33.h"
+#include <vector>
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+DEFINITIONS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#define ID_MASSBALANCE "$Id$"
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+FORWARD DECLARATIONSS
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+namespace JSBSim {
+
+/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+CLASS DOCUMENTATION
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
+
+/** Models weight and balance information.
+ */
+
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
bool Run(void);
- inline float GetMass(void) {return Mass;}
- inline float GetWeight(void) {return Weight;}
- inline float GetIxx(void) {return Ixx;}
- inline float GetIyy(void) {return Iyy;}
- inline float GetIzz(void) {return Izz;}
- inline float GetIxz(void) {return Ixz;}
- inline float GetIyz(void) {return Iyz;}
- inline FGColumnVector& GetXYZcg(void) {return vXYZcg;}
- inline float GetXYZcg(int axis) {return vXYZcg(axis);}
-
- inline void SetEmptyWeight(float EW) { EmptyWeight = EW;}
- inline void SetBaseIxx(float bixx) { baseIxx = bixx;}
- inline void SetBaseIyy(float biyy) { baseIyy = biyy;}
- inline void SetBaseIzz(float bizz) { baseIzz = bizz;}
- inline void SetBaseIxz(float bixz) { baseIxz = bixz;}
- inline void SetBaseIyz(float biyz) { baseIyz = biyz;}
- inline void SetBaseCG(const FGColumnVector& CG) {vbaseXYZcg = CG;}
+ inline double GetMass(void) const {return Mass;}
+ inline double GetWeight(void) const {return Weight;}
+ inline FGColumnVector3& GetXYZcg(void) {return vXYZcg;}
+ inline double GetXYZcg(int axis) const {return vXYZcg(axis);}
+
+ /** Computes the inertia contribution of a pointmass.
+ Computes and returns the inertia matrix of a pointmass of mass
+ slugs at the given vector r in the structural frame. The units
+ should be for the mass in slug and the vector in the structural
+ frame as usual in inches.
+ @param slugs the mass of this single pointmass given in slugs
+ @param r the location of this single pointmass in the structural frame
+ */
+ FGMatrix33 GetPointmassInertia(double slugs, const FGColumnVector3& r) const
+ {
+ FGColumnVector3 v = StructuralToBody( r );
+ FGColumnVector3 sv = slugs*v;
+ double xx = sv(1)*v(1);
+ double yy = sv(2)*v(2);
+ double zz = sv(3)*v(3);
+ double xy = -sv(1)*v(2);
+ double xz = -sv(1)*v(3);
+ double yz = -sv(2)*v(3);
+ return FGMatrix33( yy+zz, xy, xz,
+ xy, xx+zz, yz,
+ xz, yz, xx+yy );
+ }
+
+ /** Conversion from the structural frame to the body frame.
+ Converts the location given in the structural frame
+ coordinate system to the body frame. The units of the structural
+ frame are assumed to be in inches. The unit of the result is in
+ ft.
+ @param r vector coordinate in the structural reference frame (X positive
+ aft, measurements in inches).
+ @return vector coordinate in the body frame, in feet.
+ */
+ FGColumnVector3 StructuralToBody(const FGColumnVector3& r) const;
+
+ inline void SetEmptyWeight(double EW) { EmptyWeight = EW;}
+ inline void SetBaseCG(const FGColumnVector3& CG) {vbaseXYZcg = vXYZcg = CG;}
+
+ void AddPointMass(double weight, double X, double Y, double Z);
+ double GetPointMassWeight(void);
+ FGColumnVector3& GetPointMassMoment(void);
+ FGMatrix33& GetJ(void) {return mJ;}
+ FGMatrix33& GetJinv(void) {return mJinv;}
+ void SetAircraftBaseInertias(FGMatrix33 BaseJ) {baseJ = BaseJ;}
+
+ void bind(void);
+ void unbind(void);
private:
- float Weight;
- float EmptyWeight;
- float Mass;
- float Ixx;
- float Iyy;
- float Izz;
- float Ixz;
- float Iyz;
- float baseIxx;
- float baseIyy;
- float baseIzz;
- float baseIxz;
- float baseIyz;
- FGColumnVector vXYZcg;
- FGColumnVector vXYZtank;
- FGColumnVector vbaseXYZcg;
- void Debug(void);
+ double Weight;
+ double EmptyWeight;
+ double Mass;
+ FGMatrix33 mJ;
+ FGMatrix33 mJinv;
+ FGMatrix33 pmJ;
+ FGMatrix33 baseJ;
+ FGColumnVector3 vXYZcg;
+ FGColumnVector3 vXYZtank;
+ FGColumnVector3 vbaseXYZcg;
+ FGColumnVector3 vPMxyz;
+ vector <FGColumnVector3> PointMassLoc;
+ vector <double> PointMassWeight;
+ FGColumnVector3 PointMassCG;
+ FGMatrix33& CalculatePMInertias(void);
+
+ void Debug(int from);
};
-
+}
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#endif