58#
if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
61 std::array<bool, 7> filteredValues = {
true})
62 : _name(name), _inputCellVector(inputCells),
63#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
66 _filteredValues(filteredValues), _isOutput(
false),
69 _timestepsElapsed(0) {
70#ifdef DEBUG_FILTER_PIPELINE
71 std::cout << PRINT_PREFIX() <<
"Now initializing." << std::endl;
76 bool filtersAnything =
false;
77 for (
unsigned int i = 0; i < 7; i++)
78 if (_filteredValues[i]) {
79 filtersAnything =
true;
83 std::cout <<
"Warning: Filter sequence " << _name
84 <<
" does not filter any values. Add 'filtered-values' "
85 "attribute to XML element to change this."
87#ifdef DEBUG_FILTER_PIPELINE
88 std::cout << PRINT_PREFIX() <<
"Finished initialization." << std::endl;
92 virtual ~FilterSequence() {
94 std::cout << PRINT_PREFIX() <<
"Average application times for filters in this sequence in \u03BCs:" << std::endl;
95 for (
auto filter : _filters) {
96 std::cout <<
" " << filter->getType() <<
": "
97 << (double)std::accumulate(_filterTimes[filter].begin(), _filterTimes[filter].end(), 0) / (double)_timestepsElapsed << std::endl;
100 for (
auto v1 : _cellVector1)
102 for (
auto v2 : _cellVector2)
104 for (
auto f : _filters)
106#ifdef DEBUG_FILTER_PIPELINE
107 std::cout << PRINT_PREFIX() <<
"Deconstructed." << std::endl;
115 void updateCellVectors() {
116 for (
unsigned int index = 0; index < _cellVector1.size(); index++) {
117 *(_cellVector1[index]) = *(_inputCellVector[index]);
118 *(_cellVector2[index]) = *(_inputCellVector[index]);
126 for (
auto filter : _filters) {
129 gettimeofday(&before, NULL);
136 gettimeofday(&after, NULL);
139 _filterTimes[filter].push_back((after.tv_sec * 1000000 + after.tv_usec) - (before.tv_sec * 1000000 + before.tv_usec));
141#ifdef DEBUG_FILTER_PIPELINE
142 std::cout << PRINT_PREFIX() <<
"Applied filter " << filter->getType() <<
". Application time: " << _filterTimes[filter].back() <<
"\u03BCs" << std::endl;
151 const char* getName() {
return _name; }
153 bool isOutputToMacro() {
return _isOutput; }
154 void setAsOutputToMacro() {
155 std::cout << PRINT_PREFIX() <<
" Setting as pipeline to macro solver output." << std::endl;
163 bool isModifiable() {
return _isModifiable; }
164 void makeUnmodifiable() { _isModifiable =
false; }
166 std::vector<coupling::filtering::FilterInterface<dim>*> getFilters() {
return _filters; }
194 virtual void addFilter(
195 const std::function<std::vector<double>(std::vector<double>, std::vector<std::array<unsigned int, dim>>)>* applyScalar,
196 const std::function<std::vector<std::array<double, dim>>(std::vector<std::array<double, dim>>, std::vector<std::array<unsigned int, dim>>)>* applyVector,
197 int filterIndex = -1);
209 _inputCellVector = newInputCellVector;
212 if (!_filters.empty())
213 _filters[0]->setInputCells(_inputCellVector);
225 virtual const std::vector<coupling::datastructures::CouplingCell<dim>*>& getOutputCellVector(
unsigned int outputIndex = 0)
const {
226 if (_filters.empty())
227 return _inputCellVector;
229 if (_filters.size() % 2 == 0)
235 virtual void printOutputCellVector()
const {
236 if (getOutputCellVector() == _inputCellVector)
237 std::cout <<
"The sequence's input cell vector ";
238 else if (getOutputCellVector() == _cellVector1)
239 std::cout <<
"Cell vector 1 ";
240 else if (getOutputCellVector() == _cellVector2)
241 std::cout <<
"Cell vector 2 ";
245 std::cout <<
"will be used as output." << std::endl;
251 virtual unsigned int getNumInputs() {
return 1; }
252 virtual unsigned int getNumOutputs() {
return 1; }
258 virtual void printFilters() {
259 std::cout <<
"Filters in sequence " << _name <<
": ";
260 for (
auto f : _filters)
261 std::cout << f->getType() <<
" ";
262 std::cout << std::endl;
265 virtual std::string PRINT_PREFIX()
const {
return std::string(
" FS(").std::string::append(_name).std::string::append(
"): "); }
276 void initCellVectors();
281 std::vector<coupling::datastructures::CouplingCell<dim>*> _inputCellVector;
282 std::vector<coupling::datastructures::CouplingCell<dim>*> _cellVector1;
283 std::vector<coupling::datastructures::CouplingCell<dim>*> _cellVector2;
285#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
289 std::array<bool, 7> _filteredValues;
295 std::vector<coupling::filtering::FilterInterface<dim>*> _filters;
298 std::map<coupling::filtering::FilterInterface<dim>*, std::vector<unsigned int>> _filterTimes;
301 unsigned int _timestepsElapsed;
305 std::vector<coupling::filtering::FilterSequence<dim>*> _childSequences;