Line data Source code
1 : // Copyright (C) 2015 Technische Universitaet Muenchen 2 : // This file is part of the Mamico project. For conditions of distribution 3 : // and use, please see the copyright notice in Mamico's main folder, or at 4 : // www5.in.tum.de/mamico 5 : #ifndef _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_DELETEPARTICLEMAPPING_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_DELETEPARTICLEMAPPING_H_ 7 : 8 : #include "coupling/datastructures/Molecule.h" 9 : #include "coupling/interface/MDSolverInterface.h" 10 : #include "coupling/interface/Molecule.h" 11 : #include <iostream> 12 : 13 : namespace coupling { 14 : namespace cellmappings { 15 : template <class LinkedCell, unsigned int dim> class DeleteParticleMapping; 16 : } 17 : } // namespace coupling 18 : 19 : /** 20 : * @brief This class deletes a certain particle from a coupling cell. 21 : * @tparam LinkedCell cell type 22 : * @tparam dim Number of dimensions; it can be 1, 2 or 3 23 : * @author Philipp Neumann 24 : */ 25 : template <class LinkedCell, unsigned int dim> class coupling::cellmappings::DeleteParticleMapping { 26 : public: 27 : /** Constructor 28 : * @param particle 29 : * @param mdSolverInterface 30 : */ 31 0 : DeleteParticleMapping(const unsigned int& particle, coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) 32 0 : : _mdSolverInterface(mdSolverInterface), _particle(particle), _particleCounter(0), 33 0 : _deletedMoleculeCopy(tarch::la::Vector<dim, double>(0.0), tarch::la::Vector<dim, double>(0.0), tarch::la::Vector<dim, double>(0.0), 0.0) {} 34 : 35 : /** Destructor */ 36 0 : ~DeleteParticleMapping() {} 37 : 38 : /** sets the particle counter to zero, before the iteration process begins. 39 : */ 40 0 : void beginCellIteration() { _particleCounter = 0; } 41 : 42 : /** empty function 43 : */ 44 : void endCellIteration() {} 45 : 46 : /** This function saves a copy of particle that has to be deleted, then 47 : *deletes the molecule from MD simulation. It does nothiung, if the particle 48 : *is already deleted. 49 : * @param cell 50 : */ 51 0 : void handleCell(LinkedCell& cell) { 52 : // return, if we already deleted the respective particle 53 0 : if (_particleCounter > _particle) { 54 : return; 55 : } 56 : 57 : // otherwise: loop over particles 58 0 : coupling::interface::MoleculeIterator<LinkedCell, dim>* it = _mdSolverInterface->getMoleculeIterator(cell); 59 0 : it->begin(); 60 0 : while (it->continueIteration()) { 61 : // if we reached the respective particle, delete it 62 0 : if (_particleCounter == _particle) { 63 0 : const coupling::interface::Molecule<dim>& myMolecule(it->getConst()); 64 : 65 : // save copy of particle 66 0 : const tarch::la::Vector<dim, double> position = myMolecule.getPosition(); 67 0 : const tarch::la::Vector<dim, double> velocity = myMolecule.getVelocity(); 68 0 : const tarch::la::Vector<dim, double> force = myMolecule.getForce(); 69 0 : const double potentialEnergy = myMolecule.getPotentialEnergy(); 70 0 : _deletedMoleculeCopy = coupling::datastructures::Molecule<dim>(position, velocity, force, potentialEnergy); 71 : 72 : // delete molecule from MD simulation 73 0 : _mdSolverInterface->deleteMoleculeFromMDSimulation(myMolecule, cell); 74 0 : _particleCounter++; 75 : break; 76 : } 77 0 : _particleCounter++; 78 : 79 0 : it->next(); 80 : } 81 0 : delete it; 82 : } 83 : 84 : /** returns a copy of the deleted molecule. 85 : * @return _deletedMoleculeCopy 86 : */ 87 : coupling::datastructures::Molecule<dim> getDeletedMolecule() const { return _deletedMoleculeCopy; } 88 : 89 : private: 90 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface; 91 : const unsigned int _particle; 92 : unsigned int _particleCounter; 93 : coupling::datastructures::Molecule<dim> _deletedMoleculeCopy; 94 : }; 95 : #endif // _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_DELETEPARTICLEMAPPING_H_