summaryrefslogtreecommitdiff
path: root/dimers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dimers.cpp')
-rw-r--r--dimers.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/dimers.cpp b/dimers.cpp
new file mode 100644
index 0000000..4416333
--- /dev/null
+++ b/dimers.cpp
@@ -0,0 +1,122 @@
+
+#include <chrono>
+#include <fstream>
+#include <iostream>
+
+#include "animation.hpp"
+#include "space_wolff.hpp"
+#include "spheres.hpp"
+
+const unsigned D = 2;
+typedef Model<double, D, Euclidean<double, D>, Dimer<double, 2>> 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 = zSpheres<D>(a, k);
+
+ std::function<double(const Spin<double, D, Dimer<double, D>>&,
+ const Spin<double, D, Dimer<double, D>>&)>
+ Z = [zSingle, a, k](const Spin<double, D, Dimer<double, D>>& s1,
+ const Spin<double, D, Dimer<double, D>>& s2) -> double {
+ Spin<double, D, Radius> s11 = {.x = s1.x + s1.s.relativePosition, .s = s1.s.radius};
+ Spin<double, D, Radius> s12 = {.x = s1.x - s1.s.relativePosition, .s = s1.s.radius};
+ Spin<double, D, Radius> s21 = {.x = s2.x + s2.s.relativePosition, .s = s2.s.radius};
+ Spin<double, D, Radius> s22 = {.x = s2.x - s2.s.relativePosition, .s = s2.s.radius};
+
+ return zSingle(s11, s21) + zSingle(s12, s21) + zSingle(s11, s22) + zSingle(s12, s22);
+ };
+
+ auto g1 = nudgeGen<D, Dimer<double, D>>(1);
+ auto g2 = swapGen<D, Dimer<double, D>>(0.1);
+ auto g3 = accrossGen<D, Dimer<double, D>>(0.1);
+ auto g4 = centerGen<D, Dimer<double, D>>(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<double, D, Euclidean<double, D>, Dimer<double, D>> A(L, 750, argc, argv, wait);
+ model sphere(1.0, Z, bCenter<D, Dimer<double, D>>(H));
+
+ Rng rng;
+
+ sphere.s.resize(n);
+
+ unsigned nx = floor(sqrt(n));
+ for (unsigned i = 0; i < sphere.s.size(); i++) {
+ Spin<double, 2, Dimer<double, D>>* ss = new Spin<double, 2, Dimer<double, D>>();
+ ss->x = {(i / nx) * L / nx - L / 2, (i % nx) * L / nx - L / 2};
+ ss->s = Dimer<double, D>{.relativePosition = {0.2, 0}, .radius = 0.25};
+ sphere.s[i] = ss;
+ sphere.dict.insert(ss);
+ }
+
+ sphere.wolff(T, {g1, g2, g3, g4}, A, N);
+
+ file.close();
+
+ /*
+ std::ofstream snapfile;
+ snapfile.open("sphere_snap.dat");
+
+ for (Spin<double, D, double>* s : sphere.s) {
+ Spin<double, D, double> rs = sphere.s0.inverse().act(*s);
+ snapfile << rs.s << " " << rs.x.transpose() << "\n";
+ delete s;
+ }
+
+ snapfile.close();
+ */
+
+ return 0;
+}
+