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_COMPUTEMOMENTUMMAPPING_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_COMPUTEMOMENTUMMAPPING_H_ 7 : 8 : #include "coupling/interface/MDSolverInterface.h" 9 : #include "coupling/interface/Molecule.h" 10 : #include <iostream> 11 : 12 : namespace coupling { 13 : namespace cellmappings { 14 : template <class LinkedCell, unsigned int dim> class ComputeMomentumMapping; 15 : } 16 : } // namespace coupling 17 : 18 : /** 19 : * @brief This class computes the momentum over certain linked cells. 20 : * @tparam LinkedCell cell type 21 : * @tparam dim Number of dimensions; it can be 1, 2 or 3 22 : * @author Philipp Neumann 23 : */ 24 : template <class LinkedCell, unsigned int dim> class coupling::cellmappings::ComputeMomentumMapping { 25 : public: 26 : /** Constructor 27 : * @param mdSolverInterface 28 : */ 29 8 : ComputeMomentumMapping(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) 30 16 : : _mdSolverInterface(mdSolverInterface), _momentum(0.0), _meanVelocity(0.0), _particleCounter(0) {} 31 : 32 : /** Destructor */ 33 0 : ~ComputeMomentumMapping() {} 34 : 35 : /** sets the mean velocity, momentum and the particle counter to zero, before 36 : * the iteration process begins. 37 : */ 38 0 : void beginCellIteration() { 39 0 : _momentum = tarch::la::Vector<dim, double>(0.0); 40 0 : _meanVelocity = tarch::la::Vector<dim, double>(0.0); 41 0 : _particleCounter = 0; 42 0 : } 43 : 44 : /** computes the mean velocity, momentum in a linked cell, 45 : * by dividing and multiplying the summation of the velocities computed in 46 : *handleCell(...) over the number if particle and in particle mass 47 : *respectively. 48 : */ 49 0 : void endCellIteration() { 50 0 : if (_particleCounter != 0) { 51 0 : _meanVelocity = (1.0 / ((double)_particleCounter)) * _momentum; 52 0 : _momentum = _mdSolverInterface->getMoleculeMass() * _momentum; 53 : } 54 0 : } 55 : 56 : /** counts the molecules inside a linked cell and sums up the of the velocity 57 : *of all particles inside the cell and saves it as momentum. 58 : * @param cell 59 : */ 60 0 : void handleCell(LinkedCell& cell) { 61 0 : coupling::interface::MoleculeIterator<LinkedCell, dim>* it = _mdSolverInterface->getMoleculeIterator(cell); 62 0 : it->begin(); 63 0 : while (it->continueIteration()) { 64 0 : const coupling::interface::Molecule<dim>& wrapper(it->getConst()); 65 0 : _momentum += wrapper.getVelocity(); 66 0 : _particleCounter++; 67 : 68 0 : it->next(); 69 : } 70 0 : delete it; 71 0 : } 72 : 73 : /** returns the momentum inside a linked cell 74 : * @return _momentum 75 : */ 76 0 : tarch::la::Vector<dim, double> getMomentum() const { return _momentum; } 77 : 78 : /** returns the mean velocity inside a linked cell 79 : * @return _meanVelocity 80 : */ 81 0 : tarch::la::Vector<dim, double> getMeanVelocity() const { return _meanVelocity; } 82 : 83 : private: 84 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface; 85 : tarch::la::Vector<dim, double> _momentum; 86 : tarch::la::Vector<dim, double> _meanVelocity; 87 : unsigned int _particleCounter; 88 : }; 89 : #endif // _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_COMPUTEMOMENTUMMAPPING_H_