LCOV - code coverage report
Current view: top level - coupling/cell-mappings - PerturbateVelocityMapping.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 22 0
Test Date: 2026-08-21 15:14:06 Functions: 0.0 % 2 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 _COUPLING_CELLMAPPINGS_PERTURBATEVELOCITYMAPPING_H_
       6              : #define _COUPLING_CELLMAPPINGS_PERTURBATEVELOCITYMAPPING_H_
       7              : 
       8              : #include "coupling/interface/MDSolverInterface.h"
       9              : #include "tarch/utils/RandomNumberService.h"
      10              : 
      11              : namespace coupling {
      12              : namespace cellmappings {
      13              : template <class LinkedCell, unsigned int dim> class PerturbateVelocityMapping;
      14              : }
      15              : } // namespace coupling
      16              : 
      17              : /** This class is used to superimpose a random perturbation to the mean velocity
      18              :  *in all directions. It is use for Dynamic MD cases to launch new MD instances
      19              :  *with independent molecular values (velocities)
      20              :  *      @brief This class is used to superimpose a random perturbation to the
      21              :  *mean velocity in all directions.
      22              :  *      @tparam LinkedCell cell type
      23              :  *      @tparam dim Number of dimensions; it can be 1, 2 or 3
      24              :  *  @author Niklas Wittmer
      25              :  */
      26              : template <class LinkedCell, unsigned int dim> class coupling::cellmappings::PerturbateVelocityMapping {
      27              : public:
      28              :   /** Constructor
      29              :    *    @param mdSolverInterface
      30              :    *    @param velocity
      31              :    *    @param temperature
      32              :    */
      33            0 :   PerturbateVelocityMapping(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface, const tarch::la::Vector<dim, double>& velocity,
      34              :                             const double& temperature)
      35            0 :       : _mdSolverInterface(mdSolverInterface), _molecularMass(mdSolverInterface->getMoleculeMass()), _kB(mdSolverInterface->getKB()), _temperature(temperature),
      36            0 :         _velocity(velocity), _sigma(_mdSolverInterface->getMoleculeSigma()) {}
      37              : 
      38              :   /** Destructor */
      39            0 :   ~PerturbateVelocityMapping() {}
      40              : 
      41              :   /** empty function
      42              :    */
      43              :   void beginCellIteration() {}
      44              :   /** empty function
      45              :    */
      46              :   void endCellIteration() {}
      47              : 
      48              :   /** superimposes a random perturbation to the mean velocity in all directions
      49              :    *    @param cell
      50              :    */
      51            0 :   void handleCell(LinkedCell& cell) {
      52              : 
      53            0 :     double stdDeviation = std::sqrt(dim * _kB * _temperature / _molecularMass);
      54              : 
      55            0 :     tarch::la::Vector<dim, double> randomNumbers(0.0);
      56              : 
      57            0 :     coupling::interface::MoleculeIterator<LinkedCell, dim>* molecule = _mdSolverInterface->getMoleculeIterator(cell);
      58            0 :     molecule->begin();
      59            0 :     while (molecule->continueIteration()) {
      60            0 :       coupling::interface::Molecule<dim>& wrapper(molecule->get());
      61            0 :       randomNumbers[0] = tarch::utils::RandomNumberService::getInstance().getGaussianRandomNumber();
      62            0 :       for (unsigned int d = 1; d < dim; ++d) {
      63            0 :         randomNumbers[d] = tarch::utils::RandomNumberService::getInstance().getGaussianRandomNumber();
      64              :       }
      65              : 
      66            0 :       tarch::la::Vector<dim, double> mVelocity = wrapper.getVelocity();
      67              :       if (dim == 3) {
      68            0 :         mVelocity[0] = _velocity[0] + stdDeviation * (randomNumbers[0] * std::sin(randomNumbers[1]) * std::cos(randomNumbers[2]));
      69            0 :         mVelocity[1] = _velocity[1] + stdDeviation * (randomNumbers[0] * std::sin(randomNumbers[1]) * std::sin(randomNumbers[2]));
      70            0 :         mVelocity[2] = _velocity[2] + stdDeviation * (randomNumbers[0] * std::cos(randomNumbers[1]));
      71              :       } else if (dim == 1) {
      72              :         mVelocity = _velocity + stdDeviation * randomNumbers;
      73              :       } else if (dim == 2) {
      74              :         mVelocity[0] = _velocity[0] + stdDeviation * (randomNumbers[0] * std::cos(randomNumbers[1]));
      75              :         mVelocity[1] = _velocity[1] + stdDeviation * (randomNumbers[0] * std::sin(randomNumbers[1]));
      76              :       }
      77            0 :       wrapper.setVelocity(mVelocity);
      78              : 
      79            0 :       molecule->next();
      80              :     }
      81            0 :     delete molecule;
      82            0 :   }
      83              : 
      84              : private:
      85              :   coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface;
      86              :   const double _molecularMass;
      87              :   const double _kB;
      88              :   const double _temperature;
      89              :   const tarch::la::Vector<dim, double> _velocity;
      90              :   const double _sigma;
      91              : };
      92              : 
      93              : #endif //_COUPLING_CELLMAPPINGS_VARYCHECKPOINTMAPPING_H_
        

Generated by: LCOV version 2.0-1