diff options
Diffstat (limited to 'torus_symmetries.hpp')
-rw-r--r-- | torus_symmetries.hpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/torus_symmetries.hpp b/torus_symmetries.hpp index 7bcb70b..53f61ac 100644 --- a/torus_symmetries.hpp +++ b/torus_symmetries.hpp @@ -7,6 +7,8 @@ #include "matrix.hpp" #include "vector.hpp" +#include "euclidean.hpp" +#include "transformation.hpp" template <int D> void one_sequences(std::list<std::array<double, D>>& sequences, unsigned level) { if (level > 0) { @@ -98,3 +100,25 @@ template <class U, int D> std::vector<Matrix<U, D>> torus_mats() { return mats; } +template <int D, class S> +Gen<double, D, TorusGroup<double, D>, S> uniformGenTorus(double L) { + std::vector<Vector<double, D>> torusVectors = torus_vecs<double, D>(L); + std::vector<Matrix<double, D>> torusMatrices = torus_mats<double, D>(); + return [L, torusVectors, + torusMatrices](Model<double, D, TorusGroup<double, D>, S>& M, + Rng& r) -> Transformation<double, D, TorusGroup<double, D>, S>* { + Matrix<double, D> m = r.pick(torusMatrices); + + Vector<double, D> t; + for (unsigned i = 0; i < D; i++) { + t(i) = r.uniform<double>(0, L); + } + + TorusGroup<double, D> g = TorusGroup<double, D>({(double)L, t - m * t, m}); + + Spin<double, D, S>* ss = r.pick(M.s); + + return new SpinFlip<double, D, TorusGroup<double, D>, S>(M, g, ss); + }; +} + |