void NodeBasedCellPopulationWithParticles<DIM>::UpdateParticlePositions(double dt) { // Initialise vector of forces on particles std::vector<c_vector<double, DIM> > drdt(this->GetNumNodes()); for (unsigned i=0; i<drdt.size(); i++) { drdt[i] = zero_vector<double>(DIM); } // Calculate forces on particles double damping_constant = this->GetDampingConstantNormal(); for (unsigned i=0; i<drdt.size(); i++) { drdt[i] = this->GetNode(i)->rGetAppliedForce()/damping_constant; } for (typename AbstractMesh<DIM,DIM>::NodeIterator node_iter = this->mrMesh.GetNodeIteratorBegin(); node_iter != this->mrMesh.GetNodeIteratorEnd(); ++node_iter) { if (node_iter->IsParticle()) { ChastePoint<DIM> new_point(node_iter->rGetLocation() + dt*drdt[node_iter->GetIndex()]); node_iter->SetPoint(new_point); } } }
void NodeBasedCellPopulationWithParticles<DIM>::Validate() { std::map<unsigned, bool> validated_nodes; for (typename AbstractMesh<DIM, DIM>::NodeIterator node_iter = this->mrMesh.GetNodeIteratorBegin(); node_iter != this->mrMesh.GetNodeIteratorEnd(); ++node_iter) { validated_nodes[node_iter->GetIndex()] = node_iter->IsParticle(); } // Look through all of the cells and record what node they are associated with. for (typename AbstractCellPopulation<DIM>::Iterator cell_iter=this->Begin(); cell_iter!=this->End(); ++cell_iter) { unsigned node_index = this->GetLocationIndexUsingCell((*cell_iter)); // If the node attached to this cell is labelled as a particle, then throw an error if (this->GetNode(node_index)->IsParticle()) { EXCEPTION("Node " << node_index << " is labelled as a particle and has a cell attached"); } validated_nodes[node_index] = true; } for (std::map<unsigned, bool>::iterator map_iter = validated_nodes.begin(); map_iter != validated_nodes.end(); map_iter++) { if (!map_iter->second) { EXCEPTION("Node " << map_iter->first << " does not appear to be a particle or has a cell associated with it"); } } }
std::set<unsigned> NodeBasedCellPopulationWithParticles<DIM>::GetParticleIndices() { std::set<unsigned> particle_indices; for (typename AbstractMesh<DIM,DIM>::NodeIterator node_iter = this->mrMesh.GetNodeIteratorBegin(); node_iter != this->mrMesh.GetNodeIteratorEnd(); ++node_iter) { if (node_iter->IsParticle()) { particle_indices.insert(node_iter->GetIndex()); } } return particle_indices; }