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_KINETICENERGYCONTROLLER_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_KINETICENERGYCONTROLLER_H_
7 :
8 : #include "coupling/cell-mappings/ComputeKineticEnergyMapping.h"
9 : #include "coupling/cell-mappings/ComputeMassMapping.h"
10 : #include "coupling/cell-mappings/ComputeMomentumMapping.h"
11 : #include "coupling/cell-mappings/ComputeTemperatureMapping.h"
12 : #include "coupling/cell-mappings/SetKineticEnergyMapping.h"
13 : #include "coupling/cell-mappings/SetTemperatureMapping.h"
14 : #include "coupling/datastructures/CouplingCell.h"
15 : #include "coupling/datastructures/CouplingCellWithLinkedCells.h"
16 :
17 : namespace coupling {
18 : template <class LinkedCell, unsigned int dim> class KineticEnergyController;
19 : }
20 :
21 : /** @brief controles and regulates the kinetic energy of the MD system.
22 : * @author Philipp Neumann
23 : * @tparam LinkedCell the LinkedCell class is given by the implementation of
24 : * linked cells in the molecular dynamics simulation
25 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2,
26 : * or 3*/
27 : template <class LinkedCell, unsigned int dim> class coupling::KineticEnergyController {
28 : public:
29 : /** @brief a simple constructor
30 : * @param mdSolverInterface interface to the md solver */
31 4 : KineticEnergyController(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) : _mdSolverInterface(mdSolverInterface) {}
32 : /** @brief a simple destructor*/
33 0 : ~KineticEnergyController() {}
34 :
35 : /** @brief computes and returns the kinetic energy within a coupling cell
36 : * @param cell coupling cell to compute the kinetic energy for
37 : * @returns the kinetic energy in the cell */
38 : double computeKineticEnergy(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell) const {
39 : coupling::cellmappings::ComputeKineticEnergyMapping<LinkedCell, dim> computeKineticEnergyMapping(_mdSolverInterface);
40 : cell.iterateConstCells(computeKineticEnergyMapping);
41 : return computeKineticEnergyMapping.getKineticEnergy();
42 : }
43 :
44 : /** @brief computes and returns the temperature within a coupling cell
45 : * @param cell coupling cell to compute the temperature in
46 : * @returns the temperature in the cell */
47 0 : double computeTemperature(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell) const {
48 0 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> computeMomentumMapping(_mdSolverInterface);
49 0 : cell.iterateConstCells(computeMomentumMapping);
50 0 : tarch::la::Vector<dim, double> meanVelocity = computeMomentumMapping.getMeanVelocity();
51 :
52 0 : coupling::cellmappings::ComputeTemperatureMapping<LinkedCell, dim> computeTemperatureMapping(meanVelocity, _mdSolverInterface);
53 0 : cell.iterateConstCells(computeTemperatureMapping);
54 0 : return computeTemperatureMapping.getTemperature();
55 0 : }
56 :
57 : /** Therefore, the mean velocity is computed first. Afterwards the deviation
58 : * from the mean velocity are rescaled such that momentum is conserved.
59 : * @brief sets the kinetic energy within a coupling cell to the input
60 : * value.
61 : * @param cell the coupling cell to set the kinetic energy in
62 : * @param kineticEnergy the value the kinetic energy shall be set to*/
63 : void setKineticEnergy(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const double& kineticEnergy) const {
64 : // determine mass, momentum and old kinetic energy
65 : coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> computeMassMapping(_mdSolverInterface);
66 : cell.iterateConstCells(computeMassMapping);
67 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> computeMomentumMapping(_mdSolverInterface);
68 : cell.iterateConstCells(computeMomentumMapping);
69 : coupling::cellmappings::ComputeKineticEnergyMapping<LinkedCell, dim> computeKineticEnergyMapping(_mdSolverInterface);
70 : cell.iterateConstCells(computeKineticEnergyMapping);
71 : // set new kinetic energy
72 : unsigned int numberParticles = computeMassMapping.getNumberOfParticles();
73 : tarch::la::Vector<dim, double> meanVelocity = computeMomentumMapping.getMeanVelocity();
74 : double oldKineticEnergy = computeKineticEnergyMapping.getKineticEnergy();
75 : coupling::cellmappings::SetKineticEnergyMapping<LinkedCell, dim> setKineticEnergyMapping(oldKineticEnergy, kineticEnergy, numberParticles, meanVelocity);
76 : cell.iterateCells(setKineticEnergyMapping);
77 : }
78 :
79 : /** Here we just scale the deviation from the mean velocity accordingly, i.e.
80 : * we set: v_molecule = v_mean +
81 : * sqrt(temperature/current_temperature)*(v_molecule-v_mean)
82 : * @brief sets the temperature within the cell to 'temperature'.
83 : * @param cell the coupling cell the temperature shall be applied in
84 : * @param temperature the value the temperature shall be set at*/
85 0 : void setTemperature(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, const double& temperature) const {
86 0 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> computeMomentumMapping(_mdSolverInterface);
87 0 : cell.iterateConstCells(computeMomentumMapping);
88 0 : tarch::la::Vector<dim, double> meanVelocity = computeMomentumMapping.getMeanVelocity();
89 :
90 0 : coupling::cellmappings::ComputeTemperatureMapping<LinkedCell, dim> computeTemperatureMapping(meanVelocity, _mdSolverInterface);
91 0 : cell.iterateConstCells(computeTemperatureMapping);
92 0 : double currentTemperature = computeTemperatureMapping.getTemperature();
93 :
94 0 : coupling::cellmappings::SetTemperatureMapping<LinkedCell, dim> setTemperatureMapping(currentTemperature, temperature, meanVelocity, _mdSolverInterface);
95 0 : cell.iterateCells(setTemperatureMapping);
96 0 : }
97 :
98 : private:
99 : /** interface of the md solver*/
100 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface;
101 : };
102 : #endif // _MOLECULARDYNAMICS_COUPLING_KINETICENERGYCONTROLLER_H_
|