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_COMPUTEMEANPOTENTIALENERGYMAPPING_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_COMPUTEMEANPOTENTIALENERGYMAPPING_H_
7 :
8 : #include "coupling/BoundaryForceController.h"
9 : #include "coupling/interface/MDSolverInterface.h"
10 : #include "coupling/interface/Molecule.h"
11 : #include <iostream>
12 :
13 : namespace coupling {
14 : namespace cellmappings {
15 : template <class LinkedCell, unsigned int dim> class ComputeMeanPotentialEnergyMapping;
16 : }
17 : } // namespace coupling
18 :
19 : /**
20 : * @brief This class computes the mean potential energy over this
21 : *coupling 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::ComputeMeanPotentialEnergyMapping {
27 : public:
28 : /** Constructor
29 : * @param mdSolverInterface
30 : * @param boundaryForceController
31 : */
32 0 : ComputeMeanPotentialEnergyMapping(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface,
33 : const coupling::BoundaryForceController<LinkedCell, dim>& boundaryForceController)
34 0 : : _mdSolverInterface(mdSolverInterface), _meanPotentialEnergy(0.0), _particleCounter(0), _boundaryForceController(boundaryForceController) {}
35 :
36 : /** Destructor */
37 0 : ~ComputeMeanPotentialEnergyMapping() {}
38 :
39 : /** sets the mean potential energy and the particle counter to zero, before
40 : * the iteration process begins.
41 : */
42 0 : void beginCellIteration() {
43 0 : _meanPotentialEnergy = 0.0;
44 0 : _particleCounter = 0;
45 : }
46 :
47 : /** computes the mean potential energy in a linked cell, by dividing the
48 : * summation of the mean potential energy of all particles inside the cell
49 : * over the number of particles.
50 : */
51 0 : void endCellIteration() {
52 0 : if (_particleCounter != 0) {
53 0 : _meanPotentialEnergy = _meanPotentialEnergy / _particleCounter;
54 : }
55 : }
56 :
57 : /** counts the molecules inside a linked cell and sums up the of the mean
58 : *potential energy of all particles inside the 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 : const coupling::interface::Molecule<dim>& wrapper(it->getConst());
66 0 : _meanPotentialEnergy += wrapper.getPotentialEnergy();
67 0 : _meanPotentialEnergy += _boundaryForceController.getPotentialEnergy(wrapper.getPosition());
68 0 : _particleCounter++;
69 :
70 0 : it->next();
71 : }
72 0 : delete it;
73 0 : }
74 :
75 : /** returns the mean potential energy inside a linked cell
76 : * @return _meanPotentialEnergy
77 : */
78 0 : double getPotentialEnergy() const { return _meanPotentialEnergy; }
79 :
80 : private:
81 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface;
82 : double _meanPotentialEnergy;
83 : unsigned int _particleCounter;
84 : const coupling::BoundaryForceController<LinkedCell, dim>& _boundaryForceController;
85 : };
86 : #endif // _MOLECULARDYNAMICS_COUPLING_CELLMAPPINGS_COMPUTEMEANPOTENTIALENERGYMAPPING_H_
|