Boost.Numeric.Odeint 步进器的流/保存/序列化内部状态

问题描述

我有一个应用程序,我需要在特定时间(或步数)后中断 ODE 演化,以二进制精度保存系统状态 + ODE 引擎,以便稍后可以恢复演化。如此中断的进化不能与不间断的进化不同,这是一个要求。

保存通常发生在相当长的轨迹结束时,所以应该假设序列化阶段的时间和磁盘使用不是问题。

到目前为止,我使用了 GSL odeiv,将必要的 C 对象包装到一个高级 C++ 对象中,并为后者使用了 Boost.Serialization 库。

我想切换到 Boost.Numeric.Odeint,我希望我不需要自己做任何包装。该库中的步进器通常可以具有内部状态(例如,multistep methods 在内部存储其历史记录的一部分),但是,它们似乎没有实现流操作符或(反)序列化。

#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
#include <boost/serialization/array.hpp>
#include <boost/serialization/serialization.hpp>
#include <iostream>

namespace O = boost::numeric::odeint;

const bool doContinue = true; // this can be a command-line parameter
const size_t N = 3;
typedef boost::array<double,N> state_type;

static void sys(const state_type& /*x*/,state_type& /*dxdt*/,double /*t*/) {
  // ...
}

int main() {
  // adams_bashforth_moulton stepper example
  double t = 0.0,dt = 0.1;
  state_type inout;
  
  O::adams_bashforth_moulton<5,state_type> abm;
  
  if (!doContinue) {
    abm.initialize(sys,inout,t,dt);
    // integrate for some pretty long time
    for( ; t<10.0 ; t+= dt )
      abm.do_step( sys,dt );
    // ...
    // ... save t,and current state of abm to archive ...
    // ...
  }
  else {
    // ...
    // ... retrieve t,and prevIoUs state of abm from archive ...
    // ...
    double tEnd=t+10.;
    // continue integration for another pretty long stretch
    for( ; t<tEnd ; t+= dt )
      abm.do_step( sys,dt );    
  }
}

在 Boost.Numeric.Odeint 中以全精度保存步进器状态的批准方法是什么?

我知道这些类是大量模板化的,内部状态的类型可以取决于模板参数,但可能仍然存在某种检索完整内部状态的机制。模型可能是 STL 中的伪随机生成器引擎(例如 Mersenne twister):它们的模板化程度也很高,但它们提供流操作符来保存/检索其内部结构。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)