summaryrefslogtreecommitdiff
path: root/lib/cluster.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cluster.h')
-rw-r--r--lib/cluster.h177
1 files changed, 1 insertions, 176 deletions
diff --git a/lib/cluster.h b/lib/cluster.h
index 29dd0cb..a20912e 100644
--- a/lib/cluster.h
+++ b/lib/cluster.h
@@ -20,6 +20,7 @@
#include "graph.h"
#include "tree.h"
#include "measurement.h"
+#include "vector.h"
#include "orthogonal.h"
#include "dihedral.h"
#include "dihinf.h"
@@ -95,182 +96,6 @@ class state_t {
}
};
-template <q_t q, class T>
-struct vector_t { T *x; };
-
-template <q_t q, class T>
-void init(vector_t <q, T> *ptr) {
- ptr->x = (T *)calloc(q, sizeof(T));
-
- ptr->x[0] = (T)1;
-}
-
-template <q_t q, class T>
-vector_t <q, T> copy (vector_t <q, T> v) {
- vector_t <q, 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 <q_t q, class T>
-void add (vector_t <q, T> v1, vector_t <q, T> v2) {
- for (q_t i = 0; i < q; i++) {
- v1.x[i] += v2.x[i];
- }
-}
-
-template <q_t q, class T>
-void subtract (vector_t <q, T> v1, vector_t <q, T> v2) {
- for (q_t i = 0; i < q; i++) {
- v1.x[i] -= v2.x[i];
- }
-}
-
-template <q_t q, class T>
-vector_t <q, T> scalar_multiple(v_t a, vector_t <q, T> v) {
- vector_t <q, 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 <q_t q, class T>
-T dot(vector_t <q, T> v1, vector_t <q, T> v2) {
- T prod = 0;
-
- for (q_t i = 0; i < q; i++) {
- prod += v1.x[i] * v2.x[i];
- }
-
- return prod;
-}
-
-template <q_t q, class T>
-void free_spin (vector_t <q, T> v) {
- free(v.x);
-}
-
-template <q_t q, class T>
-struct orthogonal_t { T *x; };
-
-template <q_t q, class T>
-void init(orthogonal_t <q, T> *ptr) {
- ptr->x = (T *)calloc(q * q, sizeof(T));
-
- for (q_t i = 0; i < q; i++) {
- ptr->x[q * i + i] = (T)1;
- }
-}
-
-template <q_t q, class T>
-orthogonal_t <q, T> copy (orthogonal_t <q, T> m) {
- orthogonal_t <q, T> m_copy;
- m_copy.x = (T *)calloc(q * q, sizeof(T));
-
- for (q_t i = 0; i < q * q; i++) {
- m_copy.x[i] = m.x[i];
- }
-
- return m_copy;
-}
-
-template <q_t q, class T>
-void free_spin (orthogonal_t <q, T> m) {
- free(m.x);
-}
-
-template <q_t q, class T>
-vector_t <q, T> act (orthogonal_t <q, T> m, vector_t <q, T> v) {
- vector_t <q, T> v_rot;
- v_rot.x = (T *)calloc(q, sizeof(T));
-
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- v_rot.x[i] += m.x[q * i + j] * v.x[j];
- }
- }
-
- return v_rot;
-}
-
-
-template <q_t q, class T>
-orthogonal_t <q, T> act (orthogonal_t <q, T> m1, orthogonal_t <q, T> m2) {
- orthogonal_t <q, T> m2_rot;
- m2_rot.x = (T *)calloc(q * q, sizeof(T));
-
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- for (q_t k = 0; k < q; k++) {
- m2_rot.x[i * q + j] += m1.x[i * q + j] * m2.x[j * q + k];
- }
- }
- }
-
- return m2_rot;
-}
-
-template <q_t q, class T>
-vector_t <q, T> act_inverse (orthogonal_t <q, T> m, vector_t <q, T> v) {
- vector_t <q, T> v_rot;
- v_rot.x = (T *)calloc(q, sizeof(T));
-
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- v_rot.x[i] += m.x[q * j + i] * v.x[j];
- }
- }
-
- return v_rot;
-}
-
-template <q_t q, class T>
-orthogonal_t <q, T> act_inverse (orthogonal_t <q, T> m1, orthogonal_t <q, T> m2) {
- orthogonal_t <q, T> m2_rot;
- m2_rot.x = (T *)calloc(q * q, sizeof(T));
-
- for (q_t i = 0; i < q; i++) {
- for (q_t j = 0; j < q; j++) {
- for (q_t k = 0; k < q; k++) {
- m2_rot.x[i * q + j] += m1.x[j * q + i] * m2.x[j * q + k];
- }
- }
- }
-
- return m2_rot;
-}
-
-template <q_t q>
-void generate_rotation (gsl_rng *r, orthogonal_t <q, double> *ptr) {
- double *v = (double *)malloc(q * sizeof(double));
- double v2 = 0;
-
- for (q_t i = 0; i < q; i++) {
- v[i] = gsl_ran_ugaussian(r);
- v2 += v[i] * v[i];
- }
-
- ptr->x = (double *)calloc(q * q, sizeof(double));
-
- for (q_t i = 0; i < q; i++) {
- ptr->x[q * i + i] = 1.0;
- for (q_t j = 0; j < q; j++) {
- ptr->x[q * i + j] -= 2 * v[i] * v[j] / v2;
- }
- }
-
- free(v);
-}
-
template <class R_t, class X_t>
v_t flip_cluster(state_t <R_t, X_t> *state, v_t v0, R_t r, gsl_rng *rand) {
v_t nv = 0;