SpinParser  1.0
XYZVertexTwoParticle.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 XYZVertexTwoParticleAccessBuffer
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 FrequencyChannel
48  {
49  S,
50  T,
51  U,
52  All,
53  None
54  };
55 
61  {
62  //store width in all memory dimensions
65 
68 
69  //alloc and init memory
70  _dataXX = new float[size];
71  _dataYY = new float[size];
72  _dataZZ = new float[size];
73  _dataDD = new float[size];
74  memset(_dataXX, 0, sizeof(float) * size);
75  memset(_dataYY, 0, sizeof(float) * size);
76  memset(_dataZZ, 0, sizeof(float) * size);
77  memset(_dataDD, 0, sizeof(float) * size);
78  }
79 
84  {
85  delete[] _dataXX;
86  delete[] _dataYY;
87  delete[] _dataZZ;
88  delete[] _dataDD;
89  }
90 
100  void expandIterator(int iterator, LatticeIterator &i1, float &s, float &t, float &u) const
101  {
102  ASSERT(iterator >= 0 && iterator < size);
103  ASSERT(iterator >= 0 && iterator < size);
104  ASSERT(&s != &t);
105  ASSERT(&t != &u);
106  ASSERT(&s != &u);
107 
108  int it = iterator;
109  int su = it / _memoryStepLatticeT;
110  it = it % _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(iterator >= 0 && iterator < size);
140  ASSERT(&s != &t);
141  ASSERT(&t != &u);
142  ASSERT(&s != &u);
143 
144  int su = iterator / FrgCommon::frequency().size;
146 
147  for (int so = 0; so <= su; ++so)
148  {
149  for (int uo = 0; uo <= so; ++uo)
150  {
151  if (su == so * (so + 1) / 2 + uo)
152  {
153  s = FrgCommon::frequency()._data[so];
154  u = FrgCommon::frequency()._data[uo];
155  return;
156  }
157  }
158  }
159  }
160 
168  float &getValueRef(const int iterator, const SpinComponent symmetry) const
169  {
170  if (symmetry == SpinComponent::X) return _dataXX[iterator];
171  if (symmetry == SpinComponent::Y) return _dataYY[iterator];
172  if (symmetry == SpinComponent::Z) return _dataZZ[iterator];
173  else return _dataDD[iterator];
174  }
175 
188  float getValue(LatticeIterator i1, LatticeIterator i2, float s, float t, float u, SpinComponent symmetry, const XYZVertexTwoParticle::FrequencyChannel channel) const
189  {
190  //map to positive frequency sector
191  if (s < 0 && u < 0)
192  {
193  s = -s;
194  u = -u;
195  }
196  else
197  {
198  if (s < 0)
199  {
200  s = -s;
201  std::swap(i1, i2);
202  }
203  else if (u < 0)
204  {
205  u = -u;
206  std::swap(i1, i2);
207  }
208  }
209  if (t < 0)
210  {
211  t = -t;
212  }
213 
214  int siteOffset = FrgCommon::lattice().symmetryTransform(i1, i2, symmetry);
215 
216  if (channel == FrequencyChannel::S)
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 == 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 == 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  }
270  else if (channel == FrequencyChannel::None)
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  }
298  else if (channel == FrequencyChannel::All)
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, SpinComponent symmetry, const XYZVertexTwoParticleAccessBuffer<n> &accessBuffer) const
323  {
324  int siteOffset = (accessBuffer.siteExchange) ? FrgCommon::lattice().symmetryTransform(i2, i1, symmetry) : FrgCommon::lattice().symmetryTransform(i1, i2, symmetry);
325 
326  float value = 0.0f;
327  if (symmetry == SpinComponent::X)
328  {
329  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataXX[accessBuffer.frequencyOffsets[i] + siteOffset];
330  }
331  else if (symmetry == SpinComponent::Y)
332  {
333  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataYY[accessBuffer.frequencyOffsets[i] + siteOffset];
334  }
335  else if (symmetry == SpinComponent::Z)
336  {
337  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataZZ[accessBuffer.frequencyOffsets[i] + siteOffset];
338  }
339  else
340  {
341  for (int i = 0; i < n; ++i) value += accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i] * _dataDD[accessBuffer.frequencyOffsets[i] + siteOffset];
342  }
343 
344  return value;
345  }
346 
355  template <int n> float getValueLocal(const SpinComponent symmetry, const XYZVertexTwoParticleAccessBuffer<n> &accessBuffer) const
356  {
357  float value = 0.0f;
358  if (symmetry == SpinComponent::X)
359  {
360  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataXX[accessBuffer.frequencyOffsets[i]];
361  }
362  else if (symmetry == SpinComponent::Y)
363  {
364  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataYY[accessBuffer.frequencyOffsets[i]];
365  }
366  else if (symmetry == SpinComponent::Z)
367  {
368  for (int i = 0; i < n; ++i) value += accessBuffer.frequencyWeights[i] * _dataZZ[accessBuffer.frequencyOffsets[i]];
369  }
370  else
371  {
372  for (int i = 0; i < n; ++i) value += accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i] * _dataDD[accessBuffer.frequencyOffsets[i]];
373  }
374 
375  return value;
376  }
377 
385  template <int n> void getValueSuperbundle(const XYZVertexTwoParticleAccessBuffer<n> &accessBuffer, ValueSuperbundle<float, 4> &superbundle) const
386  {
387  superbundle.reset();
389 
390  float *base[4] = { _dataXX, _dataYY, _dataZZ, _dataDD };
391 
392  for (int i = 0; i < n; ++i)
393  {
394  float weight = accessBuffer.frequencyWeights[i];
395  float signedWeight = accessBuffer.signFlag[i] * accessBuffer.frequencyWeights[i];
396  int frequencyOffset = accessBuffer.frequencyOffsets[i];
397  int size = FrgCommon::lattice().size;
398 
399  for (int j = 0; j < size; ++j)
400  {
401  superbundle.bundle(0)[j] += weight * base[static_cast<int>(sites[j].spinPermutation[0])][frequencyOffset + sites[j].rid];
402  superbundle.bundle(1)[j] += weight * base[static_cast<int>(sites[j].spinPermutation[1])][frequencyOffset + sites[j].rid];
403  superbundle.bundle(2)[j] += weight * base[static_cast<int>(sites[j].spinPermutation[2])][frequencyOffset + sites[j].rid];
404  superbundle.bundle(3)[j] += signedWeight * base[3][frequencyOffset + sites[j].rid];
405  }
406  }
407  }
408 
420  {
421  ASSERT(channel == FrequencyChannel::S || channel == FrequencyChannel::T || channel == FrequencyChannel::U);
422 
424 
425  //map to positive frequency sector
426  if (s < 0 && u < 0)
427  {
428  s = -s;
429  u = -u;
430  }
431  else
432  {
433  if (s < 0)
434  {
435  s = -s;
436  accessBuffer.siteExchange = true;
437  }
438  else if (u < 0)
439  {
440  u = -u;
441  accessBuffer.siteExchange = true;
442  }
443  }
444  if (t < 0)
445  {
446  t = -t;
447  }
448 
449  //interpolate frequency
450  if (channel == FrequencyChannel::S)
451  {
452  int exactS = FrgCommon::frequency().offset(s);
453  int lowerT, upperT;
454  float biasT;
455  int lowerU, upperU;
456  float biasU;
457  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
458  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
459 
460  accessBuffer.frequencyWeights[0] = (1 - biasU) * (1 - biasT);
461  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(exactS, lowerT, lowerU, accessBuffer.signFlag[0]);
462  accessBuffer.frequencyWeights[1] = (1 - biasU) * biasT;
463  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(exactS, upperT, lowerU, accessBuffer.signFlag[1]);
464  accessBuffer.frequencyWeights[2] = biasU * (1 - biasT);
465  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(exactS, lowerT, upperU, accessBuffer.signFlag[2]);
466  accessBuffer.frequencyWeights[3] = biasU * biasT;
467  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(exactS, upperT, upperU, accessBuffer.signFlag[3]);
468  }
469  else if (channel == FrequencyChannel::T)
470  {
471  int exactT = FrgCommon::frequency().offset(t);
472  int lowerS, upperS;
473  float biasS;
474  int lowerU, upperU;
475  float biasU;
476  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
477  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
478 
479  accessBuffer.frequencyWeights[0] = (1 - biasU) * (1 - biasS);
480  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, exactT, lowerU, accessBuffer.signFlag[0]);
481  accessBuffer.frequencyWeights[1] = (1 - biasU) * biasS;
482  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, exactT, lowerU, accessBuffer.signFlag[1]);
483  accessBuffer.frequencyWeights[2] = biasU * (1 - biasS);
484  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, exactT, upperU, accessBuffer.signFlag[2]);
485  accessBuffer.frequencyWeights[3] = biasU * biasS;
486  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, exactT, upperU, accessBuffer.signFlag[3]);
487 
488  }
489  else if (channel == FrequencyChannel::U)
490  {
491  int exactU = FrgCommon::frequency().offset(u);
492  int lowerS, upperS;
493  float biasS;
494  int lowerT, upperT;
495  float biasT;
496  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
497  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
498 
499  accessBuffer.frequencyWeights[0] = (1 - biasT) * (1 - biasS);
500  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, lowerT, exactU, accessBuffer.signFlag[0]);
501  accessBuffer.frequencyWeights[1] = (1 - biasT) * biasS;
502  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, lowerT, exactU, accessBuffer.signFlag[1]);
503  accessBuffer.frequencyWeights[2] = biasT * (1 - biasS);
504  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, upperT, exactU, accessBuffer.signFlag[2]);
505  accessBuffer.frequencyWeights[3] = biasT * biasS;
506  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, upperT, exactU, accessBuffer.signFlag[3]);
507  }
508 
509  return accessBuffer;
510  }
511 
521  {
523 
524  //map to positive frequency sector
525  if (s < 0 && u < 0)
526  {
527  s = -s;
528  u = -u;
529  }
530  else
531  {
532  if (s < 0)
533  {
534  s = -s;
535  accessBuffer.siteExchange = true;
536  }
537  else if (u < 0)
538  {
539  u = -u;
540  accessBuffer.siteExchange = true;
541  }
542  }
543  if (t < 0)
544  {
545  t = -t;
546  }
547 
548  int lowerS, upperS;
549  float biasS;
550  int lowerT, upperT;
551  float biasT;
552  int lowerU, upperU;
553  float biasU;
554 
555  FrgCommon::frequency().interpolateOffset(s, lowerS, upperS, biasS);
556  FrgCommon::frequency().interpolateOffset(t, lowerT, upperT, biasT);
557  FrgCommon::frequency().interpolateOffset(u, lowerU, upperU, biasU);
558 
559  accessBuffer.frequencyWeights[0] = (1 - biasT) * (1 - biasS) * (1 - biasU);
560  accessBuffer.frequencyOffsets[0] = _generateAccessBufferOffset(lowerS, lowerT, lowerU, accessBuffer.signFlag[0]);
561  accessBuffer.frequencyWeights[1] = (1 - biasT) * biasS * (1 - biasU);
562  accessBuffer.frequencyOffsets[1] = _generateAccessBufferOffset(upperS, lowerT, lowerU, accessBuffer.signFlag[1]);
563  accessBuffer.frequencyWeights[2] = biasT * (1 - biasS) * (1 - biasU);
564  accessBuffer.frequencyOffsets[2] = _generateAccessBufferOffset(lowerS, upperT, lowerU, accessBuffer.signFlag[2]);
565  accessBuffer.frequencyWeights[3] = biasT * biasS * (1 - biasU);
566  accessBuffer.frequencyOffsets[3] = _generateAccessBufferOffset(upperS, upperT, lowerU, accessBuffer.signFlag[3]);
567  accessBuffer.frequencyWeights[4] = (1 - biasT) * (1 - biasS) * biasU;
568  accessBuffer.frequencyOffsets[4] = _generateAccessBufferOffset(lowerS, lowerT, upperU, accessBuffer.signFlag[4]);
569  accessBuffer.frequencyWeights[5] = (1 - biasT) * biasS * biasU;
570  accessBuffer.frequencyOffsets[5] = _generateAccessBufferOffset(upperS, lowerT, upperU, accessBuffer.signFlag[5]);
571  accessBuffer.frequencyWeights[6] = biasT * (1 - biasS) * biasU;
572  accessBuffer.frequencyOffsets[6] = _generateAccessBufferOffset(lowerS, upperT, upperU, accessBuffer.signFlag[6]);
573  accessBuffer.frequencyWeights[7] = biasT * biasS * biasU;
574  accessBuffer.frequencyOffsets[7] = _generateAccessBufferOffset(upperS, upperT, upperU, accessBuffer.signFlag[7]);
575 
576  return accessBuffer;
577  }
578 
589  float _directAccessMapFrequencyExchange(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SpinComponent symmetry) const
590  {
591  ASSERT(siteOffset >= 0 && siteOffset < FrgCommon::lattice().size);
592  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
593  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
594  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
595 
596  if (sOffset >= uOffset) return _directAccess(siteOffset, sOffset, tOffset, uOffset, symmetry);
597  else
598  {
599  if (symmetry != SpinComponent::None) return _directAccess(siteOffset, uOffset, tOffset, sOffset, symmetry);
600  else return -_directAccess(siteOffset, uOffset, tOffset, sOffset, symmetry);
601  }
602  }
603 
614  float _directAccess(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SpinComponent symmetry) const
615  {
616  ASSERT(siteOffset >= 0 && siteOffset < FrgCommon::lattice().size);
617  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
618  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
619  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
620  ASSERT(sOffset >= uOffset);
621 
622  if (symmetry == SpinComponent::X) return _dataXX[_memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset];
623  if (symmetry == SpinComponent::Y) return _dataYY[_memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset];
624  if (symmetry == SpinComponent::Z) return _dataZZ[_memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset];
625  else return *(_dataDD + _memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + _memoryStepLattice * tOffset + siteOffset);
626  }
627 
637  int _generateAccessBufferOffset(const int sOffset, const int tOffset, const int uOffset, int &signFlag) const
638  {
639  ASSERT(sOffset >= 0 && sOffset < FrgCommon::frequency().size);
640  ASSERT(tOffset >= 0 && tOffset < FrgCommon::frequency().size);
641  ASSERT(uOffset >= 0 && uOffset < FrgCommon::frequency().size);
642 
643  if (sOffset < uOffset)
644  {
645  signFlag = -1;
646  return _memoryStepLatticeT * (uOffset * (uOffset + 1) / 2 + sOffset) + tOffset * _memoryStepLattice;
647  }
648  else
649  {
650  signFlag = 1;
651  return _memoryStepLatticeT * (sOffset * (sOffset + 1) / 2 + uOffset) + tOffset * _memoryStepLattice;
652  }
653  }
654 
655  int size;
657 
658  float *_dataXX;
659  float *_dataYY;
660  float *_dataZZ;
661  float *_dataDD;
664 };
XYZVertexTwoParticle::FrequencyChannel::T
@ T
t-channel.
XYZVertexTwoParticle::_directAccess
float _directAccess(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SpinComponent symmetry) const
Directly access a vertex via given frequency and site offsets, where sOffset >= uOffset.
Definition: XYZVertexTwoParticle.hpp:614
ASSERT
#define ASSERT(...)
Ensure that the first argument is true. Optionally provide a message as the second argument,...
Definition: Assert.hpp:26
LatticeSiteDescriptor::spinPermutation
SpinComponent spinPermutation[3]
Spin permutation involved in the transformation.
Definition: Lattice.hpp:160
FrgCommon::lattice
static const Lattice & lattice()
Retrieve the lattice representation.
Definition: FrgCommon.hpp:26
XYZVertexTwoParticleAccessBuffer::frequencyWeights
float frequencyWeights[size]
Weight factors of the support values.
Definition: XYZVertexTwoParticle.hpp:33
SpinComponent
SpinComponent
Component of a spin operator.
Definition: Lattice.hpp:28
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
SpinComponent::None
@ None
No spin component specified.
XYZVertexTwoParticleAccessBuffer
Buffer for frequency interpolation information.
Definition: XYZVertexTwoParticle.hpp:24
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
XYZVertexTwoParticle::getValueLocal
float getValueLocal(const SpinComponent symmetry, const XYZVertexTwoParticleAccessBuffer< n > &accessBuffer) const
Access vertex value locally at arbitrary symmetry via a given access buffer.
Definition: XYZVertexTwoParticle.hpp:355
SpinComponent::Z
@ Z
z-component of a spin.
XYZVertexTwoParticle
Two-particle vertex implementation for models with diagonal interactions.
Definition: XYZVertexTwoParticle.hpp:41
XYZVertexTwoParticle::_dataZZ
float * _dataZZ
Spin-Z channel of the vertex.
Definition: XYZVertexTwoParticle.hpp:660
XYZVertexTwoParticle::~XYZVertexTwoParticle
~XYZVertexTwoParticle()
Destroy the XYZVertexTwoParticle object.
Definition: XYZVertexTwoParticle.hpp:83
XYZVertexTwoParticle::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: XYZVertexTwoParticle.hpp:136
FrgCommon.hpp
Hub for central objects in pf-FRG calculations.
XYZVertexTwoParticle::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: XYZVertexTwoParticle.hpp:100
XYZVertexTwoParticle::FrequencyChannel::All
@ All
All channels.
XYZVertexTwoParticle::getValue
float getValue(const LatticeIterator i1, const LatticeIterator i2, SpinComponent symmetry, const XYZVertexTwoParticleAccessBuffer< n > &accessBuffer) const
Access vertex value at arbitrary lattice sites and symmetry via a given access buffer.
Definition: XYZVertexTwoParticle.hpp:322
XYZVertexTwoParticle::FrequencyChannel::U
@ U
u-channel.
XYZVertexTwoParticle::getValue
float getValue(LatticeIterator i1, LatticeIterator i2, float s, float t, float u, SpinComponent symmetry, const XYZVertexTwoParticle::FrequencyChannel channel) const
Access vertex value at arbitrary lattice sites, frequencies, and symmetry.
Definition: XYZVertexTwoParticle.hpp:188
Lattice::fromParametrization
LatticeIterator fromParametrization(const int rid) const
Retrieve iterator to the specified representative.
Definition: Lattice.hpp:359
XYZVertexTwoParticleAccessBuffer::frequencyOffsets
int frequencyOffsets[size]
Linear memory offset (number of elements) in the frequency dimensions of the two-particle vertex.
Definition: XYZVertexTwoParticle.hpp:32
XYZVertexTwoParticleAccessBuffer::siteExchange
bool siteExchange
Site exchange indicator.
Definition: XYZVertexTwoParticle.hpp:35
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.
XYZVertexTwoParticle::_directAccessMapFrequencyExchange
float _directAccessMapFrequencyExchange(const int siteOffset, const int sOffset, const int tOffset, const int uOffset, const SpinComponent symmetry) const
Directly access a vertex via given frequency and site offsets, where sOffset may be lesser than uOffs...
Definition: XYZVertexTwoParticle.hpp:589
XYZVertexTwoParticleAccessBuffer::XYZVertexTwoParticleAccessBuffer
XYZVertexTwoParticleAccessBuffer()
Construct an uninitialized XYZVertexTwoParticleAccessBuffer object.
Definition: XYZVertexTwoParticle.hpp:30
XYZVertexTwoParticle::size
int size
Size of the vertex per vertex channel (number of elements).
Definition: XYZVertexTwoParticle.hpp:655
XYZVertexTwoParticle::_dataDD
float * _dataDD
Density channel of the vertex.
Definition: XYZVertexTwoParticle.hpp:661
Exception::Type::ArgumentError
@ ArgumentError
Argument error, raised when a function is invoked with an invalid argument.
XYZVertexTwoParticle::FrequencyChannel::None
@ None
No channel.
SpinComponent::Y
@ Y
y-component of a spin.
LatticeIterator
Lattice iterator object.
Definition: Lattice.hpp:166
XYZVertexTwoParticle::_dataYY
float * _dataYY
Spin-Y channel of the vertex.
Definition: XYZVertexTwoParticle.hpp:659
XYZVertexTwoParticleAccessBuffer::signFlag
int signFlag[size]
Sign factors of the support values.
Definition: XYZVertexTwoParticle.hpp:34
XYZVertexTwoParticle::FrequencyChannel
FrequencyChannel
Indicator for frequency channels that exactly lie on frequency mesh points.
Definition: XYZVertexTwoParticle.hpp:47
XYZVertexTwoParticle::_dataXX
float * _dataXX
Spin-X channel of the vertex.
Definition: XYZVertexTwoParticle.hpp:658
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
XYZVertexTwoParticle::generateAccessBuffer
XYZVertexTwoParticleAccessBuffer< 8 > generateAccessBuffer(float s, float t, float u) const
Generate an access buffer for an arbitrary set of frequencies.
Definition: XYZVertexTwoParticle.hpp:520
XYZVertexTwoParticle::_memoryStepLatticeT
int _memoryStepLatticeT
Memory stride width in the last-2 dimension.
Definition: XYZVertexTwoParticle.hpp:662
Lattice::size
int size
Number representative sites.
Definition: Lattice.hpp:538
XYZVertexTwoParticle::sizeFrequency
int sizeFrequency
Size of the vertex per vertex channel in the frequency subspace (number of elements).
Definition: XYZVertexTwoParticle.hpp:656
LatticeSiteDescriptor
Structure to specify a symmetry-transformed lattice site.
Definition: Lattice.hpp:157
XYZVertexTwoParticle::_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: XYZVertexTwoParticle.hpp:637
ValueSuperbundle::reset
ValueSuperbundle & reset()
Write zeros to all ValueBundles.
Definition: ValueBundle.hpp:291
XYZVertexTwoParticle::getValueSuperbundle
void getValueSuperbundle(const XYZVertexTwoParticleAccessBuffer< n > &accessBuffer, ValueSuperbundle< float, 4 > &superbundle) const
Bundled vertex access on all lattice sites and symmetries simultaneously via a given access buffer.
Definition: XYZVertexTwoParticle.hpp:385
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
XYZVertexTwoParticle::_memoryStepLattice
int _memoryStepLattice
Memory stride width in the last-1 dimension.
Definition: XYZVertexTwoParticle.hpp:663
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
XYZVertexTwoParticle::XYZVertexTwoParticle
XYZVertexTwoParticle()
Construct a new XYZVertexTwoParticle object and initialize all entries to zero.
Definition: XYZVertexTwoParticle.hpp:60
LatticeSiteDescriptor::rid
int rid
Representative id of the transformed lattice site.
Definition: Lattice.hpp:159
XYZVertexTwoParticle::generateAccessBuffer
XYZVertexTwoParticleAccessBuffer< 4 > generateAccessBuffer(float s, float t, float u, const XYZVertexTwoParticle::FrequencyChannel channel) const
Generate an access buffer for a set of frequencies where one of them (specified by channel) exactly l...
Definition: XYZVertexTwoParticle.hpp:419
ValueSuperbundle
Collection of ValueBundles.
Definition: ValueBundle.hpp:240
XYZVertexTwoParticle::FrequencyChannel::S
@ S
s-channel.
XYZVertexTwoParticle::getValueRef
float & getValueRef(const int iterator, const SpinComponent symmetry) const
Directly access a vertex value via a linear iterator in the range [0,size).
Definition: XYZVertexTwoParticle.hpp:168
SpinComponent::X
@ X
x-component of a spin.