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_VTKMOLECULEPLOTTER_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_VTKMOLECULEPLOTTER_H_ 7 : 8 : #include "coupling/interface/MDSolverInterface.h" 9 : #include "coupling/interface/Molecule.h" 10 : #include <iostream> 11 : #include <sstream> 12 : 13 : namespace coupling { 14 : namespace cellmappings { 15 : template <class LinkedCell, unsigned int dim> class VTKMoleculePlotter; 16 : } 17 : } // namespace coupling 18 : 19 : /** 20 : * @brief This class writes molecule data to streams for .vtk file. 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::VTKMoleculePlotter { 26 : public: 27 : /** Constructor 28 : * @param moleculeVelocities 29 : * @param moleculePositions 30 : * @param moleculePotentials 31 : * @param appendFloatZeros 32 : * @param mdSolverInterface 33 : */ 34 0 : VTKMoleculePlotter(std::stringstream& moleculeVelocities, std::stringstream& moleculePositions, std::stringstream& moleculePotentials, 35 : const std::string& appendFloatZeros, coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) 36 0 : : _mdSolverInterface(mdSolverInterface), _moleculeVelocities(moleculeVelocities), _moleculePositions(moleculePositions), 37 0 : _moleculePotentials(moleculePotentials), _appendFloatZeros(appendFloatZeros), _particleCounter(0) {} 38 : 39 : /** Destructor */ 40 0 : ~VTKMoleculePlotter() {} 41 : 42 : /** sets the particle counter to zero, before the iteration process begins. 43 : */ 44 0 : void beginCellIteration() { _particleCounter = 0; } 45 : 46 : /** empty function 47 : */ 48 : void endCellIteration() {} 49 : 50 : /** writes molecule data to the corresponding stringstreams. 51 : * @param cell 52 : */ 53 0 : void handleCell(LinkedCell& cell) { 54 0 : coupling::interface::MoleculeIterator<LinkedCell, dim>* it = _mdSolverInterface->getMoleculeIterator(cell); 55 0 : it->begin(); 56 0 : while (it->continueIteration()) { 57 0 : const coupling::interface::Molecule<dim>& wrapper(it->getConst()); 58 0 : const tarch::la::Vector<dim, double> position = wrapper.getPosition(); 59 0 : const tarch::la::Vector<dim, double> velocity = wrapper.getVelocity(); 60 : // std::cout << "Touch molecule " << position << std::endl; 61 0 : for (unsigned int d = 0; d < dim; d++) { 62 0 : _moleculePositions << position[d] << " "; 63 0 : _moleculeVelocities << velocity[d] << " "; 64 : } 65 0 : _moleculePositions << _appendFloatZeros << std::endl; 66 0 : _moleculeVelocities << _appendFloatZeros << std::endl; 67 0 : _moleculePotentials << wrapper.getPotentialEnergy() << std::endl; 68 : 69 0 : _particleCounter++; 70 0 : it->next(); 71 : } 72 0 : delete it; 73 0 : } 74 : 75 : /** returns number if the particles 76 : * @return _particleCounter 77 : */ 78 : const unsigned int& getParticleCounter() const { return _particleCounter; } 79 : 80 : private: 81 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface; 82 : std::stringstream& _moleculeVelocities; 83 : std::stringstream& _moleculePositions; 84 : std::stringstream& _moleculePotentials; 85 : const std::string& _appendFloatZeros; 86 : unsigned int _particleCounter; 87 : }; 88 : #endif // _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_VTKMOLECULEPLOTTER_H_