Statistiques
| Révision :

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
}