#pragma once #include #include #include "types.h" template struct vector_t { T *x; }; template void init(vector_t *ptr) { ptr->x = (T *)calloc(q, sizeof(T)); ptr->x[0] = (T)1; } 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, vector_t v2) { for (q_t i = 0; i < q; i++) { v1.x[i] += v2.x[i]; } } template void subtract (vector_t v1, vector_t v2) { for (q_t i = 0; i < q; i++) { v1.x[i] -= v2.x[i]; } } template vector_t scalar_multiple(v_t 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 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]; } return prod; } template void free_spin (vector_t v) { free(v.x); } template void write_magnetization(vector_t M, FILE *outfile) { fwrite(M.x, sizeof(double), q, 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]; fwrite(&M_tmp, sizeof(float), 1, outfile); } }