BackwardEulerIvpOdeSolver.hpp
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
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef BACKWARDEULERIVPODESOLVER_HPP_
00037 #define BACKWARDEULERIVPODESOLVER_HPP_
00038
00039 #include "AbstractOneStepIvpOdeSolver.hpp"
00040 #include "AbstractOdeSystemWithAnalyticJacobian.hpp"
00041
00042 #include "ChasteSerialization.hpp"
00043 #include <boost/serialization/base_object.hpp>
00044
00045 #include "AbstractOneStepIvpOdeSolver.hpp"
00046
00051 class BackwardEulerIvpOdeSolver : public AbstractOneStepIvpOdeSolver
00052 {
00053 private:
00055 friend class boost::serialization::access;
00062 template<class Archive>
00063 void serialize(Archive & archive, const unsigned int version)
00064 {
00065
00066 archive & boost::serialization::base_object<AbstractOneStepIvpOdeSolver>(*this);
00067
00068 archive & mNumericalJacobianEpsilon;
00069 archive & mForceUseOfNumericalJacobian;
00070 }
00071
00073 unsigned mSizeOfOdeSystem;
00074
00076 double mNumericalJacobianEpsilon;
00077
00082 bool mForceUseOfNumericalJacobian;
00083
00084
00085
00086
00087
00088
00089
00091 double* mResidual;
00092
00094 double** mJacobian;
00095
00097 double* mUpdate;
00098
00108 void ComputeResidual(AbstractOdeSystem* pAbstractOdeSystem,
00109 double timeStep,
00110 double time,
00111 std::vector<double>& rCurrentYValues,
00112 std::vector<double>& rCurrentGuess);
00113
00123 void ComputeJacobian(AbstractOdeSystem* pAbstractOdeSystem,
00124 double timeStep,
00125 double time,
00126 std::vector<double>& rCurrentYValues,
00127 std::vector<double>& rCurrentGuess);
00128
00135 void SolveLinearSystem();
00136
00144 double ComputeNorm(double* pVector);
00145
00155 void ComputeNumericalJacobian(AbstractOdeSystem* pAbstractOdeSystem,
00156 double timeStep,
00157 double time,
00158 std::vector<double>& rCurrentYValues,
00159 std::vector<double>& rCurrentGuess);
00160
00161 protected:
00162
00176 void CalculateNextYValue(AbstractOdeSystem* pAbstractOdeSystem,
00177 double timeStep,
00178 double time,
00179 std::vector<double>& rCurrentYValues,
00180 std::vector<double>& rNextYValues);
00181
00182 public:
00183
00189 BackwardEulerIvpOdeSolver(unsigned sizeOfOdeSystem);
00190
00194 ~BackwardEulerIvpOdeSolver();
00195
00202 void SetEpsilonForNumericalJacobian(double epsilon);
00203
00208 void ForceUseOfNumericalJacobian();
00209
00215 unsigned GetSystemSize() const {return mSizeOfOdeSystem;};
00216 };
00217
00218 #include "SerializationExportWrapper.hpp"
00219 CHASTE_CLASS_EXPORT(BackwardEulerIvpOdeSolver)
00220
00221 namespace boost
00222 {
00223 namespace serialization
00224 {
00229 template<class Archive>
00230 inline void save_construct_data(
00231 Archive & ar, const BackwardEulerIvpOdeSolver * t, const unsigned int file_version)
00232 {
00233 const unsigned system_size = t->GetSystemSize();
00234 ar & system_size;
00235 }
00236
00243 template<class Archive>
00244 inline void load_construct_data(
00245 Archive & ar, BackwardEulerIvpOdeSolver * t, const unsigned int file_version)
00246 {
00247 unsigned ode_system_size;
00248 ar >> ode_system_size;
00249 ::new(t)BackwardEulerIvpOdeSolver(ode_system_size);
00250 }
00251 }
00252 }
00253
00254 #endif