root / bin / cell_division2.cpp @ 1
Historique | Voir | Annoter | Télécharger (22,97 ko)
1 | 1 | akiss | #include "cell_division2.h" |
---|---|---|---|
2 | 1 | akiss | #include "compute_barycenters.h" |
3 | 1 | akiss | #include "compute_shapes.h" |
4 | 1 | akiss | #include "constants.h" |
5 | 1 | akiss | #include <stdio.h> |
6 | 1 | akiss | #include <stdlib.h> |
7 | 1 | akiss | #include <omp.h> |
8 | 1 | akiss | #include "compute_areas.h" |
9 | 1 | akiss | #include "compute_cell_areas.h" |
10 | 1 | akiss | #include "compute_lengths.h" |
11 | 1 | akiss | #include "compute_wall_vertices.h" |
12 | 1 | akiss | |
13 | 1 | akiss | /* this function reorganizes various lists after a division (cells_vertices, vertices_number_in_each_cell, wall_vertices, p, boundary, targets, target_lengths, target_areas) */
|
14 | 1 | akiss | |
15 | 1 | akiss | void cell_division2(double *vertices, int vertices_number, int *cells_vertices, int *vertices_number_in_each_cell, int cell_number, int *wall_vertices, int wall_number, |
16 | 1 | akiss | double *barycenters, double *areas, double *cell_areas, double *lengths, double *target_lengths, double *shapes, double *targets, |
17 | 1 | akiss | int dividing_cell, int *boundary, int *border, int adjacent_cells_number, int adjacent_cell1, int adjacent_cell2, |
18 | 1 | akiss | int *daughter_cells_vertices_number, int *cell1, int *cell2, int *wall1, int *wall2){ |
19 | 1 | akiss | |
20 | 1 | akiss | //double old_area=cell_areas[dividing_cell];
|
21 | 1 | akiss | double old_shape[3]={shapes[3*dividing_cell],shapes[3*dividing_cell+1],shapes[3*dividing_cell+2]}; |
22 | 1 | akiss | double old_target_shape[3]={targets[3*dividing_cell],targets[3*dividing_cell+1],targets[3*dividing_cell+2]}; |
23 | 1 | akiss | double old_shape_adjacent_cell1[3]={shapes[3*adjacent_cell1],shapes[3*adjacent_cell1+1],shapes[3*adjacent_cell1+2]}; |
24 | 1 | akiss | double old_target_shape_adjacent_cell1[3]={targets[3*adjacent_cell1],targets[3*adjacent_cell1+1],targets[3*adjacent_cell1+2]}; |
25 | 1 | akiss | double old_shape_adjacent_cell2[3]={shapes[3*adjacent_cell2],shapes[3*adjacent_cell2+1],shapes[3*adjacent_cell2+2]}; |
26 | 1 | akiss | double old_target_shape_adjacent_cell2[3]={targets[3*adjacent_cell2],targets[3*adjacent_cell2+1],targets[3*adjacent_cell2+2]}; |
27 | 1 | akiss | |
28 | 1 | akiss | int old_boundary[vertices_number_in_each_cell[cell_number-1]]; |
29 | 1 | akiss | for (int i=0;i<vertices_number_in_each_cell[cell_number-1];i++){ |
30 | 1 | akiss | old_boundary[i]=boundary[i]; |
31 | 1 | akiss | } |
32 | 1 | akiss | |
33 | 1 | akiss | int previous,j,k,delta,first,second,third;
|
34 | 1 | akiss | /* saving of the old lists "vertices_number_in_each_cell" and "cells_vertices", usefull in the computation of the new ones */
|
35 | 1 | akiss | int old_vertices_number_in_each_cell[cell_number];
|
36 | 1 | akiss | for (int i=0;i<cell_number;i++){old_vertices_number_in_each_cell[i]=vertices_number_in_each_cell[i];} |
37 | 1 | akiss | int old_cells_vertices[old_vertices_number_in_each_cell[cell_number-1]]; |
38 | 1 | akiss | for (int i=0;i<old_vertices_number_in_each_cell[cell_number-1];i++){old_cells_vertices[i]=cells_vertices[i];} |
39 | 1 | akiss | |
40 | 1 | akiss | /* case 1: 2 adjacent cells have to be modified */
|
41 | 1 | akiss | if (adjacent_cells_number==2){ |
42 | 1 | akiss | delta=daughter_cells_vertices_number[0]-(vertices_number_in_each_cell[dividing_cell+1]-vertices_number_in_each_cell[dividing_cell]); |
43 | 1 | akiss | |
44 | 1 | akiss | /* case 1.1: the dividing cell has a smaller index than the adjacent cells */
|
45 | 1 | akiss | if (dividing_cell<adjacent_cell1){ first=dividing_cell; second=adjacent_cell1; third=adjacent_cell2;
|
46 | 1 | akiss | for (int i=dividing_cell+1;i<adjacent_cell1+1;i++){vertices_number_in_each_cell[i]+=delta;} |
47 | 1 | akiss | for (int i=adjacent_cell1+1;i<adjacent_cell2+1;i++){vertices_number_in_each_cell[i]+=delta+1;} |
48 | 1 | akiss | for (int i=adjacent_cell2+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta+2;} |
49 | 1 | akiss | } |
50 | 1 | akiss | /* case 1.2: the dividing cell has a bigger index than the adjacent cells */
|
51 | 1 | akiss | else if (dividing_cell>adjacent_cell2){ first=adjacent_cell1; second=adjacent_cell2; third=dividing_cell; |
52 | 1 | akiss | for (int i=adjacent_cell1+1;i<adjacent_cell2+1;i++){vertices_number_in_each_cell[i]+=1;} |
53 | 1 | akiss | for (int i=adjacent_cell2+1;i<dividing_cell+1;i++){vertices_number_in_each_cell[i]+=2;} |
54 | 1 | akiss | for (int i=dividing_cell+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta+2;} |
55 | 1 | akiss | } |
56 | 1 | akiss | /* case 1.3: the dividing cell is between the adjacent cells */
|
57 | 1 | akiss | else{ first=adjacent_cell1; second=dividing_cell; third=adjacent_cell2;
|
58 | 1 | akiss | for (int i=adjacent_cell1+1;i<dividing_cell+1;i++){vertices_number_in_each_cell[i]+=1;} |
59 | 1 | akiss | for (int i=dividing_cell+1;i<adjacent_cell2+1;i++){vertices_number_in_each_cell[i]+=delta+1;} |
60 | 1 | akiss | for (int i=adjacent_cell2+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta+2;} |
61 | 1 | akiss | } |
62 | 1 | akiss | vertices_number_in_each_cell[cell_number]=vertices_number_in_each_cell[cell_number-1]+daughter_cells_vertices_number[1]; |
63 | 1 | akiss | |
64 | 1 | akiss | for (int i=vertices_number_in_each_cell[dividing_cell];i<vertices_number_in_each_cell[dividing_cell+1];i++){ |
65 | 1 | akiss | cells_vertices[i]=cell1[i-vertices_number_in_each_cell[dividing_cell]];} |
66 | 1 | akiss | |
67 | 1 | akiss | k=0;
|
68 | 1 | akiss | previous=vertices_number_in_each_cell[adjacent_cell1+1]-2; |
69 | 1 | akiss | for (int i=vertices_number_in_each_cell[adjacent_cell1];i<vertices_number_in_each_cell[adjacent_cell1+1]-1;i++){ |
70 | 1 | akiss | if (((wall1[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]] && |
71 | 1 | akiss | wall1[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+previous-vertices_number_in_each_cell[adjacent_cell1]])) && k==0){ |
72 | 1 | akiss | cells_vertices[i]=vertices_number-2; k++;}
|
73 | 1 | akiss | if (((wall2[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]] && |
74 | 1 | akiss | wall2[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+previous-vertices_number_in_each_cell[adjacent_cell1]])) && k==0){ |
75 | 1 | akiss | cells_vertices[i]=vertices_number-1; k++;}
|
76 | 1 | akiss | cells_vertices[i+k]=old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]]; |
77 | 1 | akiss | previous=i; |
78 | 1 | akiss | } |
79 | 1 | akiss | |
80 | 1 | akiss | k=0;
|
81 | 1 | akiss | previous=vertices_number_in_each_cell[adjacent_cell2+1]-2; |
82 | 1 | akiss | for (int i=vertices_number_in_each_cell[adjacent_cell2];i<vertices_number_in_each_cell[adjacent_cell2+1]-1;i++){ |
83 | 1 | akiss | if (((wall1[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell2]+i-vertices_number_in_each_cell[adjacent_cell2]] && |
84 | 1 | akiss | wall1[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell2]+previous-vertices_number_in_each_cell[adjacent_cell2]])) && k==0){ |
85 | 1 | akiss | cells_vertices[i]=vertices_number-2; k++;}
|
86 | 1 | akiss | if (((wall2[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell2]+i-vertices_number_in_each_cell[adjacent_cell2]] && |
87 | 1 | akiss | wall2[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell2]+previous-vertices_number_in_each_cell[adjacent_cell2]])) && k==0){ |
88 | 1 | akiss | cells_vertices[i]=vertices_number-1; k++;}
|
89 | 1 | akiss | cells_vertices[i+k]=old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell2]+i-vertices_number_in_each_cell[adjacent_cell2]]; |
90 | 1 | akiss | previous=i; |
91 | 1 | akiss | } |
92 | 1 | akiss | |
93 | 1 | akiss | for (int i=vertices_number_in_each_cell[first+1];i<vertices_number_in_each_cell[second];i++){ |
94 | 1 | akiss | cells_vertices[i]= |
95 | 1 | akiss | old_cells_vertices[old_vertices_number_in_each_cell[first+1]+i-vertices_number_in_each_cell[first+1]];} |
96 | 1 | akiss | for (int i=vertices_number_in_each_cell[second+1];i<vertices_number_in_each_cell[third];i++){ |
97 | 1 | akiss | cells_vertices[i]= |
98 | 1 | akiss | old_cells_vertices[old_vertices_number_in_each_cell[second+1]+i-vertices_number_in_each_cell[second+1]];} |
99 | 1 | akiss | for (int i=vertices_number_in_each_cell[third+1];i<vertices_number_in_each_cell[cell_number-1];i++){ |
100 | 1 | akiss | cells_vertices[i]=old_cells_vertices[old_vertices_number_in_each_cell[third+1]+i-vertices_number_in_each_cell[third+1]];} |
101 | 1 | akiss | for (int i=vertices_number_in_each_cell[cell_number-1];i<vertices_number_in_each_cell[cell_number];i++){ |
102 | 1 | akiss | cells_vertices[i]=cell2[i-vertices_number_in_each_cell[cell_number-1]];}
|
103 | 1 | akiss | } |
104 | 1 | akiss | /* case 2: 1 adjacent cell has to be modified */
|
105 | 1 | akiss | if (adjacent_cells_number==1){ |
106 | 1 | akiss | if (dividing_cell<adjacent_cell1){ first=dividing_cell; second=adjacent_cell1;
|
107 | 1 | akiss | delta=daughter_cells_vertices_number[0]-(vertices_number_in_each_cell[dividing_cell+1]-vertices_number_in_each_cell[dividing_cell]); |
108 | 1 | akiss | for (int i=dividing_cell+1;i<adjacent_cell1+1;i++){vertices_number_in_each_cell[i]+=delta;} |
109 | 1 | akiss | for (int i=adjacent_cell1+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta+1;} |
110 | 1 | akiss | vertices_number_in_each_cell[cell_number]=vertices_number_in_each_cell[cell_number-1]+daughter_cells_vertices_number[1];} |
111 | 1 | akiss | |
112 | 1 | akiss | else if (dividing_cell>adjacent_cell1){ first=adjacent_cell1; second=dividing_cell; |
113 | 1 | akiss | delta=daughter_cells_vertices_number[0]-(vertices_number_in_each_cell[dividing_cell+1]-vertices_number_in_each_cell[dividing_cell]); |
114 | 1 | akiss | for (int i=adjacent_cell1+1;i<dividing_cell+1;i++){vertices_number_in_each_cell[i]+=1;} |
115 | 1 | akiss | for (int i=dividing_cell+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta+1;} |
116 | 1 | akiss | vertices_number_in_each_cell[cell_number]=vertices_number_in_each_cell[cell_number-1]+daughter_cells_vertices_number[1];} |
117 | 1 | akiss | |
118 | 1 | akiss | for (int i=vertices_number_in_each_cell[dividing_cell];i<vertices_number_in_each_cell[dividing_cell+1];i++){ |
119 | 1 | akiss | cells_vertices[i]=cell1[i-vertices_number_in_each_cell[dividing_cell]];} |
120 | 1 | akiss | |
121 | 1 | akiss | k=0;
|
122 | 1 | akiss | previous=vertices_number_in_each_cell[adjacent_cell1+1]-2; |
123 | 1 | akiss | for (int i=vertices_number_in_each_cell[adjacent_cell1];i<vertices_number_in_each_cell[adjacent_cell1+1]-1;i++){ |
124 | 1 | akiss | if (((wall1[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]] && |
125 | 1 | akiss | wall1[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+previous-vertices_number_in_each_cell[adjacent_cell1]])) && k==0){ |
126 | 1 | akiss | cells_vertices[i]=vertices_number-2; k++;}
|
127 | 1 | akiss | if (((wall2[1]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]] && |
128 | 1 | akiss | wall2[0]==old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+previous-vertices_number_in_each_cell[adjacent_cell1]])) && k==0){ |
129 | 1 | akiss | cells_vertices[i]=vertices_number-1; k++;}
|
130 | 1 | akiss | cells_vertices[i+k]=old_cells_vertices[old_vertices_number_in_each_cell[adjacent_cell1]+i-vertices_number_in_each_cell[adjacent_cell1]]; |
131 | 1 | akiss | previous=i; |
132 | 1 | akiss | } |
133 | 1 | akiss | for (int i=vertices_number_in_each_cell[first+1];i<vertices_number_in_each_cell[second];i++){ |
134 | 1 | akiss | cells_vertices[i]= |
135 | 1 | akiss | old_cells_vertices[old_vertices_number_in_each_cell[first+1]+i-vertices_number_in_each_cell[first+1]];} |
136 | 1 | akiss | for (int i=vertices_number_in_each_cell[second+1];i<vertices_number_in_each_cell[cell_number-1];i++){ |
137 | 1 | akiss | cells_vertices[i]=old_cells_vertices[old_vertices_number_in_each_cell[second+1]+i-vertices_number_in_each_cell[second+1]];} |
138 | 1 | akiss | for (int i=vertices_number_in_each_cell[cell_number-1];i<vertices_number_in_each_cell[cell_number];i++){ |
139 | 1 | akiss | cells_vertices[i]=cell2[i-vertices_number_in_each_cell[cell_number-1]];}
|
140 | 1 | akiss | } |
141 | 1 | akiss | |
142 | 1 | akiss | /* case 3: no adjacent cell has to be modified */
|
143 | 1 | akiss | // impossible, except in very unusual cases
|
144 | 1 | akiss | if (adjacent_cells_number==0){ |
145 | 1 | akiss | delta=daughter_cells_vertices_number[0]-(vertices_number_in_each_cell[dividing_cell+1]-vertices_number_in_each_cell[dividing_cell]); |
146 | 1 | akiss | for (int i=dividing_cell+1;i<cell_number;i++){vertices_number_in_each_cell[i]+=delta;} |
147 | 1 | akiss | vertices_number_in_each_cell[cell_number]=vertices_number_in_each_cell[cell_number-1]+daughter_cells_vertices_number[1]; |
148 | 1 | akiss | for (int i=vertices_number_in_each_cell[dividing_cell];i<vertices_number_in_each_cell[dividing_cell+1];i++){ |
149 | 1 | akiss | cells_vertices[i]=cell1[i-vertices_number_in_each_cell[dividing_cell]];} |
150 | 1 | akiss | for (int i=vertices_number_in_each_cell[dividing_cell+1];i<vertices_number_in_each_cell[cell_number-1];i++){ |
151 | 1 | akiss | cells_vertices[i]= |
152 | 1 | akiss | old_cells_vertices[old_vertices_number_in_each_cell[dividing_cell+1]+i-vertices_number_in_each_cell[dividing_cell+1]];} |
153 | 1 | akiss | for (int i=vertices_number_in_each_cell[cell_number-1];i<vertices_number_in_each_cell[cell_number];i++){ |
154 | 1 | akiss | cells_vertices[i]=cell2[i-vertices_number_in_each_cell[cell_number-1]];}
|
155 | 1 | akiss | } |
156 | 1 | akiss | ///* concentrations in the daughter cells are the concentration in the mother */
|
157 | 1 | akiss | //a[cell_number-1]=a[dividing_cell];
|
158 | 1 | akiss | |
159 | 1 | akiss | // tracking of the walls which are on the boundary
|
160 | 1 | akiss | |
161 | 1 | akiss | /* tracking of the walls which were not modified by the division */
|
162 | 1 | akiss | int next,previous2,previous3;
|
163 | 1 | akiss | |
164 | 1 | akiss | for (int i=0;i<cell_number-1;i++){ |
165 | 1 | akiss | previous=vertices_number_in_each_cell[i+1]-1; |
166 | 1 | akiss | for (j=vertices_number_in_each_cell[i];j<vertices_number_in_each_cell[i+1];j++){ |
167 | 1 | akiss | previous2=old_vertices_number_in_each_cell[i+1]-1; |
168 | 1 | akiss | for (k=old_vertices_number_in_each_cell[i];k<old_vertices_number_in_each_cell[i+1];k++){ |
169 | 1 | akiss | if (cells_vertices[previous]==old_cells_vertices[previous2] && cells_vertices[j]==old_cells_vertices[k]){
|
170 | 1 | akiss | // p[j]=old_p[k];
|
171 | 1 | akiss | boundary[j]=old_boundary[k]; |
172 | 1 | akiss | } |
173 | 1 | akiss | previous2=k;} |
174 | 1 | akiss | previous=j;} |
175 | 1 | akiss | } |
176 | 1 | akiss | /* tracking of the walls from cell #cell_number which were not modified by the division */
|
177 | 1 | akiss | |
178 | 1 | akiss | for (int i=vertices_number_in_each_cell[cell_number-1];i<vertices_number_in_each_cell[cell_number];i++){ |
179 | 1 | akiss | previous=i-1; if (i==vertices_number_in_each_cell[cell_number-1]){previous=vertices_number_in_each_cell[cell_number]-1;} |
180 | 1 | akiss | previous2=old_vertices_number_in_each_cell[dividing_cell+1]-1; |
181 | 1 | akiss | for (k=old_vertices_number_in_each_cell[dividing_cell];k<old_vertices_number_in_each_cell[dividing_cell+1];k++){ |
182 | 1 | akiss | if (cells_vertices[previous]==old_cells_vertices[previous2] && cells_vertices[i]==old_cells_vertices[k]){
|
183 | 1 | akiss | // p[i]=old_p[k];
|
184 | 1 | akiss | boundary[i]=old_boundary[k]; |
185 | 1 | akiss | } |
186 | 1 | akiss | previous2=k;} |
187 | 1 | akiss | } |
188 | 1 | akiss | |
189 | 1 | akiss | /* tracking of the walls from the daughters which were modified by the division */
|
190 | 1 | akiss | |
191 | 1 | akiss | for (int i=old_vertices_number_in_each_cell[dividing_cell];i<old_vertices_number_in_each_cell[dividing_cell+1];i++){ |
192 | 1 | akiss | previous=i-1; if (i==old_vertices_number_in_each_cell[dividing_cell]){previous=old_vertices_number_in_each_cell[dividing_cell+1]-1;} |
193 | 1 | akiss | previous2=vertices_number_in_each_cell[dividing_cell+1]-1; |
194 | 1 | akiss | for (j=vertices_number_in_each_cell[dividing_cell];j<vertices_number_in_each_cell[dividing_cell+1];j++){ |
195 | 1 | akiss | previous3=vertices_number_in_each_cell[cell_number]-1;
|
196 | 1 | akiss | for (k=vertices_number_in_each_cell[cell_number-1];k<vertices_number_in_each_cell[cell_number];k++){ |
197 | 1 | akiss | if ((old_cells_vertices[previous]==cells_vertices[previous2] && cells_vertices[previous3]==cells_vertices[j]) &&
|
198 | 1 | akiss | (old_cells_vertices[i]==cells_vertices[k])){ |
199 | 1 | akiss | // p[j]=old_p[i];
|
200 | 1 | akiss | // p[k]=old_p[i];
|
201 | 1 | akiss | boundary[j]=old_boundary[i]; |
202 | 1 | akiss | boundary[k]=old_boundary[i]; |
203 | 1 | akiss | } |
204 | 1 | akiss | if ((old_cells_vertices[previous]==cells_vertices[previous3] && cells_vertices[previous2]==cells_vertices[k]) &&
|
205 | 1 | akiss | (old_cells_vertices[i]==cells_vertices[j])){ |
206 | 1 | akiss | // p[j]=old_p[previous];
|
207 | 1 | akiss | // p[k]=old_p[previous];
|
208 | 1 | akiss | boundary[j]=old_boundary[i]; |
209 | 1 | akiss | boundary[k]=old_boundary[i]; |
210 | 1 | akiss | } |
211 | 1 | akiss | previous3=k;} |
212 | 1 | akiss | previous2=j;} |
213 | 1 | akiss | } |
214 | 1 | akiss | |
215 | 1 | akiss | /* tracking of the new cell wall */
|
216 | 1 | akiss | for (int i=vertices_number_in_each_cell[dividing_cell];i<vertices_number_in_each_cell[dividing_cell+1];i++){ |
217 | 1 | akiss | previous2=i-1; if(i==vertices_number_in_each_cell[dividing_cell]){previous2=vertices_number_in_each_cell[dividing_cell+1]-1;} |
218 | 1 | akiss | previous3=vertices_number_in_each_cell[cell_number]-1;
|
219 | 1 | akiss | for (k=vertices_number_in_each_cell[cell_number-1];k<vertices_number_in_each_cell[cell_number];k++){ |
220 | 1 | akiss | if (cells_vertices[previous2]==cells_vertices[k] && cells_vertices[i]==cells_vertices[previous3]){
|
221 | 1 | akiss | // p[i]=production_coeff_p/degradation_coeff_p;
|
222 | 1 | akiss | // p[k]=production_coeff_p/degradation_coeff_p;
|
223 | 1 | akiss | boundary[i]=0;
|
224 | 1 | akiss | boundary[k]=0;
|
225 | 1 | akiss | } |
226 | 1 | akiss | previous3=k;} |
227 | 1 | akiss | } |
228 | 1 | akiss | |
229 | 1 | akiss | |
230 | 1 | akiss | /* tracking of the walls from the neighbours which were modified by the division */
|
231 | 1 | akiss | if (adjacent_cells_number>0){ |
232 | 1 | akiss | previous2=old_vertices_number_in_each_cell[adjacent_cell1+1]-1; |
233 | 1 | akiss | for (int i=old_vertices_number_in_each_cell[adjacent_cell1];i<old_vertices_number_in_each_cell[adjacent_cell1+1];i++){ |
234 | 1 | akiss | previous=vertices_number_in_each_cell[adjacent_cell1+1]-1; |
235 | 1 | akiss | for (j=vertices_number_in_each_cell[adjacent_cell1];j<vertices_number_in_each_cell[adjacent_cell1+1];j++){ |
236 | 1 | akiss | next=j+1; if (next==vertices_number_in_each_cell[adjacent_cell1+1]){next=vertices_number_in_each_cell[adjacent_cell1];} |
237 | 1 | akiss | if (cells_vertices[next]==old_cells_vertices[i] && cells_vertices[previous]==old_cells_vertices[previous2]){
|
238 | 1 | akiss | // p[j]=old_p[i];
|
239 | 1 | akiss | // p[next]=old_p[i];
|
240 | 1 | akiss | boundary[j]=old_boundary[i]; |
241 | 1 | akiss | boundary[next]=old_boundary[i]; |
242 | 1 | akiss | } |
243 | 1 | akiss | previous=j;} |
244 | 1 | akiss | previous2=i;} |
245 | 1 | akiss | } |
246 | 1 | akiss | |
247 | 1 | akiss | if (adjacent_cells_number==2){ |
248 | 1 | akiss | previous2=old_vertices_number_in_each_cell[adjacent_cell2+1]-1; |
249 | 1 | akiss | for (int i=old_vertices_number_in_each_cell[adjacent_cell2];i<old_vertices_number_in_each_cell[adjacent_cell2+1];i++){ |
250 | 1 | akiss | previous=vertices_number_in_each_cell[adjacent_cell2+1]-1; |
251 | 1 | akiss | for (j=vertices_number_in_each_cell[adjacent_cell2];j<vertices_number_in_each_cell[adjacent_cell2+1];j++){ |
252 | 1 | akiss | next=j+1; if (next==vertices_number_in_each_cell[adjacent_cell2+1]){next=vertices_number_in_each_cell[adjacent_cell2];} |
253 | 1 | akiss | if (cells_vertices[next]==old_cells_vertices[i] && cells_vertices[previous]==old_cells_vertices[previous2]){
|
254 | 1 | akiss | // p[j]=old_p[i];
|
255 | 1 | akiss | // p[next]=old_p[i];
|
256 | 1 | akiss | boundary[j]=old_boundary[i]; |
257 | 1 | akiss | boundary[next]=old_boundary[i]; |
258 | 1 | akiss | } |
259 | 1 | akiss | previous=j;} |
260 | 1 | akiss | previous2=i;} |
261 | 1 | akiss | } |
262 | 1 | akiss | |
263 | 1 | akiss | // updating the list "wall_vertices" and the lengths of the walls
|
264 | 1 | akiss | double old_wall_vertices[2*wall_number-6]; |
265 | 1 | akiss | for (int i=0;i<2*wall_number-6;i++){old_wall_vertices[i]=wall_vertices[i];} |
266 | 1 | akiss | double old_target_lengths[wall_number-3]; |
267 | 1 | akiss | for (int i=0;i<wall_number-3;i++){old_target_lengths[i]=target_lengths[i];} |
268 | 1 | akiss | double old_length1, old_target_length1, old_length2, old_target_length2;
|
269 | 1 | akiss | for (int i=0;i<wall_number-3;i++){ |
270 | 1 | akiss | if ((wall_vertices[2*i]==wall1[0] && wall_vertices[2*i+1]==wall1[1]) || (wall_vertices[2*i]==wall1[1] && wall_vertices[2*i+1]==wall1[0])){ |
271 | 1 | akiss | old_length1=lengths[i]; old_target_length1=target_lengths[i]; |
272 | 1 | akiss | } |
273 | 1 | akiss | if ((wall_vertices[2*i]==wall2[0] && wall_vertices[2*i+1]==wall2[1]) || (wall_vertices[2*i]==wall2[1] && wall_vertices[2*i+1]==wall2[0])){ |
274 | 1 | akiss | old_length2=lengths[i]; old_target_length2=target_lengths[i]; |
275 | 1 | akiss | } |
276 | 1 | akiss | } |
277 | 1 | akiss | |
278 | 1 | akiss | compute_wall_vertices( cells_vertices, vertices_number_in_each_cell, cell_number, wall_vertices); |
279 | 1 | akiss | compute_lengths(vertices, wall_vertices, wall_number, lengths); |
280 | 1 | akiss | |
281 | 1 | akiss | for (int i=0;i<wall_number;i++){ |
282 | 1 | akiss | for (j=0;j<wall_number-3;j++){ |
283 | 1 | akiss | if ((wall_vertices[2*i]==old_wall_vertices[2*j] && wall_vertices[2*i+1]==old_wall_vertices[2*j+1]) || (wall_vertices[2*i]==old_wall_vertices[2*j+1] && wall_vertices[2*i+1]==old_wall_vertices[2*j])){ |
284 | 1 | akiss | target_lengths[i]=old_target_lengths[j]; //goto next_wall;
|
285 | 1 | akiss | } |
286 | 1 | akiss | } |
287 | 1 | akiss | if ((wall_vertices[2*i]==wall1[0] && wall_vertices[2*i+1]==vertices_number-2) || (wall_vertices[2*i]==wall1[1] && wall_vertices[2*i+1]==vertices_number-2) || |
288 | 1 | akiss | (wall_vertices[2*i+1]==wall1[0] && wall_vertices[2*i]==vertices_number-2) || (wall_vertices[2*i+1]==wall1[1] && wall_vertices[2*i]==vertices_number-2)){ |
289 | 1 | akiss | target_lengths[i]=lengths[i]*old_target_length1/old_length1; |
290 | 1 | akiss | } |
291 | 1 | akiss | if ((wall_vertices[2*i]==wall2[0] && wall_vertices[2*i+1]==vertices_number-1) || (wall_vertices[2*i]==wall2[1] && wall_vertices[2*i+1]==vertices_number-1) || |
292 | 1 | akiss | (wall_vertices[2*i+1]==wall2[0] && wall_vertices[2*i]==vertices_number-1) || (wall_vertices[2*i+1]==wall2[1] && wall_vertices[2*i]==vertices_number-1)){ |
293 | 1 | akiss | target_lengths[i]=lengths[i]*old_target_length2/old_length2; |
294 | 1 | akiss | } |
295 | 1 | akiss | if ((wall_vertices[2*i]==vertices_number-1 && wall_vertices[2*i+1]==vertices_number-2) || |
296 | 1 | akiss | (wall_vertices[2*i+1]==vertices_number-1 && wall_vertices[2*i]==vertices_number-2) ){ |
297 | 1 | akiss | target_lengths[i]=lengths[i]; |
298 | 1 | akiss | } |
299 | 1 | akiss | } |
300 | 1 | akiss | |
301 | 1 | akiss | /* computation of values which are modified by the division */ //printf("cell division 2\n"); int bug[1]={0}; |
302 | 1 | akiss | compute_barycenters(vertices,vertices_number,cells_vertices,vertices_number_in_each_cell,cell_number,barycenters); |
303 | 1 | akiss | compute_shapes(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, barycenters, shapes); |
304 | 1 | akiss | compute_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas); |
305 | 1 | akiss | compute_cell_areas(vertices, cells_vertices, vertices_number_in_each_cell, cell_number, areas, cell_areas); |
306 | 1 | akiss | |
307 | 1 | akiss | // definition of the new targets, to keep stress constant, on the daughters
|
308 | 1 | akiss | targets[3*dividing_cell]=shapes[3*dividing_cell]+(shapes[3*dividing_cell]+shapes[3*dividing_cell+1])*(old_target_shape[0]-old_shape[0])/(old_shape[0]+old_shape[1]); |
309 | 1 | akiss | targets[3*dividing_cell+1]=shapes[3*dividing_cell+1]+(shapes[3*dividing_cell]+shapes[3*dividing_cell+1])*(old_target_shape[1]-old_shape[1])/(old_shape[0]+old_shape[1]); |
310 | 1 | akiss | targets[3*dividing_cell+2]=shapes[3*dividing_cell+2]+(shapes[3*dividing_cell]+shapes[3*dividing_cell+1])*(old_target_shape[2]-old_shape[2])/(old_shape[0]+old_shape[1]); |
311 | 1 | akiss | targets[3*(cell_number-1)]=shapes[3*(cell_number-1)]+(shapes[3*(cell_number-1)]+shapes[3*(cell_number-1)+1])*(old_target_shape[0]-old_shape[0])/(old_shape[0]+old_shape[1]); |
312 | 1 | akiss | targets[3*(cell_number-1)+1]=shapes[3*(cell_number-1)+1]+(shapes[3*(cell_number-1)]+shapes[3*(cell_number-1)+1])*(old_target_shape[1]-old_shape[1])/(old_shape[0]+old_shape[1]); |
313 | 1 | akiss | targets[3*(cell_number-1)+2]=shapes[3*(cell_number-1)+2]+(shapes[3*(cell_number-1)]+shapes[3*(cell_number-1)+1])*(old_target_shape[2]-old_shape[2])/(old_shape[0]+old_shape[1]); |
314 | 1 | akiss | |
315 | 1 | akiss | // definition of the new targets, to keep stress constant, on the neighbours
|
316 | 1 | akiss | if (adjacent_cells_number>0){ |
317 | 1 | akiss | targets[3*adjacent_cell1]=shapes[3*adjacent_cell1]+(shapes[3*adjacent_cell1]+shapes[3*adjacent_cell1+1])*(old_target_shape_adjacent_cell1[0]-old_shape_adjacent_cell1[0])/(old_shape_adjacent_cell1[0]+old_shape_adjacent_cell1[1]); |
318 | 1 | akiss | targets[3*adjacent_cell1+1]=shapes[3*adjacent_cell1+1]+(shapes[3*adjacent_cell1]+shapes[3*adjacent_cell1+1])*(old_target_shape_adjacent_cell1[1]-old_shape_adjacent_cell1[1])/(old_shape_adjacent_cell1[0]+old_shape_adjacent_cell1[1]); |
319 | 1 | akiss | targets[3*adjacent_cell1+2]=shapes[3*adjacent_cell1+2]+(shapes[3*adjacent_cell1]+shapes[3*adjacent_cell1+1])*(old_target_shape_adjacent_cell1[2]-old_shape_adjacent_cell1[2])/(old_shape_adjacent_cell1[0]+old_shape_adjacent_cell1[1]); |
320 | 1 | akiss | if (adjacent_cells_number==2){ |
321 | 1 | akiss | targets[3*adjacent_cell2]=shapes[3*adjacent_cell2]+(shapes[3*adjacent_cell2]+shapes[3*adjacent_cell2+1])*(old_target_shape_adjacent_cell2[0]-old_shape_adjacent_cell2[0])/(old_shape_adjacent_cell2[0]+old_shape_adjacent_cell2[1]); |
322 | 1 | akiss | targets[3*adjacent_cell2+1]=shapes[3*adjacent_cell2+1]+(shapes[3*adjacent_cell2]+shapes[3*adjacent_cell2+1])*(old_target_shape_adjacent_cell2[1]-old_shape_adjacent_cell2[1])/(old_shape_adjacent_cell2[0]+old_shape_adjacent_cell2[1]); |
323 | 1 | akiss | targets[3*adjacent_cell2+2]=shapes[3*adjacent_cell2+2]+(shapes[3*adjacent_cell2]+shapes[3*adjacent_cell2+1])*(old_target_shape_adjacent_cell2[2]-old_shape_adjacent_cell2[2])/(old_shape_adjacent_cell2[0]+old_shape_adjacent_cell2[1]); |
324 | 1 | akiss | } |
325 | 1 | akiss | } |
326 | 1 | akiss | // tracking the cells which were on the border of the tissue (this is just inherited from the mother)
|
327 | 1 | akiss | border[dividing_cell]=0;
|
328 | 1 | akiss | for (int j=vertices_number_in_each_cell[dividing_cell]; j<vertices_number_in_each_cell[dividing_cell+1];j++){ |
329 | 1 | akiss | if (boundary[j]==1.){ border[dividing_cell]=1; } |
330 | 1 | akiss | } |
331 | 1 | akiss | border[cell_number-1]=0; |
332 | 1 | akiss | for (int j=vertices_number_in_each_cell[cell_number-1]; j<vertices_number_in_each_cell[cell_number];j++){ |
333 | 1 | akiss | if (boundary[j]==1.){ border[cell_number-1]=1; } |
334 | 1 | akiss | } |
335 | 1 | akiss | |
336 | 1 | akiss | |
337 | 1 | akiss | } |