diff options
Diffstat (limited to 'ising.cpp')
-rw-r--r-- | ising.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
@@ -8,10 +8,11 @@ int main(int argc, char* argv[]) { unsigned N = 1000; double T = 2.0 / log(1.0 + sqrt(2.0)); double H = 1.0; + double ε = 0.1; int opt; - while ((opt = getopt(argc, argv, "N:L:T:H:")) != -1) { + while ((opt = getopt(argc, argv, "N:L:T:H:e:")) != -1) { switch (opt) { case 'N': N = (unsigned)atof(optarg); @@ -25,6 +26,9 @@ int main(int argc, char* argv[]) { case 'H': H = atof(optarg); break; + case 'e': + ε = atof(optarg); + break; default: exit(1); } @@ -67,12 +71,10 @@ int main(int argc, char* argv[]) { [] (model<signed, D, signed>& m, unsigned i0, spin<signed, D, signed> s1) -> std::set<unsigned> { std::set<unsigned> nn; if (i0 < m.s.size()) { - std::set<unsigned> os1 = m.dict.on_site(s1.x); - std::set<unsigned> nn0 = m.dict.nearest_neighbors(m.s[i0].x); - std::set<unsigned> nn1 = m.dict.nearest_neighbors(s1.x); + std::set<unsigned> nn0 = m.dict.neighbors(m.s[i0].x, 1); + std::set<unsigned> nn1 = m.dict.neighbors(s1.x, 1); nn.insert(nn0.begin(), nn0.end()); nn.insert(nn1.begin(), nn1.end()); - nn.insert(os1.begin(), os1.end()); nn.insert(m.s.size()); } else { for (unsigned i = 0; i < m.s.size(); i++) { @@ -119,7 +121,16 @@ int main(int argc, char* argv[]) { } */ - ising.wolff(T, N, rng); + ising.update_energy(); + + while (true) { + ising.wolff(T, N, rng); + std::array<double, 2> τ = ising.Eq.τ(); + std::cout << τ[0] << " " << τ[1] << " " << τ[1] / τ[0] << "\n"; + if (τ[1] / τ[0] < ε) { + break; + } + } std::vector<signed> output(pow(L, D)); @@ -128,13 +139,21 @@ int main(int argc, char* argv[]) { output[L * rs.x(1) + rs.x(0)] = s.s; } + std::ofstream outfile; + outfile.open("snap.dat"); + for (unsigned i = 0; i < L; i++) { for (unsigned j = 0; j < L; j++) { unsigned out = output[L * i + j] == 1 ? 1 : 0; - std::cout << out; + outfile << out << " "; } - std::cout << "\n"; + outfile << "\n"; } + outfile.close(); + + std::array<double, 2> act = ising.Eq.τ(); + + std::cout << act[0] << " " << act[1] << "\n"; return 0; } |