diff options
Diffstat (limited to 'euclidean.hpp')
-rw-r--r-- | euclidean.hpp | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/euclidean.hpp b/euclidean.hpp index b1ce2c6..fb2dbcd 100644 --- a/euclidean.hpp +++ b/euclidean.hpp @@ -5,6 +5,15 @@ #include "spin.hpp" #include "vector.hpp" +typedef double Radius; +typedef signed IsingSpin; + +template <class T, int D> class Dimer { +public: + double radius; + Vector<T, D> relativePosition; +}; + template <class T, int D> class Euclidean { public: Vector<T, D> t; @@ -25,36 +34,27 @@ public: r = r0; } - Vector<T, D> act(const Vector<T, D>& x) const { - return t + r * x; - } - - template <class S> Spin<T, D, S> act(const Spin<T, D, S>& s) const { - Spin<T, D, S> s_new; - - s_new.x = this->act(s.x); - s_new.s = s.s; + Vector<T, D> act(const Vector<T, D>& x) const { return t + r * x; } - return s_new; + template <typename U> Vector<U, D> act(const Vector<U, D>& x) const { + return t.template cast<U>() + r.template cast<U>() * x; } - Euclidean act(const Euclidean& x) const { - Vector<T, D> tnew = r * x.t + t; - Matrix<T, D> rnew = r * x.r; + Radius act(Radius r) const { return r; } - Euclidean pnew(tnew, rnew); + IsingSpin act(IsingSpin s) const { return s; } - return pnew; + Dimer<T, D> act(const Dimer<T, D>& d) const { + return {.radius = d.radius, .relativePosition = r * d.relativePosition}; } - Euclidean inverse() const { - Vector<T, D> tnew = -r.transpose() * t; - Matrix<T, D> rnew = r.transpose(); + template <class S> Spin<T, D, S> act(const Spin<T, D, S>& s) const { + return {.x = act(s.x), .s = act(s.s)}; + } - Euclidean pnew(tnew, rnew); + Euclidean act(const Euclidean& x) const { return Euclidean(r * x.t + t, r * x.r); } - return pnew; - } + Euclidean inverse() const { return Euclidean(-r.transpose() * t, r.transpose()); } }; template <class T, int D> class TorusGroup { @@ -105,6 +105,16 @@ public: return s_new; } + template <typename U> Vector<U, D> act(const Vector<U, D>& s) const { + Vector<U, D> s_new = t.template cast<U>() + r.template cast<U>() * s; + + for (unsigned i = 0; i < D; i++) { + s_new(i) = fmod(L + s_new(i), L); + } + + return s_new; + } + TorusGroup act(const TorusGroup& x) const { Vector<T, D> tnew = r * x.t + t; Matrix<T, D> rnew = r * x.r; |