.. Copyright (c) 2022, Manuel Schrauth, Florian Goth Architectural Overview ======================== MARQOV consists of quite some moving parts and involves a lot of user definable concepts that are defined via their interfaces: .. uml:: marqov.puml In this diagram solid lines are used to denote interfaces that are used, whereas dotted lines are used to denote implementors of interfaces. The parts closest to the user are :doc:`MARQOV::Core ` , which binds everything together, and :doc:`MARQOV::Scheduler ` which enables parallelism and, if multiple simulations are scheduled, parallel tempering between these simulations. :doc:`MARQOV::Core ` can be adapted in various ways. A simple one is the change of the Random Number Generator(RNG) and hence the RNGConcept can be fulfilled by various implementations. We expect them to follow the interface of the C++11 RNGs. See :any:`RNGCache ` for the expected interface. A different RNG can be selected via :doc:`MARQOV::Config ` . Below that we find the concept of an Elementary Monte Carlo Step (EMCS). We have a default implementation but it is fully user customizable. See :doc:`MARQOV::EMCS ` for more. Next come the concept of our moves, the spin-flip metropolis update in :doc:`MARQOV::Metropolis ` and the Wolff cluster update in :doc:`MARQOV::Wolff `. The Wolff update can be further customized using an :doc:`Embedder ` These are the classes that most directly use the concept of a Hamiltonian and a Lattice. An example implementing the concept of a Hamiltonian is e.g. the familiar :doc:`Ising Modell ` modell that implements a very small part of the expected interface and more examples can be found in :doc:`Hamiltonians `. Examples for the various lattices can be found in :doc:`Lattices `. The final concept that of course has to be there are the physical observables. Examples of some reusable default observables can be found in :doc:`Observables ` .