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_SETMOMENTUMMAPPING_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_SETMOMENTUMMAPPING_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 SetMomentumMapping;
15 : }
16 : } // namespace coupling
17 :
18 : /**
19 : * @brief This class sets a certain momentum over several 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::SetMomentumMapping {
25 : public:
26 : /** obtains the old momentum over the region of interest. Besides,
27 : * obtains the new momentum that shall be set and the number of particles
28 : * contained in the coupling cell.
29 : * @param oldMomentum
30 : * @param newMomentum
31 : * @param numberParticles
32 : * @param mdSolverInterface
33 : */
34 0 : SetMomentumMapping(const tarch::la::Vector<dim, double>& oldMomentum, const tarch::la::Vector<dim, double>& newMomentum, const unsigned int& numberParticles,
35 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface)
36 0 : : _mdSolverInterface(mdSolverInterface), _oldVelocity(getVelocity(numberParticles, oldMomentum)),
37 0 : _newVelocity(getVelocity(numberParticles, newMomentum)) {}
38 :
39 : /** Destructor */
40 0 : ~SetMomentumMapping() {}
41 :
42 : /** empty function
43 : */
44 : void beginCellIteration() {}
45 :
46 : /** empty function
47 : */
48 : void endCellIteration() {}
49 :
50 : /** applies a certain momentum over several linked cells, by steering the
51 : *velocity.
52 : * @param cell
53 : */
54 0 : void handleCell(LinkedCell& cell) {
55 0 : coupling::interface::MoleculeIterator<LinkedCell, dim>* it = _mdSolverInterface->getMoleculeIterator(cell);
56 0 : it->begin();
57 0 : while (it->continueIteration()) {
58 0 : coupling::interface::Molecule<dim>& wrapper(it->get());
59 0 : tarch::la::Vector<dim, double> velocity = wrapper.getVelocity();
60 0 : velocity = velocity - _oldVelocity + _newVelocity;
61 0 : wrapper.setVelocity(velocity);
62 :
63 0 : it->next();
64 : }
65 0 : delete it;
66 0 : }
67 :
68 : private:
69 : /** returns mean velocity og the cell
70 : * @param numberParticles
71 : * @param momentum
72 : * @return mean velocity og the cell
73 : */
74 0 : tarch::la::Vector<dim, double> getVelocity(const unsigned int& numberParticles, const tarch::la::Vector<dim, double>& momentum) const {
75 0 : if (numberParticles != 0) {
76 0 : return (1.0 / (numberParticles * _mdSolverInterface->getMoleculeMass())) * momentum;
77 : } else {
78 0 : return tarch::la::Vector<dim, double>(0.0);
79 : }
80 : }
81 :
82 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface;
83 : tarch::la::Vector<dim, double> _oldVelocity;
84 : tarch::la::Vector<dim, double> _newVelocity;
85 : };
86 : #endif // _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_SETMOMENTUMMAPPING_H_
|