lcpp-org / RustBCA

A free, open-source Binary Collision Approximation (BCA) code for ion-material interactions including sputtering, implantation, and reflection
https://github.com/lcpp-org/RustBCA/wiki
GNU General Public License v3.0
40 stars 13 forks source link

[feature] rare event algorithm #119

Closed drobnyjt closed 2 years ago

drobnyjt commented 3 years ago

Is your feature request related to a problem? Please describe. A topic that has come up more than once in internal group discussions about the BCA is importance sampling. For example, if one is simulating near-threshold sputtering, nearly all of the incident ions will immediately be non-candidates for producing sputtered atoms. In one sense, this already exists in the BCA in the form of adjustable cutoff energies; if one sets the cutoff energy of atoms in the simulation to the surface binding energy of the atoms, then this will significantly reduce computational time. However, this does not take into account geometry, nor does it handle events such as displacements or tails of the implantation distribution.

Proposed solution This paper proposes an atom splitting technique: https://scholar.archive.org/search?q=key:work_ygv27aypgveerj6vhdznejdc4q

This Python library could be used as an external wrapper to single_ion_bca() (if the appropriate Python bindings can be generated for RustBCA) that, with a stochastic learner, handle importance sampling implicitly: https://adaptive.readthedocs.io/en/latest/

Alternative solution(s) Before this is implemented, the cost of development must be weighed against the benefits.

drobnyjt commented 2 years ago

I've tried adaptive and, although there are some inconveniences with its use (it is really intended to be used in a notebook, it uses a relatively obscure plotting library (holoviews)...) it seems to be the best way forward. In any situation where it might be useful otherwise, the tradeoff in terms of development time for saved computer power does not seem worth it.