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_SETGIVENVELOCITY4MOMENTUMINSERTION_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_SETGIVENVELOCITY4MOMENTUMINSERTION_H_ 7 : 8 : #include "coupling/MomentumInsertion.h" 9 : #include "coupling/cell-mappings/ComputeMassMapping.h" 10 : #include "coupling/cell-mappings/ComputeMomentumMapping.h" 11 : #include "coupling/cell-mappings/SetMomentumMapping.h" 12 : #include "coupling/interface/MDSolverInterface.h" 13 : 14 : namespace coupling { 15 : template <class LinkedCell, unsigned int dim> class SetGivenVelocity4MomentumInsertion; 16 : } 17 : 18 : /** interpretes the microscopicMomentum-buffer as velocity and sets this value 19 : * in the respective coupling cell. 20 : * @author Philipp Neumann 21 : * @tparam LinkedCell the LinkedCell class is given by the implementation of 22 : * linked cells in the molecular dynamics simulation 23 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2, 24 : * or 3 */ 25 : template <class LinkedCell, unsigned int dim> class coupling::SetGivenVelocity4MomentumInsertion : public coupling::MomentumInsertion<LinkedCell, dim> { 26 : public: 27 : /** @brief a simple constructor 28 : * @param mdSolverInterface interface for the md solver */ 29 0 : SetGivenVelocity4MomentumInsertion(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) 30 0 : : coupling::MomentumInsertion<LinkedCell, dim>(mdSolverInterface) {} 31 : 32 : /** @brief a simple destructor */ 33 0 : virtual ~SetGivenVelocity4MomentumInsertion() {} 34 : 35 : /** @brief returns 1, since momentum insertions will be applied in every md 36 : * timestep 37 : * @returns the time step interval for momentum insertion */ 38 0 : unsigned int getTimeIntervalPerMomentumInsertion() const override { return 1; } 39 : 40 : /** This method does not conserve the kinetic energy of the respective 41 : * coupling cell. To conserve the energy as well, see the description of 42 : * MomentumController on details how to do that. 43 : * @brief updates the momentum based on the microscopic momentum 44 : * @param cell coupling cell 45 : */ 46 0 : void insertMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 idx) const override { 47 0 : coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> massMapping(coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface); 48 0 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> momentumMapping(coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface); 49 : 50 : // old and new momentum 51 0 : tarch::la::Vector<dim, double> oldMomentum(0.0); 52 0 : tarch::la::Vector<dim, double> newMomentum(0.0); 53 0 : unsigned int particleCounter = 0; 54 : 55 0 : cell.iterateConstCells(massMapping); 56 0 : cell.iterateConstCells(momentumMapping); 57 : // set old momentum 58 0 : oldMomentum = momentumMapping.getMomentum(); 59 : // set new momentum (only number of particles is missing) 60 0 : newMomentum = massMapping.getMass() * cell.getMicroscopicMomentum(); 61 0 : particleCounter = massMapping.getNumberOfParticles(); 62 : 63 : // set new momentum (based on velocity stored in microscopic 64 : // momentum-buffer) 65 0 : coupling::cellmappings::SetMomentumMapping<LinkedCell, dim> setMomentumMapping(oldMomentum, newMomentum, particleCounter, 66 0 : coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface); 67 0 : cell.iterateCells(setMomentumMapping); 68 0 : } 69 : }; 70 : #endif // _MOLECULARDYNAMICS_COUPLING_SETGIVENVELOCITY4MOMENTUMINSERTION_H_