[英]Using Boost.Units and Boost.Multiprecision
我正在嘗試編寫分子動力學程序,我認為Boost.Units是變量的邏輯選擇,並且我還認為,就舍入誤差而言,Boost.Multiprecision提供了比double
或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 MS^-1
。 如果我使用long double
代替mp::mpf_float_50
,則結果為2.87818e-11 ms^-1
。 我知道問題在於常量與其他數據之間的轉換,因為常量默認為double
。 我曾考慮過要創建自己的Boltzmann常數,但是如果可能的話,我更喜歡使用預定義的值。
因此,我的問題是,當我從Boost.Units獲得預定義常量時,如何使用Boost.Multiprecision? 如果必須讓我使用double
或long double
,那么我會這樣做,但是我懷疑存在一種在常量上轉換或利用其他方法的方式。
我正在使用Mac OS X 10.7,Xcode 4.6.2,Clang 3.2,Boost 1.53.0和C ++ 11擴展。
感謝提供的任何幫助。
我建議您不要在分子動力學模擬中使用多精度算法,因為時間步長積分會非常緩慢。 如果目標是盡可能節省總能量,則只需使用Verlet或任何其他辛積分器即可。 但是,多精度算術(或long double
或帶純double
補償求和)對於匯總總體平均值可能很有用。
此外,如果您使用無量綱(精簡)單元編寫仿真代碼,您還將擺脫對Boost.Units的依賴。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.