Statistiques
| Révision :

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
}