00001 #ifndef OdeImplicitSolver_h_____________________________
00002 #define OdeImplicitSolver_h_____________________________
00003
00004 #include "odeSolver.h"
00005 #include <animal/container_traits.h>
00006
00007 namespace animal
00008 {
00009
00029 template<
00030 class t_Positions,
00031 class t_Vector,
00032 class t_Real>
00033 class OdeImplicitSolver
00034 : public OdeSolver<t_Positions,t_Vector,t_Real>
00035 {
00036 public:
00037 typedef t_Positions Positions;
00038 typedef t_Vector Vector;
00039 typedef t_Real Real;
00040 static const int IMPLICIT_EULER = 5;
00041
00043 OdeImplicitSolver();
00044
00050 virtual void solveODE( Positions& pos, Vector& vel, Real dt );
00051
00055 void setDampingRatio( Real d ){ _dampingRatio = d; }
00056
00058 Real dampingRatio() const { return _dampingRatio; }
00059
00063 void setMaxCGiterations( int n ){ _maxIter = n; }
00064
00066 int maxCGiterations() const { return _maxIter; }
00067
00071 void setSmallDenominatorThreshold( Real s ){ _smallDenominatorThreshold = s; }
00072
00074 Real smallDenominatorThreshold() const { return _smallDenominatorThreshold; }
00075
00076
00077
00078
00079
00080 Real _dampingRatio;
00081 int _maxIter;
00082 Real _smallDenominatorThreshold;
00083
00084 typedef typename container_traits<Vector>::value_type Vec;
00085
00086
00087
00088
00089
00090
00091
00092
00097 virtual void applyForces( Vector& a, const Vector& f)=0;
00098
00104 virtual void computeAccelerations( Vector& a, const Positions& p, const Vector& v)=0;
00105
00111 virtual void computeAccelerationsAndStiffness( Vector& a, const Positions& p, const Vector& v)=0;
00112
00118 virtual void v_eq_h_dfdx_x( Vector& v, Real h, const Vector& x )=0;
00119
00125 virtual void v_peq_h_dfdx_x( Vector& v, Real h, const Vector& x )=0;
00126
00134 void compute_implicit_euler_step( Positions& dpos, Vector& dvel, const Positions& pos, const Vector& vel, Real dt );
00135
00141 void implicit_euler( Positions& pos, Vector& vel, Real dt );
00142
00149 void multImplicitMatrix( Vector& y, const Vector& x, Real h);
00150
00151 private:
00152
00153 };
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 }
00164
00165 #endif