#pragma once #include #include #include "types.h" /* The following is the minimum definition of a spin class. * * The class must contain an M_t and an F_t for holding the sum of an * integer number of spins and a double-weighted number of spins, * respectively. * * void init(X_t *p); * void free_spin(X_t p); * void free_spin(M_t p); * void free_spin(F_t p); * X_t copy(X_t x); * void add(M_t *x1, int factor, X_t x2); * void add(F_t *x1, double factor, X_t x2); * M_t scalar_multiple(int factor, X_t x); * F_t scalar_multiple(double factor, X_t x); * double norm_squared(F_t x); * void write_magnetization(M_t M, FILE *outfile); * */ template class potts_t { public: q_t x; typedef int *M_t; typedef double *F_t; }; template void init(potts_t *p) { p->x = 0; } template void free_spin(potts_t s) { // do nothing! } void free_spin(int *s) { free(s); } void free_spin(double *s) { free(s); } template potts_t copy(potts_t s) { return s; } template void add(typename potts_t::M_t *s1, int a, potts_t s2) { (*s1)[s2.x] += a; } template void add(typename potts_t::F_t *s1, double a, potts_t s2) { (*s1)[s2.x] += a; } template typename potts_t::M_t scalar_multiple(int factor, potts_t s) { int *M = (int *)calloc(q, sizeof(int)); M[s.x] += factor; return M; } template typename potts_t::F_t scalar_multiple(double factor, potts_t s) { double *F = (double *)calloc(q, sizeof(double)); F[s.x] += factor; return F; } template double norm_squared(typename potts_t::F_t s) { double total = 0; for (q_t i = 0; i < q; i++) { total += pow(s[i], 2); } return total * (double)q / ((double)q - 1.0); } template void write_magnetization(typename potts_t::M_t M, FILE *outfile) { fwrite(&M, sizeof(int), q, outfile); }