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 :
6 : template <class LinkedCell, unsigned int dim>
7 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::beginProcessInnerCouplingCellsBeforeReceivingMacroscopicSolverData() {
8 : // reset sample counter
9 0 : _sampleCounter = 0;
10 0 : }
11 :
12 : template <class LinkedCell, unsigned int dim>
13 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::processInnerCouplingCellAfterReceivingMacroscopicSolverData(
14 : coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {
15 : // convert momentum to velocity values for cont->MD transfer
16 0 : if (cell.getMicroscopicMass() == 0.0) {
17 0 : cell.setMicroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
18 : } else {
19 0 : cell.setMicroscopicMomentum((1.0 / cell.getMicroscopicMass()) * cell.getMicroscopicMomentum());
20 : }
21 : // currently: no mass transfer anywhere
22 0 : cell.setMicroscopicMass(0.0);
23 : // reset macroscopic solver values (from averaging) and store old mass
24 0 : cell.setMacroscopicMass(0.0);
25 0 : cell.setMacroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
26 0 : }
27 :
28 : template <class LinkedCell, unsigned int dim>
29 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::processOuterCouplingCellAfterReceivingMacroscopicSolverData(
30 : coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {
31 0 : if (cell.getMicroscopicMass() == 0.0) {
32 0 : cell.setMicroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
33 : } else {
34 0 : cell.setMicroscopicMomentum((1.0 / cell.getMicroscopicMass()) * cell.getMicroscopicMomentum());
35 : }
36 0 : cell.setMicroscopicMass(0.0);
37 0 : cell.setMacroscopicMass(0.0);
38 0 : cell.setMacroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
39 0 : }
40 :
41 : template <class LinkedCell, unsigned int dim>
42 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::processInnerCouplingCellBeforeSendingMDSolverData(
43 : coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {
44 : #if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
45 : std::cout << "processInnerCouplingCellBeforeSendingMDSolverData(): Data "
46 : "before averaging from cell "
47 : << index << "Mass: " << cell.getMacroscopicMass() << " , momentum: " << cell.getMacroscopicMomentum() << std::endl;
48 : #endif
49 : // average sampled data from MD
50 0 : if (_sampleCounter != 0) {
51 0 : const double mass = cell.getMacroscopicMass() / ((double)_sampleCounter);
52 0 : const tarch::la::Vector<dim, double> momentum = (1.0 / ((double)_sampleCounter)) * cell.getMacroscopicMomentum();
53 0 : cell.setMacroscopicMass(mass);
54 0 : cell.setMacroscopicMomentum(momentum);
55 : } else {
56 0 : cell.setMacroscopicMass(0.0);
57 0 : cell.setMacroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
58 : }
59 : #if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
60 : std::cout << "Samplecounter=" << _sampleCounter << std::endl;
61 : std::cout << "processInnerCouplingCellBeforeSendingMDSolverData(): Data "
62 : "from cell "
63 : << index << "Mass: " << cell.getMacroscopicMass() << " , momentum: " << cell.getMacroscopicMomentum() << std::endl;
64 : #endif
65 0 : }
66 :
67 : template <class LinkedCell, unsigned int dim>
68 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::processOuterCouplingCellBeforeSendingMDSolverData(
69 : coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {
70 0 : cell.setMacroscopicMass(0.0);
71 0 : cell.setMacroscopicMomentum(tarch::la::Vector<dim, double>(0.0));
72 0 : }
73 :
74 : template <class LinkedCell, unsigned int dim>
75 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::beginProcessInnerCouplingCellsAfterMDTimestep() {
76 0 : _timestepCounter++;
77 0 : if (sample()) {
78 0 : _sampleCounter++;
79 : }
80 0 : }
81 :
82 : template <class LinkedCell, unsigned int dim>
83 0 : void coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::processInnerCouplingCellAfterMDTimestep(
84 : coupling::datastructures::CouplingCellWithLinkedCells<LinkedCell, dim>& cell, I02 index) {
85 : // averaging: evaluate current state
86 0 : if (sample()) {
87 0 : cell.iterateConstCells(_massMapping);
88 0 : const double mass = _massMapping.getMass();
89 0 : cell.iterateConstCells(_momentumMapping);
90 0 : const tarch::la::Vector<dim, double> momentum = _momentumMapping.getMomentum();
91 0 : cell.addMacroscopicMass(mass);
92 0 : cell.addMacroscopicMomentum(momentum);
93 : }
94 0 : }
95 :
96 0 : template <class LinkedCell, unsigned int dim> bool coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>::sample() const {
97 : // sample strategy: for a hard-coded time-limit, sample only over 20% of
98 : // coupling cycle
99 0 : const unsigned int timestepInThisCouplingCycle = _timestepCounter % _numberMDSteps;
100 0 : return ((timestepInThisCouplingCycle > 0.8 * _numberMDSteps - 1) && ((_timestepCounter - 1) % _sampleEveryTimestep == 0));
101 : }
|