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 : 7 : // #define DEBUG_FILTER_PIPELINE 8 : #define POST_MULTI_INSTANCE_FILTERING_YES true 9 : #define POST_MULTI_INSTANCE_FILTERING_NO false 10 : 11 : // include dependencies 12 : #include "coupling/filtering/sequencing/AsymmetricalFilterJunction.h" 13 : #include "coupling/filtering/sequencing/FilterJunction.h" 14 : #include "coupling/filtering/sequencing/FilterSequence.h" 15 : #include "tarch/configuration/ParseConfiguration.h" 16 : #include "tarch/tinyxml2/tinyxml2.h" 17 : 18 : using tarch::configuration::ParseConfiguration; 19 : 20 : namespace coupling { 21 : namespace filtering { 22 : template <class CellIndex_T, unsigned int dim> class FilterPipeline; 23 : 24 : /* 25 : * Used as member of FilterPipeline. Displays where that FP is used. 26 : * per instance: apply filtering for each MD instance 27 : * individually, before merging instances post multi instance: apply filtering 28 : * after MD instances have been merged 29 : */ 30 : enum class Scope { perInstance, postMultiInstance }; 31 : } // namespace filtering 32 : } // namespace coupling 33 : 34 : /* 35 : * Manages different branches of filtering sequences. 36 : * These filtering sequences may be interdependant by using another's sequences 37 : * input or completely isolated. As this entire filtering process is applied 38 : * during MD to Macro communication, it uses the MD simulation's output 39 : * Macro-Cells as input and output. All configuration is made using an 40 : * XML-config file and does not require recompilation when modified. 41 : * 42 : * @author Felix Maurer 43 : */ 44 : template <class CellIndex_T, unsigned int dim> class coupling::filtering::FilterPipeline { 45 : public: 46 : FilterPipeline(const coupling::datastructures::CellContainer<CellIndex_T, dim> inputCells, const coupling::filtering::Scope scope, 47 : const tarch::utils::MultiMDService<dim>& multiMDService, const char* cfgpath); 48 : 49 0 : ~FilterPipeline() { 50 0 : for (auto sequence : _sequences) 51 0 : delete sequence; 52 : // TODO: do i have to delete the _...cells as well? 53 : 54 : #ifdef DEBUG_FILTER_PIPELINE 55 : std::cout << "FP: FilterPipeline deconstructed." << std::endl; 56 : #endif 57 0 : } 58 : 59 : /* 60 : * Applies each FilterSequence in order of their appearance in the config 61 : * file. Ouput of the specified output-FilterSequence will be written to 62 : * _md2MacroCells. 63 : * 64 : * @returns The runtime of the filter pipeline in usec. 65 : */ 66 : double operator()(); 67 : 68 : /* 69 : * Getters for FilterSequences. 70 : * Not that Junction is a subtype of Sequence, so this is how to get Junctions 71 : * as well. 72 : */ 73 : coupling::filtering::FilterSequence<dim>* getSequence(const char* identifier) const; 74 : std::vector<coupling::filtering::FilterSequence<dim>*> getAllSequences() const { return _sequences; } 75 : 76 : #if (COUPLING_MD_PARALLEL == COUPLING_MD_YES) 77 : /* 78 : * Get MPI communicator used by all parallel filters. 79 : */ 80 : MPI_Comm getFilteringCommunicator() { return _comm; }; 81 : #endif 82 : 83 : private: 84 : /* 85 : * Detects errors in XML config file. 86 : */ 87 : bool configIsValid(ParseConfiguration::XMLConfiguration& xmlConfig); 88 : 89 : /* 90 : * Interprets configuration of sequences and intializes them. Parameters 91 : * known: 92 : * -"input": Name of another FilterSequence previously defined (optional, 93 : * uses MD output (i.e. _md2MacroCells) by default) 94 : * 95 : * Also detects which sequence will be used as output to this FilterPipeline. 96 : */ 97 : void loadSequencesFromXML(tinyxml2::XMLElement* metaNode); 98 : 99 : /* 100 : * Input cells within the local, md2macro, ghost layer excluding domain 101 : */ 102 : std::vector<coupling::datastructures::CouplingCell<dim>*> _md2MacroCells; 103 : /* 104 : * Input cells that do not match the criteria to be in _md2MacroCells. 105 : */ 106 : std::vector<coupling::datastructures::CouplingCell<dim>*> _outerCells; 107 : 108 : ParseConfiguration::XMLConfiguration _config; 109 : 110 : /* 111 : * Scope in which this FilterPipeline is applied. Cf. coupling::Scope 112 : * definition. 113 : */ 114 : const coupling::filtering::Scope _scope; 115 : 116 : std::vector<coupling::filtering::FilterSequence<dim>*> _sequences; 117 : 118 : #if (COUPLING_MD_PARALLEL == COUPLING_MD_YES) 119 : MPI_Comm _comm; 120 : #endif 121 : }; 122 : 123 : // include implementation of header 124 : #include "FilterPipeline.cpph"