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 "coupling/CouplingMDDefinitions.h" 7 : #include "coupling/filtering/interfaces/FilterInterface.h" 8 : #include "coupling/indexing/IndexingService.h" 9 : #include <mpi.h> 10 : 11 : #define FILTER_SEQUENTIAL true 12 : #define FILTER_PARALLEL false 13 : 14 : // #define DEBUG_SEQ_FILTER 15 : // #define DEBUG_SEQ_FILTER_VERBOSE 16 : 17 : namespace coupling { 18 : namespace filtering { 19 : template <unsigned int dim> class SequentialFilter; 20 : } 21 : } // namespace coupling 22 : 23 : /* 24 : * Implementation of FilterInterface.h for filters which operate in a sequential 25 : * manner, i.e. process data on one master rank. For such filters, operator()() 26 : * will 27 : * - contribute to one dedicated processing rank: by calling 28 : * contribute() 29 : * - process on master rank only and then scatter data correctly: 30 : * by calling process() 31 : * 32 : * Meant to be used as a wrapper class, i.e. take a pointer to a filter object 33 : * and then sequentualizes it. Used in 34 : * coupling::FilterSequence<dim>::loadFiltersFromXML. 35 : * 36 : * Disclaimer: Sequential filters be added to a sequence via XML only. This 37 : * implies FFF with e.g. a python function is not compatible. 38 : * 39 : * @author Felix Maurer 40 : */ 41 : template <unsigned int dim> class coupling::filtering::SequentialFilter : public coupling::filtering::FilterInterface<dim> { 42 : public: 43 : SequentialFilter(coupling::filtering::FilterInterface<dim>* filter, const MPI_Comm comm); 44 : 45 0 : ~SequentialFilter() { 46 0 : delete _filter; 47 0 : for (auto cell : _inputCells_Global) 48 0 : delete cell; 49 0 : for (auto cell : _outputCells_Global) 50 0 : delete cell; 51 0 : } 52 : 53 : /* 54 : * Implements FilterInterface's requirement of having a ()-operand defined. 55 : */ 56 : virtual void operator()(); 57 : 58 : private: 59 : /* 60 : * When sequentialized, all ranks call this function. 61 : */ 62 : virtual void contribute(); 63 : 64 : /* 65 : * When sequentialized, only the processing rank calls this function. It acts 66 : * as a wrapper of _filter's operator() member function. 67 : */ 68 : virtual void process(bool sequential); 69 : 70 : /* 71 : * Auxilliary functions providing an interface between low-level double 72 : * buffers used by MPI and Coupling Cells. 73 : */ 74 : void couplingCellToBuffer(std::vector<double>& buf, const coupling::datastructures::CouplingCell<dim>* cell); 75 : 76 : void bufferToCouplingCell(const std::vector<double>& buf, coupling::datastructures::CouplingCell<dim>* cell); 77 : 78 : // The sequentialized Filter 79 : coupling::filtering::FilterInterface<dim>* _filter; 80 : 81 : // MPI related stuff 82 : const MPI_Comm _comm; 83 : int _commSize; 84 : int _processingRank; 85 : int _myRank; 86 : 87 : // Globalized variants of cell data structures (i.e spanning across all cells 88 : // of the global domain). Only the master rank uses these. 89 : std::vector<coupling::datastructures::CouplingCell<dim>*> _inputCells_Global; 90 : std::vector<coupling::datastructures::CouplingCell<dim>*> _outputCells_Global; 91 : 92 : // Used by the processing rank to remember from which rank it received cells 93 : // located at which global index TODO: use CellIndex? 94 : std::vector<unsigned int> _cellRanks; 95 : 96 : // Buffers coupling cells for MPI communication 97 : std::vector<double> _cellbuf; 98 : 99 : // Used by the processing rank to remember its local domain 100 : std::vector<coupling::datastructures::CouplingCell<dim>*> _inputCells_Local; 101 : std::vector<coupling::datastructures::CouplingCell<dim>*> _outputCells_Local; 102 : }; 103 : 104 : #include "SequentialFilter.cpph"