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#ifdef DEBUG_FILTER_PIPELINE
95 if (IDXS.getRank() == 0) {
96 std::cout << PRINT_PREFIX() <<
"Average application times for filters in this sequence in \u03BCs:" << std::endl;
97 for (
auto filter : _filters) {
98 std::cout <<
" " << filter->getType() <<
": "
99 << (double)std::accumulate(_filterTimes[filter].begin(), _filterTimes[filter].end(), 0) / (double)_timestepsElapsed << std::endl;
104 for (
auto v1 : _cellVector1)
106 for (
auto v2 : _cellVector2)
108 for (
auto f : _filters)
110#ifdef DEBUG_FILTER_PIPELINE
111 std::cout << PRINT_PREFIX() <<
"Deconstructed." << std::endl;
119 void updateCellVectors() {
120 for (
unsigned int index = 0; index < _cellVector1.size(); index++) {
121 *(_cellVector1[index]) = *(_inputCellVector[index]);
122 *(_cellVector2[index]) = *(_inputCellVector[index]);
130 for (
auto filter : _filters) {
133 gettimeofday(&before, NULL);
140 gettimeofday(&after, NULL);
143 _filterTimes[filter].push_back((after.tv_sec * 1000000 + after.tv_usec) - (before.tv_sec * 1000000 + before.tv_usec));
145#ifdef DEBUG_FILTER_PIPELINE
146 std::cout << PRINT_PREFIX() <<
"Applied filter " << filter->getType() <<
". Application time: " << _filterTimes[filter].back() <<
"\u03BCs" << std::endl;
155 const char* getName() {
return _name; }
157 bool isOutputToMacro() {
return _isOutput; }
158 void setAsOutputToMacro() {
159#ifdef DEBUG_FILTER_PIPELINE
160 std::cout << PRINT_PREFIX() <<
" Setting as pipeline to macro solver output." << std::endl;
169 bool isModifiable() {
return _isModifiable; }
170 void makeUnmodifiable() { _isModifiable =
false; }
172 std::vector<coupling::filtering::FilterInterface<dim>*> getFilters() {
return _filters; }
200 virtual void addFilter(
201 const std::function<std::vector<double>(std::vector<double>, std::vector<std::array<unsigned int, dim>>)>* applyScalar,
202 const std::function<std::vector<std::array<double, dim>>(std::vector<std::array<double, dim>>, std::vector<std::array<unsigned int, dim>>)>* applyVector,
203 int filterIndex = -1);
215 _inputCellVector = newInputCellVector;
218 if (!_filters.empty())
219 _filters[0]->setInputCells(_inputCellVector);
231 virtual const std::vector<coupling::datastructures::CouplingCell<dim>*>& getOutputCellVector(
unsigned int outputIndex = 0)
const {
232 if (_filters.empty())
233 return _inputCellVector;
235 if (_filters.size() % 2 == 0)
241 virtual void printOutputCellVector()
const {
242 if (getOutputCellVector() == _inputCellVector)
243 std::cout <<
"The sequence's input cell vector ";
244 else if (getOutputCellVector() == _cellVector1)
245 std::cout <<
"Cell vector 1 ";
246 else if (getOutputCellVector() == _cellVector2)
247 std::cout <<
"Cell vector 2 ";
251 std::cout <<
"will be used as output." << std::endl;
257 virtual unsigned int getNumInputs() {
return 1; }
258 virtual unsigned int getNumOutputs() {
return 1; }
264 virtual void printFilters() {
265 std::cout <<
"Filters in sequence " << _name <<
": ";
266 for (
auto f : _filters)
267 std::cout << f->getType() <<
" ";
268 std::cout << std::endl;
271 virtual std::string PRINT_PREFIX()
const {
return std::string(
" FS(").std::string::append(_name).std::string::append(
"): "); }
282 void initCellVectors();
287 std::vector<coupling::datastructures::CouplingCell<dim>*> _inputCellVector;
288 std::vector<coupling::datastructures::CouplingCell<dim>*> _cellVector1;
289 std::vector<coupling::datastructures::CouplingCell<dim>*> _cellVector2;
291#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
295 std::array<bool, 7> _filteredValues;
301 std::vector<coupling::filtering::FilterInterface<dim>*> _filters;
304 std::map<coupling::filtering::FilterInterface<dim>*, std::vector<unsigned int>> _filterTimes;
307 unsigned int _timestepsElapsed;
311 std::vector<coupling::filtering::FilterSequence<dim>*> _childSequences;