我目前在我的類中使用gsl_odeiv2方法來解微分方程。但是由於衆所周知的成員函數問題,我無法在類中定義我的ode-system。我目前使用的一種變通方法: 我在一個全局命名空間定義我的頌歌:gsl_odeiv2在c + +類:模板包裝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
}
}
,並使用指針coustom類型(類EOS)作爲參數的對象。內部類解決我的頌歌我使用:
...
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我的系統。這工作正常,但有點混亂,因爲我需要在全局命名空間中聲明我的微分方程。
我知道有可能使用gsl_functions的模板包裝stackoverflow.com/questions/.../how-to-avoid-static-member-function-when-using-gsl-with-c/...在C++類中使用它們。我實際上使用了那裏描述的包裝來爲我的類中的gsl_integration方法定義函數,它完美地工作,並且更簡潔,代碼更少。例如:我可以用我的star_eos從上面direcly對象在函數內部:
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);
我試着寫這樣的INT(雙R,常量雙* PM,模板包裝雙* DPDM,無效* P )函數gsl_odeiv2_system需要,但我失敗了,因爲我是C++的新手,並沒有完全理解它的模板/ static_cast機制。
是否有人將gsl_odeiv方法及其ode系統與模板包裝器一起使用?或者可以有人想出一個模板類似於上面描述的gsl_functions但是int(...)ode。