ESyS-Particle  2.2
LinearWindowAverager.h
Go to the documentation of this file.
1 
2 // //
3 // Copyright (c) 2003-2013 by The University of Queensland //
4 // Earth Systems Science Computational Centre (ESSCC) //
5 // http://www.uq.edu.au/esscc //
6 // //
7 // Primary Business: Brisbane, Queensland, Australia //
8 // Licensed under the Open Software License version 3.0 //
9 // http://www.opensource.org/licenses/osl-3.0.php //
10 // //
12 
13 
14 #ifndef ESYS_LSMLINEARWINDOWAVERAGER_H
15 #define ESYS_LSMLINEARWINDOWAVERAGER_H
16 
17 #include <cstdlib>
18 #include "Foundation/vec3.h"
19 
20 #include <vector>
21 
22 namespace esys
23 {
24  namespace lsm
25  {
27  {
28  public:
29  typedef std::vector<double> ValueVector;
30 
32  const ValueVector &valVector,
33  int halfWindowSize,
34  int beginIndex,
35  int endIndex,
36  int skipSize
37  )
38  :
39  m_valVector(valVector),
40  m_avValVector(),
41  m_halfWindowSize(halfWindowSize),
42  m_beginIndex(beginIndex),
43  m_endIndex(min(endIndex, static_cast<int>(valVector.size()))),
44  m_skipSize(skipSize)
45  {
46  }
47 
49  {
50  if (m_avValVector.size() <= 0) {
52  }
53  return m_avValVector;
54  }
55 
56  protected:
58  {
59  m_avValVector.clear();
60  const int halfWindowSize = max(0, m_halfWindowSize);
61  for (int i = m_beginIndex; i < m_endIndex; i += m_skipSize)
62  {
63  double avSum = 0.0;
64  double weightSum = 0.0;
65  const int endJ = min(static_cast<int>(m_valVector.size()), i + halfWindowSize+1);
66  for (int j = max(0, i - halfWindowSize); j < endJ; j++)
67  {
68  const double weight = (1.0 - (static_cast<double>(abs(i-j))/(halfWindowSize+1)));
69  weightSum += weight;
70  avSum += weight*m_valVector[j];
71  }
72  m_avValVector.push_back(avSum/weightSum);
73  }
74  }
75 
76  private:
83  };
84  }
85 }
86 
87 #endif