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