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_DATAEXCHANGEFROMALLMACRO2MD_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_SENDRECV_DATAEXCHANGEFROMALLMACRO2MD_H_
7 :
8 : #include "coupling/CouplingMDDefinitions.h"
9 : #include "coupling/datastructures/CouplingCell.h"
10 : #include "coupling/indexing/IndexingService.h"
11 : #include "coupling/interface/MacroscopicSolverInterface.h"
12 : #include "coupling/sendrecv/DataExchange.h"
13 :
14 : namespace coupling {
15 : namespace sendrecv {
16 : template <unsigned int dim> class DataExchangeFromAllMacro2MD;
17 : }
18 : } // namespace coupling
19 :
20 : /** Same as _MOLECULARDYNAMICS_COUPLING_SENDRECV_DATAEXCHANGEFROMMACRO2MD_H_ but also sends on inner cells
21 : */
22 : template <unsigned int dim>
23 : class coupling::sendrecv::DataExchangeFromAllMacro2MD : public coupling::sendrecv::DataExchange<coupling::datastructures::CouplingCell<dim>, dim> {
24 :
25 : public:
26 : /** Constructor
27 : * @param interface macroscopic solver interface
28 : * @param tagoffset 0 per default
29 : */
30 4 : DataExchangeFromAllMacro2MD(coupling::interface::MacroscopicSolverInterface<dim>* interface, unsigned int topologyOffset, unsigned int tagoffset = 0)
31 4 : : coupling::sendrecv::DataExchange<coupling::datastructures::CouplingCell<dim>, dim>(TAG_FROM_MACRO2MD + tagoffset), _msi(interface),
32 4 : _topologyOffset(topologyOffset) {
33 : #if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
34 : std::cout << "DataExchangeFromAllMacro2MD initialised..." << std::endl;
35 : #endif
36 : }
37 : /** Destructor */
38 0 : virtual ~DataExchangeFromAllMacro2MD() {}
39 :
40 : /** returns the ranks to which a particular cell (at index idx)
41 : *should be sent.
42 : * @param idx
43 : * @return the corresponding ranks, if we need
44 : *information on MD side, otherwise empty vector
45 : */
46 0 : std::vector<unsigned int> getTargetRanks(I01 idx) override {
47 : // if we need information on MD side, return the respective ranks via
48 0 : if (I08::contains(idx)) {
49 0 : return IDXS.getRanksForGlobalIndex(idx, _topologyOffset);
50 : // otherwise return empty vector
51 : }
52 0 : return std::vector<unsigned int>();
53 : }
54 :
55 : /** returns all ranks from which a particular cell (at index idx)
56 : *is sent.
57 : * @param idx
58 : * @return the corresponding ranks via MacroscopicSolverInterface, if we
59 : *need information on MD side, otherwise empty vector
60 : */
61 0 : std::vector<unsigned int> getSourceRanks(I01 idx) override {
62 0 : if (I08::contains(idx)) {
63 0 : return _msi->getSourceRanks(idx);
64 : }
65 0 : return std::vector<unsigned int>();
66 : }
67 :
68 : /** local rule to read from coupling cell and write data to (e.g. send)
69 : * buffer. We only send the macroscopic mass and macroscopic momentum from MD
70 : * to the macroscopic solver.
71 : * @param buffer
72 : * @param cell
73 : */
74 0 : void readFromCell(double* const buffer, const coupling::datastructures::CouplingCell<dim>& cell) override {
75 0 : buffer[0] = cell.getMicroscopicMass();
76 0 : for (unsigned int d = 0; d < dim; d++) {
77 0 : buffer[d + 1] = cell.getMicroscopicMomentum()[d];
78 : }
79 0 : }
80 :
81 : /** local rule to read from receive buffer and write data to coupling cell
82 : * @param buffer
83 : * @param cell
84 : */
85 0 : void writeToCell(const double* const buffer, coupling::datastructures::CouplingCell<dim>& cell) override {
86 0 : tarch::la::Vector<dim, double> microscopicMomentum(0.0);
87 0 : for (unsigned int d = 0; d < dim; d++) {
88 0 : microscopicMomentum[d] = buffer[1 + d];
89 : }
90 0 : cell.setMicroscopicMomentum(microscopicMomentum);
91 0 : cell.setMicroscopicMass(buffer[0]);
92 0 : }
93 :
94 : /** returns the number of doubles that are sent per coupling cell. @return
95 : * 1+dim */
96 0 : unsigned int getDoublesPerCell() const override {
97 : // 1 double: microscopic mass; dim doubles: microscopic momentum
98 0 : return 1 + dim;
99 : }
100 :
101 : private:
102 : coupling::interface::MacroscopicSolverInterface<dim>* _msi;
103 : unsigned int _topologyOffset;
104 : };
105 : #endif // _MOLECULARDYNAMICS_COUPLING_SENDRECV_DATAEXCHANGEFROMALLMACRO2MD_H_
|