微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?