MaMiCo 1.2
Loading...
Searching...
No Matches
TransferStrategyConfiguration.h
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_CONFIGURATIONS_STRATEGYCONFIGURATION_H_
6#define _MOLECULARDYNAMICS_COUPLING_CONFIGURATIONS_STRATEGYCONFIGURATION_H_
7
8#include "coupling/transferstrategies/AveragingTransferStrategy.h"
9#include "coupling/transferstrategies/DifferenceTransferStrategy.h"
10#include "coupling/transferstrategies/DirectTransferStrategy.h"
11#include "coupling/transferstrategies/TransferStrategy.h"
12#include "coupling/transferstrategies/TransferStrategy4NieCoupling.h"
13#include "coupling/transferstrategies/TransferStrategy4SchwarzCoupling.h"
14#include "tarch/configuration/Configuration.h"
15#include "tarch/configuration/ParseConfiguration.h"
16#include "tarch/la/Vector.h"
17#include <iostream>
18
19namespace coupling {
20namespace configurations {
21template <unsigned int dim> class TransferStrategyConfiguration;
22}
23} // namespace coupling
24
35public:
47
49 TransferStrategyConfiguration() : _type(DirectTransferStrategy), _massFluxBoundary(false), _isValid(true) {}
50
53
58 std::string value;
60 if (value == "direct-transfer") {
62 } else if (value == "difference-transfer") {
64 } else if (value == "schwarz-transfer") {
66 } else if (value == "nie-transfer") {
68 } else if (value == "averaging") {
70 } else {
71 std::cout << "ERROR coupling::TransferStrategyConfiguration: Wrong "
72 "insertion type!"
73 << std::endl;
74 _isValid = false;
75 exit(EXIT_FAILURE);
76 }
77
78 if (_type == TransferStrategy4NieCoupling) {
79 const std::string boundaries[6] = {"mass-flux-west", "mass-flux-east", "mass-flux-south", "mass-flux-north", "mass-flux-bottom", "mass-flux-top"};
80 for (unsigned int d = 0; d < 2 * dim; d++) {
81 tarch::configuration::ParseConfiguration::readBoolMandatory(_massFluxBoundary[d], node, boundaries[d]);
82 }
83 // by default: no shifting of time interval
84 _shiftTimestep = 0.0;
85 tarch::configuration::ParseConfiguration::readDoubleOptional(_shiftTimestep, node, "shift-by-timesteps");
86 if (_shiftTimestep < 0.0 || _shiftTimestep > 1.0) {
87 std::cout << "Warning "
88 "coupling::configurations::TransferStrategyConfiguration: "
89 "shift-by-timesteps="
90 << _shiftTimestep << "; typical values range between 0 and 1!" << std::endl;
91 }
92 }
93 }
94
98 std::string getTag() const { return "transfer-strategy"; }
99
108 bool isValid() const { return _isValid; }
109
116 template <class LinkedCell>
118 interpreteConfiguration(coupling::interface::MDSolverInterface<LinkedCell, dim>* const mdSolverInterface, unsigned int numberOfMDTimesteps) const {
119 if (_type == DirectTransferStrategy) {
121 } else if (_type == DifferenceTransferStrategy) {
122 return new coupling::transferstrategies::DifferenceTransferStrategy<LinkedCell, dim>(mdSolverInterface, numberOfMDTimesteps);
123 } else if (_type == TransferStrategy4SchwarzCoupling) {
124 return new coupling::transferstrategies::TransferStrategy4SchwarzCoupling<LinkedCell, dim>(mdSolverInterface, numberOfMDTimesteps);
125 } else if (_type == TransferStrategy4NieCoupling) {
126 return new coupling::transferstrategies::TransferStrategy4NieCoupling<LinkedCell, dim>(mdSolverInterface, numberOfMDTimesteps, _shiftTimestep,
127 _massFluxBoundary);
128 } else if (_type == AveragingTransferStrategy) {
130 } else {
131 return NULL;
132 }
133 }
134
138 StrategyType getStrategyType() const { return _type; }
139
140protected:
141 TransferStrategyConfiguration(StrategyType type, tarch::la::Vector<2 * dim, bool> massFluxBoundary, double shiftTimestep)
142 : _type(type), _massFluxBoundary(massFluxBoundary), _shiftTimestep(shiftTimestep), _isValid(true) {}
143
144private:
145 StrategyType _type;
146 tarch::la::Vector<2 * dim, bool> _massFluxBoundary; // true in each component, if one of the 2*dim
147 // boundaries allows for mass flux
148 double _shiftTimestep; // used for Nie coupling: time interval by which the
149 // evaluation of the continuum flow field should be
150 // shifted. See also TransferStrategy4NieCoupling for
151 // more details.
152
153 bool _isValid;
154};
155
156#endif // _MOLECULARDYNAMICS_COUPLING_CONFIGURATIONS_STRATEGYCONFIGURATION_H_
transfer strategy configuration, i.e. algorithm/combin. of quantity transfer steps and quantity inter...
Definition TransferStrategyConfiguration.h:34
StrategyType
Definition TransferStrategyConfiguration.h:39
@ AveragingTransferStrategy
Definition TransferStrategyConfiguration.h:44
@ TransferStrategy4NieCoupling
Definition TransferStrategyConfiguration.h:45
@ DifferenceTransferStrategy
Definition TransferStrategyConfiguration.h:41
@ TransferStrategy4SchwarzCoupling
Definition TransferStrategyConfiguration.h:43
@ TransferStrategy4FluxCoupling
Definition TransferStrategyConfiguration.h:42
@ DirectTransferStrategy
Definition TransferStrategyConfiguration.h:40
coupling::transferstrategies::TransferStrategy< LinkedCell, dim > * interpreteConfiguration(coupling::interface::MDSolverInterface< LinkedCell, dim > *const mdSolverInterface, unsigned int numberOfMDTimesteps) const
Definition TransferStrategyConfiguration.h:118
void parseSubtag(tinyxml2::XMLElement *node)
Definition TransferStrategyConfiguration.h:57
bool isValid() const
Definition TransferStrategyConfiguration.h:108
virtual ~TransferStrategyConfiguration()
Definition TransferStrategyConfiguration.h:52
std::string getTag() const
Definition TransferStrategyConfiguration.h:98
StrategyType getStrategyType() const
Definition TransferStrategyConfiguration.h:138
TransferStrategyConfiguration()
Definition TransferStrategyConfiguration.h:49
interface to the MD simulation
Definition MDSolverInterface.h:25
Definition AveragingTransferStrategy.h:32
Definition DifferenceTransferStrategy.h:29
Definition DirectTransferStrategy.h:28
Definition TransferStrategy4NieCoupling.h:29
Definition TransferStrategy4SchwarzCoupling.h:27
Definition TransferStrategy.h:25
Definition Configuration.h:22
static void readBoolMandatory(bool &storage, tinyxml2::XMLElement *node, std::string tag)
Definition ParseConfiguration.h:151
static void readStringMandatory(std::string &storage, tinyxml2::XMLElement *node, std::string tag)
Definition ParseConfiguration.h:201
static void readDoubleOptional(double &storage, tinyxml2::XMLElement *node, std::string tag)
Definition ParseConfiguration.h:96
Definition Vector.h:24
Definition tinyxml2.h:1268
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15