Timothy  0.9
Tissue Modelling Framework
 All Data Structures Files Functions Variables Typedefs Macros
cells.c File Reference

contains functions which control current states and evolution of cells More...

#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <math.h>
#include <inttypes.h>
#include <sprng.h>
#include "global.h"
#include "inline.h"
#include "fields.h"
Include dependency graph for cells.c:

Go to the source code of this file.

Functions

void cellsAllocate ()
 
void cellsCycleInit ()
 
int cellsRandomInit ()
 
void mitosis (int c)
 
void markMiddleCancerCell ()
 
void cellsCleanup ()
 
void cellsDeath (int lnc_old)
 
void updateCellCounters ()
 
void updateCellPositions ()
 
int updateCellCycles ()
 
void additionalScalarField ()
 
void updateCellStates ()
 

Variables

unsigned char * celld
 

Detailed Description

contains functions which control current states and evolution of cells

Definition in file cells.c.

Function Documentation

void additionalScalarField ( )

This function fills the scalarOutput field of each cell. It can be modified to output any float scalars that user would like to analyze or visualize after simulation. This field is printed to the output VTK files.

Definition at line 704 of file cells.c.

References cells, cellData::density, lnc, and cellData::scalarField.

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 }
double density
Definition: global.h:75
#define lnc
Definition: global.h:102
double scalarField
Definition: global.h:76
struct cellData * cells
Definition: global.h:82

Here is the caller graph for this function:

void cellsAllocate ( )

This function allocates tables responsible for carrying informations about cells, their current state and evolution.

Definition at line 66 of file cells.c.

References cellFields, cells, csize, localID, maxCells, maxCellsPerProc, MPIsize, NFIELDS, nx, sdim, stopRun(), tlnc, and velocity.

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 }
int64_t * tlnc
Definition: global.h:111
#define NFIELDS
Definition: fields.h:27
int64_t localID
Definition: global.h:240
int MPIsize
Definition: global.h:135
struct doubleVector3d * velocity
Definition: global.h:84
int sdim
Definition: global.h:160
int64_t maxCells
Definition: global.h:87
int maxCellsPerProc
Definition: global.h:132
double csize
Definition: global.h:197
struct cellData * cells
Definition: global.h:82
double ** cellFields
Definition: global.h:83
int nx
Definition: global.h:162
void stopRun(int ierr, char *name, char *file, int line)
Definition: utils.c:72

Here is the call graph for this function:

Here is the caller graph for this function:

void cellsCleanup ( )

This function dealocates all tables allocated during initialization of cell data

Definition at line 434 of file cells.c.

References cellFields, cells, NFIELDS, tlnc, and velocity.

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 }
int64_t * tlnc
Definition: global.h:111
#define NFIELDS
Definition: fields.h:27
struct doubleVector3d * velocity
Definition: global.h:84
struct cellData * cells
Definition: global.h:82
double ** cellFields
Definition: global.h:83

Here is the caller graph for this function:

void cellsCycleInit ( )

This function initializes counters of cells in various cell phases.

Definition at line 107 of file cells.c.

References cancer, cnc, g0nc, g1nc, g2nc, lcnc, lg0nc, lg1nc, lg2nc, lmnc, lnc, lnnc, lsnc, mnc, nc, and snc.

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 }
#define lnc
Definition: global.h:102
#define lnnc
Definition: global.h:109
int cancer
Definition: global.h:205
#define lcnc
Definition: global.h:108
#define lg0nc
Definition: global.h:103
#define g1nc
Definition: global.h:95
#define lsnc
Definition: global.h:105
#define snc
Definition: global.h:96
#define g0nc
Definition: global.h:94
#define lg1nc
Definition: global.h:104
#define cnc
Definition: global.h:99
#define nc
Definition: global.h:93
#define g2nc
Definition: global.h:97
#define mnc
Definition: global.h:98
#define lg2nc
Definition: global.h:106
#define lmnc
Definition: global.h:107

Here is the caller graph for this function:

void cellsDeath ( int  lnc_old)

This function removes a dead cell from the simulation.

Definition at line 448 of file cells.c.

References celld, cells, lcnc, lg0nc, lg1nc, lg2nc, lmnc, lnc, lsnc, and rsum.

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 }
#define lnc
Definition: global.h:102
unsigned char tumor
Definition: global.h:77
#define lcnc
Definition: global.h:108
#define lg0nc
Definition: global.h:103
#define lsnc
Definition: global.h:105
int phase
Definition: global.h:58
struct cellData * cells
Definition: global.h:82
unsigned char * celld
Definition: cells.c:38
#define lg1nc
Definition: global.h:104
#define lg2nc
Definition: global.h:106
int64_t rsum
Definition: global.h:206
#define lmnc
Definition: global.h:107

Here is the caller graph for this function:

int cellsRandomInit ( )

This function initializes cell data. Locations of cells in space are generated randomly.

Definition at line 132 of file cells.c.

References cellData::age, cells, csize, cellData::death, cellData::density, cellData::g1, g1, cellData::g2, g2, cellData::gid, cellData::h, h, h2, h3, h4, cellData::halo, lnc, localID, cellData::m, m, maxCells, maxCellsPerProc, MPIrank, nc, nx, cellData::phase, cellData::phasetime, rng, cellData::s, s, sdim, simTime, cellData::size, stream, cellData::tumor, cellData::v, v, cellData::x, cellData::y, cellData::young, and cellData::z.

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 }
double density
Definition: global.h:75
int MPIrank
Definition: global.h:134
#define lnc
Definition: global.h:102
float s
Definition: global.h:186
float g1
Definition: global.h:185
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
unsigned char tumor
Definition: global.h:77
double h4
Definition: global.h:203
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
int death
Definition: global.h:60
float m
Definition: global.h:188
int sdim
Definition: global.h:160
int64_t maxCells
Definition: global.h:87
double x
Definition: global.h:69
char rng[3]
Definition: global.h:168
int maxCellsPerProc
Definition: global.h:132
double csize
Definition: global.h:197
int phase
Definition: global.h:58
struct cellData * cells
Definition: global.h:82
float g2
Definition: global.h:187
float v
Definition: global.h:189
int * stream
Definition: global.h:275
double z
Definition: global.h:71
int age
Definition: global.h:59
float simTime
Definition: global.h:175
double h2
Definition: global.h:201
float g1
Definition: global.h:63
double y
Definition: global.h:70
double h
Definition: global.h:73
#define nc
Definition: global.h:93
int halo
Definition: global.h:61
int nx
Definition: global.h:162
double v
Definition: global.h:74
float s
Definition: global.h:64
double h
Definition: global.h:200

Here is the caller graph for this function:

void markMiddleCancerCell ( )

This function finds locates cell closest to the center of mass of the system and marks this cell as a cancer cell.

Definition at line 374 of file cells.c.

References cancer, cells, lcnc, lg0nc, lg1nc, lnc, MPIrank, nc, cellData::phase, cellData::tumor, x, cellData::x, cellData::y, and cellData::z.

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 }
int MPIrank
Definition: global.h:134
#define lnc
Definition: global.h:102
HYPRE_SStructVector x
Definition: tempf.c:41
unsigned char tumor
Definition: global.h:77
int cancer
Definition: global.h:205
#define lcnc
Definition: global.h:108
double x
Definition: global.h:69
#define lg0nc
Definition: global.h:103
int phase
Definition: global.h:58
struct cellData * cells
Definition: global.h:82
double z
Definition: global.h:71
#define lg1nc
Definition: global.h:104
double y
Definition: global.h:70
#define nc
Definition: global.h:93

Here is the caller graph for this function:

void mitosis ( int  c)

This function implements mitosis of cells.

Definition at line 266 of file cells.c.

References cellData::age, cells, cg1, cg2, cm, cs, cellData::death, cellData::density, cellData::g1, g1, cellData::g2, g2, cellData::gid, cellData::h, h, cellData::halo, lcnc, lg1nc, lnc, localID, cellData::m, m, maxCellsPerProc, mitrand, MPIrank, cellData::phase, cellData::phasetime, cellData::s, s, sdim, cellData::size, stopRun(), stream, cellData::tumor, cellData::v, v, velocity, x, cellData::x, doubleVector3d::x, cellData::y, doubleVector3d::y, cellData::young, cellData::z, and doubleVector3d::z.

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 }
double density
Definition: global.h:75
double z
Definition: global.h:225
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
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 mitrand
Definition: global.h:161
unsigned char tumor
Definition: global.h:77
float cm
Definition: global.h:195
float phasetime
Definition: global.h:62
double size
Definition: global.h:72
ZOLTAN_ID_TYPE gid
Definition: global.h:68
struct doubleVector3d * velocity
Definition: global.h:84
int death
Definition: global.h:60
float m
Definition: global.h:188
#define lcnc
Definition: global.h:108
int sdim
Definition: global.h:160
double y
Definition: global.h:224
double x
Definition: global.h:69
double x
Definition: global.h:223
int maxCellsPerProc
Definition: global.h:132
int phase
Definition: global.h:58
struct cellData * cells
Definition: global.h:82
float g2
Definition: global.h:187
float v
Definition: global.h:189
int * stream
Definition: global.h:275
double z
Definition: global.h:71
int age
Definition: global.h:59
#define lg1nc
Definition: global.h:104
float g1
Definition: global.h:63
double y
Definition: global.h:70
double h
Definition: global.h:73
float cs
Definition: global.h:193
float cg1
Definition: global.h:192
int halo
Definition: global.h:61
void stopRun(int ierr, char *name, char *file, int line)
Definition: utils.c:72
double v
Definition: global.h:74
float cg2
Definition: global.h:194
float s
Definition: global.h:64
double h
Definition: global.h:200

Here is the call graph for this function:

Here is the caller graph for this function:

void updateCellCounters ( )

This function updates cell counters.

Definition at line 493 of file cells.c.

References lnc, localCellCount, numberOfCounts, tlnc, and totalCellCount.

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 }
int64_t * tlnc
Definition: global.h:111
#define lnc
Definition: global.h:102
#define numberOfCounts
Definition: global.h:88
int64_t totalCellCount[numberOfCounts]
Definition: global.h:91
int64_t localCellCount[numberOfCounts]
Definition: global.h:90

Here is the caller graph for this function:

int updateCellCycles ( )

This function updates cells' cycle phases.

Definition at line 537 of file cells.c.

References celld, cellFields, cells, csize, densityCriticalLevel1, densityCriticalLevel2, fieldCriticalLevel1, fieldCriticalLevel2, cellData::g1, g1, g2, gfDt, gfields, lg0nc, lg1nc, lg2nc, lmnc, lnc, lnnc, lsnc, m, mitosis(), nc, OXYG, oxygen, cellData::phase, cellData::phasetime, rd, rsum, s, simStart, cellData::size, and stream.

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 }
#define lnc
Definition: global.h:102
float s
Definition: global.h:186
float g1
Definition: global.h:185
int simStart
Definition: global.h:172
#define lnnc
Definition: global.h:109
void mitosis(int c)
Definition: cells.c:266
float phasetime
Definition: global.h:62
double size
Definition: global.h:72
float m
Definition: global.h:188
#define lg0nc
Definition: global.h:103
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
struct cellData * cells
Definition: global.h:82
double fieldCriticalLevel1[NFIELDS]
Definition: fields.h:69
float g2
Definition: global.h:187
double densityCriticalLevel1
Definition: global.h:208
float gfDt
Definition: global.h:249
#define OXYG
Definition: fields.h:83
unsigned char * celld
Definition: cells.c:38
int * stream
Definition: global.h:275
#define lg1nc
Definition: global.h:104
float g1
Definition: global.h:63
double densityCriticalLevel2
Definition: global.h:209
float rd
Definition: global.h:190
#define nc
Definition: global.h:93
double ** cellFields
Definition: global.h:83
int oxygen
Definition: fields.h:34
#define lg2nc
Definition: global.h:106
int64_t rsum
Definition: global.h:206
#define lmnc
Definition: global.h:107
int gfields
Definition: fields.h:33

Here is the call graph for this function:

Here is the caller graph for this function:

void updateCellPositions ( )

This function updates cells' positions.

Definition at line 504 of file cells.c.

References cells, csize, lnc, statisticsData::mindist, MPIrank, nc, simStart, statistics, statOutStep, step, velocity, cellData::x, doubleVector3d::x, cellData::y, doubleVector3d::y, cellData::z, and doubleVector3d::z.

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 }
int statOutStep
Definition: global.h:214
double z
Definition: global.h:225
int MPIrank
Definition: global.h:134
#define lnc
Definition: global.h:102
int simStart
Definition: global.h:172
double mindist
Definition: global.h:259
struct doubleVector3d * velocity
Definition: global.h:84
int step
Definition: global.h:173
double y
Definition: global.h:224
struct statisticsData statistics
Definition: global.h:268
double x
Definition: global.h:69
double x
Definition: global.h:223
double csize
Definition: global.h:197
struct cellData * cells
Definition: global.h:82
double z
Definition: global.h:71
double y
Definition: global.h:70
#define nc
Definition: global.h:93

Here is the caller graph for this function:

void updateCellStates ( )

This function drives the whole cell cycle update.

Definition at line 718 of file cells.c.

References additionalScalarField(), cancer, celld, cellsDeath(), lnc, markMiddleCancerCell(), nc, nhs, rsum, tgs, updateCellCounters(), and updateCellCycles().

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 }
#define lnc
Definition: global.h:102
int tgs
Definition: global.h:220
int64_t nhs
Definition: global.h:218
void updateCellCounters()
Definition: cells.c:493
int cancer
Definition: global.h:205
int updateCellCycles()
Definition: cells.c:537
unsigned char * celld
Definition: cells.c:38
void markMiddleCancerCell()
Definition: cells.c:374
#define nc
Definition: global.h:93
void additionalScalarField()
Definition: cells.c:704
void cellsDeath(int lnc_old)
Definition: cells.c:448
int64_t rsum
Definition: global.h:206

Here is the call graph for this function:

Here is the caller graph for this function:

Variable Documentation

unsigned char* celld

Definition at line 38 of file cells.c.