Timothy  0.9
Tissue Modelling Framework
 All Data Structures Files Functions Variables Typedefs Macros
cells.c
Go to the documentation of this file.
1 /* **************************************************************************
2  * This file is part of Timothy
3  *
4  * Copyright (c) 2014/15 Maciej Cytowski
5  * Copyright (c) 2014/15 ICM, University of Warsaw, Poland
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  * *************************************************************************/
22 
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <mpi.h>
26 #include <math.h>
27 #include <inttypes.h>
28 #include <sprng.h>
29 
30 #include "global.h"
31 #include "inline.h"
32 #include "fields.h"
33 
38 unsigned char *celld;
39 
43 static inline int outsideTheBox(int p)
44 {
45  double x, y, z, r;
46 
47  x = cells[p].x;
48  y = cells[p].y;
49  z = cells[p].z;
50  r = cells[p].size;
51 
52  if (x - r < 0 || x + r > (double) nx)
53  return 1;
54  if (y - r < 0 || y + r > (double) ny)
55  return 1;
56  if (sdim == 3 && (z - r < 0 || z + r > (double) nz))
57  return 1;
58 
59  return 0;
60 }
61 
67 {
68 
69  int i, j, c, f;
70  int64_t cellsActualSize;
71 
72  if (sdim == 2)
73  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 2.0);
74  if (sdim == 3)
75  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 3.0);
76 
78 
79  cellsActualSize = maxCellsPerProc * sizeof(struct cellData);
80 
81  localID = 0;
82 
83  if (!(cells = (struct cellData *) malloc(cellsActualSize)))
84  stopRun(106, "cells", __FILE__, __LINE__);
85 
86  if (!
87  (velocity =
88  (struct doubleVector3d *) malloc(maxCellsPerProc *
89  sizeof(struct doubleVector3d))))
90  stopRun(106, "velocity", __FILE__, __LINE__);
91 
92  cellFields = (double **) malloc(NFIELDS * sizeof(double *));
93  for (f = 0; f < NFIELDS; f++)
94  if (!
95  (cellFields[f] =
96  (double *) malloc(maxCellsPerProc * sizeof(double))))
97  stopRun(106, "cellFields", __FILE__, __LINE__);
98 
99  if (!(tlnc = (int64_t *) calloc(MPIsize, sizeof(int64_t))))
100  stopRun(106, "tlnc", __FILE__, __LINE__);
101 
102 }
103 
108 {
109  /* global numbers of cells */
110  g0nc = nc;
111  g1nc = 0;
112  snc = 0;
113  g2nc = 0;
114  mnc = 0;
115  cnc = 0;
116  /* local numbers of cells */
117  lg0nc = lnc;
118  lg1nc = 0;
119  lsnc = 0;
120  lg2nc = 0;
121  lmnc = 0;
122  lcnc = 0;
123  lnnc = 0;
124  /* number of cancer cells */
125  cancer = 0;
126 }
127 
133 {
134 
135  int i, j;
136 
137  /* uniform distribution */
138  if (!strcmp(rng, "UNB")) {
139  double D;
140 
141  if (sdim == 2)
142  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 2.0);
143  if (sdim == 3)
144  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 3.0);
145  if (sdim == 2)
146  D = csize * pow(8.0 * nc, 1.0 / 2.0);
147  if (sdim == 3)
148  D = csize * pow(8.0 * nc, 1.0 / 3.0);
149 
150  h = 3.0 * csize;
151  simTime = 0;
152 
153  for (i = 0; i < lnc; i++) {
154  cells[i].x = D * (sprng(stream) * 2 - 1);
155  cells[i].y = D * (sprng(stream) * 2 - 1);
156  if (sdim == 3)
157  cells[i].z = D * (sprng(stream) * 2 - 1);
158  else
159  cells[i].z = 0.0;
160 
161  cells[i].x += nx / 2;
162  cells[i].y += nx / 2;
163  if (sdim == 3)
164  cells[i].z += nx / 2;
165  else
166  cells[i].z = 0.0;
167 
168  cells[i].size = pow(2.0, -(1.0 / 3.0)) * csize;
169  cells[i].gid =
170  (unsigned long long int) MPIrank *(unsigned long long int)
171  maxCellsPerProc + (unsigned long long int) i;
172  cells[i].v = 0.0;
173  cells[i].density = 0.0;
174  cells[i].h = h;
175  cells[i].young = 2100.0 + sprng(stream) * 100.0;
176  cells[i].halo = 0;
177  cells[i].phase = 0;
178  cells[i].g1 = g1 * (1 + (sprng(stream) * 2 - 1) * v);
179  cells[i].g2 = g2 * (1 + (sprng(stream) * 2 - 1) * v);
180  cells[i].s = s * (1 + (sprng(stream) * 2 - 1) * v);
181  cells[i].m = m * (1 + (sprng(stream) * 2 - 1) * v);
182  cells[i].phasetime = 0.0;
183  cells[i].age = 0;
184  cells[i].death = 0;
185  cells[i].tumor = 0;
186  localID++;
187  }
188  }
189  /* normal distribution (Box-Muller transform) */
190  if (!strcmp(rng, "BM")) {
191  double x1, x2, x3;
192  double z1, z2, z3;
193  double r1, r2;
194  double l;
195  double D;
196  if (sdim == 2)
197  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 2.0);
198  if (sdim == 3)
199  csize = (nx / 2) / pow(8.0 * maxCells, 1.0 / 3.0);
200  if (sdim == 2)
201  D = csize * pow(8.0 * nc, 1.0 / 2.0);
202  if (sdim == 3)
203  D = csize * pow(8.0 * nc, 1.0 / 3.0);
204 
205  h = 3.0 * csize;
206  simTime = 0;
207 
208  for (i = 0; i < lnc; i++) {
209 
210  r2 = 1.1;
211 
212  while (r2 >= 1.0) {
213  r1 = 1.1;
214  while (r1 == 0 || r1 >= 1.0) {
215  x1 = sprng(stream) * 2 - 1;
216  x2 = sprng(stream) * 2 - 1;
217  x3 = sprng(stream) * 2 - 1;
218  r1 = x1 * x1 + x2 * x2 + x3 * x3;
219  }
220  l = sqrt(-2 * log(r1) / r1);
221  z1 = x1 * l;
222  z2 = x2 * l;
223  z3 = x3 * l;
224 
225  r2 = z1 * z1 + z2 * z2 + z3 * z3;
226  }
227 
228  cells[i].x = z1 * D + nx / 2;
229  cells[i].y = z2 * D + nx / 2;
230  if (sdim == 3)
231  cells[i].z = z3 * D + nx / 2;
232  else
233  cells[i].z = 0.0;
234 
235  cells[i].size = pow(2.0, -(1.0 / 3.0)) * csize;
236  cells[i].gid =
237  (unsigned long long int) MPIrank *(unsigned long long int)
238  maxCellsPerProc + (unsigned long long int) i;
239  cells[i].v = 0.0;
240  cells[i].density = 0.0;
241  cells[i].h = h;
242  cells[i].young = 2100.0 + sprng(stream) * 100.0;
243  cells[i].halo = 0;
244  cells[i].phase = 0;
245  cells[i].g1 = g1 * (1 + (sprng(stream) * 2 - 1) * v);
246  cells[i].g2 = g2 * (1 + (sprng(stream) * 2 - 1) * v);
247  cells[i].s = s * (1 + (sprng(stream) * 2 - 1) * v);
248  cells[i].m = m * (1 + (sprng(stream) * 2 - 1) * v);
249  cells[i].phasetime = 0.0;
250  cells[i].tumor = 0;
251  cells[i].age = 0;
252  cells[i].death = 0;
253  localID++;
254  }
255  }
256 
257  /* powers of h are calculated only once here */
258  h2 = h * h;
259  h3 = h2 * h;
260  h4 = h3 * h;
261 }
262 
266 void mitosis(int c)
267 {
268 
269  double sc;
270  double shift[3];
271 
272  if (lnc + 1 > maxCellsPerProc)
273  stopRun(109, NULL, __FILE__, __LINE__);
274 
275  sc = sqrt(velocity[c].x * velocity[c].x + velocity[c].y * velocity[c].y +
276  velocity[c].z * velocity[c].z);
277 
278  /* daughter cells are shifted away from the center of parent cell */
279  if (sc > 0 && mitrand == 0) { /* direction of shift related to velocity vector */
280  sc = cells[c].size / (2 * sc);
281  shift[0] = sc * velocity[c].x;
282  shift[1] = sc * velocity[c].y;
283  if (sdim == 3)
284  shift[2] = sc * velocity[c].z;
285  else
286  shift[2] = 0.0;
287  } else { /* direction of shift chosen randomly */
288  int accept = 0;
289  while (accept == 0) {
290  shift[0] = sprng(stream) * 2.0 - 1.0;
291  shift[1] = sprng(stream) * 2.0 - 1.0;
292  if (sdim == 3)
293  shift[2] = sprng(stream) * 2.0 - 1.0;
294  else
295  shift[2] = 0.0;
296  sc = sqrt(pow(shift[0], 2) + pow(shift[1], 2) + pow(shift[2], 2));
297  if (sc == 0)
298  continue;
299  sc = cells[c].size / (2 * sc);
300  shift[0] = sc * shift[0];
301  shift[1] = sc * shift[1];
302  shift[2] = sc * shift[2];
303  accept = 1;
304  }
305  }
306  /* 1st daughter cell position, size, type and age */
307  cells[lnc].x = cells[c].x + shift[0];
308  cells[lnc].y = cells[c].y + shift[1];
309  cells[lnc].z = cells[c].z + shift[2];
310  cells[lnc].size = pow(2.0, -(1.0 / 3.0)) * cells[c].size;;
311  cells[lnc].tumor = cells[c].tumor;
312  cells[lnc].age = cells[c].age + 1;
313 
314  /* 2nd daughter cell position, size, type and age */
315  cells[c].x -= shift[0];
316  cells[c].y -= shift[1];
317  cells[c].z -= shift[2];
318  cells[c].size = cells[lnc].size;;
319  cells[c].age += 1;
320 
321  /* 2nd daughter cell cycle phases lenghts */
322  if (cells[c].tumor == 1) {
323  cells[c].g1 = cg1 * (1 + (sprng(stream) * 2 - 1) * v);
324  cells[c].g2 = cg2 * (1 + (sprng(stream) * 2 - 1) * v);
325  cells[c].s = cs * (1 + (sprng(stream) * 2 - 1) * v);
326  cells[c].m = cm * (1 + (sprng(stream) * 2 - 1) * v);
327  } else {
328  cells[c].g1 = g1 * (1 + (sprng(stream) * 2 - 1) * v);
329  cells[c].g2 = g2 * (1 + (sprng(stream) * 2 - 1) * v);
330  cells[c].s = s * (1 + (sprng(stream) * 2 - 1) * v);
331  cells[c].m = m * (1 + (sprng(stream) * 2 - 1) * v);
332  }
333  /* 1st daughter cell global ID */
334  cells[lnc].gid =
335  (unsigned long long int) MPIrank *(unsigned long long int)
336  maxCellsPerProc + (unsigned long long int) lnc;
337 
338  /* 1st daughter cell parameters */
339  cells[lnc].v = 0.0;
340  cells[lnc].density = cells[c].density;
341  cells[lnc].h = h;
342  cells[lnc].young = 2100.0 + sprng(stream) * 100.0;
343  cells[lnc].halo = 0;
344  cells[lnc].phase = 1;
345  cells[lnc].death = 0;
346  cells[lnc].phasetime = 0.0;
347  /* 1st daughter cell cycle phases lenghts */
348  if (cells[lnc].tumor == 1) {
349  cells[lnc].g1 = cg1 * (1 + (sprng(stream) * 2 - 1) * v);
350  cells[lnc].g2 = cg2 * (1 + (sprng(stream) * 2 - 1) * v);
351  cells[lnc].s = cs * (1 + (sprng(stream) * 2 - 1) * v);
352  cells[lnc].m = cm * (1 + (sprng(stream) * 2 - 1) * v);
353  } else {
354  cells[lnc].g1 = g1 * (1 + (sprng(stream) * 2 - 1) * v);
355  cells[lnc].g2 = g2 * (1 + (sprng(stream) * 2 - 1) * v);
356  cells[lnc].s = s * (1 + (sprng(stream) * 2 - 1) * v);
357  cells[lnc].m = m * (1 + (sprng(stream) * 2 - 1) * v);
358  }
359 
360  /* update local cell counters */
361  if (cells[lnc].tumor == 1)
362  lcnc += 1;
363  lnc = lnc + 1;
364  lg1nc += 1;
365  /* increment local ID */
366  localID++;
367 
368 }
369 
375 {
376  int c;
377  int middle = 0;
378  double dist;
379  struct {
380  double val;
381  int rank;
382  } lmdist, gmdist;
383  double center[3];
384  double gcenter[3];
385 
386  /* each process computes its local center of mass */
387  center[0] = 0.0;
388  center[1] = 0.0;
389  center[2] = 0.0;
390  for (c = 0; c < lnc; c++) {
391  center[0] += cells[c].x / nc;
392  center[1] += cells[c].y / nc;
393  center[2] += cells[c].z / nc;
394  }
395 
396  /* MPI Reduce operation computes global center of mass */
397  MPI_Allreduce(center, gcenter, 3, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
398 
399  /* intialization */
400  lmdist.rank = MPIrank;
401  lmdist.val = INT_MAX;
402 
403  /* each process finds local cell closest to the global center of mass */
404  for (c = 0; c < lnc; c++) {
405  dist =
406  sqrt((cells[c].x - gcenter[0]) * (cells[c].x - gcenter[0]) +
407  (cells[c].y - gcenter[1]) * (cells[c].y - gcenter[1]) +
408  (cells[c].z - gcenter[2]) * (cells[c].z - gcenter[2]));
409  if (dist < lmdist.val) {
410  lmdist.val = dist;
411  middle = c;
412  }
413  }
414 
415  /* MPI_Allreduce locates the cell closest to the global center of mass */
416  MPI_Allreduce(&lmdist, &gmdist, 1, MPI_DOUBLE_INT, MPI_MINLOC,
417  MPI_COMM_WORLD);
418  /* mark the found cell as cancer one */
419  if (MPIrank == gmdist.rank) {
420  cells[middle].tumor = 1;
421  cells[middle].phase = 1;
422  lg0nc--;
423  lg1nc++;
424  lcnc++;
425  }
426 
427  /* indicate that there is a cancer cell in the system */
428  cancer = 1;
429 }
430 
435 {
436  int f;
437  free(tlnc);
438  free(cells);
439  for (f = 0; f < NFIELDS; f++)
440  free(cellFields[f]);
441  free(cellFields);
442  free(velocity);
443 }
444 
448 void cellsDeath(int lnc_old)
449 {
450  int c, pos;
451 
452  pos = 0;
453  for (c = 0; c < lnc; c++) {
454  /* shift cells after dead cell removal */
455  if (c >= lnc_old) {
456  cells[pos] = cells[c];
457  pos++;
458  continue;
459  }
460  if (c != pos && celld[c] == 0)
461  cells[pos] = cells[c];
462  if (celld[c] == 0)
463  pos++;
464  /* update cell counters */
465  if (celld[c] == 1) {
466  switch (cells[c].phase) {
467  case 0:
468  lg0nc--;
469  break;
470  case 1:
471  lg1nc--;
472  break;
473  case 2:
474  lsnc--;
475  break;
476  case 3:
477  lg2nc--;
478  break;
479  case 4:
480  lmnc--;
481  break;
482  }
483  if (cells[c].tumor == 1)
484  lcnc--;
485  }
486  }
487  lnc -= rsum;
488 }
489 
494 {
495  MPI_Allgather(&lnc, 1, MPI_INT64_T, tlnc, 1, MPI_INT64_T,
496  MPI_COMM_WORLD);
498  MPI_INT64_T, MPI_SUM, MPI_COMM_WORLD);
499 }
500 
505 {
506  int c;
507 #ifdef DEBUG
508  if (MPIrank == 0 && !(step % statOutStep)) {
509  printf(" Cells movement...");
510  fflush(stdout);
511  }
512 #endif
513  if ((statistics.mindist >= 0.95 * 2.0 * pow(2.0, -(1.0 / 3.0)) * csize
514  && simStart == 0) || (nc == 1 && simStart == 0)) {
515  simStart = 1;
516  if (MPIrank == 0)
517  printf("\nSimulation started.\n");
518  }
519 
520  /* move cells */
521  for (c = 0; c < lnc; c++) {
522  cells[c].x += velocity[c].x;
523  cells[c].y += velocity[c].y;
524  cells[c].z += velocity[c].z;
525  // Mark cells that are out of the box and need to be removed
526  //if(outside_the_box(c)) { celld[c]=1; rsum++; }
527  }
528 #ifdef DEBUG
529  if (MPIrank == 0 && !(step % statOutStep))
530  printf("done\n");
531 #endif
532 }
533 
538 {
539 
540  int c;
541  double eps, epsCancer;
542  int lncAtThisStep;
543 
544  eps = densityCriticalLevel1;
545  epsCancer = densityCriticalLevel2;
546 
547  lncAtThisStep = lnc;
548 
549  for (c = 0; c < lncAtThisStep; c++) {
550 
551  if (outsideTheBox(c)) {
552  celld[c] = 1;
553  rsum++;
554  continue;
555  }
556 
557  if (celld[c])
558  continue;
559 
560  if (simStart) {
561 
562  if (cells[c].phase != 0
563  && ((cells[c].tumor == 0 && cells[c].density <= eps)
564  || (cells[c].tumor == 1 && cells[c].density <= epsCancer)))
565  cells[c].phasetime += gfDt / 3600.0;
566 
567  switch (cells[c].phase) {
568 
569  case 0: /* G0 phase */
570  if (gfields && oxygen
572  cells[c].phase = 5;
573  cells[c].phasetime = 0;
574  lg0nc--;
575  lnnc++;
576  break;
577  }
578  /* transition to G1 phase */
579  if ((cells[c].tumor == 0 && cells[c].density <= eps) || /* enough space for healthy cell */
580  (cells[c].tumor == 1 && cells[c].density <= epsCancer) || /* enough space for tumor cell */
581  nc == 1 || /* only single cell in the simulation */
582  (gfields && oxygen && cellFields[OXYG][c] >= fieldCriticalLevel1[OXYG])) { /* sufficient level of oxygen */
583  cells[c].phase = 1;
584  lg0nc--;
585  lg1nc++;
586  break;
587  }
588  break;
589  case 1: /* G1 phase */
590  /* transition to G0 or Necrotic phase */
591  if ((cells[c].tumor == 0 && cells[c].density > eps) || /* too crowdy for healthy cell */
592  (cells[c].tumor == 1 && cells[c].density > epsCancer) || /* too crowdy for tumor cell */
593  (gfields && oxygen && cellFields[OXYG][c] < fieldCriticalLevel1[OXYG])) { /* too low oxygen level */
594  if (gfields && oxygen && cellFields[OXYG][c] < fieldCriticalLevel2[OXYG]) { /* transition to Necrotic phase */
595  cells[c].phase = 5;
596  cells[c].phasetime = 0;
597  lg1nc--;
598  lnnc++;
599  } else { /* transition to G0 phase */
600  cells[c].phase = 0;
601  lg1nc--;
602  lg0nc++;
603  }
604  break;
605  }
606  /* cells grow in phase G1 */
607  if (cells[c].size < csize) {
608  cells[c].size +=
609  (csize -
610  pow(2.0,
611  -(1.0 / 3.0)) * csize) * (gfDt) / (3600.0 *
612  cells[c].g1);
613  }
614  if (cells[c].size > csize)
615  cells[c].size = csize;
616  if (cells[c].phasetime >= cells[c].g1) {
617  int death;
618  cells[c].phase = 2;
619  cells[c].phasetime = 0;
620  lg1nc--;
621  lsnc++;
622  if (cells[c].tumor == 0) {
623  death = (sprng(stream) < rd ? 1 : 0);
624  if (death) {
625  celld[c] = 1;
626  rsum++;
627  }
628  }
629  }
630  break;
631  case 2: /* S phase */
632  if (gfields && oxygen
633  && cellFields[OXYG][c] < fieldCriticalLevel2[OXYG]) {
634  cells[c].phase = 5;
635  cells[c].phasetime = 0;
636  lsnc--;
637  lnnc++;
638  break;
639  }
640  if (cells[c].phasetime >= cells[c].s) {
641  cells[c].phase = 3;
642  cells[c].phasetime = 0;
643  lsnc--;
644  lg2nc++;
645  break;
646  }
647  break;
648  case 3: /* G2 phase */
649  if (gfields && oxygen
650  && cellFields[OXYG][c] < fieldCriticalLevel2[OXYG]) {
651  cells[c].phase = 5;
652  cells[c].phasetime = 0;
653  lg2nc--;
654  lnnc++;
655  break;
656  }
657  if (cells[c].phasetime >= cells[c].g2) {
658  int death;
659  cells[c].phase = 4;
660  cells[c].phasetime = 0;
661  lg2nc--;
662  lmnc++;
663  if (cells[c].tumor == 0) {
664  death = (sprng(stream) < rd ? 1 : 0);
665  if (death) {
666  celld[c] = 1;
667  rsum++;
668  }
669  }
670  break;
671  }
672  break;
673  case 4: /* M phase */
674  if (gfields && oxygen
675  && cellFields[OXYG][c] < fieldCriticalLevel2[OXYG]) {
676  cells[c].phase = 5;
677  cells[c].phasetime = 0;
678  lmnc--;
679  lnnc++;
680 
681  } else if (cells[c].phasetime >= cells[c].m) {
682  mitosis(c);
683  cells[c].phase = 1;
684  cells[c].phasetime = 0;
685  lmnc--;
686  lg1nc++;
687  }
688  break;
689  } // switch
690  } // if
691  } // for loop
692 
693  /* update global number of cells */
694  MPI_Allreduce(&lnc, &nc, 1, MPI_INT64_T, MPI_SUM, MPI_COMM_WORLD);
695 
696 }
697 
705 {
706  int c;
707  for (c = 0; c < lnc; c++) {
708  if (cells[c].tumor == 1)
709  cells[c].scalarField = 8.0;
710  else
711  cells[c].scalarField = cells[c].density;
712  }
713 }
714 
719 {
720  int lnc_old;
721  /* number of local cells might change during the update */
722  lnc_old = lnc;
723  celld = (unsigned char *) calloc(lnc_old, sizeof(unsigned char));
724  rsum = 0;
725 
727  if (nhs > 0 && nc > nhs && tgs == 1 && cancer == 0)
729  if (nhs > 0 && nc > nhs)
730  cellsDeath(lnc_old);
733  free(celld);
734 }
double density
Definition: global.h:75
int statOutStep
Definition: global.h:214
double z
Definition: global.h:225
int64_t * tlnc
Definition: global.h:111
int MPIrank
Definition: global.h:134
#define lnc
Definition: global.h:102
float s
Definition: global.h:186
HYPRE_SStructVector x
Definition: tempf.c:41
float g1
Definition: global.h:185
#define NFIELDS
Definition: fields.h:27
float g2
Definition: global.h:65
float m
Definition: global.h:66
int64_t localID
Definition: global.h:240
float young
Definition: global.h:67
int simStart
Definition: global.h:172
int tgs
Definition: global.h:220
double scalarField
Definition: global.h:76
int mitrand
Definition: global.h:161
int64_t nhs
Definition: global.h:218
#define lnnc
Definition: global.h:109
void updateCellCounters()
Definition: cells.c:493
unsigned char tumor
Definition: global.h:77
int MPIsize
Definition: global.h:135
contains various Timothy inline functions
#define numberOfCounts
Definition: global.h:88
float cm
Definition: global.h:195
double h4
Definition: global.h:203
double mindist
Definition: global.h:259
void mitosis(int c)
Definition: cells.c:266
int cancer
Definition: global.h:205
float phasetime
Definition: global.h:62
double size
Definition: global.h:72
double h3
Definition: global.h:202
ZOLTAN_ID_TYPE gid
Definition: global.h:68
contains the most important global variables, arrays and defines
struct doubleVector3d * velocity
Definition: global.h:84
void updateCellPositions()
Definition: cells.c:504
int death
Definition: global.h:60
float m
Definition: global.h:188
#define lcnc
Definition: global.h:108
int sdim
Definition: global.h:160
int cellsRandomInit()
Definition: cells.c:132
int step
Definition: global.h:173
int64_t totalCellCount[numberOfCounts]
Definition: global.h:91
double y
Definition: global.h:224
int64_t maxCells
Definition: global.h:87
struct statisticsData statistics
Definition: global.h:268
double x
Definition: global.h:69
double x
Definition: global.h:223
#define lg0nc
Definition: global.h:103
#define g1nc
Definition: global.h:95
char rng[3]
Definition: global.h:168
int maxCellsPerProc
Definition: global.h:132
double csize
Definition: global.h:197
#define lsnc
Definition: global.h:105
double fieldCriticalLevel2[NFIELDS]
Definition: fields.h:70
int phase
Definition: global.h:58
void cellsCleanup()
Definition: cells.c:434
#define snc
Definition: global.h:96
int updateCellCycles()
Definition: cells.c:537
struct cellData * cells
Definition: global.h:82
double fieldCriticalLevel1[NFIELDS]
Definition: fields.h:69
void cellsCycleInit()
Definition: cells.c:107
float g2
Definition: global.h:187
double densityCriticalLevel1
Definition: global.h:208
float v
Definition: global.h:189
float gfDt
Definition: global.h:249
#define OXYG
Definition: fields.h:83
unsigned char * celld
Definition: cells.c:38
int nz
Definition: global.h:164
int * stream
Definition: global.h:275
double z
Definition: global.h:71
int age
Definition: global.h:59
float simTime
Definition: global.h:175
#define g0nc
Definition: global.h:94
#define lg1nc
Definition: global.h:104
double h2
Definition: global.h:201
void markMiddleCancerCell()
Definition: cells.c:374
float g1
Definition: global.h:63
double y
Definition: global.h:70
double densityCriticalLevel2
Definition: global.h:209
#define cnc
Definition: global.h:99
float rd
Definition: global.h:190
int64_t localCellCount[numberOfCounts]
Definition: global.h:90
double h
Definition: global.h:73
contains variables and arrays for global fields
#define nc
Definition: global.h:93
float cs
Definition: global.h:193
void cellsAllocate()
Definition: cells.c:66
double ** cellFields
Definition: global.h:83
void updateCellStates()
Definition: cells.c:718
float cg1
Definition: global.h:192
#define g2nc
Definition: global.h:97
int oxygen
Definition: fields.h:34
int ny
Definition: global.h:163
#define mnc
Definition: global.h:98
void additionalScalarField()
Definition: cells.c:704
int halo
Definition: global.h:61
#define lg2nc
Definition: global.h:106
int nx
Definition: global.h:162
void stopRun(int ierr, char *name, char *file, int line)
Definition: utils.c:72
void cellsDeath(int lnc_old)
Definition: cells.c:448
double v
Definition: global.h:74
int64_t rsum
Definition: global.h:206
#define lmnc
Definition: global.h:107
float cg2
Definition: global.h:194
float s
Definition: global.h:64
double h
Definition: global.h:200
int gfields
Definition: fields.h:33