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 <vector> 7 : 8 : #define DEBUG_JUNCTOR_INTERFACE 9 : 10 : namespace coupling { 11 : namespace filtering { 12 : template <unsigned int dim, std::size_t inputc, std::size_t outputc> class JunctorInterface; 13 : } 14 : } // namespace coupling 15 : 16 : /** 17 : * Junctors are a generalization of Filters, in the sense that they can harbour 18 : * multi in- and/or outputs. This allows for filters needing multiple sets of 19 : * input data (e.g. unfiltered/prefiltered) or comparing read-only-filters. 20 : * //TODO: implement FilterJunctorReadOnly? Junctors are stored in 21 : * FilterJunctions, which generalize FilterSequences in a similar way. You can 22 : * currently not add Junctors dynamically via FFF. 23 : * 24 : * Implemenents FI. The underlying FI has the junctor's main partition's (i.e 25 : * [0] of the corresponding std::array) input/output data. (cf. lines 35, 67.) 26 : * @author Felix Maurer 27 : */ 28 : template <unsigned int dim, std::size_t inputc, std::size_t outputc> 29 : class coupling::filtering::JunctorInterface : public coupling::filtering::FilterInterface<dim> { 30 : public: 31 0 : JunctorInterface(const std::array<std::vector<coupling::datastructures::CouplingCell<dim>*>, inputc> inputCellVectors, 32 : const std::array<std::vector<coupling::datastructures::CouplingCell<dim>*>, outputc> outputCellVectors, 33 : const std::array<bool, 7> filteredValues, const char* type) 34 : : // This assumes the array of cell vectors to be nonempty. Suboptimal. 35 : // NOTE: Avoid using FI's cell vectors. Use 36 : // _inputCellVectors/_outputCellVectors instead. 37 0 : coupling::filtering::FilterInterface<dim>(inputCellVectors[0], outputCellVectors[0], filteredValues, type), _inputCellVectors(inputCellVectors), 38 0 : _outputCellVectors(outputCellVectors) { 39 : #ifdef DEBUG_JUNCTOR_INTERFACE 40 : // check input partition sizes 41 0 : for (unsigned int i = 0; i < inputc; i++) 42 0 : std::cout << " FJ: Size of input cell vector at index " << i << ": " << inputCellVectors[i].size() << std::endl; 43 0 : for (unsigned int i = 0; i < outputc; i++) 44 0 : std::cout << " FJ: Size of output cell vector at index " << i << ": " << outputCellVectors[i].size() << std::endl; 45 : 46 : #endif 47 0 : } 48 : 49 : void updateCellData(std::vector<coupling::datastructures::CouplingCell<dim>*> new_inputCellVectors[inputc], 50 : std::vector<coupling::datastructures::CouplingCell<dim>*> new_outputCellVectors[outputc], 51 : std::vector<tarch::la::Vector<dim, unsigned int>>& new_cellIndices) { 52 : std::cout << " JI: Updating cell data." << std::endl; 53 : _inputCellVectors = new_inputCellVectors; 54 : _outputCellVectors = new_outputCellVectors; 55 : 56 : // Assumes the input c-style vectors to be nonempty. May be problematic. 57 : coupling::filtering::FilterInterface<dim>::updateCellData(new_inputCellVectors[0], new_outputCellVectors[0]); 58 : } 59 : 60 : protected: 61 : /** 62 : * Unlike regular filters, junctors allow for multiple input- and output-sets 63 : */ 64 : std::array<std::vector<coupling::datastructures::CouplingCell<dim>*>, inputc> _inputCellVectors; 65 : std::array<std::vector<coupling::datastructures::CouplingCell<dim>*>, outputc> _outputCellVectors; 66 : };