BuskeAdhesiveForce.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 "BuskeAdhesiveForce.hpp"
00037 #include "IsNan.hpp"
00038
00039 template<unsigned DIM>
00040 BuskeAdhesiveForce<DIM>::BuskeAdhesiveForce()
00041 : AbstractTwoBodyInteractionForce<DIM>(),
00042 mAdhesionEnergyParameter(0.2)
00043 {
00044 }
00045
00046 template<unsigned DIM>
00047 double BuskeAdhesiveForce<DIM>::GetAdhesionEnergyParameter()
00048 {
00049 return mAdhesionEnergyParameter;
00050 }
00051
00052 template<unsigned DIM>
00053 void BuskeAdhesiveForce<DIM>::SetAdhesionEnergyParameter(double adhesionEnergyParameter)
00054 {
00055 mAdhesionEnergyParameter = adhesionEnergyParameter;
00056 }
00057
00058 template<unsigned DIM>
00059 c_vector<double, DIM> BuskeAdhesiveForce<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 double radius_of_cell_one = p_node_a->GetRadius();
00099 double radius_of_cell_two = p_node_b->GetRadius();
00100
00101
00102 c_vector<double, DIM> force_between_nodes = GetMagnitudeOfForce(distance_between_nodes,radius_of_cell_one,radius_of_cell_two) * unit_vector;
00103
00104 return force_between_nodes;
00105 }
00106
00107 template<unsigned DIM>
00108 double BuskeAdhesiveForce<DIM>::GetMagnitudeOfForce(double distanceBetweenNodes, double radiusOfCellOne, double radiusOfCellTwo)
00109 {
00110 double dWAdd = 0.0;
00111
00112
00113 if (distanceBetweenNodes < radiusOfCellOne + radiusOfCellTwo)
00114 {
00115
00116 double xij = 0.5*(radiusOfCellOne*radiusOfCellOne - radiusOfCellTwo*radiusOfCellTwo + distanceBetweenNodes*distanceBetweenNodes)/distanceBetweenNodes;
00117 double dxijdd = 1.0 - xij/distanceBetweenNodes;
00118 dWAdd = 2.0*mAdhesionEnergyParameter*M_PI*xij*dxijdd;
00119 }
00120
00121 return dWAdd;
00122 }
00123
00124 template<unsigned DIM>
00125 void BuskeAdhesiveForce<DIM>::OutputForceParameters(out_stream& rParamsFile)
00126 {
00127 *rParamsFile << "\t\t\t<AdhesionEnergyParameter>" << mAdhesionEnergyParameter << "</AdhesionEnergyParameter>\n";
00128
00129
00130 AbstractTwoBodyInteractionForce<DIM>::OutputForceParameters(rParamsFile);
00131 }
00132
00134
00136
00137 template class BuskeAdhesiveForce<1>;
00138 template class BuskeAdhesiveForce<2>;
00139 template class BuskeAdhesiveForce<3>;
00140
00141
00142 #include "SerializationExportWrapperForCpp.hpp"
00143 EXPORT_TEMPLATE_CLASS_SAME_DIMS(BuskeAdhesiveForce)