Grid 0.7.0
GparityFlavour.h
Go to the documentation of this file.
1#ifndef GRID_QCD_GPARITY_FLAVOUR_H
2#define GRID_QCD_GPARITY_FLAVOUR_H
3
4//Support for flavour-matrix operations acting on the G-parity flavour index
6#include <array>
7
9
11 public:
12 GRID_SERIALIZABLE_ENUM(Algebra, undef,
13 SigmaX, 0,
14 MinusSigmaX, 1,
15 SigmaY, 2,
16 MinusSigmaY, 3,
17 SigmaZ, 4,
18 MinusSigmaZ, 5,
19 Identity, 6,
20 MinusIdentity, 7,
21 ProjPlus, 8,
22 MinusProjPlus, 9,
23 ProjMinus, 10,
24 MinusProjMinus, 11
25 );
26 static constexpr unsigned int nSigma = 12;
27 static const std::array<const char *, nSigma> name;
28 static const std::array<const GparityFlavour, 3> sigma_mu;
29 static const std::array<const GparityFlavour, 6> sigma_all;
30 Algebra g;
31 public:
32 accelerator GparityFlavour(Algebra initg): g(initg) {}
33};
34
35
36
37// 0 1 x vector
38// 1 0
39template<class vtype>
41{
42 ret(0) = rhs(1);
43 ret(1) = rhs(0);
44};
45template<class vtype>
47{
48 ret(0,0) = rhs(1,0);
49 ret(0,1) = rhs(1,1);
50 ret(1,0) = rhs(0,0);
51 ret(1,1) = rhs(0,1);
52};
53template<class vtype>
55{
56 ret(0,0) = rhs(0,1);
57 ret(0,1) = rhs(0,0);
58 ret(1,0) = rhs(1,1);
59 ret(1,1) = rhs(1,0);
60};
61
62
63template<class vtype>
65{
66 ret(0) = -rhs(1);
67 ret(1) = -rhs(0);
68};
69template<class vtype>
71{
72 ret(0,0) = -rhs(1,0);
73 ret(0,1) = -rhs(1,1);
74 ret(1,0) = -rhs(0,0);
75 ret(1,1) = -rhs(0,1);
76};
77template<class vtype>
79{
80 ret(0,0) = -rhs(0,1);
81 ret(0,1) = -rhs(0,0);
82 ret(1,0) = -rhs(1,1);
83 ret(1,1) = -rhs(1,0);
84};
85
86
87
88
89
90// 0 -i x vector
91// i 0
92template<class vtype>
94{
95 ret(0) = timesMinusI(rhs(1));
96 ret(1) = timesI(rhs(0));
97};
98template<class vtype>
100{
101 ret(0,0) = timesMinusI(rhs(1,0));
102 ret(0,1) = timesMinusI(rhs(1,1));
103 ret(1,0) = timesI(rhs(0,0));
104 ret(1,1) = timesI(rhs(0,1));
105};
106template<class vtype>
108{
109 ret(0,0) = timesI(rhs(0,1));
110 ret(0,1) = timesMinusI(rhs(0,0));
111 ret(1,0) = timesI(rhs(1,1));
112 ret(1,1) = timesMinusI(rhs(1,0));
113};
114
115template<class vtype>
117{
118 ret(0) = timesI(rhs(1));
119 ret(1) = timesMinusI(rhs(0));
120};
121template<class vtype>
123{
124 ret(0,0) = timesI(rhs(1,0));
125 ret(0,1) = timesI(rhs(1,1));
126 ret(1,0) = timesMinusI(rhs(0,0));
127 ret(1,1) = timesMinusI(rhs(0,1));
128};
129template<class vtype>
131{
132 ret(0,0) = timesMinusI(rhs(0,1));
133 ret(0,1) = timesI(rhs(0,0));
134 ret(1,0) = timesMinusI(rhs(1,1));
135 ret(1,1) = timesI(rhs(1,0));
136};
137
138
139
140
141
142// 1 0 x vector
143// 0 -1
144template<class vtype>
146{
147 ret(0) = rhs(0);
148 ret(1) = -rhs(1);
149};
150template<class vtype>
152{
153 ret(0,0) = rhs(0,0);
154 ret(0,1) = rhs(0,1);
155 ret(1,0) = -rhs(1,0);
156 ret(1,1) = -rhs(1,1);
157};
158template<class vtype>
160{
161 ret(0,0) = rhs(0,0);
162 ret(0,1) = -rhs(0,1);
163 ret(1,0) = rhs(1,0);
164 ret(1,1) = -rhs(1,1);
165};
166
167
168template<class vtype>
170{
171 ret(0) = -rhs(0);
172 ret(1) = rhs(1);
173};
174template<class vtype>
176{
177 ret(0,0) = -rhs(0,0);
178 ret(0,1) = -rhs(0,1);
179 ret(1,0) = rhs(1,0);
180 ret(1,1) = rhs(1,1);
181};
182template<class vtype>
184{
185 ret(0,0) = -rhs(0,0);
186 ret(0,1) = rhs(0,1);
187 ret(1,0) = -rhs(1,0);
188 ret(1,1) = rhs(1,1);
189};
190
191
192
193
194
195
196template<class vtype>
198{
199 ret(0) = rhs(0);
200 ret(1) = rhs(1);
201};
202template<class vtype>
204{
205 ret(0,0) = rhs(0,0);
206 ret(0,1) = rhs(0,1);
207 ret(1,0) = rhs(1,0);
208 ret(1,1) = rhs(1,1);
209};
210template<class vtype>
212{
213 ret(0,0) = rhs(0,0);
214 ret(0,1) = rhs(0,1);
215 ret(1,0) = rhs(1,0);
216 ret(1,1) = rhs(1,1);
217};
218
219template<class vtype>
221{
222 ret(0) = -rhs(0);
223 ret(1) = -rhs(1);
224};
225template<class vtype>
227{
228 ret(0,0) = -rhs(0,0);
229 ret(0,1) = -rhs(0,1);
230 ret(1,0) = -rhs(1,0);
231 ret(1,1) = -rhs(1,1);
232};
233template<class vtype>
235{
236 ret(0,0) = -rhs(0,0);
237 ret(0,1) = -rhs(0,1);
238 ret(1,0) = -rhs(1,0);
239 ret(1,1) = -rhs(1,1);
240};
241
242
243
244
245
246//G-parity flavour projection 1/2(1+\sigma_2)
247//1 -i
248//i 1
249template<class vtype>
251{
252 ret(0) = 0.5*rhs(0) + 0.5*timesMinusI(rhs(1));
253 ret(1) = 0.5*timesI(rhs(0)) + 0.5*rhs(1);
254};
255template<class vtype>
257{
258 ret(0,0) = 0.5*rhs(0,0) + 0.5*timesMinusI(rhs(1,0));
259 ret(0,1) = 0.5*rhs(0,1) + 0.5*timesMinusI(rhs(1,1));
260 ret(1,0) = 0.5*timesI(rhs(0,0)) + 0.5*rhs(1,0);
261 ret(1,1) = 0.5*timesI(rhs(0,1)) + 0.5*rhs(1,1);
262};
263template<class vtype>
265{
266 ret(0,0) = 0.5*rhs(0,0) + 0.5*timesI(rhs(0,1));
267 ret(0,1) = 0.5*timesMinusI(rhs(0,0)) + 0.5*rhs(0,1);
268 ret(1,0) = 0.5*rhs(1,0) + 0.5*timesI(rhs(1,1));
269 ret(1,1) = 0.5*timesMinusI(rhs(1,0)) + 0.5*rhs(1,1);
270};
271
272
273template<class vtype>
275{
276 ret(0) = -0.5*rhs(0) + 0.5*timesI(rhs(1));
277 ret(1) = 0.5*timesMinusI(rhs(0)) - 0.5*rhs(1);
278};
279template<class vtype>
281{
282 ret(0,0) = -0.5*rhs(0,0) + 0.5*timesI(rhs(1,0));
283 ret(0,1) = -0.5*rhs(0,1) + 0.5*timesI(rhs(1,1));
284 ret(1,0) = 0.5*timesMinusI(rhs(0,0)) - 0.5*rhs(1,0);
285 ret(1,1) = 0.5*timesMinusI(rhs(0,1)) - 0.5*rhs(1,1);
286};
287template<class vtype>
289{
290 ret(0,0) = -0.5*rhs(0,0) + 0.5*timesMinusI(rhs(0,1));
291 ret(0,1) = 0.5*timesI(rhs(0,0)) - 0.5*rhs(0,1);
292 ret(1,0) = -0.5*rhs(1,0) + 0.5*timesMinusI(rhs(1,1));
293 ret(1,1) = 0.5*timesI(rhs(1,0)) - 0.5*rhs(1,1);
294};
295
296
297
298
299
300//G-parity flavour projection 1/2(1-\sigma_2)
301//1 i
302//-i 1
303template<class vtype>
305{
306 ret(0) = 0.5*rhs(0) + 0.5*timesI(rhs(1));
307 ret(1) = 0.5*timesMinusI(rhs(0)) + 0.5*rhs(1);
308};
309template<class vtype>
311{
312 ret(0,0) = 0.5*rhs(0,0) + 0.5*timesI(rhs(1,0));
313 ret(0,1) = 0.5*rhs(0,1) + 0.5*timesI(rhs(1,1));
314 ret(1,0) = 0.5*timesMinusI(rhs(0,0)) + 0.5*rhs(1,0);
315 ret(1,1) = 0.5*timesMinusI(rhs(0,1)) + 0.5*rhs(1,1);
316};
317template<class vtype>
319{
320 ret(0,0) = 0.5*rhs(0,0) + 0.5*timesMinusI(rhs(0,1));
321 ret(0,1) = 0.5*timesI(rhs(0,0)) + 0.5*rhs(0,1);
322 ret(1,0) = 0.5*rhs(1,0) + 0.5*timesMinusI(rhs(1,1));
323 ret(1,1) = 0.5*timesI(rhs(1,0)) + 0.5*rhs(1,1);
324};
325
326
327template<class vtype>
329{
330 ret(0) = -0.5*rhs(0) + 0.5*timesMinusI(rhs(1));
331 ret(1) = 0.5*timesI(rhs(0)) - 0.5*rhs(1);
332};
333template<class vtype>
335{
336 ret(0,0) = -0.5*rhs(0,0) + 0.5*timesMinusI(rhs(1,0));
337 ret(0,1) = -0.5*rhs(0,1) + 0.5*timesMinusI(rhs(1,1));
338 ret(1,0) = 0.5*timesI(rhs(0,0)) - 0.5*rhs(1,0);
339 ret(1,1) = 0.5*timesI(rhs(0,1)) - 0.5*rhs(1,1);
340};
341template<class vtype>
343{
344 ret(0,0) = -0.5*rhs(0,0) + 0.5*timesI(rhs(0,1));
345 ret(0,1) = 0.5*timesMinusI(rhs(0,0)) - 0.5*rhs(0,1);
346 ret(1,0) = -0.5*rhs(1,0) + 0.5*timesI(rhs(1,1));
347 ret(1,1) = 0.5*timesMinusI(rhs(1,0)) - 0.5*rhs(1,1);
348};
349
350
351
352
353
354
355
356
357
358
359template<class vtype>
361->typename std::enable_if<matchGridTensorIndex<iVector<vtype, Ngp>, GparityFlavourTensorIndex>::value, iVector<vtype, Ngp>>::type
362{
364
365 switch (G.g)
366 {
367 case GparityFlavour::Algebra::SigmaX:
368 multFlavourSigmaX(ret, arg); break;
369 case GparityFlavour::Algebra::MinusSigmaX:
370 multFlavourMinusSigmaX(ret, arg); break;
371 case GparityFlavour::Algebra::SigmaY:
372 multFlavourSigmaY(ret, arg); break;
373 case GparityFlavour::Algebra::MinusSigmaY:
374 multFlavourMinusSigmaY(ret, arg); break;
375 case GparityFlavour::Algebra::SigmaZ:
376 multFlavourSigmaZ(ret, arg); break;
377 case GparityFlavour::Algebra::MinusSigmaZ:
378 multFlavourMinusSigmaZ(ret, arg); break;
379 case GparityFlavour::Algebra::Identity:
380 multFlavourIdentity(ret, arg); break;
381 case GparityFlavour::Algebra::MinusIdentity:
382 multFlavourMinusIdentity(ret, arg); break;
383 case GparityFlavour::Algebra::ProjPlus:
384 multFlavourProjPlus(ret, arg); break;
385 case GparityFlavour::Algebra::MinusProjPlus:
386 multFlavourMinusProjPlus(ret, arg); break;
387 case GparityFlavour::Algebra::ProjMinus:
388 multFlavourProjMinus(ret, arg); break;
389 case GparityFlavour::Algebra::MinusProjMinus:
390 multFlavourMinusProjMinus(ret, arg); break;
391 default: assert(0);
392 }
393
394 return ret;
395}
396
397template<class vtype>
399->typename std::enable_if<matchGridTensorIndex<iMatrix<vtype, Ngp>, GparityFlavourTensorIndex>::value, iMatrix<vtype, Ngp>>::type
400{
402
403 switch (G.g)
404 {
405 case GparityFlavour::Algebra::SigmaX:
406 lmultFlavourSigmaX(ret, arg); break;
407 case GparityFlavour::Algebra::MinusSigmaX:
408 lmultFlavourMinusSigmaX(ret, arg); break;
409 case GparityFlavour::Algebra::SigmaY:
410 lmultFlavourSigmaY(ret, arg); break;
411 case GparityFlavour::Algebra::MinusSigmaY:
412 lmultFlavourMinusSigmaY(ret, arg); break;
413 case GparityFlavour::Algebra::SigmaZ:
414 lmultFlavourSigmaZ(ret, arg); break;
415 case GparityFlavour::Algebra::MinusSigmaZ:
416 lmultFlavourMinusSigmaZ(ret, arg); break;
417 case GparityFlavour::Algebra::Identity:
418 lmultFlavourIdentity(ret, arg); break;
419 case GparityFlavour::Algebra::MinusIdentity:
420 lmultFlavourMinusIdentity(ret, arg); break;
421 case GparityFlavour::Algebra::ProjPlus:
422 lmultFlavourProjPlus(ret, arg); break;
423 case GparityFlavour::Algebra::MinusProjPlus:
424 lmultFlavourMinusProjPlus(ret, arg); break;
425 case GparityFlavour::Algebra::ProjMinus:
426 lmultFlavourProjMinus(ret, arg); break;
427 case GparityFlavour::Algebra::MinusProjMinus:
428 lmultFlavourMinusProjMinus(ret, arg); break;
429 default: assert(0);
430 }
431
432 return ret;
433}
434
435template<class vtype>
437->typename std::enable_if<matchGridTensorIndex<iMatrix<vtype, Ngp>, GparityFlavourTensorIndex>::value, iMatrix<vtype, Ngp>>::type
438{
440
441 switch (G.g)
442 {
443 case GparityFlavour::Algebra::SigmaX:
444 rmultFlavourSigmaX(ret, arg); break;
445 case GparityFlavour::Algebra::MinusSigmaX:
446 rmultFlavourMinusSigmaX(ret, arg); break;
447 case GparityFlavour::Algebra::SigmaY:
448 rmultFlavourSigmaY(ret, arg); break;
449 case GparityFlavour::Algebra::MinusSigmaY:
450 rmultFlavourMinusSigmaY(ret, arg); break;
451 case GparityFlavour::Algebra::SigmaZ:
452 rmultFlavourSigmaZ(ret, arg); break;
453 case GparityFlavour::Algebra::MinusSigmaZ:
454 rmultFlavourMinusSigmaZ(ret, arg); break;
455 case GparityFlavour::Algebra::Identity:
456 rmultFlavourIdentity(ret, arg); break;
457 case GparityFlavour::Algebra::MinusIdentity:
458 rmultFlavourMinusIdentity(ret, arg); break;
459 case GparityFlavour::Algebra::ProjPlus:
460 rmultFlavourProjPlus(ret, arg); break;
461 case GparityFlavour::Algebra::MinusProjPlus:
462 rmultFlavourMinusProjPlus(ret, arg); break;
463 case GparityFlavour::Algebra::ProjMinus:
464 rmultFlavourProjMinus(ret, arg); break;
465 case GparityFlavour::Algebra::MinusProjMinus:
466 rmultFlavourMinusProjMinus(ret, arg); break;
467 default: assert(0);
468 }
469
470 return ret;
471}
472
474
475#endif // include guard
#define accelerator_inline
#define accelerator
accelerator_inline void multFlavourMinusProjPlus(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusSigmaY(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourSigmaZ(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusProjMinus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourMinusIdentity(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void multFlavourMinusSigmaY(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusProjMinus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusSigmaX(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourMinusSigmaZ(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourSigmaY(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourProjPlus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourIdentity(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void multFlavourProjPlus(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourProjMinus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusSigmaZ(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourSigmaZ(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourSigmaX(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourMinusSigmaX(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourProjMinus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourIdentity(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourSigmaY(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourSigmaZ(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusSigmaZ(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourProjMinus(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void multFlavourMinusProjMinus(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusIdentity(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusProjPlus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusIdentity(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourIdentity(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void multFlavourSigmaX(iVector< vtype, Ngp > &ret, const iVector< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourMinusSigmaX(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourSigmaX(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline auto operator*(const GparityFlavour &G, const iVector< vtype, Ngp > &arg) -> typename std::enable_if< matchGridTensorIndex< iVector< vtype, Ngp >, GparityFlavourTensorIndex >::value, iVector< vtype, Ngp > >::type
accelerator_inline void rmultFlavourSigmaY(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void rmultFlavourProjPlus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusSigmaY(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void lmultFlavourMinusProjPlus(iMatrix< vtype, Ngp > &ret, const iMatrix< vtype, Ngp > &rhs)
accelerator_inline void timesMinusI(Grid_simd2< S, V > &ret, const Grid_simd2< S, V > &in)
accelerator_inline void timesI(Grid_simd2< S, V > &ret, const Grid_simd2< S, V > &in)
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
const int GparityFlavourTensorIndex
Definition QCD.h:91
static const std::array< const char *, nSigma > name
static constexpr unsigned int nSigma
accelerator GparityFlavour(Algebra initg)
static const std::array< const GparityFlavour, 6 > sigma_all
GRID_SERIALIZABLE_ENUM(Algebra, undef, SigmaX, 0, MinusSigmaX, 1, SigmaY, 2, MinusSigmaY, 3, SigmaZ, 4, MinusSigmaZ, 5, Identity, 6, MinusIdentity, 7, ProjPlus, 8, MinusProjPlus, 9, ProjMinus, 10, MinusProjMinus, 11)
static const std::array< const GparityFlavour, 3 > sigma_mu