#include <AbstractOneStepIvpOdeSolver.hpp>
Public Member Functions | |
virtual OdeSolution | Solve (AbstractOdeSystem *pAbstractOdeSystem, std::vector< double > &rYValues, double startTime, double endTime, double timeStep, double timeSampling) |
virtual void | Solve (AbstractOdeSystem *pAbstractOdeSystem, std::vector< double > &rYValues, double startTime, double endTime, double timeStep) |
virtual | ~AbstractOneStepIvpOdeSolver () |
Protected Member Functions | |
virtual void | InternalSolve (AbstractOdeSystem *pAbstractOdeSystem, std::vector< double > &rCurrentYValues, std::vector< double > &rWorkingMemory, double startTime, double endTime, double timeStep) |
virtual void | CalculateNextYValue (AbstractOdeSystem *pAbstractOdeSystem, double timeStep, double time, std::vector< double > &rCurrentYValues, std::vector< double > &rNextYValues)=0 |
Private Member Functions | |
template<class Archive> | |
void | serialize (Archive &archive, const unsigned int version) |
Private Attributes | |
std::vector< double > | mWorkingMemory |
Friends | |
class | boost::serialization::access |
Definition at line 42 of file AbstractOneStepIvpOdeSolver.hpp.
virtual AbstractOneStepIvpOdeSolver::~AbstractOneStepIvpOdeSolver | ( | ) | [inline, virtual] |
Virtual destructor since we have virtual methods.
Definition at line 169 of file AbstractOneStepIvpOdeSolver.hpp.
void AbstractOneStepIvpOdeSolver::serialize | ( | Archive & | archive, | |
const unsigned int | version | |||
) | [inline, private] |
Archive the abstract IVP Solver, never used directly - boost uses this.
archive | the archive | |
version | the current version of this class |
Reimplemented from AbstractIvpOdeSolver.
Reimplemented in BackwardEulerIvpOdeSolver, EulerIvpOdeSolver, HeunIvpOdeSolver, MockEulerIvpOdeSolver, RungeKutta2IvpOdeSolver, and RungeKutta4IvpOdeSolver.
Definition at line 56 of file AbstractOneStepIvpOdeSolver.hpp.
void AbstractOneStepIvpOdeSolver::InternalSolve | ( | AbstractOdeSystem * | pAbstractOdeSystem, | |
std::vector< double > & | rCurrentYValues, | |||
std::vector< double > & | rWorkingMemory, | |||
double | startTime, | |||
double | endTime, | |||
double | timeStep | |||
) | [protected, virtual] |
Method that actually performs the solving on behalf of the public Solve methods.
pAbstractOdeSystem | the ODE system to solve | |
rCurrentYValues | the current (initial) state; results will also be returned in here | |
rWorkingMemory | working memory; same size as rCurrentYValues | |
startTime | initial time | |
endTime | time to solve to | |
timeStep | dt |
Reimplemented in MockEulerIvpOdeSolver.
Definition at line 112 of file AbstractOneStepIvpOdeSolver.cpp.
References TimeStepper::AdvanceOneTimeStep(), CalculateNextYValue(), AbstractOdeSystem::CalculateStoppingEvent(), TimeStepper::GetNextTimeStep(), TimeStepper::GetTime(), TimeStepper::IsTimeAtEnd(), AbstractIvpOdeSolver::mStoppingEventOccurred, and AbstractIvpOdeSolver::mStoppingTime.
Referenced by MockEulerIvpOdeSolver::InternalSolve(), and Solve().
virtual void AbstractOneStepIvpOdeSolver::CalculateNextYValue | ( | AbstractOdeSystem * | pAbstractOdeSystem, | |
double | timeStep, | |||
double | time, | |||
std::vector< double > & | rCurrentYValues, | |||
std::vector< double > & | rNextYValues | |||
) | [protected, pure virtual] |
Calculate the solution to the ODE system at the next timestep. Concrete subclasses should provide this method.
pAbstractOdeSystem | the ODE system to solve | |
timeStep | dt | |
time | the current time | |
rCurrentYValues | the current (initial) state | |
rNextYValues | the state at the next timestep |
Implemented in BackwardEulerIvpOdeSolver, EulerIvpOdeSolver, HeunIvpOdeSolver, RungeKutta2IvpOdeSolver, and RungeKutta4IvpOdeSolver.
Referenced by InternalSolve().
OdeSolution AbstractOneStepIvpOdeSolver::Solve | ( | AbstractOdeSystem * | pAbstractOdeSystem, | |
std::vector< double > & | rYValues, | |||
double | startTime, | |||
double | endTime, | |||
double | timeStep, | |||
double | timeSampling | |||
) | [virtual] |
Solves a system of ODEs using a specified one-step ODE solver and returns the solution as an OdeSolution object.
An example, which returns the solution every 0.1 seconds using dt=0.01:
MyOdeSystem ode; std::vector<double> init_cond = ode_system.GetInitialConditions(); OdeSolution solution = solver.Solve(&ode, init_cond, 0, 1, 0.01, 0.1);
pAbstractOdeSystem | pointer to the concrete ODE system to be solved | |
rYValues | a standard vector specifying the intial condition of each solution variable in the system (this can be the initial conditions vector stored in the ODE system) | |
startTime | the time at which the initial conditions are specified | |
endTime | the time to which the system should be solved and the solution returned | |
timeStep | the time interval to be used by the solver | |
timeSampling | the interval at which to sample the solution to the ODE system |
Implements AbstractIvpOdeSolver.
Definition at line 38 of file AbstractOneStepIvpOdeSolver.cpp.
References TimeStepper::AdvanceOneTimeStep(), AbstractOdeSystem::CalculateStoppingEvent(), TimeStepper::EstimateTimeSteps(), EXCEPTION, Identifiable::GetIdentifier(), TimeStepper::GetNextTime(), AbstractParameterisedSystem< VECTOR >::GetNumberOfStateVariables(), AbstractParameterisedSystem< VECTOR >::GetSystemInformation(), TimeStepper::GetTime(), TimeStepper::GetTotalTimeStepsTaken(), InternalSolve(), TimeStepper::IsTimeAtEnd(), AbstractIvpOdeSolver::mStoppingEventOccurred, AbstractIvpOdeSolver::mStoppingTime, mWorkingMemory, OdeSolution::rGetSolutions(), OdeSolution::rGetTimes(), OdeSolution::SetNumberOfTimeSteps(), OdeSolution::SetOdeSystemInformation(), and OdeSolution::SetSolverName().
void AbstractOneStepIvpOdeSolver::Solve | ( | AbstractOdeSystem * | pAbstractOdeSystem, | |
std::vector< double > & | rYValues, | |||
double | startTime, | |||
double | endTime, | |||
double | timeStep | |||
) | [virtual] |
Second version of Solve. Solves a system of ODEs using a specified one-step ODE solver. This method does not return the solution and therefore does not take in a sampling time. Instead, the mStateVariables component in the ODE system object is updated.
An example:
std::vector<double> init_cond = ode_system.GetInitialConditions(); solver.Solve(&ode, init_cond, 0, 1, 0.01); state_variables = ode_system.rGetStateVariables(); // solution at t=1 found here
pAbstractOdeSystem | pointer to the concrete ODE system to be solved | |
rYValues | a standard vector specifying the intial condition of each solution variable in the system (this can be the initial conditions vector stored in the ODE system) | |
startTime | the time at which the initial conditions are specified | |
endTime | the time to which the system should be solved and the solution returned | |
timeStep | the time interval to be used by the solver |
Implements AbstractIvpOdeSolver.
Definition at line 90 of file AbstractOneStepIvpOdeSolver.cpp.
References AbstractOdeSystem::CalculateStoppingEvent(), EXCEPTION, AbstractParameterisedSystem< VECTOR >::GetNumberOfStateVariables(), InternalSolve(), AbstractIvpOdeSolver::mStoppingEventOccurred, and mWorkingMemory.
friend class boost::serialization::access [friend] |
Needed for serialization.
Reimplemented from AbstractIvpOdeSolver.
Reimplemented in BackwardEulerIvpOdeSolver, EulerIvpOdeSolver, HeunIvpOdeSolver, MockEulerIvpOdeSolver, RungeKutta2IvpOdeSolver, and RungeKutta4IvpOdeSolver.
Definition at line 48 of file AbstractOneStepIvpOdeSolver.hpp.
std::vector<double> AbstractOneStepIvpOdeSolver::mWorkingMemory [private] |
Working memory
Definition at line 65 of file AbstractOneStepIvpOdeSolver.hpp.
Referenced by Solve().