VPTissue Reference Manual
cell_housekeep/Meinhardt.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2016 Universiteit Antwerpen
3  *
4  * Licensed under the EUPL, Version 1.1 or as soon they will be approved by
5  * the European Commission - subsequent versions of the EUPL (the "Licence");
6  * You may not use this work except in compliance with the Licence.
7  * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl5
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the Licence is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the Licence for the specific language governing
13  * permissions and limitations under the Licence.
14  */
20 #include "Meinhardt.h"
21 
22 #include "bio/Cell.h"
23 #include "bio/Mesh.h"
24 
25 #include <cmath>
26 
27 namespace SimPT_Default {
28 namespace CellHousekeep {
29 
30 using namespace std;
31 using namespace boost::property_tree;
32 
34 {
35  Initialize(cd);
36 }
37 
39 {
40  m_cd = cd;
41  auto& p = m_cd.m_parameters;
42 
43  m_cell_base_area = p->get<double>("cell_mechanics.base_area");
44  m_cell_expansion_rate = p->get<double>("cell_mechanics.cell_expansion_rate");
45  m_constituous_expansion_limit = p->get<unsigned int>("meinhardt.constituous_expansion_limit");
46  m_division_ratio = p->get<double>("cell_mechanics.division_ratio");
47  m_elastic_modulus = p->get<double>("cell_mechanics.elastic_modulus");
48  m_response_time = p->get<double>("cell_mechanics.response_time");
49  m_time_step = p->get<double>("model.time_step");
50  m_vessel_expansion_rate = p->get<double>("meinhardt.vessel_expansion_rate");
51  m_vessel_inh_level = p->get<double>("meinhardt.vessel_inh_level");
52  m_viscosity_const = p->get<double>("cell_mechanics.viscosity_const");
53 
54  m_area_incr = m_cell_expansion_rate * m_time_step;
55  m_div_area = m_division_ratio * m_cell_base_area;
56 }
57 
59 {
60  const string ham_select = m_cd.m_parameters->get<string>("model.mc_hamiltonian");
61 
62  const double chem_0 = cell->GetChemical(0);
63  const double chem_3 = cell->GetChemical(3);
64  const double level = m_vessel_inh_level;
65  const unsigned int limit = m_constituous_expansion_limit;
66  const double t_area = cell->GetTargetArea();
67  const double t_length = cell->GetTargetLength();
68  const unsigned int cell_count = m_cd.m_mesh->GetCells().size();
69 
70  // Cell expansion is inhibited by substrate (chem 3).
71  double update_t_area = 0.0;
72  if (!limit || cell_count < limit) {
73  update_t_area = t_area + m_area_incr;
74  } else {
75  if (chem_0 < 0.5) {
76  const double incr = max((1.0 - level * chem_3) * m_area_incr, 0.0);
77  update_t_area = t_area + incr;
78  } else {
79  update_t_area = t_area + m_vessel_expansion_rate;
80  }
81  }
82  const double update_t_length = t_length * sqrt(update_t_area / t_area);
83 
84  cell->SetTargetArea(update_t_area);
85  cell->SetTargetLength(update_t_length);
86 
87  if (ham_select == "ElasticWall") {
88  // Update the rest length of wall
89  // TODO: 1.50 (maximal extension) and 1.25 (irreversible extension) are hidden parameters
90  for (list<Wall*>::iterator i = cell->GetWalls().begin(); i != cell->GetWalls().end(); ++i) {
91  Wall* w = *i;
92  if (w->GetLength() > 1.50 * w->GetRestLength()) {
93  // Irreversible extension
94  w->SetRestLength(w->GetLength() / 1.25);
95  }
96  }
97  }
98 
99  if (ham_select == "Maxwell") {
100  // Update the solute of cell and the rest length of wall
101  const double solute = m_viscosity_const * sqrt(cell->GetArea());
102  const double update_solute = solute - (solute - cell->GetSolute()) * exp(-0.1 * m_time_step/m_response_time);
103  cell->SetSolute(update_solute);
104 
105  for (list<Wall*>::iterator i = cell->GetWalls().begin(); i != cell->GetWalls().end(); ++i) {
106  Wall* w = *i;
107 
108  const double update_rest_length = w->GetLength()
109  - (w->GetLength() - w->GetRestLength())
110  * exp(-0.01 * m_elastic_modulus * m_time_step / m_viscosity_const);
111  w->SetRestLength(update_rest_length);
112  }
113  }
114 }
115 
116 } // namespace
117 } // namespace
Core data with mesh, parameters, random engine and time data.
Definition: CoreData.h:38
STL namespace.
A cell contains walls and nodes.
Definition: Cell.h:48
const std::list< Wall * > & GetWalls() const
Access the cell's walls.
Definition: Cell.h:88
Meinhardt(const CoreData &cd)
Initializing constructor.
Namespace for components of the Default model group.
Interface for Cell.
void Initialize(const CoreData &cd)
Initialize or re-initialize.
double GetLength() const
Returns (and calculates, if length marked as dirty) the length along all nodes.
Definition: Wall.cpp:97
CellHousekeep for Meinhardt model.
double GetArea() const
Return the area of the cell.
Definition: Cell.cpp:178
A cell wall, runs between cell corner points and consists of wall elements.
Definition: Wall.h:48
Interface for Mesh.