diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-24 13:12:35 -0400 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-24 13:12:35 -0400 |
commit | c48fd16fe1554c88c79a1f0d50e81c803da8f61f (patch) | |
tree | 2b8a07de4e0fc795854fc4c1ac0ff095783218fa /lib/initial_finite.c | |
parent | 8d96c4d30214a2c27561740b7b3f7e1e3b0bbfe4 (diff) | |
download | c++-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.c | 48 |
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); } |