xode.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "xerror.h"
4 #include "xvector.h"
5 #include <array>
6 #include <gsl/gsl_errno.h>
7 #include <gsl/gsl_odeiv2.h>
8 #include <vector>
9 
10 namespace nmx::gsl {
11 
19 template<size_t N, bool HASCALLOP = false, bool JACOBIAN = false>
20 class Odeiv2
21 {
22 public:
23  //Synonym für den Lösungsvektor
24  using Array = std::array<double, N>;
25  //Synonym für Anzahl der Differenzialgleichungen
26  static constexpr size_t DIM = N;
27 
28 private:
29  int _status; //Status gsl-Meldung
30 
31  //gsl-Strukturen zur Definition des DGL-Systems
32  gsl_odeiv2_system odeSystem;
33  //zur Wahl und Anpassung der Schrittweite
34  gsl_odeiv2_driver *odeDriver;
35  //unabhängige Variable z.B. die Zeit
36  double currentTime;
37  //Lösungsvektor
38  Array currentState;
39 
44  template<class T>
45  Odeiv2(T &p)
46  : odeSystem{ nullptr, nullptr, N, static_cast<void *>(&p) }
47  , odeDriver{ nullptr } {
48  if constexpr (!HASCALLOP) {
49  //DGL-System wird über eine Schnittstelle odefn aufgerufen
50  //gsl ruft diese Funktion auf
51  odeSystem.function = [](double t, //
52  const double y[],
53  double f[],
54  void *params) -> int {
55  T *myObj = static_cast<T *>(params);
56  //Objekt muss diese Funktion definieren
57  return myObj->odefn(t, y, f);
58  };
59  } else {
60  //DGL-System wird über ()-Operator aufgerufen
61  //gsl ruft diese Funktion auf
62  odeSystem.function = [](double t, //
63  const double y[],
64  double f[],
65  void *params) -> int {
66  T *myObj = static_cast<T *>(params);
67  //Objekt muss diesen ()-Operator definieren
68  return (*myObj)(t, y, f);
69  };
70  }
71 
72  //Lösung benötigt JACOBI-Matrix
73  if constexpr (JACOBIAN == true) {
74  odeSystem.jacobian = [](double t, //
75  const double y[],
76  double *dfdy,
77  double dfdt[],
78  void *params) {
79  T *myObj = static_cast<T *>(params);
80  return myObj->getJacobian(t, y, *dfdy, dfdt);
81  };
82  }
83  }
84 
93  inline void init(double initstepsize,
94  double abserr,
95  double relerr,
96  const gsl_odeiv2_step_type *steptype = gsl_odeiv2_step_rkf45) {
97  odeDriver = gsl_odeiv2_driver_alloc_y_new(&odeSystem, steptype, initstepsize, abserr, relerr);
98  }
99 
100 public:
109  template<class T>
110  Odeiv2(T &obj,
111  double istepsize,
112  double abserror,
113  double relerror,
114  const gsl_odeiv2_step_type *steptype = gsl_odeiv2_step_rkf45)
115  : Odeiv2(obj) {
116  init(istepsize, abserror, relerror, steptype);
117  }
118 
122  inline ~Odeiv2() {
123  if (odeDriver != nullptr) {
124  gsl_odeiv2_driver_free(odeDriver);
125  }
126  }
127 
133  inline void set_init_conditions(double t, const Array &y) {
134  currentTime = t;
135  currentState = y;
136  }
137 
142  inline void solve(double t) {
143  _status = gsl_odeiv2_driver_apply(odeDriver, &currentTime, t, &currentState[0]);
144 
145  if (_status != GSL_SUCCESS) {
146  throw std::runtime_error(nmx_msgx(std::to_string(_status)));
147  }
148  }
149 
156  inline double operator[](size_t idx) const {
157  if (idx < 0 || idx >= N) {
158  throw std::range_error(nmx_msgx(std::to_string(idx)));
159  }
160  return currentState[idx];
161  }
162 
167  inline constexpr size_t size() const { return N; }
168 };
169 } // namespace nmx::gsl
std::array< double, N > Array
Definition: xode.h:24
void set_init_conditions(double t, const Array &y)
set_init_conditions lege Anfangsbedingungen fest
Definition: xode.h:133
constexpr size_t size() const
size
Definition: xode.h:167
Odeiv2(T &obj, double istepsize, double abserror, double relerror, const gsl_odeiv2_step_type *steptype=gsl_odeiv2_step_rkf45)
Odeiv2 Konstruktor.
Definition: xode.h:110
The Odeiv2 class numerische Lösung eines Systems von N Differenzialgleichungen Schnittstelle zur gsl...
Definition: xode.h:20
void solve(double t)
applyStep berechnet Lösung
Definition: xode.h:142
#define nmx_msgx(msg)
Definition: xerror.h:125
double operator[](size_t idx) const
operator [] Zugriff auf einzelnen Elemente des Lösungsvektors mit Index
Definition: xode.h:156
double f(double x, void *params)
f
Definition: x035.h:15
static constexpr size_t DIM
Definition: xode.h:26