Chaste  Release::3.4
AbstractOdeSystem.hpp
1 /*
2 
3 Copyright (c) 2005-2016, University of Oxford.
4 All rights reserved.
5 
6 University of Oxford means the Chancellor, Masters and Scholars of the
7 University of Oxford, having an administrative office at Wellington
8 Square, Oxford OX1 2JD, UK.
9 
10 This file is part of Chaste.
11 
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions are met:
14  * Redistributions of source code must retain the above copyright notice,
15  this list of conditions and the following disclaimer.
16  * Redistributions in binary form must reproduce the above copyright notice,
17  this list of conditions and the following disclaimer in the documentation
18  and/or other materials provided with the distribution.
19  * Neither the name of the University of Oxford nor the names of its
20  contributors may be used to endorse or promote products derived from this
21  software without specific prior written permission.
22 
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
29 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 
34 */
35 
36 #ifndef _ABSTRACTODESYSTEM_HPP_
37 #define _ABSTRACTODESYSTEM_HPP_
38 
39 #include <vector>
40 #include <string>
41 #include <algorithm>
42 
43 
44 #include "ChasteSerialization.hpp"
46 #include <boost/serialization/split_member.hpp>
47 #include <boost/serialization/vector.hpp>
48 #include "ClassIsAbstract.hpp"
49 
50 #include "AbstractParameterisedSystem.hpp"
51 #include "Exception.hpp"
52 
87 class AbstractOdeSystem : public AbstractParameterisedSystem<std::vector<double> >
88 {
89  friend class TestAbstractOdeSystem;
90 
91 private:
92 
93 
94  friend class boost::serialization::access;
101  template<class Archive>
102  void save(Archive & archive, const unsigned int version) const
103  {
104  // Despite the fact that 3 of these variables actually live in our base class,
105  // we still archive them here to maintain backwards compatibility.
106  // Since the N_Vector version of mStateVariables and mParameters needs converting
107  // to a standard vector before archiving, this doesn't hurt too much.
108  archive & mNumberOfStateVariables;
109  archive & mUseAnalyticJacobian;
110  archive & mStateVariables;
111  archive & mParameters;
112 
113  if (version > 0)
114  {
115  archive & rGetParameterNames();
116  }
117 
118  // This is always set up by subclass constructors, and is essentially
119  // 'static' data, so shouldn't go in the archive.
120  //archive &mpSystemInfo;
121  }
128  template<class Archive>
129  void load(Archive & archive, const unsigned int version)
130  {
131  archive & mNumberOfStateVariables;
132  archive & mUseAnalyticJacobian;
133  archive & mStateVariables;
134  std::vector<double> parameters;
135  archive & parameters;
136 
137  if (version > 0)
138  {
139  std::vector<std::string> param_names;
140  archive & param_names;
141 
142  CheckParametersOnLoad(parameters,param_names);
143  }
144  else
145  {
146  mParameters = parameters;
147  }
148  }
149  BOOST_SERIALIZATION_SPLIT_MEMBER()
150 
151 protected:
152 
155 
156 public:
157 
163  AbstractOdeSystem(unsigned numberOfStateVariables);
164 
168  virtual ~AbstractOdeSystem();
169 
177  virtual void EvaluateYDerivatives(double time, const std::vector<double>& rY,
178  std::vector<double>& rDY)=0;
179 
192  virtual bool CalculateStoppingEvent(double time, const std::vector<double>& rY);
193 
205  virtual double CalculateRootFunction(double time, const std::vector<double>& rY);
206 
212  bool GetUseAnalyticJacobian();
213 
219  const std::vector<double>& rGetConstStateVariables() const;
220 };
221 
222 CLASS_IS_ABSTRACT(AbstractOdeSystem)
223 BOOST_CLASS_VERSION(AbstractOdeSystem, 1u)
224 
225 #endif //_ABSTRACTODESYSTEM_HPP_
void save(Archive &archive, const unsigned int version) const
#define CLASS_IS_ABSTRACT(T)
virtual void EvaluateYDerivatives(double time, const std::vector< double > &rY, std::vector< double > &rDY)=0
const std::vector< double > & rGetConstStateVariables() const
virtual double CalculateRootFunction(double time, const std::vector< double > &rY)
void load(Archive &archive, const unsigned int version)
void CheckParametersOnLoad(const std::vector< double > &rParameters, const std::vector< std::string > &rParameterNames)
const std::vector< std::string > & rGetParameterNames() const
virtual bool CalculateStoppingEvent(double time, const std::vector< double > &rY)