libode
Easy to compile, fast ODE integrators as C++ classes
Loading...
Searching...
No Matches
ode_rk_43.cc
Go to the documentation of this file.
1
2
3#include "ode_rk_43.h"
4
5namespace ode {
6
7OdeRK43::OdeRK43 (unsigned long neq) :
8 OdeEmbedded (neq, false, 3),
9 OdeRK (neq, 5),
10 OdeERK (neq) {
11
12 method_ = "RK43";
13 //tableau of coefficents
14 c2 = 1.0/3; a21 = c2;
15 c3 = 2.0/3; a31 = -1./3; a32 = 1;
16 c4 = 1.0; a41 = 1; a42 = -1; a43 = 1;
17 c5 = 1.0; a51 = 1.0/8; a52 = 3.0/8; a53 = 3.0/8; a54 = 1.0/8;
18 b1 = 1.0/8; b2 = 3.0/8; b3 = 3.0/8; b4 = 1.0/8;
19 d1 = 1./12; d2 = 1./2; d3 = 1.0/4; d5 = 1./6;
20}
21
22void OdeRK43::step_ (double dt) {
23
24 unsigned long i;
25
26 //------------------------------------------------------------------
27 ode_fun_(sol_, k_[0]);
28
29 //------------------------------------------------------------------
30 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*a21*k_[0][i];
31 ode_fun_(soltemp_, k_[1]);
32
33 //------------------------------------------------------------------
34 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a31*k_[0][i]
35 + a32*k_[1][i]);
36 ode_fun_(soltemp_, k_[2]);
37
38 //------------------------------------------------------------------
39 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a41*k_[0][i]
40 + a42*k_[1][i]
41 + a43*k_[2][i]);
42 ode_fun_(soltemp_, k_[3]);
43
44 //------------------------------------------------------------------
45 for (i=0; i<neq_; i++) soltemp_[i] = sol_[i] + dt*(a51*k_[0][i]
46 + a52*k_[1][i]
47 + a53*k_[2][i]
48 + a54*k_[3][i]);
49 ode_fun_(soltemp_, k_[4]);
50
51 //------------------------------------------------------------------
52 for (i=0; i<neq_; i++) {
53 solemb_[i] = sol_[i] + dt*(d1*k_[0][i]
54 + d2*k_[1][i]
55 + d3*k_[2][i]
56 + d5*k_[4][i]);
57 sol_[i] = sol_[i] + dt*(b1*k_[0][i]
58 + b2*k_[1][i]
59 + b3*k_[2][i]
60 + b4*k_[3][i]);
61 }
62}
63
64} // 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
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
OdeRK43(unsigned long neq)
constructs
Definition ode_rk_43.cc:7
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