summaryrefslogtreecommitdiff
path: root/lib/initial_finite.c
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jaron@kent-dobias.com>2018-07-24 13:12:35 -0400
committerJaron Kent-Dobias <jaron@kent-dobias.com>2018-07-24 13:12:35 -0400
commitc48fd16fe1554c88c79a1f0d50e81c803da8f61f (patch)
tree2b8a07de4e0fc795854fc4c1ac0ff095783218fa /lib/initial_finite.c
parent8d96c4d30214a2c27561740b7b3f7e1e3b0bbfe4 (diff)
downloadc++-c48fd16fe1554c88c79a1f0d50e81c803da8f61f.tar.gz
c++-c48fd16fe1554c88c79a1f0d50e81c803da8f61f.tar.bz2
c++-c48fd16fe1554c88c79a1f0d50e81c803da8f61f.zip
implemented updating the first fourier moment in wolff_finite, but also make wolff_finite obselete by adding a hacky preprocessor method for making wolff.h as efficient
Diffstat (limited to 'lib/initial_finite.c')
-rw-r--r--lib/initial_finite.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/lib/initial_finite.c b/lib/initial_finite.c
index 6ea76ef..59e7ec4 100644
--- a/lib/initial_finite.c
+++ b/lib/initial_finite.c
@@ -1,6 +1,24 @@
#include "initial_finite.h"
+double *precompute_cos(L_t L) {
+ double *x = (double *)malloc(L * sizeof(double));
+ for (L_t i = 0; i < L; i++) {
+ x[i] = cos(2 * M_PI * (double)i / (double)L);
+ }
+
+ return x;
+}
+
+double *precompute_sin(L_t L) {
+ double *x = (double *)malloc(L * sizeof(double));
+ for (L_t i = 0; i < L; i++) {
+ x[i] = sin(2 * M_PI * (double)i / (double)L);
+ }
+
+ return x;
+}
+
double *Jprobs_from_J(q_t q, double T, double *J) {
double *J_probs = (double *)calloc(pow(q, 2), sizeof(double));
@@ -112,6 +130,13 @@ state_finite_t *initial_finite_prepare_ising(D_t D, L_t L, double T, double *H)
s->B = (v_t *)calloc(2, sizeof(v_t));
s->B[0] = s->ne;
+ s->ReF = (double *)calloc(D * 2, sizeof(double));
+ s->ImF = (double *)calloc(D * 2, sizeof(double));
+
+
+ s->precomputed_cos = precompute_cos(L);
+ s->precomputed_sin = precompute_sin(L);
+
return s;
}
@@ -168,6 +193,12 @@ state_finite_t *initial_finite_prepare_potts(D_t D, L_t L, q_t q, double T, doub
s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
s->B[0] = s->ne; // everyone starts in state 0, remember?
+ s->ReF = (double *)calloc(D * q, sizeof(double));
+ s->ImF = (double *)calloc(D * q, sizeof(double));
+
+ s->precomputed_cos = precompute_cos(L);
+ s->precomputed_sin = precompute_sin(L);
+
return s;
}
@@ -230,10 +261,15 @@ state_finite_t *initial_finite_prepare_clock(D_t D, L_t L, q_t q, double T, doub
s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
s->B[0] = s->ne; // everyone starts in state 0, remember?
+ s->ReF = (double *)calloc(D * q, sizeof(double));
+ s->ImF = (double *)calloc(D * q, sizeof(double));
+
+ s->precomputed_cos = precompute_cos(L);
+ s->precomputed_sin = precompute_sin(L);
+
return s;
}
-
state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double *H) {
state_finite_t *s = (state_finite_t *)calloc(1, sizeof(state_finite_t));
@@ -291,6 +327,12 @@ state_finite_t *initial_finite_prepare_dgm(D_t D, L_t L, q_t q, double T, double
s->B = (v_t *)calloc(s->n_bond_types, sizeof(v_t));
s->B[0] = s->nv; // everyone starts in state 0, remember?
+ s->ReF = (double *)calloc(D * q, sizeof(double));
+ s->ImF = (double *)calloc(D * q, sizeof(double));
+
+ s->precomputed_cos = precompute_cos(L);
+ s->precomputed_sin = precompute_sin(L);
+
return s;
}
@@ -321,6 +363,10 @@ void state_finite_free(state_finite_t *s) {
free(s->involutions);
free(s->transform_site_to_zero);
free(s->bond_with_zero_type);
+ free(s->ReF);
+ free(s->ImF);
+ free(s->precomputed_cos);
+ free(s->precomputed_sin);
free(s);
}