QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
wilson_pack_twisted_face_dagger_core.h
Go to the documentation of this file.
1 // input spinor
2 #ifdef SPINOR_DOUBLE
3 #define spinorFloat double
4 #define i00_re I0.x
5 #define i00_im I0.y
6 #define i01_re I1.x
7 #define i01_im I1.y
8 #define i02_re I2.x
9 #define i02_im I2.y
10 #define i10_re I3.x
11 #define i10_im I3.y
12 #define i11_re I4.x
13 #define i11_im I4.y
14 #define i12_re I5.x
15 #define i12_im I5.y
16 #define i20_re I6.x
17 #define i20_im I6.y
18 #define i21_re I7.x
19 #define i21_im I7.y
20 #define i22_re I8.x
21 #define i22_im I8.y
22 #define i30_re I9.x
23 #define i30_im I9.y
24 #define i31_re I10.x
25 #define i31_im I10.y
26 #define i32_re I11.x
27 #define i32_im I11.y
28 #else
29 #define spinorFloat float
30 #define i00_re I0.x
31 #define i00_im I0.y
32 #define i01_re I0.z
33 #define i01_im I0.w
34 #define i02_re I1.x
35 #define i02_im I1.y
36 #define i10_re I1.z
37 #define i10_im I1.w
38 #define i11_re I2.x
39 #define i11_im I2.y
40 #define i12_re I2.z
41 #define i12_im I2.w
42 #define i20_re I3.x
43 #define i20_im I3.y
44 #define i21_re I3.z
45 #define i21_im I3.w
46 #define i22_re I4.x
47 #define i22_im I4.y
48 #define i30_re I4.z
49 #define i30_im I4.w
50 #define i31_re I5.x
51 #define i31_im I5.y
52 #define i32_re I5.z
53 #define i32_im I5.w
54 #endif // SPINOR_DOUBLE
55 
56 #include "io_spinor.h"
57 
58 if (face_num) {
59 
60  switch(dim) {
61  case 0:
62  {
63  // read spinor from device memory
64  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
65  APPLY_TWIST_INV(-a, b, i);
66 
73 
74  // project spinor into half spinors
75  a0_re = +i00_re+i30_im;
76  a0_im = +i00_im-i30_re;
77  a1_re = +i01_re+i31_im;
78  a1_im = +i01_im-i31_re;
79  a2_re = +i02_re+i32_im;
80  a2_im = +i02_im-i32_re;
81  b0_re = +i10_re+i20_im;
82  b0_im = +i10_im-i20_re;
83  b1_re = +i11_re+i21_im;
84  b1_im = +i11_im-i21_re;
85  b2_re = +i12_re+i22_im;
86  b2_im = +i12_im-i22_re;
87 
88  // write half spinor back to device memory
89  WRITE_HALF_SPINOR(face_volume, face_idx);
90  }
91  break;
92  case 1:
93  {
94  // read spinor from device memory
95  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
96  APPLY_TWIST_INV(-a, b, i);
97 
104 
105  // project spinor into half spinors
106  a0_re = +i00_re-i30_re;
107  a0_im = +i00_im-i30_im;
108  a1_re = +i01_re-i31_re;
109  a1_im = +i01_im-i31_im;
110  a2_re = +i02_re-i32_re;
111  a2_im = +i02_im-i32_im;
112  b0_re = +i10_re+i20_re;
113  b0_im = +i10_im+i20_im;
114  b1_re = +i11_re+i21_re;
115  b1_im = +i11_im+i21_im;
116  b2_re = +i12_re+i22_re;
117  b2_im = +i12_im+i22_im;
118 
119  // write half spinor back to device memory
120  WRITE_HALF_SPINOR(face_volume, face_idx);
121  }
122  break;
123  case 2:
124  {
125  // read spinor from device memory
126  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
127  APPLY_TWIST_INV(-a, b, i);
128 
135 
136  // project spinor into half spinors
137  a0_re = +i00_re+i20_im;
138  a0_im = +i00_im-i20_re;
139  a1_re = +i01_re+i21_im;
140  a1_im = +i01_im-i21_re;
141  a2_re = +i02_re+i22_im;
142  a2_im = +i02_im-i22_re;
143  b0_re = +i10_re-i30_im;
144  b0_im = +i10_im+i30_re;
145  b1_re = +i11_re-i31_im;
146  b1_im = +i11_im+i31_re;
147  b2_re = +i12_re-i32_im;
148  b2_im = +i12_im+i32_re;
149 
150  // write half spinor back to device memory
151  WRITE_HALF_SPINOR(face_volume, face_idx);
152  }
153  break;
154  case 3:
155  {
156  // read spinor from device memory
157  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
158  APPLY_TWIST_INV(-a, b, i);
159 
166 
167  // project spinor into half spinors
168  a0_re = +2*i20_re;
169  a0_im = +2*i20_im;
170  a1_re = +2*i21_re;
171  a1_im = +2*i21_im;
172  a2_re = +2*i22_re;
173  a2_im = +2*i22_im;
174  b0_re = +2*i30_re;
175  b0_im = +2*i30_im;
176  b1_re = +2*i31_re;
177  b1_im = +2*i31_im;
178  b2_re = +2*i32_re;
179  b2_im = +2*i32_im;
180 
181  // write half spinor back to device memory
182  WRITE_HALF_SPINOR(face_volume, face_idx);
183  }
184  break;
185  }
186 
187 } else {
188 
189  switch(dim) {
190  case 0:
191  {
192  // read spinor from device memory
193  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
194  APPLY_TWIST_INV(-a, b, i);
195 
202 
203  // project spinor into half spinors
204  a0_re = +i00_re-i30_im;
205  a0_im = +i00_im+i30_re;
206  a1_re = +i01_re-i31_im;
207  a1_im = +i01_im+i31_re;
208  a2_re = +i02_re-i32_im;
209  a2_im = +i02_im+i32_re;
210  b0_re = +i10_re-i20_im;
211  b0_im = +i10_im+i20_re;
212  b1_re = +i11_re-i21_im;
213  b1_im = +i11_im+i21_re;
214  b2_re = +i12_re-i22_im;
215  b2_im = +i12_im+i22_re;
216 
217  // write half spinor back to device memory
218  WRITE_HALF_SPINOR(face_volume, face_idx);
219  }
220  break;
221  case 1:
222  {
223  // read spinor from device memory
224  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
225  APPLY_TWIST_INV(-a, b, i);
226 
233 
234  // project spinor into half spinors
235  a0_re = +i00_re+i30_re;
236  a0_im = +i00_im+i30_im;
237  a1_re = +i01_re+i31_re;
238  a1_im = +i01_im+i31_im;
239  a2_re = +i02_re+i32_re;
240  a2_im = +i02_im+i32_im;
241  b0_re = +i10_re-i20_re;
242  b0_im = +i10_im-i20_im;
243  b1_re = +i11_re-i21_re;
244  b1_im = +i11_im-i21_im;
245  b2_re = +i12_re-i22_re;
246  b2_im = +i12_im-i22_im;
247 
248  // write half spinor back to device memory
249  WRITE_HALF_SPINOR(face_volume, face_idx);
250  }
251  break;
252  case 2:
253  {
254  // read spinor from device memory
255  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
256  APPLY_TWIST_INV(-a, b, i);
257 
264 
265  // project spinor into half spinors
266  a0_re = +i00_re-i20_im;
267  a0_im = +i00_im+i20_re;
268  a1_re = +i01_re-i21_im;
269  a1_im = +i01_im+i21_re;
270  a2_re = +i02_re-i22_im;
271  a2_im = +i02_im+i22_re;
272  b0_re = +i10_re+i30_im;
273  b0_im = +i10_im-i30_re;
274  b1_re = +i11_re+i31_im;
275  b1_im = +i11_im-i31_re;
276  b2_re = +i12_re+i32_im;
277  b2_im = +i12_im-i32_re;
278 
279  // write half spinor back to device memory
280  WRITE_HALF_SPINOR(face_volume, face_idx);
281  }
282  break;
283  case 3:
284  {
285  // read spinor from device memory
286  READ_SPINOR(SPINORTEX, param.sp_stride, idx, idx);
287  APPLY_TWIST_INV(-a, b, i);
288 
295 
296  // project spinor into half spinors
297  a0_re = +2*i00_re;
298  a0_im = +2*i00_im;
299  a1_re = +2*i01_re;
300  a1_im = +2*i01_im;
301  a2_re = +2*i02_re;
302  a2_im = +2*i02_im;
303  b0_re = +2*i10_re;
304  b0_im = +2*i10_im;
305  b1_re = +2*i11_re;
306  b1_im = +2*i11_im;
307  b2_re = +2*i12_re;
308  b2_im = +2*i12_im;
309 
310  // write half spinor back to device memory
311  WRITE_HALF_SPINOR(face_volume, face_idx);
312  }
313  break;
314  }
315 
316 }
317 
318 // undefine to prevent warning when precision is changed
319 #undef spinorFloat
320 #undef SHARED_STRIDE
321 
322 #undef i00_re
323 #undef i00_im
324 #undef i01_re
325 #undef i01_im
326 #undef i02_re
327 #undef i02_im
328 #undef i10_re
329 #undef i10_im
330 #undef i11_re
331 #undef i11_im
332 #undef i12_re
333 #undef i12_im
334 #undef i20_re
335 #undef i20_im
336 #undef i21_re
337 #undef i21_im
338 #undef i22_re
339 #undef i22_im
340 #undef i30_re
341 #undef i30_im
342 #undef i31_re
343 #undef i31_im
344 #undef i32_re
345 #undef i32_im
346 
#define APPLY_TWIST_INV(a, b, reg)
**************************only for deg tm:*******************************
Definition: io_spinor.h:1122
QudaGaugeParam param
Definition: pack_test.cpp:17
#define SPINORTEX
Definition: clover_def.h:40
#define READ_SPINOR
Definition: clover_def.h:36