Documentation


odeImplicitSolver.h

Go to the documentation of this file.
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 //protected:    
00079 
00080     Real _dampingRatio; 
00081     int _maxIter;       
00082     Real _smallDenominatorThreshold; 
00083 
00084     typedef typename container_traits<Vector>::value_type Vec;  
00085 
00086 //  /** Compute the force applied to the particles and update the gradient matrix.
00087 //  \param f force vector
00088 //  \param p current positions
00089 //  \param v current velocities
00090 //  */
00091 //  virtual void computeForce( Vector& f, const Positions& p, const Vector& v )=0;
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 /* \example odeImplicitSolver_test.cpp
00155 */
00156 
00157     
00158 
00159 
00160 
00161 
00162 
00163 }//animal
00164 
00165 #endif

Generated on Thu Dec 23 13:52:26 2004 by doxygen 1.3.6