diff options
-rw-r--r-- | src/fracture.h | 2 | ||||
-rw-r--r-- | src/homo_voronoi_fracture.c | 10 | ||||
-rw-r--r-- | src/ini_network.c | 20 |
3 files changed, 27 insertions, 5 deletions
diff --git a/src/fracture.h b/src/fracture.h index 4ee7050..fea0caf 100644 --- a/src/fracture.h +++ b/src/fracture.h @@ -142,7 +142,7 @@ void free_instance(finst *instance, cholmod_common *c); finst *create_instance(fnet *network, double inf, bool voltage_bound, bool startnow, cholmod_common *c); -fnet *ini_voronoi_network(unsigned int L, boundary_type boundary, +fnet *ini_voronoi_network(unsigned int L, boundary_type boundary, bool use_dual, double *(*genfunc)(unsigned int, gsl_rng *, unsigned int *), cholmod_common *c); diff --git a/src/homo_voronoi_fracture.c b/src/homo_voronoi_fracture.c index 4ba0244..4e2d67a 100644 --- a/src/homo_voronoi_fracture.c +++ b/src/homo_voronoi_fracture.c @@ -9,7 +9,7 @@ int main(int argc, char *argv[]) { unsigned int N, L, filename_len; double beta, inf, cutoff; boundary_type boundary; - bool include_breaking, save_cluster_dist, use_voltage_boundaries, save_network, + bool include_breaking, save_cluster_dist, use_voltage_boundaries, use_dual, save_network, save_crit_stress, save_toughness, save_corr, save_conductivity, save_damage; @@ -24,6 +24,7 @@ int main(int argc, char *argv[]) { include_breaking = false; save_cluster_dist = false; use_voltage_boundaries = false; + use_dual = false; save_network = false; save_crit_stress = false; save_damage = false; @@ -34,7 +35,7 @@ int main(int argc, char *argv[]) { int boundary_int; char boundc2 = 'f'; - while ((opt = getopt(argc, argv, "n:L:b:B:dVcoNsCrt")) != -1) { + while ((opt = getopt(argc, argv, "n:L:b:B:dVcoNsCrtD")) != -1) { switch (opt) { case 'n': N = atoi(optarg); @@ -71,6 +72,9 @@ int main(int argc, char *argv[]) { case 'V': use_voltage_boundaries = true; break; + case 'D': + use_dual = true; + break; case 'c': save_cluster_dist = true; break; @@ -203,7 +207,7 @@ int main(int argc, char *argv[]) { for (unsigned int i = 0; i < N; i++) { printf("\033[F\033[JFRACTURE: %0*d / %d\n", (int)log10(N) + 1, i + 1, N); - fnet *network = ini_voronoi_network(L, boundary, genfunc_hyperuniform, &c); + fnet *network = ini_voronoi_network(L, boundary, use_dual, genfunc_hyperuniform, &c); finst *perm_instance = create_instance(network, inf, use_voltage_boundaries, true, &c); double *fuse_thres = gen_fuse_thres(network->num_edges, network->edge_coords, beta, beta_scaling_flat); finst *instance = copy_instance(perm_instance, &c); diff --git a/src/ini_network.c b/src/ini_network.c index 0434d98..f1dbe70 100644 --- a/src/ini_network.c +++ b/src/ini_network.c @@ -300,7 +300,7 @@ unsigned int *get_voro_dual_edges(unsigned int num_edges, return dual_edges; } -fnet *ini_voronoi_network(unsigned int L, boundary_type boundary, +fnet *ini_voronoi_network(unsigned int L, boundary_type boundary, bool use_dual, double *(*genfunc)(unsigned int, gsl_rng *, unsigned int *), cholmod_common *c) { fnet *network = (fnet *)calloc(1, sizeof(fnet)); @@ -337,6 +337,24 @@ fnet *ini_voronoi_network(unsigned int L, boundary_type boundary, unsigned int *tmp_dual_edges = get_voro_dual_edges(tmp_num_edges, tmp_num_verts, tmp_edges, tmp_tris); + // when use_dual is specificed, the edge and vertex sets are swapped with the + // dual edge and dual vertex sets. once formally relabelled, everything + // works the same way + if (use_dual) { + unsigned int *tmp_tmp_dual_edges = tmp_edges; + double *tmp_lattice = tmp_vert_coords; + unsigned int tmp_num = tmp_num_verts; + + tmp_edges = tmp_dual_edges; + tmp_dual_edges = tmp_tmp_dual_edges; + + tmp_vert_coords = lattice; + lattice = tmp_lattice; + + tmp_num_verts = num; + num = tmp_num; + } + // prune the edges of the lattice and assign boundary vertices based on the // desired boundary conditions unsigned int num_bounds; |