]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/FGMatrix33.cpp
Make yasim accept the launchbar and hook properties. They are not tied to anything...
[flightgear.git] / src / FDM / JSBSim / FGMatrix33.cpp
index 830e99dddfb9c8715fa429b7f4f72715ca8e7f3d..0d42129f17c849d6ff8de3fd5ec2a0ebfefd5f76 100644 (file)
@@ -1,7 +1,7 @@
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 Module: FGMatrix33.cpp
-Author: Originally by Tony Peden [formatted here (and broken??) by JSB]
+Author: Tony Peden, Jon Berndt, Mathias Frolich
 Date started: 1998
 Purpose: FGMatrix33 class
 Called by: Various
@@ -21,6 +21,8 @@ INCLUDES
 #include "FGMatrix33.h"
 #include "FGColumnVector3.h"
 
+namespace JSBSim {
+
 static const char *IdSrc = "$Id$";
 static const char *IdHdr = ID_MATRIX33;
 
@@ -32,60 +34,22 @@ CLASS IMPLEMENTATION
 
 FGMatrix33::FGMatrix33(void)
 {
-  InitMatrix();
-  rowCtr = colCtr = 1;
-  
-  Debug(0);
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  data[0] = data[1] = data[2] = data[3] = data[4] = data[5] =
+    data[6] = data[7] = data[8] = 0.0;
 
-FGMatrix33::FGMatrix33(int r, int c)
-{
-  InitMatrix();
-  rowCtr = colCtr = 1;
-  
   Debug(0);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33::FGMatrix33(const FGMatrix33& M)
-{
-  rowCtr = colCtr = 1;
-
-  data[1][1] = M.data[1][1];
-  data[1][2] = M.data[1][2];
-  data[1][3] = M.data[1][3];
-  data[2][1] = M.data[2][1];
-  data[2][2] = M.data[2][2];
-  data[2][3] = M.data[2][3];
-  data[3][1] = M.data[3][1];
-  data[3][2] = M.data[3][2];
-  data[3][3] = M.data[3][3];
-
-  Debug(0);
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-FGMatrix33::~FGMatrix33(void)
-{
-  rowCtr = colCtr = 1;
-
-  Debug(1);
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 ostream& operator<<(ostream& os, const FGMatrix33& M)
 {
   for (unsigned int i=1; i<=M.Rows(); i++) {
     for (unsigned int j=1; j<=M.Cols(); j++) {
       if (i == M.Rows() && j == M.Cols())
-        os << M.data[i][j];
+        os << M(i,j);
       else
-        os << M.data[i][j] << ", ";
+        os << M(i,j) << ", ";
     }
   }
   return os;
@@ -93,24 +57,11 @@ ostream& operator<<(ostream& os, const FGMatrix33& M)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33& FGMatrix33::operator<<(const double ff)
-{
-  data[rowCtr][colCtr] = ff;
-  if (++colCtr > Cols()) {
-    colCtr = 1;
-    if (++rowCtr > Rows())
-      rowCtr = 1;
-  }
-  return *this;
-}
-
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
 istream& operator>>(istream& is, FGMatrix33& M)
 {
   for (unsigned int i=1; i<=M.Rows(); i++) {
     for (unsigned int j=1; j<=M.Cols(); j++) {
-      is >> M.data[i][j];
+      is >> M(i,j);
     }
   }
   return is;
@@ -118,255 +69,247 @@ istream& operator>>(istream& is, FGMatrix33& M)
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33& FGMatrix33::operator=(const FGMatrix33& M)
-{
-  if (&M != this) {
-    data[1][1] = M.data[1][1];
-    data[1][2] = M.data[1][2];
-    data[1][3] = M.data[1][3];
-    data[2][1] = M.data[2][1];
-    data[2][2] = M.data[2][2];
-    data[2][3] = M.data[2][3];
-    data[3][1] = M.data[3][1];
-    data[3][2] = M.data[3][2];
-    data[3][3] = M.data[3][3];
-  }
-  return *this;
+double FGMatrix33::Determinant(void) const {
+  return Entry(1,1)*Entry(2,2)*Entry(3,3) + Entry(1,2)*Entry(2,3)*Entry(3,1)
+    + Entry(1,3)*Entry(2,1)*Entry(3,2) - Entry(1,3)*Entry(2,2)*Entry(3,1)
+    - Entry(1,2)*Entry(2,1)*Entry(3,3) - Entry(2,3)*Entry(3,2)*Entry(1,1);
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::InitMatrix(double value)
-{
-  if (data) {
-    data[1][1] = value;
-    data[1][2] = value;
-    data[1][3] = value;
-    data[2][1] = value;
-    data[2][2] = value;
-    data[2][3] = value;
-    data[3][1] = value;
-    data[3][2] = value;
-    data[3][3] = value;
-  }
+FGMatrix33 FGMatrix33::Inverse(void) const {
+  // Compute the inverse of a general matrix using Cramers rule.
+  // I guess googling for cramers rule gives tons of references
+  // for this. :)
+  double rdet = 1.0/Determinant();
+
+  double i11 = rdet*(Entry(2,2)*Entry(3,3)-Entry(2,3)*Entry(3,2));
+  double i21 = rdet*(Entry(2,3)*Entry(3,1)-Entry(2,1)*Entry(3,3));
+  double i31 = rdet*(Entry(2,1)*Entry(3,2)-Entry(2,2)*Entry(3,1));
+  double i12 = rdet*(Entry(1,3)*Entry(3,2)-Entry(1,2)*Entry(3,3));
+  double i22 = rdet*(Entry(1,1)*Entry(3,3)-Entry(1,3)*Entry(3,1));
+  double i32 = rdet*(Entry(1,2)*Entry(3,1)-Entry(1,1)*Entry(3,2));
+  double i13 = rdet*(Entry(1,2)*Entry(2,3)-Entry(1,3)*Entry(2,2));
+  double i23 = rdet*(Entry(1,3)*Entry(2,1)-Entry(1,1)*Entry(2,3));
+  double i33 = rdet*(Entry(1,1)*Entry(2,2)-Entry(1,2)*Entry(2,1));
+
+  return FGMatrix33( i11, i12, i13,
+                     i21, i22, i23,
+                     i31, i32, i33 );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 void FGMatrix33::InitMatrix(void)
 {
-  this->InitMatrix(0);
+  data[0] = data[1] = data[2] = data[3] = data[4] = data[5] =
+    data[6] = data[7] = data[8] = 0.0;
 }
 
 // *****************************************************************************
 // binary operators ************************************************************
 // *****************************************************************************
 
-FGMatrix33 FGMatrix33::operator-(const FGMatrix33& M)
+FGMatrix33 FGMatrix33::operator-(const FGMatrix33& M) const
 {
-  FGMatrix33 Diff;
-
-  Diff(1,1) = data[1][1] - M(1,1);
-  Diff(1,2) = data[1][2] - M(1,2);
-  Diff(1,3) = data[1][3] - M(1,3);
-  Diff(2,1) = data[2][1] - M(2,1);
-  Diff(2,2) = data[2][2] - M(2,2);
-  Diff(2,3) = data[2][3] - M(2,3);
-  Diff(3,1) = data[3][1] - M(3,1);
-  Diff(3,2) = data[3][2] - M(3,2);
-  Diff(3,3) = data[3][3] - M(3,3);
-
-  return Diff;
+  return FGMatrix33( Entry(1,1) - M(1,1),
+                     Entry(1,2) - M(1,2),
+                     Entry(1,3) - M(1,3),
+                     Entry(2,1) - M(2,1),
+                     Entry(2,2) - M(2,2),
+                     Entry(2,3) - M(2,3),
+                     Entry(3,1) - M(3,1),
+                     Entry(3,2) - M(3,2),
+                     Entry(3,3) - M(3,3) );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::operator-=(const FGMatrix33 &M)
+FGMatrix33& FGMatrix33::operator-=(const FGMatrix33 &M)
 {
-  data[1][1] -= M(1,1);
-  data[1][2] -= M(1,2);
-  data[1][3] -= M(1,3);
-  data[2][1] -= M(2,1);
-  data[2][2] -= M(2,2);
-  data[2][3] -= M(2,3);
-  data[3][1] -= M(3,1);
-  data[3][2] -= M(3,2);
-  data[3][3] -= M(3,3);
+  data[0] -= M.data[0];
+  data[1] -= M.data[1];
+  data[2] -= M.data[2];
+  data[3] -= M.data[3];
+  data[4] -= M.data[4];
+  data[5] -= M.data[5];
+  data[6] -= M.data[6];
+  data[7] -= M.data[7];
+  data[8] -= M.data[8];
+
+  return *this;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33 FGMatrix33::operator+(const FGMatrix33& M)
+FGMatrix33 FGMatrix33::operator+(const FGMatrix33& M) const
 {
-  FGMatrix33 Sum;
-
-  Sum(1,1) = data[1][1] + M(1,1);
-  Sum(1,2) = data[1][2] + M(1,2);
-  Sum(1,3) = data[1][3] + M(1,3);
-  Sum(2,1) = data[2][1] + M(2,1);
-  Sum(2,2) = data[2][2] + M(2,2);
-  Sum(2,3) = data[2][3] + M(2,3);
-  Sum(3,1) = data[3][1] + M(3,1);
-  Sum(3,2) = data[3][2] + M(3,2);
-  Sum(3,3) = data[3][3] + M(3,3);
-
-  return Sum;
+  return FGMatrix33( Entry(1,1) + M(1,1),
+                     Entry(1,2) + M(1,2),
+                     Entry(1,3) + M(1,3),
+                     Entry(2,1) + M(2,1),
+                     Entry(2,2) + M(2,2),
+                     Entry(2,3) + M(2,3),
+                     Entry(3,1) + M(3,1),
+                     Entry(3,2) + M(3,2),
+                     Entry(3,3) + M(3,3) );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::operator+=(const FGMatrix33 &M)
+FGMatrix33& FGMatrix33::operator+=(const FGMatrix33 &M)
 {
-  data[1][1] += M(1,1);
-  data[1][2] += M(1,2);
-  data[1][3] += M(1,3);
-  data[2][1] += M(2,1);
-  data[2][2] += M(2,2);
-  data[2][3] += M(2,3);
-  data[3][1] += M(3,1);
-  data[3][2] += M(3,2);
-  data[3][3] += M(3,3);
+  Entry(1,1) += M(1,1);
+  Entry(1,2) += M(1,2);
+  Entry(1,3) += M(1,3);
+  Entry(2,1) += M(2,1);
+  Entry(2,2) += M(2,2);
+  Entry(2,3) += M(2,3);
+  Entry(3,1) += M(3,1);
+  Entry(3,2) += M(3,2);
+  Entry(3,3) += M(3,3);
+
+  return *this;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33 FGMatrix33::operator*(const double scalar)
+FGMatrix33 FGMatrix33::operator*(const double scalar) const
 {
-  FGMatrix33 Product;
-  
-  Product(1,1) = data[1][1] * scalar;
-  Product(1,2) = data[1][2] * scalar;
-  Product(1,3) = data[1][3] * scalar;
-  Product(2,1) = data[2][1] * scalar;
-  Product(2,2) = data[2][2] * scalar;
-  Product(2,3) = data[2][3] * scalar;
-  Product(3,1) = data[3][1] * scalar;
-  Product(3,2) = data[3][2] * scalar;
-  Product(3,3) = data[3][3] * scalar;
-
-  return Product;
+  return FGMatrix33( scalar * Entry(1,1),
+                     scalar * Entry(1,2),
+                     scalar * Entry(1,3),
+                     scalar * Entry(2,1),
+                     scalar * Entry(2,2),
+                     scalar * Entry(2,3),
+                     scalar * Entry(3,1),
+                     scalar * Entry(3,2),
+                     scalar * Entry(3,3) );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 FGMatrix33 operator*(double scalar, FGMatrix33 &M)
 {
-  FGMatrix33 Product;
-  
-  Product(1,1) = M(1,1) * scalar;
-  Product(1,2) = M(1,2) * scalar;
-  Product(1,3) = M(1,3) * scalar;
-  Product(2,1) = M(2,1) * scalar;
-  Product(2,2) = M(2,2) * scalar;
-  Product(2,3) = M(2,3) * scalar;
-  Product(3,1) = M(3,1) * scalar;
-  Product(3,2) = M(3,2) * scalar;
-  Product(3,3) = M(3,3) * scalar;
-
-  return Product;
+  return FGMatrix33( scalar * M(1,1),
+                     scalar * M(1,2),
+                     scalar * M(1,3),
+                     scalar * M(2,1),
+                     scalar * M(2,2),
+                     scalar * M(2,3),
+                     scalar * M(3,1),
+                     scalar * M(3,2),
+                     scalar * M(3,3) );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::operator*=(const double scalar)
+FGMatrix33& FGMatrix33::operator*=(const double scalar)
 {
-  data[1][1] *= scalar;
-  data[1][2] *= scalar;
-  data[1][3] *= scalar;
-  data[2][1] *= scalar;
-  data[2][2] *= scalar;
-  data[2][3] *= scalar;
-  data[3][1] *= scalar;
-  data[3][2] *= scalar;
-  data[3][3] *= scalar;
+  Entry(1,1) *= scalar;
+  Entry(1,2) *= scalar;
+  Entry(1,3) *= scalar;
+  Entry(2,1) *= scalar;
+  Entry(2,2) *= scalar;
+  Entry(2,3) *= scalar;
+  Entry(3,1) *= scalar;
+  Entry(3,2) *= scalar;
+  Entry(3,3) *= scalar;
+
+  return *this;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33 FGMatrix33::operator*(const FGMatrix33& M)
+FGMatrix33 FGMatrix33::operator*(const FGMatrix33& M) const
 {
+  // FIXME: Make compiler friendlier
   FGMatrix33 Product;
-  
-  Product(1,1) = data[1][1]*M(1,1) + data[1][2]*M(2,1) + data[1][3]*M(3,1);
-  Product(1,2) = data[1][1]*M(1,2) + data[1][2]*M(2,2) + data[1][3]*M(3,2);
-  Product(1,3) = data[1][1]*M(1,3) + data[1][2]*M(2,3) + data[1][3]*M(3,3);
-  Product(2,1) = data[2][1]*M(1,1) + data[2][2]*M(2,1) + data[2][3]*M(3,1);
-  Product(2,2) = data[2][1]*M(1,2) + data[2][2]*M(2,2) + data[2][3]*M(3,2);
-  Product(2,3) = data[2][1]*M(1,3) + data[2][2]*M(2,3) + data[2][3]*M(3,3);
-  Product(3,1) = data[3][1]*M(1,1) + data[3][2]*M(2,1) + data[3][3]*M(3,1);
-  Product(3,2) = data[3][1]*M(1,2) + data[3][2]*M(2,2) + data[3][3]*M(3,2);
-  Product(3,3) = data[3][1]*M(1,3) + data[3][2]*M(2,3) + data[3][3]*M(3,3);
-  
+
+  Product(1,1) = Entry(1,1)*M(1,1) + Entry(1,2)*M(2,1) + Entry(1,3)*M(3,1);
+  Product(1,2) = Entry(1,1)*M(1,2) + Entry(1,2)*M(2,2) + Entry(1,3)*M(3,2);
+  Product(1,3) = Entry(1,1)*M(1,3) + Entry(1,2)*M(2,3) + Entry(1,3)*M(3,3);
+  Product(2,1) = Entry(2,1)*M(1,1) + Entry(2,2)*M(2,1) + Entry(2,3)*M(3,1);
+  Product(2,2) = Entry(2,1)*M(1,2) + Entry(2,2)*M(2,2) + Entry(2,3)*M(3,2);
+  Product(2,3) = Entry(2,1)*M(1,3) + Entry(2,2)*M(2,3) + Entry(2,3)*M(3,3);
+  Product(3,1) = Entry(3,1)*M(1,1) + Entry(3,2)*M(2,1) + Entry(3,3)*M(3,1);
+  Product(3,2) = Entry(3,1)*M(1,2) + Entry(3,2)*M(2,2) + Entry(3,3)*M(3,2);
+  Product(3,3) = Entry(3,1)*M(1,3) + Entry(3,2)*M(2,3) + Entry(3,3)*M(3,3);
+
   return Product;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::operator*=(const FGMatrix33& M)
+FGMatrix33& FGMatrix33::operator*=(const FGMatrix33& M)
 {
+  // FIXME: Make compiler friendlier
   double a,b,c;
-  
-  a = data[1][1]; b=data[1][2]; c=data[1][3];
-  data[1][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
-  data[1][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
-  data[1][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
-  
-  a = data[2][1]; b=data[2][2]; c=data[2][3];
-  data[2][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
-  data[2][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
-  data[2][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
-  a = data[3][1]; b=data[3][2]; c=data[3][3];
-  data[3][1] = a*M(1,1) + b*M(2,1) + c*M(3,1);
-  data[3][2] = a*M(1,2) + b*M(2,2) + c*M(3,2);
-  data[3][3] = a*M(1,3) + b*M(2,3) + c*M(3,3);
+
+  a = Entry(1,1); b=Entry(1,2); c=Entry(1,3);
+  Entry(1,1) = a*M(1,1) + b*M(2,1) + c*M(3,1);
+  Entry(1,2) = a*M(1,2) + b*M(2,2) + c*M(3,2);
+  Entry(1,3) = a*M(1,3) + b*M(2,3) + c*M(3,3);
+
+  a = Entry(2,1); b=Entry(2,2); c=Entry(2,3);
+  Entry(2,1) = a*M(1,1) + b*M(2,1) + c*M(3,1);
+  Entry(2,2) = a*M(1,2) + b*M(2,2) + c*M(3,2);
+  Entry(2,3) = a*M(1,3) + b*M(2,3) + c*M(3,3);
+
+  a = Entry(3,1); b=Entry(3,2); c=Entry(3,3);
+  Entry(3,1) = a*M(1,1) + b*M(2,1) + c*M(3,1);
+  Entry(3,2) = a*M(1,2) + b*M(2,2) + c*M(3,2);
+  Entry(3,3) = a*M(1,3) + b*M(2,3) + c*M(3,3);
+
+  return *this;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGMatrix33 FGMatrix33::operator/(const double scalar)
+FGMatrix33 FGMatrix33::operator/(const double scalar) const
 {
   FGMatrix33 Quot;
-  
+
   if ( scalar != 0 ) {
-         double tmp = 1.0/scalar;
-    Quot(1,1) = data[1][1] * tmp;
-    Quot(1,2) = data[1][2] * tmp;
-    Quot(1,3) = data[1][3] * tmp;
-    Quot(2,1) = data[2][1] * tmp;
-    Quot(2,2) = data[2][2] * tmp;
-    Quot(2,3) = data[2][3] * tmp;
-    Quot(3,1) = data[3][1] * tmp;
-    Quot(3,2) = data[3][2] * tmp;
-    Quot(3,3) = data[3][3] * tmp;
+    double tmp = 1.0/scalar;
+    Quot(1,1) = Entry(1,1) * tmp;
+    Quot(1,2) = Entry(1,2) * tmp;
+    Quot(1,3) = Entry(1,3) * tmp;
+    Quot(2,1) = Entry(2,1) * tmp;
+    Quot(2,2) = Entry(2,2) * tmp;
+    Quot(2,3) = Entry(2,3) * tmp;
+    Quot(3,1) = Entry(3,1) * tmp;
+    Quot(3,2) = Entry(3,2) * tmp;
+    Quot(3,3) = Entry(3,3) * tmp;
   } else {
     MatrixException mE;
     mE.Message = "Attempt to divide by zero in method FGMatrix33::operator/(const double scalar)";
     throw mE;
   }
-  return Quot;  
+  return Quot;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-void FGMatrix33::operator/=(const double scalar)
+FGMatrix33& FGMatrix33::operator/=(const double scalar)
 {
   if ( scalar != 0 ) {
     double tmp = 1.0/scalar;
-    data[1][1] *= tmp;
-    data[1][2] *= tmp;
-    data[1][3] *= tmp;
-    data[2][1] *= tmp;
-    data[2][2] *= tmp;
-    data[2][3] *= tmp;
-    data[3][1] *= tmp;
-    data[3][2] *= tmp;
-    data[3][3] *= tmp;
+    Entry(1,1) *= tmp;
+    Entry(1,2) *= tmp;
+    Entry(1,3) *= tmp;
+    Entry(2,1) *= tmp;
+    Entry(2,2) *= tmp;
+    Entry(2,3) *= tmp;
+    Entry(3,1) *= tmp;
+    Entry(3,2) *= tmp;
+    Entry(3,3) *= tmp;
   } else {
     MatrixException mE;
     mE.Message = "Attempt to divide by zero in method FGMatrix33::operator/=(const double scalar)";
     throw mE;
   }
+  return *this;
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -375,24 +318,29 @@ void FGMatrix33::T(void)
 {
   for (unsigned int i=1; i<=3; i++) {
     for (unsigned int j=i+1; j<=3; j++) {
-      double tmp = data[i][j];
-      data[i][j] = data[j][i];
-      data[j][i] = tmp;
+      double tmp = Entry(i,j);
+      Entry(i,j) = Entry(j,i);
+      Entry(j,i) = tmp;
     }
   }
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-FGColumnVector3 FGMatrix33::operator*(const FGColumnVector3& Col)
-{
-  FGColumnVector3 Product;
+FGColumnVector3 FGMatrix33::operator*(const FGColumnVector3& v) const {
+  double tmp1 = v(1)*Entry(1,1);
+  double tmp2 = v(1)*Entry(2,1);
+  double tmp3 = v(1)*Entry(3,1);
 
-  Product(1) = data[1][1]*Col(1) + data[1][2]*Col(2) + data[1][3]*Col(3);
-  Product(2) = data[2][1]*Col(1) + data[2][2]*Col(2) + data[2][3]*Col(3);
-  Product(3) = data[3][1]*Col(1) + data[3][2]*Col(2) + data[3][3]*Col(3);
+  tmp1 += v(2)*Entry(1,2);
+  tmp2 += v(2)*Entry(2,2);
+  tmp3 += v(2)*Entry(3,2);
 
-  return Product;
+  tmp1 += v(3)*Entry(1,3);
+  tmp2 += v(3)*Entry(2,3);
+  tmp3 += v(3)*Entry(3,3);
+
+  return FGColumnVector3( tmp1, tmp2, tmp3 );
 }
 
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -440,4 +388,4 @@ void FGMatrix33::Debug(int from)
     }
   }
 }
-
+}