Kinetics#
Directory: libfly/kinetic
The kinetic folder contains a data-structures and algorithms for choosing mechanisms according to the KMC and Super-KMC algorithms. Everything is contained within the namespace fly::kinetic.
Basins#
File: libfly/kinetic/basin.hpp
Representation of a state in a Markov chain and utilities for discretising states.
-
auto fly::kinetic::hash(Eigen::Index num_atoms, fly::env::Catalogue const &cat) -> std::size_t#
Compute a hash encoding the ID’s of the local environments of each atom loaded into the catalogue.
- Parameters:
num_atoms – Number of atoms loaded into the catalogue.
cat – A catalogue in the ready state.
-
class Basin#
Represents a basin of the potential energy of the entire system.
Stores a reference image of the system and a list of all mechanisms accessible from the basin. Implements standard KMC algorithm on this list. Stored Mechanisms are pointers into a Catalogue.
Public Functions
-
Basin(Options const &opt, system::SoA<Position const&> state, fly::env::Catalogue const &cat)#
Construct a new Basin.
- Parameters:
opt – The options for this Basin.
state – The state of the system.
cat – A catalogue in the ready state for this system.
-
auto kmc_choice(Xoshiro &psudo_rng) const -> Choice#
Choose a mechanisms in the basin using standard n-fold-way kmc algorithm.
-
auto most_likely(double tol) -> std::vector<Choice>#
Fetch every mechanisms that is accessible that with a probability greater than
tol.
-
inline auto rate_sum() const noexcept -> double#
Fetch the sum of the rates of all mechanisms from this basin.
-
class Choice#
A result type to indicate a randomly selected mechanism in a basin/superbasin.
-
Basin(Options const &opt, system::SoA<Position const&> state, fly::env::Catalogue const &cat)#
Superbasins#
File: libfly/kinetic/superbasin.hpp
Representation of a collection of basins.
-
class SuperBasin#
Manages a superbasin: a collection of low-barrier-linked basins.
This implements a variation of bac-MRM, the basin auto-constructing mean rate method, to analytically accelerate KMC. This solves the “low-barrier problem” for small numbers (< a few hundred) of flickering states.
Public Functions
-
inline SuperBasin(Options const &opt, Basin &&basin)#
Construct a new SuperBasin object containing a single basin.
-
auto connect_from(std::size_t basin, int atom, env::Mechanism const &m) -> void#
Connect mechanism
mechfrom basinbasinto the currently occupied basin.This marks
mechas an internal, transient mechanism and fills in the internal transition probability matrix.- Parameters:
basin – The index of the basin which the mechanism starts from.
atom – The index of the atom which the mechanism is centred on.
m – The mechanism that connect
basinto the currently occupied basin.
-
inline auto expand_occupy(Basin &&basin) -> std::size_t#
Expand the SuperBasin by adding
basinto it and settingbasinas the currently occupied basin.- Parameters:
basin – The basin to add to the SuperBasin.
- Returns:
Returns the previously occupied basin’s index.
-
auto find_occupy(std::size_t hash, system::SoA<Position const&> in, double tol) -> std::optional<std::size_t>#
Find and occupy a basin in the SuperBasin whose state matches
in.Searches through the basins in the superbasin, if one is found that matches (all active atoms within L2 tolerance
tol) make it the occupied basin.- Parameters:
hash – Of
inas computed byfly::kinetic::hash().in – The input state.
tol – The L2 tolerance between
inand a basin state for them to be considered “the same”.
- Returns:
Returns the previously occupied basin’s index or
std::nulloptif no match is found.
-
auto kmc_choice(Xoshiro &pseudo_rng) const -> Choice#
Choose a mechanism using the modified mean-rate-method.
This will pick a non-transient mechanism, e.g. a mechanisms that “escapes” the superbasin (although it may be an internal mechanisms that has not been traversed yet).
Note
The mechanism may start from a basin that the system is not currently in.
- Parameters:
pseudo_rng – The pseudo random number generator to use.
-
inline auto size() const -> std::size_t#
Get the number of basins in the SuperBasin.
-
class Choice#
A result type to indicate a randomly selected mechanism in a basin/superbasin.
-
struct Options#
Configure the
SuperBasinclass.Public Members
-
bool debug = false#
Controls printing of debugging data.
-
bool debug = false#
-
inline SuperBasin(Options const &opt, Basin &&basin)#
Super(super)basins#
File: libfly/kinetic/cache.hpp
Representation of a collection of basins.
-
class SuperCache#
Manages a collection of superbasins.
A SuperCache dynamically manages a collection of superbasin to remove the overhead of exploring/building a superbasin. The is particularly useful when superbasins are frequently re-entered upon exit.
Public Functions
-
inline SuperCache(Options const &opt, SuperBasin &&sb)#
Construct a new SuperCache object initialised with a single superbasin.
- Parameters:
opt – The options for this SuperCache.
sb – The initial superbasin.
-
void connect_from(std::size_t basin, int atom, env::Mechanism const &mech, system::SoA<Position const&> cell, env::Catalogue const &cat)#
Manages the internal superbasins.
Identifies which (if any) basin
cellmatches, makes that basins’s superbasin the active superbasin and then connects the mechanismmechwithfly::kinetic::SuperBasin::connect_from()if this was a low barrier mechanism.- Parameters:
basin – The index of the basin which the mechanism starts from in the active superbasin.
atom – The index of the atom which the mechanism is centred on.
mech – The mechanism that was chosen.
cell – The system after reconstructing
mechonto the previous state.cat – The catalogue in the ready state (i.e. called
cat.rebuild()with argumentcell).
-
inline auto kmc_choice(Xoshiro &psudo_rng) const -> SuperBasin::Choice#
Forward the call to the active superbasin’s
fly::kinetic::SuperBasin::kmc_choice().
-
inline void reset(SuperBasin &&sb)#
Reset the cache to contain only a single superbasin
sb.
-
inline std::size_t size() const noexcept#
Get the number of superbasins in the SuperCache.
-
struct Options#
Configure the
SuperCacheclass.Public Members
-
double barrier_tol = 0.3#
Tolerance for mechanisms to be considered high-barrier.
-
std::size_t cache_size = 128#
Max number of SuperBasins in the cache.
-
bool debug = false#
Controls debug printing.
-
bool debug_pause = false#
If true waits for input when
barrier_tolis adjusted.
-
bool dynamic_tol = true#
If true
barrier_tolis dynamically adjusted.
-
std::size_t max_superbasin_size = 256#
Maximum number basins in SB before
tol_shrink.
-
Basin::Options opt_basin = {}#
Basin::Options options.
-
SuperBasin::Options opt_sb = {}#
SuperBasin::Options options.
-
double state_tol = 0.1#
L2 norm between atoms for basins to be considered the same.
-
double tol_grow = 1.5#
Multiplier by which
barrier_tolincreases by.
-
double tol_shrink = 0.5#
Multiplier by which
barrier_toldecreases by.
-
double barrier_tol = 0.3#
-
inline SuperCache(Options const &opt, SuperBasin &&sb)#
Super kinetic Monte Carlo#
File: libfly/kinetic/skmc.hpp
Objects that coordinate and run an OLKMC simulation.
-
class SKMC#
Coordinate the running of an OLKMC simulation.
Public Functions
-
inline SKMC(Options const &opt, system::Box const &box, system::TypeMap<Mass> const &map, minimise::LBFGS const &min, potential::Generic const &pot, saddle::Dimer const &dimer)#
Construct a new SKMC object.
- Parameters:
opt – The configuration options.
box – The simulation box that the simulation is contained within.
map – The type map for the simulation.
min – The minimiser, used for minimisation during saddle-point searches and for relaxing the cell.
pot – Potential energy function.
dimer – For saddle-point searches.
-
template<typename Map, typename ...T, typename F>
auto skmc(system::Supercell<Map, T...> const &cell, int num_threads, F const &f) -> void# Run an OLKMC simulation starting with ‘’cell’’.
Example:
#include "libfly/kinetic/skmc.hpp" using namespace fly; void example_skmc(system::Supercell<system::TypeMap<Mass>, Position, Frozen> cell, potential::Generic potential_func) { // Construct am SKMC object with some non-default options. kinetic::SKMC runner = { { .debug = true, .opt_cache = { .debug = true, .opt_basin = { .debug = true, .temp = 500, ///< Set the temperature of the simulation }, .opt_sb = { .debug = true, }, }, .opt_master = {}, }, cell.box(), cell.map(), { {}, cell.box() }, potential_func, { {}, {}, cell.box() }, }; // Run an OLKMC simulation using the runner object. runner.skmc(cell, omp_get_max_threads(), [&](double time, ///< Total time just after system at post. system::SoA<Position const &> pre, ///< State just before mech applied. double E0, ///< Energy of the system in state pre. int atom, ///< Index of central atom of mechanism. env::Mechanism const &mech, ///< Chosen mechanism. system::SoA<Position const &> post, ///< Final state of system after this iteration/mech. double Ef ///< Energy of system in state post. ) { // Called every step of the simulation. // Can output pre/post do processing etc. // Return true to stop and false to continue simulation. return false; }); }
- Parameters:
cell – The initial state of the simulation.
num_threads – The number of (openMP) threads to use.
f – The callback which determines the stopping criterion, see example above/below.
-
inline SKMC(Options const &opt, system::Box const &box, system::TypeMap<Mass> const &map, minimise::LBFGS const &min, potential::Generic const &pot, saddle::Dimer const &dimer)#