root / bin / compute_energy_and_forces.cpp @ 1
Historique | Voir | Annoter | Télécharger (24,6 ko)
1 | 1 | akiss | #include "compute_energy_and_forces.h" |
---|---|---|---|
2 | 1 | akiss | #include "constants.h" |
3 | 1 | akiss | #include "compute_areas.h" |
4 | 1 | akiss | #include "compute_cell_areas.h" |
5 | 1 | akiss | #include "compute_shapes.h" |
6 | 1 | akiss | #include "compute_barycenters.h" |
7 | 1 | akiss | #include "compute_lengths.h" |
8 | 1 | akiss | #include <math.h> |
9 | 1 | akiss | #include <stdio.h> |
10 | 1 | akiss | #include <nlopt.h> |
11 | 1 | akiss | #include <omp.h> |
12 | 1 | akiss | |
13 | 1 | akiss | /* this function computes the mechanical energy and its derivatives (basically only math equations) */
|
14 | 1 | akiss | |
15 | 1 | akiss | double compute_energy_and_forces(unsigned n, const double *vertices, double *forces, void *parameters){ |
16 | 1 | akiss | |
17 | 1 | akiss | struct parameters_list {int vertices_number; int cell_number; int *cells_vertices; int *vertices_number_in_each_cell; double *barycenters; double *shapes; double *targets; double *areas; double *cell_areas; |
18 | 1 | akiss | int *wall_vertices; int wall_number; double *lengths; double *target_lengths; int *boundary; double *tissue_target; int anisotropy; double *relative_pressure;}; |
19 | 1 | akiss | |
20 | 1 | akiss | int j,previous; double N,energy=0; |
21 | 1 | akiss | |
22 | 1 | akiss | compute_lengths((double*)vertices, ((parameters_list*)parameters)->wall_vertices, ((parameters_list*)parameters)->wall_number, ((parameters_list*)parameters)->lengths);
|
23 | 1 | akiss | compute_barycenters((double*)vertices, ((parameters_list*)parameters)->vertices_number, ((parameters_list*)parameters)->cells_vertices,
|
24 | 1 | akiss | ((parameters_list*)parameters)->vertices_number_in_each_cell, ((parameters_list*)parameters)->cell_number, ((parameters_list*)parameters)->barycenters); |
25 | 1 | akiss | compute_areas((double*)vertices, ((parameters_list*)parameters)->cells_vertices, ((parameters_list*)parameters)->vertices_number_in_each_cell,
|
26 | 1 | akiss | ((parameters_list*)parameters)->cell_number, ((parameters_list*)parameters)->areas); |
27 | 1 | akiss | compute_cell_areas((double*)vertices, ((parameters_list*)parameters)->cells_vertices, ((parameters_list*)parameters)->vertices_number_in_each_cell,
|
28 | 1 | akiss | ((parameters_list*)parameters)->cell_number, ((parameters_list*)parameters)->areas, ((parameters_list*)parameters)->cell_areas); |
29 | 1 | akiss | compute_shapes((double*)vertices, ((parameters_list*)parameters)->cells_vertices, ((parameters_list*)parameters)->vertices_number_in_each_cell,
|
30 | 1 | akiss | ((parameters_list*)parameters)->cell_number, ((parameters_list*)parameters)->barycenters, ((parameters_list*)parameters)->shapes); |
31 | 1 | akiss | |
32 | 1 | akiss | |
33 | 1 | akiss | if (forces){ for (int i=0;i<2*((parameters_list*)parameters)->vertices_number;i++){forces[i]=0.;}} |
34 | 1 | akiss | |
35 | 1 | akiss | //for (int i=0;i<((parameters_list*)parameters)->vertices_number;i++){
|
36 | 1 | akiss | // if (vertices[2*i+1]>7.){ forces[2*i+1]+=0.01*sinh(vertices[2*i+1]-7.);}
|
37 | 1 | akiss | // if (vertices[2*i+1]<-7.){ forces[2*i+1]+=0.01*sinh(vertices[2*i+1]+7.);}
|
38 | 1 | akiss | // if (vertices[2*i+1]>7.){ energy+=0.01*(cosh(vertices[2*i+1]-7.)-1.);}
|
39 | 1 | akiss | // if (vertices[2*i+1]<-7.){ energy+=0.01*(cosh(vertices[2*i+1]+7.)-1.);}
|
40 | 1 | akiss | //}
|
41 | 1 | akiss | |
42 | 1 | akiss | double ablation;
|
43 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
44 | 1 | akiss | ablation=(double)(i!=ablated_cell);
|
45 | 1 | akiss | if (forces){
|
46 | 1 | akiss | for (j=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];j++){ |
47 | 1 | akiss | previous=j-1; if (j==(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]){ previous=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1]-1;} |
48 | 1 | akiss | /* derivatives of the area in the pressure energy */
|
49 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]-=0.5*ablation*pressure*(((parameters_list*)parameters)->relative_pressure)[i]*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]); |
50 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-=0.5*ablation*pressure*(((parameters_list*)parameters)->relative_pressure)[i]*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]]); |
51 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]]-=0.5*ablation*pressure*(((parameters_list*)parameters)->relative_pressure)[i]*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]); |
52 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]-=0.5*ablation*pressure*(((parameters_list*)parameters)->relative_pressure)[i]*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]); |
53 | 1 | akiss | } |
54 | 1 | akiss | } |
55 | 1 | akiss | /* pressure energy */
|
56 | 1 | akiss | energy+=-pressure*(((parameters_list*)parameters)->relative_pressure)[i]*ablation*(((parameters_list*)parameters)->cell_areas)[i]; |
57 | 1 | akiss | } |
58 | 1 | akiss | |
59 | 1 | akiss | double boundary;
|
60 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
61 | 1 | akiss | // for (j=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];j++){
|
62 | 1 | akiss | // previous=j-1; if (j==(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]){ previous=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1]-1;}
|
63 | 1 | akiss | // boundary=(double)((((parameters_list*)parameters)->boundary)[j]);
|
64 | 1 | akiss | // if (forces){
|
65 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]-=boundary*0.5*pressure*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]);
|
66 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-=boundary*0.5*pressure*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]]);
|
67 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]]-=boundary*0.5*pressure*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]);
|
68 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]-=boundary*0.5*pressure*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]);
|
69 | 1 | akiss | // }
|
70 | 1 | akiss | //
|
71 | 1 | akiss | // energy-=boundary*0.5*pressure*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]]*vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-
|
72 | 1 | akiss | // vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]*vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]);
|
73 | 1 | akiss | // }
|
74 | 1 | akiss | } |
75 | 1 | akiss | |
76 | 1 | akiss | double trace;
|
77 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
78 | 1 | akiss | trace=(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->targets)[3*i+1]; |
79 | 1 | akiss | N=(double)((((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1])-(double)((((parameters_list*)parameters)->vertices_number_in_each_cell)[i]); |
80 | 1 | akiss | ablation=(double)(i!=ablated_cell);
|
81 | 1 | akiss | if (forces){
|
82 | 1 | akiss | for (j=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];j++){ |
83 | 1 | akiss | previous=j-1; if (j==(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]){ previous=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1]-1;} |
84 | 1 | akiss | /* derivatives of the shape matrix */
|
85 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]+=ablation*shear_modulus*4.0*((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]) |
86 | 1 | akiss | *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]-(((parameters_list*)parameters)->barycenters)[2*i])* |
87 | 1 | akiss | (((parameters_list*)parameters)->cell_areas)[i]/(trace*trace*N); |
88 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]+=ablation*shear_modulus*4.0*((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2]) |
89 | 1 | akiss | *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-(((parameters_list*)parameters)->barycenters)[2*i+1])* |
90 | 1 | akiss | (((parameters_list*)parameters)->cell_areas)[i]/(trace*trace*N); |
91 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]+=ablation*shear_modulus*4.0*((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1]) |
92 | 1 | akiss | *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-(((parameters_list*)parameters)->barycenters)[2*i+1])* |
93 | 1 | akiss | (((parameters_list*)parameters)->cell_areas)[i]/(trace*trace*N); |
94 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]+=ablation*shear_modulus*4.0*((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2]) |
95 | 1 | akiss | *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]-(((parameters_list*)parameters)->barycenters)[2*i])* |
96 | 1 | akiss | (((parameters_list*)parameters)->cell_areas)[i]/(trace*trace*N); |
97 | 1 | akiss | /* derivatives of the area */
|
98 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]+=ablation*shear_modulus*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1])* |
99 | 1 | akiss | (pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i],2.)+ |
100 | 1 | akiss | pow((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.) |
101 | 1 | akiss | +2.*pow((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2],2.))/(2.*trace*trace); |
102 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]+=ablation*shear_modulus*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]])* |
103 | 1 | akiss | (pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i],2.)+ |
104 | 1 | akiss | pow((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.) |
105 | 1 | akiss | +2.*pow((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2],2.))/(2.*trace*trace); |
106 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]]+=ablation*shear_modulus*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1])* |
107 | 1 | akiss | (pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i],2.)+ |
108 | 1 | akiss | pow((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.) |
109 | 1 | akiss | +2.*pow((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2],2.))/(2.*trace*trace); |
110 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]+=ablation*shear_modulus*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]])* |
111 | 1 | akiss | (pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i],2.)+ |
112 | 1 | akiss | pow((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.) |
113 | 1 | akiss | +2.*pow((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2],2.))/(2.*trace*trace); |
114 | 1 | akiss | } |
115 | 1 | akiss | } |
116 | 1 | akiss | /* shape energy, contribution from the shear modulus */
|
117 | 1 | akiss | energy+=ablation*shear_modulus*(((parameters_list*)parameters)->cell_areas)[i]*(pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i],2.) |
118 | 1 | akiss | +pow((((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.) |
119 | 1 | akiss | +2.*pow((((parameters_list*)parameters)->shapes)[3*i+2]-(((parameters_list*)parameters)->targets)[3*i+2],2.))/(trace*trace);//(((parameters_list*)parameters)->cell_areas)[i]; |
120 | 1 | akiss | } |
121 | 1 | akiss | |
122 | 1 | akiss | /* contribution of the first lame parameter, this term was neglected in the final version of the paper as it has no impact */
|
123 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
124 | 1 | akiss | // min=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]; max=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];
|
125 | 1 | akiss | // trace=(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->targets)[3*i+1];
|
126 | 1 | akiss | // N=(double)(max)-(double)(min);
|
127 | 1 | akiss | // if (forces){
|
128 | 1 | akiss | // for (j=0;j<max-min;j++){ previous=j-1; if (j==0){ previous=max-min-1;}
|
129 | 1 | akiss | // /* derivatives of the shape matrix */
|
130 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+j]]+=lame_first_periclinal*4.0*(((parameters_list*)parameters)->cell_areas)[i]*
|
131 | 1 | akiss | // ((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1])
|
132 | 1 | akiss | // *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+j]]-(((parameters_list*)parameters)->barycenters)[2*i])
|
133 | 1 | akiss | // /(trace*trace*N);
|
134 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+j]+1]+=lame_first_periclinal*4.0*(((parameters_list*)parameters)->cell_areas)[i]*
|
135 | 1 | akiss | // ((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1])
|
136 | 1 | akiss | // *(vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+j]+1]-(((parameters_list*)parameters)->barycenters)[2*i+1])
|
137 | 1 | akiss | // /(trace*trace*N);
|
138 | 1 | akiss | // /* derivatives of the area */
|
139 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+j]]+=lame_first_periclinal*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+previous]+1])*
|
140 | 1 | akiss | // pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.)
|
141 | 1 | akiss | // /(2.*trace*trace);
|
142 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+j]+1]+=lame_first_periclinal*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+previous]])*
|
143 | 1 | akiss | // pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.)
|
144 | 1 | akiss | // /(2.*trace*trace);
|
145 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+previous]]+=lame_first_periclinal*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+j]+1])*
|
146 | 1 | akiss | // pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.)
|
147 | 1 | akiss | // /(2.*trace*trace);
|
148 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->cells_vertices)[min+previous]+1]+=lame_first_periclinal*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[min+j]])*
|
149 | 1 | akiss | // pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.)
|
150 | 1 | akiss | // /(2.*trace*trace);
|
151 | 1 | akiss | // }
|
152 | 1 | akiss | // }
|
153 | 1 | akiss | // /* area energy */
|
154 | 1 | akiss | // energy+=lame_first_periclinal*(((parameters_list*)parameters)->cell_areas)[i]*
|
155 | 1 | akiss | // pow((((parameters_list*)parameters)->shapes)[3*i]-(((parameters_list*)parameters)->targets)[3*i]+(((parameters_list*)parameters)->shapes)[3*i+1]-(((parameters_list*)parameters)->targets)[3*i+1],2.)
|
156 | 1 | akiss | // /(trace*trace);
|
157 | 1 | akiss | } |
158 | 1 | akiss | |
159 | 1 | akiss | /* energy of the anticlinal walls */
|
160 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->wall_number;i++){ |
161 | 1 | akiss | // /* derivatives of the lengths of the walls */
|
162 | 1 | akiss | // if (forces){
|
163 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->wall_vertices)[2*i]]+=lame_first_anticlinal/*(((parameters_list*)parameters)->wall_out)[i]*/*2.*((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->target_lengths)[i])*
|
164 | 1 | akiss | // (vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i]]-vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]])/
|
165 | 1 | akiss | // ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->target_lengths)[i]);
|
166 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]]+=lame_first_anticlinal/*(((parameters_list*)parameters)->wall_out)[i]*/*2.*((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->target_lengths)[i])*
|
167 | 1 | akiss | // (vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]]-vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i]])/
|
168 | 1 | akiss | // ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->target_lengths)[i]);
|
169 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->wall_vertices)[2*i]+1]+=lame_first_anticlinal/*(((parameters_list*)parameters)->wall_out)[i]*/*2.*((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->target_lengths)[i])*
|
170 | 1 | akiss | // (vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i]+1]-vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]+1])/
|
171 | 1 | akiss | // ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->target_lengths)[i]);
|
172 | 1 | akiss | // forces[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]+1]+=lame_first_anticlinal/*(((parameters_list*)parameters)->wall_out)[i]*/*2.*((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->target_lengths)[i])*
|
173 | 1 | akiss | // (vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i+1]+1]-vertices[2*(((parameters_list*)parameters)->wall_vertices)[2*i]+1])/
|
174 | 1 | akiss | // ((((parameters_list*)parameters)->lengths)[i]*(((parameters_list*)parameters)->target_lengths)[i]);
|
175 | 1 | akiss | // }
|
176 | 1 | akiss | // /* walls energy */
|
177 | 1 | akiss | // /* the 2. factor comes from the fact that each wall is counted twice in the sum over the cells */
|
178 | 1 | akiss | // energy+=lame_first_anticlinal*pow((((parameters_list*)parameters)->lengths)[i]-(((parameters_list*)parameters)->target_lengths)[i],2.)/(((parameters_list*)parameters)->target_lengths)[i];
|
179 | 1 | akiss | } |
180 | 1 | akiss | |
181 | 1 | akiss | /* contribution from the anisotropic stress that mimics curvature */
|
182 | 1 | akiss | if (((parameters_list*)parameters)->anisotropy==1){ |
183 | 1 | akiss | double tissue_area=0.; int boundary_vertices_number=0; |
184 | 1 | akiss | double tissue_shape[2]={0.,0.}; double tissue_barycenter[2]={0.,0.}; |
185 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
186 | 1 | akiss | for (j=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];j++){ |
187 | 1 | akiss | previous=j-1; if (j==(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]){ previous=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1]-1;} |
188 | 1 | akiss | boundary_vertices_number+=(((parameters_list*)parameters)->boundary)[j]; |
189 | 1 | akiss | boundary=(double)((((parameters_list*)parameters)->boundary)[j]);
|
190 | 1 | akiss | tissue_area+=boundary*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]]*vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]- |
191 | 1 | akiss | vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]*vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1])/2.; |
192 | 1 | akiss | tissue_barycenter[0]+=boundary*vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]; |
193 | 1 | akiss | tissue_barycenter[1]+=boundary*vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]; |
194 | 1 | akiss | } |
195 | 1 | akiss | } |
196 | 1 | akiss | tissue_barycenter[0]/=boundary_vertices_number;
|
197 | 1 | akiss | tissue_barycenter[1]/=boundary_vertices_number;
|
198 | 1 | akiss | for (int i=0;i<(((parameters_list*)parameters)->vertices_number_in_each_cell)[((parameters_list*)parameters)->cell_number];i++){ |
199 | 1 | akiss | boundary=(double)((((parameters_list*)parameters)->boundary)[i]);
|
200 | 1 | akiss | tissue_shape[0]+=boundary*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[i]]-tissue_barycenter[0])*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[i]]-tissue_barycenter[0]); |
201 | 1 | akiss | tissue_shape[1]+=boundary*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[i]+1]-tissue_barycenter[1])*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[i]+1]-tissue_barycenter[1]); |
202 | 1 | akiss | } |
203 | 1 | akiss | tissue_shape[0]/=boundary_vertices_number;
|
204 | 1 | akiss | tissue_shape[1]/=boundary_vertices_number;
|
205 | 1 | akiss | trace=(((parameters_list*)parameters)->tissue_target)[0]+(((parameters_list*)parameters)->tissue_target)[1]; |
206 | 1 | akiss | if (forces){
|
207 | 1 | akiss | for (int i=0;i<((parameters_list*)parameters)->cell_number;i++){ |
208 | 1 | akiss | for (j=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i];j<(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1];j++){ |
209 | 1 | akiss | previous=j-1; if (j==(((parameters_list*)parameters)->vertices_number_in_each_cell)[i]){ previous=(((parameters_list*)parameters)->vertices_number_in_each_cell)[i+1]-1;} |
210 | 1 | akiss | boundary=(double)((((parameters_list*)parameters)->boundary)[j]);
|
211 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]-=boundary*tissue_area*first_shape_derived_stress*2.*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]]-tissue_barycenter[0])/ |
212 | 1 | akiss | (trace*boundary_vertices_number); |
213 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-=boundary*tissue_area*second_shape_derived_stress*2.*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-tissue_barycenter[1])/ |
214 | 1 | akiss | (trace*boundary_vertices_number); |
215 | 1 | akiss | |
216 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]]-=boundary*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1])* |
217 | 1 | akiss | (first_shape_derived_stress*(tissue_shape[0]-(((parameters_list*)parameters)->tissue_target)[0])+ |
218 | 1 | akiss | second_shape_derived_stress*(tissue_shape[1]-(((parameters_list*)parameters)->tissue_target)[1]))/(2.*trace); |
219 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]]-=boundary*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]+1])* |
220 | 1 | akiss | (first_shape_derived_stress*(tissue_shape[0]-(((parameters_list*)parameters)->tissue_target)[0])+ |
221 | 1 | akiss | second_shape_derived_stress*(tissue_shape[1]-(((parameters_list*)parameters)->tissue_target)[1]))/(2.*trace); |
222 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[j]+1]-=boundary*(vertices[2*(((parameters_list*)parameters)->cells_vertices)[previous]])* |
223 | 1 | akiss | (first_shape_derived_stress*(tissue_shape[0]-(((parameters_list*)parameters)->tissue_target)[0])+ |
224 | 1 | akiss | second_shape_derived_stress*(tissue_shape[1]-(((parameters_list*)parameters)->tissue_target)[1]))/(2.*trace); |
225 | 1 | akiss | forces[2*(((parameters_list*)parameters)->cells_vertices)[previous]+1]-=boundary*(-vertices[2*(((parameters_list*)parameters)->cells_vertices)[j]])* |
226 | 1 | akiss | (first_shape_derived_stress*(tissue_shape[0]-(((parameters_list*)parameters)->tissue_target)[0])+ |
227 | 1 | akiss | second_shape_derived_stress*(tissue_shape[1]-(((parameters_list*)parameters)->tissue_target)[1]))/(2.*trace); |
228 | 1 | akiss | } |
229 | 1 | akiss | } |
230 | 1 | akiss | } |
231 | 1 | akiss | energy-=tissue_area*(first_shape_derived_stress*(tissue_shape[0]-(((parameters_list*)parameters)->tissue_target)[0])+ |
232 | 1 | akiss | second_shape_derived_stress*(tissue_shape[1]-(((parameters_list*)parameters)->tissue_target)[1]))/trace; |
233 | 1 | akiss | } |
234 | 1 | akiss | |
235 | 1 | akiss | return(energy);
|
236 | 1 | akiss | |
237 | 1 | akiss | } |