#include "math/FGColumnVector3.h"
#include "input_output/FGXMLElement.h"
-#define ID_GROUNDREACTIONS "$Id: FGGroundReactions.h,v 1.18 2010/09/07 00:40:03 jberndt Exp $"
+#define ID_GROUNDREACTIONS "$Id: FGGroundReactions.h,v 1.24 2011/08/21 15:13:22 bcoconni Exp $"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FORWARD DECLARATIONS
CLASS DECLARATION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-class MultiplierIterator
-{
-public:
- MultiplierIterator(FGGroundReactions* GndReactions);
- MultiplierIterator& operator++();
- FGPropagate::LagrangeMultiplier* operator*() { return multiplier; }
-private:
- FGGroundReactions* GroundReactions;
- FGPropagate::LagrangeMultiplier* multiplier;
- int gearNum;
- int entry;
-};
-
class FGGroundReactions : public FGModel
{
public:
~FGGroundReactions(void);
bool InitModel(void);
- bool Run(void);
+ /** Runs the Ground Reactions model; called by the Executive
+ Can pass in a value indicating if the executive is directing the simulation to Hold.
+ @param Holding if true, the executive has been directed to hold the sim from
+ advancing time. Some models may ignore this flag, such as the Input
+ model, which may need to be active to listen on a socket for the
+ "Resume" command to be given.
+ @return false if no error */
+ bool Run(bool Holding);
bool Load(Element* el);
- FGColumnVector3& GetForces(void) {return vForces;}
+ const FGColumnVector3& GetForces(void) const {return vForces;}
double GetForces(int idx) const {return vForces(idx);}
- FGColumnVector3& GetMoments(void) {return vMoments;}
+ const FGColumnVector3& GetMoments(void) const {return vMoments;}
double GetMoments(int idx) const {return vMoments(idx);}
- string GetGroundReactionStrings(string delimeter);
- string GetGroundReactionValues(string delimeter);
+ string GetGroundReactionStrings(string delimeter) const;
+ string GetGroundReactionValues(string delimeter) const;
bool GetWOW(void) const;
- void UpdateForcesAndMoments(void);
int GetNumGearUnits(void) const { return (int)lGear.size(); }
/** Gets a gear instance
@param gear index of gear instance
@return a pointer to the FGLGear instance of the gear unit requested */
- inline FGLGear* GetGearUnit(int gear) { return lGear[gear]; }
+ FGLGear* GetGearUnit(int gear) const { return lGear[gear]; }
+
+ void RegisterLagrangeMultiplier(LagrangeMultiplier* lmult) { multipliers.push_back(lmult); }
+ vector <LagrangeMultiplier*>* GetMultipliersList(void) { return &multipliers; }
+
+ FGLGear::Inputs in;
private:
vector <FGLGear*> lGear;
FGColumnVector3 vForces;
FGColumnVector3 vMoments;
+ vector <LagrangeMultiplier*> multipliers;
void bind(void);
void Debug(int from);