#include #include #include #include "animation.hpp" #include "space_wolff.hpp" #include "spheres.hpp" #include "torus_symmetries.hpp" const unsigned D = 2; typedef Model, Dimer> model; int main(int argc, char* argv[]) { const unsigned D = 2; double L = 32; unsigned N = 1000; double T = 2.0 / log(1.0 + sqrt(2.0)); double H = 1.0; unsigned n = 25; unsigned wait = 1000; double k = 1e2; double a = 0.1; int opt; while ((opt = getopt(argc, argv, "n:N:L:T:H:a:k:w:")) != -1) { switch (opt) { case 'n': n = (unsigned)atof(optarg); break; case 'N': N = (unsigned)atof(optarg); break; case 'L': L = atof(optarg); break; case 'T': T = atof(optarg); break; case 'H': H = atof(optarg); break; case 'a': a = atof(optarg); break; case 'k': k = atof(optarg); break; case 'w': wait = atoi(optarg); break; default: exit(1); } } auto zSingle = zSpheresTorus(L, a, k); auto Z = zDimers(zSingle); std::function>)> B = [L, H](Spin> s) -> double { return H * s.x(1); }; auto g1 = uniformGenTorus>(L); auto tag = std::chrono::high_resolution_clock::now(); Animation, Dimer> A(L, 750, argc, argv, wait, true); model sphere(L, Z, B); Rng rng; sphere.s.resize(n); unsigned nx = ceil(sqrt(n)); for (unsigned i = 0; i < sphere.s.size(); i++) { Spin>* ss = new Spin>(); ss->x = {(i / nx) * L / nx, (i % nx) * L / nx}; ss->s = Dimer{.relativePosition = {0.2, 0}, .radius = 0.25}; sphere.s[i] = ss; sphere.dict.insert(ss); } sphere.wolff(T, {g1}, A, N); std::ofstream snapfile; snapfile.open("dimers_torus_snap.dat"); for (Spin>* s : sphere.s) { Spin> rs = sphere.s0.inverse().act(*s); snapfile << rs.s.radius << " " << rs.x.transpose() << " " << rs.s.relativePosition.transpose() << "\n"; delete s; } snapfile.close(); return 0; }