diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-20 22:57:39 -0400 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2018-07-20 22:57:39 -0400 |
commit | 5ffaf0a1bb0f0b47d57d0f24ee1134659775dacb (patch) | |
tree | 230c9562222b7858316ac1bb59bb3e8570746df4 /src/wolff_On.cpp | |
parent | 72301b3d5c3a91ff2e7fc6eedcad7bce8e647efa (diff) | |
download | c++-5ffaf0a1bb0f0b47d57d0f24ee1134659775dacb.tar.gz c++-5ffaf0a1bb0f0b47d57d0f24ee1134659775dacb.tar.bz2 c++-5ffaf0a1bb0f0b47d57d0f24ee1134659775dacb.zip |
added ising example to cpp collection
Diffstat (limited to 'src/wolff_On.cpp')
-rw-r--r-- | src/wolff_On.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/wolff_On.cpp b/src/wolff_On.cpp index d718440..76831ba 100644 --- a/src/wolff_On.cpp +++ b/src/wolff_On.cpp @@ -40,6 +40,7 @@ int main(int argc, char *argv[]) { bool silent = false; bool use_pert = false; + bool N_is_sweeps = false; bool modulated_field = false; int order = 2; @@ -51,7 +52,7 @@ int main(int argc, char *argv[]) { unsigned char measurement_flags = measurement_energy | measurement_clusterSize; - while ((opt = getopt(argc, argv, "N:q:D:L:T:J:H:spe:mo:M:")) != -1) { + while ((opt = getopt(argc, argv, "N:q:D:L:T:J:H:spe:mo:M:S")) != -1) { switch (opt) { case 'N': // number of steps N = (count_t)atof(optarg); @@ -82,11 +83,14 @@ int main(int argc, char *argv[]) { modulated_field = true; break; case 'M': - measurement_flags |= 1 << atoi(optarg); + measurement_flags ^= 1 << atoi(optarg); break; case 'o': order = atoi(optarg); break; + case 'S': + N_is_sweeps = true; + break; default: exit(EXIT_FAILURE); } @@ -179,6 +183,13 @@ int main(int argc, char *argv[]) { n_measurements++; } + meas_t *meas_sweeps; + if (N_is_sweeps) { + meas_sweeps = (meas_t *)calloc(1, sizeof(meas_t)); + measurements[n_measurements] = measurement_average_cluster<orthogonal_R_t, vector_R_t> (meas_sweeps); + n_measurements++; + } + std::function <double(vector_R_t)> H; if (modulated_field) { @@ -187,7 +198,24 @@ int main(int argc, char *argv[]) { H = std::bind(H_vector <N_COMP, double>, std::placeholders::_1, H_vec); } - wolff <orthogonal_R_t, vector_R_t> (N, D, L, T, dot <N_COMP, double>, H, gen_R, n_measurements, measurements, silent); + // initialize random number generator + gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937); + gsl_rng_set(r, rand_seed()); + + state_t <orthogonal_R_t, vector_R_t> s(D, L, T, dot <N_COMP, double>, H); + + if (N_is_sweeps) { + count_t N_rounds = 0; + printf("\n"); + while (N_rounds * N * meas_sweeps->x < N * s.nv) { + printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n", (count_t)(N_rounds * N * meas_sweeps->x / s.nv), N, s.E, s.last_cluster_size); + wolff <orthogonal_R_t, vector_R_t> (N, &s, gen_R, n_measurements, measurements, r, silent); + N_rounds++; + } + printf("\033[F\033[J\033[F\033[JWOLFF: sweep %" PRIu64 " / %" PRIu64 ": E = %.2f, S = %" PRIv "\n\n", (count_t)(N_rounds * N * meas_sweeps->x / s.nv), N, s.E, s.last_cluster_size); + } else { + wolff <orthogonal_R_t, vector_R_t> (N, &s, gen_R, n_measurements, measurements, r, silent); + } free(measurements); @@ -204,7 +232,12 @@ int main(int argc, char *argv[]) { fclose(outfile_F); } + if (N_is_sweeps) { + free(meas_sweeps); + } + free(H_vec); + gsl_rng_free(r); return 0; } |