Révision 1

readme.txt (revision 1)
1
---------------------------------------------------------------------------
2
# "Cell division rule" project
3
(project ID : "leaf")
4
---------------------------------------------------------------------------
5
Biophysics Team - RDP ENS Lyon
6

  
7
Developers :
8
--------------
9
Jean-Daniel Julien
10

  
11

  
12
Download the repository / Rapatrier le dépot
13
--------------------------------------------
14
cd "directory that will contain the project's directory"
15
svn checkout http://forge.cbp.ens-lyon.fr/svn/leaf
16

  
17
Update (download changes from the repository)
18
--------------------------------------------
19
cd leaf
20
svn up
21

  
22
Commit (upload your changes into the repository)
23
-----------------------------------------------
24
cd leaf
25
svn commit
26

  
27
Changing the file tree
28
----------------------
29
if you want to add, delete or move individual files in the file-tree of the repository, you have to do that by svn
30
... cd in the right subdirectory
31
svn add toto
32
svn mv toto titi
33
svn rm titi
34
... and then make a commit (!)
35

  
36
Useful links
37
-------------
38
svn useful commands : http://wiki.greenstone.org/wiki/index.php/Useful_SVN_Commands
39
formats in a wiki : https://forge.cbp.ens-lyon.fr/redmine/help/wiki_syntax.html
40

  
bin/optimize_width.cpp (revision 1)
1
#include "optimize_width.h"
2
#include "compute_energy_width.h"
3
#include <nlopt.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <cmath>
7

  
8
void optimize_width(int vertex_number, double *vertices, int edge_number, int *edges_vertices,
9
                   double *lengths, double *rest_lengths, double *edges_width, int *periodizer, double *width, double *height){
10

  
11
nlopt_opt opt;
12
opt=nlopt_create(NLOPT_LN_BOBYQA,edge_number);
13

  
14
nlopt_set_stopval(opt, -HUGE_VAL);
15
nlopt_set_maxeval(opt, -1.);
16
nlopt_set_maxtime(opt, -1.);
17
nlopt_set_xtol_rel(opt, -1.);
18
nlopt_set_xtol_abs1(opt, 1.e-6);
19
nlopt_set_ftol_rel(opt, -1.);
20
nlopt_set_ftol_abs(opt, -1.);
21

  
22
struct parameters_list3 {int vertex_number; double *vertices; int edge_number; int *edges_vertices;
23
                        double *lengths; double *rest_lengths; int *periodizer; double *width; double *height;};
24

  
25
struct parameters_list3 parameters;
26
parameters.vertex_number=vertex_number;
27
parameters.vertices=vertices;
28
parameters.edge_number=edge_number;
29
parameters.edges_vertices=edges_vertices;
30
parameters.lengths=lengths;
31
parameters.rest_lengths=rest_lengths;
32
parameters.periodizer=periodizer;
33
parameters.width=width;
34
parameters.height=height;
35
void* pparameters=&parameters;
36

  
37
double width_optimize[edge_number]; double energy;
38
for (int i=0; i<edge_number;i++){ width_optimize[i]=edges_width[i];}
39

  
40
/// first resolution: find the reference width and height without the anisotropic stress
41
int reso=nlopt_set_min_objective(opt, compute_energy_width, pparameters);
42
nlopt_optimize(opt, width_optimize, &energy);
43
printf("%d\n",reso);
44

  
45
for (int i=0; i<edge_number;i++){edges_width[i]=width_optimize[i];}
46

  
47
nlopt_destroy(opt);
48

  
49
}
bin/compute_lengths.cpp (revision 1)
1
#include <math.h>
2
#include "constants.h"
3
#include "compute_lengths.h"
4
#include <stdio.h>
5

  
6
/* this functions computes the lengths of each wall */
7

  
8
void compute_lengths(double *vertices, int *edges_vertices, int edge_number, double *lengths, int *periodizer, double width, double height){
9

  
10
for (int i=0;i<edge_number;i++){
11
    lengths[i]=sqrt(pow(vertices[2*edges_vertices[2*i]]+width*(double)periodizer[4*i]-vertices[2*edges_vertices[2*i+1]]-width*(double)periodizer[4*i+2],2.)+
12
                    pow(vertices[2*edges_vertices[2*i]+1]+height*(double)periodizer[4*i+1]-vertices[2*edges_vertices[2*i+1]+1]-height*(double)periodizer[4*i+3],2.));
13
}
14

  
15
}
bin/optimize_width.h (revision 1)
1
#ifndef OPTIMIZE_WIDTH_H_INCLUDED
2
#define OPTIMIZE_WIDTH_H_INCLUDED
3

  
4
void optimize_width(int vertex_number, double *vertices, int edge_number, int *edges_vertices,
5
                   double *lengths, double *rest_lengths, double *edges_width, int *periodizer, double *width, double *height);
6

  
7
#endif // OPTIMIZE_WIDTH_H_INCLUDED
bin/compute_lengths.h (revision 1)
1
#ifndef COMPUTE_LENGTHS_H_INCLUDED
2
#define COMPUTE_LENGTHS_H_INCLUDED
3

  
4
void compute_lengths(double *vertices, int *edges_vertices, int edge_number, double *lengths, int *periodizer, double width, double height);
5

  
6
#endif // COMPUTE_LENGTHS_H_INCLUDED
bin/save_data_2.cpp (revision 1)
1
#include <string.h>
2
#include <stdlib.h>
3
#include <stdio.h>
4
#include "save_data_2.h"
5
#include <math.h>
6
#include "constants.h"
7
#include <gsl/gsl_matrix.h>
8
#include <gsl/gsl_blas.h>
9
#include <gsl/gsl_eigen.h>
10
#include <gsl/gsl_math.h>
11
#include <gsl/gsl_cblas.h>
12
#include <gsl/gsl_linalg.h>
13
#include "gaussian.h"
14

  
15
/* this function saves the tissue and its chemical and mechanical state */
16

  
17
void save_data_2(FILE *f, int vertex_number, double *vertices, int edge_number, int *edges_vertices,
18
               double *lengths, double *rest_lengths, double *edges_width, int *edges_cells, int *periodizer, double width, double height, int cell_number){
19

  
20
fprintf(f,"edge_number= %i;\n",edge_number);
21
fprintf(f,"vertex_number= %i;\n",vertex_number);
22
fprintf(f,"cell_number= %i;\n",cell_number);
23
fprintf(f,"width_after= %f;\n",width);
24
fprintf(f,"height_after= %f;\n",height);
25
fprintf(f,"stress_x= %f;\n",stress_x);
26
fprintf(f,"stress_y= %f;\n",stress_y);
27
fprintf(f,"sigma= %f;\n",sigma);
28

  
29
fprintf(f,"vertices=[\n");
30
for (int i=0;i<vertex_number;i++){
31
    fprintf(f,"%f %f\n",vertices[2*i],vertices[2*i+1]);}
32
fprintf(f,"];\n");
33

  
34
fprintf(f,"edges_vertices=[\n");
35
for (int i=0;i<edge_number;i++){
36
    fprintf(f,"%i %i\n",edges_vertices[2*i],edges_vertices[2*i+1]);
37
}
38
fprintf(f,"];\n");
39

  
40
fprintf(f,"lengths=[\n");
41
for (int i=0;i<edge_number;i++){
42
    fprintf(f,"%f\n",lengths[i]);
43
}
44
fprintf(f,"];\n");
45

  
46
fprintf(f,"rest_lengths=[\n");
47
for (int i=0;i<edge_number;i++){
48
    fprintf(f,"%f\n",rest_lengths[i]);
49
}
50
fprintf(f,"];\n");
51

  
52
fprintf(f,"edges_width=[\n");
53
for (int i=0;i<edge_number;i++){
54
    fprintf(f,"%f\n",edges_width[i]);
55
}
56
fprintf(f,"];\n");
57

  
58
fprintf(f,"periodizer=[\n");
59
for (int i=0;i<edge_number;i++){
60
    fprintf(f,"%i %i %i %i\n",periodizer[4*i],periodizer[4*i+1],periodizer[4*i+2],periodizer[4*i+3]);
61
}
62
fprintf(f,"];\n");
63

  
64
fprintf(f,"edges_cells=[\n");
65
for (int i=0;i<edge_number;i++){
66
    fprintf(f,"%i %i\n",edges_cells[2*i],edges_cells[2*i+1]);
67
}
68
fprintf(f,"];\n");
69

  
70
double barycenters[2*cell_number]; for (int i=0; i<2*cell_number;i++){ barycenters[i]=0.;}
71
double count[cell_number]; for (int i=0; i<cell_number;i++){ count[i]=0.;}
72
double texture[3*cell_number]; for (int i=0; i<3*cell_number;i++){ texture[i]=0.;}
73

  
74
int box[18]={-1,-1,-1,0,-1,1,0,-1,0,0,0,1,1,-1,1,0,1,1};
75
double distance=0.; int j_min; double distance_min;
76
for (int i=0; i<edge_number; i++){
77
    if (count[edges_cells[2*i]]==0){
78
        barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i]]+width*(double)periodizer[4*i])*lengths[i];
79
        barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)periodizer[4*i+1])*lengths[i];
80
        barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)periodizer[4*i+2])*lengths[i];
81
        barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i+1]+1]+height*(double)periodizer[4*i+3])*lengths[i];
82
        count[edges_cells[2*i]]+=2.*lengths[i];
83
    }
84
    else {
85
        distance_min=100000;
86
        for (int j=0; j<9; j++){
87
            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
                     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
            if (distance<distance_min){
90
                j_min=j;
91
                distance_min=distance;
92
            }
93
        }
94
        barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i]]+width*(double)box[2*j_min])*lengths[i];
95
        barycenters[2*edges_cells[2*i]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)box[2*j_min+1])*lengths[i];
96
        count[edges_cells[2*i]]+=1.*lengths[i];
97

  
98
        distance_min=100000;
99
        for (int j=0; j<9; j++){
100
            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
                     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
            if (distance<distance_min){
103
                j_min=j;
104
                distance_min=distance;
105
            }
106
        }
107
        barycenters[2*edges_cells[2*i]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)box[2*j_min])*lengths[i];
108
        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
        count[edges_cells[2*i]]+=1.*lengths[i];
110
    }
111

  
112
    if (count[edges_cells[2*i+1]]==0){
113
        barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i]]+width*(double)periodizer[4*i])*lengths[i];
114
        barycenters[2*edges_cells[2*i+1]+1]+=(vertices[2*edges_vertices[2*i]+1]+height*(double)periodizer[4*i+1])*lengths[i];
115
        barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)periodizer[4*i+2])*lengths[i];
116
        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
        count[edges_cells[2*i+1]]+=2.*lengths[i];
118
    }
119
    else {
120
        distance_min=100000;
121
        for (int j=0; j<9; j++){
122
            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
                     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
            if (distance<distance_min){
125
                j_min=j;
126
                distance_min=distance;
127
            }
128
        }
129
        barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i]]+width*(double)box[2*j_min])*lengths[i];
130
        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
        count[edges_cells[2*i+1]]+=1.*lengths[i];
132

  
133
        distance_min=100000;
134
        for (int j=0; j<9; j++){
135
            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
                     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
            if (distance<distance_min){
138
                j_min=j;
139
                distance_min=distance;
140
            }
141
        }
142
        barycenters[2*edges_cells[2*i+1]]+=(vertices[2*edges_vertices[2*i+1]]+width*(double)box[2*j_min])*lengths[i];
143
        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
        count[edges_cells[2*i+1]]+=1.*lengths[i];
145
    }
146
//    count[edges_cells[2*i]]+=1.;
147
//    count[edges_cells[2*i+1]]+=1.;
148
}
149
for (int i=0; i<cell_number; i++){
150
    barycenters[2*i]/=count[i];
151
    barycenters[2*i+1]/=count[i];
152
}
153

  
154
for (int i=0; i<cell_number;i++){ count[i]=0.;}
155
for (int i=0; i<edge_number; i++){
156
    distance_min=100000.;
157
    for (int j=0; j<9; j++){
158
        distance=pow(barycenters[2*edges_cells[2*i]]+width*(double)box[2*j]-barycenters[2*edges_cells[2*i+1]],2.)+
159
                 pow(barycenters[2*edges_cells[2*i]+1]+height*(double)box[2*j+1]-barycenters[2*edges_cells[2*i+1]+1],2.);
160
        if (distance<distance_min){
161
            distance_min=distance;
162
            j_min=j;
163
        }
164
    }
165

  
166
    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
    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
    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
    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
    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
    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
    count[edges_cells[2*i]]+=1.;
173
    count[edges_cells[2*i+1]]+=1.;
174
}
175

  
176
for (int i=0; i<cell_number; i++){
177
    texture[3*i]/=count[i];
178
    texture[3*i+1]/=count[i];
179
    texture[3*i+2]/=count[i];
180
}
181

  
182
double average_texture[3*cell_number]; for (int i=0; i<3*cell_number; i++){ average_texture[i]=0.;}
183
for (int i=0; i<cell_number; i++){ count[i]=0.;}
184

  
185
for (int i=0; i<cell_number; i++){
186
    for (int k=i; k<cell_number; k++){
187
        distance_min=100000.;
188
        for (int j=0; j<9; j++){
189
            distance=pow(barycenters[2*i]+width*(double)box[2*j]-barycenters[2*k],2.)+
190
                     pow(barycenters[2*i+1]+height*(double)box[2*j+1]-barycenters[2*k+1],2.);
191
            if (distance<distance_min){
192
                distance_min=distance;
193
            }
194
        }
195
        distance_min=sqrt(distance_min);
196

  
197
        average_texture[3*i]+=texture[3*k]*gaussian(distance_min,sigma);
198
        average_texture[3*i+1]+=texture[3*k+1]*gaussian(distance_min,sigma);
199
        average_texture[3*i+2]+=texture[3*k+2]*gaussian(distance_min,sigma);
200
        average_texture[3*k]+=texture[3*i]*gaussian(distance_min,sigma);
201
        average_texture[3*k+1]+=texture[3*i+1]*gaussian(distance_min,sigma);
202
        average_texture[3*k+2]+=texture[3*i+2]*gaussian(distance_min,sigma);
203
        count[i]+=gaussian(distance_min,sigma);
204
        count[k]+=gaussian(distance_min,sigma);
205
    }
206
}
207

  
208
for (int i=0; i<cell_number; i++){
209
    average_texture[3*i]/=count[i];
210
    average_texture[3*i+1]/=count[i];
211
    average_texture[3*i+2]/=count[i];
212
}
213

  
214
fprintf(f,"barycenters_after=[\n");
215
for (int i=0;i<cell_number;i++){
216
    fprintf(f,"%f %f\n",barycenters[2*i],barycenters[2*i+1]);
217
}
218
fprintf(f,"];\n");
219

  
220
fprintf(f,"texture_after=[\n");
221
for (int i=0;i<cell_number;i++){
222
    fprintf(f,"%f %f %f\n",texture[3*i],texture[3*i+1],texture[3*i+2]);
223
}
224
fprintf(f,"];\n");
225

  
226
fprintf(f,"average_texture_after=[\n");
227
for (int i=0;i<cell_number;i++){
228
    fprintf(f,"%f %f %f\n",average_texture[3*i],average_texture[3*i+1],average_texture[3*i+2]);
229
}
230
fprintf(f,"];\n");
231

  
232
int boundary[cell_number]; for (int i=0; i<cell_number; i++){ boundary[i]=0;}
233
for (int i=0;i<edge_number;i++){
234
    if (periodizer[4*i]!=0 || periodizer[4*i+1]!=0 || periodizer[4*i+2]!=0 || periodizer[4*i+3]!=0){
235
        boundary[edges_cells[2*i]]=1; boundary[edges_cells[2*i+1]]=1;
236
    }
237
}
238
fprintf(f,"boundary=[\n");
239
for (int i=0;i<cell_number;i++){
240
    fprintf(f,"%i\n",boundary[i]);
241
}
242
fprintf(f,"];\n");
243

  
244
}
bin/compute_energy_and_forces.cpp (revision 1)
1
#include "compute_energy_and_forces.h"
2
#include "constants.h"
3
#include "compute_areas.h"
4
#include "compute_cell_areas.h"
5
#include "compute_lengths.h"
6
#include <math.h>
7
#include <stdio.h>
8
#include <nlopt.h>
9
#include <omp.h>
10

  
11
/* this function computes the mechanical energy and its derivatives */
12

  
13
double compute_energy_and_forces(unsigned n, const double *vertices, double *forces, void *parameters){
14

  
15
struct parameters_list {int vertex_number; int edge_number; int *edges_vertices;
16
                        double *lengths; double *rest_lengths; double *edges_width; int *periodizer; int anisotropy; double ref_width; double ref_height;};
17
double energy=0;
18

  
19
compute_lengths((double*)vertices, ((parameters_list*)parameters)->edges_vertices, ((parameters_list*)parameters)->edge_number,
20
                ((parameters_list*)parameters)->lengths, ((parameters_list*)parameters)->periodizer, (double)vertices[2*(((parameters_list*)parameters)->vertex_number)], (double)vertices[2*(((parameters_list*)parameters)->vertex_number)+1]);
21

  
22
if (forces){ for (int i=0;i<2*((parameters_list*)parameters)->vertex_number+2;i++){forces[i]=0.;}}
23

  
24

  
25
if (forces){
26
    forces[2*(((parameters_list*)parameters)->vertex_number)]-=vertices[2*(((parameters_list*)parameters)->vertex_number)+1];
27
    forces[2*(((parameters_list*)parameters)->vertex_number)+1]-=vertices[2*(((parameters_list*)parameters)->vertex_number)];
28
}
29
/* pressure energy */
30
energy-=vertices[2*(((parameters_list*)parameters)->vertex_number)]*vertices[2*(((parameters_list*)parameters)->vertex_number)+1];
31

  
32

  
33

  
34
for (int i=0;i<((parameters_list*)parameters)->edge_number;i++){
35
    /* derivatives of the lengths of the walls */
36
    if (forces){
37
        forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
38
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
39
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i]
40
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/
41
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
42
        forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
43
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
44
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i]
45
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/
46
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
47
        forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
48
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
49
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1]
50
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/
51
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
52
        forces[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
53
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
54
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1]
55
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/
56
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
57

  
58
        forces[2*((parameters_list*)parameters)->vertex_number]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
59
                                                                        ((double)(((parameters_list*)parameters)->periodizer)[4*i]-(double)(((parameters_list*)parameters)->periodizer)[4*i+2])*
60
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
61
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]]+vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i]
62
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]]-vertices[2*((parameters_list*)parameters)->vertex_number]*(double)(((parameters_list*)parameters)->periodizer)[4*i+2])/
63
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
64

  
65
        forces[2*((parameters_list*)parameters)->vertex_number+1]+=youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
66
                                                                        ((double)(((parameters_list*)parameters)->periodizer)[4*i+1]-(double)(((parameters_list*)parameters)->periodizer)[4*i+3])*
67
                                                                        ((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->rest_lengths)[i])*
68
                                                                        (vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i]+1]+vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+1]
69
                                                                         -vertices[2*(((parameters_list*)parameters)->edges_vertices)[2*i+1]+1]-vertices[2*((parameters_list*)parameters)->vertex_number+1]*(double)(((parameters_list*)parameters)->periodizer)[4*i+3])/
70
                                                                        ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]*(((parameters_list*)parameters)->rest_lengths)[i]);
71

  
72
    }
73
    /* wall elastic energy */
74
    energy+=0.5*youngs_modulus*((((parameters_list*)parameters)->edges_width)[i])*((((parameters_list*)parameters)->rest_lengths)[i])*
75
            pow((((parameters_list*)parameters)->lengths)[i]/(((parameters_list*)parameters)->rest_lengths)[i]-1.,2.);
76
}
77

  
78
    /* external, anisotropic stretching */
79
if ((((parameters_list*)parameters)->anisotropy)==1){
80

  
81
if (forces){
82
    forces[2*(((parameters_list*)parameters)->vertex_number)]-=stress_x*(((parameters_list*)parameters)->ref_height);
83
    forces[2*(((parameters_list*)parameters)->vertex_number)+1]-=stress_y*(((parameters_list*)parameters)->ref_width);
84
}
85

  
86
energy-=stress_x*(((parameters_list*)parameters)->ref_height)*(vertices[2*(((parameters_list*)parameters)->vertex_number)]-(((parameters_list*)parameters)->ref_width))+
87
        stress_y*(((parameters_list*)parameters)->ref_width)*(vertices[2*(((parameters_list*)parameters)->vertex_number)+1]-(((parameters_list*)parameters)->ref_height));
88

  
89
}
90

  
91
return(energy);
92

  
93
}
bin/gaussian.cpp (revision 1)
1
#include "gaussian.h"
2
#include <math.h>
3

  
4
double gaussian(double distance, double sigma){
5
    double result=distance*distance/(2.*sigma*sigma);
6
    result=exp(-result);
7

  
8
    return result;
9
}
bin/step.cpp (revision 1)
1
#include "step.h"
2
#include <stdio.h>
3
#include <math.h>
4
#include "minimize_BFGS.h"
5
#include "growth_and_chemistry.h"
6
#include <gsl/gsl_odeiv2.h>
7
#include <gsl/gsl_errno.h>
8
#include "compute_energy_and_forces.h"
9
#include "save_data.h"
10
#include <cstdlib>
11
#include "constants.h"
12
#include <algorithm>
13
#include "compute_lengths.h"
14

  
15

  
16
/* this function performs a time step (growth and chemistry then mechanics) */
17

  
18
void step(double *vertices, int vertex_number, int edge_number, int *edges_vertices, double *lengths, double *rest_lengths, double *edges_width, int *periodizer, double *width, double *height){
19

  
20
/* minimization of energy: move the vertices in order to make the energy as small as possible, i.e. in order to make cells
21
   as close as possible of their targets */
22
minimize_BFGS(vertex_number, vertices, edge_number, edges_vertices, lengths, rest_lengths, edges_width, periodizer, width, height);
23

  
24

  
25
compute_lengths(vertices, edges_vertices, edge_number, lengths, periodizer, width[0], height[0]);
26

  
27
struct parameters_list2 {int edge_number; double *lengths; double *edges_width;};
28

  
29
struct parameters_list2 parameters2;
30
parameters2.edge_number=edge_number;
31
parameters2.lengths=lengths;
32
parameters2.edges_width=edges_width;
33
void *pparameters2=&parameters2;
34
int system_size=edge_number;
35

  
36
double x[system_size];
37
for (int i=0;i<edge_number;i++){ x[i]=rest_lengths[i];}
38

  
39
gsl_odeiv2_system sys={growth_and_chemistry, NULL, system_size, pparameters2};
40
gsl_odeiv2_driver *d=gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk2, 1.e-8, 1.e-8, 0.);
41
int s; double t=0.0;
42
s=gsl_odeiv2_driver_apply(d, &t, 1.e-7, x);
43
for (int i=0;i<edge_number;i++){ rest_lengths[i]=x[i];}
44
gsl_odeiv2_driver_free(d);
45

  
46
}
47

  
48

  
49

  
50

  
51

  
bin/constants.cpp (revision 1)
1
#include <math.h>
2

  
3
double pi=3.1415926;
4

  
5
double youngs_modulus=300.;
6
double stress_x=0.;//2.
7
double stress_y=0.;
8

  
9
double growth_threshold=10.;
10

  
11
double sigma=40;
12

  
13
int growth=0;
14

  
15
#pragma omp threadprivate(stress_x, stress_y, sigma, growth, growth_threshold)
bin/save_data_2.h (revision 1)
1
#ifndef SAVE_DATA_2_H_INCLUDED
2
#define SAVE_DATA_2_H_INCLUDED
3

  
4
void save_data_2(FILE *f, int vertex_number, double *vertices, int edge_number, int *edges_vertices,
5
               double *lengths, double *rest_lengths, double *edges_width, int *edges_cells, int *periodizer, double width, double height, int cell_number);
6

  
7
#endif // SAVE_DATA_2_H_INCLUDED
bin/compute_energy_and_forces.h (revision 1)
1
#ifndef COMPUTE_ENERGY_AND_FORCES_H_INCLUDED
2
#define COMPUTE_ENERGY_AND_FORCES_H_INCLUDED
3

  
4
double compute_energy_and_forces(unsigned n, const double *vertices, double *forces, void *parameters);
5

  
6
#endif // COMPUTE_ENERGY_AND_FORCES_H_INCLUDED
bin/gaussian.h (revision 1)
1
#ifndef GAUSSIAN_H_INCLUDED
2
#define GAUSSIAN_H_INCLUDED
3

  
4
double gaussian(double distance, double sigma);
5

  
6
#endif // GAUSSIAN_H_INCLUDED
bin/step.h (revision 1)
1
#ifndef STEP_H_INCLUDED
2
#define STEP_H_INCLUDED
3

  
4
void step(double *vertices, int vertex_number, int edge_number, int *edges_vertices, double *lengths, double *rest_lengths, double *edges_width, int *periodizer, double *width, double *height);
5

  
6
#endif // STEP_H_INCLUDED
bin/constants.h (revision 1)
1
#ifndef CONSTANTS_H_INCLUDED
2
#define CONSTANTS_H_INCLUDED
3

  
4
extern double pi;
5

  
6
extern double youngs_modulus;
7
extern double stress_x;
8
extern double stress_y;
9

  
10
extern double growth_threshold;
11

  
12
extern double sigma;
13

  
14
extern int growth;
15

  
16
#pragma omp threadprivate(stress_x, stress_y, sigma, growth, growth_threshold)
17

  
18
#endif // CONSTANTS_H_INCLUDED
bin/Init/33.toy (revision 1)
1
53.73237637879983
2
59.62851357493969
3
86
4
129
5
43
6
41.00605427519755
7
43.84479514583994
8
11.11288381815081
9
6.143416160775232
10
24.1403013424371
11
5.227544003018701
12
30.1660648218456
13
40.64222965901772
14
2.426251365215387
15
3.36138988298003
16
44.18169811048831
17
57.860182871652974
18
44.26863245351591
19
57.25143624724735
20
30.05779385705528
21
28.24536383636932
22
27.21680454415969
23
4.637052593595216
24
33.93035403432599
25
38.52227721012749
26
24.3734025425864
27
22.05447126597037
28
20.6540676178174
29
20.38305183805124
30
39.23489968845102
31
0.5454952385536798
32
53.130412457309454
33
36.98236472617719
34
17.48416479480939
35
46.22713497941957
36
9.590597622999248
37
29.85658282898794
38
30.02835746873472
39
26.54115576464108
40
14.67166730897258
41
5.397306638938377
42
46.95224069568225
43
9.063338711712447
44
48.98500227570604
45
2.475549594269329
46
45.96502204715647
47
39.39080378295612
48
0.2150610878445689
49
22.44754257525715
50
14.96796336777424
51
25.14631127368362
52
2.80872768095769
53
45.2358817124404
54
31.30690565517686
55
1.951626818952569
56
15.3424208474777
57
25.11667364137173
58
36.37739183218368
59
21.04400817587831
60
12.78716971477792
61
38.28566419249559
62
51.9718625131994
63
25.33595327044449
64
14.5153537428476
65
53.10917419454713
66
39.16460333520742
67
8.706121659048014
68
14.60912375427341
69
57.35499733779572
70
46.22372020161806
71
16.55464653202851
72
26.73641157474853
73
41.66851870804089
74
2.630386591135188
75
32.27528433460367
76
49.07363903777353
77
24.23969816922651
78
15.18793030297121
79
54.67809133530172
80
33.28650805737531
81
34.01725007314936
82
18.3069344296281
83
44.65626766477443
84
15.02572660705558
85
39.39806863038923
86
8.345942562755766
87
11.26386898540523
88
38.11511809476249
89
20.92351825895694
90
6.728035099376779
91
17.5125405894656
92
47.37846757123232
93
11.38910923371441
94
41.2571587330546
95
47.15701865113333
96
7.697565141268082
97
32.19655381556069
98
23.90021366288214
99
43.83491267583069
100
23.66447223319609
101
5.206701529933286
102
18.89873770700942
103
12.50564202067935
104
10.60583197761373
105
20.37447099960424
106
45.34099792801138
107
19.06395770864364
108
3.123270759886557
109
49.02228412571285
110
17.94994079426626
111
6.880624613151146
112
53.17355719326821
113
50.50223555452406
114
20.90321203982454
115
31.84187922596023
116
20.82343695085001
117
32.01750906454653
118
41.92271232146813
119
31.90706613261577
120
40.93760583941135
121
9.217592730034955
122
28.51015173245191
123
52.59199247042525
124
6.959803903539296
125
12.83996662023328
126
34.21782816393571
127
48.94842521543874
128
43.64335304978598
129
41.8750472998147
130
37.73169089323487
131
0.5851993210129022
132
53.60511943947328
133
12.88238734026699
134
40.16439606485149
135
13.87062975861086
136
41.98101543916131
137
19.46638197842913
138
28.12384965673833
139
53.34720490746081
140
10.73033924657607
141
20.86039484815298
142
5.855374868565534
143
50.26579203945766
144
4.191681636006709
145
56.63569714231279
146
8.919383852200541
147
50.89323479063303
148
7.147289239787876
149
25.37801141592199
150
3.235864763657833
151
20.84161600534828
152
28.60297542757392
153
14.66922137378002
154
32.94979934206445
155
11.70538983818954
156
32.99391417681286
157
12.4953449139785
158
42.69042772349333
159
30.49154142882092
160
24.9397573300001
161
12.40655161134378
162
34.43963964778495
163
14.74944849184517
164
8.55174025523531
165
42.41374836133627
166
18.90502784026141
167
13.3550755311257
168
32.44039342914015
169
51.0978327495856
170
22.17080019983781
171
55.64088700878654
172
13.81073090555738
173
15.58328572034042
174
52.26595526795432
175
16.86642863832872
176
11.11078199584252
177
46.14142974397822
178
0
179
1
180
0
181
0
182
0
183
9
184
0
185
0
186
8.854079911241516
187
2.7756533968765713
188
1
189
2
190
0
191
0
192
0
193
44
194
0
195
0
196
3.3217281643406205
197
3.430072695581895
198
2
199
0
200
0
201
0
202
0
203
61
204
0
205
0
206
3.2916943058805885
207
2.6668961593506504
208
3
209
4
210
1
211
0
212
0
213
4
214
0
215
0
216
9.121252851595218
217
3.3340381054359294
218
5
219
3
220
1
221
0
222
0
223
17
224
0
225
0
226
3.6361544732204667
227
5.094816436869106
228
4
229
5
230
1
231
0
232
0
233
40
234
0
235
0
236
5.820223452760936
237
1.6117704333223108
238
6
239
7
240
2
241
0
242
0
243
77
244
0
245
0
246
7.223384256457613
247
0.8902525792086653
248
7
249
8
250
2
251
0
252
0
253
8
254
0
255
0
256
3.1326589432640586
257
3.2995942249953183
258
8
259
6
260
2
261
0
262
0
263
47
264
0
265
0
266
0.47628536602063226
267
3.8693366871458186
268
9
269
1
270
3
271
0
272
0
273
60
274
0
275
0
276
9.241735270056887
277
0.8328752199743118
278
1
279
10
280
3
281
0
282
0
283
9
284
0
285
0
286
4.320193474921223
287
2.084233441930639
288
10
289
9
290
3
291
0
292
0
293
33
294
0
295
0
296
3.5799148882994896
297
1.1546833331219073
298
11
299
4
300
4
301
0
302
0
303
19
304
-1
305
0
306
7.228112850300355
307
2.5231407538546837
308
3
309
11
310
4
311
0
312
0
313
69
314
0
315
-1
316
6.5948981752810445
317
1.124841730886247
318
12
319
13
320
5
321
0
322
0
323
12
324
0
325
1
326
5.461190814960067
327
3.6614125389900516
328
11
329
12
330
5
331
0
332
0
333
6
334
0
335
0
336
0.6149227859844556
337
5.482835720588489
338
13
339
11
340
5
341
0
342
0
343
19
344
0
345
1
346
6.409543734430895
347
3.1976084732888697
348
2
349
12
350
6
351
0
352
0
353
44
354
0
355
0
356
10.534051479547907
357
3.209462328992895
358
11
359
2
360
6
361
0
362
0
363
53
364
0
365
0
366
11.17360257979981
367
1.2558426903041493
368
14
369
10
370
7
371
0
372
0
373
54
374
0
375
0
376
9.83571508310077
377
1.024934055006501
378
10
379
15
380
7
381
0
382
0
383
37
384
0
385
0
386
6.6135668226516815
387
2.1610100622891437
388
15
389
14
390
7
391
0
392
0
393
16
394
0
395
0
396
1.7044622767022604
397
1.7269393196112666
398
16
399
8
400
8
401
0
402
0
403
24
404
0
405
0
406
4.892896758512175
407
2.5412315161415338
408
7
409
16
410
8
411
0
412
0
413
74
414
0
415
0
416
9.101023060959813
417
1.151120586641937
418
0
419
10
420
9
421
0
422
0
423
37
424
0
425
0
426
4.550802912338099
427
2.494666346896691
428
17
429
14
430
10
431
0
432
0
433
11
434
0
435
0
436
4.077633527750127
437
2.106756008073527
438
18
439
17
440
10
441
0
442
0
443
73
444
0
445
0
446
8.510652311046387
447
1.1250764035300234
448
14
449
18
450
10
451
0
452
0
453
16
454
0
455
0
456
7.218646203228216
457
2.075771900641477
458
19
459
14
460
11
461
0
462
0
463
25
464
0
465
0
466
7.114827249465112
467
1.9059591832016949
468
17
469
19
470
11
471
0
472
0
473
80
474
0
475
0
476
7.24234707219834
477
2.0723141474224427
478
16
479
13
480
12
481
0
482
0
483
30
484
0
485
0
486
8.16092918436066
487
1.0146127300272096
488
12
489
16
490
12
491
0
492
0
493
62
494
0
495
0
496
1.5037330534969058
497
2.729533053292074
498
20
499
21
500
13
501
0
502
0
503
23
504
1
505
0
506
8.930473663224427
507
1.2416386387610803
508
22
509
20
510
13
511
0
512
0
513
20
514
0
515
0
516
7.559325262226159
517
1.6451443301594082
518
21
519
22
520
13
521
0
522
0
523
34
524
1
525
0
526
5.710052158186178
527
2.078204568551323
528
23
529
24
530
14
531
0
532
0
533
85
534
0
535
0
536
6.373959027915761
537
0.7799771166031012
538
25
539
23
540
14
541
0
542
0
543
38
544
0
545
0
546
1.7732946715648046
547
2.173580731963505
548
24
549
25
550
14
551
0
552
0
553
29
554
0
555
0
556
7.495085244398764
557
1.3178970263775502
558
26
559
27
560
15
561
0
562
0
563
22
564
0
565
0
566
7.148616682812731
567
1.3102700672912762
568
27
569
28
570
15
571
0
572
0
573
71
574
0
575
0
576
5.101701457102572
577
0.9212679769043179
578
28
579
26
580
15
581
0
582
0
583
45
584
0
585
0
586
3.0098232830004346
587
1.806485244432378
588
15
589
18
590
16
591
0
592
0
593
26
594
0
595
0
596
8.398146757523122
597
1.7393652853252513
598
29
599
3
600
17
601
0
602
0
603
31
604
0
605
-1
606
7.671077844244745
607
2.2370951987414274
608
5
609
29
610
17
611
0
612
0
613
52
614
0
615
0
616
3.598236965098637
617
5.697151431678375
618
4
619
13
620
18
621
0
622
0
623
19
624
0
625
0
626
6.894279157179725
627
1.816085499909942
628
30
629
4
630
18
631
0
632
0
633
43
634
0
635
0
636
2.3645037260394544
637
1.1252827615110104
638
13
639
30
640
18
641
0
642
0
643
57
644
0
645
0
646
6.016612564927007
647
0.9212192682809177
648
0
649
20
650
20
651
0
652
0
653
61
654
0
655
0
656
3.400237165905518
657
2.110071038197222
658
22
659
0
660
20
661
0
662
0
663
56
664
0
665
0
666
8.505680286580033
667
1.193213937768918
668
31
669
28
670
21
671
0
672
0
673
28
674
-1
675
0
676
3.499401768981641
677
1.7004373258240852
678
32
679
31
680
21
681
0
682
0
683
84
684
-1
685
0
686
5.828912004953271
687
0.7994025711042237
688
28
689
32
690
21
691
0
692
0
693
72
694
0
695
0
696
3.421148198448322
697
0.9910089568830227
698
26
699
19
700
22
701
0
702
0
703
25
704
0
705
0
706
0.3756285310714842
707
2.3354412127296196
708
19
709
27
710
22
711
0
712
0
713
67
714
0
715
0
716
6.027150056137137
717
1.3479771010724726
718
33
719
21
720
23
721
0
722
0
723
79
724
0
725
0
726
6.398955389727695
727
0.8905786536815244
728
20
729
33
730
23
731
0
732
0
733
51
734
0
735
0
736
3.799444773086914
737
1.3115327544561985
738
34
739
8
740
24
741
0
742
0
743
66
744
0
745
-1
746
8.826838177566064
747
1.4769627121541855
748
16
749
34
750
24
751
0
752
0
753
62
754
0
755
0
756
6.56848456360322
757
2.5574272552811044
758
26
759
14
760
25
761
0
762
0
763
54
764
0
765
0
766
8.726441934709847
767
1.075660138674797
768
35
769
18
770
26
771
0
772
0
773
78
774
0
775
0
776
6.586073575659283
777
0.9977374871095045
778
15
779
35
780
26
781
0
782
0
783
41
784
0
785
0
786
1.7418984998374087
787
1.5291397101193123
788
21
789
23
790
27
791
0
792
0
793
79
794
0
795
0
796
5.914384296931883
797
0.8786479172264603
798
23
799
26
800
27
801
0
802
0
803
39
804
0
805
0
806
2.499716102562306
807
1.523049654651023
808
26
809
21
810
27
811
0
812
0
813
45
814
0
815
0
816
7.936078370151628
817
1.381559507270994
818
22
819
28
820
28
821
0
822
0
823
34
824
1
825
0
826
8.211840380753
827
1.6314292128691357
828
31
829
22
830
28
831
0
832
0
833
35
834
0
835
0
836
3.0986246239994975
837
1.4402180870960941
838
36
839
25
840
29
841
0
842
0
843
36
844
0
845
0
846
1.7070032875719003
847
1.7119227017909877
848
24
849
36
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.

Formats disponibles : Unified diff