QDP++
generic_spin_proj_inlines.h
Go to the documentation of this file.
1#ifndef GENERIC_SPIN_PROJ_INLINES_H
2#define GENERIC_SPIN_PROJ_INLINES_H
3
4/* File: generic_spin_proj_inlines.h
5 Purpose: Supply inline functions to do spin projection
6 Author: $Id: generic_spin_proj_inlines.h,v 1.4 2008-12-22 17:42:57 bjoo Exp $
7*/
8namespace QDP {
9
10
23inline
24void inlineSpinProjDir0Plus(const REAL* src, REAL *dst, unsigned int n_vec)
25{
26
27#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
28 QDPIO::cout << "inlineSpinProjDir0Plus" << endl;
29#endif
30
31 /* 1 + \gamma_0 = 1 0 0 i
32 0 1 i 0
33 0 -i 1 0
34 -i 0 0 1
35
36 * ( d0r + i d0i ) = ( {x0r - x3i} + i{x0i + x3r} )
37 * ( d1r + i d1i ) ( {x1r - x2i} + i{x1i + x2r} )
38 */
39 REAL tmp_spinor[4][3][2];
40
41 const REAL* src_shadow = src;
42 REAL* dst_shadow = dst;
43
44 const int re = 0;
45 const int im = 1;
46 const int Ncmpx = 2;
47
48 for(unsigned int site=0; site < n_vec; site++) {
49 REAL* tmp_shadow = &(tmp_spinor[0][0][0]);
50
51 // Stream in the spinor
52 //ut << "site = "<< site << ", Nc = " << Nc <<", Ns * Nc * Ncmpx = " << Ns*Nc*Ncmpx << endl;
53
54 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
55 *(tmp_shadow++) = *(src_shadow++);
56 }
57
58 // Project and store
59 // Spin 0
60 for(int col=0; col < Nc; col++) {
61 *(dst_shadow++) = tmp_spinor[0][col][re] - tmp_spinor[3][col][im];
62 *(dst_shadow++) = tmp_spinor[0][col][im] + tmp_spinor[3][col][re];
63 }
64
65 // Spin 1
66 for(int col=0; col < Nc; col++) {
67 *(dst_shadow++) = tmp_spinor[1][col][re] - tmp_spinor[2][col][im];
68 *(dst_shadow++) = tmp_spinor[1][col][im] + tmp_spinor[2][col][re];
69 }
70 }
71}
72
84inline
85void inlineSpinProjDir0Minus(const REAL* src, REAL *dst, unsigned int n_vec)
86{
87
88#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
89 QDPIO::cout << "inlineSpinProjDir0Minus" << endl;
90#endif
91
92
93 /* ( 1 0 0 -i) ( a0 ) ( a0 - i a3 )
94 * B := ( 1 - Gamma ) A = ( 0 1 -i 0) ( a1 ) = ( a1 - i a2 )
95 * 0 ( 0 i 1 0) ( a2 ) ( a2 + i a1 )
96 * ( i 0 0 1) ( a3 ) ( a3 + i a0 )
97
98 * Therefore the top components are
99
100 * ( b0r + i b0i ) = ( {a0r + a3i} + i{a0i - a3r} )
101 * ( b1r + i b1i ) ( {a1r + a2i} + i{a1i - a2r} )
102 */
103 REAL tmp_spinor[4][3][2];
104
105 const REAL* src_shadow = src;
106 REAL* dst_shadow = dst;
107
108 const int re = 0;
109 const int im = 1;
110 const int Ncmpx = 2;
111
112 for(unsigned int site=0; site < n_vec; site++) {
113 REAL* tmpptr = &(tmp_spinor[0][0][0]);
114 // Stream in the spinor
115 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
116 *(tmpptr++) = *(src_shadow++);
117 }
118
119 // Project and store
120 // Spin 0
121 for(int col=0; col < Nc; col++) {
122 *(dst_shadow++) = tmp_spinor[0][col][re] + tmp_spinor[3][col][im];
123 *(dst_shadow++) = tmp_spinor[0][col][im] - tmp_spinor[3][col][re];
124 }
125
126 // Spin 1
127 for(int col=0; col < Nc; col++) {
128 *(dst_shadow++) = tmp_spinor[1][col][re] + tmp_spinor[2][col][im];
129 *(dst_shadow++) = tmp_spinor[1][col][im] - tmp_spinor[2][col][re];
130 }
131 }
132}
133
134
135
148inline
149void inlineSpinProjDir1Plus(const REAL* src, REAL *dst, unsigned int n_vec)
150{
151
152#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
153 QDPIO::cout << "inlineSpinProjDir1Plus" << endl;
154#endif
155
156 /* 1 + \gamma_1 = 1 0 0 -1
157 0 1 1 0
158 0 1 1 0
159 -1 0 0 1
160
161 * ( b0r + i b0i ) = ( {a0r - a3r} + i{a0i - a3i} )
162 * ( b1r + i b1i ) ( {a1r + a2r} + i{a1i + a2i} )
163 */
164 REAL tmp_spinor[4][3][2];
165
166 const REAL* src_shadow = src;
167 REAL* dst_shadow = dst;
168
169 const int re = 0;
170 const int im = 1;
171 const int Ncmpx = 2;
172
173 for(unsigned int site=0; site < n_vec; site++) {
174 REAL* tmp_shadow = &(tmp_spinor[0][0][0]);
175
176 // Stream in the spinor
177 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
178 *(tmp_shadow++) = *(src_shadow++);
179 }
180
181 // Project and store
182 // Spin 0
183 for(int col=0; col < Nc; col++) {
184 *(dst_shadow++) = tmp_spinor[0][col][re] - tmp_spinor[3][col][re];
185 *(dst_shadow++) = tmp_spinor[0][col][im] - tmp_spinor[3][col][im];
186 }
187
188 // Spin 1
189 for(int col=0; col < Nc; col++) {
190 *(dst_shadow++) = tmp_spinor[1][col][re] + tmp_spinor[2][col][re];
191 *(dst_shadow++) = tmp_spinor[1][col][im] + tmp_spinor[2][col][im];
192 }
193 }
194}
195
207inline
208void inlineSpinProjDir1Minus(const REAL* src, REAL *dst, unsigned int n_vec)
209{
210
211#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
212 QDPIO::cout << "inlineSpinProjDir1Minus" << endl;
213#endif
214
215 /* 1 - \gamma_1 = 1 0 0 +1
216 0 1 -1 0
217 0 -1 1 0
218 +1 0 0 1
219
220 * ( b0r + i b0i ) = ( {a0r + a3r} + i{a0i + a3i} )
221 * ( b1r + i b1i ) ( {a1r - a2r} + i{a1i - a2i} )
222 */
223
224 REAL tmp_spinor[4][3][2];
225
226 const REAL* src_shadow = src;
227 REAL* dst_shadow = dst;
228
229 const int re = 0;
230 const int im = 1;
231 const int Ncmpx = 2;
232
233 for(unsigned int site=0; site < n_vec; site++) {
234 REAL* tmpptr = &(tmp_spinor[0][0][0]);
235
236 // Stream in the spinor
237 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
238 *(tmpptr++) = *(src_shadow++);
239 }
240
241 // Project and store
242 // Spin 0
243 for(int col=0; col < Nc; col++) {
244 *(dst_shadow++) = tmp_spinor[0][col][re] + tmp_spinor[3][col][re];
245 *(dst_shadow++) = tmp_spinor[0][col][im] + tmp_spinor[3][col][im];
246 }
247
248 // Spin 1
249 for(int col=0; col < Nc; col++) {
250 *(dst_shadow++) = tmp_spinor[1][col][re] - tmp_spinor[2][col][re];
251 *(dst_shadow++) = tmp_spinor[1][col][im] - tmp_spinor[2][col][im];
252 }
253 }
254}
255
256
269inline
270void inlineSpinProjDir2Plus(const REAL* src, REAL *dst, unsigned int n_vec)
271{
272
273#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
274 QDPIO::cout << "inlineSpinProjDir2Plus" << endl;
275#endif
276 /* 1 + \gamma_2 = 1 0 i 0
277 0 1 0 -i
278 -i 0 1 0
279 0 i 0 1
280
281
282 * ( b0r + i b0i ) = ( {a0r - a2i} + i{a0i + a2r} )
283 * ( b1r + i b1i ) ( {a1r + a3i} + i{a1i - a3r} )
284 */
285
286 REAL tmp_spinor[4][3][2];
287
288 const REAL* src_shadow = src;
289 REAL* dst_shadow = dst;
290
291 const int re = 0;
292 const int im = 1;
293 const int Ncmpx = 2;
294
295 for(unsigned int site=0; site < n_vec; site++) {
296 REAL* tmp_shadow = &(tmp_spinor[0][0][0]);
297
298 // Stream in the spinor
299 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
300 *(tmp_shadow++) = *(src_shadow++);
301 }
302
303 // Project and store
304 // Spin 0
305 for(int col=0; col < Nc; col++) {
306 *(dst_shadow++) = tmp_spinor[0][col][re] - tmp_spinor[2][col][im];
307 *(dst_shadow++) = tmp_spinor[0][col][im] + tmp_spinor[2][col][re];
308 }
309
310 // Spin 1
311 for(int col=0; col < Nc; col++) {
312 *(dst_shadow++) = tmp_spinor[1][col][re] + tmp_spinor[3][col][im];
313 *(dst_shadow++) = tmp_spinor[1][col][im] - tmp_spinor[3][col][re];
314 }
315 }
316}
317
329inline
330void inlineSpinProjDir2Minus(const REAL* src, REAL *dst, unsigned int n_vec)
331{
332
333#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
334 QDPIO::cout << "inlineSpinProjDir2Minus" << endl;
335#endif
336
337 /* 1 - \gamma_2 = 1 0 -i 0
338 0 1 0 +i
339 +i 0 1 0
340 0 -i 0 1
341
342
343 * ( b0r + i b0i ) = ( {a0r + a2i} + i{a0i - a2r} )
344 * ( b1r + i b1i ) ( {a1r - a3i} + i{a1i + a3r} )
345 */
346
347 REAL tmp_spinor[4][3][2];
348
349 const REAL* src_shadow = src;
350 REAL* dst_shadow = dst;
351
352 const int re = 0;
353 const int im = 1;
354 const int Ncmpx = 2;
355
356 for(unsigned int site=0; site < n_vec; site++) {
357 REAL* tmpptr = &(tmp_spinor[0][0][0]);
358
359 // Stream in the spinor
360 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
361 *(tmpptr++) = *(src_shadow++);
362 }
363
364 // Project and store
365 // Spin 0
366 for(int col=0; col < Nc; col++) {
367 *(dst_shadow++) = tmp_spinor[0][col][re] + tmp_spinor[2][col][im];
368 *(dst_shadow++) = tmp_spinor[0][col][im] - tmp_spinor[2][col][re];
369 }
370
371 // Spin 1
372 for(int col=0; col < Nc; col++) {
373 *(dst_shadow++) = tmp_spinor[1][col][re] - tmp_spinor[3][col][im];
374 *(dst_shadow++) = tmp_spinor[1][col][im] + tmp_spinor[3][col][re];
375 }
376 }
377}
378
391inline
392void inlineSpinProjDir3Plus(const REAL* src, REAL *dst, unsigned int n_vec)
393{
394
395#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
396 QDPIO::cout << "inlineSpinProjDir3Plus" << endl;
397#endif
398 /* 1 + \gamma_3 = 1 0 1 0
399 0 1 0 1
400 1 0 1 0
401 0 1 0 1
402
403 * ( b0r + i b0i ) = ( {a0r + a2r} + i{a0i + a2i} )
404 * ( b1r + i b1i ) ( {a1r + a3r} + i{a1i + a3i} )
405 */
406
407 REAL tmp_spinor[4][3][2];
408
409 const REAL* src_shadow = src;
410 REAL* dst_shadow = dst;
411
412 const int re = 0;
413 const int im = 1;
414 const int Ncmpx = 2;
415
416 for(unsigned int site=0; site < n_vec; site++) {
417 REAL* tmp_shadow = &(tmp_spinor[0][0][0]);
418
419 // Stream in the spinor
420 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
421 *(tmp_shadow++) = *(src_shadow++);
422 }
423
424 // Project and store
425 // Spin 0
426 for(int col=0; col < Nc; col++) {
427 *(dst_shadow++) = tmp_spinor[0][col][re] + tmp_spinor[2][col][re];
428 *(dst_shadow++) = tmp_spinor[0][col][im] + tmp_spinor[2][col][im];
429 }
430
431 // Spin 1
432 for(int col=0; col < Nc; col++) {
433 *(dst_shadow++) = tmp_spinor[1][col][re] + tmp_spinor[3][col][re];
434 *(dst_shadow++) = tmp_spinor[1][col][im] + tmp_spinor[3][col][im];
435 }
436 }
437}
438
450inline
451void inlineSpinProjDir3Minus(const REAL* src, REAL *dst, unsigned int n_vec)
452{
453
454#ifdef DEBUG_GENERIC_SPIN_PROJ_INLINES
455 QDPIO::cout << "inlineSpinProjDir3Minus" << endl;
456#endif
457
458 /* 1 - \gamma_3 = 1 0 -1 0
459 0 1 0 -1
460 -1 0 1 0
461 0 -1 0 1
462
463 * ( b0r + i b0i ) = ( {a0r - a2r} + i{a0i - a2i} )
464 * ( b1r + i b1i ) ( {a1r - a3r} + i{a1i - a3i} )
465 */
466
467
468 REAL tmp_spinor[4][3][2];
469
470 const REAL* src_shadow = src;
471 REAL* dst_shadow = dst;
472
473 const int re = 0;
474 const int im = 1;
475 const int Ncmpx = 2;
476
477 for(unsigned int site=0; site < n_vec; site++) {
478 REAL* tmpptr = &(tmp_spinor[0][0][0]);
479
480 // Stream in the spinor
481 for(int stream=0; stream < Ns*Nc*Ncmpx; stream++) {
482 *(tmpptr++) = *(src_shadow++);
483 }
484
485 // Project and store
486 // Spin 0
487 for(int col=0; col < Nc; col++) {
488 *(dst_shadow++) = tmp_spinor[0][col][re] - tmp_spinor[2][col][re];
489 *(dst_shadow++) = tmp_spinor[0][col][im] - tmp_spinor[2][col][im];
490 }
491
492 // Spin 1
493 for(int col=0; col < Nc; col++) {
494 *(dst_shadow++) = tmp_spinor[1][col][re] - tmp_spinor[3][col][re];
495 *(dst_shadow++) = tmp_spinor[1][col][im] - tmp_spinor[3][col][im];
496 }
497 }
498}
499
500} // namespace QDP;
501
502#endif
REAL32 REAL
const int Ns
Definition qdp_params.h:26
const int Nc
Definition qdp_params.h:25
StandardOutputStream cout
Definition qdp_stdio.cc:21
Yet another random number generator.
void inlineSpinProjDir0Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_0).
void inlineSpinProjDir0Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_0).
void inlineSpinProjDir1Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_1).
void inlineSpinProjDir1Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_1).
void inlineSpinProjDir3Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_3).
void inlineSpinProjDir3Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_3).
void inlineSpinProjDir2Minus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1-\gamma_2).
void inlineSpinProjDir2Plus(const REAL *src, REAL *dst, unsigned int n_vec)
Spin Project (1/2)(1+\gamma_2).