StiffSpringForceField.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef SOFA_COMPONENT_FORCEFIELD_STIFFSPRINGFORCEFIELD_H
00029 #define SOFA_COMPONENT_FORCEFIELD_STIFFSPRINGFORCEFIELD_H
00030
00031 #include <sofa/component/forcefield/SpringForceField.h>
00032 #include <sofa/defaulttype/Mat.h>
00033
00034 namespace sofa
00035 {
00036
00037 namespace component
00038 {
00039
00040 namespace forcefield
00041 {
00042
00048 template<class DataTypes>
00049 class StiffSpringForceField : public SpringForceField<DataTypes>
00050 {
00051 public:
00052 typedef SpringForceField<DataTypes> Inherit;
00053 typedef typename DataTypes::VecCoord VecCoord;
00054 typedef typename DataTypes::VecDeriv VecDeriv;
00055 typedef typename DataTypes::Coord Coord;
00056 typedef typename DataTypes::Deriv Deriv;
00057 typedef typename Coord::value_type Real;
00058 typedef typename Inherit::Spring Spring;
00059 typedef core::componentmodel::behavior::MechanicalState<DataTypes> MechanicalState;
00060 enum { N=Coord::static_size };
00061 typedef defaulttype::Mat<N,N,Real> Mat;
00062
00063 protected:
00064 sofa::helper::vector<Mat> dfdx;
00065 double m_potentialEnergy;
00066
00068 void addSpringForce(double& potentialEnergy, VecDeriv& f1, const VecCoord& p1, const VecDeriv& v1, VecDeriv& f2, const VecCoord& p2, const VecDeriv& v2, int i, const Spring& spring);
00069
00071 void addSpringDForce(VecDeriv& df1, const VecDeriv& dx1, VecDeriv& df2, const VecDeriv& dx2, int i, const Spring& spring, double kFactor, double bFactor);
00072
00073 public:
00074 StiffSpringForceField(MechanicalState* object1, MechanicalState* object2, double ks=100.0, double kd=5.0)
00075 : SpringForceField<DataTypes>(object1, object2, ks, kd)
00076 {
00077 }
00078
00079 StiffSpringForceField(double ks=100.0, double kd=5.0)
00080 : SpringForceField<DataTypes>(ks, kd)
00081 {
00082 }
00083
00084 virtual void init();
00085
00087 virtual void addForce(VecDeriv& f1, VecDeriv& f2, const VecCoord& x1, const VecCoord& x2, const VecDeriv& v1, const VecDeriv& v2);
00088
00090 virtual void addDForce(VecDeriv& df1, VecDeriv& df2, const VecDeriv& dx1, const VecDeriv& dx2, double kFactor, double bFactor);
00091 };
00092
00093 }
00094
00095 }
00096
00097 }
00098
00099 #endif