SpinParser  1.0
FrequencyDiscretization.hpp
Go to the documentation of this file.
1 
9 #pragma once
10 #include <vector>
11 #include <algorithm>
12 #include <cstdlib>
13 #include "lib/Exception.hpp"
14 #include "lib/Log.hpp"
15 #include "lib/Assert.hpp"
16 
17 #pragma region FrequencyIterator
18 
22 {
29  {
30  _pointer = p;
31  }
32 
38  float operator*() const
39  {
40  return *_pointer;
41  }
42 
49  bool operator==(const FrequencyIterator &rhs) const
50  {
51  return _pointer == rhs._pointer;
52  }
53 
60  bool operator!=(const FrequencyIterator &rhs) const
61  {
62  return _pointer != rhs._pointer;
63  }
64 
71  {
72  ++_pointer;
73  return *this;
74  }
75 
82  {
83  --_pointer;
84  return *this;
85  }
86 
93  FrequencyIterator operator+(const int rhs) const
94  {
95  return FrequencyIterator(_pointer + rhs);
96  }
97 
104  FrequencyIterator operator-(const int rhs) const
105  {
106  return FrequencyIterator(_pointer - rhs);
107  }
108 
115  bool operator>(const FrequencyIterator &rhs) const
116  {
117  return _pointer > rhs._pointer;
118  }
119 
126  bool operator>=(const FrequencyIterator &rhs) const
127  {
128  return _pointer >= rhs._pointer;
129  }
130 
138  bool operator<(const FrequencyIterator &rhs) const
139  {
140  return _pointer < rhs._pointer;
141  }
142 
149  bool operator<=(const FrequencyIterator &rhs) const
150  {
151  return _pointer <= rhs._pointer;
152  }
153 
154  float *_pointer;
155 };
156 #pragma endregion
157 
165 {
166 public:
174  FrequencyDiscretization(const std::vector<float> &values)
175  {
176  //Ensure that the frequency values are in ascending order
177  ASSERT(std::is_sorted(values.begin(), values.end()));
178 
179  //Ensure that discretization contains sufficiently many frequencies
180  if (values.size() < 2) throw Exception(Exception::Type::ArgumentError, "FrequencyDiscretization must contain at least two frequency values");
181 
182  //Allocate memory and store frequencies
183  size = int(values.size());
184  _dataNegative = new float[2 * size];
186 
187  for (int i = 0; i < size; ++i)
188  {
189  ASSERT(values[i] > 0);
190  _data[-i- 1] = -values[i];
191  _data[i] = values[i];
192  }
193 
194  Log::log << Log::LogLevel::Debug<< "Initialized frequency grid with mesh values" << Log::endl;
195  for (auto i = beginNegative(); i != end(); ++i) Log::log << "\t" << *i << Log::endl;
196  }
197 
202  {
203  delete[] _dataNegative;
204  }
205 
212  {
213  return FrequencyIterator(_data);
214  }
215 
222  {
224  }
225 
232  {
233  return FrequencyIterator(_data + size - 1);
234  }
235 
242  {
243  return FrequencyIterator(_data + size);
244  }
245 
253  FrequencyIterator lesser(const float w) const
254  {
255  if (w < 0)
256  {
257  FrequencyIterator it = greater(-w);
258  it._pointer = _data - (it._pointer - _data + 1);
259  return it;
260  }
261  else
262  {
263  if (w <= _data[0]) return FrequencyIterator(_data);
264  for (int i = 1; i < size; ++i)
265  {
266  if (_data[i] > w) return FrequencyIterator(_data + i - 1);
267  }
268  return FrequencyIterator(_data + size - 1);
269  }
270  }
271 
279  FrequencyIterator greater(const float w) const
280  {
281  if (w < 0)
282  {
283  FrequencyIterator it = lesser(-w);
284  it._pointer = _data - (it._pointer - _data + 1);
285  return it;
286  }
287  else
288  {
289  if (w <= _data[0]) return FrequencyIterator(_data);
290  for (int i = 1; i < size; ++i)
291  {
292  if (_data[i] > w) return FrequencyIterator(_data + i);
293  }
294  return FrequencyIterator(_data + size - 1);
295  }
296  }
297 
306  int offset(const float w) const
307  {
308  ASSERT(w >= 0);
309 
310  if (w <= _data[0]) return 0;
311  for (int i = 1; i < size; ++i)
312  {
313  if (_data[i] >= w) return i;
314  }
315  return size - 1;
316  }
317 
326  void interpolateOffset(const float w, int &lowerOffset, int &upperOffset, float &bias) const
327  {
328  ASSERT(w >= 0);
329  ASSERT(&lowerOffset != &upperOffset)
330 
331  if (w <= _data[0])
332  {
333  lowerOffset = 0;
334  upperOffset = 0;
335  bias = 0.0f;
336  return;
337  }
338  for (int i = 1; i < size; ++i)
339  {
340  if (_data[i] > w)
341  {
342  upperOffset = i;
343  lowerOffset = i - 1;
344  bias = (w - _data[lowerOffset]) / (_data[upperOffset] - _data[lowerOffset]);
345  return;
346  }
347  }
348  lowerOffset = size - 1;
349  upperOffset = size - 1;
350  bias = 0.0f;
351  return;
352 
353  ASSERT(lowerOffset >= 0 && lowerOffset < size);
354  ASSERT(upperOffset >= 0 && upperOffset < size);
355  ASSERT(bias >= 0.0f && bias <= 1.0f);
356  }
357 
358  int size;
359  float *_data;
360  float *_dataNegative;
361 };
ASSERT
#define ASSERT(...)
Ensure that the first argument is true. Optionally provide a message as the second argument,...
Definition: Assert.hpp:26
FrequencyIterator
Frequency iterator.
Definition: FrequencyDiscretization.hpp:21
FrequencyIterator::operator*
float operator*() const
Dereference operator.
Definition: FrequencyDiscretization.hpp:38
FrequencyDiscretization::end
FrequencyIterator end() const
Retrieve iterator to the last+1 mesh point.
Definition: FrequencyDiscretization.hpp:241
FrequencyDiscretization::beginNegative
FrequencyIterator beginNegative() const
Retrieve iterator to the first negative mesh point; This is the negative value with the largest absol...
Definition: FrequencyDiscretization.hpp:221
FrequencyIterator::operator>
bool operator>(const FrequencyIterator &rhs) const
Greater comparison operator.
Definition: FrequencyDiscretization.hpp:115
FrequencyIterator::operator--
FrequencyIterator & operator--()
Prefix decrement operator.
Definition: FrequencyDiscretization.hpp:81
FrequencyIterator::operator!=
bool operator!=(const FrequencyIterator &rhs) const
Negative iterator comparison.
Definition: FrequencyDiscretization.hpp:60
FrequencyDiscretization::_dataNegative
float * _dataNegative
Pointer to the first negative mesh point.
Definition: FrequencyDiscretization.hpp:358
FrequencyDiscretization::last
FrequencyIterator last() const
Retrieve iterator to the last mesh point; This is the positive value with the largest absolute value.
Definition: FrequencyDiscretization.hpp:231
FrequencyIterator::operator>=
bool operator>=(const FrequencyIterator &rhs) const
Greater or equal comparison operator.
Definition: FrequencyDiscretization.hpp:126
FrequencyDiscretization::~FrequencyDiscretization
~FrequencyDiscretization()
Destroy the FrequencyDiscretization object.
Definition: FrequencyDiscretization.hpp:201
FrequencyIterator::FrequencyIterator
FrequencyIterator(float *p)
Construct a new FrequencyIterator object, and initialize to a specific frequency value.
Definition: FrequencyDiscretization.hpp:28
FrequencyDiscretization::interpolateOffset
void interpolateOffset(const float w, int &lowerOffset, int &upperOffset, float &bias) const
Perform an interpolation between mesh points for an arbitrary positive frequency.
Definition: FrequencyDiscretization.hpp:326
Exception
Descriptor object for exceptions.
Definition: Exception.hpp:17
FrequencyDiscretization::FrequencyDiscretization
FrequencyDiscretization(const std::vector< float > &values)
Construct a frequency discretization based on a list of specified mesh points. The list of specified ...
Definition: FrequencyDiscretization.hpp:174
FrequencyDiscretization::_data
float * _data
Pointer to the first positive mesh point. Stored contiuously after FrequencyDiscretization::_dataNega...
Definition: FrequencyDiscretization.hpp:357
Assert.hpp
Lightweight macro library for assertions.
FrequencyIterator::operator<
bool operator<(const FrequencyIterator &rhs) const
Lesser comparison operator.
Definition: FrequencyDiscretization.hpp:138
FrequencyIterator::operator==
bool operator==(const FrequencyIterator &rhs) const
Iterator comparison.
Definition: FrequencyDiscretization.hpp:49
FrequencyDiscretization::lesser
FrequencyIterator lesser(const float w) const
Retrieve an iterator to the closest mesh point that is lesser than the specified frequency value....
Definition: FrequencyDiscretization.hpp:253
FrequencyIterator::operator-
FrequencyIterator operator-(const int rhs) const
Iterator subtraction operator.
Definition: FrequencyDiscretization.hpp:104
Exception::Type::ArgumentError
@ ArgumentError
Argument error, raised when a function is invoked with an invalid argument.
Exception.hpp
Descriptor object for exceptions.
Log.hpp
Lightweight logging interface with output filtering.
FrequencyDiscretization::begin
FrequencyIterator begin() const
Retrieve iterator to the first positive mesh point; This is the positive value with the smallest abso...
Definition: FrequencyDiscretization.hpp:211
FrequencyIterator::operator<=
bool operator<=(const FrequencyIterator &rhs) const
Lesser or equal comparison operator.
Definition: FrequencyDiscretization.hpp:149
FrequencyDiscretization::size
int size
Number of positive mesh points.
Definition: FrequencyDiscretization.hpp:356
FrequencyDiscretization::offset
int offset(const float w) const
Return the number of iterator increments of a mesh point associated with a given frequency value,...
Definition: FrequencyDiscretization.hpp:306
FrequencyDiscretization::greater
FrequencyIterator greater(const float w) const
Retrieve an iterator to the closest mesh point that is greater than the specified frequency value....
Definition: FrequencyDiscretization.hpp:279
FrequencyIterator::_pointer
float * _pointer
Pointer which the iterator currently points to.
Definition: FrequencyDiscretization.hpp:154
FrequencyIterator::operator+
FrequencyIterator operator+(const int rhs) const
Iterator addition operator.
Definition: FrequencyDiscretization.hpp:93
FrequencyDiscretization
Discretization of Matsubara frequency space.
Definition: FrequencyDiscretization.hpp:164
FrequencyIterator::operator++
FrequencyIterator & operator++()
Prefix increment operator.
Definition: FrequencyDiscretization.hpp:70