25 T* restr
f0, * restr
f1, * restr
f2, * restr
f3;
30 virtual const std::type_info&
vtype()
const;
56 const size_t m = dimension;
57 const double t_diff = tf-t0;
58 const size_t steps = ceil(t_diff/stepsize);
62 for(
size_t j = 0; j < steps; j++){
69 func->dxdt(u0, f0, t0);
71 for ( i = 0; i < m; i++ ){
72 u_calc[i] = u0[i] + dt * f0[i] / 2.0;
75 func->dxdt(u_calc, f1, t1);
76 for ( i = 0; i < m; i++ ){
77 u_calc[i] = u0[i] + dt * f1[i] / 2.0;
80 func->dxdt(u_calc, f2, t1);
81 for ( i = 0; i < m; i++ ){
82 u_calc[i] = u0[i] + dt * f2[i];
86 func->dxdt(u_calc, f3, t2);
87 for ( i = 0; i < m; i++ ){
88 u0[i] = u0[i] + (dt * ( f0[i] + 2.0 * f1[i] + 2.0 * f2[i] + f3[i] ) / 6.0);
97 return std::string(
"rk4_tmpl<") + this->vname() +
">";
102 if(!rh_val->compare<T>()){
103 err(
"Bad rhs type passed to rk4 integrator",
"rk4_tmpl::postprocess",
106 this->add_as_parent(rh_val);
107 dat.
retrieve(stepsize,
"stepsize",
this);
109 err(
"stepsize is invalid, must be >= 0",
"rk4_tmpl::postprocess",
110 "integrator/rk4.hpp", dat[
"stepsize"],
FATAL_ERROR);
112 memp.create(dimension, &f0, &f1, &f2, &f3, &u_calc);