]> git.mxchange.org Git - flightgear.git/blobdiff - src/FDM/JSBSim/models/FGPropagate.h
Andreas Gaeb: fix #222 (JSBSIm reset problems)
[flightgear.git] / src / FDM / JSBSim / models / FGPropagate.h
index 2c0fef1d47394cd6481c5a7875e49623493b2d93..00de83c7f069e6747bad79c2210a7d30cfaba01f 100644 (file)
@@ -4,23 +4,23 @@
  Author:       Jon S. Berndt
  Date started: 1/5/99
 
- ------------- Copyright (C) 1999  Jon S. Berndt (jsb@hal-pc.org) -------------
+ ------------- Copyright (C) 1999  Jon S. Berndt (jon@jsbsim.org) -------------
 
  This program is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
+ the terms of the GNU Lesser General Public License as published by the Free Software
  Foundation; either version 2 of the License, or (at your option) any later
  version.
 
  This program is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+ FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
  details.
 
- You should have received a copy of the GNU General Public License along with
+ You should have received a copy of the GNU Lesser General Public License along with
  this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  Place - Suite 330, Boston, MA  02111-1307, USA.
 
- Further information about the GNU General Public License can also be found on
+ Further information about the GNU Lesser General Public License can also be found on
  the world wide web at http://www.gnu.org.
 
 HISTORY
@@ -38,17 +38,18 @@ SENTRY
 INCLUDES
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#include <models/FGModel.h>
-#include <math/FGColumnVector3.h>
-#include <initialization/FGInitialCondition.h>
-#include <math/FGLocation.h>
-#include <math/FGQuaternion.h>
+#include "models/FGModel.h"
+#include "math/FGColumnVector3.h"
+#include "math/FGLocation.h"
+#include "math/FGQuaternion.h"
+#include "math/FGMatrix33.h"
+#include <deque>
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 DEFINITIONS
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-#define ID_PROPAGATE "$Id$"
+#define ID_PROPAGATE "$Id: FGPropagate.h,v 1.53 2010/11/28 13:02:43 bcoconni Exp $"
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 FORWARD DECLARATIONS
@@ -56,96 +57,559 @@ FORWARD DECLARATIONS
 
 namespace JSBSim {
 
+using std::deque;
+class FGInitialCondition;
+
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS DOCUMENTATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-/** Models the EOM and integration/propagation of state
+/** Models the EOM and integration/propagation of state.
+    The Equations of Motion (EOM) for JSBSim are integrated to propagate the
+    state of the vehicle given the forces and moments that act on it. The
+    integration accounts for a rotating Earth.
+
+    The general execution of this model follows this process:
+
+    -Calculate the angular accelerations
+    -Calculate the translational accelerations
+    -Calculate the angular rate
+    -Calculate the translational velocity
+
+    -Integrate accelerations and rates
+
+    Integration of rotational and translation position and rate can be 
+    customized as needed or frozen by the selection of no integrator. The
+    selection of which integrator to use is done through the setting of 
+    the associated property. There are four properties which can be set:
+    
+    @code
+    simulation/integrator/rate/rotational
+    simulation/integrator/rate/translational
+    simulation/integrator/position/rotational
+    simulation/integrator/position/translational
+    @endcode
+    
+    Each of the integrators listed above can be set to one of the following values:
+
+    @code
+    0: No integrator (Freeze)
+    1: Rectangular Euler
+    2: Trapezoidal
+    3: Adams Bashforth 2
+    4: Adams Bashforth 3
+    5: Adams Bashforth 4
+    @endcode
+
     @author Jon S. Berndt, Mathias Froehlich
-    @version $Id$
+    @version $Id: FGPropagate.h,v 1.53 2010/11/28 13:02:43 bcoconni Exp $
   */
 
 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 CLASS DECLARATION
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
 
-// state vector
-
-struct VehicleState {
-  FGLocation vLocation;
-  FGColumnVector3 vUVW;
-  FGColumnVector3 vPQR;
-  FGQuaternion vQtrn;
-};
-
 class FGPropagate : public FGModel {
 public:
-  /** Constructor
+
+  /** The current vehicle state vector structure contains the translational and
+    angular position, and the translational and angular velocity. */
+  struct VehicleState {
+    /** Represents the current location of the vehicle in Earth centered Earth
+        fixed (ECEF) frame.
+        units ft */
+    FGLocation vLocation;
+
+    /** The velocity vector of the vehicle with respect to the ECEF frame,
+        expressed in the body system.
+        units ft/sec */
+    FGColumnVector3 vUVW;
+
+    /** The angular velocity vector for the vehicle relative to the ECEF frame,
+        expressed in the body frame.
+        units rad/sec */
+    FGColumnVector3 vPQR;
+
+    /** The angular velocity vector for the vehicle body frame relative to the
+        ECI frame, expressed in the body frame.
+        units rad/sec */
+    FGColumnVector3 vPQRi;
+
+    /** The angular velocity vector for the vehicle body frame relative to the
+        ECI frame, expressed in the ECI frame.
+        units rad/sec */
+    FGColumnVector3 vPQRi_i;
+
+    /** The current orientation of the vehicle, that is, the orientation of the
+        body frame relative to the local, NED frame. */
+    FGQuaternion qAttitudeLocal;
+
+    /** The current orientation of the vehicle, that is, the orientation of the
+        body frame relative to the inertial (ECI) frame. */
+    FGQuaternion qAttitudeECI;
+
+    FGColumnVector3 vInertialVelocity;
+
+    FGColumnVector3 vInertialPosition;
+
+    deque <FGColumnVector3> dqPQRidot;
+    deque <FGColumnVector3> dqUVWidot;
+    deque <FGColumnVector3> dqInertialVelocity;
+    deque <FGQuaternion>    dqQtrndot;
+  };
+
+  /** Constructor.
+      The constructor initializes several variables, and sets the initial set
+      of integrators to use as follows:
+      - integrator, rotational rate = Adams Bashforth 2
+      - integrator, translational rate = Adams Bashforth 2
+      - integrator, rotational position = Trapezoidal
+      - integrator, translational position = Trapezoidal
       @param Executive a pointer to the parent executive object */
   FGPropagate(FGFDMExec* Executive);
 
   /// Destructor
   ~FGPropagate();
+  
+  /// These define the indices use to select the various integrators.
+  enum eIntegrateType {eNone = 0, eRectEuler, eTrapezoidal, eAdamsBashforth2, eAdamsBashforth3, eAdamsBashforth4};
 
+  /// These define the indices use to select the gravitation models.
+  enum eGravType {gtStandard, gtWGS84}; 
+
+  /** Initializes the FGPropagate class after instantiation and prior to first execution.
+      The base class FGModel::InitModel is called first, initializing pointers to the 
+      other FGModel objects (and others).  */
   bool InitModel(void);
 
-  /** Runs the Propagate model; called by the Executive
+  /** Runs the Propagate model; called by the Executive.
       @return false if no error */
   bool Run(void);
 
+  const FGQuaternion& GetQuaterniondot(void) const {return vQtrndot;}
+
+  /** Retrieves the velocity vector.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the velocity in Local frame is organized (Vnorth, Veast, Vdown). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vVel(1) is Vnorth. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eNorth=1, eEast=2, eDown=3.
+      units ft/sec
+      @return The vehicle velocity vector with respect to the Earth centered frame,
+              expressed in Local horizontal frame.
+  */
   const FGColumnVector3& GetVel(void) const { return vVel; }
+  
+  /** Retrieves the body frame vehicle velocity vector.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the velocity in Body frame is organized (Vx, Vy, Vz). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vUVW(1) is Vx. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eX=1, eY=2, eZ=3.
+      units ft/sec
+      @return The body frame vehicle velocity vector in ft/sec.
+  */
   const FGColumnVector3& GetUVW(void) const { return VState.vUVW; }
+  
+  /** Retrieves the body axis acceleration.
+      Retrieves the computed body axis accelerations based on the
+      applied forces and accounting for a rotating body frame.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the acceleration in Body frame is organized (Ax, Ay, Az). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vUVWdot(1) is Ax. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eX=1, eY=2, eZ=3.
+      units ft/sec^2
+      @return Body axis translational acceleration in ft/sec^2.
+  */
   const FGColumnVector3& GetUVWdot(void) const { return vUVWdot; }
+  
+  /** Retrieves the body angular rates vector, relative to the ECEF frame.
+      Retrieves the body angular rates (p, q, r), which are calculated by integration
+      of the angular acceleration.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the angular velocity in Body frame is organized (P, Q, R). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vPQR(1) is P. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eP=1, eQ=2, eR=3.
+      units rad/sec
+      @return The body frame angular rates in rad/sec.
+  */
   const FGColumnVector3& GetPQR(void) const {return VState.vPQR;}
+  
+  /** Retrieves the body angular rates vector, relative to the ECI (inertial) frame.
+      Retrieves the body angular rates (p, q, r), which are calculated by integration
+      of the angular acceleration.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the angular velocity in Body frame is organized (P, Q, R). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vPQR(1) is P. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eP=1, eQ=2, eR=3.
+      units rad/sec
+      @return The body frame inertial angular rates in rad/sec.
+  */
+  const FGColumnVector3& GetPQRi(void) const {return VState.vPQRi;}
+
+  /** Retrieves the body axis angular acceleration vector.
+      Retrieves the body axis angular acceleration vector in rad/sec^2. The
+      angular acceleration vector is determined from the applied forces and
+      accounts for a rotating frame.
+      The vector returned is represented by an FGColumnVector reference. The vector
+      for the angular acceleration in Body frame is organized (Pdot, Qdot, Rdot). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, vPQRdot(1) is Pdot. Various convenience enumerators are defined
+      in FGJSBBase. The relevant enumerators for the vector returned by this call are,
+      eP=1, eQ=2, eR=3.
+      units rad/sec^2
+      @return The angular acceleration vector.
+  */
   const FGColumnVector3& GetPQRdot(void) const {return vPQRdot;}
-  const FGColumnVector3& GetEuler(void) const { return VState.vQtrn.GetEuler(); }
-
+  
+  /** Retrieves the Euler angles that define the vehicle orientation.
+      Extracts the Euler angles from the quaternion that stores the orientation
+      in the Local frame. The order of rotation used is Yaw-Pitch-Roll. The
+      vector returned is represented by an FGColumnVector reference. The vector
+      for the Euler angles is organized (Phi, Theta, Psi). The vector
+      is 1-based, so that the first element can be retrieved using the "()" operator.
+      In other words, the returned vector item with subscript (1) is Phi.
+      Various convenience enumerators are defined in FGJSBBase. The relevant
+      enumerators for the vector returned by this call are, ePhi=1, eTht=2, ePsi=3.
+      units radians
+      @return The Euler angle vector, where the first item in the
+              vector is the angle about the X axis, the second is the
+              angle about the Y axis, and the third item is the angle
+              about the Z axis (Phi, Theta, Psi).
+  */
+  const FGColumnVector3& GetEuler(void) const { return VState.qAttitudeLocal.GetEuler(); }
+
+  /** Retrieves a body frame velocity component.
+      Retrieves a body frame velocity component. The velocity returned is
+      extracted from the vUVW vector (an FGColumnVector). The vector for the
+      velocity in Body frame is organized (Vx, Vy, Vz). The vector is 1-based.
+      In other words, GetUVW(1) returns Vx. Various convenience enumerators
+      are defined in FGJSBBase. The relevant enumerators for the velocity
+      returned by this call are, eX=1, eY=2, eZ=3.
+      units ft/sec
+      @param idx the index of the velocity component desired (1-based).
+      @return The body frame velocity component.
+  */
   double GetUVW   (int idx) const { return VState.vUVW(idx); }
+
+  /** Retrieves a body frame acceleration component.
+      Retrieves a body frame acceleration component. The acceleration returned
+      is extracted from the vUVWdot vector (an FGColumnVector). The vector for
+      the acceleration in Body frame is organized (Ax, Ay, Az). The vector is
+      1-based. In other words, GetUVWdot(1) returns Ax. Various convenience
+      enumerators are defined in FGJSBBase. The relevant enumerators for the
+      acceleration returned by this call are, eX=1, eY=2, eZ=3.
+      units ft/sec^2
+      @param idx the index of the acceleration component desired (1-based).
+      @return The body frame acceleration component.
+  */
   double GetUVWdot(int idx) const { return vUVWdot(idx); }
+
+  /** Retrieves a Local frame velocity component.
+      Retrieves a Local frame velocity component. The velocity returned is
+      extracted from the vVel vector (an FGColumnVector). The vector for the
+      velocity in Local frame is organized (Vnorth, Veast, Vdown). The vector
+      is 1-based. In other words, GetVel(1) returns Vnorth. Various convenience
+      enumerators are defined in FGJSBBase. The relevant enumerators for the
+      velocity returned by this call are, eNorth=1, eEast=2, eDown=3.
+      units ft/sec
+      @param idx the index of the velocity component desired (1-based).
+      @return The body frame velocity component.
+  */
   double GetVel(int idx) const { return vVel(idx); }
-  double Geth(void)   const { return VState.vLocation.GetRadius() - SeaLevelRadius; }
+
+  /** Retrieves the total inertial velocity in ft/sec.
+  */
+  double GetInertialVelocityMagnitude(void) const { return VState.vInertialVelocity.Magnitude(); }
+
+  /** Retrieves the inertial velocity vector in ft/sec.
+  */
+  const FGColumnVector3& GetInertialVelocity(void) const { return VState.vInertialVelocity; }
+
+  /** Retrieves the inertial position vector.
+  */
+  const FGColumnVector3& GetInertialPosition(void) const { return VState.vInertialPosition; }
+
+  /** Returns the current altitude above sea level.
+      This function returns the altitude above sea level.
+      units ft
+      @return The current altitude above sea level in feet.
+  */
+  double GetAltitudeASL(void)   const { return VState.vLocation.GetRadius() - SeaLevelRadius; }
+
+  /** Returns the current altitude above sea level.
+      This function returns the altitude above sea level.
+      units meters
+      @return The current altitude above sea level in meters.
+  */
+  double GetAltitudeASLmeters(void) const { return GetAltitudeASL()*fttom;}
+
+  /** Retrieves a body frame angular velocity component relative to the ECEF frame.
+      Retrieves a body frame angular velocity component. The angular velocity
+      returned is extracted from the vPQR vector (an FGColumnVector). The vector
+      for the angular velocity in Body frame is organized (P, Q, R). The vector
+      is 1-based. In other words, GetPQR(1) returns P (roll rate). Various
+      convenience enumerators are defined in FGJSBBase. The relevant enumerators
+      for the angular velocity returned by this call are, eP=1, eQ=2, eR=3.
+      units rad/sec
+      @param axis the index of the angular velocity component desired (1-based).
+      @return The body frame angular velocity component.
+  */
   double GetPQR(int axis) const {return VState.vPQR(axis);}
-  double GetPQRdot(int idx) const {return vPQRdot(idx);}
-  double GetEuler(int axis) const { return VState.vQtrn.GetEuler(axis); }
-  double GetCosEuler(int idx) const { return VState.vQtrn.GetCosEuler(idx); }
-  double GetSinEuler(int idx) const { return VState.vQtrn.GetSinEuler(idx); }
+
+  /** Retrieves a body frame angular velocity component relative to the ECI (inertial) frame.
+      Retrieves a body frame angular velocity component. The angular velocity
+      returned is extracted from the vPQR vector (an FGColumnVector). The vector
+      for the angular velocity in Body frame is organized (P, Q, R). The vector
+      is 1-based. In other words, GetPQR(1) returns P (roll rate). Various
+      convenience enumerators are defined in FGJSBBase. The relevant enumerators
+      for the angular velocity returned by this call are, eP=1, eQ=2, eR=3.
+      units rad/sec
+      @param axis the index of the angular velocity component desired (1-based).
+      @return The body frame angular velocity component.
+  */
+  double GetPQRi(int axis) const {return VState.vPQRi(axis);}
+
+  /** Retrieves a body frame angular acceleration component.
+      Retrieves a body frame angular acceleration component. The angular
+      acceleration returned is extracted from the vPQRdot vector (an
+      FGColumnVector). The vector for the angular acceleration in Body frame
+      is organized (Pdot, Qdot, Rdot). The vector is 1-based. In other words,
+      GetPQRdot(1) returns Pdot (roll acceleration). Various convenience
+      enumerators are defined in FGJSBBase. The relevant enumerators for the
+      angular acceleration returned by this call are, eP=1, eQ=2, eR=3.
+      units rad/sec^2
+      @param axis the index of the angular acceleration component desired (1-based).
+      @return The body frame angular acceleration component.
+  */
+  double GetPQRdot(int axis) const {return vPQRdot(axis);}
+
+  /** Retrieves a vehicle Euler angle component.
+      Retrieves an Euler angle (Phi, Theta, or Psi) from the quaternion that
+      stores the vehicle orientation relative to the Local frame. The order of
+      rotations used is Yaw-Pitch-Roll. The Euler angle with subscript (1) is
+      Phi. Various convenience enumerators are defined in FGJSBBase. The
+      relevant enumerators for the Euler angle returned by this call are,
+      ePhi=1, eTht=2, ePsi=3 (e.g. GetEuler(eTht) returns Theta).
+      units radians
+      @return An Euler angle.
+  */
+  double GetEuler(int axis) const { return VState.qAttitudeLocal.GetEuler(axis); }
+
+  /** Retrieves the cosine of a vehicle Euler angle component.
+      Retrieves the cosine of an Euler angle (Phi, Theta, or Psi) from the
+      quaternion that stores the vehicle orientation relative to the Local frame.
+      The order of rotations used is Yaw-Pitch-Roll. The Euler angle
+      with subscript (1) is Phi. Various convenience enumerators are defined in
+      FGJSBBase. The relevant enumerators for the Euler angle referred to in this
+      call are, ePhi=1, eTht=2, ePsi=3 (e.g. GetCosEuler(eTht) returns cos(theta)).
+      units none
+      @return The cosine of an Euler angle.
+  */
+  double GetCosEuler(int idx) const { return VState.qAttitudeLocal.GetCosEuler(idx); }
+
+  /** Retrieves the sine of a vehicle Euler angle component.
+      Retrieves the sine of an Euler angle (Phi, Theta, or Psi) from the
+      quaternion that stores the vehicle orientation relative to the Local frame.
+      The order of rotations used is Yaw-Pitch-Roll. The Euler angle
+      with subscript (1) is Phi. Various convenience enumerators are defined in
+      FGJSBBase. The relevant enumerators for the Euler angle referred to in this
+      call are, ePhi=1, eTht=2, ePsi=3 (e.g. GetSinEuler(eTht) returns sin(theta)).
+      units none
+      @return The sine of an Euler angle.
+  */
+  double GetSinEuler(int idx) const { return VState.qAttitudeLocal.GetSinEuler(idx); }
+
+  /** Returns the current altitude rate.
+      Returns the current altitude rate (rate of climb).
+      units ft/sec
+      @return The current rate of change in altitude.
+  */
   double Gethdot(void) const { return -vVel(eDown); }
 
-  /** Returns the "constant" RunwayRadius.
-      The RunwayRadius parameter is set by the calling application or set to
-      zero if JSBSim is running in standalone mode.
-      @return distance of the runway from the center of the earth.
-      @units feet */
-  double GetRunwayRadius(void) const;
+  /** Returns the "constant" LocalTerrainRadius.
+      The LocalTerrainRadius parameter is set by the calling application or set to
+      sea level + terrain elevation if JSBSim is running in standalone mode.
+      units feet
+      @return distance of the local terrain from the center of the earth.
+      */
+  double GetLocalTerrainRadius(void) const;
+
   double GetSeaLevelRadius(void) const { return SeaLevelRadius; }
+  double GetTerrainElevation(void) const;
   double GetDistanceAGL(void)  const;
-  double GetRadius(void) const { return VState.vLocation.GetRadius(); }
+  double GetRadius(void) const {
+      if (VState.vLocation.GetRadius() == 0) return 1.0;
+      else return VState.vLocation.GetRadius();
+  }
   double GetLongitude(void) const { return VState.vLocation.GetLongitude(); }
   double GetLatitude(void) const { return VState.vLocation.GetLatitude(); }
+
+  double GetGeodLatitudeRad(void) const { return VState.vLocation.GetGeodLatitudeRad(); }
+  double GetGeodLatitudeDeg(void) const { return VState.vLocation.GetGeodLatitudeDeg(); }
+
+  double GetGeodeticAltitude(void) const { return VState.vLocation.GetGeodAltitude(); }
+
+  double GetLongitudeDeg(void) const { return VState.vLocation.GetLongitudeDeg(); }
+  double GetLatitudeDeg(void) const { return VState.vLocation.GetLatitudeDeg(); }
   const FGLocation& GetLocation(void) const { return VState.vLocation; }
 
   /** Retrieves the local-to-body transformation matrix.
+      The quaternion class, being the means by which the orientation of the
+      vehicle is stored, manages the local-to-body transformation matrix.
       @return a reference to the local-to-body transformation matrix.  */
-  const FGMatrix33& GetTl2b(void) const { return VState.vQtrn.GetT(); }
+  const FGMatrix33& GetTl2b(void) const { return VState.qAttitudeLocal.GetT(); }
 
   /** Retrieves the body-to-local transformation matrix.
+      The quaternion class, being the means by which the orientation of the
+      vehicle is stored, manages the body-to-local transformation matrix.
       @return a reference to the body-to-local matrix.  */
-  const FGMatrix33& GetTb2l(void) const { return VState.vQtrn.GetTInv(); }
+  const FGMatrix33& GetTb2l(void) const { return VState.qAttitudeLocal.GetTInv(); }
+
+  /** Retrieves the ECEF-to-body transformation matrix.
+      @return a reference to the ECEF-to-body transformation matrix.  */
+  const FGMatrix33& GetTec2b(void) const { return Tec2b; }
+
+  /** Retrieves the body-to-ECEF transformation matrix.
+      @return a reference to the body-to-ECEF matrix.  */
+  const FGMatrix33& GetTb2ec(void) const { return Tb2ec; }
+
+  /** Retrieves the ECI-to-body transformation matrix.
+      @return a reference to the ECI-to-body transformation matrix.  */
+  const FGMatrix33& GetTi2b(void) const { return VState.qAttitudeECI.GetT(); }
+
+  /** Retrieves the body-to-ECI transformation matrix.
+      @return a reference to the body-to-ECI matrix.  */
+  const FGMatrix33& GetTb2i(void) const { return VState.qAttitudeECI.GetTInv(); }
+
+  /** Retrieves the ECEF-to-ECI transformation matrix.
+      @return a reference to the ECEF-to-ECI transformation matrix.  */
+  const FGMatrix33& GetTec2i(void);
+
+  /** Retrieves the ECI-to-ECEF transformation matrix.
+      @return a reference to the ECI-to-ECEF matrix.  */
+  const FGMatrix33& GetTi2ec(void);
+
+  /** Retrieves the ECEF-to-local transformation matrix.
+      Retrieves the ECEF-to-local transformation matrix. Note that the so-called
+      local from is also know as the NED frame (for North, East, Down).
+      @return a reference to the ECEF-to-local matrix.  */
+  const FGMatrix33& GetTec2l(void) const { return VState.vLocation.GetTec2l(); }
+
+  /** Retrieves the local-to-ECEF transformation matrix.
+      Retrieves the local-to-ECEF transformation matrix. Note that the so-called
+      local from is also know as the NED frame (for North, East, Down).
+      @return a reference to the local-to-ECEF matrix.  */
+  const FGMatrix33& GetTl2ec(void) const { return VState.vLocation.GetTl2ec(); }
+
+  /** Retrieves the local-to-inertial transformation matrix.
+      @return a reference to the local-to-inertial transformation matrix.  */
+  const FGMatrix33& GetTl2i(void)  { return VState.vLocation.GetTl2i(); }
+
+  /** Retrieves the inertial-to-local transformation matrix.
+      @return a reference to the inertial-to-local matrix.  */
+  const FGMatrix33& GetTi2l(void)  { return VState.vLocation.GetTi2l(); }
+
+  VehicleState* GetVState(void) { return &VState; }
+
+  void SetVState(VehicleState* vstate) {
+      VState.vLocation = vstate->vLocation;
+      UpdateLocationMatrices();
+      SetInertialOrientation(vstate->qAttitudeECI);
+      VehicleRadius = GetRadius();
+      VState.vUVW = vstate->vUVW;
+      vVel = GetTb2l() * VState.vUVW;
+      VState.vPQR = vstate->vPQR;
+      VState.vPQRi = VState.vPQR + Ti2b * vOmegaEarth;
+      VState.vInertialPosition = vstate->vInertialPosition;
+
+      InitializeDerivatives();
+  }
+
+  void InitializeDerivatives(void);
+
+  void SetInertialOrientation(FGQuaternion Qi);
+  void SetInertialVelocity(FGColumnVector3 Vi);
+  void SetInertialRates(FGColumnVector3 vRates);
+
+  const FGQuaternion GetQuaternion(void) const { return VState.qAttitudeLocal; }
+
+  void SetPQR(unsigned int i, double val) {
+      if ((i>=1) && (i<=3) )
+          VState.vPQR(i) = val;
+  }
+
+  void SetUVW(unsigned int i, double val) {
+      if ((i>=1) && (i<=3) )
+          VState.vUVW(i) = val;
+  }
 
 // SET functions
 
-  void SetLongitude(double lon) { VState.vLocation.SetLongitude(lon); }
-  void SetLatitude(double lat) { VState.vLocation.SetLatitude(lat); }
-  void SetRadius(double r) { VState.vLocation.SetRadius(r); }
-  void SetLocation(const FGLocation& l) { VState.vLocation = l; }
-  void Seth(double tt);
+  void SetLongitude(double lon) {
+      VState.vLocation.SetLongitude(lon);
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      UpdateLocationMatrices();
+  }
+  void SetLongitudeDeg(double lon) { SetLongitude(lon*degtorad); }
+  void SetLatitude(double lat) {
+      VState.vLocation.SetLatitude(lat);
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      UpdateLocationMatrices();
+  }
+  void SetLatitudeDeg(double lat) { SetLatitude(lat*degtorad); }
+  void SetRadius(double r) {
+      VState.vLocation.SetRadius(r);
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      UpdateLocationMatrices();
+  }
+  void SetAltitudeASL(double altASL);
+  void SetAltitudeASLmeters(double altASL) {SetAltitudeASL(altASL/fttom);}
   void SetSeaLevelRadius(double tt) { SeaLevelRadius = tt; }
+  void SetTerrainElevation(double tt);
   void SetDistanceAGL(double tt);
   void SetInitialState(const FGInitialCondition *);
-  void RecomputeRunwayRadius(void);
-
-  void bind(void);
-  void unbind(void);
+  void SetPosition(const double Lon, const double Lat, const double Radius) {
+      VState.vLocation.SetPosition(Lon, Lat, Radius);
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      VehicleRadius = GetRadius();
+      UpdateLocationMatrices();
+  }
+  void SetLocation(const FGLocation& l) {
+      VState.vLocation = l;
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      UpdateLocationMatrices();
+  }
+  void SetLocation(const FGColumnVector3& l) {
+      VState.vLocation = l;
+      VState.vInertialPosition = GetTec2i() * VState.vLocation;
+      UpdateLocationMatrices();
+  }
+
+  void RecomputeLocalTerrainRadius(void);
+
+  void NudgeBodyLocation(FGColumnVector3 deltaLoc) {
+    vDeltaXYZEC = GetTb2ec()*deltaLoc;
+    VState.vLocation -= vDeltaXYZEC;
+  }
+
+  struct LagrangeMultiplier {
+    FGColumnVector3 ForceJacobian;
+    FGColumnVector3 MomentJacobian;
+    double Min;
+    double Max;
+    double value;
+  };
+
+  void DumpState(void);
 
 private:
 
@@ -155,12 +619,72 @@ private:
 
   FGColumnVector3 vVel;
   FGColumnVector3 vPQRdot;
-  FGColumnVector3 vUVWdot;
-
-  double RunwayRadius, SeaLevelRadius;
+  FGColumnVector3 vPQRidot;
+  FGColumnVector3 vUVWdot, vUVWidot;
+  FGColumnVector3 vInertialVelocity;
+  FGColumnVector3 vLocation;
+  FGColumnVector3 vDeltaXYZEC;
+  FGColumnVector3 vGravAccel;
+  FGColumnVector3 vOmegaEarth;  // The Earth angular velocity vector
+  FGQuaternion vQtrndot;
+  FGMatrix33 Tec2b;
+  FGMatrix33 Tb2ec;
+  FGMatrix33 Tl2b;   // local to body frame matrix copy for immediate local use
+  FGMatrix33 Tb2l;   // body to local frame matrix copy for immediate local use
+  FGMatrix33 Tl2ec;  // local to ECEF matrix copy for immediate local use
+  FGMatrix33 Tec2l;  // ECEF to local frame matrix copy for immediate local use
+  FGMatrix33 Tec2i;  // ECEF to ECI frame matrix copy for immediate local use
+  FGMatrix33 Ti2ec;  // ECI to ECEF frame matrix copy for immediate local use
+  FGMatrix33 Ti2b;   // ECI to body frame rotation matrix
+  FGMatrix33 Tb2i;   // body to ECI frame rotation matrix
+  FGMatrix33 Ti2l;
+  FGMatrix33 Tl2i;
+  
+  double LocalTerrainRadius, SeaLevelRadius, VehicleRadius;
+  FGColumnVector3 LocalTerrainVelocity, LocalTerrainAngularVelocity;
+  eIntegrateType integrator_rotational_rate;
+  eIntegrateType integrator_translational_rate;
+  eIntegrateType integrator_rotational_position;
+  eIntegrateType integrator_translational_position;
+  int gravType;
+
+  void CalculatePQRdot(void);
+  void CalculateQuatdot(void);
+  void CalculateInertialVelocity(void);
+  void CalculateUVW(void);
+  void CalculateUVWdot(void);
+
+  void Integrate( FGColumnVector3& Integrand,
+                  FGColumnVector3& Val,
+                  deque <FGColumnVector3>& ValDot,
+                  double dt,
+                  eIntegrateType integration_type);
+
+  void Integrate( FGQuaternion& Integrand,
+                  FGQuaternion& Val,
+                  deque <FGQuaternion>& ValDot,
+                  double dt,
+                  eIntegrateType integration_type);
+
+  void EvaluateRateToResistTo(FGColumnVector3& vdot,
+                              const FGColumnVector3& Val,
+                              const FGColumnVector3& ValDot,
+                              const FGColumnVector3& LocalTerrainVal,
+                              deque <FGColumnVector3>& dqValDot,
+                              const double dt,
+                              const eIntegrateType integration_type);
+
+  void ResolveFrictionForces(double dt);
+
+  void UpdateLocationMatrices(void);
+  void UpdateBodyMatrices(void);
 
+  void bind(void);
   void Debug(int from);
 };
 }
 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+#include "initialization/FGInitialCondition.h"
+
 #endif