Proto
Proto_RK4.H
1 #ifndef _PROTO_RK4_H_
2 #define _PROTO_RK4_H_
3 
4 namespace Proto {
5 
7 
55 template <class X, class F, class dX>
56 class RK4
57 {
58 public:
59  //Compute y_{t+1} at time a_time and with y_t=a_state, and place it in a_state.
60  void advance(double& a_time, double& a_dt, X& a_state);
61 protected:
62  dX m_k;
63  dX m_delta;
64  F m_f;
65 };
66 
67 template <class X, class F, class dX>
68 void RK4<X, F, dX>::advance(double& a_time, double& a_dt, X& a_state)
69 {
70  double sixth = 1, third=1, half = 1;
71  sixth/=6; third/=3; half/=2;
72 
73  m_delta.init(a_state);
74  m_k.init(a_state); // init must allocate stroage, and initialize it to zero.
75  m_f(m_k, a_time, a_dt, a_state); // compute k1
76  m_delta.increment(sixth, m_k);
77  m_k*=half;
78  m_f(m_k, a_time+half*a_dt, a_dt, a_state); // compute k2
79  m_delta.increment(third, m_k);
80  m_k*=half;
81  m_f(m_k, a_time+half*a_dt, a_dt, a_state); // conpute k3
82  m_delta.increment(third, m_k);
83  m_f(m_k, a_time+a_dt, a_dt, a_state); // compute k4
84  m_delta.increment(sixth, m_k);
85  a_state.increment(m_delta);
86 }
87 
88 } //end Proto namespace
89 
90 #endif //end include guard
Definition: Proto_Box.H:11
Generic Explicit RK4 Algorithm.
Definition: Proto_RK4.H:56