我正在尝试编写分子动力学程序,我认为Boost.Units是变量的逻辑选择,我还认为Boost.Multiprecision提供了比double
或{{1更好的选项关于舍入错误。在我尝试使用常量之前,两者的组合似乎相当直接,然后它就会崩溃。
long double
输出为#include <boost/multiprecision/gmp.hpp>
#include <boost/units/io.hpp>
#include <boost/units/pow.hpp>
#include <boost/units/quantity.hpp>
#include <boost/units/systems/si.hpp>
#include <boost/units/systems/si/codata/physico-chemical_constants.hpp>
namespace units = boost::units;
namespace si = boost::si;
namespace mp = boost::multiprecision;
units::quantity<si::mass, mp::mpf_float_50> mass = 1.0 * si::kilogram;
units::quantity<si::temperature, mp::mpf_float_50> temperature = 300. * si::kelvin;
auto k_B = si::constants::codata::k_B; // Boltzmann constant
units::quantity<si::velocity, mp::mpf_float_50> velocity = units::root<2>(temperature * k_B / mass);
std::cout << velocity << std::endl;
。如果我使用1 M S^-1
代替long double
,则结果为mp::mpf_float_50
。我知道问题在常量和其他数据之间的转换中是喜欢的,因为常量默认为2.87818e-11 m s^-1
。我考虑过创建自己的Boltzmann常数,但如果可能的话,我更喜欢使用预定义的值。
因此,我的问题是,当我从Boost.Units预定义常量时,如何使用Boost.Multiprecision?如果我必须承认使用double
或double
,那么我会,但我怀疑有一种方法可以转换或利用另一个常量。
我正在使用Mac OS X 10.7,Xcode 4.6.2,Clang 3.2,Boost 1.53.0和C ++ 11扩展。
感谢您提供的任何帮助。
答案 0 :(得分:1)
我建议你不要使用多个精确算法进行分子动力学模拟,因为时间步长积分会非常缓慢。如果目标是尽可能地保留总能量,那么只需使用Verlet或任何其他辛积分器。但是,多精度算术(或long double
或带有普通double
的补偿求和)可用于聚合整体平均值。
此外,如果你使用无量纲(简化)单位编写模拟代码,你也将摆脱对Boost.Units的依赖。