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_FROMMACRO2MD_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_SENDRECV_FROMMACRO2MD_H_ 7 : 8 : #include "coupling/sendrecv/DataExchangeFromMacro2MD.h" 9 : #include "coupling/sendrecv/SendReceiveBuffer.h" 10 : #include <vector> 11 : 12 : namespace coupling { 13 : namespace sendrecv { 14 : template <class Cell_T, unsigned int dim> class FromMacro2MD; 15 : } 16 : } // namespace coupling 17 : 18 : /** extends the generic SendReceiveBuffer for transfer of quantities from a 19 : *macroscopic solver to the coupling cells of the coupling tool (incl. ghost 20 : *cells). 21 : * @brief SendReceiveBuffer for transfer of quantities from a macroscopic 22 : *solver to the coupling cells. Derived from the class 23 : *coupling::sendrecv::SendReceiveBuffer 24 : * @tparam Cell_T cell type 25 : * @tparam dim Number of dimensions; it can be 1, 2 or 3 26 : * @author Philipp Neumann 27 : */ 28 : template <class Cell_T, unsigned int dim> class coupling::sendrecv::FromMacro2MD : public coupling::sendrecv::SendReceiveBuffer<Cell_T, dim> { 29 : 30 : public: 31 : /** Constructor, just calling the constructor of the 32 : * coupling::sendrecv::SendReceiveBuffer */ 33 4 : FromMacro2MD() : coupling::sendrecv::SendReceiveBuffer<Cell_T, dim>() {} 34 : /** Destructor */ 35 0 : virtual ~FromMacro2MD() {} 36 : 37 : using Local_Container_T = coupling::datastructures::CellContainer<I02, dim>; 38 : 39 : /** sends information from the local coupling cells of a macroscopic solver 40 : * to the coupling cells of MaMico (ghost cells are also allowed). Since 41 : * the macroscopic solver can have an arbitrary distribution of cells on the 42 : * processes, the buffer for sending the cell data is provided to this 43 : * function in terms of an array of coupling cells including the respective 44 : * global cell indices. This function calls sendFromMacro2MDNonBlocking(..) 45 : * and immediately subsequently wait4SendFromMacro2MD(...). Those two methods 46 : * may alternatively be used, e.g., for "non-blocking" communication. 47 : * @param dataExchange 48 : * @param dst 49 : * @param src 50 : */ 51 : template <class Container_T> 52 : void sendFromMacro2MD(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& dst, const Container_T& src); 53 : 54 : template <class Container_T> 55 : void bcastFromMacro2MD(std::vector<coupling::sendrecv::DataExchangeFromMacro2MD<dim>*>& dataExchangeFromCouplingCellServices, const Container_T& src, 56 : std::vector<Local_Container_T> dst); 57 : 58 : /** sends data from macro to MD. After returning, the data transfer may not be 59 : * completely finished, similar to a IRecv/ISend-call by MPI. Please use 60 : * wait4SendFromMacro2MD(...) to guarantee that the data transfer has been 61 : * finished. 62 : * @param dataExchange 63 : * @param cells 64 : */ 65 : template <class Container_T> void sendFromMacro2MDNonBlocking(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Container_T& cells); 66 : 67 : /** waits for the data transfer--instantiated by 68 : * sendFromMacro2MDNonBlocking(..)--to be finished and fills the information 69 : * into the coupling cells from Mamico. 70 : * @param dataExchange 71 : * @param cells 72 : */ 73 : void wait4SendFromMacro2MD(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& cells); 74 : 75 : private: 76 : /** given a coupling cell container (from the macroscopic solver), the data 77 : * from these cells are written to the send buffer. 78 : * @param dataExchange 79 : * @param cells 80 : * @param globalCellIndices 81 : */ 82 : template <class Container_T> void writeToSendBuffer(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Container_T& cells); 83 : 84 : template <class Container_T> void writeToSendBufferCollective(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Container_T& cells); 85 : 86 : /** allocates the receive buffers for the macroscopic solver. Since we want to 87 : * obtain data on the side of MaMiCo, we can just loop over all local 88 : * coupling cells of the coupling tool and call allocateReceiveBuffers(...) 89 : * of the SendReceiveBuffer for each respective cell. 90 : * @param dataExchange 91 : */ 92 : void allocateReceiveBuffers(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange); 93 : 94 : void allocateReceiveBuffersCollective(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange); 95 : 96 : /** reads information from the receive buffer and stores the result in the 97 : * coupling cells. Since this is a receive for the coupling cells on the 98 : * side of the coupling tool, we can consider a Cartesian grid topology for 99 : * the coupling cells. For each cell, readFromReceiveBuffer(...) of 100 : * SendReceiveBuffer is called. 101 : * @param dataExchange 102 : * @param cells 103 : */ 104 : void readFromReceiveBuffer(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& cells); 105 : 106 : void readFromCollectiveBuffer(coupling::sendrecv::DataExchange<Cell_T, dim>& dataExchange, const Local_Container_T& cells); 107 : }; 108 : 109 : #include "FromMacro2MD.cpph" 110 : 111 : #endif // _MOLECULARDYNAMICS_COUPLING_SENDRECV_FROMMACRO2MD_H_