diff options
Diffstat (limited to 'lib/src')
-rw-r--r-- | lib/src/network.cpp | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/lib/src/network.cpp b/lib/src/network.cpp index e885fcb..ed51c8e 100644 --- a/lib/src/network.cpp +++ b/lib/src/network.cpp @@ -290,36 +290,16 @@ elastic_network::elastic_network(const elastic_network& n) : network(n), hook_x( } void elastic_network::fracture(hooks& m, double weight, double cutoff) { + this->weight = weight; m.pre_fracture(*this); while (true) { - current_info cx = hook_x.solve(fuses); - current_info cy = hook_y.solve(fuses); + current_info ctot = this->get_current_info(); - bool done_x = cx.conductivity < 1.0 / G.edges.size(); - bool done_y = cy.conductivity < 1.0 / G.edges.size(); - - if (done_x && done_y) { + if (ctot.conductivity == 0) { break; } - current_info ctot; - ctot.currents.resize(G.edges.size()); - - if (done_x) { - for (unsigned i = 0; i < G.edges.size(); i++) { - ctot.currents[i] = weight * fabs(cy.currents[i]) / cy.conductivity; - } - } else if (done_y) { - for (unsigned i = 0; i < G.edges.size(); i++) { - ctot.currents[i] = (1 - weight) * fabs(cx.currents[i]) / cx.conductivity; - } - } else { - for (unsigned i = 0; i < G.edges.size(); i++) { - ctot.currents[i] = sqrt(pow((1 - weight) * cx.currents[i] / cx.conductivity, 2) + pow(weight * cy.currents[i] / cy.conductivity, 2)); - } - } - unsigned max_pos = UINT_MAX; long double max_val = std::numeric_limits<long double>::lowest(); @@ -337,9 +317,7 @@ void elastic_network::fracture(hooks& m, double weight, double cutoff) { throw nofuseex; } - fuses[max_pos] = true; - hook_x.break_edge(max_pos); - hook_y.break_edge(max_pos); + this->break_edge(max_pos); m.bond_broken(*this, ctot, max_pos); } @@ -347,3 +325,41 @@ void elastic_network::fracture(hooks& m, double weight, double cutoff) { m.post_fracture(*this); } +current_info elastic_network::get_current_info() { + current_info cx = hook_x.solve(fuses); + current_info cy = hook_y.solve(fuses); + + bool done_x = cx.conductivity < 1.0 / G.edges.size(); + bool done_y = cy.conductivity < 1.0 / G.edges.size(); + + current_info ctot; + ctot.currents.resize(G.edges.size()); + + if (done_x && done_y) { + ctot.conductivity = 0; + } else if (done_x) { + ctot.conductivity = cy.conductivity; + for (unsigned i = 0; i < G.edges.size(); i++) { + ctot.currents[i] = weight * fabs(cy.currents[i]) / cy.conductivity; + } + } else if (done_y) { + ctot.conductivity = cx.conductivity; + for (unsigned i = 0; i < G.edges.size(); i++) { + ctot.currents[i] = (1 - weight) * fabs(cx.currents[i]) / cx.conductivity; + } + } else { + ctot.conductivity = sqrt(pow((1 - weight) * cx.conductivity, 2) + pow(weight * cy.conductivity, 2)); + for (unsigned i = 0; i < G.edges.size(); i++) { + ctot.currents[i] = sqrt(pow((1 - weight) * cx.currents[i] / cx.conductivity, 2) + pow(weight * cy.currents[i] / cy.conductivity, 2)); + } + } + + return ctot; +} + +void elastic_network::break_edge(unsigned e, bool unbreak) { + fuses[e] = !unbreak; + hook_x.break_edge(e, unbreak); + hook_y.break_edge(e, unbreak); +} + |