adevs
|
#include <adevs_rk45.h>
Public Member Functions | |
rk45 (int num_state_vars, double h_max, double err_tol, int zero_crossing_funcs, double event_tol=1E-12) | |
void | init (int i, double q0) |
const double * | getStateVars () const |
int | getNumStateVars () const |
virtual void | der_func (const double *q, double *dq)=0 |
virtual void | state_event_func (const double *q, double *z)=0 |
virtual double | time_event_func (const double *q)=0 |
virtual void | discrete_action (double *q, const Bag< X > &xb)=0 |
virtual void | discrete_output (const double *q, Bag< X > &yb)=0 |
virtual void | state_changed (const double *q) |
void | evolve_func (double h) |
double | next_event_func (bool &is_event) |
void | discrete_action_func (const Bag< X > &xb) |
void | discrete_output_func (Bag< X > &yb) |
void | state_changed () |
~rk45 () | |
Destructor. |
This class is deprecated. Use the Hybrid class instead.
This class can be used to simulate a set of ordinary differential equations with state and time events. An adaptive fourth/fifth order Runge-Kutta integration scheme is used to advance to solution, and interval halving is used for event detection. Truncation errors are estimated for the fourth order scheme, but the solution is advanced with the fifth order scheme. The inf-norm is used in the error tolerance test.
adevs::rk45< X >::rk45 | ( | int | num_state_vars, |
double | h_max, | ||
double | err_tol, | ||
int | zero_crossing_funcs, | ||
double | event_tol = 1E-12 |
||
) |
The constructor requires the number of continuous state variables, the maximum allowed integration time step, maximum truncation error tolerance, and the number of zero crossing functions in this system. An optional event tolerance sets the absolute time by which events can be missed (default is 1E-12).
virtual void adevs::rk45< X >::der_func | ( | const double * | q, |
double * | dq | ||
) | [pure virtual] |
Compute the derivative function using the supplied state variable values. The derivatives should be stored in dq.
virtual void adevs::rk45< X >::discrete_action | ( | double * | q, |
const Bag< X > & | xb | ||
) | [pure virtual] |
This function is called when an event occurs. The event can be due to the zero crossing function reaching zero or because of an external input. The continuous and discrete variables can be updated here. The q array contains continuous state when the event occurs, and can be modified if desired.
void adevs::rk45< X >::discrete_action_func | ( | const Bag< X > & | xb | ) | [virtual] |
This is the discrete action function. The input bag contains the discrete events that are available at this time (if any).
Implements adevs::DESS< X >.
virtual void adevs::rk45< X >::discrete_output | ( | const double * | q, |
Bag< X > & | yb | ||
) | [pure virtual] |
This output function is evaluated when internal events occur. Output events should be placed into the bag yb.
void adevs::rk45< X >::discrete_output_func | ( | Bag< X > & | yb | ) | [virtual] |
This is the output function. The output function is evaluated when the next_event_func() elapses. The bag should be filled with output events.
Implements adevs::DESS< X >.
void adevs::rk45< X >::evolve_func | ( | double | h | ) | [virtual] |
This virtual function is the continuous evolution function. Its purpose is to advance the continuous state variables for h units of time. A derived class should implement its integration scheme in this function.
Implements adevs::DESS< X >.
int adevs::rk45< X >::getNumStateVars | ( | ) | const [inline] |
Get the number of items in the state variable array.
const double* adevs::rk45< X >::getStateVars | ( | ) | const [inline] |
Get read-only access to the state variable array.
void adevs::rk45< X >::init | ( | int | i, |
double | q0 | ||
) | [inline] |
Initialize the ith state variable
double adevs::rk45< X >::next_event_func | ( | bool & | is_event | ) | [virtual] |
This function should return the time until the next state or time event in the continuous system. This method can also return the time until the next integration step, in which case the variable is_event should be set to false. If the is_event flag is true, then next state change will be treated as an internal event of the DEVS model.
Implements adevs::DESS< X >.
virtual void adevs::rk45< X >::state_changed | ( | const double * | q | ) | [inline, virtual] |
This method is called immediately following every time step, and just prior and following every discrete action. It is meant to allow output variables to be recorded to file or log every time that the model state changes. You chould not change the simulation state as part of this method! It is non-const just for convenience - please be careful. This method does nothing by default.
void adevs::rk45< X >::state_changed | ( | ) | [inline, virtual] |
This method is executed initially (i.e., at simulation start or just following creation if added dynamically), after every evaluation of the evolution function, and after every evaluation of the discrete_action_func method. This method is intended to facilitate writing the continuous system trajectory to an output file. The overridden method should call some integrator specific method that the user can implement for that purpose.
Implements adevs::DESS< X >.
References adevs::rk45< X >::state_changed().
Referenced by adevs::rk45< X >::state_changed().
virtual void adevs::rk45< X >::state_event_func | ( | const double * | q, |
double * | z | ||
) | [pure virtual] |
This function should fill the array z with the value of the zero crossing functions. The z array will have a number of entries equal to the zero_crossing_funcs argument that was passed to the constructor. An event occurs when any of these functions are equal to zero.
virtual double adevs::rk45< X >::time_event_func | ( | const double * | q | ) | [pure virtual] |
This method is used to schedule time event. The returned value is the time remaining until the next time event.