LCOV - code coverage report
Current view: top level - coupling - VelocityGradientRelaxation.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 28 0.0 %
Date: 2025-10-27 21:19:12 Functions: 0 8 0.0 %

          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_VELOCITYGRADIENTRELAXATION_H_
       6             : #define _MOLECULARDYNAMICS_COUPLING_VELOCITYGRADIENTRELAXATION_H_
       7             : 
       8             : #include "coupling/MomentumInsertion.h"
       9             : #include "coupling/cell-mappings/ComputeMomentumMapping.h"
      10             : #include "coupling/cell-mappings/VelocityGradientRelaxationMapping.h"
      11             : #include "coupling/interface/MDSolverInterface.h"
      12             : 
      13             : namespace coupling {
      14             : template <class LinkedCell, unsigned int dim> class VelocityGradientRelaxation;
      15             : template <class LinkedCell, unsigned int dim> class VelocityGradientRelaxationTopOnly;
      16             : } // namespace coupling
      17             : 
      18             : /** Carries out velocity relaxation (similar to the SetMomentumMapping procedure).
      19             :  * In this particular case, however, the velocity is relaxed within a one
      20             :  * cell-wide strip around the molecular domain. For this purpose, the velocity
      21             :  * that shall be imposed in average in the cells that are within a three
      22             :  * cell-wide strip need to be known and stored in the
      23             :  *  microscopicMomentum-buffers (2 cells overlap with the MD simulation, and 1
      24             :  * more (ghost) cell layer surrounding the MD domain). The procedure then only
      25             :  * considers molecules that are located between the midpoints of the cells which
      26             :  * are in the two cell-wide boundary strip. For all these molecules, a
      27             :  * second-order interpolation of the average velocity at their respective
      28             :  * position is carried out and the molecules are then relaxed towards this
      29             :  * particular velocity.
      30             :  *  @brief carries out velocity relaxation (similar to the SetMomentumMapping
      31             :  * procedure).
      32             :  *  @author Philipp Neumann
      33             :  *  @tparam LinkedCell the LinkedCell class is given by the implementation of
      34             :  * linked cells in the molecular dynamics simulation
      35             :  *  @tparam dim  refers to the spacial dimension of the simulation, can be 1, 2,
      36             :  * or 3 */
      37             : template <class LinkedCell, unsigned int dim> class coupling::VelocityGradientRelaxation : public coupling::MomentumInsertion<LinkedCell, dim> {
      38             : public:
      39             :   /** @brief a simple constructor
      40             :    *  @param relaxationParam defines the strength of the relaxation; 1 means the
      41             :    * molecules velocity is set to the new velocity; O.5 -> the velocity will be
      42             :    * set to the avaerage of the old and the new velocity
      43             :    *  @param mdSolverInterface interface for the md solver
      44             :    *  @param couplingCells the coupling cells to apply the velocity
      45             :    * gradient relaxation */
      46           0 :   VelocityGradientRelaxation(double relaxationParam, coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface,
      47             :                              const coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>* const couplingCells)
      48           0 :       : coupling::MomentumInsertion<LinkedCell, dim>(mdSolverInterface), _couplingCells(couplingCells), _relaxationParam(relaxationParam) {}
      49             :   /** @brief a dummy destructor */
      50           0 :   virtual ~VelocityGradientRelaxation() {}
      51             : 
      52             :   /** @brief returns the time step interval for the momentum insertion, always
      53             :    * one for this method
      54             :    *  @return the time step interval for momentum insertion */
      55           0 :   unsigned int getTimeIntervalPerMomentumInsertion() const override { return 1; }
      56             : 
      57             :   /** This method does not conserve the kinetic energy of the respective
      58             :    * coupling cell. To conserve the energy as well, see the description of
      59             :    * MomentumController on details how to do that.
      60             :    *  @brief insertes the momentum to the cells according to the params and
      61             :    * velocity gradient relaxation method
      62             :    *  @param cell the coupling cell to insert momentum to
      63             :    *  @param idx the coupling cell's index */
      64           0 :   void insertMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 idx) const override {
      65           0 :     coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> momentumMapping(coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface);
      66           0 :     tarch::la::Vector<dim, double> oldVelocity(0.0);
      67           0 :     cell.iterateConstCells(momentumMapping);
      68             :     // set current average velocity within this cell
      69           0 :     oldVelocity = momentumMapping.getMeanVelocity();
      70             :     // set new momentum (based on velocity stored in microscopic
      71             :     // momentum-buffer)
      72           0 :     coupling::cellmappings::VelocityGradientRelaxationMapping<LinkedCell, dim> velocityGradientRelaxation(
      73           0 :         _relaxationParam, oldVelocity, idx, coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface, _couplingCells);
      74           0 :     cell.iterateCells(velocityGradientRelaxation);
      75           0 :   }
      76             : 
      77           0 :   void setInnerImposition(bool enable) override {
      78           0 :     throw std::runtime_error(std::string("coupling::AdditiveMomentumInsertion::setInnerImposition not implemented"));
      79             :   }
      80             : 
      81             : protected:
      82             :   /** the coupling cells to apply the velocity gradient relaxation */
      83             :   const coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>* const _couplingCells;
      84             :   /** defines the strength of the relaxation; 1 means the molecules velocity is
      85             :    * set to the new velocity;
      86             :    *                         O.5 -> the velocity will be set to the avaerage of
      87             :    * the old and the new velocity*/
      88             :   const double _relaxationParam;
      89             : };
      90             : 
      91             : /** In this particular case, however, the velocity is relaxed within a one
      92             :  * cell-wide strip around the molecular domain. For this purpose, the velocity
      93             :  * that shall be imposed in average in the cells that are within a three
      94             :  * cell-wide strip need to be known and stored in the
      95             :  *  microscopicMomentum-buffers (2 cells overlap with the MD simulation, and 1
      96             :  * more (ghost) cell layer surrounding the MD domain). The procedure then only
      97             :  * considers molecules that are located between the midpoints of the cells which
      98             :  * are in the two cell-wide boundary strip. For all these molecules, a
      99             :  * second-order interpolation of the average velocity at their respective
     100             :  * position is carried out and the molecules are then relaxed towards this
     101             :  * particular velocity.
     102             :  *  @brief carries out velocity relaxation (similar to the SetMomentumMapping
     103             :  * procedure).
     104             :  *  @author Philipp Neumann
     105             :  *  @tparam LinkedCell the LinkedCell class is given by the implementation of
     106             :  * linked cells in the molecular dynamics simulation
     107             :  *  @tparam dim  refers to the spacial dimension of the simulation, can be 1, 2,
     108             :  * or 3
     109             :  *  @todo Don't know what this does, just copied the comments from above*/
     110             : template <class LinkedCell, unsigned int dim> class coupling::VelocityGradientRelaxationTopOnly : public coupling::VelocityGradientRelaxation<LinkedCell, dim> {
     111             : public:
     112             :   /** @brief a simple constructor*/
     113           0 :   VelocityGradientRelaxationTopOnly(double relaxationParam, coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface,
     114             :                                     const coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>* const couplingCells)
     115           0 :       : coupling::VelocityGradientRelaxation<LinkedCell, dim>(relaxationParam, mdSolverInterface, couplingCells) {}
     116             : 
     117             :   /** @brief a dummy destructor */
     118           0 :   virtual ~VelocityGradientRelaxationTopOnly() {}
     119             : 
     120             :   /** This method does not conserve the kinetic energy of the respective
     121             :    * coupling cell. To conserve the energy as well, see the description of
     122             :    * MomentumController on details how to do that.
     123             :    *  @brief insertes the momentum to the cells according to the params and
     124             :    * velocity gradient relaxation method
     125             :    *  @param cell the coupling cell to insert momentum to
     126             :    *  @param idx the coupling cell's index */
     127           0 :   void insertMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 idx) const override {
     128           0 :     coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> momentumMapping(coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface);
     129           0 :     tarch::la::Vector<dim, double> oldVelocity(0.0);
     130           0 :     cell.iterateConstCells(momentumMapping);
     131             :     // set current average velocity within this cell
     132           0 :     oldVelocity = momentumMapping.getMeanVelocity();
     133             : 
     134             :     // set new momentum (based on velocity stored in microscopic
     135             :     // momentum-buffer)
     136           0 :     coupling::cellmappings::VelocityGradientRelaxationTopOnlyMapping<LinkedCell, dim> velocityGradientRelaxation(
     137           0 :         coupling::VelocityGradientRelaxation<LinkedCell, dim>::_relaxationParam, oldVelocity, idx,
     138           0 :         coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface, coupling::VelocityGradientRelaxation<LinkedCell, dim>::_couplingCells);
     139           0 :     cell.iterateCells(velocityGradientRelaxation);
     140           0 :   }
     141             : };
     142             : #endif // _MOLECULARDYNAMICS_COUPLING_VELOCITYGRADIENTRELAXATION_H_

Generated by: LCOV version 1.14