LCOV - code coverage report
Current view: top level - coupling/sendrecv - FromMD2Macro.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 2 50.0 %
Date: 2025-06-25 11:26:37 Functions: 0 2 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_SENDRECV_MD2MACRO_H_
       6             : #define _MOLECULARDYNAMICS_COUPLING_SENDRECV_MD2MACRO_H_
       7             : 
       8             : #include "coupling/CouplingMDDefinitions.h"
       9             : #include "coupling/datastructures/CellContainer.h"
      10             : #include "coupling/datastructures/FlexibleCellContainer.h"
      11             : #include "coupling/sendrecv/DataExchangeFromMD2Macro.h"
      12             : #include "coupling/sendrecv/SendReceiveBuffer.h"
      13             : #include <vector>
      14             : 
      15             : namespace coupling {
      16             : namespace sendrecv {
      17             : template <class Cell_T, unsigned int dim> class FromMD2Macro;
      18             : }
      19             : } // namespace coupling
      20             : 
      21             : /** extends the generic SendReceiveBuffer for send coupling cell information
      22             :  *from MaMiCo to the macroscopic solver.
      23             :  *      @brief sends coupling cell information from MaMiCo to the macroscopic
      24             :  *solver. Derived from the class coupling::sendrecv::SendReceiveBuffer
      25             :  *      @tparam Cell_T cell type
      26             :  *      @tparam dim Number of dimensions; it can be 1, 2 or 3
      27             :  *  @author Philipp Neumann
      28             :  */
      29             : template <class Cell_T, unsigned int dim> class coupling::sendrecv::FromMD2Macro : public coupling::sendrecv::SendReceiveBuffer<Cell_T, dim> {
      30             : 
      31             : public:
      32             :   /** Constructor, just calling the constructor of the
      33             :    * coupling::sendrecv::SendReceiveBuffer  */
      34           4 :   FromMD2Macro() : coupling::sendrecv::SendReceiveBuffer<Cell_T, dim>() {}
      35             :   /** Destructor */
      36           0 :   virtual ~FromMD2Macro() {}
      37             : 
      38             :   using Macro_Container_T = coupling::datastructures::FlexibleCellContainer<dim>;
      39             :   using Local_Container_T = coupling::datastructures::CellContainer<I02, dim>;
      40             : 
      41             :   /** sends information from the local coupling cells of MaMiCo (only inner
      42             :    * non-ghost cells of this process) to the macroscopic solver. Since the
      43             :    * macroscopic solver can have an arbitrary distribution of cells on the
      44             :    * processes, the buffer for receiving the cell data is provided to this
      45             :    * function in terms of an array of coupling cells including the respective
      46             :    * global cell indices. This function basically calls for these purposes
      47             :    * sendFromMD2MacroNonBlocking(...) and wait4SendFromMD2Macro(...) in a row.
      48             :    *    @param dataExchange
      49             :    *    @param src
      50             :    *  @param dst
      51             :    */
      52             :   void sendFromMD2Macro(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& src, const Macro_Container_T& dst);
      53             : 
      54             :   /** reduces information from the local coupling cells of MaMiCo (only inner
      55             :    * non-ghost cells of this process) and sends it to the macroscopic solver.
      56             :    *    @param dataExchange
      57             :    *    @param src
      58             :    *  @param dst
      59             :    */
      60             :   template <class Container_T1, class Container_T2>
      61             :   void reduceFromMD2Macro(std::vector<coupling::sendrecv::DataExchangeFromMD2Macro<dim>*>& dataExchange, const Container_T1& src, const Container_T2& dst);
      62             : 
      63             :   /** triggers the send/recv operations for data transfer. After returning,
      64             :    * these data transfers do not necessarily need to be finished, according to
      65             :    * ISend/IRecv in MPI.
      66             :    *    @param dataExchange
      67             :    *    @param src
      68             :    *  @param dst
      69             :    */
      70             :   void sendFromMD2MacroNonBlocking(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& src, const Macro_Container_T& dst);
      71             : 
      72             :   /** waits for the send operation--instantiated by
      73             :    * sendFromMD2MacroNonBlocking(...)--to be finished and writes the data to
      74             :    * couplingCellsFromMacroscopicSolver.
      75             :    *    @param dataExchange
      76             :    *    @param cells
      77             :    */
      78             :   void wait4SendFromMD2Macro(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Macro_Container_T& cells);
      79             : 
      80             : private:
      81             :   /** loops over the whole local Cartesian grid (only non-ghost cells!) and
      82             :    * writes respective cells to send buffer. For each cell,
      83             :    * writeToSendBuffer(...) of SendReceiveBuffer is used.
      84             :    *    @param dataExchange
      85             :    *    @param cells
      86             :    */
      87             :   void writeToSendBuffer(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& cells);
      88             : 
      89             :   /** loops over the whole local Cartesian grid (only non-ghost cells!) and
      90             :    * writes respective cells to reduce buffer.
      91             :    *    @param dataExchange
      92             :    *    @param cells
      93             :    */
      94             :   void writeToReduceBuffer(coupling::sendrecv::DataExchangeFromMD2Macro<dim>& dataExchange, const Local_Container_T& cells);
      95             : 
      96             :   /** allocates the receive buffers for the macroscopic solver. Since we do not
      97             :    * know anything about the macroscopic solver, we only have a list of global
      98             :    * vector cell indices available for possible cells to be received on this
      99             :    * rank. For each global cell which is in the list,
     100             :    * allocateReceiveBuffers(...) of SendReceiveBuffer is called.
     101             :    *    @param dataExchange
     102             :    *    @param cells
     103             :    */
     104             :   void allocateReceiveBuffers(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Macro_Container_T& cells);
     105             : 
     106             :   /** allocates the reduce receive buffers for the macroscopic solver. Since we do not
     107             :    * know anything about the macroscopic solver, we only have a list of global
     108             :    * vector cell indices available for possible cells to be received on this
     109             :    * rank. For each global cell which is in the list,
     110             :    * allocateReduceBufferForReceiving(...) of SendReceiveBuffer is called.
     111             :    *    @param dataExchange
     112             :    *    @param cells
     113             :    */
     114             :   template <class Container_T> void allocateReduceBufferForReceiving(coupling::sendrecv::DataExchangeFromMD2Macro<dim>& dataExchange, const Container_T& cells);
     115             : 
     116             :   /** reads information from the receive buffer and stores the result in the
     117             :    * list of coupling cells. Since this is a receive for the coupling
     118             :    * cells on the side of the macroscopic solver, we just have a list of global
     119             :    * cell indices and corresponding coupling cell buffers. For each cell in
     120             :    * this list, readFromReceiveBuffer(...) of SendReceiveBuffer is called.
     121             :    *    @param dataExchange
     122             :    *    @param cells
     123             :    */
     124             :   void readFromReceiveBuffer(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Macro_Container_T& cells);
     125             : 
     126             :   /** reads information from the reduce buffer and stores the result in the
     127             :    * list of coupling cells. Since this is a receive for the coupling
     128             :    * cells on the side of the macroscopic solver, we just have a list of global
     129             :    * cell indices and corresponding coupling cell buffers. For each cell in
     130             :    * this list, readFromReduceBuffer(...) of SendReceiveBuffer is called.
     131             :    *    @param dataExchange
     132             :    *    @param cells
     133             :    */
     134             :   template <class Container_T> void readFromReduceBuffer(coupling::sendrecv::DataExchangeFromMD2Macro<dim>& dataExchange, const Container_T& cells);
     135             : };
     136             : 
     137             : #include "FromMD2Macro.cpph"
     138             : 
     139             : #endif // _MOLECULARDYNAMICS_COUPLING_SENDRECV_MD2MACRO_H_

Generated by: LCOV version 1.14