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, or at
3 : // www5.in.tum.de/mamico
4 :
5 : #pragma once
6 : #include "FilterInterface.h"
7 :
8 : namespace coupling {
9 : namespace filtering {
10 : template <unsigned int dim> class FilterInterfaceReadOnly;
11 : }
12 : } // namespace coupling
13 :
14 : /*
15 : * Extension of FilterInterface.h for cases in which the filter itself does not
16 : * produce any output data. For such filters, you want to make use of
17 : * copyInputToOutput() (see below) in every filter step.
18 : *
19 : * @author Felix Maurer
20 : */
21 :
22 0 : template <unsigned int dim> class coupling::filtering::FilterInterfaceReadOnly : public coupling::filtering::FilterInterface<dim> {
23 : public:
24 0 : FilterInterfaceReadOnly(const std::vector<coupling::datastructures::CouplingCell<dim>*>& inputCellVector,
25 : const std::vector<coupling::datastructures::CouplingCell<dim>*>& outputCellVector, const std::array<bool, 7> filteredValues,
26 : const char* type)
27 0 : : coupling::filtering::FilterInterface<dim>(inputCellVector, outputCellVector, filteredValues, type) {}
28 :
29 : protected:
30 : /*
31 : * Copies all filtered data from input to output. You always want to call this
32 : * as part of any implementation of coupling::FilterInterface<dim>::operator()
33 : * when implementing this interface, that is implementing a read-only
34 : * filter (e.g WriteToFile, Storuhal) If you would not do that, the successors
35 : * of the implementing filter in a sequence would get faulty input data.
36 : */
37 0 : void copyInputToOutput() {
38 : /*
39 : * In certain cases, e.g. read-only filters that operate on secondary cells
40 : * of an AsymmetricalFilterJunction, we don't want the filter to produce any
41 : * output. Then, and only then, the output cells vector will be empty.
42 : */
43 0 : if (coupling::filtering::FilterInterface<dim>::_outputCells.empty())
44 : return;
45 :
46 0 : for (unsigned int ci = 0; ci < coupling::filtering::FilterInterface<dim>::_outputCells.size(); ci++) {
47 0 : for (const auto scalarProperty : coupling::filtering::FilterInterface<dim>::_scalarAccessFunctionPairs) {
48 0 : (coupling::filtering::FilterInterface<dim>::_outputCells[ci]->*scalarProperty.set)(
49 0 : (coupling::filtering::FilterInterface<dim>::_inputCells[ci]->*scalarProperty.get)()); // call setter from output cell
50 : // using getter from input cell.
51 : }
52 0 : for (const auto vectorProperty : coupling::filtering::FilterInterface<dim>::_vectorAccessFunctionPairs) {
53 0 : (coupling::filtering::FilterInterface<dim>::_outputCells[ci]->*vectorProperty.set)(
54 0 : (coupling::filtering::FilterInterface<dim>::_inputCells[ci]->*vectorProperty.get)()); // call setter from output cell
55 : // using getter from input cell.
56 : }
57 : }
58 : }
59 : };
|