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_MDSOLVERINTERFACE_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_MDSOLVERINTERFACE_H_
7 :
8 : namespace coupling {
9 : namespace interface {
10 : template <class LinkedCell, unsigned int dim> class MDSolverInterface;
11 : }
12 : } // namespace coupling
13 :
14 : #include "coupling/indexing/IndexingService.h"
15 : #include "coupling/interface/Molecule.h"
16 : #include "coupling/interface/MoleculeIterator.h"
17 : #include "tarch/la/Vector.h"
18 : #include <list>
19 :
20 : /** This class provides
21 : * @brief interface to the MD simulation
22 : * @tparam dim Number of dimensions; it can be 1, 2 or 3
23 : * @author Philipp Neumann
24 : */
25 36 : template <class LinkedCell, unsigned int dim> class coupling::interface::MDSolverInterface {
26 : public:
27 : using CellIndex_T = I11;
28 :
29 : /** Destructor */
30 32 : virtual ~MDSolverInterface() {}
31 :
32 : /** This function specifies a particular linked cell inside a coupling
33 : *cell. The coupling cells are currently located on the same process as the
34 : *respective linked cells. However, several linked cells may be part of a
35 : *coupling cell. The coupling cells also contain a ghost layer which
36 : *surrounds each local domain; the very first coupling cell inside the
37 : *global MD domain (or local MD domain) is thus given by coordinates (1,1,1)
38 : *(or (1,1) in 2D, respectively). The index linkedCellInCouplingCell
39 : *corresponds to the coordinates of the linked cell inside the given
40 : *coupling cell. These coordinates thus lie in a range
41 : *(0,linkedCellsPerCouplingCell-1).
42 : * @param couplingCellIndex
43 : * @param linkedCellInCouplingCell
44 : * @param linkedCellsPerCouplingCell
45 : * @returns a particular linked cell inside a coupling cell.
46 : */
47 : virtual LinkedCell& getLinkedCell(const CellIndex_T& couplingCellIndex, const tarch::la::Vector<dim, unsigned int>& linkedCellInCouplingCell,
48 : const tarch::la::Vector<dim, unsigned int>& linkedCellsPerCouplingCell) = 0;
49 :
50 : /** This function specifies the global size of the box-shaped MD domain
51 : * @returns the global size of the box-shaped MD domain */
52 : virtual tarch::la::Vector<dim, double> getGlobalMDDomainSize() const = 0;
53 :
54 : /** This function determines the offset (i.e. lower,left corner) of MD domain
55 : * @returns the offset (i.e. lower,left corner) of MD domain */
56 : virtual tarch::la::Vector<dim, double> getGlobalMDDomainOffset() const = 0;
57 :
58 : /** This function specifies the mass of a single fluid molecule
59 : * @returns the mass of a single fluid molecule */
60 : virtual double getMoleculeMass() const = 0;
61 :
62 : /**
63 : * @returns Boltzmann's constant */
64 : virtual double getKB() const = 0;
65 :
66 : /**
67 : * @returns the sigma parameter of the Lennard-Jones potential
68 : */
69 : virtual double getMoleculeSigma() const = 0;
70 :
71 : /**
72 : * @returns the epsilon parameter of the Lennard-Jones potential */
73 : virtual double getMoleculeEpsilon() const = 0;
74 :
75 : /** This function sets a random velocity in the vector 'initialVelocity'. This
76 : *velocity is sampled from a Maxwellian assuming a mean flow velocity
77 : *'meanVelocity' and a temperature 'temperature' of the fluid.
78 : * @param meanVelocity
79 : * @param kB
80 : * @param temperature
81 : * @param initialVelocity
82 : */
83 : virtual void getInitialVelocity(const tarch::la::Vector<dim, double>& meanVelocity, const double& kB, const double& temperature,
84 : tarch::la::Vector<dim, double>& initialVelocity) const = 0;
85 :
86 : /** This function deletes the molecule from the MD simulation
87 : * @param molecule
88 : * @param cell
89 : */
90 : virtual void deleteMoleculeFromMDSimulation(const coupling::interface::Molecule<dim>& molecule, LinkedCell& cell) = 0;
91 :
92 : /** This function adds the molecule to the MD simulation.
93 : * @param molecule
94 : */
95 : virtual void addMoleculeToMDSimulation(const coupling::interface::Molecule<dim>& molecule) = 0;
96 :
97 : /** This function sets up the potential energy landscape over the domain
98 : *spanned by indexOfFirstCouplingCell and rangeCoordinates. The first
99 : *vector denotes the position of the lower,left,front corner of the domain,
100 : *rangeCoordinates the number of coupling cells in each spatial direction
101 : *in which the potential energy needs to be computed.
102 : * @param indexOfFirstCouplingCell
103 : * @param rangeCouplingCells
104 : * @param linkedCellsPerCouplingCell
105 : */
106 : virtual void setupPotentialEnergyLandscape(const tarch::la::Vector<dim, unsigned int>& indexOfFirstCouplingCell,
107 : const tarch::la::Vector<dim, unsigned int>& rangeCouplingCells,
108 : const tarch::la::Vector<dim, unsigned int>& linkedCellsPerCouplingCell) = 0;
109 :
110 : /** This function specifies the local index vector (w.r.t. lexicographic
111 : *ordering of the linked cells in the MD simulation, for the linked cell that
112 : *the position 'position' belongs to. This method is crucial for the USHER
113 : *particle insertion scheme as we need to loop over all neighboured linked
114 : *cells and the cell itself to determine potential energy and forces acting on
115 : *the molecule at position 'position'.
116 : * @param position
117 : * @return the local index vector for the linked cell that the position
118 : *'position' belongs to
119 : * @sa getLinkedCell()
120 : */
121 : virtual tarch::la::Vector<dim, unsigned int> getLinkedCellIndexForMoleculePosition(const tarch::la::Vector<dim, double>& position) = 0;
122 :
123 : /** This function assumes that a molecule is placed somewhere inside the
124 : *linked cell at index 'linkedCellIndex' and computes the force and potential
125 : *energy contributions from all molecules in the same linked cell and the
126 : *neighboured linked cells onto this molecule. The molecule "molecule" is
127 : *considered to NOT be part of the simulation domain and thus the linked
128 : *cells. Therefore, another molecule inside the linked cells may even coincide
129 : *with "molecule". The results are stored within the molecule.
130 : * @param molecule
131 : */
132 : virtual void calculateForceAndEnergy(coupling::interface::Molecule<dim>& molecule) = 0;
133 :
134 : /** This function is called each time when MaMiCo tried to insert/ delete
135 : * molecules from the MD simulation. As a consequence, a synchronization
136 : * between processes or with local boundary data might be necessary. Example:
137 : * If in the lower left cell of a 2D MD simulation a molecule was inserted and
138 : * we use periodic boundary conditions, we need to provide the inserted
139 : * molecule (amongst others) to the upper right cell by adding this molecule
140 : * to the ghost boundary layer (when using the builtin MD simulation). For the
141 : * builtin MD simulation, the implementation of this method clears all
142 : * molecules from the ghost layers and re-fills the ghost layers again.
143 : */
144 : virtual void synchronizeMoleculesAfterMassModification() = 0;
145 :
146 : /** This function is called each time when MaMiCo tried to insert momentum in
147 : * the MD simulation. For the builtin MD simulation, this method is empty as
148 : * the simulation does not need to synchronize changing momentum over the
149 : * processes within a timestep (only the positions and numbers of molecules in
150 : * possible ghost layers matter!). However, other solvers might need to
151 : * implement something in here.
152 : */
153 : virtual void synchronizeMoleculesAfterMomentumModification() = 0;
154 :
155 : /**
156 : * @returns the timestep of the MD simulation
157 : */
158 : virtual double getDt() = 0;
159 :
160 : /**
161 : * @param cell
162 : * @returns a new molecule iterator for a certain linked cell
163 : */
164 : virtual coupling::interface::MoleculeIterator<LinkedCell, dim>* getMoleculeIterator(LinkedCell& cell) = 0;
165 : };
166 :
167 : #endif // _MOLECULARDYNAMICS_COUPLING_MDSOLVERINTERFACE_H_
|