diff options
| author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-09 14:19:16 -0400 | 
|---|---|---|
| committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-09 14:19:16 -0400 | 
| commit | 466812e61e2ccec7750c791835111b402938411c (patch) | |
| tree | 09b46ec932ce6b31b8093580d500b91bb0e19bb7 /lib/wolff.h | |
| parent | dc72eb1fa4a476eade0ade98a463e7c96000fb0d (diff) | |
| download | c++-466812e61e2ccec7750c791835111b402938411c.tar.gz c++-466812e61e2ccec7750c791835111b402938411c.tar.bz2 c++-466812e61e2ccec7750c791835111b402938411c.zip | |
wolff run from own function, called with types to run
Diffstat (limited to 'lib/wolff.h')
| -rw-r--r-- | lib/wolff.h | 70 | 
1 files changed, 70 insertions, 0 deletions
| diff --git a/lib/wolff.h b/lib/wolff.h new file mode 100644 index 0000000..81830ee --- /dev/null +++ b/lib/wolff.h @@ -0,0 +1,70 @@ + +#include <time.h> +#include <getopt.h> + +#include <cluster.h> + +template <q_t q, class T> +double H_vector(vector_t <q, T> v1, T *H) { +  vector_t <q, T> H_vec; +  H_vec.x = H; +  return (double)(dot <q, T> (v1, H_vec)); +} + +template <class R_t, class X_t> +void wolff(count_t N, D_t D, L_t L, double T, std::function <double(X_t, X_t)> J, std::function <double(X_t)> H, unsigned long timestamp, bool silent) { + +  state_t <R_t, X_t> s(D, L, T, J, H); + +  // initialize random number generator +  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, M_0 = %.2f, S = %" PRIv "\n", steps, N, s.E, s.M.x[0], cluster_size); + +    v_t v0 = gsl_rng_uniform_int(r, s.nv); +      +    R_t step; +    generate_rotation(r, &step); + +    cluster_size = flip_cluster <R_t, X_t> (&s, v0, step, r); + +    free_spin(step); + +    fwrite(&(s.E), sizeof(double), 1, outfile_E); +    fwrite(s.M.x, sizeof(double), 2, 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, M_0 = %.2f, S = %" PRIv "\n", N, N, s.E, s.M.x[0], cluster_size); + +  fclose(outfile_M); +  fclose(outfile_E); +  fclose(outfile_S); + +  gsl_rng_free(r); +} + | 
