Statistiques
| Révision :

root / bin / save_data.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.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(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_before= %f;\n",width);
24 1 akiss
fprintf(f,"height_before= %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_before=[\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_before=[\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_before=[\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
}