LCOV - code coverage report
Current view: top level - coupling/transferstrategies - DifferenceTransferStrategy.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 34 0.0 %
Date: 2025-06-25 11:26:37 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_TRANSFERSTRATEGIES_DIFFERENCETRANSFERSTRATEGY_H_
       6             : #define _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_DIFFERENCETRANSFERSTRATEGY_H_
       7             : 
       8             : #include "coupling/cell-mappings/ComputeMassMapping.h"
       9             : #include "coupling/cell-mappings/ComputeMomentumMapping.h"
      10             : #include "coupling/transferstrategies/TransferStrategy.h"
      11             : #include "tarch/la/Vector.h"
      12             : 
      13             : namespace coupling {
      14             : namespace transferstrategies {
      15             : template <class LinkedCell, unsigned int dim> class DifferenceTransferStrategy;
      16             : }
      17             : } // namespace coupling
      18             : 
      19             : /** from MD to macroscopic solver: mass and momentum are computed at the current
      20             :  * timestep and mapped to macroscopic solver. The values are averaged over a
      21             :  * certain time. from macroscopic solver to MD: The difference in mass and
      22             :  * momentum between both solvers is computed and introduced on MD side.
      23             :  *  @author Philipp Neumann
      24             :  *  @tparam LinkedCell the LinkedCell class is given by the implementation of
      25             :  * linked cells in the molecular dynamics simulation
      26             :  *  @tparam dim  refers to the spacial dimension of the simulation, can be 1, 2,
      27             :  * or 3*/
      28             : template <class LinkedCell, unsigned int dim>
      29             : class coupling::transferstrategies::DifferenceTransferStrategy : public coupling::transferstrategies::TransferStrategy<LinkedCell, dim> {
      30             : public:
      31             :   /** @brief a simple constructor
      32             :    *  @param mdSolverInterface interface for the md solver
      33             :    *  @param numberMDSteps number of md steps within one coupling time step */
      34           0 :   DifferenceTransferStrategy(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface, unsigned int numberMDsteps)
      35           0 :       : coupling::transferstrategies::TransferStrategy<LinkedCell, dim>(mdSolverInterface), _numberMDsteps(numberMDsteps), _zero(0.0),
      36           0 :         _massMapping(mdSolverInterface), _momentumMapping(mdSolverInterface) {}
      37             : 
      38             :   /** @brief a dummy destructor */
      39           0 :   virtual ~DifferenceTransferStrategy() {}
      40             : 
      41             :   /** @brief
      42             :    *  @param cell coupling cell to process
      43             :    *  @param index index of the coupling cell */
      44           0 :   void processInnerCouplingCellBeforeReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell,
      45             :                                                                     I02 index) override {
      46             :     // reset quantities
      47           0 :     cell.setMicroscopicMass(0.0);
      48           0 :     cell.setMicroscopicMomentum(_zero);
      49           0 :   }
      50             : 
      51             :   /** @brief the microscopicMass and -Momentum are reseted to zero
      52             :    *  @param cell coupling cell to process
      53             :    *  @param index index of the coupling cell */
      54           0 :   void processOuterCouplingCellBeforeReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell,
      55             :                                                                     I02 index) override {
      56             :     // reset quantities
      57           0 :     cell.setMicroscopicMass(0.0);
      58           0 :     cell.setMicroscopicMomentum(_zero);
      59           0 :   }
      60             : 
      61             :   /** @brief difference between microscopic and macroscopic values is evaluated
      62             :    * and stored in the macroscopic quantity
      63             :    *  @param cell coupling cell to process
      64             :    *  @param index index of the coupling cell */
      65           0 :   void processInnerCouplingCellAfterReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell,
      66             :                                                                    I02 index) override {
      67             :     // compute difference between macroscopic and microscopic mass and momentum
      68             :     // values; this value is set in the microscopic data buffer of the
      69             :     // coupling cell.
      70           0 :     const double diffMass = cell.getMicroscopicMass() - cell.getMacroscopicMass();
      71           0 :     const tarch::la::Vector<dim, double> diffMomentum = cell.getMicroscopicMomentum() - cell.getMacroscopicMomentum();
      72           0 :     cell.setMicroscopicMass(diffMass);
      73           0 :     cell.setMicroscopicMomentum(diffMomentum);
      74             :     // reset coupling cell buffers
      75           0 :     cell.setMacroscopicMass(0.0);
      76           0 :     cell.setMacroscopicMomentum(_zero);
      77           0 :   }
      78             : 
      79             :   /** @brief the quantities (mass & momentum) are averaged (divided by the
      80             :    * amount of md time steps)
      81             :    *  @param cell coupling cell to process
      82             :    *  @param index index of the coupling cell */
      83           0 :   void processInnerCouplingCellBeforeSendingMDSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) override {
      84             :     // average quantities
      85           0 :     const double mass = cell.getMacroscopicMass() / ((double)_numberMDsteps);
      86           0 :     const tarch::la::Vector<dim, double> momentum = cell.getMacroscopicMomentum() * (1.0 / ((double)_numberMDsteps));
      87           0 :     cell.setMacroscopicMass(mass);
      88           0 :     cell.setMacroscopicMomentum(momentum);
      89           0 :   }
      90             : 
      91             :   /** @brief compute current mass and momentum and add it to averaged buffer
      92             :    * value
      93             :    *  @param cell coupling cell to process
      94             :    *  @param index index of the coupling cell */
      95           0 :   void processInnerCouplingCellAfterMDTimestep(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) override {
      96           0 :     cell.iterateConstCells(_massMapping);
      97           0 :     const double mass = _massMapping.getMass();
      98           0 :     cell.iterateConstCells(_momentumMapping);
      99           0 :     const tarch::la::Vector<dim, double> momentum = _momentumMapping.getMomentum();
     100           0 :     cell.addMacroscopicMass(mass);
     101           0 :     cell.addMacroscopicMomentum(momentum);
     102           0 :   }
     103             : 
     104             : private:
     105             :   /** number of md time steps within one coupling time step  */
     106             :   const unsigned int _numberMDsteps;
     107             :   /** vector containing zeros, the dimension is the spacial dimension of the
     108             :    * simulation */
     109             :   const tarch::la::Vector<dim, double> _zero;
     110             :   /** class to compute the mass within every single cell */
     111             :   coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> _massMapping;
     112             :   /** class to compute the momentum within every single cell */
     113             :   coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> _momentumMapping;
     114             : };
     115             : #endif // _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_DIFFERENCETRANSFERSTRATEGY_H_

Generated by: LCOV version 1.14