#include #include #include #include "space_wolff.hpp" #include "spheres.hpp" #include "animation.hpp" const unsigned D = 2; typedef Model, double> model; class SaveFlip : public measurement, Radius> { std::ofstream snapfile; unsigned n; public: SaveFlip() {} void pre_cluster(const Model, Radius>& m, unsigned, const Transformation, Radius>* t) override { snapfile.open("sphere_flip.dat"); n = 0; for (const Sphere* s : m.s) { snapfile << s << " " << s->s << " " << s->x.transpose() << " "; } snapfile << "\n"; } void plain_site_transformed(const Model, Radius>& m, const Transformation, Radius>& t) override { for (const Sphere* s : t.current()) { snapfile << s << " "; } snapfile << "\n"; n++; } void post_cluster(const Model, Radius>& m) override { for (const Sphere* s : m.s) { snapfile << s << " " << s->s << " " << s->x.transpose() << " "; } snapfile << "\n"; snapfile.close(); std::cout << n << "\n"; if (2 < n && n < 20) { getchar(); } } }; 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); } } std::function)> B_hard = [L, H](Spin s) -> double { if (fabs(s.x(0)) < 3 * L / 4 && fabs(s.x(1)) < 3 * L / 4) { return 0; } else { return std::numeric_limits::infinity(); } }; auto g1 = nudgeGen(1); auto g2 = swapGen(0.01); auto g3 = accrossGen(0.1); auto g4 = centerGen(0); auto tag = std::chrono::high_resolution_clock::now(); std::string filename = "flips_" + std::to_string(n) + "_" + std::to_string(T) + "_" + std::to_string(H) + "_" + std::to_string(a) + "_" + std::to_string(k) + "_" + std::to_string(tag.time_since_epoch().count()) + ".dat"; std::ofstream file; file.open(filename); Animation, Radius> A(L, 750, argc, argv, wait); model sphere(1.0, zSpheres(a, k), bCenter(H)); Rng rng; sphere.s.resize(n); unsigned nx = floor(sqrt(n)); for (unsigned i = 0; i < sphere.s.size(); i++) { Spin* ss = new Spin(); ss->x = {(i / nx) * L / nx - L / 2, (i % nx) * L / nx - L / 2}; ss->s = rng.pick({0.45, 0.45}); sphere.s[i] = ss; sphere.dict.insert(ss); } measurement, Radius> A_tmp; sphere.wolff(T, {g1, g2, g3, g4}, A_tmp, N); SaveFlip A_new; sphere.wolff(T, {g2}, A_new, 10000); return 0; }