From 1da9ba0af64dd1ff07c9fda6226689b4e8701e43 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Tue, 25 Feb 2020 15:23:41 -0500 Subject: Minor refactoring of sphere commands and animation class, and introduction of Dimers --- euclidean.hpp | 52 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'euclidean.hpp') 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 Dimer { +public: + double radius; + Vector relativePosition; +}; + template class Euclidean { public: Vector t; @@ -25,36 +34,27 @@ public: r = r0; } - Vector act(const Vector& x) const { - return t + r * x; - } - - template Spin act(const Spin& s) const { - Spin s_new; - - s_new.x = this->act(s.x); - s_new.s = s.s; + Vector act(const Vector& x) const { return t + r * x; } - return s_new; + template Vector act(const Vector& x) const { + return t.template cast() + r.template cast() * x; } - Euclidean act(const Euclidean& x) const { - Vector tnew = r * x.t + t; - Matrix 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 act(const Dimer& d) const { + return {.radius = d.radius, .relativePosition = r * d.relativePosition}; } - Euclidean inverse() const { - Vector tnew = -r.transpose() * t; - Matrix rnew = r.transpose(); + template Spin act(const Spin& 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 TorusGroup { @@ -105,6 +105,16 @@ public: return s_new; } + template Vector act(const Vector& s) const { + Vector s_new = t.template cast() + r.template cast() * 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 tnew = r * x.t + t; Matrix rnew = r * x.r; -- cgit v1.2.3-54-g00ecf