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