在ODEINT + THRUST观察者中,接收错误表达式必须是可修改的左值

时间:2014-08-20 17:32:31

标签: c++ thrust odeint

我一直致力于扩展/修改推力+ odeint示例[codedocumentation],系统地改变参数,并观察效果。

我有一个奇怪的错误,当我尝试修改某些应该可修改的变量时(并在示例中进行了修改),我收到以下错误。

main.cu: error: expression must be a modifiable lvalue

下面是我尝试运行的观察者结构的源代码,注释显示导致错误的行。

我理解这个错误意味着赋值运算符=左边的表达式不是可修改的值。但它看起来与我在上面的示例源中具有相同名称的变量完全相同(运行正常)。

//// Observes the system to detect if it ever dies during the trial
struct death_observer {

  // CONSTRUCTOR
  death_observer( size_t N, size_t historyBufferLen = 1) 
    : m_N( N ), m_count( 0 ) { }

  template< class State , class Deriv >
  void operator()(State &x , Deriv &dxdt , value_type t ) const
  {
    ++m_count;                                 // <-- This line causes the error.
  }

  // variables
  size_t m_N;   
  size_t m_count;
};

...这里是main()中运行积分器和观察者的代码,以防万一。

  parallel_initial_condition_problem init_con_solver( N_ICS );
  death_observer obs( N_ICS );

  //////////////////////////////// // // integrate   
  typedef runge_kutta_dopri5< state_type , value_type , state_type , value_type, thrust_algebra, thrust_operations > stepper_type;
  const value_type abs_err = 1.0e-6;
  const value_type rel_err = 1.0e-6;

  double t = t_0;
  while( t < t_final ) {
    integrate_adaptive( make_controlled( abs_err, rel_err, stepper_type() ) ,
            init_con_solver ,
            std::make_pair( x.begin() , x.begin() + N_VARS*N_ICS  ),
            t , t + 1.0 , init_dt );
    t += 1.0;
    obs( x, *(&x+N_VARS*N_ICS), t); // not sure about middle arg here, but I don't think it is the cause of the error.
  }

我试图将我的代码削减到最简单的情况。注释掉上面的第3行到最后一行会导致程序正常运行。

我到底在做什么?我的m_count和链接到上面的示例代码中的m_count有什么不同?非常感谢!

1 个答案:

答案 0 :(得分:3)

将评论转换为答案:

template< class State , class Deriv >
void operator()(State &x , Deriv &dxdt , value_type t ) const
{
    ++m_count;                                 // <-- This line causes the error.
}

您将operator()声明为const成员函数,因此除非将成员声明为mutable,否则无法修改类数据成员。

旁注:*(&x+N_VARS*N_ICS)几乎肯定不正确,因为x看起来像是来自.begin()来电的容器。