libode
Easy to compile, fast ODE integrators as C++ classes
Loading...
Searching...
No Matches
ode_dopri_54.cc
Go to the documentation of this file.
1
2
3#include "ode_dopri_54.h"
4
5namespace ode {
6
7OdeDoPri54::OdeDoPri54 (unsigned long neq) :
8 OdeEmbedded (neq, false, 4),
9 OdeRK (neq, 7),
10 OdeERK (neq) {
11
12 method_ = "DoPri54";
13 //tableau of coefficents
14 c2 = 1.0/5; a21 = 1.0/5;
15 c3 = 3.0/10; a31 = 3.0/40; a32 = 9.0/40;
16 c4 = 4.0/5; a41 = 44.0/45; a42 = -56.0/15; a43 = 32.0/9;
17 c5 = 8.0/9; a51 = 19372.0/6561; a52 = -25360.0/2187; a53 = 64448.0/6561; a54 = -212.0/729;
18 c6 = 1.0; a61 = 9017.0/3168; a62 = -355.0/33; a63 = 46732.0/5247; a64 = 49.0/176; a65 = -5103.0/18656;
19 c7 = 1.0; a71 = 35.0/384; a72 = 0.0; a73 = 500.0/1113; a74 = 125.0/192; a75 = -2187.0/6784; a76 = 11.0/84;
20 b1 = 35.0/384; b2 = 0.0; b3 = 500.0/1113; b4 = 125.0/192; b5 = -2187.0/6784; b6 = 11.0/84;
21 d1 = 5179.0/57600; d2 = 0.0; d3 = 7571.0/16695; d4 = 393.0/640; d5 = -92097.0/339200; d6 = 187.0/2100; d7 = 1.0/40;
22}
23
24void OdeDoPri54::step_ (double dt) {
25
26 unsigned long i;
27
28 //------------------------------------------------------------------
29 ode_fun_(sol_, k_[0]);
30
31 //------------------------------------------------------------------
32 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*a21*k_[0][i];
33 ode_fun_(soltemp_, k_[1]);
34
35 //------------------------------------------------------------------
36 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a31*k_[0][i]
37 + a32*k_[1][i]);
38 ode_fun_(soltemp_, k_[2]);
39
40 //------------------------------------------------------------------
41 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a41*k_[0][i]
42 + a42*k_[1][i]
43 + a43*k_[2][i]);
44 ode_fun_(soltemp_, k_[3]);
45
46 //------------------------------------------------------------------
47 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a51*k_[0][i]
48 + a52*k_[1][i]
49 + a53*k_[2][i]
50 + a54*k_[3][i]);
51 ode_fun_(soltemp_, k_[4]);
52
53 //------------------------------------------------------------------
54 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a61*k_[0][i]
55 + a62*k_[1][i]
56 + a63*k_[2][i]
57 + a64*k_[3][i]
58 + a65*k_[4][i]);
59 ode_fun_(soltemp_, k_[5]);
60
61 //------------------------------------------------------------------
62 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a71*k_[0][i]
63 + a72*k_[1][i]
64 + a73*k_[2][i]
65 + a74*k_[3][i]
66 + a75*k_[4][i]
67 + a76*k_[5][i]);
68 ode_fun_(soltemp_, k_[6]);
69
70 //------------------------------------------------------------------
71 for (i=0; i<neq_; i++) {
72 solemb_[i] = sol_[i] + dt*(d1*k_[0][i]
73 + d2*k_[1][i]
74 + d3*k_[2][i]
75 + d4*k_[3][i]
76 + d5*k_[4][i]
77 + d6*k_[5][i]
78 + d7*k_[6][i]);
79 sol_[i] = sol_[i] + dt*(b1*k_[0][i]
80 + b2*k_[1][i]
81 + b3*k_[2][i]
82 + b4*k_[3][i]
83 + b5*k_[4][i]
84 + b6*k_[5][i]);
85 }
86}
87
88} // namespace ode
unsigned long neq_
number of equations in the system of ODEs
Definition ode_base.h:327
std::string method_
the "name" of the solver/method, as in "Euler" or "RK4"
Definition ode_base.h:319
double * sol_
array for the solution, changing over time
Definition ode_base.h:333
void ode_fun_(double *solin, double *fout)
wrapper, calls ode_fun() and increases the neval counter by one
Definition ode_base.cc:87
OdeDoPri54(unsigned long neq)
constructs
Base class providing space for temporary solutions moving through RK stages.
Definition ode_erk.h:9
double * soltemp_
temporary solution vector
Definition ode_erk.h:22
Base clase implementing methods for embedded Runge-Kutta error estimation.
double * solemb_
embedded solution array
Provides space for stage slope values, an array of arrays for k values.
Definition ode_rk.h:9
double ** k_
stage evaluations
Definition ode_rk.h:23