37 T* restr
f0, * restr
f1, * restr
f2, * restr
f3;
42 virtual const std::type_info&
vtype()
const;
64 MAKE_ALIGNED
const static real_type a[] = {0.2, 0.3, 0.8, 8.0/9, 1, 1};
65 MAKE_ALIGNED
const static real_type b1 = 0.2;
66 MAKE_ALIGNED
const static real_type b2[] = {3.0/40, 9.0/40};
67 MAKE_ALIGNED
const static real_type b3[] = {44.0/45, -56.0/15, 32.0/9};
68 MAKE_ALIGNED
const static real_type b4[] = {19372.0/6561, -25360.0/2187, 64448.0/6561, -212.0/729};
69 MAKE_ALIGNED
const static real_type b5[] = {9017.0/3168, -355.0/33, 46732.0/5247, 49.0/176, -5103.0/18656};
70 MAKE_ALIGNED
const static real_type b6[] = {35.0/384, 0, 500.0/1113, 125.0/192, -2187.0/6784, 11.0/84};
71 MAKE_ALIGNED
const static real_type c4[] = {5179.0/57600, 0, 7571.0/16695, 393.0/640,
72 -92097.0/339200, 187.0/2100, 1.0/40};
73 MAKE_ALIGNED
const static real_type c5[] = {35.0/384, 0, 500.0/1113, 125.0/192, -2187.0/6784, 11.0/84, 0};
79 for(
size_t i = 0; i < dimension; i++){
97 T* restr tmp, * restr swp, * restr u0hld;
98 T* restr tmp6, * restr tmpc;
107 if((tcur + dt) > tf){
109 err(
"t0-tf <= dt, consider decreasing the initial timestep. Otherwise mileage may vary",
110 "rk45::integrate",
"integrator/rh45.cpp", (
item*)rh_val,
WARNING);
115 rh_val->dxdt(u0, f6, tcur);
118 if((tcur + dt) > tf){
127 for(
size_t i = 0; i < dimension; i++){
128 u_calc[i] = u0[i] + b1*f0[i]*dt;
131 rh_val->dxdt(u_calc, f1, tcur);
133 for(
size_t i = 0; i < dimension; i++){
134 u_calc[i] = u0[i] + dt*(b2[0]*f0[i] + b2[1] * f1[i]);
137 rh_val->dxdt(u_calc, f2, tcur);
139 for(
size_t i = 0; i < dimension; i++){
140 u_calc[i] = u0[i] + dt*(b3[0]*f0[i] + b3[1] * f1[i] + b3[2]*f2[i]);
143 rh_val->dxdt(u_calc, f3, tcur);
145 for(
size_t i = 0; i < dimension; i++){
146 u_calc[i] = u0[i] + dt*(b4[0]*f0[i] + b4[1] * f1[i] + b4[2]*f2[i] + b4[3]*f3[i]);
149 rh_val->dxdt(u_calc, f4, tcur);
151 for(
size_t i = 0; i < dimension; i++){
152 u_calc[i] = u0[i] + dt*(b5[0]*f0[i] + b5[1] * f1[i] + b5[2]*f2[i] +
153 b5[3]*f3[i] + b5[4]*f4[i]);
156 rh_val->dxdt(u_calc, f5, tcur);
158 for(
size_t i = 0; i < dimension; i++){
159 u_calc[i] = u0[i] + dt*(b6[0]*f0[i] + b6[1] * f1[i] + b6[2]*f2[i] +
160 b6[3]*f3[i] + b6[4]*f4[i] + b6[5]*f5[i]);
163 rh_val->dxdt(u_calc, f6, tcur);
173 for(
size_t i = 0; i < dimension; i++){
174 u_calc[i] = u0[i] + dt*(c5[0]*f0[i] + c5[1] * f1[i] + c5[2] * f2[i] + c5[3] * f3[i] +
175 c5[4]*f4[i] + c5[5]*f5[i] + c5[6]*f6[i]);
177 u_calc2[i] =
abs(u0[i] + dt*(c4[0]*f0[i] + c4[1] * f1[i] + c4[2] * f2[i] + c4[3] * f3[i] +
178 c4[4]*f4[i] + c4[5]*f5[i] + c4[6]*f6[i]) - u_calc[i]);
182 for(
size_t i = 0; i < dimension; i++){
190 dt =dt*magic_mult*std::pow(tauv/delta, magic_power);
194 err(
"Estimated timestep is smaller than minimum timestep too many times, exiting",
195 "rk45::integrate",
"integrator/rk45.cpp", (
item*)rh_val,
WARNING);
208 dt = std::min<real_type>(dt, dt_max);
216 if((tcur + dt) > tf){
219 for(
size_t i = 0; i < dimension; i++){
240 for(
size_t i = 0; i < dimension; i++){
257 return std::string(
"rk45_tmpl<") + this->vname() +
">";
262 if(!rh_val->compare<T>()){
263 err(
"Bad rhs type passed to rk45 integrator",
"rk45_tmpl::postprocess",
266 this->add_as_parent(rh_val);
267 dat.
retrieve(dt_init,
"dt_init",
this);
269 err(
"dt_init is invalid, must be >= 0",
"rk45::postprocess",
270 "integrator/rk45.cpp", dat[
"dt_init"],
FATAL_ERROR);
272 dat.
retrieve(dt_min,
"dt_min",
this);
274 err(
"dt_min is invalid, must be >= 0",
"rk45::postprocess",
275 "integrator/rk45.cpp", dat[
"dt_min"],
FATAL_ERROR);
277 dat.
retrieve(dt_max,
"dt_max",
this);
279 err(
"dt_max is invalid, must be >= 0",
"rk45::postprocess",
280 "integrator/rk45.cpp", dat[
"dt_max"],
FATAL_ERROR);
282 dat.
retrieve(relerr,
"relerr",
this);
284 err(
"relerr is invalid, must be >= 0",
"rk45::postprocess",
285 "integrator/rk45.cpp", dat[
"relerr"],
FATAL_ERROR);
287 dat.
retrieve(abserr,
"abserr",
this);
289 err(
"abserr is invalid, must be >= 0",
"rk45::postprocess",
290 "integrator/rk45.cpp", dat[
"abserr"],
FATAL_ERROR);
292 memp.create(dimension, &f0, &f1, &f2, &f3, &f4, &f5, &f6, &u_calc, &u_calc2);