EulerImplicitSolver.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 #ifndef SOFA_COMPONENT_ODESOLVER_EULERIMPLICITSOLVER_H
00026 #define SOFA_COMPONENT_ODESOLVER_EULERIMPLICITSOLVER_H
00027
00028 #include <sofa/core/componentmodel/behavior/OdeSolver.h>
00029 #include <sofa/simulation/common/OdeSolverImpl.h>
00030
00031 namespace sofa
00032 {
00033
00034 namespace component
00035 {
00036
00037 namespace odesolver
00038 {
00039
00040 using namespace sofa::defaulttype;
00041
00044 class EulerImplicitSolver : public sofa::simulation::OdeSolverImpl
00045 {
00046 public:
00047
00048 Data<double> f_rayleighStiffness;
00049 Data<double> f_rayleighMass;
00050 Data<double> f_velocityDamping;
00051 Data<bool> f_verbose;
00052
00053 EulerImplicitSolver();
00054
00055 void solve (double dt);
00056
00061 virtual double getVelocityIntegrationFactor() const
00062 {
00063 return 1.0;
00064 }
00065
00070 virtual double getPositionIntegrationFactor() const
00071 {
00072 return getContext()->getDt();
00073 }
00074
00090 double getIntegrationFactor(int inputDerivative, int outputDerivative) const
00091 {
00092 const double dt = getContext()->getDt();
00093 double matrix[3][3] = {
00094 { 1, dt, 0},
00095 { 0, 1, 0},
00096 { 0, 0, 0}};
00097 if (inputDerivative >= 3 || outputDerivative >= 3)
00098 return 0;
00099 else
00100 return matrix[outputDerivative][inputDerivative];
00101 }
00102
00105 double getSolutionIntegrationFactor(int outputDerivative) const
00106 {
00107 const double dt = getContext()->getDt();
00108 double vect[3] = { dt, 1, 1/dt};
00109 if (outputDerivative >= 3)
00110 return 0;
00111 else
00112 return vect[outputDerivative];
00113 }
00114
00115 };
00116
00117 }
00118
00119 }
00120
00121 }
00122
00123 #endif