CvodeAdaptor.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 #ifdef CHASTE_CVODE
00037 #ifndef _CVODEADAPTOR_HPP_
00038 #define _CVODEADAPTOR_HPP_
00039
00040 #include <vector>
00041
00042 #include "ChasteSerialization.hpp"
00043 #include <boost/serialization/base_object.hpp>
00044
00045 #include "AbstractIvpOdeSolver.hpp"
00046 #include "OdeSolution.hpp"
00047
00048
00049 #include <cvode/cvode.h>
00050 #include <nvector/nvector_serial.h>
00051
00052
00059 void CvodeErrorHandler(int errorCode, const char *module, const char *function,
00060 char *message, void* pData);
00061
00062
00063
00068 typedef struct CvodeData_ {
00070 std::vector<realtype>* pY;
00072 AbstractOdeSystem* pSystem;
00073 } CvodeData;
00074
00092 class CvodeAdaptor : public AbstractIvpOdeSolver
00093 {
00094 private:
00096 friend class boost::serialization::access;
00103 template<class Archive>
00104 void serialize(Archive & archive, const unsigned int version)
00105 {
00106 archive & boost::serialization::base_object<AbstractIvpOdeSolver>(*this);
00107 archive & mRelTol;
00108 archive & mAbsTol;
00109 archive & mLastInternalStepSize;
00110 archive & mMaxSteps;
00111 archive & mCheckForRoots;
00112
00113 }
00114
00116 void* mpCvodeMem;
00117
00119 CvodeData mData;
00120
00122 double mRelTol;
00123
00125 double mAbsTol;
00126
00128 double mLastInternalStepSize;
00129
00134 long int mMaxSteps;
00135
00137 bool mCheckForRoots;
00138
00140 N_Vector mLastSolutionState;
00141
00143 double mLastSolutionTime;
00144
00146 bool mForceReset;
00147
00149 bool mForceMinimalReset;
00150
00156 void RecordStoppingPoint(double stopTime, N_Vector yEnd);
00157
00158 protected:
00159
00168 void SetupCvode(AbstractOdeSystem* pOdeSystem,
00169 std::vector<double>& rInitialY,
00170 double startTime, double maxStep);
00171
00175 void FreeCvodeMemory();
00176
00186 void CvodeError(int flag, const char * msg);
00187
00188 public:
00189
00197 CvodeAdaptor(double relTol=1e-4, double absTol=1e-6);
00198
00203 ~CvodeAdaptor();
00204
00212 void SetTolerances(double relTol=1e-4, double absTol=1e-6);
00213
00217 double GetRelativeTolerance();
00218
00222 double GetAbsoluteTolerance();
00223
00227 double GetLastStepSize();
00228
00236 void SetForceReset(bool autoReset);
00237
00245 void SetMinimalReset(bool minimalReset);
00246
00257 void ResetSolver();
00258
00271 OdeSolution Solve(AbstractOdeSystem* pOdeSystem,
00272 std::vector<double>& rYValues,
00273 double startTime,
00274 double endTime,
00275 double maxStep,
00276 double timeSampling);
00277
00288 void Solve(AbstractOdeSystem* pOdeSystem,
00289 std::vector<double>& rYValues,
00290 double startTime,
00291 double endTime,
00292 double maxStep);
00293
00299 void CheckForStoppingEvents();
00300
00307 void SetMaxSteps(long int numSteps);
00308
00313 long int GetMaxSteps();
00314
00315 };
00316
00317 #include "SerializationExportWrapper.hpp"
00318 CHASTE_CLASS_EXPORT(CvodeAdaptor)
00319
00320 #endif // _CVODEADAPTOR_HPP_
00321 #endif // CHASTE_CVODE