1 #ifndef ZEOPP_V_NETWORK_HH
2 #define ZEOPP_V_NETWORK_HH
3 
4 #include <vector>
5 
6 #include "voro++.hh"
7 using namespace voro;
8 
9 const int init_network_edge_memory=4;
10 const int init_network_vertex_memory=64;
11 const int max_network_vertex_memory=65536;
12 
13 struct block {
14 	double dis;
15 	double e;
firstblock16 	inline void first(double v,double d) {e=v>0?v:0;dis=d;}
addblock17 	inline void add(double v,double d) {
18 		if(v<0) e=0;
19 		else if(v<e) {e=v;dis=d;}
20 	}
printblock21 	inline void print(FILE *fp) {fprintf(fp," %g %g",e,dis);}
22 };
23 
24 class voronoi_network {
25 	public:
26 		const double bx;
27 		const double bxy;
28 		const double by;
29 		const double bxz;
30 		const double byz;
31 		const double bz;
32 		const int nx;
33 		const int ny;
34 		const int nz;
35 		const int nxyz;
36 		const double xsp,ysp,zsp;
37 		const double net_tol;
38 		double **pts;
39 		int **idmem;
40 		int *ptsc;
41 		int *ptsmem;
42 		int **ed;
43 		int **ne;
44 		block **raded;
45 		unsigned int **pered;
46 		int edc,edmem;
47 		int *nu;
48 		int *nec;
49 		int *numem;
50 		int *reg;
51 		int *regp;
52 		int *vmap;
53 		int map_mem;
54 		template<class c_class>
55 		voronoi_network(c_class &c,double net_tol_=tolerance);
56 		~voronoi_network();
57 		void print_network(FILE *fp=stdout,bool reverse_remove=false);
print_network(const char * filename,bool reverse_remove=false)58 		inline void print_network(const char* filename,bool reverse_remove=false) {
59 			FILE *fp(safe_fopen(filename,"w"));
60 			print_network(fp);
61 			fclose(fp);
62 		}
63 		void draw_network(FILE *fp=stdout);
draw_network(const char * filename)64 		inline void draw_network(const char* filename) {
65 			FILE *fp(safe_fopen(filename,"w"));
66 			draw_network(fp);
67 			fclose(fp);
68 		}
69 		template<class v_cell>
add_to_network(v_cell & c,int idn,double x,double y,double z,double rad,int * & cmap)70 		inline void add_to_network(v_cell &c,int idn,double x,double y,double z,double rad,int *&cmap) {
71 			cmap=new int[4*c.p];
72 			add_to_network_internal(c,idn,x,y,z,rad,cmap);
73 		}
74 		template<class v_cell>
add_to_network_rectangular(v_cell & c,int idn,double x,double y,double z,double rad,int * & cmap)75 		inline void add_to_network_rectangular(v_cell &c,int idn,double x,double y,double z,double rad,int *&cmap) {
76 			cmap=new int[4*c.p];
77 			add_to_network_rectangular_internal(c,idn,x,y,z,rad,cmap);
78 		}
79 		template<class v_cell>
add_to_network(v_cell & c,int idn,double x,double y,double z,double rad)80 		inline void add_to_network(v_cell &c,int idn,double x,double y,double z,double rad) {
81 			if(c.p>map_mem) add_mapping_memory(c.p);
82 			add_to_network_internal(c,idn,x,y,z,rad,vmap);
83 		}
84 		template<class v_cell>
add_to_network_rectangular(v_cell & c,int idn,double x,double y,double z,double rad)85 		inline void add_to_network_rectangular(v_cell &c,int idn,double x,double y,double z,double rad) {
86 			if(c.p>map_mem) add_mapping_memory(c.p);
87 			add_to_network_rectangular_internal(c,idn,x,y,z,rad,vmap);
88 		}
89 
90 		void clear_network();
91 	private:
92 		inline int step_div(int a,int b);
93 		inline int step_int(double a);
94 		inline void add_neighbor(int k,int idn);
95 		void add_particular_vertex_memory(int l);
96 		void add_edge_network_memory();
97 		void add_network_memory(int l);
98 		void add_mapping_memory(int pmem);
99 		inline unsigned int pack_periodicity(int i,int j,int k);
100 		inline void unpack_periodicity(unsigned int pa,int &i,int &j,int &k);
101 		template<class v_cell>
102 		void add_edges_to_network(v_cell &c,double x,double y,double z,double rad,int *cmap);
103 		int not_already_there(int k,int j,unsigned int cper);
104 		bool search_previous(double gx,double gy,double x,double y,double z,int &ijk,int &q,int &ci,int &cj,int &ck);
105 		bool safe_search_previous_rect(double x,double y,double z,int &ijk,int &q,int &ci,int &cj,int &ck);
106 		bool search_previous_rect(double x,double y,double z,int &ijk,int &q,int &ci,int &cj,int &ck);
107 		template<class v_cell>
108 		void add_to_network_internal(v_cell &c,int idn,double x,double y,double z,double rad,int *cmap);
109 		template<class v_cell>
110 		void add_to_network_rectangular_internal(v_cell &c,int idn,double x,double y,double z,double rad,int *cmap);
111 };
112 
113 #endif
114