00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef SIMPLESOLVER_H
00010 #define SIMPLESOLVER_H
00011
00012 #include <animal/odeSolver.h>
00013 #include <animal/value.h>
00014
00015 namespace animal {
00016
00017
00037 template<
00038 class t_Positions,
00039 class t_Vector,
00040 class t_InvMasses,
00041 class t_Real>
00042 class SimpleSolver : public OdeSolver<t_Positions,t_Vector,t_Real>
00043 {
00044 public:
00046 SimpleSolver();
00047 virtual ~SimpleSolver();
00048
00049 typedef t_Positions Positions;
00050 typedef t_Vector Vector;
00051 typedef typename container_traits<Vector>::value_type Vec;
00052 typedef t_InvMasses InvMasses;
00053 typedef typename container_traits<InvMasses>::value_type InvMass;
00054 typedef t_Real Real;
00055
00056
00061 virtual void computeAccelerations( Vector& acc, const Positions& pos, const Vector& vel );
00066 virtual void applyForces( Vector& acc, const Vector& forces );
00068 void solveODE( Positions& p, Vector& v, Real dt );
00070 virtual void computeForces( Vector& acc, const Positions& pos, const Vector& vel );
00071
00072
00076 virtual void set_gravity( const Vec& _newVal);
00078 virtual const Vec& get_gravity();
00080 virtual void set_useGravity( const bool& _newVal);
00082 virtual const bool& get_useGravity();
00084 void applyGravity( Vector& a );
00090 virtual void set_useExponentialDamping( const bool& _newVal);
00092 virtual const bool& get_useExponentialDamping();
00094 virtual void set_exponentialDamping( const Real& _newVal);
00096 virtual const Real& get_exponentialDamping();
00102 virtual void set_useMass( const bool& _newVal);
00104 virtual const bool& get_useMass();
00106 virtual void set_useSingleMass( const bool& _newVal);
00108 virtual const bool& get_useSingleMass();
00110 virtual void set_singleInvMass( const InvMass& _newVal);
00112 virtual const InvMass& get_singleInvMass();
00114 virtual void set_invMasses( InvMasses* _newVal);
00116 virtual const InvMasses* get_invMasses();
00119 protected:
00120 typedef OdeSolver<t_Positions,t_Vector,t_Real> Parent;
00121
00122 Vec _gravity;
00124 bool _useGravity;
00126 Real _exponentialDamping;
00128 const InvMasses* _invMasses;
00130 bool _useExponentialDamping;
00132 InvMass _singleInvMass;
00134 static Vec zero(){ return Value<Vec>::zero(); }
00136 bool _useMass;
00138 bool _useSingleMass;
00139 };
00140
00141 }
00142
00143
00144 #endif