Statistiques
| Révision :

root / bin / main.cpp @ 1

Historique | Voir | Annoter | Télécharger (37,05 ko)

1 1 akiss
di#include <iostream>
2 1 akiss
#include <string>
3 1 akiss
#include <stdlib.h>
4 1 akiss
#include <stdio.h>
5 1 akiss
#include <time.h>
6 1 akiss
#include "initialize.h"
7 1 akiss
#include "step.h"
8 1 akiss
#include "constants.h"
9 1 akiss
#include "cell_division.h"
10 1 akiss
#include "cell_division2.h"
11 1 akiss
#include <math.h>
12 1 akiss
#include "load_initial_state.h"
13 1 akiss
#include <fstream>
14 1 akiss
#include "compute_barycenters.h"
15 1 akiss
#include "compute_areas.h"
16 1 akiss
#include "compute_cell_areas.h"
17 1 akiss
#include "compute_shapes.h"
18 1 akiss
#include "compute_stress_periclinal.h"
19 1 akiss
#include "compute_stress_anticlinal.h"
20 1 akiss
#include "find_boundary_walls.h"
21 1 akiss
#include "minimize_BFGS.h"
22 1 akiss
#include <omp.h>
23 1 akiss
#include "compute_cell_areas.h"
24 1 akiss
#include "compute_shapes.h"
25 1 akiss
#include "compute_wall_vertices.h"
26 1 akiss
#include "compute_cell_walls.h"
27 1 akiss
#include <dirent.h>
28 1 akiss
#include "save_data.h"
29 1 akiss
#include <cmath>
30 1 akiss
#include "compute_lengths.h"
31 1 akiss
32 1 akiss
using namespace std;
33 1 akiss
34 1 akiss
int main(){
35 1 akiss
36 1 akiss
omp_set_dynamic(0);
37 1 akiss
38 1 akiss
srand(time(NULL));
39 1 akiss
double global_barycenter[2];
40 1 akiss
int init_vertices_number,init_cell_number,cumulated_vertices_number,init_wall_number;
41 1 akiss
42 1 akiss
// Pick the initial conditions, obtained from previous simulations
43 1 akiss
//init_cell_number=5; init_vertices_number=8; cumulated_vertices_number=20;
44 1 akiss
//const char* file_name="init/5_8_20.txt";
45 1 akiss
init_cell_number=101; init_vertices_number=200; cumulated_vertices_number=567;
46 1 akiss
const char* file_name="init/101_200_567.txt";
47 1 akiss
//init_cell_number=300; init_vertices_number=598; cumulated_vertices_number=1736;
48 1 akiss
//const char* file_name="init/300_598_1736.txt";
49 1 akiss
//init_cell_number=100; init_vertices_number=200; cumulated_vertices_number=561;
50 1 akiss
//const char* file_name="init/100_200_ablation.txt";
51 1 akiss
float * init_vertices; init_vertices=(float*)calloc(2*init_vertices_number,sizeof(float));
52 1 akiss
int * init_vertices_number_in_each_cell; init_vertices_number_in_each_cell=(int*)calloc(init_cell_number+1,sizeof(int));
53 1 akiss
int * init_cells_vertices; init_cells_vertices=(int*)calloc(cumulated_vertices_number,sizeof(int));
54 1 akiss
load_initial_state(file_name, init_cell_number, init_vertices_number, init_vertices, init_vertices_number_in_each_cell, init_cells_vertices);
55 1 akiss
// initial tissue loaded
56 1 akiss
57 1 akiss
/* center the tissue */
58 1 akiss
global_barycenter[1]=0; global_barycenter[2]=0;
59 1 akiss
//#pragma omp parallel shared(global_barycenter, init_vertices, init_vertices_number)
60 1 akiss
//{
61 1 akiss
//#pragma omp for
62 1 akiss
for (int i=0;i<init_vertices_number;i++){global_barycenter[1]+=init_vertices[2*i]/init_vertices_number;
63 1 akiss
                                global_barycenter[2]+=init_vertices[2*i+1]/init_vertices_number;}
64 1 akiss
//#pragma omp for
65 1 akiss
for (int i=0;i<init_vertices_number;i++){init_vertices[2*i]-=global_barycenter[1];
66 1 akiss
                                     init_vertices[2*i+1]-=global_barycenter[2];}
67 1 akiss
//}
68 1 akiss
// tissue centered
69 1 akiss
70 1 akiss
/* find the walls which are on the boundary of the tissue */
71 1 akiss
int* init_boundary; init_boundary=(int*)calloc(init_vertices_number_in_each_cell[init_cell_number],sizeof(int));
72 1 akiss
find_boundary_walls(init_cells_vertices, init_vertices_number_in_each_cell, init_cell_number, init_boundary, &init_wall_number);
73 1 akiss
int * init_wall_vertices; init_wall_vertices=(int*)calloc(2*init_wall_number,sizeof(int));
74 1 akiss
compute_wall_vertices( init_cells_vertices, init_vertices_number_in_each_cell, init_cell_number, init_wall_vertices);
75 1 akiss
// boundary identified
76 1 akiss
77 1 akiss
// define the parameters over witch there is a loop
78 1 akiss
// threshold=0 -> division following the highest tension
79 1 akiss
// threshold<0 -> division following the shortest axis of the cell
80 1 akiss
81 1 akiss
// initialize the files where the data will be saved. Yes that's a lot of them
82 1 akiss
83 1 akiss
//    for (int m=7; m<=7; m++){
84 1 akiss
//    FILE *f=NULL; char file_name[256];
85 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_boundary.txt",1.-((double)m)*0.1);
86 1 akiss
//    f=fopen(file_name,"a+");
87 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
88 1 akiss
//    fclose(f);
89 1 akiss
//    }
90 1 akiss
//    for (int m=7; m<=7; m++){
91 1 akiss
//    FILE *f=NULL; char file_name[256];
92 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_meristem.txt",1.-((double)m)*0.1);
93 1 akiss
//    f=fopen(file_name,"a+");
94 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
95 1 akiss
//    fclose(f);
96 1 akiss
//    }
97 1 akiss
//    for (int m=7; m<=7; m++){
98 1 akiss
//    FILE *f=NULL; char file_name[256];
99 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_boundary.txt",1.-((double)m)*0.1);
100 1 akiss
//    f=fopen(file_name,"a+");
101 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
102 1 akiss
//    fclose(f);
103 1 akiss
//    }
104 1 akiss
//    for (int m=7; m<=7; m++){
105 1 akiss
//    FILE *f=NULL; char file_name[256];
106 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_meristem.txt",1.-((double)m)*0.1);
107 1 akiss
//    f=fopen(file_name,"a+");
108 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
109 1 akiss
//    fclose(f);
110 1 akiss
//    }
111 1 akiss
//    for (int m=7; m<=7; m++){
112 1 akiss
//    FILE *f=NULL; char file_name[256];
113 1 akiss
//    sprintf(file_name,"results_v7/boundary_curvature/stress_%1.1f.txt",1.-((double)m)*0.1);
114 1 akiss
//    f=fopen(file_name,"a+");
115 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
116 1 akiss
//    fclose(f);
117 1 akiss
//    }
118 1 akiss
//    for (int m=7; m<=7; m++){
119 1 akiss
//    FILE *f=NULL; char file_name[256];
120 1 akiss
//    sprintf(file_name,"results_v7/boundary_curvature/shape_%1.1f.txt",1.-((double)m)*0.1);
121 1 akiss
//    f=fopen(file_name,"a+");
122 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
123 1 akiss
//    fclose(f);
124 1 akiss
//    }
125 1 akiss
//    for (int m=7; m<=7; m++){
126 1 akiss
//    FILE *f=NULL; char file_name[256];
127 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_boundary_filter.txt",1.-((double)m)*0.1);
128 1 akiss
//    f=fopen(file_name,"a+");
129 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
130 1 akiss
//    fclose(f);
131 1 akiss
//    }
132 1 akiss
//    for (int m=7; m<=7; m++){
133 1 akiss
//    FILE *f=NULL; char file_name[256];
134 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_meristem_filter.txt",1.-((double)m)*0.1);
135 1 akiss
//    f=fopen(file_name,"a+");
136 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
137 1 akiss
//    fclose(f);
138 1 akiss
//    }
139 1 akiss
//    for (int m=7; m<=7; m++){
140 1 akiss
//    FILE *f=NULL; char file_name[256];
141 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_boundary_filter.txt",1.-((double)m)*0.1);
142 1 akiss
//    f=fopen(file_name,"a+");
143 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
144 1 akiss
//    fclose(f);
145 1 akiss
//    }
146 1 akiss
//    for (int m=7; m<=7; m++){
147 1 akiss
//    FILE *f=NULL; char file_name[256];
148 1 akiss
//    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_meristem_filter.txt",1.-((double)m)*0.1);
149 1 akiss
//    f=fopen(file_name,"a+");
150 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
151 1 akiss
//    fclose(f);
152 1 akiss
//    }
153 1 akiss
//    for (int m=7; m<=7; m++){
154 1 akiss
//    FILE *f=NULL; char file_name[256];
155 1 akiss
//    sprintf(file_name,"results_v7/boundary_curvature/stress_%1.1f_filter.txt",1.-((double)m)*0.1);
156 1 akiss
//    f=fopen(file_name,"a+");
157 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
158 1 akiss
//    fclose(f);
159 1 akiss
//    }
160 1 akiss
//    for (int m=7; m<=7; m++){
161 1 akiss
//    FILE *f=NULL; char file_name[256];
162 1 akiss
//    sprintf(file_name,"results_v7/boundary_curvature/shape_%1.1f_filter.txt",1.-((double)m)*0.1);
163 1 akiss
//    f=fopen(file_name,"a+");
164 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
165 1 akiss
//    fclose(f);
166 1 akiss
//    }
167 1 akiss
168 1 akiss
//    for (int m=5; m<=10; m++){
169 1 akiss
//    FILE *f=NULL; char file_name[256];
170 1 akiss
//    sprintf(file_name,"results_v7/pressure/stress_%1.1f.txt",1.+((double)m)*0.1);
171 1 akiss
//    f=fopen(file_name,"a+");
172 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
173 1 akiss
//    fclose(f);
174 1 akiss
//    }
175 1 akiss
//    for (int m=5; m<=10; m++){
176 1 akiss
//    FILE *f=NULL; char file_name[256];
177 1 akiss
//    sprintf(file_name,"results_v7/pressure/shape_%1.1f.txt",1.+((double)m)*0.1);
178 1 akiss
//    f=fopen(file_name,"a+");
179 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
180 1 akiss
//    fclose(f);
181 1 akiss
//    }
182 1 akiss
//    for (int m=5; m<=10; m++){
183 1 akiss
//    FILE *f=NULL; char file_name[256];
184 1 akiss
//    sprintf(file_name,"results_v7/pressure/stress_%1.1f_filter.txt",1.+((double)m)*0.1);
185 1 akiss
//    f=fopen(file_name,"a+");
186 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
187 1 akiss
//    fclose(f);
188 1 akiss
//    }
189 1 akiss
//    for (int m=5; m<=10; m++){
190 1 akiss
//    FILE *f=NULL; char file_name[256];
191 1 akiss
//    sprintf(file_name,"results_v7/pressure/shape_%1.1f_filter.txt",1.+((double)m)*0.1);
192 1 akiss
//    f=fopen(file_name,"a+");
193 1 akiss
//    fprintf(f,"mother vertex daughter x y z\n");
194 1 akiss
//    fclose(f);
195 1 akiss
//    }
196 1 akiss
197 1 akiss
    for (int m=0; m<=0; m++){
198 1 akiss
    FILE *f=NULL; char file_name[256];
199 1 akiss
    sprintf(file_name,"results_v7/isotropic_2/stress.txt");
200 1 akiss
    f=fopen(file_name,"a+");
201 1 akiss
    fprintf(f,"mother vertex daughter x y z\n");
202 1 akiss
    fclose(f);
203 1 akiss
    }
204 1 akiss
    for (int m=0; m<=0; m++){
205 1 akiss
    FILE *f=NULL; char file_name[256];
206 1 akiss
    sprintf(file_name,"results_v7/isotropic_2/shape.txt");
207 1 akiss
    f=fopen(file_name,"a+");
208 1 akiss
    fprintf(f,"mother vertex daughter x y z\n");
209 1 akiss
    fclose(f);
210 1 akiss
    }
211 1 akiss
    for (int m=0; m<=0; m++){
212 1 akiss
    FILE *f=NULL; char file_name[256];
213 1 akiss
    sprintf(file_name,"results_v7/isotropic_2/stress_filter.txt");
214 1 akiss
    f=fopen(file_name,"a+");
215 1 akiss
    fprintf(f,"mother vertex daughter x y z\n");
216 1 akiss
    fclose(f);
217 1 akiss
    }
218 1 akiss
    for (int m=0; m<=0; m++){
219 1 akiss
    FILE *f=NULL; char file_name[256];
220 1 akiss
    sprintf(file_name,"results_v7/isotropic_2/shape_filter.txt");
221 1 akiss
    f=fopen(file_name,"a+");
222 1 akiss
    fprintf(f,"mother vertex daughter x y z\n");
223 1 akiss
    fclose(f);
224 1 akiss
    }
225 1 akiss
//
226 1 akiss
227 1 akiss
228 1 akiss
// parallel loop over the parameters
229 1 akiss
#pragma omp parallel for schedule(dynamic,1) collapse(3)
230 1 akiss
for (int meristem=0; meristem<=19; meristem++){ // several meristem, just the initial conditions are different
231 1 akiss
for (int anisotropy=0; anisotropy<=0; anisotropy++){ // amplitude of the stress anisotropy
232 1 akiss
    //for (int stress_source=1; stress_source<=1; stress_source++){ // origin of the stress: 0=growth, 1=curvature
233 1 akiss
        for (int rule=-1; rule<=0; rule++){
234 1 akiss
235 1 akiss
236 1 akiss
    ablated_cell=-1; // -1=no ablation, any other number n = the cell number n is killed
237 1 akiss
238 1 akiss
    iteration=0;
239 1 akiss
240 1 akiss
    threshold_division=(double)rule; // rule used for the cell division
241 1 akiss
            // negative number = cell divided along the short axis
242 1 akiss
            // 0 = cell divided along the maximal stress
243 1 akiss
            // positive number = probabilistic rule based on the mdeviatoric stress
244 1 akiss
245 1 akiss
            // define the stress anisotropy
246 1 akiss
//    if (stress_source==0){ // anisotropy comes from growth
247 1 akiss
//        growth_differential=0.999999-((double)anisotropy)*0.1;
248 1 akiss
//        first_shape_derived_stress=3.e-2;
249 1 akiss
//        second_shape_derived_stress=3.e-2;
250 1 akiss
//    }
251 1 akiss
//    if (stress_source==1){ // anisotropy comes from curvature
252 1 akiss
//        growth_differential=0.999999;
253 1 akiss
//        first_shape_derived_stress=3.e-2;
254 1 akiss
//        second_shape_derived_stress=(3.e-2)*(1.-((double)anisotropy)*0.1);
255 1 akiss
//    }
256 1 akiss
257 1 akiss
258 1 akiss
/* allocation of memory */
259 1 akiss
int vertices_number=init_vertices_number;
260 1 akiss
int cell_number=init_cell_number;
261 1 akiss
int wall_number=init_wall_number;
262 1 akiss
int i;
263 1 akiss
double * vertices; vertices=(double*)calloc(2*vertices_number,sizeof(double)); /* coordinates of the vertices */
264 1 akiss
for (i=0;i<2*vertices_number;i++){vertices[i]=(double)init_vertices[i];}
265 1 akiss
double r; double theta;
266 1 akiss
for (i=0;i<vertices_number;i++){r=0.3*(double)(rand())/(double)RAND_MAX; theta=2.*pi*(double)(rand())/(double)RAND_MAX;
267 1 akiss
    vertices[2*i]+=r*cos(theta); vertices[2*i+1]+=r*sin(theta);
268 1 akiss
}
269 1 akiss
int * vertices_number_in_each_cell; vertices_number_in_each_cell=(int*)calloc(cell_number+1,sizeof(int)); /* list of the number of vertices in each cell */
270 1 akiss
for (i=0;i<cell_number+1;i++){vertices_number_in_each_cell[i]=init_vertices_number_in_each_cell[i];}
271 1 akiss
int * cells_vertices; cells_vertices=(int*)calloc(vertices_number_in_each_cell[cell_number],sizeof(int)); /* list of the vertices of each cell, cell-per-cell */
272 1 akiss
for (i=0;i<vertices_number_in_each_cell[cell_number];i++){cells_vertices[i]=init_cells_vertices[i];}
273 1 akiss
int * wall_vertices; wall_vertices=(int*)calloc(2*wall_number,sizeof(int)); /* list of the vertices of all the walls, wall-per-wall */
274 1 akiss
for (i=0;i<2*wall_number;i++){wall_vertices[i]=init_wall_vertices[i];}
275 1 akiss
double * lengths; lengths=(double*)calloc(wall_number,sizeof(double)); /* lengths of the anticlinal walls */
276 1 akiss
double * target_lengths; target_lengths=(double*)calloc(wall_number,sizeof(double)); /* target lengths of the anticlinal walls */
277 1 akiss
int * cell_walls; cell_walls=(int*)calloc(vertices_number_in_each_cell[cell_number],sizeof(int)); /* list of the wall of all the cells, cell-per-cell
278 1 akiss
double * barycenters; barycenters=(double*)calloc(cell_number*2,sizeof(double)); /* positions of centers of cells */
279 1 akiss
double * shapes; shapes=(double*)calloc(cell_number*3,sizeof(double)); /* shapes of cells */
280 1 akiss
double * targets; targets=(double*)calloc(cell_number*3,sizeof(double)); /* targets of cells */
281 1 akiss
double * areas; areas=(double*)calloc(vertices_number_in_each_cell[cell_number],sizeof(double)); /* areas of all the triangles between two vertices and the barycenter */
282 1 akiss
double * cell_areas; cell_areas=(double*)calloc(cell_number, sizeof(double)); /* areas of cells */
283 1 akiss
double * forces; forces=(double*)calloc(2*vertices_number, sizeof(double)); /* forces on vertices */
284 1 akiss
double * stress_periclinal; stress_periclinal=(double*)calloc(3*cell_number, sizeof(double)); /* stress on the in-the-plane walls */
285 1 akiss
double * stress_anticlinal; stress_anticlinal=(double*)calloc(3*wall_number, sizeof(double)); /* stress on the out-the-plane walls */
286 1 akiss
int * boundary; boundary=(int*)calloc(vertices_number_in_each_cell[cell_number],sizeof(int)); /* indicates if a wall belongs to the boundary of the tissue */
287 1 akiss
for (i=0;i<vertices_number_in_each_cell[cell_number];i++){boundary[i]=init_boundary[i];}
288 1 akiss
double * growth_rate; growth_rate=(double*)calloc(cell_number,sizeof(double)); /* list of the growth rate of each cell*/
289 1 akiss
int * border; border=(int*)calloc(cell_number,sizeof(int)); /* indicates if a cell belongs to the boundary of the tissue  */
290 1 akiss
for (i=0; i<cell_number;i++){ growth_rate[i]=1.; border[i]=0;
291 1 akiss
    for (int j=vertices_number_in_each_cell[i]; j<vertices_number_in_each_cell[i+1];j++){
292 1 akiss
        if (boundary[j]==1.){ growth_rate[i]=growth_differential; border[i]=1; }
293 1 akiss
    }
294 1 akiss
}
295 1 akiss
double * relative_pressure; relative_pressure=(double*)calloc(cell_number,sizeof(double)); /* llist of the pressure in each cell */
296 1 akiss
for (int i=0; i<cell_number; i++){ relative_pressure[i]=1.;}
297 1 akiss
298 1 akiss
/* from the vertices, initialize the program by calculating everything that has to be so: lengths, areas, stresses, ... */
299 1 akiss
initialize(vertices,vertices_number,cells_vertices,vertices_number_in_each_cell,cell_number, wall_vertices, wall_number, cell_walls,
300 1 akiss
           barycenters,shapes,targets,lengths,target_lengths,areas,cell_areas,forces,stress_periclinal, stress_anticlinal);
301 1 akiss
302 1 akiss
/* loop until the tissue reaches the limit size */
303 1 akiss
int check_division; int total_cell_number=1;
304 1 akiss
while (cell_number<max_cell_number /*&& iteration<step_number*/){check_division=0;
305 1 akiss
//while (iteration<step_number || ablated_cell==-1){check_division=0;
306 1 akiss
307 1 akiss
    compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters);
308 1 akiss
    compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas);
309 1 akiss
    compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas);
310 1 akiss
    compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes);
311 1 akiss
    /* one step of energy minimization and growth */
312 1 akiss
    step(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, wall_vertices, wall_number, cell_walls,
313 1 akiss
         barycenters, shapes, targets, lengths, target_lengths, areas, cell_areas, forces, stress_periclinal, stress_anticlinal,
314 1 akiss
         boundary, growth_rate, relative_pressure);
315 1 akiss
316 1 akiss
    /* compute the stress in the pericinal walls if it is necesssary for the divisions */
317 1 akiss
    if (threshold_division>=0.){
318 1 akiss
        for (i=0; i<cell_number;i++){
319 1 akiss
            compute_stress_periclinal(i, vertices, vertices_number_in_each_cell, cell_number, stress_periclinal, shapes, targets, cell_areas, wall_vertices, cell_walls, lengths, target_lengths);
320 1 akiss
        }
321 1 akiss
    }
322 1 akiss
323 1 akiss
    /* check if division is required, i.e. if a cell is too big */
324 1 akiss
     for (i=0;i<cell_number;i++){
325 1 akiss
        if (cell_areas[i]>threshold_area && i!=ablated_cell){check_division=1; int save_cell=1; /*if (stress_source==1){ */save_cell=1-border[i];//}
326 1 akiss
327 1 akiss
328 1 akiss
            /* test: increase the pressure in the cell just before division, see how it modifies the divisions */
329 1 akiss
                relative_pressure[i]=1.+(double)anisotropy*0.1;//}
330 1 akiss
            minimize_BFGS(vertices_number, cell_number, vertices, cells_vertices, vertices_number_in_each_cell, barycenters, shapes, targets, areas, cell_areas, wall_vertices, wall_number, lengths, target_lengths, boundary,relative_pressure);
331 1 akiss
            compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas);
332 1 akiss
            compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas); //printf("step2\n");int bug[1]={0};
333 1 akiss
            compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters);
334 1 akiss
            compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes);
335 1 akiss
            compute_lengths(vertices, wall_vertices, wall_number, lengths);
336 1 akiss
            for (int k=0; k<cell_number;k++){
337 1 akiss
                compute_stress_periclinal(k, vertices, vertices_number_in_each_cell, cell_number, stress_periclinal, shapes, targets, cell_areas, wall_vertices, cell_walls, lengths, target_lengths);
338 1 akiss
            }
339 1 akiss
            relative_pressure[i]=1.;
340 1 akiss
            /* end of the test, pressure back to normal */
341 1 akiss
342 1 akiss
    /* temporal variables to identify the neighbours of the dividing cell  */
343 1 akiss
    int adjacent_cells_number[1]; int adjacent_cell1[1]; int adjacent_cell2[1];
344 1 akiss
    int daughter_cells_vertices_number[2]={0,0}; int cell1[10],cell2[10],wall1[2],wall2[2];
345 1 akiss
346 1 akiss
    /* division, with reallocation of the memory */
347 1 akiss
    cell_number+=1; vertices_number+=2; wall_number+=3;
348 1 akiss
    vertices=(double*)realloc(vertices, sizeof(double)*2*vertices_number);
349 1 akiss
    forces=(double*)realloc(forces, sizeof(double)*2*vertices_number);
350 1 akiss
    vertices_number_in_each_cell=(int*)realloc(vertices_number_in_each_cell, sizeof(int)*(cell_number+1));
351 1 akiss
    barycenters=(double*)realloc(barycenters, sizeof(double)*2*cell_number);
352 1 akiss
    shapes=(double*)realloc(shapes, sizeof(double)*3*cell_number);
353 1 akiss
    targets=(double*)realloc(targets, sizeof(double)*3*cell_number);
354 1 akiss
    stress_periclinal=(double*)realloc(stress_periclinal, sizeof(double)*3*cell_number);
355 1 akiss
    stress_anticlinal=(double*)realloc(stress_anticlinal, sizeof(double)*3*wall_number);
356 1 akiss
    cell_areas=(double*)realloc(cell_areas, sizeof(double)*cell_number);
357 1 akiss
    growth_rate=(double*)realloc(growth_rate,sizeof(double)*cell_number); growth_rate[cell_number-1]=growth_rate[i];
358 1 akiss
    border=(int*)realloc(border,sizeof(int)*cell_number); border[cell_number-1]=0;
359 1 akiss
    relative_pressure=(double*)realloc(relative_pressure,sizeof(double)*cell_number); relative_pressure[cell_number-1]=1.;
360 1 akiss
361 1 akiss
            /* find the direction of division and the position of the new vertices */
362 1 akiss
    cell_division(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number,
363 1 akiss
          barycenters, i, boundary, stress_periclinal, shapes,
364 1 akiss
          adjacent_cells_number, adjacent_cell1, adjacent_cell2, daughter_cells_vertices_number, cell1, cell2, wall1, wall2);
365 1 akiss
366 1 akiss
    cells_vertices=(int*)realloc(cells_vertices, sizeof(int)*(vertices_number_in_each_cell[cell_number-1]+4+adjacent_cells_number[0]));
367 1 akiss
    wall_vertices=(int*)realloc(wall_vertices, sizeof(int)*2*wall_number);
368 1 akiss
    lengths=(double*)realloc(lengths, sizeof(double)*(wall_number));
369 1 akiss
    target_lengths=(double*)realloc(target_lengths, sizeof(double)*(wall_number));
370 1 akiss
    cell_walls=(int*)realloc(cell_walls, sizeof(int)*(vertices_number_in_each_cell[cell_number-1]+4+adjacent_cells_number[0]));
371 1 akiss
    areas=(double*)realloc(areas, sizeof(double)*(vertices_number_in_each_cell[cell_number-1]+4+adjacent_cells_number[0]));
372 1 akiss
    boundary=(int*)realloc(boundary, sizeof(int)*(vertices_number_in_each_cell[cell_number-1]+4+adjacent_cells_number[0]));
373 1 akiss
374 1 akiss
            /* actually performs the division based on the division identified above */
375 1 akiss
    cell_division2(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, wall_vertices, wall_number,
376 1 akiss
        barycenters, areas, cell_areas, lengths, target_lengths, shapes, targets, i, boundary, border,
377 1 akiss
        adjacent_cells_number[0], adjacent_cell1[0], adjacent_cell2[0], daughter_cells_vertices_number, cell1, cell2, wall1, wall2);
378 1 akiss
379 1 akiss
            /* update what is modified by the division */
380 1 akiss
    compute_cell_walls(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, cell_walls, wall_vertices, wall_number);
381 1 akiss
    compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas);
382 1 akiss
    compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas);
383 1 akiss
    compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters);
384 1 akiss
    compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes);
385 1 akiss
    compute_lengths(vertices, wall_vertices, wall_number, lengths);
386 1 akiss
387 1 akiss
388 1 akiss
            /* minimize the energy after division */
389 1 akiss
    minimize_BFGS(vertices_number, cell_number, vertices, cells_vertices, vertices_number_in_each_cell, barycenters, shapes, targets, areas, cell_areas, wall_vertices, wall_number, lengths, target_lengths, boundary,relative_pressure);
390 1 akiss
    compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas);
391 1 akiss
    compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas);
392 1 akiss
    compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters);
393 1 akiss
    compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes);
394 1 akiss
    compute_lengths(vertices, wall_vertices, wall_number, lengths);
395 1 akiss
396 1 akiss
397 1 akiss
            /* save the history of the divisions, used as by Marion in her statistical analysis */
398 1 akiss
    #pragma omp critical
399 1 akiss
    {
400 1 akiss
    if (save_cell==1){
401 1 akiss
        FILE *f=NULL; char file_name[256];
402 1 akiss
403 1 akiss
        /*if (stress_source==1){
404 1 akiss
            if (rule==-1){
405 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/shape_%1.1f.txt",1.-((double)anisotropy)*0.1);
406 1 akiss
            }
407 1 akiss
            if (rule==0){
408 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/stress_%1.1f.txt",1.-((double)anisotropy)*0.1);
409 1 akiss
            }
410 1 akiss
        }
411 1 akiss

412 1 akiss
        if (stress_source==0){
413 1 akiss
           if (growth_rate[i]==1.){
414 1 akiss
                if (rule==-1){
415 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_meristem.txt",1.-((double)anisotropy)*0.1);
416 1 akiss
                }
417 1 akiss
                if (rule==0){
418 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_meristem.txt",1.-((double)anisotropy)*0.1);
419 1 akiss
                }
420 1 akiss
            }
421 1 akiss
            if (growth_rate[i]!=1.){
422 1 akiss
                if (rule==-1){
423 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_boundary.txt",1.-((double)anisotropy)*0.1);
424 1 akiss
                }
425 1 akiss
                if (rule==0){
426 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_boundary.txt",1.-((double)anisotropy)*0.1);
427 1 akiss
                }
428 1 akiss
            }
429 1 akiss
        }*/
430 1 akiss
//            if (rule==-1){
431 1 akiss
//                sprintf(file_name,"results_v7/pressure/shape_%1.1f.txt",1.+((double)anisotropy)*0.1);
432 1 akiss
//            }
433 1 akiss
//            if (rule==0){
434 1 akiss
//                sprintf(file_name,"results_v7/pressure/stress_%1.1f.txt",1.+((double)anisotropy)*0.1);
435 1 akiss
//            }
436 1 akiss
437 1 akiss
            if (rule==-1){
438 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/shape.txt");
439 1 akiss
            }
440 1 akiss
            if (rule==0){
441 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/stress.txt");
442 1 akiss
            }
443 1 akiss
444 1 akiss
        f=fopen(file_name,"a");
445 1 akiss
446 1 akiss
        int write=0,count=0,count2=0;
447 1 akiss
        while (count<(daughter_cells_vertices_number[1]-1)){
448 1 akiss
            if (write){
449 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell2[count2%daughter_cells_vertices_number[1]]+1,/*total_cell_number+1*/0/*cell_number-1*/,
450 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]],
451 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]+1]);
452 1 akiss
                count++;
453 1 akiss
            }
454 1 akiss
            write+=((cell2[count2%daughter_cells_vertices_number[1]])==(vertices_number-2));
455 1 akiss
            count2++;
456 1 akiss
        }
457 1 akiss
        write=0; count=0; count2=0;
458 1 akiss
        while (count<(daughter_cells_vertices_number[0]-1)){
459 1 akiss
            if (write){
460 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell1[count2%daughter_cells_vertices_number[0]]+1,/*total_cell_number+2*/1/*i*/,
461 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]],
462 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]+1]);
463 1 akiss
                count++;
464 1 akiss
            }
465 1 akiss
            write+=((cell1[count2%daughter_cells_vertices_number[0]])==(vertices_number-1));
466 1 akiss
            count2++;
467 1 akiss
        }
468 1 akiss
        fclose(f);
469 1 akiss
        }
470 1 akiss
    }
471 1 akiss
            /* division saved */
472 1 akiss
473 1 akiss
474 1 akiss
            /* same as above, but filter out the asymmetric divisions */
475 1 akiss
    #pragma omp critical
476 1 akiss
    {
477 1 akiss
    double area_ratio=cell_areas[i]/(cell_areas[cell_number-1]+cell_areas[i]); if (area_ratio>0.5){ area_ratio=1.-area_ratio;}
478 1 akiss
    double aspect_ratio=(shapes[3*i]+shapes[3*i+1])/2.;
479 1 akiss
    aspect_ratio-=0.5*sqrt((shapes[3*i]-shapes[3*i+1])*(shapes[3*i]-shapes[3*i+1])+4.*shapes[3*i+2]*shapes[3*i+2]);
480 1 akiss
    aspect_ratio=aspect_ratio/(shapes[3*i]+shapes[3*i+1]-aspect_ratio); aspect_ratio=sqrt(aspect_ratio);
481 1 akiss
482 1 akiss
    if (save_cell==1 && area_ratio>0.4 && aspect_ratio>0.5){
483 1 akiss
        FILE *f=NULL; char file_name[256];
484 1 akiss
485 1 akiss
        /*if (stress_source==1){
486 1 akiss
            if (rule==-1){
487 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/shape_%1.1f_filter.txt",1.-((double)anisotropy)*0.1);
488 1 akiss
            }
489 1 akiss
            if (rule==0){
490 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/stress_%1.1f_filter.txt",1.-((double)anisotropy)*0.1);
491 1 akiss
            }
492 1 akiss
        }
493 1 akiss

494 1 akiss
        if (stress_source==0){
495 1 akiss
           if (growth_rate[i]==1.){
496 1 akiss
                if (rule==-1){
497 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_meristem_filter.txt",1.-((double)anisotropy)*0.1);
498 1 akiss
                }
499 1 akiss
                if (rule==0){
500 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_meristem_filter.txt",1.-((double)anisotropy)*0.1);
501 1 akiss
                }
502 1 akiss
            }
503 1 akiss
            if (growth_rate[i]!=1.){
504 1 akiss
                if (rule==-1){
505 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_boundary_filter.txt",1.-((double)anisotropy)*0.1);
506 1 akiss
                }
507 1 akiss
                if (rule==0){
508 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_boundary_filter.txt",1.-((double)anisotropy)*0.1);
509 1 akiss
                }
510 1 akiss
            }
511 1 akiss
        }*/
512 1 akiss
//            if (rule==-1){
513 1 akiss
//                sprintf(file_name,"results_v7/pressure/shape_%1.1f_filter.txt",1.+((double)anisotropy)*0.1);
514 1 akiss
//            }
515 1 akiss
//            if (rule==0){
516 1 akiss
//                sprintf(file_name,"results_v7/pressure/stress_%1.1f_filter.txt",1.+((double)anisotropy)*0.1);
517 1 akiss
//            }
518 1 akiss
519 1 akiss
            if (rule==-1){
520 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/shape_filter.txt");
521 1 akiss
            }
522 1 akiss
            if (rule==0){
523 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/stress_filter.txt");
524 1 akiss
            }
525 1 akiss
526 1 akiss
        f=fopen(file_name,"a");
527 1 akiss
528 1 akiss
        int write=0,count=0,count2=0;
529 1 akiss
        while (count<(daughter_cells_vertices_number[1]-1)){
530 1 akiss
            if (write){
531 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell2[count2%daughter_cells_vertices_number[1]]+1,/*total_cell_number+1*/0/*cell_number-1*/,
532 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]],
533 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]+1]);
534 1 akiss
                count++;
535 1 akiss
            }
536 1 akiss
            write+=((cell2[count2%daughter_cells_vertices_number[1]])==(vertices_number-2));
537 1 akiss
            count2++;
538 1 akiss
        }
539 1 akiss
        write=0; count=0; count2=0;
540 1 akiss
        while (count<(daughter_cells_vertices_number[0]-1)){
541 1 akiss
            if (write){
542 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell1[count2%daughter_cells_vertices_number[0]]+1,/*total_cell_number+2*/1/*i*/,
543 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]],
544 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]+1]);
545 1 akiss
                count++;
546 1 akiss
            }
547 1 akiss
            write+=((cell1[count2%daughter_cells_vertices_number[0]])==(vertices_number-1));
548 1 akiss
            count2++;
549 1 akiss
        }
550 1 akiss
        fclose(f);
551 1 akiss
        }
552 1 akiss
    }
553 1 akiss
554 1 akiss
555 1 akiss
    #pragma omp critical
556 1 akiss
    {
557 1 akiss
    if (save_cell==1){
558 1 akiss
        FILE *f=NULL; char file_name[256];
559 1 akiss
560 1 akiss
        /*if (stress_source==1){
561 1 akiss
            if (rule==-1){
562 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/shape_%1.1f.txt",1.-((double)anisotropy)*0.1);
563 1 akiss
            }
564 1 akiss
            if (rule==0){
565 1 akiss
                sprintf(file_name,"results_v7/boundary_curvature/stress_%1.1f.txt",1.-((double)anisotropy)*0.1);
566 1 akiss
            }
567 1 akiss
        }
568 1 akiss

569 1 akiss
        if (stress_source==0){
570 1 akiss
           if (growth_rate[i]==1.){
571 1 akiss
                if (rule==-1){
572 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_meristem.txt",1.-((double)anisotropy)*0.1);
573 1 akiss
                }
574 1 akiss
                if (rule==0){
575 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_meristem.txt",1.-((double)anisotropy)*0.1);
576 1 akiss
                }
577 1 akiss
            }
578 1 akiss
            if (growth_rate[i]!=1.){
579 1 akiss
                if (rule==-1){
580 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/shape_%1.1f_boundary.txt",1.-((double)anisotropy)*0.1);
581 1 akiss
                }
582 1 akiss
                if (rule==0){
583 1 akiss
                    sprintf(file_name,"results_v7/boundary_growth/stress_%1.1f_boundary.txt",1.-((double)anisotropy)*0.1);
584 1 akiss
                }
585 1 akiss
            }
586 1 akiss
        }*/
587 1 akiss
//            if (rule==-1){
588 1 akiss
//                sprintf(file_name,"results_v7/pressure/shape_%1.1f.txt",1.+((double)anisotropy)*0.1);
589 1 akiss
//            }
590 1 akiss
//            if (rule==0){
591 1 akiss
//                sprintf(file_name,"results_v7/pressure/stress_%1.1f.txt",1.+((double)anisotropy)*0.1);
592 1 akiss
//            }
593 1 akiss
594 1 akiss
            if (rule==-1){
595 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/shape.txt");
596 1 akiss
            }
597 1 akiss
            if (rule==0){
598 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/stress.txt");
599 1 akiss
            }
600 1 akiss
601 1 akiss
        f=fopen(file_name,"a");
602 1 akiss
603 1 akiss
        int write=0,count=0,count2=0;
604 1 akiss
        while (count<(daughter_cells_vertices_number[1]-1)){
605 1 akiss
            if (write){
606 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell2[count2%daughter_cells_vertices_number[1]]+1,/*total_cell_number+1*/0/*cell_number-1*/,
607 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]],
608 1 akiss
                        vertices[2*cell2[count2%daughter_cells_vertices_number[1]]+1]);
609 1 akiss
                count++;
610 1 akiss
            }
611 1 akiss
            write+=((cell2[count2%daughter_cells_vertices_number[1]])==(vertices_number-2));
612 1 akiss
            count2++;
613 1 akiss
        }
614 1 akiss
        write=0; count=0; count2=0;
615 1 akiss
        while (count<(daughter_cells_vertices_number[0]-1)){
616 1 akiss
            if (write){
617 1 akiss
                fprintf(f,"%d %d %d %f %f 0.0\n",1000*meristem+total_cell_number/*i+1*/,cell1[count2%daughter_cells_vertices_number[0]]+1,/*total_cell_number+2*/1/*i*/,
618 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]],
619 1 akiss
                        vertices[2*cell1[count2%daughter_cells_vertices_number[0]]+1]);
620 1 akiss
                count++;
621 1 akiss
            }
622 1 akiss
            write+=((cell1[count2%daughter_cells_vertices_number[0]])==(vertices_number-1));
623 1 akiss
            count2++;
624 1 akiss
        }
625 1 akiss
        fclose(f);
626 1 akiss
        }
627 1 akiss
    }
628 1 akiss
629 1 akiss
    #pragma omp critical
630 1 akiss
    {
631 1 akiss
    double area_ratio=cell_areas[i]/(cell_areas[cell_number-1]+cell_areas[i]); if (area_ratio>0.5){ area_ratio=1.-area_ratio;}
632 1 akiss
    double aspect_ratio=(shapes[3*i]+shapes[3*i+1])/2.;
633 1 akiss
    aspect_ratio-=0.5*sqrt((shapes[3*i]-shapes[3*i+1])*(shapes[3*i]-shapes[3*i+1])+4.*shapes[3*i+2]*shapes[3*i+2]);
634 1 akiss
    aspect_ratio=aspect_ratio/(shapes[3*i]+shapes[3*i+1]-aspect_ratio); aspect_ratio=sqrt(aspect_ratio);
635 1 akiss
636 1 akiss
    if (save_cell==1){
637 1 akiss
        FILE *f=NULL; char file_name[256];
638 1 akiss
639 1 akiss
640 1 akiss
            if (rule==-1){
641 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/shape_data.txt");
642 1 akiss
            }
643 1 akiss
            if (rule==0){
644 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/stress_data.txt");
645 1 akiss
            }
646 1 akiss
647 1 akiss
        f=fopen(file_name,"a");
648 1 akiss
        fprintf(f,"%d %f %f %d %f %f %f\n",1000*meristem+total_cell_number,cell_areas[i],aspect_ratio,
649 1 akiss
                vertices_number_in_each_cell[i+1]-vertices_number_in_each_cell[i],stress_periclinal[3*i],stress_periclinal[3*i+1],stress_periclinal[3*i+2]);
650 1 akiss
        fclose(f);
651 1 akiss
        }
652 1 akiss
    }
653 1 akiss
    #pragma omp critical
654 1 akiss
    {
655 1 akiss
    double area_ratio=cell_areas[i]/(cell_areas[cell_number-1]+cell_areas[i]); if (area_ratio>0.5){ area_ratio=1.-area_ratio;}
656 1 akiss
    double aspect_ratio=(shapes[3*i]+shapes[3*i+1])/2.;
657 1 akiss
    aspect_ratio-=0.5*sqrt((shapes[3*i]-shapes[3*i+1])*(shapes[3*i]-shapes[3*i+1])+4.*shapes[3*i+2]*shapes[3*i+2]);
658 1 akiss
    aspect_ratio=aspect_ratio/(shapes[3*i]+shapes[3*i+1]-aspect_ratio); aspect_ratio=sqrt(aspect_ratio);
659 1 akiss
660 1 akiss
    if (save_cell==1 && area_ratio>0.4 && aspect_ratio>0.5){
661 1 akiss
        FILE *f=NULL; char file_name[256];
662 1 akiss
663 1 akiss
664 1 akiss
            if (rule==-1){
665 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/shape_filter_data.txt");
666 1 akiss
            }
667 1 akiss
            if (rule==0){
668 1 akiss
                sprintf(file_name,"results_v7/isotropic_2/stress_filter_data.txt");
669 1 akiss
            }
670 1 akiss
671 1 akiss
        f=fopen(file_name,"a");
672 1 akiss
        fprintf(f,"%d %f %f %d %f %f %f\n",1000*meristem+total_cell_number,cell_areas[i],aspect_ratio,
673 1 akiss
                vertices_number_in_each_cell[i+1]-vertices_number_in_each_cell[i],stress_periclinal[3*i],stress_periclinal[3*i+1],stress_periclinal[3*i+2]);
674 1 akiss
        fclose(f);
675 1 akiss
        }
676 1 akiss
    }
677 1 akiss
678 1 akiss
679 1 akiss
680 1 akiss
    total_cell_number+=3;
681 1 akiss
682 1 akiss
683 1 akiss
684 1 akiss
}}
685 1 akiss
686 1 akiss
if (check_division==1){
687 1 akiss
        /* minimize the energy after all the divisions*/
688 1 akiss
    minimize_BFGS(vertices_number, cell_number, vertices, cells_vertices, vertices_number_in_each_cell, barycenters, shapes, targets, areas, cell_areas, wall_vertices, wall_number, lengths, target_lengths, boundary,relative_pressure);
689 1 akiss
690 1 akiss
}
691 1 akiss
692 1 akiss
compute_cell_walls(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, cell_walls, wall_vertices, wall_number);
693 1 akiss
compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas);
694 1 akiss
compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas); //printf("main3\n");
695 1 akiss
compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters);
696 1 akiss
compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes);
697 1 akiss
698 1 akiss
for (int i=0; i<cell_number;i++){
699 1 akiss
    compute_stress_periclinal(i, vertices, vertices_number_in_each_cell, cell_number, stress_periclinal, shapes, targets, cell_areas, wall_vertices, cell_walls, lengths, target_lengths);
700 1 akiss
}
701 1 akiss
702 1 akiss
for (int i=0; i<wall_number;i++){
703 1 akiss
    compute_stress_anticlinal(i, vertices, vertices_number_in_each_cell, cell_number, stress_anticlinal, wall_vertices, cell_walls, lengths, target_lengths);
704 1 akiss
}
705 1 akiss
706 1 akiss
    iteration++;
707 1 akiss
708 1 akiss
//    if (cell_number>=300 && ablated_cell==-1){ ablated_cell=m%300; iteration=0;}
709 1 akiss
710 1 akiss
    /* save all the variables, for my analysis */
711 1 akiss
    if (cell_number>=200){
712 1 akiss
        FILE *f=NULL; char file_name[256];
713 1 akiss
        /*if (stress_source==0){
714 1 akiss
            if (rule==-1){
715 1 akiss
        sprintf(file_name,"results_v7/data/growth_shape_%1.1f_%i_%i.txt",1.-((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
716 1 akiss
            }
717 1 akiss
            if (rule==0){
718 1 akiss
        sprintf(file_name,"results_v7/data/growth_stress_%1.1f_%i_%i.txt",1.-((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
719 1 akiss
            }
720 1 akiss
        }
721 1 akiss
        if (stress_source==1){
722 1 akiss
            if (rule==-1){
723 1 akiss
        sprintf(file_name,"results_v7/data/curvature_shape_%1.1f_%i_%i.txt",1.-((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
724 1 akiss
            }
725 1 akiss
            if (rule==0){
726 1 akiss
        sprintf(file_name,"results_v7/data/curvature_stress_%1.1f_%i_%i.txt",1.-((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
727 1 akiss
            }
728 1 akiss
        }*/
729 1 akiss
//            if (rule==-1){
730 1 akiss
//        sprintf(file_name,"results_v7/pressure/data/shape_%1.1f_%i_%i.txt",1.+((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
731 1 akiss
//            }
732 1 akiss
//            if (rule==0){
733 1 akiss
//        sprintf(file_name,"results_v7/pressure/data/stress_%1.1f_%i_%i.txt",1.+((double)anisotropy)*0.1,meristem,iteration); f=fopen(file_name,"w+");
734 1 akiss
//            }
735 1 akiss
736 1 akiss
            if (rule==-1){
737 1 akiss
        sprintf(file_name,"results_v7/isotropic_2/data/shape_%i_%i.txt",meristem,iteration); f=fopen(file_name,"w+");
738 1 akiss
            }
739 1 akiss
            if (rule==0){
740 1 akiss
        sprintf(file_name,"results_v7/isotropic_2/data/stress_%i_%i.txt",meristem,iteration); f=fopen(file_name,"w+");
741 1 akiss
            }
742 1 akiss
743 1 akiss
        save_data(f, vertices_number, vertices, cell_number, vertices_number_in_each_cell, cells_vertices, wall_number, barycenters, stress_periclinal, stress_anticlinal, boundary, cell_areas, lengths, shapes, targets, growth_rate, cell_walls);
744 1 akiss
        fclose(f);
745 1 akiss
    }
746 1 akiss
747 1 akiss
}
748 1 akiss
749 1 akiss
free(vertices); free(cells_vertices); free(vertices_number_in_each_cell); free(barycenters); free(shapes); free(targets); free(growth_rate); free(border); free(relative_pressure);
750 1 akiss
free(lengths); free(areas); free(cell_areas); free(forces); free(stress_periclinal); free(stress_anticlinal); free(boundary); free(target_lengths); free(cell_walls); free(wall_vertices);
751 1 akiss
752 1 akiss
//printf("jeu de param?tre termin? %d\n",m);
753 1 akiss
754 1 akiss
}}}//}
755 1 akiss
756 1 akiss
free(init_vertices); free(init_vertices_number_in_each_cell); free(init_cells_vertices); free(init_boundary); free(init_wall_vertices);
757 1 akiss
758 1 akiss
printf("fin du programme\n");
759 1 akiss
return 0;
760 1 akiss
}