ForceField.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 #ifndef SOFA_CORE_COMPONENTMODEL_BEHAVIOR_FORCEFIELD_H
00028 #define SOFA_CORE_COMPONENTMODEL_BEHAVIOR_FORCEFIELD_H
00029
00030 #include <sofa/core/componentmodel/behavior/BaseForceField.h>
00031 #include <sofa/core/componentmodel/behavior/MechanicalState.h>
00032 #include <sofa/defaulttype/BaseVector.h>
00033 #include <sofa/defaulttype/Vec.h>
00034
00035 namespace sofa
00036 {
00037
00038 namespace core
00039 {
00040
00041 namespace componentmodel
00042 {
00043
00044 namespace behavior
00045 {
00046
00058 template<class TDataTypes>
00059 class ForceField : public BaseForceField
00060 {
00061 public:
00062 typedef TDataTypes DataTypes;
00063 typedef typename DataTypes::VecCoord VecCoord;
00064 typedef typename DataTypes::VecDeriv VecDeriv;
00065 typedef typename DataTypes::Coord Coord;
00066 typedef typename DataTypes::Deriv Deriv;
00067
00068 ForceField(MechanicalState<DataTypes> *mm = NULL);
00069
00070 virtual ~ForceField();
00071
00072 virtual void init();
00073
00075 MechanicalState<DataTypes>* getMState() { return mstate; }
00076
00079
00090 virtual void addForce();
00091
00105 virtual void addDForce(double kFactor, double bFactor);
00106
00115 virtual void addDForceV(double kFactor, double bFactor);
00116
00125 virtual double getPotentialEnergy();
00126
00136 virtual void addForce(VecDeriv& f, const VecCoord& x, const VecDeriv& v) = 0;
00137
00154 virtual void addDForce(VecDeriv& df, const VecDeriv& dx);
00155
00172 virtual void addDForce(VecDeriv& df, const VecDeriv& dx, double kFactor, double bFactor);
00173
00181 virtual double getPotentialEnergy(const VecCoord& x) =0;
00182
00184
00187 template<class T>
00188 static bool canCreate(T*& obj, objectmodel::BaseContext* context, objectmodel::BaseObjectDescription* arg)
00189 {
00190 if (dynamic_cast<MechanicalState<DataTypes>*>(context->getMechanicalState()) == NULL)
00191 return false;
00192 return BaseObject::canCreate(obj, context, arg);
00193 }
00194
00195 virtual std::string getTemplateName() const
00196 {
00197 return templateName(this);
00198 }
00199
00200 static std::string templateName(const ForceField<DataTypes>* = NULL)
00201 {
00202 return DataTypes::Name();
00203 }
00204
00205 protected:
00206 MechanicalState<DataTypes> *mstate;
00207 };
00208
00209 }
00210
00211 }
00212
00213 }
00214
00215 }
00216
00217 #endif