61 EXCEPTION(
"FarhadifarForce is to be used with a VertexBasedCellPopulation only");
66 unsigned num_nodes = p_cell_population->
GetNumNodes();
74 bool using_target_area_modifier = p_cell_population->
Begin()->GetCellData()->HasItem(
"target area");
77 std::vector<double> element_areas(num_elements);
78 std::vector<double> element_perimeters(num_elements);
79 std::vector<double> target_areas(num_elements);
84 unsigned elem_index = elem_iter->GetIndex();
88 if (using_target_area_modifier)
90 target_areas[elem_index] = p_cell_population->
GetCellUsingLocationIndex(elem_index)->GetCellData()->GetItem(
"target area");
94 target_areas[elem_index] = mTargetAreaParameter;
99 for (
unsigned node_index=0; node_index<num_nodes; node_index++)
115 c_vector<double, DIM> area_elasticity_contribution = zero_vector<double>(DIM);
116 c_vector<double, DIM> perimeter_contractility_contribution = zero_vector<double>(DIM);
117 c_vector<double, DIM> line_tension_contribution = zero_vector<double>(DIM);
123 for (std::set<unsigned>::iterator iter = containing_elem_indices.begin();
124 iter != containing_elem_indices.end();
129 unsigned elem_index = p_element->
GetIndex();
130 unsigned num_nodes_elem = p_element->
GetNumNodes();
137 area_elasticity_contribution -= GetAreaElasticityParameter()*(element_areas[elem_index] -
138 target_areas[elem_index])*element_area_gradient;
141 unsigned previous_node_local_index = (num_nodes_elem+local_index-1)%num_nodes_elem;
144 unsigned next_node_local_index = (local_index+1)%num_nodes_elem;
149 double previous_edge_line_tension_parameter = GetLineTensionParameter(p_previous_node, p_this_node, *p_cell_population);
150 double next_edge_line_tension_parameter = GetLineTensionParameter(p_this_node, p_next_node, *p_cell_population);
157 line_tension_contribution -= previous_edge_line_tension_parameter*previous_edge_gradient +
158 next_edge_line_tension_parameter*next_edge_gradient;
161 c_vector<double, DIM> element_perimeter_gradient;
162 element_perimeter_gradient = previous_edge_gradient + next_edge_gradient;
163 perimeter_contractility_contribution -= GetPerimeterContractilityParameter()* element_perimeters[elem_index]*
164 element_perimeter_gradient;
167 c_vector<double, DIM> force_on_node = area_elasticity_contribution + perimeter_contractility_contribution + line_tension_contribution;
180 std::set<unsigned> shared_elements;
181 std::set_intersection(elements_containing_nodeA.begin(),
182 elements_containing_nodeA.end(),
183 elements_containing_nodeB.begin(),
184 elements_containing_nodeB.end(),
185 std::inserter(shared_elements, shared_elements.begin()));
188 assert(!shared_elements.empty());
192 double line_tension_parameter_in_calculation = GetLineTensionParameter()/2.0;
195 if (shared_elements.size() == 1)
197 line_tension_parameter_in_calculation = GetBoundaryLineTensionParameter();
200 return line_tension_parameter_in_calculation;