46 mUseEdgeBasedSpringConstant(false),
47 mUseMutantSprings(false),
50 mUseBCatSprings(false),
51 mUseApoptoticSprings(false),
52 mBetaCatSpringScaler(18.14/6.0),
53 mApoptoticSpringTensionStiffness(15.0*0.25),
54 mApoptoticSpringCompressionStiffness(15.0*0.75)
92 unsigned nodeAGlobalIndex,
93 unsigned nodeBGlobalIndex,
95 bool isCloserThanRestLength)
101 isCloserThanRestLength);
111 if (mUseEdgeBasedSpringConstant)
114 assert(!mUseBCatSprings);
116 multiplication_factor = (
static_cast<MeshBasedCellPopulation<DIM>*
>(&rCellPopulation))->GetVoronoiEdgeLength(nodeAGlobalIndex, nodeBGlobalIndex)*sqrt(3.0);
119 if (mUseMutantSprings)
121 unsigned number_of_mutants = 0;
135 switch (number_of_mutants)
139 multiplication_factor *= mNormalMutantMultiplier;
144 multiplication_factor *= mMutantMutantMultiplier;
163 assert(!mUseEdgeBasedSpringConstant);
171 double edge_length_between_1_and_2 = p_static_cast_cell_population->
GetVoronoiEdgeLength(nodeAGlobalIndex, nodeBGlobalIndex);
173 double beta_cat_on_cell_1_edge = beta_cat_cell_1 * edge_length_between_1_and_2 / perim_cell_1;
174 double beta_cat_on_cell_2_edge = beta_cat_cell_2 * edge_length_between_1_and_2 / perim_cell_2;
176 double min_beta_Cat_of_two_cells = std::min(beta_cat_on_cell_1_edge, beta_cat_on_cell_2_edge);
178 multiplication_factor *= min_beta_Cat_of_two_cells / mBetaCatSpringScaler;
181 if (mUseApoptoticSprings)
186 if (cell_A_is_apoptotic || cell_B_is_apoptotic)
188 double spring_a_stiffness = 2.0 * this->GetSpringStiffness();
189 double spring_b_stiffness = 2.0 * this->GetSpringStiffness();
191 if (cell_A_is_apoptotic)
193 if (!isCloserThanRestLength)
195 spring_a_stiffness = mApoptoticSpringTensionStiffness;
199 spring_a_stiffness = mApoptoticSpringCompressionStiffness;
202 if (cell_B_is_apoptotic)
204 if (!isCloserThanRestLength)
206 spring_b_stiffness = mApoptoticSpringTensionStiffness;
210 spring_b_stiffness = mApoptoticSpringCompressionStiffness;
214 multiplication_factor /= (1.0/spring_a_stiffness + 1.0/spring_b_stiffness)*this->GetSpringStiffness();
218 return multiplication_factor;
227 EXCEPTION(
"LinearSpringWithVariableSpringConstantsForce is to be used with a subclass of MeshBasedCellPopulation only");
233 spring_iterator != p_static_cast_cell_population->
SpringsEnd();
236 unsigned nodeA_global_index = spring_iterator.GetNodeA()->GetIndex();
237 unsigned nodeB_global_index = spring_iterator.GetNodeB()->GetIndex();
239 c_vector<double, DIM> force = this->CalculateForceBetweenNodes(nodeA_global_index, nodeB_global_index, rCellPopulation);
240 c_vector<double, DIM> negative_force = -1.0*force;
242 spring_iterator.GetNodeB()->AddAppliedForceContribution(negative_force);
243 spring_iterator.GetNodeA()->AddAppliedForceContribution(force);
289 *rParamsFile <<
"\t\t\t<UseEdgeBasedSpringConstant>" << mUseEdgeBasedSpringConstant <<
"</UseEdgeBasedSpringConstant>\n";
290 *rParamsFile <<
"\t\t\t<UseMutantSprings>" << mUseMutantSprings <<
"</UseMutantSprings>\n";
291 *rParamsFile <<
"\t\t\t<MutantMutantMultiplier>" << mMutantMutantMultiplier <<
"</MutantMutantMultiplier>\n";
292 *rParamsFile <<
"\t\t\t<NormalMutantMultiplier>" << mNormalMutantMultiplier <<
"</NormalMutantMultiplier>\n";
293 *rParamsFile <<
"\t\t\t<UseBCatSprings>" << mUseBCatSprings <<
"</UseBCatSprings>\n";
294 *rParamsFile <<
"\t\t\t<UseApoptoticSprings>" << mUseApoptoticSprings <<
"</UseApoptoticSprings>\n";
295 *rParamsFile <<
"\t\t\t<BetaCatSpringScaler>" << mBetaCatSpringScaler <<
"</BetaCatSpringScaler>\n";
296 *rParamsFile <<
"\t\t\t<ApoptoticSpringTensionStiffness>" << mApoptoticSpringTensionStiffness <<
"</ApoptoticSpringTensionStiffness>\n";
297 *rParamsFile <<
"\t\t\t<ApoptoticSpringCompressionStiffness>" << mApoptoticSpringCompressionStiffness <<
"</ApoptoticSpringCompressionStiffness>\n";
virtual double VariableSpringConstantMultiplicationFactor(unsigned nodeAGlobalIndex, unsigned nodeBGlobalIndex, AbstractCellPopulation< ELEMENT_DIM, SPACE_DIM > &rCellPopulation, bool isCloserThanRestLength)