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 #ifndef ABSTRACTODEBASEDCONTRACTIONMODEL_
00030 #define ABSTRACTODEBASEDCONTRACTIONMODEL_
00031
00032 #include "AbstractOdeSystem.hpp"
00033 #include "AbstractContractionModel.hpp"
00034 #include "AbstractIvpOdeSolver.hpp"
00035 #include "EulerIvpOdeSolver.hpp"
00036
00051 class AbstractOdeBasedContractionModel : public AbstractOdeSystem, public AbstractContractionModel
00052 {
00053 protected:
00054
00057 std::vector<double> mTemporaryStateVariables;
00058
00060 double mTime;
00061
00062 public:
00067 AbstractOdeBasedContractionModel(unsigned numStateVariables)
00068 : AbstractOdeSystem(numStateVariables),
00069 AbstractContractionModel(),
00070 mTime(0.0)
00071 {
00072
00073 }
00074
00075
00086 virtual void RunDoNotUpdate(double startTime, double endTime, double timeStep)
00087 {
00088
00089 if(mTemporaryStateVariables.size()>0)
00090 {
00091 mTemporaryStateVariables.resize(mStateVariables.size());
00092 }
00093 mTemporaryStateVariables = mStateVariables;
00094
00095
00096 RunAndUpdate(startTime, endTime, timeStep);
00097
00098
00099
00100 for(unsigned i=0; i<mStateVariables.size(); i++)
00101 {
00102 double soln = mStateVariables[i];
00103 mStateVariables[i] = mTemporaryStateVariables[i];
00104 mTemporaryStateVariables[i] = soln;
00105 }
00106
00107
00108 }
00109
00114 void UpdateStateVariables()
00115 {
00116
00117 for(unsigned i=0; i<mStateVariables.size(); i++)
00118 {
00119 mStateVariables[i] = mTemporaryStateVariables[i];
00120 }
00121 }
00122
00135 void RunAndUpdate(double startTime, double endTime, double timeStep)
00136 {
00137 EulerIvpOdeSolver solver;
00138 solver.SolveAndUpdateStateVariable(this, startTime, endTime, timeStep);
00139
00140 mTime = endTime;
00141 }
00142 };
00143
00144
00145 #endif