root / bin / save_data_2.cpp @ 1
Historique | Voir | Annoter | Télécharger (10,9 ko)
1 | 1 | akiss | #include <string.h> |
---|---|---|---|
2 | 1 | akiss | #include <stdlib.h> |
3 | 1 | akiss | #include <stdio.h> |
4 | 1 | akiss | #include "save_data_2.h" |
5 | 1 | akiss | #include <math.h> |
6 | 1 | akiss | #include "constants.h" |
7 | 1 | akiss | #include <gsl/gsl_matrix.h> |
8 | 1 | akiss | #include <gsl/gsl_blas.h> |
9 | 1 | akiss | #include <gsl/gsl_eigen.h> |
10 | 1 | akiss | #include <gsl/gsl_math.h> |
11 | 1 | akiss | #include <gsl/gsl_cblas.h> |
12 | 1 | akiss | #include <gsl/gsl_linalg.h> |
13 | 1 | akiss | #include "gaussian.h" |
14 | 1 | akiss | |
15 | 1 | akiss | /* this function saves the tissue and its chemical and mechanical state */
|
16 | 1 | akiss | |
17 | 1 | akiss | void save_data_2(FILE *f, int vertex_number, double *vertices, int edge_number, int *edges_vertices, |
18 | 1 | akiss | double *lengths, double *rest_lengths, double *edges_width, int *edges_cells, int *periodizer, double width, double height, int cell_number){ |
19 | 1 | akiss | |
20 | 1 | akiss | fprintf(f,"edge_number= %i;\n",edge_number);
|
21 | 1 | akiss | fprintf(f,"vertex_number= %i;\n",vertex_number);
|
22 | 1 | akiss | fprintf(f,"cell_number= %i;\n",cell_number);
|
23 | 1 | akiss | fprintf(f,"width_after= %f;\n",width);
|
24 | 1 | akiss | fprintf(f,"height_after= %f;\n",height);
|
25 | 1 | akiss | fprintf(f,"stress_x= %f;\n",stress_x);
|
26 | 1 | akiss | fprintf(f,"stress_y= %f;\n",stress_y);
|
27 | 1 | akiss | fprintf(f,"sigma= %f;\n",sigma);
|
28 | 1 | akiss | |
29 | 1 | akiss | fprintf(f,"vertices=[\n");
|
30 | 1 | akiss | for (int i=0;i<vertex_number;i++){ |
31 | 1 | akiss | fprintf(f,"%f %f\n",vertices[2*i],vertices[2*i+1]);} |
32 | 1 | akiss | fprintf(f,"];\n");
|
33 | 1 | akiss | |
34 | 1 | akiss | fprintf(f,"edges_vertices=[\n");
|
35 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
36 | 1 | akiss | fprintf(f,"%i %i\n",edges_vertices[2*i],edges_vertices[2*i+1]); |
37 | 1 | akiss | } |
38 | 1 | akiss | fprintf(f,"];\n");
|
39 | 1 | akiss | |
40 | 1 | akiss | fprintf(f,"lengths=[\n");
|
41 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
42 | 1 | akiss | fprintf(f,"%f\n",lengths[i]);
|
43 | 1 | akiss | } |
44 | 1 | akiss | fprintf(f,"];\n");
|
45 | 1 | akiss | |
46 | 1 | akiss | fprintf(f,"rest_lengths=[\n");
|
47 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
48 | 1 | akiss | fprintf(f,"%f\n",rest_lengths[i]);
|
49 | 1 | akiss | } |
50 | 1 | akiss | fprintf(f,"];\n");
|
51 | 1 | akiss | |
52 | 1 | akiss | fprintf(f,"edges_width=[\n");
|
53 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
54 | 1 | akiss | fprintf(f,"%f\n",edges_width[i]);
|
55 | 1 | akiss | } |
56 | 1 | akiss | fprintf(f,"];\n");
|
57 | 1 | akiss | |
58 | 1 | akiss | fprintf(f,"periodizer=[\n");
|
59 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
60 | 1 | akiss | fprintf(f,"%i %i %i %i\n",periodizer[4*i],periodizer[4*i+1],periodizer[4*i+2],periodizer[4*i+3]); |
61 | 1 | akiss | } |
62 | 1 | akiss | fprintf(f,"];\n");
|
63 | 1 | akiss | |
64 | 1 | akiss | fprintf(f,"edges_cells=[\n");
|
65 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
66 | 1 | akiss | fprintf(f,"%i %i\n",edges_cells[2*i],edges_cells[2*i+1]); |
67 | 1 | akiss | } |
68 | 1 | akiss | fprintf(f,"];\n");
|
69 | 1 | akiss | |
70 | 1 | akiss | double barycenters[2*cell_number]; for (int i=0; i<2*cell_number;i++){ barycenters[i]=0.;} |
71 | 1 | akiss | double count[cell_number]; for (int i=0; i<cell_number;i++){ count[i]=0.;} |
72 | 1 | akiss | double texture[3*cell_number]; for (int i=0; i<3*cell_number;i++){ texture[i]=0.;} |
73 | 1 | akiss | |
74 | 1 | akiss | int box[18]={-1,-1,-1,0,-1,1,0,-1,0,0,0,1,1,-1,1,0,1,1}; |
75 | 1 | akiss | double distance=0.; int j_min; double distance_min; |
76 | 1 | akiss | for (int i=0; i<edge_number; i++){ |
77 | 1 | akiss | if (count[edges_cells[2*i]]==0){ |
78 | 1 | akiss | barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i]]+width*(double)periodizer[4*i])*lengths[i]; |
79 | 1 | akiss | barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)periodizer[4*i+1])*lengths[i]; |
80 | 1 | akiss | barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)periodizer[4*i+2])*lengths[i]; |
81 | 1 | akiss | barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i+1]+1]+height*(double)periodizer[4*i+3])*lengths[i]; |
82 | 1 | akiss | count[edges_cells[2*i]]+=2.*lengths[i]; |
83 | 1 | akiss | } |
84 | 1 | akiss | else {
|
85 | 1 | akiss | distance_min=100000;
|
86 | 1 | akiss | for (int j=0; j<9; j++){ |
87 | 1 | akiss | distance=pow(barycenters[2*edges_cells[2*i]]/count[edges_cells[2*i]]-vertices[2*edges_vertices[2*i]]-width*(double)box[2*j],2.)+ |
88 | 1 | akiss | pow(barycenters[2*edges_cells[2*i]+1]/count[edges_cells[2*i]]-vertices[2*edges_vertices[2*i]+1]-height*(double)box[2*j+1],2.); |
89 | 1 | akiss | if (distance<distance_min){
|
90 | 1 | akiss | j_min=j; |
91 | 1 | akiss | distance_min=distance; |
92 | 1 | akiss | } |
93 | 1 | akiss | } |
94 | 1 | akiss | barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i]]+width*(double)box[2*j_min])*lengths[i]; |
95 | 1 | akiss | barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)box[2*j_min+1])*lengths[i]; |
96 | 1 | akiss | count[edges_cells[2*i]]+=1.*lengths[i]; |
97 | 1 | akiss | |
98 | 1 | akiss | distance_min=100000;
|
99 | 1 | akiss | for (int j=0; j<9; j++){ |
100 | 1 | akiss | distance=pow(barycenters[2*edges_cells[2*i]]/count[edges_cells[2*i]]-vertices[2*edges_vertices[2*i+1]]-width*(double)box[2*j],2.)+ |
101 | 1 | akiss | pow(barycenters[2*edges_cells[2*i]+1]/count[edges_cells[2*i]]-vertices[2*edges_vertices[2*i+1]+1]-height*(double)box[2*j+1],2.); |
102 | 1 | akiss | if (distance<distance_min){
|
103 | 1 | akiss | j_min=j; |
104 | 1 | akiss | distance_min=distance; |
105 | 1 | akiss | } |
106 | 1 | akiss | } |
107 | 1 | akiss | barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)box[2*j_min])*lengths[i]; |
108 | 1 | akiss | barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i+1]+1]+height*(double)box[2*j_min+1])*lengths[i]; |
109 | 1 | akiss | count[edges_cells[2*i]]+=1.*lengths[i]; |
110 | 1 | akiss | } |
111 | 1 | akiss | |
112 | 1 | akiss | if (count[edges_cells[2*i+1]]==0){ |
113 | 1 | akiss | barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i]]+width*(double)periodizer[4*i])*lengths[i]; |
114 | 1 | akiss | barycenters[2*edges_cells[2*i+1]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)periodizer[4*i+1])*lengths[i]; |
115 | 1 | akiss | barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)periodizer[4*i+2])*lengths[i]; |
116 | 1 | akiss | barycenters[2*edges_cells[2*i+1]+1]+=(vertices[2*edges_vertices[2*i+1]+1]+height*(double)periodizer[4*i+3])*lengths[i]; |
117 | 1 | akiss | count[edges_cells[2*i+1]]+=2.*lengths[i]; |
118 | 1 | akiss | } |
119 | 1 | akiss | else {
|
120 | 1 | akiss | distance_min=100000;
|
121 | 1 | akiss | for (int j=0; j<9; j++){ |
122 | 1 | akiss | distance=pow(barycenters[2*edges_cells[2*i+1]]/count[edges_cells[2*i+1]]-vertices[2*edges_vertices[2*i]]-width*(double)box[2*j],2.)+ |
123 | 1 | akiss | pow(barycenters[2*edges_cells[2*i+1]+1]/count[edges_cells[2*i+1]]-vertices[2*edges_vertices[2*i]+1]-height*(double)box[2*j+1],2.); |
124 | 1 | akiss | if (distance<distance_min){
|
125 | 1 | akiss | j_min=j; |
126 | 1 | akiss | distance_min=distance; |
127 | 1 | akiss | } |
128 | 1 | akiss | } |
129 | 1 | akiss | barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i]]+width*(double)box[2*j_min])*lengths[i]; |
130 | 1 | akiss | barycenters[2*edges_cells[2*i+1]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)box[2*j_min+1])*lengths[i]; |
131 | 1 | akiss | count[edges_cells[2*i+1]]+=1.*lengths[i]; |
132 | 1 | akiss | |
133 | 1 | akiss | distance_min=100000;
|
134 | 1 | akiss | for (int j=0; j<9; j++){ |
135 | 1 | akiss | distance=pow(barycenters[2*edges_cells[2*i+1]]/count[edges_cells[2*i+1]]-vertices[2*edges_vertices[2*i+1]]-width*(double)box[2*j],2.)+ |
136 | 1 | akiss | pow(barycenters[2*edges_cells[2*i+1]+1]/count[edges_cells[2*i+1]]-vertices[2*edges_vertices[2*i+1]+1]-height*(double)box[2*j+1],2.); |
137 | 1 | akiss | if (distance<distance_min){
|
138 | 1 | akiss | j_min=j; |
139 | 1 | akiss | distance_min=distance; |
140 | 1 | akiss | } |
141 | 1 | akiss | } |
142 | 1 | akiss | barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)box[2*j_min])*lengths[i]; |
143 | 1 | akiss | barycenters[2*edges_cells[2*i+1]+1]+=(vertices[2*edges_vertices[2*i+1]+1]+height*(double)box[2*j_min+1])*lengths[i]; |
144 | 1 | akiss | count[edges_cells[2*i+1]]+=1.*lengths[i]; |
145 | 1 | akiss | } |
146 | 1 | akiss | // count[edges_cells[2*i]]+=1.;
|
147 | 1 | akiss | // count[edges_cells[2*i+1]]+=1.;
|
148 | 1 | akiss | } |
149 | 1 | akiss | for (int i=0; i<cell_number; i++){ |
150 | 1 | akiss | barycenters[2*i]/=count[i];
|
151 | 1 | akiss | barycenters[2*i+1]/=count[i]; |
152 | 1 | akiss | } |
153 | 1 | akiss | |
154 | 1 | akiss | for (int i=0; i<cell_number;i++){ count[i]=0.;} |
155 | 1 | akiss | for (int i=0; i<edge_number; i++){ |
156 | 1 | akiss | distance_min=100000.; |
157 | 1 | akiss | for (int j=0; j<9; j++){ |
158 | 1 | akiss | distance=pow(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j]-barycenters[2*edges_cells[2*i+1]],2.)+ |
159 | 1 | akiss | pow(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j+1]-barycenters[2*edges_cells[2*i+1]+1],2.); |
160 | 1 | akiss | if (distance<distance_min){
|
161 | 1 | akiss | distance_min=distance; |
162 | 1 | akiss | j_min=j; |
163 | 1 | akiss | } |
164 | 1 | akiss | } |
165 | 1 | akiss | |
166 | 1 | akiss | texture[3*edges_cells[2*i]]+=(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]])*(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]]); |
167 | 1 | akiss | texture[3*edges_cells[2*i+1]]+=(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]])*(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]]); |
168 | 1 | akiss | texture[3*edges_cells[2*i]+1]+=(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1])*(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1]); |
169 | 1 | akiss | texture[3*edges_cells[2*i+1]+1]+=(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1])*(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1]); |
170 | 1 | akiss | texture[3*edges_cells[2*i]+2]+=(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]])*(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1]); |
171 | 1 | akiss | texture[3*edges_cells[2*i+1]+2]+=(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j_min]-barycenters[2*edges_cells[2*i+1]])*(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j_min+1]-barycenters[2*edges_cells[2*i+1]+1]); |
172 | 1 | akiss | count[edges_cells[2*i]]+=1.; |
173 | 1 | akiss | count[edges_cells[2*i+1]]+=1.; |
174 | 1 | akiss | } |
175 | 1 | akiss | |
176 | 1 | akiss | for (int i=0; i<cell_number; i++){ |
177 | 1 | akiss | texture[3*i]/=count[i];
|
178 | 1 | akiss | texture[3*i+1]/=count[i]; |
179 | 1 | akiss | texture[3*i+2]/=count[i]; |
180 | 1 | akiss | } |
181 | 1 | akiss | |
182 | 1 | akiss | double average_texture[3*cell_number]; for (int i=0; i<3*cell_number; i++){ average_texture[i]=0.;} |
183 | 1 | akiss | for (int i=0; i<cell_number; i++){ count[i]=0.;} |
184 | 1 | akiss | |
185 | 1 | akiss | for (int i=0; i<cell_number; i++){ |
186 | 1 | akiss | for (int k=i; k<cell_number; k++){ |
187 | 1 | akiss | distance_min=100000.; |
188 | 1 | akiss | for (int j=0; j<9; j++){ |
189 | 1 | akiss | distance=pow(barycenters[2*i]+width*(double)box[2*j]-barycenters[2*k],2.)+ |
190 | 1 | akiss | pow(barycenters[2*i+1]+height*(double)box[2*j+1]-barycenters[2*k+1],2.); |
191 | 1 | akiss | if (distance<distance_min){
|
192 | 1 | akiss | distance_min=distance; |
193 | 1 | akiss | } |
194 | 1 | akiss | } |
195 | 1 | akiss | distance_min=sqrt(distance_min); |
196 | 1 | akiss | |
197 | 1 | akiss | average_texture[3*i]+=texture[3*k]*gaussian(distance_min,sigma); |
198 | 1 | akiss | average_texture[3*i+1]+=texture[3*k+1]*gaussian(distance_min,sigma); |
199 | 1 | akiss | average_texture[3*i+2]+=texture[3*k+2]*gaussian(distance_min,sigma); |
200 | 1 | akiss | average_texture[3*k]+=texture[3*i]*gaussian(distance_min,sigma); |
201 | 1 | akiss | average_texture[3*k+1]+=texture[3*i+1]*gaussian(distance_min,sigma); |
202 | 1 | akiss | average_texture[3*k+2]+=texture[3*i+2]*gaussian(distance_min,sigma); |
203 | 1 | akiss | count[i]+=gaussian(distance_min,sigma); |
204 | 1 | akiss | count[k]+=gaussian(distance_min,sigma); |
205 | 1 | akiss | } |
206 | 1 | akiss | } |
207 | 1 | akiss | |
208 | 1 | akiss | for (int i=0; i<cell_number; i++){ |
209 | 1 | akiss | average_texture[3*i]/=count[i];
|
210 | 1 | akiss | average_texture[3*i+1]/=count[i]; |
211 | 1 | akiss | average_texture[3*i+2]/=count[i]; |
212 | 1 | akiss | } |
213 | 1 | akiss | |
214 | 1 | akiss | fprintf(f,"barycenters_after=[\n");
|
215 | 1 | akiss | for (int i=0;i<cell_number;i++){ |
216 | 1 | akiss | fprintf(f,"%f %f\n",barycenters[2*i],barycenters[2*i+1]); |
217 | 1 | akiss | } |
218 | 1 | akiss | fprintf(f,"];\n");
|
219 | 1 | akiss | |
220 | 1 | akiss | fprintf(f,"texture_after=[\n");
|
221 | 1 | akiss | for (int i=0;i<cell_number;i++){ |
222 | 1 | akiss | fprintf(f,"%f %f %f\n",texture[3*i],texture[3*i+1],texture[3*i+2]); |
223 | 1 | akiss | } |
224 | 1 | akiss | fprintf(f,"];\n");
|
225 | 1 | akiss | |
226 | 1 | akiss | fprintf(f,"average_texture_after=[\n");
|
227 | 1 | akiss | for (int i=0;i<cell_number;i++){ |
228 | 1 | akiss | fprintf(f,"%f %f %f\n",average_texture[3*i],average_texture[3*i+1],average_texture[3*i+2]); |
229 | 1 | akiss | } |
230 | 1 | akiss | fprintf(f,"];\n");
|
231 | 1 | akiss | |
232 | 1 | akiss | int boundary[cell_number]; for (int i=0; i<cell_number; i++){ boundary[i]=0;} |
233 | 1 | akiss | for (int i=0;i<edge_number;i++){ |
234 | 1 | akiss | if (periodizer[4*i]!=0 || periodizer[4*i+1]!=0 || periodizer[4*i+2]!=0 || periodizer[4*i+3]!=0){ |
235 | 1 | akiss | boundary[edges_cells[2*i]]=1; boundary[edges_cells[2*i+1]]=1; |
236 | 1 | akiss | } |
237 | 1 | akiss | } |
238 | 1 | akiss | fprintf(f,"boundary=[\n");
|
239 | 1 | akiss | for (int i=0;i<cell_number;i++){ |
240 | 1 | akiss | fprintf(f,"%i\n",boundary[i]);
|
241 | 1 | akiss | } |
242 | 1 | akiss | fprintf(f,"];\n");
|
243 | 1 | akiss | |
244 | 1 | akiss | } |