root / bin / step.cpp @ 1
Historique | Voir | Annoter | Télécharger (5,93 ko)
1 | 1 | akiss | #include "compute_cell_areas.h" |
---|---|---|---|
2 | 1 | akiss | #include "compute_areas.h" |
3 | 1 | akiss | #include "compute_lengths.h" |
4 | 1 | akiss | #include "compute_barycenters.h" |
5 | 1 | akiss | #include "step.h" |
6 | 1 | akiss | #include <stdio.h> |
7 | 1 | akiss | #include <math.h> |
8 | 1 | akiss | #include "minimize_BFGS.h" |
9 | 1 | akiss | #include "minimize_steepest_descent.h" |
10 | 1 | akiss | #include "growth_and_chemistry.h" |
11 | 1 | akiss | #include "compute_stress_periclinal.h" |
12 | 1 | akiss | #include "compute_stress_anticlinal.h" |
13 | 1 | akiss | #include "compute_cell_walls.h" |
14 | 1 | akiss | #include <gsl/gsl_odeiv2.h> |
15 | 1 | akiss | #include <gsl/gsl_errno.h> |
16 | 1 | akiss | #include "compute_energy_and_forces.h" |
17 | 1 | akiss | #include "compute_center_of_mass.h" |
18 | 1 | akiss | #include "save_data.h" |
19 | 1 | akiss | #include "compute_shapes.h" |
20 | 1 | akiss | #include <cstdlib> |
21 | 1 | akiss | #include "constants.h" |
22 | 1 | akiss | |
23 | 1 | akiss | |
24 | 1 | akiss | /* this function performs a time step (growth and chemistry, then mechanics) */
|
25 | 1 | akiss | |
26 | 1 | akiss | void step(double *vertices, int vertices_number, int *cells_vertices, int *vertices_number_in_each_cell, int cell_number, int *wall_vertices, int wall_number, int *cell_walls, |
27 | 1 | akiss | double *barycenters, double *shapes, double *targets, double *lengths, double *target_lengths, double *areas, double *cell_areas, double *forces, double *stress_periclinal, double *stress_anticlinal, |
28 | 1 | akiss | int *boundary, double *growth_rate, double *relative_pressure){ |
29 | 1 | akiss | |
30 | 1 | akiss | /* minimization of energy: move the vertices in order to make the energy as small as possible, i.e. in order to make cells
|
31 | 1 | akiss | as close as possible of their targets */
|
32 | 1 | akiss | //printf("step1\n");
|
33 | 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); |
34 | 1 | akiss | |
35 | 1 | akiss | compute_cell_walls(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, cell_walls, wall_vertices, wall_number); |
36 | 1 | akiss | compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas); |
37 | 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};
|
38 | 1 | akiss | compute_barycenters(vertices, vertices_number, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters); |
39 | 1 | akiss | compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes); |
40 | 1 | akiss | compute_lengths(vertices, wall_vertices, wall_number, lengths); |
41 | 1 | akiss | |
42 | 1 | akiss | for (int i=0; i<cell_number;i++){ |
43 | 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); |
44 | 1 | akiss | } |
45 | 1 | akiss | for (int i=0; i<wall_number;i++){ |
46 | 1 | akiss | compute_stress_anticlinal(i, vertices, vertices_number_in_each_cell, cell_number, stress_anticlinal, wall_vertices, cell_walls, lengths, target_lengths); |
47 | 1 | akiss | } |
48 | 1 | akiss | |
49 | 1 | akiss | //for (int i=0; i<cell_number;i++){ stress_periclinal[3*i]=0; stress_periclinal[3*i+1]=0; stress_periclinal[3*i+2]=0;
|
50 | 1 | akiss | // for (int j=vertices_number_in_each_cell[i]; j<vertices_number_in_each_cell[i+1];j++){
|
51 | 1 | akiss | // stress_periclinal[3*i]+=stress_anticlinal[3*cell_walls[j]]; stress_periclinal[3*i+1]+=stress_anticlinal[3*cell_walls[j]+1]; stress_periclinal[3*i+2]+=stress_anticlinal[3*cell_walls[j]+2];
|
52 | 1 | akiss | // }
|
53 | 1 | akiss | //}
|
54 | 1 | akiss | |
55 | 1 | akiss | /* save the data */
|
56 | 1 | akiss | //if ((iteration%100)==0 /*|| iteration==51*/){
|
57 | 1 | akiss | // FILE *f=NULL; char file_name[256];
|
58 | 1 | akiss | // sprintf(file_name,"results/boundary/results_%i/%i_%i_%i.txt",m,(int)threshold_division,((m/4)%4),iteration); f=fopen(file_name,"w+");
|
59 | 1 | akiss | // //sprintf(file_name,"results/ablation/%i_%i_%i_%i.txt",(int)threshold_division,(m/4)%300,m%4,iteration); f=fopen(file_name,"w+");
|
60 | 1 | akiss | // //sprintf(file_name,"results/isotropic/%i_%i_%i.txt",(int)threshold_division,m/2,iteration); f=fopen(file_name,"w+");
|
61 | 1 | akiss | // //sprintf(file_name,"results/results_%i/%i.txt",m,iteration); f=fopen(file_name,"w+");
|
62 | 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);
|
63 | 1 | akiss | // fclose(f);
|
64 | 1 | akiss | //}
|
65 | 1 | akiss | |
66 | 1 | akiss | /* center the tissue */
|
67 | 1 | akiss | //double center[2]={0,0};
|
68 | 1 | akiss | //for (int i=0;i<cell_number;i++){center[0]+=barycenters[2*i]; center[1]+=barycenters[2*i+1];}
|
69 | 1 | akiss | //center[0]/=cell_number; center[1]/=cell_number;
|
70 | 1 | akiss | //for (int i=0;i<cell_number;i++){barycenters[2*i]-=center[0]; barycenters[2*i+1]-=center[1];}
|
71 | 1 | akiss | //for (int i=0;i<vertices_number;i++){vertices[2*i]-=center[0]; vertices[2*i+1]-=center[1];}
|
72 | 1 | akiss | |
73 | 1 | akiss | /* resolution of growth */
|
74 | 1 | akiss | double noise[cell_number];
|
75 | 1 | akiss | for (int i=0; i<cell_number;i++){ |
76 | 1 | akiss | noise[i]=1.+noise_amplitude*(2.*(double)(rand())/(double)RAND_MAX-1.); |
77 | 1 | akiss | } |
78 | 1 | akiss | |
79 | 1 | akiss | struct parameters_list2 {int cell_number; int *cells_vertices; int *vertices_number_in_each_cell; double *shapes; double *lengths; double *cell_areas; double *barycenters; |
80 | 1 | akiss | int *cell_walls; int wall_number; int *boundary; int *wall_vertices; double *vertices; double *growth_rate; double *noise;}; |
81 | 1 | akiss | |
82 | 1 | akiss | struct parameters_list2 parameters2;
|
83 | 1 | akiss | parameters2.cell_number=cell_number; |
84 | 1 | akiss | parameters2.cells_vertices=cells_vertices; |
85 | 1 | akiss | parameters2.vertices_number_in_each_cell=vertices_number_in_each_cell; |
86 | 1 | akiss | parameters2.shapes=shapes; |
87 | 1 | akiss | parameters2.lengths=lengths; |
88 | 1 | akiss | parameters2.cell_areas=cell_areas; |
89 | 1 | akiss | parameters2.barycenters=barycenters; |
90 | 1 | akiss | parameters2.cell_walls=cell_walls; |
91 | 1 | akiss | parameters2.wall_number=wall_number; |
92 | 1 | akiss | parameters2.boundary=boundary; |
93 | 1 | akiss | parameters2.wall_vertices=wall_vertices; |
94 | 1 | akiss | parameters2.vertices=vertices; |
95 | 1 | akiss | parameters2.growth_rate=growth_rate; |
96 | 1 | akiss | parameters2.noise=noise; |
97 | 1 | akiss | void *pparameters2=¶meters2;
|
98 | 1 | akiss | int system_size=3*cell_number+wall_number; |
99 | 1 | akiss | |
100 | 1 | akiss | double x[system_size];
|
101 | 1 | akiss | for (int i=0;i<3*cell_number;i++){ x[i]=targets[i];} |
102 | 1 | akiss | for (int i=0;i<wall_number;i++){ x[3*cell_number+i]=target_lengths[i];} |
103 | 1 | akiss | |
104 | 1 | akiss | gsl_odeiv2_system sys={growth_and_chemistry, NULL, system_size, pparameters2};
|
105 | 1 | akiss | gsl_odeiv2_driver *d=gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk2, 1.e-3, 1.e-3, 0.); |
106 | 1 | akiss | int s; double t=0.0; |
107 | 1 | akiss | s=gsl_odeiv2_driver_apply(d, &t, 1.e1, x);
|
108 | 1 | akiss | //printf("résolution croissance/chimie: %d\n",s);
|
109 | 1 | akiss | //printf("test\n");
|
110 | 1 | akiss | for (int i=0;i<3*cell_number;i++){ targets[i]=x[i];} |
111 | 1 | akiss | for (int i=0;i<wall_number;i++){ target_lengths[i]=x[3*cell_number+i];} |
112 | 1 | akiss | gsl_odeiv2_driver_free(d); |
113 | 1 | akiss | |
114 | 1 | akiss | } |
115 | 1 | akiss | |
116 | 1 | akiss | |
117 | 1 | akiss | |
118 | 1 | akiss |