在成员类中调用boost :: odeint

时间:2016-04-23 23:43:33

标签: c++ class boost odeint

这是我一直在努力的个人项目,我无法弄清楚这里发生了什么(只是学习C ++)。我找到了非常类似问题的答案,但我似乎无法执行解决方案。这是我的代码,其中一些不重要的位被修剪掉了:

#include <iostream>
#include <cmath>
#include <complex>
#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
#include <gsl/gsl_roots.h>

class Riemann
{
public:
    // constructor
    Riemann(double leftP, double rightP, double leftrho, double rightrho, \
        double leftvx, double rightvx, double leftvy, double rightvy, double gam);

    double PL,PR,rhoL,rhoR,vxL,vxR,vyL,vyR,gamma;

    // function prototypes
    double shockvelocity(double Pg, int sign);
    double rarefactionvelocity(double Pg, int sign);
    void RfODE(const boost::array<double,6> &vrhovt, \
        boost::array<double,6> &dvrhovtdp, double t);

//  ~Riemann();
};

Riemann::Riemann(double leftP, double rightP, double leftrho, double rightrho, \
        double leftvx, double rightvx, double leftvy, double rightvy, double gam){
    // constructs Riemann public variables
}

double Riemann::shockvelocity(double Pg,int sign){
    // calculate a shock velocity, not important here...
}



void Riemann::RfODE(const boost::array<double,6> &vrhovt, \
    boost::array<double,6> &dvrhovtdp, double t){
    // calculates the ODE I want to solve

}

double Riemann::rarefactionvelocity(double Pg, int sign){
    double dpsize=0.00001;
    double P,rho,vx,vy,vtest;
    //
    boost::array<double,6> vrhovt = {vx,rho,vy,double(sign),P,gamma}; // initial conditions
    boost::numeric::odeint::integrate(std::bind(&Riemann::RfODE,std::ref(*this),std::placeholders::_1, 
        std::placeholders::_2, std::placeholders::_3),vrhovt,P,Pg,dpsize);
    std::cout<<"vRarefaction="<<vrhovt[0]<<std::endl;
    return vrhovt[0];
}

double FRiemann(double Pg, void* Riemannvalues){
    Riemann* Rvals = (Riemann*)Riemannvalues;
    // calls on Riemann::rarefactionvelocity at some point
}


int main(){
    double PL= 1000.0;
    double PR= 0.01;
    double rhoL= 1.0;
    double rhoR= 1.0;
    double vxL= 0.0;
    double vxR= 0.0;
    double vyL= 0.0;
    double vyR= 0.0;
    double gam = 5.0/3.0;

    // calls FRiemann to get a root

}

代码正在发生什么,调用Riemann :: rarefactionvelocity就好了,但由于某种原因RfODE永远不会被执行(例如,此函数中的print语句永远不会执行)和vrhovt的值[0返回当然是它开始的价值,vx。没有编译器错误(使用gcc 4.8.1和-std = c ++ 11和-O2标签)这很奇怪,因为我已经自己测试了稀疏特定的功能(在Riemann类之外)他们的工作 - 问题似乎是他们在这堂课上。考虑到黎曼解算器的工作原理,我有理由用这些函数创建一个类,并且真的想找到一种方法来完成这项工作而不需要进行大量的重写并改变类结构。

非常感谢任何帮助!谢谢! :)

1 个答案:

答案 0 :(得分:0)

P可能未正确初始化。至少我在你的代码中没有看到它。 P需要小于PG,否则您已经落后于整合。

另外,不要使用bind,而是使用lambda。我认为在C ++ 11 / C ++ 14中,bind在某种程度上已经过时了。有可能bind没有使引用正确。

double Riemann::rarefactionvelocity(double Pg, int sign)
{
    // ...

    // not tested
    using namspace boost::numeric::odeint;
    integrate( [this](auto const& x, auto &dxdt ,auto t ) {
        this->RfODE(x, dt, t); } ,vrhovt,P,Pg,dpsize);
}