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_STRATEGY_H_ 6 : #define _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_STRATEGY_H_ 7 : 8 : #include "coupling/datastructures/CouplingCell.h" 9 : #include "coupling/interface/MDSolverInterface.h" 10 : 11 : namespace coupling { 12 : namespace transferstrategies { 13 : template <class LinkedCell, unsigned int dim> class TransferStrategy; 14 : } 15 : } // namespace coupling 16 : 17 : /** interface for transfer strategy, that is for coupling cell operations 18 : * that are carried out before/after send/recv-operations between the two 19 : * solvers, or in each MD step for sampling purposes. 20 : * @author Philipp Neumann 21 : * @tparam LinkedCell the LinkedCell class is given by the implementation of 22 : * linked cells in the molecular dynamics simulation 23 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2, 24 : * or 3 */ 25 : template <class LinkedCell, unsigned int dim> class coupling::transferstrategies::TransferStrategy { 26 : public: 27 : /** @brief a simple destructor 28 : * @param mdSolverInterface interface to md solver */ 29 4 : TransferStrategy(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface) : _mdSolverInterface(mdSolverInterface) {} 30 : 31 : /** @brief a dummy destructor */ 32 0 : virtual ~TransferStrategy() {} 33 : 34 : /** Here, you might e.g. reset all coupling cell values to zero. 35 : * This method is only applied to coupling cells that cover parts of the 36 : * MD domain; it is not applied in the outer coupling cells. 37 : * @brief is called on the inner coupling cells before the data from the 38 : * macro solver is applied 39 : * @param cell the coupling cell to apply 40 : * @param index the index of the coupling cell */ 41 0 : virtual void processInnerCouplingCellBeforeReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, 42 0 : I02 index) {} 43 : 44 : /** This method is only applied to coupling cells that cover parts of the 45 : * MD domain; it is not applied in the outer coupling cells. Is called 46 : * before the 47 : * processInnerCouplingCellBeforeReceivingMacroscopicSolverData() method 48 : * @brief the method is called before the cells are processed, e.g. general 49 : * values might be set here */ 50 0 : virtual void beginProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData() {} 51 : 52 : /** This method is only applied to coupling cells that cover parts of the 53 : * MD domain; it is not applied in the outer coupling cells. Is called 54 : * after the processInnerCouplingCellBeforeReceivingMacroscopicSolverData() 55 : * method 56 : * @brief the method is called after the cells are processed, e.g. some 57 : * general evaluation might happen like sum/counter */ 58 0 : virtual void endProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData() {} 59 : 60 : /** Here, you might e.g. reset all coupling cell values to zero. 61 : * This method is only applied to outer coupling cells that are not part 62 : * of the inner MD domain; it is not applied to the cells in the ghost layer 63 : * @brief is called on the outer coupling cells before the data from the 64 : * macro solver is applied 65 : * @param cell the coupling cell to apply 66 : * @param index the index of the coupling cell */ 67 0 : virtual void processOuterCouplingCellBeforeReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, 68 0 : I02 index) {} 69 : 70 : /** This method is only applied to coupling cells that are not part the 71 : * inner MD domain; it is not applied to the ghost layer Is called before the 72 : * processOuterCouplingCellBeforeReceivingMacroscopicSolverData() method 73 : * @brief the method is called before the outer cells are processed, e.g. 74 : * general values might be set here */ 75 0 : virtual void beginProcessOuterCouplingCellsBeforeReceivingMacroscopicSolverData() {} 76 : 77 : /** This method is only applied to coupling cells that are not part the 78 : * inner MD domain; it is not applied to the ghost layer Is called after the 79 : * processOuterCouplingCellBeforeReceivingMacroscopicSolverData() method 80 : * @brief the method is called after the outer cells are processed, e.g. 81 : * general values might be set here */ 82 0 : virtual void endProcessOuterCouplingCellsBeforeReceivingMacroscopicSolverData() {} 83 : 84 : /** These values might be manipulated within this function. Example: Mass and 85 : * momentum have been transferred from the macroscopic solver to MD, but only 86 : * the difference between MD and macroscopic solver shall be introduced to MD. 87 : * Then, this function determines this difference and stores the result again 88 : * in microscopicMass and -Momentum. This method is only applied to 89 : * coupling cells that cover parts of the MD domain; it is not applied in 90 : * the outer coupling cells. 91 : * @brieff is called for every coupling cell after the microscopicMass and 92 : * -Momentum have been filled in with data from the macroscopic solver. 93 : * @param cell the coupling cell to apply 94 : * @param index the index of the coupling cell */ 95 0 : virtual void processInnerCouplingCellAfterReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, 96 0 : I02 index) {} 97 : 98 : /** This method is only applied to coupling cells that cover parts of the 99 : * MD domain; it is not applied the outer coupling cells. Is called before 100 : * the processInnerCouplingCellAfterReceivingMacroscopicSolverData() method 101 : * @brief the method is called before the inner cells are processed, e.g. 102 : * general values might be set here */ 103 0 : virtual void beginProcessInnerCouplingCellsAfterReceivingMacroscopicSolverData() {} 104 : 105 : /** This method is only applied to coupling cells that cover parts of the 106 : * MD domain; it is not applied the outer coupling cells. Is called after 107 : * the processInnerCouplingCellAfterReceivingMacroscopicSolverData() method 108 : * @brief the method is called after the inner cells are processed, e.g. 109 : * general values might be set here */ 110 0 : virtual void endProcessInnerCouplingCellsAfterReceivingMacroscopicSolverData() {} 111 : 112 : /** These values might be manipulated within this function. Example: Mass and 113 : * momentum have been transferred from the macroscopic solver to MD, but only 114 : * the difference between MD and macroscopic solver shall be introduced to MD. 115 : * Then, this function determines this difference and stores the result again 116 : * in microscopicMass and -Momentum. This method is only applied to 117 : * coupling cells in the outer parts of the MD domain; it is not applied in 118 : * the ghost layer. 119 : * @brief is called for every coupling cell after the microscopicMass and 120 : * -Momentum have been filled in with data from the macroscopic solver. 121 : * @param cell the coupling cell to apply 122 : * @param index the index of the coupling cell */ 123 0 : virtual void processOuterCouplingCellAfterReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, 124 0 : I02 index) {} 125 : 126 : /** This method is only applied to coupling cells are part of the outer MD 127 : * domain; it is not applied the inner coupling cells. Is called before the 128 : * processOuterCouplingCellAfterReceivingMacroscopicSolverData() method 129 : * @brief the method is called before the outer cells are processed, e.g. 130 : * general values might be set here */ 131 0 : virtual void beginProcessOuterCouplingCellsAfterReceivingMacroscopicSolverData() {} 132 : 133 : /** This method is only applied to coupling cells are part of the outer MD 134 : * domain; it is not applied the inner coupling cells. Is called after the 135 : * processOuterCouplingCellAfterReceivingMacroscopicSolverData() method 136 : * @brief the method is called after the outer cells are processed, e.g. 137 : * general values might be set here */ 138 0 : virtual void endProcessOuterCouplingCellsAfterReceivingMacroscopicSolverData() {} 139 : 140 : /** Example: Compute mass and momentum and store the results in 141 : * macroscopicMass and -Momentum. The total mass and momentum from the MD 142 : * system will then be sent to the macroscopic solver. This method is only 143 : * applied to coupling cells that cover parts of the MD domain; it is not 144 : * applied in the outer coupling cells. 145 : * @brief is called for every coupling cell before sending the 146 : * macroscopicMass and -Momentum data to the macroscopic solver and before 147 : * noise reduction invocation. 148 : * @param cell the coupling cell to apply 149 : * @param index the index of the coupling cell */ 150 0 : virtual void processInnerCouplingCellBeforeSendingMDSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {} 151 : 152 : /** This method is only applied to coupling cells that cover parts of the 153 : * MD domain; it is not applied the outer coupling cells. Is called before 154 : * the processInnerCouplingCellBeforeSendingMDSolverData() method 155 : * @brief the method is called before the inner cell data is send, e.g. 156 : * general values might be set here */ 157 0 : virtual void beginProcessInnerCouplingCellsBeforeSendingMDSolverData() {} 158 : 159 : /** This method is only applied to coupling cells that cover parts of the 160 : * MD domain; it is not applied the outer coupling cells. Is called after 161 : * the processInnerCouplingCellBeforeSendingMDSolverData() method 162 : * @brief the method is called after the inner cell data is send, e.g. 163 : * general values might be set here */ 164 0 : virtual void endProcessInnerCouplingCellsBeforeSendingMDSolverData() {} 165 : 166 : /** is called for every coupling cell before sending the macroscopicMass 167 : * and -Momentum data to the macroscopic solver and before noise reduction 168 : * invocation. Example: Compute mass and momentum and store the results in 169 : * macroscopicMass and -Momentum. The total mass and momentum from the MD 170 : * system will then be sent to the macroscopic solver. This method is only 171 : * applied to outer coupling cells, that is cells that are located outside 172 : * the MD domain. 173 : * @brief is called for outer coupling cell before sending the 174 : * macroscopicMass and -Momentum data to the macroscopic solver and before 175 : * noise reduction invocation. 176 : * @param cell the coupling cell to apply 177 : * @param index the index of the coupling cell */ 178 0 : virtual void processOuterCouplingCellBeforeSendingMDSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {} 179 : 180 : /** This method is only applied to coupling cells are part of the outer MD 181 : * domain; it is not applied the inner coupling cells. Is called before the 182 : * processOuterCouplingCellBeforeSendingMDSolverData() method 183 : * @brief the method is called before the outer cells are processed, e.g. 184 : * general values might be set here */ 185 0 : virtual void beginProcessOuterCouplingCellsBeforeSendingMDSolverData() {} 186 : 187 : /** This method is only applied to coupling cells are part of the outer MD 188 : * domain; it is not applied the inner coupling cells. Is called after the 189 : * processOuterCouplingCellBeforeSendingMDSolverData() method 190 : * @brief the method is called after the outer cells are processed, e.g. 191 : * general values might be set here */ 192 0 : virtual void endProcessOuterCouplingCellsBeforeSendingMDSolverData() {} 193 : 194 : /** required to collect cell data during an MD simulation. For example, if we 195 : * need time-averaged data within a coupling cell, we can compute mass and 196 : * momentum in each timestep and add it to the microscopicMass and -Momentum 197 : * buffers. This method is only applied to coupling cells that cover parts 198 : * of the MD domain; it is not applied in the outer coupling cells. 199 : * @param cell the coupling cell to apply 200 : * @param index the index of the coupling cell */ 201 0 : virtual void processInnerCouplingCellAfterMDTimestep(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {} 202 : 203 : /** This method is only applied to coupling cells that cover parts of the 204 : * MD domain; it is not applied the outer coupling cells. Is called before 205 : * the processInnerCouplingCellAfterMDTimestep() method 206 : * @brief the method is called before the inner cell data is send, e.g. 207 : * general values might be set here */ 208 0 : virtual void beginProcessInnerCouplingCellsAfterMDTimestep() {} 209 : 210 : /** This method is only applied to coupling cells that cover parts of the 211 : * MD domain; it is not applied the outer coupling cells. Is called after 212 : * the processInnerCouplingCellAfterMDTimestep() method 213 : * @brief the method is called after the inner cell data is send, e.g. 214 : * general values might be set here */ 215 0 : virtual void endProcessInnerCouplingCellsAfterMDTimestep() {} 216 : 217 : protected: 218 : /** interface for the md solver */ 219 : coupling::interface::MDSolverInterface<LinkedCell, dim>* const _mdSolverInterface; 220 : }; 221 : #endif // _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_STRATEGY_H_