MaMiCo 1.2
Loading...
Searching...
No Matches
FilterPipeline.h
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
19
20namespace coupling {
21namespace filtering {
22template <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 */
30enum 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 */
44template <class CellIndex_T, unsigned int dim> class coupling::filtering::FilterPipeline {
45public:
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 ~FilterPipeline() {
50 for (auto sequence : _sequences)
51 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 }
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
83private:
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
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"
Definition ParseConfiguration.h:26
provides access to the coupling cells. Base class for the class coupling::datastructures::LinkedCellC...
Definition CellContainer.h:26
Definition FilterPipeline.h:44
Definition FilterSequence.h:51
Definition ParseConfiguration.h:20
Definition MultiMDService.h:30
Definition tinyxml2.h:1268
Definition FilterPipeline.h:21
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15