BuskeElasticForce.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "BuskeElasticForce.hpp"
00037 #include "IsNan.hpp"
00038
00039 template<unsigned DIM>
00040 BuskeElasticForce<DIM>::BuskeElasticForce()
00041 : AbstractTwoBodyInteractionForce<DIM>(),
00042 mDeformationEnergyParameter(4.0/(3.0*5.0))
00043 {
00044 }
00045
00046 template<unsigned DIM>
00047 double BuskeElasticForce<DIM>::GetDeformationEnergyParameter()
00048 {
00049 return mDeformationEnergyParameter;
00050 }
00051
00052 template<unsigned DIM>
00053 void BuskeElasticForce<DIM>::SetDeformationEnergyParameter(double deformationEnergyParameter)
00054 {
00055 mDeformationEnergyParameter = deformationEnergyParameter;
00056 }
00057
00058 template<unsigned DIM>
00059 c_vector<double, DIM> BuskeElasticForce<DIM>::CalculateForceBetweenNodes(unsigned nodeAGlobalIndex,
00060 unsigned nodeBGlobalIndex,
00061 AbstractCellPopulation<DIM>& rCellPopulation)
00062 {
00063
00064 assert(dynamic_cast<NodeBasedCellPopulation<DIM>*>(&rCellPopulation) != NULL);
00065
00066
00067 assert(nodeAGlobalIndex != nodeBGlobalIndex);
00068
00069 Node<DIM>* p_node_a = rCellPopulation.GetNode(nodeAGlobalIndex);
00070 Node<DIM>* p_node_b = rCellPopulation.GetNode(nodeBGlobalIndex);
00071
00072
00073 c_vector<double, DIM> node_a_location = p_node_a->rGetLocation();
00074 c_vector<double, DIM> node_b_location = p_node_b->rGetLocation();
00075
00076
00077 c_vector<double, DIM> unit_vector = node_b_location - node_a_location;
00078
00079
00080 double distance_between_nodes = norm_2(unit_vector);
00081
00082
00083 if (this->mUseCutOffLength)
00084 {
00085 if (distance_between_nodes >= this->GetCutOffLength())
00086 {
00087 return zero_vector<double>(DIM);
00088 }
00089 }
00090
00091
00092 assert(distance_between_nodes > 0);
00093 assert(!std::isnan(distance_between_nodes));
00094
00095
00096 unit_vector /= distance_between_nodes;
00097
00098
00099 double radius_of_cell_one = p_node_a->GetRadius();
00100 double radius_of_cell_two = p_node_b->GetRadius();
00101
00102
00103 c_vector<double, DIM> force_between_nodes = GetMagnitudeOfForce(distance_between_nodes,radius_of_cell_one,radius_of_cell_two) * unit_vector;
00104
00105 return force_between_nodes;
00106 }
00107
00108 template<unsigned DIM>
00109 double BuskeElasticForce<DIM>::GetMagnitudeOfForce(double distanceBetweenNodes, double radiusOfCellOne, double radiusOfCellTwo)
00110 {
00111
00112 double dWDdd;
00113
00114 if (distanceBetweenNodes < radiusOfCellOne + radiusOfCellTwo)
00115 {
00116 dWDdd = -pow(radiusOfCellOne + radiusOfCellTwo - distanceBetweenNodes,1.5)
00117 *pow(radiusOfCellOne*radiusOfCellTwo/(radiusOfCellOne+radiusOfCellTwo),0.5)
00118 /mDeformationEnergyParameter;
00119 }
00120 else
00121 {
00122 dWDdd = 0.0;
00123 }
00124
00125 return dWDdd;
00126 }
00127
00128 template<unsigned DIM>
00129 void BuskeElasticForce<DIM>::OutputForceParameters(out_stream& rParamsFile)
00130 {
00131 *rParamsFile << "\t\t\t<DeformationEnergyParameter>" << mDeformationEnergyParameter << "</DeformationEnergyParameter>\n";
00132
00133
00134 AbstractTwoBodyInteractionForce<DIM>::OutputForceParameters(rParamsFile);
00135 }
00136
00138
00140
00141 template class BuskeElasticForce<1>;
00142 template class BuskeElasticForce<2>;
00143 template class BuskeElasticForce<3>;
00144
00145
00146 #include "SerializationExportWrapperForCpp.hpp"
00147 EXPORT_TEMPLATE_CLASS_SAME_DIMS(BuskeElasticForce)