Line data Source code
1 : // This file is part of the Mamico project. For conditions of distribution
2 : // and use, please see the copyright notice in Mamico's main folder
3 :
4 : #pragma once
5 : #include "coupling/filtering/interfaces/FilterInterface.h"
6 : #include <algorithm>
7 : #include <vector>
8 :
9 : namespace coupling {
10 : namespace filtering {
11 : template <unsigned int dim> class Constant;
12 : }
13 : } // namespace coupling
14 :
15 : /**
16 : * Filter applying a constant floating point value to all cells for all filtered
17 : * values. Optionally, one can specify to apply this filter only to certain
18 : * directions of multidimensional cell properties.
19 : *
20 : * @author Felix Maurer
21 : */
22 :
23 : template <unsigned int dim> class coupling::filtering::Constant : public coupling::filtering::FilterInterface<dim> {
24 : public:
25 0 : Constant(const std::vector<coupling::datastructures::CouplingCell<dim>*>& inputCellVector,
26 : const std::vector<coupling::datastructures::CouplingCell<dim>*>& outputCellVector, const std::array<bool, 7> filteredValues,
27 : const tarch::la::Vector<dim, bool> filteredDims, const double constant)
28 0 : : coupling::filtering::FilterInterface<dim>(inputCellVector, outputCellVector, filteredValues, "Constant"), _constant(constant),
29 0 : _filteredDims(filteredDims) {}
30 :
31 0 : void operator()() {
32 0 : tarch::la::Vector<dim, double> vec_buf;
33 0 : for (unsigned int i = 0; i < this->_inputCells.size(); ++i) {
34 : // apply to scalars
35 0 : for (auto scalarProperty : FilterInterface<dim>::_scalarAccessFunctionPairs) {
36 0 : (FilterInterface<dim>::_outputCells[i]->*scalarProperty.set)(_constant);
37 : }
38 :
39 : // apply to vectors
40 0 : for (auto vectorProperty : FilterInterface<dim>::_vectorAccessFunctionPairs) {
41 : // TODO: perhaps check if _filteredDims == true,..,true before this for
42 : // performance reasons?
43 0 : vec_buf = (FilterInterface<dim>::_inputCells[i]->*vectorProperty.get)();
44 :
45 0 : for (unsigned int d = 0; d < dim; d++) {
46 0 : if (_filteredDims[d])
47 0 : vec_buf[d] = _constant;
48 : }
49 :
50 0 : (FilterInterface<dim>::_outputCells[i]->*vectorProperty.set)(vec_buf);
51 : }
52 : }
53 0 : }
54 :
55 : private:
56 : const double _constant;
57 : const tarch::la::Vector<dim, bool> _filteredDims;
58 : };
|