https://github.com/bjodah/batemaneq
The Bateman equation in C++ and a Python wrapper thereof.
https://github.com/bjodah/batemaneq
analytic arbitrary-precision decay
Last synced: about 1 year ago
JSON representation
The Bateman equation in C++ and a Python wrapper thereof.
- Host: GitHub
- URL: https://github.com/bjodah/batemaneq
- Owner: bjodah
- License: bsd-2-clause
- Created: 2015-08-24T21:33:38.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2020-03-09T21:53:52.000Z (over 6 years ago)
- Last Synced: 2025-03-25T13:46:01.813Z (about 1 year ago)
- Topics: analytic, arbitrary-precision, decay
- Language: Python
- Size: 6.49 MB
- Stars: 4
- Watchers: 3
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGES.rst
- License: LICENSE
Awesome Lists containing this project
README
batemaneq
=========
.. 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 `_ of the `Bateman equation `_,
and a `Python `_ bidning thereof.
Documentation
-------------
Autogenerated API documentation is found here: ``_
Installation
------------
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 `_:
::
$ conda install -c bjodah batemaneq pytest
$ python -m pytest --pyargs batemaneq
Examples
--------
See `examples/ `_, and rendered jupyter notebooks here:
``_
The Thorium series
^^^^^^^^^^^^^^^^^^
Half-lives shorter than 1h excluded from the `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.25*h, 1.9116, 3.6319*d, 10.64*h, 60.55/60*h]
>>> 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++
#include
#include
#include
#include
#include "bateman.hpp"
using vec_t = std::vector;
double exp_cb(double arg){
return std::exp(arg);
}
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.25*h),
ln2/1.9116, ln2/(3.6319*d), ln2/(10.64*h), ln2/(60.55/60*h) }};
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++
#include
#include
#include
#include
#include "bateman.hpp"
using Real_t = boost::multiprecision::cpp_dec_float_50;
using vec_t = std::vector;
Real_t exp_cb(Real_t arg){
return boost::multiprecision::exp(arg);
}
int main(){
Real_t one = 1;
Real_t d = one/365;
Real_t h = d/24;
Real_t ln2 = boost::multiprecision::log(2*one);
vec_t lmbd {{ ln2/1.405e10, ln2/5.75, ln2/(6.25*h),
ln2/1.9116, ln2/(3.6319*d), ln2/(10.64*h), ln2/(60.55/60*h) }};
auto p = bateman::bateman_parent(lmbd, static_cast(100), exp_cb);
std::cout << std::setprecision(30); // show 30 of our 50 digits
for (auto v : p)
std::cout << v << " ";
std::cout << std::endl;
return 0;
}
::
$ 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).
License
=======
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
Author
======
Björn I. Dahlgren, contact:
- gmail address: bjodah