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_TRANSFERSTRATEGY4SCHWARZCOUPLING_H_
6 : #define _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_TRANSFERSTRATEGY4SCHWARZCOUPLING_H_
7 :
8 : #include "coupling/cell-mappings/ComputeMassMapping.h"
9 : #include "coupling/cell-mappings/ComputeMomentumMapping.h"
10 : #include "coupling/transferstrategies/TransferStrategy.h"
11 :
12 : namespace coupling {
13 : namespace transferstrategies {
14 : template <class LinkedCell, unsigned int dim> class TransferStrategy4SchwarzCoupling;
15 : }
16 : } // namespace coupling
17 :
18 : /** transfer strategy for Schwarz coupling algorithm, adopted from Dupuis et al.
19 : * We currently sample over the last 20% of the coupling interval, i.e. of the
20 : * numberMDsteps time steps in MD. The other 80% are used for equilibration.
21 : * @author Philipp Neumann
22 : * @tparam LinkedCell the LinkedCell class is given by the implementation of
23 : * linked cells in the molecular dynamics simulation
24 : * @tparam dim refers to the spacial dimension of the simulation, can be 1, 2,
25 : * or 3*/
26 : template <class LinkedCell, unsigned int dim>
27 : class coupling::transferstrategies::TransferStrategy4SchwarzCoupling : public coupling::transferstrategies::TransferStrategy<LinkedCell, dim> {
28 : public:
29 : /** @brief a simple
30 : * @param mdSolverInterface interface for the md solver
31 : * @param numberMDSteps number of md time steps within one coupling time step
32 : */
33 0 : TransferStrategy4SchwarzCoupling(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface, unsigned int numberMDSteps)
34 0 : : coupling::transferstrategies::TransferStrategy<LinkedCell, dim>(mdSolverInterface), _massMapping(mdSolverInterface),
35 0 : _momentumMapping(mdSolverInterface), _timestepCounter(0), _sampleCounter(0), _numberMDSteps(numberMDSteps), _sampleEveryTimestep(1) {}
36 :
37 : /** @brief a dummy destructor*/
38 0 : virtual ~TransferStrategy4SchwarzCoupling() {}
39 :
40 : /** @brief the sample counter is reseted (0)*/
41 : void beginProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData() override;
42 :
43 : /** the momentum is converted to velocity (velocity = momentum/mass) and
44 : * stored in the microscopicMomentum the mass is not applied, therefore the
45 : * macroscopicMass is set to 0 the macroscopic quantities are reseted (0)
46 : * @brief the data received from the macro solver is processed
47 : * @param cell the coupling cell to be processed
48 : * @param index the index of the coupling cell */
49 : void processInnerCouplingCellAfterReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell,
50 : I02 index) override;
51 :
52 : /** @brief the momentum is converted to velocity (velocity = momentum/mass)
53 : * and stored in the microscopicMomentum the mass is not applied, therefore
54 : * the macroscopicMass is set to 0 the macroscopic quantities are reseted (0)
55 : * @brief the data received from the macro solver is processed
56 : * @param cell the coupling cell to be processed
57 : * @param index the index of the coupling cell */
58 : void processOuterCouplingCellAfterReceivingMacroscopicSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell,
59 : I02 index) override;
60 :
61 : /** @brief the data collected during the md time steps is averaged
62 : * (/numberMDSteps)
63 : * @param cell the coupling cell to be processed
64 : * @param index the index of the coupling cell */
65 : void processInnerCouplingCellBeforeSendingMDSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) override;
66 :
67 : /** @brief the macroscopic quantities are reseted (0)
68 : * @param cell the coupling cell to be processed
69 : * @param index the index of the coupling cell */
70 : void processOuterCouplingCellBeforeSendingMDSolverData(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) override;
71 :
72 : /** @brief the _timestepCounter is incremented and if sample()==true the
73 : * _sampleCounter too */
74 : void beginProcessInnerCouplingCellsAfterMDTimestep() override;
75 :
76 : /** @brief the mass and momentum are evaluated in the cell and stored in the
77 : * macroscopic quantities
78 : * @param cell the coupling cell to be processed
79 : * @param index the index of the coupling cell */
80 : void processInnerCouplingCellAfterMDTimestep(coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) override;
81 :
82 : protected:
83 : /** @brief depending on the sampling interval (_sampleEveryTimestep) true is
84 : * returned if sampling has to be done in the current time step */
85 : virtual bool sample() const;
86 :
87 : private:
88 : /** computes the mass in every single cell */
89 : coupling::cellmappings::ComputeMassMapping<LinkedCell, dim> _massMapping;
90 : /** computes the momentum in every single cell */
91 : coupling::cellmappings::ComputeMomentumMapping<LinkedCell, dim> _momentumMapping;
92 : /** counter for the time steps */
93 : unsigned int _timestepCounter;
94 : /** counter for the samples */
95 : unsigned int _sampleCounter;
96 : /** number of md time steps within one coupling time step */
97 : const unsigned int _numberMDSteps;
98 : /** the interval of sample point; 1 means every md time step is sampled; 10
99 : * means every 10th is used */
100 : const int _sampleEveryTimestep;
101 : };
102 : #include "coupling/transferstrategies/TransferStrategy4SchwarzCoupling.cpph"
103 :
104 : #endif // _MOLECULARDYNAMICS_COUPLING_TRANSFERSTRATEGIES_TRANSFERSTRATEGY4SCHWARZCOUPLING_H_
|