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_MOMENTUMCONTROLLER_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_MOMENTUMCONTROLLER_H_
7 :
8 : #include "coupling/cell-mappings/ComputeMassMapping.h"
9 : #include "coupling/cell-mappings/ComputeMomentumMapping.h"
10 : #include "coupling/cell-mappings/SetMomentumMapping.h"
11 : #include "coupling/datastructures/CouplingCell.h"
12 : #include "tarch/la/Vector.h"
13 :
14 : namespace coupling {
15 : template <class LinkedCell, unsigned int dim> class MomentumController;
16 : }
17 :
18 : /** This class can compute the momentum and set a certain value for the
19 : * momentum.
20 : * @brief controls the momentum in a coupling cell.
21 : * @author Philipp Neumann
22 : * @tparam LinkedCell the LinkedCell class is given by the implementation of
23 : * linked cells in the molecular dynamics simulation
24 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2,
25 : * or 3 */
26 : template <class LinkedCell, unsigned int dim> class coupling::MomentumController {
27 : public:
28 : /** @brief a simple constructor
29 : * @param mdSolverInterface interface to the md solver */
30 4 : MomentumController(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface)
31 4 : : _computeMassMapping(mdSolverInterface), _computeMomentumMapping(mdSolverInterface), _mdSolverInterface(mdSolverInterface) {}
32 :
33 : /** a simple destructor */
34 0 : ~MomentumController() {}
35 :
36 : /** @brief computes and returns the momentum and mean velocity of a
37 : * coupling cell
38 : * @param cell the coupling cell, for which the values shall be calculated
39 : * @param momentum vector to which the momentum of the cell will be written
40 : * to
41 : * @param meanVelocity vector to which the mean velocity of the cell will be
42 : * written to*/
43 0 : void computeMomentumAndMeanVelocity(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, tarch::la::Vector<dim, double>& momentum,
44 : tarch::la::Vector<dim, double>& meanVelocity) {
45 0 : cell.iterateConstCells(_computeMomentumMapping);
46 0 : momentum = _computeMomentumMapping.getMomentum();
47 0 : meanVelocity = _computeMomentumMapping.getMeanVelocity();
48 0 : }
49 :
50 : /** @brief computes and returns the momentum of a coupling cell
51 : * @param cell the coupling cell, for which the values shall be calculated
52 : * @param momentum vector to which the momentum of the cell will be written
53 : * to */
54 0 : void computeMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, tarch::la::Vector<dim, double>& momentum) {
55 0 : cell.iterateConstCells(_computeMomentumMapping);
56 0 : momentum = _computeMomentumMapping.getMomentum();
57 0 : }
58 :
59 : /** computes and returns the mean velocity of a coupling cell
60 : * @param cell the coupling cell, for which the values shall be calculated
61 : * @param meanVelocity vector to which the mean velocity of the cell will be
62 : * written to*/
63 : void computeMeanVelocity(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, tarch::la::Vector<dim, double>& meanVelocity) {
64 : cell.iterateConstCells(_computeMomentumMapping);
65 : meanVelocity = _computeMomentumMapping.getMeanVelocity();
66 : }
67 :
68 : /** This cell does not consider the kinetic energy of the system, so the
69 : * kinetic energy will be different after executing this method! In order to
70 : * also retain the kinetic energy, one might compute the kinetic energy before
71 : * calling this method (using the KineticEnergyController) and set the old
72 : * kinetic energy afterwards (again using the KineticEnergyController). This
73 : * will then set the right kinetic energy again, conserving both mass and
74 : * momentum over this cell.
75 : * @brief sets the momentum of a coupling cell to the input value.
76 : * @param cell the coupling cell in which the momentum shall be changed
77 : * @param newMomentum the value to which the momentum will be set */
78 0 : void setMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const tarch::la::Vector<dim, double>& newMomentum) {
79 0 : tarch::la::Vector<dim, double> currentMomentum(0.0);
80 0 : computeMomentum(cell, currentMomentum);
81 0 : cell.iterateConstCells(_computeMassMapping);
82 0 : unsigned int numberParticles = _computeMassMapping.getNumberOfParticles();
83 0 : coupling::cellmappings::SetMomentumMapping<LinkedCell, dim> setMomentumMapping(currentMomentum, newMomentum, numberParticles, _mdSolverInterface);
84 0 : cell.iterateCells(setMomentumMapping);
85 0 : }
86 :
87 : private:
88 : /** instance of the ComputeMassMapping */
89 : coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> _computeMassMapping;
90 : /** instance of the ComputeMomentumMapping*/
91 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> _computeMomentumMapping;
92 : /** interface to the md solver*/
93 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface;
94 : };
95 : #endif // _MOLECULARDYNAMICS_COUPLING_MOMENTUMCONTROLLER_H_
|