.. image:: http://hera.physchem.kth.se:9090/api/badges/bjodah/batemaneq/status.svg :target: http://hera.physchem.kth.se:9090/bjodah/batemaneq :alt: Build status .. image:: https://img.shields.io/pypi/v/batemaneq.svg :target: https://pypi.python.org/pypi/batemaneq :alt: PyPI version .. image:: https://img.shields.io/badge/python-2.7,3.4,3.5-blue.svg :target: https://www.python.org/ :alt: Python version .. image:: https://img.shields.io/pypi/l/batemaneq.svg :target: https://github.com/bjodah/batemaneq/blob/master/LICENSE :alt: License .. image:: http://hera.physchem.kth.se/~batemaneq/branches/master/htmlcov/coverage.svg :target: http://hera.physchem.kth.se/~batemaneq/branches/master/htmlcov :alt: coverage
batemaneq
provides a C++ implementation <include/bateman.hpp>
_ of the Bateman equation <https://en.wikipedia.org/wiki/Bateman_Equation>
,
and a Python <http://www.python.org>
bidning thereof.
Autogenerated API documentation is found here: <http://hera.physchem.kth.se/~batemaneq/branches/master/html>
_
Simplest way to install batemaneq and is to use pip
(requires a C++11 compliant compiler to be installed for the C++ version):
::
$ pip install batemaneq
or using the conda package manager <http://conda.pydata.org/docs/>
_:
::
$ conda install -c bjodah batemaneq pytest $ python -m pytest --pyargs batemaneq
See examples/ <https://github.com/bjodah/batemaneq/tree/master/examples>
, and rendered jupyter notebooks here:
<http://hera.physchem.kth.se/~batemaneq/branches/master/examples>
The Thorium series
^^^^^^^^^^^^^^^^^^
Half-lives shorter than 1h excluded from the decay chain <https://en.wikipedia.org/wiki/Decay_chain>
_:
In Python:
.. code:: python
from batemaneq import bateman_parent from math import log as ln d = 1./365 # Th-232 Ra-228 Ac-228 Th-228 h = d/24 # Ra-224 Pb-212 Bi-212 (Pb-208) Thalf = [1.405e10, 5.75, 6.25h, 1.9116, 3.6319d, 10.64h, 60.55/60h] bateman_parent([ln(2)/x for x in Thalf], 100) # 100 years [0.9999999950665681, 4.0925028658312447e-10, 5.078051001187696e-14, 1.3605575316895603e-10, 7.082081172329036e-13, 8.64484883194704e-14, 8.199335787638167e-15]
In C++:
.. code:: C++
using vec_t = std::vector
int main(){ double one = 1; double d = one/365; double h = d/24; double ln2 = std::log(2); vec_t lmbd {{ ln2/1.405e10, ln2/5.75, ln2/(6.25h), ln2/1.9116, ln2/(3.6319d), ln2/(10.64h), ln2/(60.55/60h) }}; auto p = bateman::bateman_parent(lmbd, 100.0, exp_cb); std::cout << std::setprecision(17); // all significant digits for (auto v : p) std::cout << v << " "; std::cout << std::endl; return 0; }
::
$ g++ -std=c++11 double.cpp -I../include $ ./a.out 0.99999999506656811 4.0925028658312447e-10 5.0780510011876959e-14 1.3605575316895603e-10 7.0820811723290359e-13 8.6448488319470398e-14 8.1993357876381666e-15
In C++ using boost::multiprecision::cpp_dec_float_50
:
.. code:: C++
using Real_t = boost::multiprecision::cpp_dec_float_50;
using vec_t = std::vector
int main(){
Real_t one = 1;
Real_t d = one/365;
Real_t h = d/24;
Real_t ln2 = boost::multiprecision::log(2one);
vec_t lmbd {{ ln2/1.405e10, ln2/5.75, ln2/(6.25h),
ln2/1.9116, ln2/(3.6319d), ln2/(10.64h), ln2/(60.55/60*h) }};
auto p = bateman::bateman_parent(lmbd, static_cast
::
$ g++ -std=c++11 multi.cpp -I../include $ ./a.out 0.999999995066568122063002778128 4.09250286583124398565537707859e-10 5.07805100118769662240802082504e-14 1.3605575316895606205575997585e-10 7.08208117232903695657287769184e-13 8.6448488319470425326824303941e-14 8.19933578763816849146541981927e-15
We see that the concentration of the final nuclide only varies in the 15th decimal place (we had no catastropic cancelation in this example).
The source code is Open Source and is released under the very permissive
"simplified (2-clause) BSD license". See LICENSE.txt
for further details.
Contributors are welcome to suggest improvements at https://github.com/bjodah/batemaneq
Björn I. Dahlgren, contact: