CentralDifferenceSolver.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_CENTRALDIFFERENCESOLVER_H
00026 #define SOFA_COMPONENT_ODESOLVER_CENTRALDIFFERENCESOLVER_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
00048 class CentralDifferenceSolver : public sofa::simulation::OdeSolverImpl
00049 {
00050 public:
00051
00052 CentralDifferenceSolver();
00053
00054 void solve (double dt);
00055
00056 Data<double> f_rayleighMass;
00057
00058
00061 virtual double getIntegrationFactor(int inputDerivative, int outputDerivative) const
00062 {
00063 const double dt = getContext()->getDt();
00064 double matrix[3][3] = {
00065 { 1, dt, dt*dt},
00066 { 0, 1, dt},
00067 { 0, 0, 0}};
00068 if (inputDerivative >= 3 || outputDerivative >= 3)
00069 return 0;
00070 else
00071 return matrix[outputDerivative][inputDerivative];
00072 }
00073
00077 virtual double getSolutionIntegrationFactor(int outputDerivative) const
00078 {
00079 const double dt = getContext()->getDt();
00080 double vect[3] = { dt*dt, dt, 1};
00081 if (outputDerivative >= 3)
00082 return 0;
00083 else
00084 return vect[outputDerivative];
00085 }
00086 };
00087
00088 }
00089
00090 }
00091
00092 }
00093
00094 #endif