root / bin / growth_and_chemistry.cpp @ 1
Historique | Voir | Annoter | Télécharger (5,14 ko)
1 | 1 | akiss | #include "constants.h" |
---|---|---|---|
2 | 1 | akiss | #include "growth_and_chemistry.h" |
3 | 1 | akiss | #include <gsl/gsl_errno.h> |
4 | 1 | akiss | #include <math.h> |
5 | 1 | akiss | #include <algorithm> |
6 | 1 | akiss | #include <gsl/gsl_matrix.h> |
7 | 1 | akiss | #include <gsl/gsl_blas.h> |
8 | 1 | akiss | #include <gsl/gsl_eigen.h> |
9 | 1 | akiss | #include <gsl/gsl_math.h> |
10 | 1 | akiss | #include <gsl/gsl_cblas.h> |
11 | 1 | akiss | |
12 | 1 | akiss | /* this function computes the equations of chemistry and growth */
|
13 | 1 | akiss | |
14 | 1 | akiss | int growth_and_chemistry(double t, const double x[], double dx[], void *parameters){ |
15 | 1 | akiss | |
16 | 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; |
17 | 1 | akiss | int *cell_walls; int wall_number; int *boundary; int *wall_vertices; double *vertices; double *growth_rate; double *noise;}; |
18 | 1 | akiss | |
19 | 1 | akiss | /* diagonalize the deformation tensor in order to compute growth */
|
20 | 1 | akiss | double delta_shapes[3*(((parameters_list2*)parameters)->cell_number)]; |
21 | 1 | akiss | for (int i=0; i<(((parameters_list2*)parameters)->cell_number);i++){ |
22 | 1 | akiss | gsl_matrix *gsl_delta_shapes=gsl_matrix_calloc(2,2); |
23 | 1 | akiss | |
24 | 1 | akiss | gsl_matrix_set(gsl_delta_shapes,0,0,(((parameters_list2*)parameters)->shapes)[3*i]-x[3*i]); gsl_matrix_set(gsl_delta_shapes,1,1,(((parameters_list2*)parameters)->shapes)[3*i+1]-x[3*i+1]); |
25 | 1 | akiss | gsl_matrix_set(gsl_delta_shapes,1,0,(((parameters_list2*)parameters)->shapes)[3*i+2]-x[3*i+2]); gsl_matrix_set(gsl_delta_shapes,0,1,(((parameters_list2*)parameters)->shapes)[3*i+2]-x[3*i+2]); |
26 | 1 | akiss | |
27 | 1 | akiss | gsl_eigen_symmv_workspace *workspace=gsl_eigen_symmv_alloc(2); gsl_vector *eigenvalues=gsl_vector_alloc(2); gsl_matrix *eigenvectors=gsl_matrix_alloc(2,2); gsl_eigen_symmv(gsl_delta_shapes,eigenvalues,eigenvectors,workspace); |
28 | 1 | akiss | if (gsl_vector_get(eigenvalues,0)<0.){ gsl_vector_set(eigenvalues,0,0.);} |
29 | 1 | akiss | if (gsl_vector_get(eigenvalues,1)<0.){ gsl_vector_set(eigenvalues,1,0.);} |
30 | 1 | akiss | |
31 | 1 | akiss | delta_shapes[3*i]=gsl_vector_get(eigenvalues,0)*gsl_matrix_get(eigenvectors,0,0)*gsl_matrix_get(eigenvectors,0,0)+gsl_vector_get(eigenvalues,1)*gsl_matrix_get(eigenvectors,0,1)*gsl_matrix_get(eigenvectors,0,1); |
32 | 1 | akiss | delta_shapes[3*i+1]=gsl_vector_get(eigenvalues,0)*gsl_matrix_get(eigenvectors,1,0)*gsl_matrix_get(eigenvectors,1,0)+gsl_vector_get(eigenvalues,1)*gsl_matrix_get(eigenvectors,1,1)*gsl_matrix_get(eigenvectors,1,1); |
33 | 1 | akiss | delta_shapes[3*i+2]=gsl_vector_get(eigenvalues,0)*gsl_matrix_get(eigenvectors,0,0)*gsl_matrix_get(eigenvectors,1,0)+gsl_vector_get(eigenvalues,1)*gsl_matrix_get(eigenvectors,0,1)*gsl_matrix_get(eigenvectors,1,1); |
34 | 1 | akiss | |
35 | 1 | akiss | gsl_vector_free(eigenvalues); gsl_matrix_free(eigenvectors); gsl_matrix_free(gsl_delta_shapes); gsl_eigen_symmv_free(workspace); |
36 | 1 | akiss | } |
37 | 1 | akiss | |
38 | 1 | akiss | /* computation of the growth rate:
|
39 | 1 | akiss | the growth rate of periclinal walls is directly given by the list "growth_rate", and here we add the noise
|
40 | 1 | akiss | the growth of anticlinal walls is the average of the growth of the two neighbouring periclinal walls */
|
41 | 1 | akiss | double cell_growth[(((parameters_list2*)parameters)->cell_number)];
|
42 | 1 | akiss | double wall_growth[(((parameters_list2*)parameters)->wall_number)];
|
43 | 1 | akiss | for (int i=0;i<(((parameters_list2*)parameters)->wall_number);i++){ |
44 | 1 | akiss | wall_growth[i]=0.;
|
45 | 1 | akiss | } |
46 | 1 | akiss | for (int i=0;i<(((parameters_list2*)parameters)->cell_number);i++){ |
47 | 1 | akiss | //cell_growth[i]=1.;
|
48 | 1 | akiss | /* with noise */
|
49 | 1 | akiss | cell_growth[i]=(((parameters_list2*)parameters)->growth_rate)[i]*(((parameters_list2*)parameters)->noise)[i]; |
50 | 1 | akiss | for (int j=(((parameters_list2*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list2*)parameters)->vertices_number_in_each_cell)[i+1];j++){ |
51 | 1 | akiss | wall_growth[(((parameters_list2*)parameters)->cell_walls)[j]]+=0.5*cell_growth[i]*(((parameters_list2*)parameters)->noise)[i]; |
52 | 1 | akiss | if ((((parameters_list2*)parameters)->boundary)[j]==1){wall_growth[(((parameters_list2*)parameters)->cell_walls)[j]]*=2.;} |
53 | 1 | akiss | } |
54 | 1 | akiss | } |
55 | 1 | akiss | |
56 | 1 | akiss | /* growth of the periclinal walls, proportionnal to the deformation, with possiblity to set negative growth, corresponding to compression, to zero
|
57 | 1 | akiss | this was not used in the end since it made no difference */
|
58 | 1 | akiss | for (int i=0;i<(((parameters_list2*)parameters)->cell_number);i++){ |
59 | 1 | akiss | dx[3*i]=cell_growth[i]*(1./(tau1*(((parameters_list2*)parameters)->cell_number)))* |
60 | 1 | akiss | //std::max(0.,(((parameters_list2*)parameters)->shapes)[3*i]-x[3*i]);
|
61 | 1 | akiss | //(((parameters_list2*)parameters)->shapes)[3*i]-x[3*i];
|
62 | 1 | akiss | delta_shapes[3*i];
|
63 | 1 | akiss | dx[3*i+1]=cell_growth[i]*(1./(tau1*(((parameters_list2*)parameters)->cell_number)))* |
64 | 1 | akiss | // std::max(0.,(((parameters_list2*)parameters)->shapes)[3*i+1]-x[3*i+1]);
|
65 | 1 | akiss | // (((parameters_list2*)parameters)->shapes)[3*i+1]-x[3*i+1];
|
66 | 1 | akiss | delta_shapes[3*i+1]; |
67 | 1 | akiss | dx[3*i+2]=cell_growth[i]*(1./(tau1*(((parameters_list2*)parameters)->cell_number)))* |
68 | 1 | akiss | // std::max(0.,(((parameters_list2*)parameters)->shapes)[3*i+2]-x[3*i+2]);
|
69 | 1 | akiss | // (((parameters_list2*)parameters)->shapes)[3*i+2]-x[3*i+2];
|
70 | 1 | akiss | delta_shapes[3*i+2]; |
71 | 1 | akiss | } |
72 | 1 | akiss | |
73 | 1 | akiss | /* growth of the anticlinal walls */
|
74 | 1 | akiss | for (int i=0;i<(((parameters_list2*)parameters)->wall_number);i++){ |
75 | 1 | akiss | dx[3*(((parameters_list2*)parameters)->cell_number)+i]=wall_growth[i]*(1./(tau1*(((parameters_list2*)parameters)->cell_number)))* |
76 | 1 | akiss | std::max((((parameters_list2*)parameters)->lengths)[i]-x[3*(((parameters_list2*)parameters)->cell_number)+i],0.); |
77 | 1 | akiss | } |
78 | 1 | akiss | |
79 | 1 | akiss | return GSL_SUCCESS;
|
80 | 1 | akiss | } |