summaryrefslogtreecommitdiff
path: root/src/fracture_network.c
diff options
context:
space:
mode:
authorJaron Kent-Dobias <jkentdobias@g.hmc.edu>2016-08-22 10:11:14 -0400
committerJaron Kent-Dobias <jkentdobias@g.hmc.edu>2016-08-22 10:11:14 -0400
commit2bb0740b68fdb62d45adc00204b3990ca42ade77 (patch)
treea52975e3460da781467ddb70aaa8d76840d01bb4 /src/fracture_network.c
downloadfuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.tar.gz
fuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.tar.bz2
fuse_networks-2bb0740b68fdb62d45adc00204b3990ca42ade77.zip
started repo again without all the data files gunking the works
Diffstat (limited to 'src/fracture_network.c')
-rw-r--r--src/fracture_network.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/fracture_network.c b/src/fracture_network.c
new file mode 100644
index 0000000..148b08c
--- /dev/null
+++ b/src/fracture_network.c
@@ -0,0 +1,61 @@
+
+#include "fracture.h"
+
+int inc_break_fuses(finst *instance, double *thres, double *field,
+ double cutoff) {
+ unsigned int size = (instance->network)->num_edges;
+
+ int min_pos = -1;
+ long double min_val = -1;
+
+ for (unsigned int i = 0; i < size; i++) {
+ if (!instance->fuses[i] && fabs(field[i]) > cutoff) {
+ double val = fabs(field[i]) / thres[i];
+ if (min_val < val) {
+ min_val = val; min_pos = i;
+ }
+ }
+ }
+
+ return min_pos;
+}
+
+break_data *fracture_network(finst *instance, double *fuse_thres,
+ cholmod_common *c, double cutoff) {
+ unsigned int num_edges = instance->network->num_edges;
+ unsigned int num_verts = instance->network->num_verts;
+
+ break_data *breaking_data = alloc_break_data(num_edges);
+
+ while (true) {
+ double *voltages = get_voltage(instance, c);
+ double *field = get_current_v(instance, voltages, c);
+
+ double conductivity = get_conductivity(instance, voltages, c);
+ if (conductivity < 1e-12 && instance->voltage_bound) {
+ free(voltages);
+ free(field);
+ break;
+ }
+
+ int last_broke = inc_break_fuses(instance, fuse_thres, field, cutoff);
+ if (last_broke > num_edges || last_broke < -1) {
+ printf("%g \n", conductivity);
+ getchar();
+ }
+
+ update_break_data(breaking_data, last_broke, fabs(conductivity * fuse_thres[last_broke] / field[last_broke]), conductivity);
+
+ free(voltages);
+ free(field);
+
+ break_edge(instance, last_broke, c);
+
+ if (instance->num_components > 1) {
+ break;
+ }
+ }
+
+ return breaking_data;
+}
+