#include #include #include #include #define WOLFF_USE_FINITE_STATES #include "wolff/lib/wolff_models/ising.hpp" using namespace wolff; class Timeseries : public measurement> { private: signed M; std::ofstream file; public: Timeseries(unsigned D, unsigned L, double T, double H, const wolff::system>& S) : file("series.dat", std::ios::app) { M = 0; for (const ising_t& s : S.s) { M = M + S.s0.act_inverse(s); } file << D << " " << L << " " << T << " " << H << " " << M; } ~Timeseries() { file << "\n"; file.close(); } void ghost_bond_visited(const wolff::system>&, const typename graph<>::vertex&, const ising_t& s_old, const ising_t& s_new, double dE) override { M += s_new - s_old; } void post_cluster(unsigned, unsigned, const wolff::system>& S) override { file << " " << M; } }; int main(int argc, char *argv[]) { // set defaults unsigned N = (unsigned)1e4; unsigned D = 2; unsigned L = 128; double T = 2.26918531421; double H = 0.0; int opt; // take command line arguments while ((opt = getopt(argc, argv, "N:D:L:T:H:")) != -1) { switch (opt) { case 'N': // number of steps N = (unsigned)atof(optarg); break; case 'D': // dimension D = atoi(optarg); break; case 'L': // linear size L = atoi(optarg); break; case 'T': // temperature T = atof(optarg); break; case 'H': // external field H = atof(optarg); break; default: exit(EXIT_FAILURE); } } // define the spin-spin coupling std::function Z = [] (const ising_t& s1, const ising_t& s2) -> double { return (double)(s1 * s2); }; // define the spin-field coupling std::function B = [=] (const ising_t& s) -> double { return H * s; }; // initialize the lattice graph<> G(D, L); // initialize the system wolff::system> S(G, T, Z, B); // initialize the random number generator auto seed = std::chrono::high_resolution_clock::now().time_since_epoch().count(); std::mt19937 rng(seed); // define function that generates self-inverse rotations std::function >&, const graph<>::vertex&)> gen_r = gen_ising>; // initailze the measurement object Timeseries A(D, L, T, H, S); // run wolff N times S.run_wolff(N, gen_r, A, rng); // exit return 0; }