summaryrefslogtreecommitdiff
path: root/src/fracture.h
blob: f0a22e8a678fb8b0ae783cb208db03fc0bfebc2d (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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185

#pragma once

#include <assert.h>
#include <cholmod.h>
#include <float.h>
#include <getopt.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_sf_erf.h>
#include <gsl/gsl_sf_exp.h>
#include <gsl/gsl_sf_log.h>
#include <inttypes.h>
#include <math.h>
#include <omp.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

// these defs allow me to switch to long int cholmod in a sitch
#define int_t int
#define uint_t unsigned int
#define CINT_MAX INT_MAX
#define CHOL_F(x) cholmod_##x

#define GSL_RAND_GEN gsl_rng_mt19937

typedef enum lattice_t {
	VORONOI_LATTICE,
	SQUARE_LATTICE
} lattice_t;

typedef enum bound_t {
	FREE_BOUND,
	CYLINDER_BOUND,
	TORUS_BOUND,
	EMBEDDED_BOUND
} bound_t;

typedef struct {
	uint_t ne;
	uint_t nv;
	uint_t dnv;
	uint_t nv_break;
	uint_t num_bounds;
	uint_t *ev; 
	uint_t *ev_break;
	uint_t *vei;
	uint_t *ve;
	uint_t *bound_inds;
	uint_t *bound_verts;
	double *vx;
	double *ex;
	uint_t *dev;
	uint_t *dvei;
	uint_t *dve;
	double *dvx;
	uint_t num_spanning_edges;
	uint_t *spanning_edges;
	uint_t L;
	uint_t break_dim;
	cholmod_sparse *voltcurmat;
	bound_t boundary;
} graph_t;

typedef struct {
	const graph_t *graph;
	bool *fuses;
	double *thres;
	double inf;
	cholmod_dense *boundary_cond;
	cholmod_factor *factor;
	unsigned int *marks;
	unsigned int *dual_marks;
	bool voltage_bound;
	unsigned int num_components;
	cholmod_sparse *adjacency;
	cholmod_sparse *dual_adjacency;
	bool debug_stop;
} net_t;

typedef struct {
	unsigned int num_broken;
	unsigned int *break_list;
	double *conductivity;
	double *extern_field;
} data_t;

intptr_t *run_voronoi(unsigned int num_coords, double *coords, bool periodic, double xmin, double xmax, double ymin, double ymax);

int update_components(const cholmod_sparse *laplacian, unsigned int *marks,
											int old_num_components, int v1, int v2, int exclude);

unsigned int *find_components(const cholmod_sparse *laplacian, unsigned int skip);

cholmod_sparse *gen_adjacency(const net_t *instance, bool dual, bool breakv,
															unsigned int pad, cholmod_common *c);

cholmod_sparse *gen_laplacian(const net_t *instance, cholmod_common *c,
															bool symmetric);

int edge_to_verts(unsigned int width, bool periodic, unsigned int edge,
									bool index);

int dual_edge_to_verts(unsigned int width, bool periodic, unsigned int edge,
											 bool index);

double dual_vert_to_coord(unsigned int width, bool periodic, unsigned int vert,
													bool index);

void factor_update(cholmod_factor *factor, uint_t v1, uint_t v2, cholmod_common *c);

void net_notch(net_t *net, double notch_len, cholmod_common *c);
data_t *net_fracture(net_t *net, cholmod_common *c, double cutoff);
double *net_voltages(const net_t *net, cholmod_common *c);
double *net_currents(const net_t *net, const double *voltages, cholmod_common *c);
double net_conductivity(const net_t *net, const double *voltages);

void update_boundary(net_t *instance, const double *avg_field);

FILE *get_file(const char *prefix, unsigned int width, unsigned int crack,
							 double beta, unsigned int iter, unsigned int num_iter,
							 unsigned int num, bool read);

double update_beta(double beta, unsigned int width, const double *stress,
									 const double *damage, double bound_total);

cholmod_sparse *gen_voltcurmat(unsigned int num_edges, unsigned int num_verts,
															 unsigned int *edges_to_verts, cholmod_common *c);

net_t *net_copy(const net_t *net, cholmod_common *c);

graph_t *ini_square_network(unsigned int width, bound_t boundary, bool side_bounds,
												 cholmod_common *c);

void graph_free(graph_t *network, cholmod_common *c);
void net_free(net_t *instance, cholmod_common *c);

net_t *net_create(const graph_t *g, double inf, double beta, double notch_len, bool vb, cholmod_common *c);

graph_t *ini_voro_graph(unsigned int L, bound_t boundary, bool use_dual,
													double *(*genfunc)(unsigned int, bound_t, gsl_rng *, unsigned int *),
													cholmod_common *c);

bool break_edge(net_t *instance, unsigned int edge, cholmod_common *c);

void finish_instance(net_t *instance, cholmod_common *c);

net_t *coursegrain_square(net_t *instance, graph_t *network_p, cholmod_common *c);

unsigned int *get_clusters(net_t *instance, cholmod_common *c);

unsigned int *get_cluster_dist(net_t *instance, cholmod_common *c);

double *genfunc_uniform(unsigned int L, bound_t boundary, gsl_rng *r, unsigned int *num);
double *genfunc_hyperuniform(unsigned int L, bound_t boundary, gsl_rng *r, unsigned int *num);
void randfunc_flat(gsl_rng *r, double *x, double *y);
void randfunc_gaus(gsl_rng *r, double *x, double *y);

unsigned int **get_dists(const graph_t *network);
double *get_corr(net_t *instance, unsigned int **dists, cholmod_common *c);

double *bin_values(graph_t *network, unsigned int width, double *values);

cholmod_dense *bound_set(const graph_t *g, bool vb, double notch_len, cholmod_common *c);

data_t *data_create(uint_t num_edges);
void data_free(data_t *data);
void data_update(data_t *data, uint_t last_broke, double strength, double conductivity);

graph_t *graph_create(lattice_t lattice, bound_t bound, uint_t L, bool dual, cholmod_common *c);

uint_t find_cycles(uint_t num_edges, const bool *fuses, const uint_t *ev, const uint_t *vei, const uint_t *ve, int **cycles);

bool set_connected(const cholmod_sparse *laplacian, uint_t *marks, int vertex, int label, int stop_at, int exclude);

unsigned long int rand_seed();

double rand_dist_pow(const gsl_rng *r, double beta);