diff options
author | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2019-05-17 16:38:24 -0400 |
---|---|---|
committer | Jaron Kent-Dobias <jaron@kent-dobias.com> | 2019-05-17 16:38:24 -0400 |
commit | 1e939e597964fa081b347e40af2be1069867b906 (patch) | |
tree | 395de78337d7ed85971fa3e84860ee4f4e5a5956 /src/percolation.cpp | |
parent | 456d748b8cbf141e1fe6e82a7c0106f469e28ba6 (diff) | |
download | fuse_networks-1e939e597964fa081b347e40af2be1069867b906.tar.gz fuse_networks-1e939e597964fa081b347e40af2be1069867b906.tar.bz2 fuse_networks-1e939e597964fa081b347e40af2be1069867b906.zip |
added support for running percolation using the fuse network rules
Diffstat (limited to 'src/percolation.cpp')
-rw-r--r-- | src/percolation.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/percolation.cpp b/src/percolation.cpp new file mode 100644 index 0000000..03da117 --- /dev/null +++ b/src/percolation.cpp @@ -0,0 +1,100 @@ + +#include <random> +#include <iostream> + +#include <cholmod.h> + +#include "randutils/randutils.hpp" + +#include <graph.hpp> +#include <network.hpp> +#include <hooks.hpp> +#include "perc_meas.hpp" + +#include <csignal> +#include <cstring> +#include <atomic> + +std::atomic<bool> 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; + double Lx = 16; + double Ly = 16; + double beta = 0.0001; + + 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; + } + } + + CHOL_F(finish)(&c); + + return 0; +} + |