SOLIDstate
A C++ library for solid state physics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Pages
RungeKutta4.hpp
Go to the documentation of this file.
1 
11 #ifndef QUANTUMDYNAMICS_SOLVERS_RUNGEKUTTA4_HPP
12 #define QUANTUMDYNAMICS_SOLVERS_RUNGEKUTTA4_HPP
13 #include <armadillo>
14 
15 #include "../QuantumDynamics.hpp"
16 #include "QuantumDynamicSolver.hpp"
17 
18 namespace solid
19 {
20 
34 template <template <typename> class T1, typename T2, typename T3>
35 class RK4 : public IQuantumDynamicSolver<T1, T2, T3>
36 {
37 public:
38 
42  inline static constexpr auto label = "rk4";
43 
49  std::string getLabel() override
50  {
51  return label;
52  }
53 
61  void Propagate(double time, double dtime, QuantumDynamics<T1, T2, T3> &qDynamics)
62  {
63 
64  arma::cx_double I(0, 1);
65  arma::cx_vec k1, k2, k3, k4;
66 
67  qDynamics.quantumSystem.Fill();
68  k1 = -I * dtime * qDynamics.quantumSystem.hamiltonian.matrixElements * qDynamics.quantumState.vector;
69  time += 0.5 * dtime;
70  qDynamics.LoadParameters();
71  qDynamics.quantumSystem.Fill();
72  k2 = -I * dtime * qDynamics.quantumSystem.hamiltonian.matrixElements * (qDynamics.quantumState.vector + 0.5 * k1);
73  k3 = -I * dtime * qDynamics.quantumSystem.hamiltonian.matrixElements * (qDynamics.quantumState.vector + 0.5 * k2);
74  time += 0.5 * dtime;
75  qDynamics.LoadParameters();
76  qDynamics.quantumSystem.Fill();
77  k4 = -I * dtime * qDynamics.quantumSystem.hamiltonian.matrixElements * (qDynamics.quantumState.vector + k3);
78  qDynamics.quantumState.vector += 1. / 6. * (k1 + 2 * k2 + 2 * k3 + k4);
79  }
80 };
81 
82 } // namespace solid
83 
84 #endif
Runge–Kutta forth order method (RK4) for solving differentional equations.
Definition: RungeKutta4.hpp:35
static constexpr auto label
label, default = "rk4"
Definition: RungeKutta4.hpp:42
Quantum Dynamics class.
Definition: QuantumDynamics.hpp:40
QuantumSystem< T1, T2 > quantumSystem
Definition: QuantumDynamics.hpp:103
QuantumDynamicSolver interface header.
void LoadParameters()
Loads the parameters with respect to time.
Definition: QuantumDynamics.cpp:9
arma::Col< T > vector
container of the QuantumState
Definition: QuantumState.hpp:36
Quantum Dynamic Solver interface.
Definition: QuantumDynamicSolver.hpp:35
std::string getLabel() override
Get the Label object (IQuantumDynamicSolver override)
Definition: RungeKutta4.hpp:49
void Propagate(double time, double dtime, QuantumDynamics< T1, T2, T3 > &qDynamics)
Propagate the state (IQuantumDynamicSolver override)
Definition: RungeKutta4.hpp:61
QuantumState< T3 > quantumState
Definition: QuantumDynamics.hpp:102