Ich verwende derzeit gsl_odeiv2 Methoden innerhalb meiner Klassen, um Differentialgleichungen zu lösen. Aber wegen des bekannten Memberfunktionsproblems kann ich mein Ode-System nicht innerhalb der Klasse definieren. Ich bin derzeit eine Abhilfe: definiere ich meine Ode in einem globalen Namensraum:gsl_odeiv2 in C++ - Klasse: Template Wrapper für int (...) ode
ODE.hpp:
#include "EoS.hpp"
#include <gsl/gsl_math.h>
#include <gsl/gsl_errno.h>
namespace ODEs
{
struct tov_eq_params {EoS *eos;};
int tov_eq(double, const double *, double *, void *);
}
ODE.cpp:
namespace ODEs {
int tov_eq(double r, const double *PM, double *dPdM, void *p) {
struct tov_eq_params * params = (struct tov_eq_params *)p;
EoS *eos = (params->eos);
...
return GSL_SUCCESS
}
}
und einen Zeiger auf ein Objekt eines coustom Typs (Klasse EoS) als Parameter verwenden. Innerhalb der Klasse, die die Ode ich löst:
...
struct tov_eq_params comp_tov_params = {(this->star_eos)};
gsl_odeiv2_evolve *comp_tov_evolve = gsl_odeiv2_evolve_alloc(3);
gsl_odeiv2_system comp_tov_system = {tov_eq, NULL, 3,&comp_tov_params};
...
initalise mein System. Das funktioniert gut, ist aber ein bisschen unordentlich, weil ich meine Differentialgleichungen in einem globalen Namensraum deklarieren muss.
Ich weiß, dass es möglich ist, Vorlage Wrapper für gsl_functions stackoverflow.com/questions/.../how-to-avoid-static-member-function-when-using-gsl-with-c/... zu verwenden, um sie in C++ - Klassen zu verwenden. Ich benutze den Wrapper, der dort beschrieben wird, um Funktionen für gsl_integration Methoden innerhalb meiner Klassen zu definieren und es funktioniert perfekt und ist viel sauberer und weniger Code zum schreiben. Zum Beispiel: Ich kann meine star_eos innerhalb der Funktion von oben direcly Objekt verwenden:
auto dBf = [=](double r)->double{
return 4 * M_PI * gsl_pow_2(r) * (this->star_eos)->nbar(this->P(r)) * sqrt(this->expLambda(r))* 1e54;
};
gsl_function_pp<decltype(dBf)> dBfp(dBf);
gsl_function *dB = static_cast<gsl_function*>(&dBfp);
Ich habe versucht, eine solche Vorlage Wrapper für die int (double r, const double * PM, double * DPDM, void * zu schreiben p) Funktionen, die gsl_odeiv2_system benötigt, aber ich scheiterte, weil ich neu in C++ bin und die Mechanismen template/static_cast nicht vollständig verstanden habe.
Gibt es jemanden, der gsl_odeiv-Methoden und seine Ode-Systeme mit einem Template-Wrapper verwendet? Oder kann jemand eine Vorlage ähnlich der oben für gsl_functions beschriebenen aber für die int (...) ode.