Statistiques
| Révision :

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=&parameters2;
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