#include #include #include #include "randutils/randutils.hpp" #include #include #include #include "perc_meas.hpp" #include #include #include std::atomic quit(false); // signal flag void got_signal(int) { quit.store(true); } int main(int argc, char* argv[]) { struct sigaction sa; memset( &sa, 0, sizeof(sa) ); sa.sa_handler = got_signal; sigfillset(&sa.sa_mask); sigaction(SIGINT, &sa, NULL); int opt; unsigned N = 1; unsigned Lx = 16; unsigned Ly = 16; double beta = 0.1; unsigned n = 128; double a = 1.0; bool use_aN = false; while ((opt = getopt(argc, argv, "N:X:Y:b:n:a:")) != -1) { switch (opt) { case 'N': N = (unsigned)atof(optarg); break; case 'X': Lx = atof(optarg); break; case 'Y': Ly = atof(optarg); break; case 'b': beta = atof(optarg); break; case 'n': n = (unsigned)atof(optarg); use_aN = true; break; case 'a': a = atof(optarg); use_aN = true; break; default: exit(1); } } cholmod_common c; CHOL_F(start)(&c); randutils::auto_seed_128 seeds; std::mt19937 rng{seeds}; if (use_aN) { pm meas(n, a); for (unsigned trial = 0; trial < N; trial++) { while (true) { try { graph G(n, a, rng); percolation_network fuse_network(G, &c); fuse_network.set_thresholds(beta, rng); fuse_network.fracture(meas); break; } catch (std::exception &e) { std::cout << e.what() << '\n'; } } if (quit.load()) break; } } else { pm meas(Lx, Ly); for (unsigned trial = 0; trial < N; trial++) { while (true) { try { graph G(Lx, Ly); percolation_network fuse_network(G, &c); fuse_network.set_thresholds(beta, rng); fuse_network.fracture(meas); break; } catch (std::exception &e) { std::cout << e.what() << '\n'; } } if (quit.load()) break; } } CHOL_F(finish)(&c); return 0; }