summaryrefslogtreecommitdiff
path: root/torus_symmetries.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'torus_symmetries.hpp')
-rw-r--r--torus_symmetries.hpp24
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);
+ };
+}
+