From d3b3e39a525d0c3aa9663f824ba96e0c429a8313 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Thu, 26 Jul 2018 00:32:38 -0400 Subject: partially class-ified, ising and On work but potts and height do not --- lib/vector.h | 123 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 57 insertions(+), 66 deletions(-) (limited to 'lib/vector.h') diff --git a/lib/vector.h b/lib/vector.h index 2fe6ab8..d5ced03 100644 --- a/lib/vector.h +++ b/lib/vector.h @@ -3,6 +3,7 @@ #include #include +#include #include "types.h" @@ -24,78 +25,67 @@ */ template -class vector_t { +class vector_t : public std::array { public: - T *x; // M_t needs to hold the sum of nv spins typedef vector_t M_t; // F_t needs to hold the double-weighted sum of spins typedef vector_t F_t; -}; - -template -void init(vector_t *ptr) { - ptr->x = (T *)calloc(q, sizeof(T)); - - // initialize a unit vector - ptr->x[0] = (T)1; -} - -template -void free_spin (vector_t v) { - free(v.x); -} - -template -vector_t copy (vector_t v) { - vector_t v_copy; - - v_copy.x = (T *)calloc(q, sizeof(T)); - for (q_t i = 0; i < q; i++) { - v_copy.x[i] = v.x[i]; - } - - return v_copy; -} - -template -void add(vector_t *v1, V a, vector_t v2) { - for (q_t i = 0; i < q; i++) { - v1->x[i] += (U)(a * v2.x[i]); - } -} - -template -vector_t scalar_multiple(int a, vector_t v) { - vector_t multiple; - multiple.x = (T *)malloc(q * sizeof(T)); - for (q_t i = 0; i < q; i++) { - multiple.x[i] = a * v.x[i]; - } - - return multiple; -} - -template -vector_t scalar_multiple(double a, vector_t v) { - vector_t multiple; - multiple.x = (T *)malloc(q * sizeof(T)); - for (q_t i = 0; i < q; i++) { - multiple.x[i] = a * v.x[i]; - } + vector_t() { + this->fill((T)0); + (*this)[1] = (T)1; + } + + vector_t(const T *x) { + for (q_t i = 0; i < q; i++) { + (*this)[i] = x[i]; + } + } + + template + inline vector_t& operator+=(const vector_t &v) { + for (q_t i = 0; i < q; i++) { + (*this)[i] += (U)v[i]; + } + return *this; + } + + template + inline vector_t& operator-=(const vector_t &v) { + for (q_t i = 0; i < q; i++) { + (*this)[i] -= (U)v[i]; + } + return *this; + } + + inline vector_t operator*(v_t x) const { + vector_t result; + for (q_t i = 0; i < q; i++) { + result[i] = x * (*this)[i]; + } + + return result; + } + + inline vector_t operator*(double x) const { + vector_t result; + for (q_t i = 0; i < q; i++) { + result[i] = x * (*this)[i]; + } + + return result; + } +}; - return multiple; -} -template -double norm_squared (vector_t v) { +template +double norm_squared(vector_t v) { double tmp = 0; - - for (q_t i = 0; i < q; i++) { - tmp += pow(v.x[i], 2); + for (double &x : v) { + tmp += pow(x, 2); } return tmp; @@ -103,7 +93,9 @@ double norm_squared (vector_t v) { template void write_magnetization(vector_t M, FILE *outfile) { - fwrite(M.x, sizeof(T), q, outfile); + for (q_t i = 0; i < q; i++) { + fwrite(&(M[i]), sizeof(T), q, outfile); + } } // below functions and definitions are unnecessary for wolff.h but useful. @@ -111,7 +103,7 @@ void write_magnetization(vector_t M, FILE *outfile) { template // save some space and don't write whole doubles void write_magnetization(vector_t M, FILE *outfile) { for (q_t i = 0; i < q; i++) { - float M_tmp = (float)M.x[i]; + float M_tmp = (float)M[i]; fwrite(&M_tmp, sizeof(float), 1, outfile); } } @@ -121,7 +113,7 @@ T dot(vector_t v1, vector_t v2) { T prod = 0; for (q_t i = 0; i < q; i++) { - prod += v1.x[i] * v2.x[i]; + prod += v1[i] * v2[i]; } return prod; @@ -129,8 +121,7 @@ T dot(vector_t v1, vector_t v2) { template double H_vector(vector_t v1, T *H) { - vector_t H_vec; - H_vec.x = H; + vector_t H_vec(H); return (double)(dot (v1, H_vec)); } -- cgit v1.2.3-70-g09d2