SpinParser  1.0
SU2VertexTwoParticle.hpp
Go to the documentation of this file.
1 
9 #pragma once
10 #include <istream>
11 #include "lib/ValueBundle.hpp"
12 #include "lib/Assert.hpp"
13 #include "FrgCommon.hpp"
14 
24 template <int size> struct SU2VertexTwoParticleAccessBuffer
25 {
26 public:
31 
32  int frequencyOffsets[size];
33  float frequencyWeights[size];
34  int signFlag[size];
35  bool siteExchange;
36 };
37 
42 {
43 public:
47  enum struct Symmetry : int
48  {
49  Spin = 0,
50  Density = 1
51  };
52 
56  enum struct FrequencyChannel
57  {
58  S,
59  T,
60  U,
61  All,
62  None
63  };
64 
69  {
70  //store width in all memory dimensions
73 
76 
77  //alloc and init memory
78  _dataSS = new float[size];
79  _dataDD = new float[size];
80  memset(_dataSS, 0, sizeof(float) * size);
81  memset(_dataDD, 0, sizeof(float) * size);
82  }
83 
88  {
89  delete[] _dataSS;
90  delete[] _dataDD;
91  }
92 
102  void expandIterator(int iterator, LatticeIterator &i1, float &s, float &t, float &u) const
103  {
104  ASSERT(iterator >= 0 && iterator < size);
105  ASSERT(&s != &t);
106  ASSERT(&t != &u);
107  ASSERT(&s != &u);
108 
109  int su = iterator / _memoryStepLatticeT;
110  iterator = iterator % _memoryStepLatticeT;
113 
114  for (int so = 0; so <= su; ++so)
115  {
116  for (int uo = 0; uo <= so; ++uo)
117  {
118  if (su == so * (so + 1) / 2 + uo)
119  {
120  s = FrgCommon::frequency()._data[so];
121  u = FrgCommon::frequency()._data[uo];
122  return;
123  }
124  }
125  }
126  }
127 
136  void expandIterator(int iterator, float &s, float &t, float &u) const
137  {
138  ASSERT(iterator >= 0 && iterator < sizeFrequency);
139  ASSERT(&s != &t);
140  ASSERT(&t != &u);
141  ASSERT(&s != &u);
142 
143  int su = iterator / FrgCommon::frequency().size;
145 
146  for (int so = 0; so <= su; ++so)
147  {
148  for (int uo = 0; uo <= so; ++uo)
149  {
150  if (su == so * (so + 1) / 2 + uo)
151  {
152  s = FrgCommon::frequency()._data[so];
153  u = FrgCommon::frequency()._data[uo];
154  return;
155  }
156  }
157  }
158  }
159 
167  float &getValueRef(const int iterator, const SU2VertexTwoParticle::Symmetry symmetry) const
168  {
169  if (symmetry == SU2VertexTwoParticle::Symmetry::Spin) return _dataSS[iterator];
170  else return _dataDD[iterator];
171  }
172 
185  float getValue(LatticeIterator i1, LatticeIterator i2, float s, float t, float u, const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticle::FrequencyChannel channel) const
186  {
187  //map to positive frequency sector
188  if (s < 0 && u < 0)
189  {
190  s = -s;
191  u = -u;
192  }
193  else
194  {
195  if (s < 0)
196  {
197  s = -s;
198  LatticeIterator i3 = i1;
199  i1 = i2;
200  i2 = i3;
201  }
202  else if (u < 0)
203  {
204  u = -u;
205  LatticeIterator i3 = i1;
206  i1 = i2;
207  i2 = i3;
208  }
209  }
210  if (t < 0)
211  {
212  t = -t;
213  }
214 
215  int siteOffset = FrgCommon::lattice().symmetryTransform(i1, i2);
217  {
218  int exactS = FrgCommon::frequency().offset(s);
219 
220  int lowerT, upperT;
221  float biasT;
222  int lowerU, upperU;
223  float biasU;
224 
225  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
226  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
227 
228  return (1 - biasU) * (
229  (1 - biasT) * (_directAccessMapFrequencyExchange(siteOffset, exactS, lowerT, lowerU, symmetry)) + biasT * (_directAccessMapFrequencyExchange(siteOffset, exactS, upperT, lowerU, symmetry))
230  ) + biasU * (
231  (1 - biasT) * (_directAccessMapFrequencyExchange(siteOffset, exactS, lowerT, upperU, symmetry)) + biasT * (_directAccessMapFrequencyExchange(siteOffset, exactS, upperT, upperU, symmetry))
232  );
233  }
234  else if (channel == SU2VertexTwoParticle::FrequencyChannel::T)
235  {
236  int exactT = FrgCommon::frequency().offset(t);
237 
238  int lowerS, upperS;
239  float biasS;
240  int lowerU, upperU;
241  float biasU;
242 
243  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
244  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
245 
246  return (1 - biasU) * (
247  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, exactT, lowerU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, exactT, lowerU, symmetry))
248  ) + biasU * (
249  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, exactT, upperU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, exactT, upperU, symmetry))
250  );
251  }
252  else if (channel == SU2VertexTwoParticle::FrequencyChannel::U)
253  {
254  int exactU = FrgCommon::frequency().offset(u);
255 
256  int lowerS, upperS;
257  float biasS;
258  int lowerT, upperT;
259  float biasT;
260 
261  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
262  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
263 
264  return (1 - biasT) * (
265  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, lowerT, exactU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, lowerT, exactU, symmetry))
266  ) + biasT * (
267  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, upperT, exactU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, upperT, exactU, symmetry))
268  );
269  }
271  {
272  int lowerS, upperS;
273  float biasS;
274  int lowerT, upperT;
275  float biasT;
276  int lowerU, upperU;
277  float biasU;
278 
279  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
280  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
281  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
282 
283  return
284  (1 - biasU) * (
285  (1 - biasT) * (
286  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, lowerT, lowerU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, lowerT, lowerU, symmetry))
287  ) + biasT * (
288  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, upperT, lowerU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, upperT, lowerU, symmetry))
289  )
290  ) + biasU * (
291  (1 - biasT) * (
292  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, lowerT, upperU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, lowerT, upperU, symmetry))
293  ) + biasT * (
294  (1 - biasS) * (_directAccessMapFrequencyExchange(siteOffset, lowerS, upperT, upperU, symmetry)) + biasS * (_directAccessMapFrequencyExchange(siteOffset, upperS, upperT, upperU, symmetry))
295  )
296  );
297  }
299  {
300  int exactS = FrgCommon::frequency().offset(s);
301  int exactT = FrgCommon::frequency().offset(t);
302  int exactU = FrgCommon::frequency().offset(u);
303  return _directAccessMapFrequencyExchange(siteOffset, exactS, exactT, exactU, symmetry);
304  }
305  else
306  {
307  throw Exception(Exception::Type::ArgumentError, "Invalid interpolation channel");
308  return 0.0f;
309  }
310  }
311 
322  template <int n> float getValue(const LatticeIterator i1, const LatticeIterator i2, const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticleAccessBuffer<n> &accessBuffer) const
323  {
324  int siteOffset = (accessBuffer.siteExchange) ? FrgCommon::lattice().symmetryTransform(i2, i1) : FrgCommon::lattice().symmetryTransform(i1, i2);
325 
326  float value = 0.0f;
327  if (symmetry == SU2VertexTwoParticle::Symmetry::Spin)
328  {
329  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataSS[accessBuffer.frequencyOffsets[i] + siteOffset];
330  }
331  else
332  {
333  for (int i = 0; i < n; ++i) value += accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i] * _dataDD[accessBuffer.frequencyOffsets[i] + siteOffset];
334  }
335 
336  return value;
337  }
338 
347  template <int n> float getValueLocal(const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticleAccessBuffer<n> &accessBuffer) const
348  {
349  float value = 0.0f;
350  if (symmetry == SU2VertexTwoParticle::Symmetry::Spin)
351  {
352  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataSS[accessBuffer.frequencyOffsets[i]];
353  }
354  else
355  {
356  for (int i = 0; i < n; ++i) value += accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i] * _dataDD[accessBuffer.frequencyOffsets[i]];
357  }
358 
359  return value;
360  }
361 
369  template <int n> void getValueSuperbundle(const SU2VertexTwoParticleAccessBuffer<n> &accessBuffer, ValueSuperbundle<float, 2> &superbundle) const
370  {
371  superbundle.reset();
373 
374  for (int i = 0; i < n; ++i)
375  {
376  float weight = accessBuffer.frequencyWeights[i];
377  float signedWeight = accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i];
378  int frequencyOffset = accessBuffer.frequencyOffsets[i];
379  int size = FrgCommon::lattice().size;
380 
381  for (int j = 0; j < size; ++j)
382  {
383  superbundle.bundle(0)[j] += weight * _dataSS[frequencyOffset + sites[j].rid];
384  superbundle.bundle(1)[j] += signedWeight * _dataDD[frequencyOffset + sites[j].rid];
385  }
386  }
387  }
388 
400  {
401  ASSERT(channel == FrequencyChannel::S || channel == FrequencyChannel::T || channel == FrequencyChannel::U);
402 
404 
405  //map to positive frequency sector
406  if (s < 0 && u < 0)
407  {
408  s = -s;
409  u = -u;
410  }
411  else
412  {
413  if (s < 0)
414  {
415  s = -s;
416  accessBuffer.siteExchange = true;
417  }
418  else if (u < 0)
419  {
420  u = -u;
421  accessBuffer.siteExchange = true;
422  }
423  }
424  if (t < 0)
425  {
426  t = -t;
427  }
428 
429  //interpolate frequency
431  {
432  int exactS = FrgCommon::frequency().offset(s);
433  int lowerT, upperT;
434  float biasT;
435  int lowerU, upperU;
436  float biasU;
437  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
438  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
439 
440  accessBuffer.frequencyWeights[0] = (1 - biasU) * (1 - biasT);
441  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(exactS, lowerT, lowerU, accessBuffer.signFlag[0]);
442  accessBuffer.frequencyWeights[1] = (1 - biasU) * biasT;
443  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(exactS, upperT, lowerU, accessBuffer.signFlag[1]);
444  accessBuffer.frequencyWeights[2] = biasU * (1 - biasT);
445  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(exactS, lowerT, upperU, accessBuffer.signFlag[2]);
446  accessBuffer.frequencyWeights[3] = biasU * biasT;
447  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(exactS, upperT, upperU, accessBuffer.signFlag[3]);
448  }
449  else if (channel == SU2VertexTwoParticle::FrequencyChannel::T)
450  {
451  int exactT = FrgCommon::frequency().offset(t);
452  int lowerS, upperS;
453  float biasS;
454  int lowerU, upperU;
455  float biasU;
456  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
457  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
458 
459  accessBuffer.frequencyWeights[0] = (1 - biasU) * (1 - biasS);
460  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, exactT, lowerU, accessBuffer.signFlag[0]);
461  accessBuffer.frequencyWeights[1] = (1 - biasU) * biasS;
462  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, exactT, lowerU, accessBuffer.signFlag[1]);
463  accessBuffer.frequencyWeights[2] = biasU * (1 - biasS);
464  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, exactT, upperU, accessBuffer.signFlag[2]);
465  accessBuffer.frequencyWeights[3] = biasU * biasS;
466  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, exactT, upperU, accessBuffer.signFlag[3]);
467 
468  }
469  else if (channel == SU2VertexTwoParticle::FrequencyChannel::U)
470  {
471  int exactU = FrgCommon::frequency().offset(u);
472  int lowerS, upperS;
473  float biasS;
474  int lowerT, upperT;
475  float biasT;
476  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
477  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
478 
479  accessBuffer.frequencyWeights[0] = (1 - biasT) * (1 - biasS);
480  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, lowerT, exactU, accessBuffer.signFlag[0]);
481  accessBuffer.frequencyWeights[1] = (1 - biasT) * biasS;
482  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, lowerT, exactU, accessBuffer.signFlag[1]);
483  accessBuffer.frequencyWeights[2] = biasT * (1 - biasS);
484  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, upperT, exactU, accessBuffer.signFlag[2]);
485  accessBuffer.frequencyWeights[3] = biasT * biasS;
486  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, upperT, exactU, accessBuffer.signFlag[3]);
487  }
488 
489  return accessBuffer;
490  }
491 
501  {
503 
504  //map to positive frequency sector
505  if (s < 0 && u < 0)
506  {
507  s = -s;
508  u = -u;
509  }
510  else
511  {
512  if (s < 0)
513  {
514  s = -s;
515  accessBuffer.siteExchange = true;
516  }
517  else if (u < 0)
518  {
519  u = -u;
520  accessBuffer.siteExchange = true;
521  }
522  }
523  if (t < 0)
524  {
525  t = -t;
526  }
527 
528  int lowerS, upperS;
529  float biasS;
530  int lowerT, upperT;
531  float biasT;
532  int lowerU, upperU;
533  float biasU;
534 
535  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
536  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
537  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
538 
539  accessBuffer.frequencyWeights[0] = (1 - biasT) * (1 - biasS) * (1 - biasU);
540  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, lowerT, lowerU, accessBuffer.signFlag[0]);
541  accessBuffer.frequencyWeights[1] = (1 - biasT) * biasS * (1 - biasU);
542  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, lowerT, lowerU, accessBuffer.signFlag[1]);
543  accessBuffer.frequencyWeights[2] = biasT * (1 - biasS) * (1 - biasU);
544  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, upperT, lowerU, accessBuffer.signFlag[2]);
545  accessBuffer.frequencyWeights[3] = biasT * biasS * (1 - biasU);
546  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, upperT, lowerU, accessBuffer.signFlag[3]);
547  accessBuffer.frequencyWeights[4] = (1 - biasT) * (1 - biasS) * biasU;
548  accessBuffer.frequencyOffsets[4] = _generateAccessBufferOffset(lowerS, lowerT, upperU, accessBuffer.signFlag[4]);
549  accessBuffer.frequencyWeights[5] = (1 - biasT) * biasS * biasU;
550  accessBuffer.frequencyOffsets[5] = _generateAccessBufferOffset(upperS, lowerT, upperU, accessBuffer.signFlag[5]);
551  accessBuffer.frequencyWeights[6] = biasT * (1 - biasS) * biasU;
552  accessBuffer.frequencyOffsets[6] = _generateAccessBufferOffset(lowerS, upperT, upperU, accessBuffer.signFlag[6]);
553  accessBuffer.frequencyWeights[7] = biasT * biasS * biasU;
554  accessBuffer.frequencyOffsets[7] = _generateAccessBufferOffset(upperS, upperT, upperU, accessBuffer.signFlag[7]);
555 
556  return accessBuffer;
557  }
558 
569  float _directAccessMapFrequencyExchange(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SU2VertexTwoParticle::Symmetry symmetry) const
570  {
571  ASSERT(siteOffset >= 0 && siteOffset < FrgCommon::lattice().size);
572  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
573  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
574  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
575 
576 
577  if (sOffset >= uOffset) return _directAccess(siteOffset, sOffset, tOffset, uOffset, symmetry);
578  else
579  {
580  if (symmetry == SU2VertexTwoParticle::Symmetry::Spin) return _directAccess(siteOffset, uOffset, tOffset, sOffset, symmetry);
581  else return -_directAccess(siteOffset, uOffset, tOffset, sOffset, symmetry);
582  }
583  }
584 
595  float _directAccess(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SU2VertexTwoParticle::Symmetry symmetry) const
596  {
597  ASSERT(siteOffset >= 0 && siteOffset < FrgCommon::lattice().size);
598  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
599  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
600  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
601  ASSERT(sOffset >= uOffset);
602 
603  if (symmetry == SU2VertexTwoParticle::Symmetry::Spin) return _dataSS[_memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset];
604  else return _dataDD[_memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset];
605  }
606 
616  int _generateAccessBufferOffset(const int sOffset, const int tOffset, const int uOffset, int &signFlag) const
617  {
618  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
619  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
620  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
621 
622  if (sOffset < uOffset)
623  {
624  signFlag = -1;
625  return _memoryStepLatticeT * (uOffset * (uOffset + 1) / 2 + sOffset) + tOffset * _memoryStepLattice;
626  }
627  else
628  {
629  signFlag = 1;
630  return _memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + tOffset * _memoryStepLattice;
631  }
632  }
633 
634  int size;
636 
637  float *_dataSS;
638  float *_dataDD;
641 };
ASSERT
#define ASSERT(...)
Ensure that the first argument is true. Optionally provide a message as the second argument,...
Definition: Assert.hpp:26
SU2VertexTwoParticle::FrequencyChannel::All
@ All
All channels.
FrgCommon::lattice
static const Lattice & lattice()
Retrieve the lattice representation.
Definition: FrgCommon.hpp:26
SU2VertexTwoParticle::Symmetry::Spin
@ Spin
Spin-type vertex.
Lattice::symmetryTransform
int symmetryTransform(const LatticeIterator &i1, const LatticeIterator &i2) const
Transform a pair of lattice sites (i1,i2) and transform it to (0,i2'). The transformation may involve...
Definition: Lattice.hpp:397
SU2VertexTwoParticle::FrequencyChannel::None
@ None
No channel.
ValueBundle.hpp
Lightweight library for value arrays and collections thereof.
FrgCommon::frequency
static const FrequencyDiscretization & frequency()
Retrieve the Matsubara frequency discretization.
Definition: FrgCommon.hpp:36
SU2VertexTwoParticle::Symmetry
Symmetry
Enumeration of the different vertex channels.
Definition: SU2VertexTwoParticle.hpp:47
SU2VertexTwoParticle::sizeFrequency
int sizeFrequency
Size of the vertex per vertex channel in the frequency subspace (number of elements).
Definition: SU2VertexTwoParticle.hpp:635
SU2VertexTwoParticle::getValueRef
float & getValueRef(const int iterator, const SU2VertexTwoParticle::Symmetry symmetry) const
Directly access a vertex value via a linear iterator in the range [0,size).
Definition: SU2VertexTwoParticle.hpp:167
SU2VertexTwoParticle::FrequencyChannel
FrequencyChannel
Indicator for frequency channels that exactly lie on frequency mesh points.
Definition: SU2VertexTwoParticle.hpp:56
SU2VertexTwoParticle::getValueLocal
float getValueLocal(const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticleAccessBuffer< n > &accessBuffer) const
Access vertex value locally at arbitrary symmetry via a given access buffer.
Definition: SU2VertexTwoParticle.hpp:347
SU2VertexTwoParticle::expandIterator
void expandIterator(int iterator, float &s, float &t, float &u) const
Expand a linear iterator in the range [0,sizeFrequency) that iterates over all paramtetrized frequenc...
Definition: SU2VertexTwoParticle.hpp:136
FrgCommon.hpp
Hub for central objects in pf-FRG calculations.
Lattice::fromParametrization
LatticeIterator fromParametrization(const int rid) const
Retrieve iterator to the specified representative.
Definition: Lattice.hpp:359
SU2VertexTwoParticleAccessBuffer::SU2VertexTwoParticleAccessBuffer
SU2VertexTwoParticleAccessBuffer()
Construct an uninitialized SU2VertexTwoParticleAccessBuffer object.
Definition: SU2VertexTwoParticle.hpp:30
SU2VertexTwoParticle::_generateAccessBufferOffset
int _generateAccessBufferOffset(const int sOffset, const int tOffset, const int uOffset, int &signFlag) const
Calculate the total memory offset (number of elements) from given frequency offsets,...
Definition: SU2VertexTwoParticle.hpp:616
SU2VertexTwoParticle::generateAccessBuffer
SU2VertexTwoParticleAccessBuffer< 4 > generateAccessBuffer(float s, float t, float u, const SU2VertexTwoParticle::FrequencyChannel channel) const
Generate an access buffer for a set of frequencies where one of them (specified by channel) exactly l...
Definition: SU2VertexTwoParticle.hpp:399
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
ValueSuperbundle::bundle
ValueBundle< T > & bundle(const int m)
Return reference to ValueBundle.
Definition: ValueBundle.hpp:281
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.
SU2VertexTwoParticle::FrequencyChannel::S
@ S
s-channel.
SU2VertexTwoParticle::size
int size
Size of the vertex per vertex channel (number of elements).
Definition: SU2VertexTwoParticle.hpp:634
SU2VertexTwoParticle::SU2VertexTwoParticle
SU2VertexTwoParticle()
Construct a new SU2VertexTwoParticle object and initialize all entries to zero.
Definition: SU2VertexTwoParticle.hpp:68
Exception::Type::ArgumentError
@ ArgumentError
Argument error, raised when a function is invoked with an invalid argument.
SU2VertexTwoParticleAccessBuffer::siteExchange
bool siteExchange
Site exchange indicator.
Definition: SU2VertexTwoParticle.hpp:35
LatticeIterator
Lattice iterator object.
Definition: Lattice.hpp:166
SU2VertexTwoParticle::getValue
float getValue(LatticeIterator i1, LatticeIterator i2, float s, float t, float u, const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticle::FrequencyChannel channel) const
Access vertex value at arbitrary lattice sites, frequencies, and symmetry.
Definition: SU2VertexTwoParticle.hpp:185
SU2VertexTwoParticle::_directAccessMapFrequencyExchange
float _directAccessMapFrequencyExchange(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SU2VertexTwoParticle::Symmetry symmetry) const
Directly access a vertex via given frequency and site offsets, where sOffset may be lesser than uOffs...
Definition: SU2VertexTwoParticle.hpp:569
SU2VertexTwoParticle::FrequencyChannel::U
@ U
u-channel.
SU2VertexTwoParticle::getValueSuperbundle
void getValueSuperbundle(const SU2VertexTwoParticleAccessBuffer< n > &accessBuffer, ValueSuperbundle< float, 2 > &superbundle) const
Bundled vertex access on all lattice sites and symmetries simultaneously via a given access buffer.
Definition: SU2VertexTwoParticle.hpp:369
SU2VertexTwoParticleAccessBuffer::frequencyOffsets
int frequencyOffsets[size]
Linear memory offset (number of elements) in the frequency dimensions of the two-particle vertex.
Definition: SU2VertexTwoParticle.hpp:32
SU2VertexTwoParticle::_directAccess
float _directAccess(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SU2VertexTwoParticle::Symmetry symmetry) const
Directly access a vertex via given frequency and site offsets, where sOffset >= uOffset.
Definition: SU2VertexTwoParticle.hpp:595
SU2VertexTwoParticle::_dataDD
float * _dataDD
Density channel of the vertex.
Definition: SU2VertexTwoParticle.hpp:638
Lattice::getInvertedSites
const LatticeSiteDescriptor * getInvertedSites() const
List of two-spin correlators (i2,i1), where i1=(0,0,0,0) is the reference site and the list includes ...
Definition: Lattice.hpp:481
SU2VertexTwoParticleAccessBuffer
Buffer for frequency interpolation information.
Definition: SU2VertexTwoParticle.hpp:24
SU2VertexTwoParticleAccessBuffer::signFlag
int signFlag[size]
Sign factors of the support values.
Definition: SU2VertexTwoParticle.hpp:34
SU2VertexTwoParticle::generateAccessBuffer
SU2VertexTwoParticleAccessBuffer< 8 > generateAccessBuffer(float s, float t, float u) const
Generate an access buffer for an arbitrary set of frequencies.
Definition: SU2VertexTwoParticle.hpp:500
SU2VertexTwoParticle::expandIterator
void expandIterator(int iterator, LatticeIterator &i1, float &s, float &t, float &u) const
Expand a linear iterator in the range [0,size) that iterates over all vertex entries.
Definition: SU2VertexTwoParticle.hpp:102
SU2VertexTwoParticleAccessBuffer::frequencyWeights
float frequencyWeights[size]
Weight factors of the support values.
Definition: SU2VertexTwoParticle.hpp:33
Lattice::size
int size
Number representative sites.
Definition: Lattice.hpp:538
LatticeSiteDescriptor
Structure to specify a symmetry-transformed lattice site.
Definition: Lattice.hpp:157
SU2VertexTwoParticle::getValue
float getValue(const LatticeIterator i1, const LatticeIterator i2, const SU2VertexTwoParticle::Symmetry symmetry, const SU2VertexTwoParticleAccessBuffer< n > &accessBuffer) const
Access vertex value at arbitrary lattice sites and symmetry via a given access buffer.
Definition: SU2VertexTwoParticle.hpp:322
SU2VertexTwoParticle
Two-particle vertex implementation for SU(2) models.
Definition: SU2VertexTwoParticle.hpp:41
ValueSuperbundle::reset
ValueSuperbundle & reset()
Write zeros to all ValueBundles.
Definition: ValueBundle.hpp:291
Lattice::getSites
const LatticeSiteDescriptor * getSites() const
List of two-spin correlators (i1,i2), where i1=(0,0,0,0) is the reference site and the list includes ...
Definition: Lattice.hpp:491
SU2VertexTwoParticle::FrequencyChannel::T
@ T
t-channel.
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
SU2VertexTwoParticle::_memoryStepLatticeT
int _memoryStepLatticeT
Memory stride width in the last-2 dimension.
Definition: SU2VertexTwoParticle.hpp:639
LatticeSiteDescriptor::rid
int rid
Representative id of the transformed lattice site.
Definition: Lattice.hpp:159
SU2VertexTwoParticle::~SU2VertexTwoParticle
~SU2VertexTwoParticle()
Destroy the SU2VertexTwoParticle object.
Definition: SU2VertexTwoParticle.hpp:87
ValueSuperbundle
Collection of ValueBundles.
Definition: ValueBundle.hpp:240
SU2VertexTwoParticle::Symmetry::Density
@ Density
Density-type vertex.
SU2VertexTwoParticle::_memoryStepLattice
int _memoryStepLattice
Memory stride width in the last-1 dimension.
Definition: SU2VertexTwoParticle.hpp:640
SU2VertexTwoParticle::_dataSS
float * _dataSS
Spin channel of the vertex.
Definition: SU2VertexTwoParticle.hpp:637