LCOV - code coverage report
Current view: top level - coupling - AdditiveMomentumInsertion.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 18 0.0 %
Date: 2025-06-25 11:26:37 Functions: 0 4 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_ADDITIVEMOMENTUMINSERTION_H_
       6             : #define _MOLECULARDYNAMICS_COUPLING_ADDITIVEMOMENTUMINSERTION_H_
       7             : 
       8             : #include "coupling/MomentumInsertion.h"
       9             : #include "coupling/cell-mappings/ComputeMassMapping.h"
      10             : #include "coupling/cell-mappings/SetMomentumMapping.h"
      11             : #include "coupling/datastructures/CouplingCell.h"
      12             : #include "tarch/la/Vector.h"
      13             : 
      14             : /** @brief everything necessary for coupling operations, is defined in here */
      15             : namespace coupling {
      16             : template <class LinkedCell, unsigned int dim> class AdditiveMomentumInsertion;
      17             : }
      18             : 
      19             : /** This class allows to add momentum to molecules. In each MD timestep, it
      20             :  * takes a respective fraction from the momentum buffer of a coupling cell
      21             :  * and adds this momentum to the molecules of the coupling cell.
      22             :  *  @brief used to manipulate the momentum/velocity of the molecules contained
      23             :  * in a coupling cell.
      24             :  *  @tparam LinkedCell the LinkedCell class is given by the implementation of
      25             :  * linked cells in the molecular dynamics simulation
      26             :  *  @tparam dim the integer dim refers to the spacial dimension of the
      27             :  * simulation, can be 1, 2, or 3
      28             :  *  @author Philipp Neumann
      29             :  */
      30             : template <class LinkedCell, unsigned int dim> class coupling::AdditiveMomentumInsertion : public coupling::MomentumInsertion<LinkedCell, dim> {
      31             : public:
      32             :   /** @brief A simple constructor
      33             :    *   @param mdSolverInterface The interface of the molecular dynamics solver
      34             :    * in application
      35             :    *   @param numberMDTimestepsPerCouplingCycle The number of molecular dynamics
      36             :    * timesteps within one coupling cycle */
      37           0 :   AdditiveMomentumInsertion(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface, unsigned int numberMDTimestepsPerCouplingCycle)
      38           0 :       : coupling::MomentumInsertion<LinkedCell, dim>(mdSolverInterface), _numberMDTimestepsPerCouplingCycle(numberMDTimestepsPerCouplingCycle) {}
      39             : 
      40             :   /** @brief A simple destructor*/
      41           0 :   ~AdditiveMomentumInsertion() {}
      42             : 
      43             :   /** returns 1 since momentum shall be inserted in every time step
      44             :    *  @brief returns the interval of time steps for momentum insertion
      45             :    *  @returns 1 */
      46           0 :   unsigned int getTimeIntervalPerMomentumInsertion() const override { return 1; }
      47             : 
      48             :   /** inserts the momentum of the coupling cell and distributes it over all
      49             :    * molecules. This method does not conserve the kinetic energy of the
      50             :    * respective coupling cell. To conserve the energy as well, see the
      51             :    * description of MomentumController on details how to do that.
      52             :    *  @brief inserts momentum to the cell
      53             :    *  @param cell coupling cell to insert momentum to
      54             :    *  @param idx coupling cell index of the cell */
      55           0 :   void insertMomentum(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 idx) const override {
      56           0 :     const unsigned int timeIntervalMomentumInsertion = getTimeIntervalPerMomentumInsertion();
      57             :     // determine fraction of momentum that is to be inserted in this frame
      58           0 :     double fraction = 1.0 / ((_numberMDTimestepsPerCouplingCycle / timeIntervalMomentumInsertion) +
      59           0 :                              (_numberMDTimestepsPerCouplingCycle % timeIntervalMomentumInsertion != 0));
      60           0 :     tarch::la::Vector<dim, double> momentum(fraction * cell.getMicroscopicMomentum());
      61           0 :     tarch::la::Vector<dim, double> zeroMomentum(0.0);
      62             : 
      63             :     // if there is some momentum to be transferred, do so
      64           0 :     if (tarch::la::dot(momentum, momentum) != 0.0) {
      65           0 :       coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> computeMassMapping(coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface);
      66           0 :       cell.iterateConstCells(computeMassMapping);
      67             :       unsigned int numberParticles = computeMassMapping.getNumberOfParticles();
      68           0 :       coupling::cellmappings::SetMomentumMapping<LinkedCell, dim> setMomentumMapping(zeroMomentum, momentum, numberParticles,
      69           0 :                                                                                      coupling::MomentumInsertion<LinkedCell, dim>::_mdSolverInterface);
      70           0 :       cell.iterateCells(setMomentumMapping);
      71           0 :     }
      72           0 :   }
      73             : 
      74             : private:
      75             :   const unsigned int _numberMDTimestepsPerCouplingCycle; ///< The number of molecular dynamics
      76             :                                                          ///< timesteps within one coupling
      77             :                                                          ///< cycle */
      78             : };
      79             : #endif // _MOLECULARDYNAMICS_COUPLING_ADDITIVEMOMENTUMINSERTION_H_

Generated by: LCOV version 1.14