summaryrefslogtreecommitdiff
path: root/lib/net_conductivity.c
blob: e9325bbef5d34064d1715c9e57188e4c5b595c66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

#include "fracture.h"

double net_conductivity(const net_t *net, const double *voltages) {
	if (net->voltage_bound) {
		// the voltage drop across the network is fixed to one with voltage
		// boundary conditions, so the conductivity is the total current flowing
		double tot_cur = 0;
		for (uint_t i = 0; i < net->graph->num_spanning_edges; i++) {
			uint_t e = net->graph->spanning_edges[i];

			if (!net->fuses[e]) {
				uint_t v1, v2, s1, s2;
				double v1y, v2y;

				v1 = net->graph->ev[2 * e];
				v2 = net->graph->ev[2 * e + 1];

				v1y = net->graph->vx[2 * v1 + 1];
				v2y = net->graph->vx[2 * v2 + 1];

				s1 = v1y < v2y ? v1 : v2;
				s2 = v1y < v2y ? v2 : v1;

				tot_cur += voltages[s1] - voltages[s2];
			}
		}

		return fabs(tot_cur);
	} else {
		// the current across the network is fixed to one with current boundary
		// conditions, so the conductivity is the inverse of the total voltage drop
		return 1 / fabs(voltages[net->graph->nv] - voltages[net->graph->nv + 1]);
	}
}