From cd85d3696be4a7ee65b0cf6669fc62dc4841aef3 Mon Sep 17 00:00:00 2001 From: Jaron Kent-Dobias Date: Wed, 18 Jul 2018 15:37:27 -0400 Subject: - added support for computing spatial fourier transforms - measurements now are functions passed to wolff in array --- lib/wolff.h | 43 +++++++------------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) (limited to 'lib/wolff.h') diff --git a/lib/wolff.h b/lib/wolff.h index 90470d5..2d7e8b2 100644 --- a/lib/wolff.h +++ b/lib/wolff.h @@ -1,7 +1,4 @@ -#include -#include - #include "cluster.h" #include "state.h" @@ -13,7 +10,7 @@ double H_vector(vector_t v1, T *H) { } template -void wolff(count_t N, D_t D, L_t L, double T, std::function J, std::function H, std::function *)> gen_R, unsigned long timestamp, bool silent) { +void wolff(count_t N, D_t D, L_t L, double T, std::function J, std::function H, std::function *)> gen_R, unsigned int n_measurements, std::function *)> *measurements, bool silent) { state_t s(D, L, T, J, H); @@ -21,52 +18,26 @@ void wolff(count_t N, D_t D, L_t L, double T, std::function J gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937); gsl_rng_set(r, rand_seed()); - char *filename_M = (char *)malloc(255 * sizeof(char)); - char *filename_E = (char *)malloc(255 * sizeof(char)); - char *filename_S = (char *)malloc(255 * sizeof(char)); - - sprintf(filename_M, "wolff_%lu_M.dat", timestamp); - sprintf(filename_E, "wolff_%lu_E.dat", timestamp); - sprintf(filename_S, "wolff_%lu_S.dat", timestamp); - - FILE *outfile_M = fopen(filename_M, "wb"); - FILE *outfile_E = fopen(filename_E, "wb"); - FILE *outfile_S = fopen(filename_S, "wb"); - - free(filename_M); - free(filename_E); - free(filename_S); - - v_t cluster_size = 0; - if (!silent) printf("\n"); for (count_t steps = 0; steps < N; steps++) { - if (!silent) printf("\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", steps, N, s.E, cluster_size); + if (!silent) printf("\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", steps, N, s.E, s.last_cluster_size); v_t v0 = gsl_rng_uniform_int(r, s.nv); - R_t step = gen_R(r, &s); - - cluster_size = flip_cluster (&s, v0, step, r); - + flip_cluster (&s, v0, step, r); free_spin(step); - { - float smaller_E = (float)s.E; - fwrite(&smaller_E, sizeof(float), 1, outfile_E); + for (unsigned int i = 0; i < n_measurements; i++) { + measurements[i](&s); } - write_magnetization(s.M, outfile_M); - fwrite(&cluster_size, sizeof(uint32_t), 1, outfile_S); } if (!silent) { printf("\033[F\033[J"); } - printf("WOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", N, N, s.E, cluster_size); + printf("WOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", N, N, s.E, s.last_cluster_size); - fclose(outfile_M); - fclose(outfile_E); - fclose(outfile_S); + fftw_cleanup(); gsl_rng_free(r); } -- cgit v1.2.3-70-g09d2