summaryrefslogtreecommitdiff
path: root/src/fracture.h
blob: 0a3a68788184b22e183ec8287cb99a86304d7aae (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
186
187
188
189
190
191
192
193
194
195
196
197
198

#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,
	VORONOI_HYPERUNIFORM_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 *ev;
	uint_t *dev;
	double *vx;
	double *dvx;
} frame_t;

typedef struct {
	uint_t L;
	bound_t boundary;
	uint_t ne;
	uint_t nv;
	uint_t dnv;
	uint_t nb;
	uint_t *ev; 
	uint_t *dev;
	double *vx;
	double *dvx;
	uint_t *vei;
	uint_t *ve;
	uint_t *dvei;
	uint_t *dve;
	uint_t *bi;
	uint_t *b;
	uint_t *nbi;
	uint_t *bni;
	bool *bq;
	uint_t *spanning_edges;
	uint_t num_spanning_edges;
	cholmod_sparse *voltcurmat;
} graph_t;

typedef struct {
	const graph_t *graph;
	bool *fuses;
	long double *thres;
	double inf;
	cholmod_dense *boundary_cond;
	cholmod_factor *factor;
	bool voltage_bound;
	uint_t num_broken;
	uint_t dim;
	uint_t nep;
	uint_t *evp;
} net_t;

typedef struct {
	uint_t num_broken;
	uint_t *break_list;
	double *conductivity;
	long double *extern_field;
} data_t;

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

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

uint_t *find_components(const cholmod_sparse *laplacian, uint_t skip);

cholmod_sparse *gen_adjacency(const net_t *net, bool dual, bool use_gp, bool symmetric, cholmod_common *c);

cholmod_sparse *gen_laplacian(const net_t *net, cholmod_common *c);

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

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

double dual_vert_to_coord(uint_t width, bool periodic, uint_t 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, uint_t width, uint_t crack,
							 double beta, uint_t iter, uint_t num_iter,
							 uint_t num, bool read);

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

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

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

graph_t *ini_square_network(uint_t 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(uint_t L, bound_t boundary, bool use_dual,
													double *(*genfunc)(uint_t, bound_t, gsl_rng *, uint_t *),
													cholmod_common *c);

bool break_edge(net_t *instance, uint_t 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);

uint_t *get_clusters(net_t *instance, cholmod_common *c);

uint_t *get_cluster_dist(net_t *instance, cholmod_common *c);

double *genfunc_uniform(uint_t num, gsl_rng *r);
double *genfunc_hyperuniform(uint_t num, gsl_rng *r);
void randfunc_flat(gsl_rng *r, double *x, double *y);
void randfunc_gaus(gsl_rng *r, double *x, double *y);

uint_t **get_dists(const graph_t *network);
uint_t *dijkstra(const graph_t *g, uint_t source);
double *get_corr(net_t *instance, uint_t **dists, cholmod_common *c);

double *bin_values(graph_t *network, uint_t 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, long 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();

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

double *spheres(int N, double bidispersityratio, double bidispersityfraction, double maxpf, double maxpressure, double maxcollisionrate);

frame_t *frame_create(lattice_t lattice, uint_t L, bool dual);
void frame_free(frame_t *frame);
bool is_in(uint_t len, uint_t *list, uint_t element);