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