OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Stencil.cpp
Go to the documentation of this file.
1 #include "Filters/Stencil.h"
2 
3 using namespace std;
4 
5 void StencilFilter::apply(vector<double> &LineDensity) {
6  int size = LineDensity.size();
7  vector<double> temp1(size + 8, 0.0);
8  vector<double> temp2(5, 0.0);
9 
10  for(int i = 0; i < size; ++i)
11  temp1[i+4] = LineDensity[i];
12 
13  for(int i = 0; i < 4; ++ i) {
14  temp1[3-i] = temp1[5+i];
15  temp1[size+5+i] = temp1[size+3-i];
16  }
17 
18  for(int i = 0; i < size; ++i) {
19  temp2[i%5] = (7. * (temp1[i] + temp1[i+8]) + 24. * (temp1[i+2] + temp1[i+6]) + 34.*temp1[i+4]) / 96.;
20  temp1[i] = temp2[(i+1)%5];
21  }
22 
23  temp1[2] = temp1[6];
24  temp1[3] = temp1[5];
25  temp1[size+5] = temp1[size+1];
26  temp1[size+4] = temp1[size+2];
27 
28  for(int i = 0; i < size; ++i)
29  LineDensity[i] = (7. * (temp1[i+2] + temp1[i+6]) + 24. * (temp1[i+3] + temp1[i+5]) + 34.*temp1[i+4]) / 96.;
30 }
31 
32 void StencilFilter::calc_derivative(vector<double> &LineDensity, const double &h) {
33  vector<double> temp(LineDensity.begin(), LineDensity.end());
34  const double N = LineDensity.size();
35  LineDensity[0] = (-25.*temp[0] + 48.*temp[1] - 36.*temp[2] + 16.*temp[3] + temp[4]) / (12.*h);
36  LineDensity[1] = (-3.*temp[0] - 10.*temp[1] + 18.*temp[2] - 6.*temp[3] + temp[4]) / (12.*h);
37  for(int i = 2; i < N - 2; ++ i) {
38  LineDensity[i] = (temp[i-2] - 8.*temp[i-1] + 8.*temp[i+1] - temp[i+2]) / (12.*h);
39  }
40  LineDensity[N-2] = (-temp[N-5] + 6.*temp[N-4] - 18.*temp[N-3] + 10.*temp[N-2] + 3.*temp[N-1]) / (12.*h);
41  LineDensity[N-1] = (3.*temp[N-5] - 16.*temp[N-4] + 36.*temp[N-3] - 48.*temp[N-2] + 25.*temp[N-1]) / (12.*h);
42  apply(LineDensity);
43 }
void calc_derivative(std::vector< double > &histogram, const double &h)
Definition: Stencil.cpp:32
void apply(std::vector< double > &histogram)
Definition: Stencil.cpp:5