LCOV - code coverage report
Current view: top level - coupling - VelocityGradientRelaxation.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 28 0
Test Date: 2026-08-21 15:14:06 Functions: 0.0 % 6 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 2.0-1