#include "perc_meas.hpp" #include #include class badcycleException: public std::exception { virtual const char* what() const throw() { return "Could not find a valid cycle on the broken system."; } } badcycleex; void update_distribution_file(std::string id, const std::vector& data, std::string model_string) { std::string filename = model_string + id + ".dat"; std::ifstream file(filename); std::vector data_old(data.size(), 0); if (file.is_open()) { for (unsigned i = 0; i < data.size(); i++) { uint64_t num; file >> num; data_old[i] = num; } file.close(); } std::ofstream file_out(filename); for (unsigned i = 0; i < data.size(); i++) { file_out <>& data, std::string model_string) { std::string filename = model_string + id + ".dat"; std::ifstream file(filename); std::vector> data_old(data.size()); for (unsigned i = 0; i < data.size(); i++) { data_old[i].resize(data[0].size()); } if (file.is_open()) { for (unsigned i = 0; i < data.size(); i++) { for (unsigned j = 0; j < data[0].size(); j++) { uint64_t num; file >> num; data_old[i][j] = num; } } file.close(); } std::ofstream file_out(filename); for (unsigned i = 0; i < data.size(); i++) { for (unsigned j = 0; j < data[0].size(); j++) { file_out << std::fixed << data_old[i][j] + data[i][j] << " "; } file_out << "\n"; } file_out.close(); } pm::pm(unsigned n, double a) : G(2 * n), rank(2 * n), parent(2 * n), ds(&rank[0], &parent[0]), sm(2 * n), sl(2 * n), sn(3 * n), sN(3 * n), ss(2 * n), sb(3 * n), sB(3 * n), sp(3 * n), sr(3 * n), sf(3 * n) { model_string = "percolation_" + std::to_string(n) + "_" + std::to_string(a) + "_"; for (std::vector &x : sn) { x.resize(2 * n); } for (std::vector &x : sb) { x.resize(3 * n); } for (std::vector &x : sN) { x.resize(2 * n); } for (std::vector &x : sB) { x.resize(3 * n); } for (std::vector &x : sf) { x.resize(3 * n); } } pm::~pm() { update_distribution_file("sm", sm, model_string); update_distribution_file("sl", sl, model_string); update_distribution_file("sn", sn, model_string); update_distribution_file("sN", sN, model_string); update_distribution_file("ss", ss, model_string); update_distribution_file("sb", sb, model_string); update_distribution_file("sB", sB, model_string); update_distribution_file("sp", sp, model_string); update_distribution_file("sr", sr, model_string); update_distribution_file("sf", sf, model_string); } void pm::pre_fracture(const network&) { boost::remove_edge_if(trivial, G); initialize_incremental_components(G, ds); incremental_components(G, ds); p = 0; r = 0; last_thres = std::numeric_limits::lowest(); } void pm::bond_broken(const network& net, const current_info& cur, unsigned i) { unsigned p_old = p; for (unsigned j = 0; j < net.G.edges.size(); j++) { if (!net.fuses[j] && net.thresholds[j] < net.thresholds[i] && net.thresholds[j] > last_thres) { p++; } } last_thres = net.thresholds[i]; boost::add_edge(net.G.dual_edges[i].v[0], net.G.dual_edges[i].v[1], {i}, G); ds.union_set(net.G.dual_edges[i].v[0], net.G.dual_edges[i].v[1]); boost::component_index components(parent.begin(), parent.end()); std::vector counts(components.size()); for (unsigned j = 0; j < components.size(); j++) { unsigned comp_size = 0; BOOST_FOREACH(VertexIndex child_index, components[j]) { comp_size++; } sn[r][comp_size - 1]++; for (unsigned k = p_old; k <= p; k++) { sN[k][comp_size - 1]++; } } unsigned bb_size = 0; for (unsigned j = 0; j < net.G.edges.size(); j++) { if (cur.currents[j] > 1.0 / net.G.edges.size()) { bb_size++; } } sb[r][bb_size - 1]++; for (unsigned k = p_old; k <= p; k++) { sB[k][bb_size - 1]++; } sf[r][p]++; p++; r++; } void pm::post_fracture(network &n) { auto post_cracks = find_minimal_crack(G, n); std::vector component(boost::num_vertices(G)); unsigned num = boost::connected_components(G, &component[0]); if (post_cracks.size() > 2 || post_cracks.size() == 0) { throw badcycleex; } for (auto c : post_cracks) { sl[c.second.size() - 1]++; } unsigned crack_component = component[n.G.dual_edges[post_cracks.front().second.front()].v[0]]; std::vector> components(num); for (unsigned i = 0; i < n.G.dual_vertices.size(); i++) { components[component[i]].push_back(n.G.dual_vertices[i].r); } for (unsigned i = 0; i < num; i++) { if (i != crack_component) { sm[components[i].size() - 1]++; } else { ss[components[i].size() - 1]++; } for (unsigned j = r; j < sn.size(); j++) { sn[j][components[i].size() - 1]++; } for (unsigned j = p; j < sn.size(); j++) { sN[j][components[i].size() - 1]++; } } sp[p - 1]++; sr[r - 1]++; }