Bridge++  Ver. 2.0.2
mult_Wilson_qxs_parts-inc.h
Go to the documentation of this file.
1 
10 #ifndef MULT_WILSON_QXS_PARTS_H
11 #define MULT_WILSON_QXS_PARTS_H
12 
13 namespace {
14 //====================================================================
15  inline void check_setup()
16  {
17  /*
18  if(VLEN2 < 2){
19  vout.crucial("VLEN2 = %d is too small for this implementation\n",
20  VLEN2);
21  exit(EXIT_FAILURE);
22  }
23  */
24  }
25 
26 
27 //====================================================================
28  template<typename REALTYPE>
29  inline void mult_wilson_xp1(REALTYPE *buf, REALTYPE *v1)
30  {
31  REALTYPE vt[NVCD];
32 
33  load_vec1(vt, v1, 0, NVCD);
34  set_sp2_xp1(buf, vt);
35  }
36 
37 
38 //====================================================================
39  template<typename REALTYPE>
40  inline void mult_wilson_xp2(Vsimd_t *v2, REALTYPE *u, REALTYPE *buf)
41  {
42  Vsimd_t vt1[NVC], vt2[NVC];
43  shift_vec1_bw(vt1, &buf[0], NVC);
44  shift_vec1_bw(vt2, &buf[NVC], NVC);
45 
46  Vsimd_t ut[NDF];
47  load_vec(ut, u, NDF);
48 
49  Vsimd_t wt1[2], wt2[2];
50  for (int ic = 0; ic < NC; ++ic) {
51  int ic2 = ND * 2 * ic;
52  mult_uv(wt1, &ut[2 * ic], vt1, NC);
53  mult_uv(wt2, &ut[2 * ic], vt2, NC);
54  set_sp4_xp(&v2[ic2], wt1, wt2);
55  }
56  }
57 
58 
59 //====================================================================
60  template<typename REALTYPE>
61  inline void mult_wilson_xpb(Vsimd_t *v2,
62  REALTYPE *u, REALTYPE *v1)
63  {
64  Vsimd_t vt1[NVC], vt2[NVC];
65  set_sp2_xp(vt1, vt2, v1);
66 
67  Vsimd_t ut[NDF];
68  load_vec(ut, u, NDF);
69 
70  Vsimd_t wt1[2], wt2[2];
71  for (int ic = 0; ic < NC; ++ic) {
72  int ic2 = ND * 2 * ic;
73  mult_uv(wt1, &ut[2 * ic], vt1, NC);
74  mult_uv(wt2, &ut[2 * ic], vt2, NC);
75  set_sp4_xp(&v2[ic2], wt1, wt2);
76  }
77  }
78 
79 
80 //====================================================================
81  template<typename REALTYPE>
82  inline void mult_wilson_xm1(REALTYPE *buf, REALTYPE *u, REALTYPE *v1)
83  {
84  Vsimd_t vt1[VLEN * NVC], vt2[VLEN * NVC];
85  set_sp2_xm(vt1, vt2, v1);
86 
87  Vsimd_t ut[NDF];
88  load_vec(ut, u, NDF);
89 
90  Vsimd_t wt1[NVC], wt2[NVC];
91  for (int ic = 0; ic < NC; ++ic) {
92  int ic2 = NVC * ic;
93  mult_udagv(&wt1[2 * ic], &ut[ic2], vt1, NC);
94  mult_udagv(&wt2[2 * ic], &ut[ic2], vt2, NC);
95  }
96 
97  for (int ic = 0; ic < NC; ++ic) {
98  save_vec1(&buf[0], wt1, VLEN - 1, NVC);
99  save_vec1(&buf[NVC], wt2, VLEN - 1, NVC);
100  }
101  }
102 
103 
104 //====================================================================
105  template<typename REALTYPE>
106  inline void mult_wilson_xm2(Vsimd_t *v2, REALTYPE *buf)
107  {
108  Vsimd_t wt1[2], wt2[2];
109  for (int ic = 0; ic < NC; ++ic) {
110  int ic2 = ND * 2 * ic;
111  shift_vec1_fw(wt1, &buf[2 * ic], 2);
112  shift_vec1_fw(wt2, &buf[2 * ic + NVC], 2);
113  set_sp4_xm(&v2[ic2], wt1, wt2);
114  }
115  }
116 
117 
118 //====================================================================
119  template<typename REALTYPE>
120  inline void mult_wilson_xmb(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
121  {
122  Vsimd_t vt1[NVC], vt2[NVC];
123  set_sp2_xm(vt1, vt2, v1);
124 
125  Vsimd_t ut[NDF];
126  load_vec(ut, u, NDF);
127 
128  Vsimd_t wt1[2], wt2[2];
129  for (int ic = 0; ic < NC; ++ic) {
130  int ic2 = NVC * ic;
131  int ic3 = ND * 2 * ic;
132  mult_udagv(wt1, &ut[ic2], vt1, NC);
133  mult_udagv(wt2, &ut[ic2], vt2, NC);
134  set_sp4_xm(&v2[ic3], wt1, wt2);
135  }
136  }
137 
138 
139 //====================================================================
140  template<typename REALTYPE>
141  inline void mult_wilson_yp1(REALTYPE *buf, REALTYPE *v1)
142  {
143  Vsimd_t vt1[NVC], vt2[NVC];
144  set_sp2_yp(vt1, vt2, v1);
145 
146  save_vec(&buf[0], vt1, NVC);
147  save_vec(&buf[VLEN * NVC], vt2, NVC);
148  }
149 
150 
151 //====================================================================
152  template<typename REALTYPE>
153  inline void mult_wilson_yp2(Vsimd_t *v2, REALTYPE *u, REALTYPE *buf)
154  {
155  Vsimd_t vt1[NVC], vt2[NVC];
156  load_vec(vt1, &buf[0], NVC);
157  load_vec(vt2, &buf[VLEN * NVC], NVC);
158 
159  Vsimd_t ut[NDF];
160  load_vec(ut, u, NDF);
161 
162  Vsimd_t wt1[2], wt2[2];
163  for (int ic = 0; ic < NC; ++ic) {
164  int ic2 = ND * 2 * ic;
165  mult_uv(wt1, &ut[2 * ic], vt1, NC);
166  mult_uv(wt2, &ut[2 * ic], vt2, NC);
167  set_sp4_yp(&v2[ic2], wt1, wt2);
168  }
169  }
170 
171 
172 //====================================================================
173  template<typename REALTYPE>
174  inline void mult_wilson_ypb(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
175  {
176  Vsimd_t vt1[NVC], vt2[NVC];
177  set_sp2_yp(vt1, vt2, v1);
178 
179  Vsimd_t ut[NDF];
180  load_vec(ut, u, NDF);
181 
182  Vsimd_t wt1[2], wt2[2];
183  for (int ic = 0; ic < NC; ++ic) {
184  int ic2 = ND * 2 * ic;
185  mult_uv(wt1, &ut[2 * ic], vt1, NC);
186  mult_uv(wt2, &ut[2 * ic], vt2, NC);
187  set_sp4_yp(&v2[ic2], wt1, wt2);
188  }
189  }
190 
191 
192 //====================================================================
193  template<typename REALTYPE>
194  inline void mult_wilson_ym1(REALTYPE *buf, REALTYPE *u, REALTYPE *v1)
195  {
196  Vsimd_t vt1[NVC], vt2[NVC];
197  set_sp2_ym(vt1, vt2, v1);
198 
199  Vsimd_t ut[NDF];
200  load_vec(ut, u, NDF);
201 
202  Vsimd_t wt1[NVC], wt2[NVC];
203  for (int ic = 0; ic < NC; ++ic) {
204  int ic2 = NVC * ic;
205  mult_udagv(&wt1[2 * ic], &ut[ic2], vt1, NC);
206  mult_udagv(&wt2[2 * ic], &ut[ic2], vt2, NC);
207  }
208 
209  save_vec(&buf[0], wt1, NVC);
210  save_vec(&buf[VLEN * NVC], wt2, NVC);
211  }
212 
213 
214 //====================================================================
215  template<typename REALTYPE>
216  inline void mult_wilson_ym2(Vsimd_t *v2, REALTYPE *buf)
217  {
218  Vsimd_t wt1[2], wt2[2];
219  for (int ic = 0; ic < NC; ++ic) {
220  int ic2 = ND * 2 * ic;
221  load_vec(wt1, &buf[VLEN * 2 * ic], 2);
222  load_vec(wt2, &buf[VLEN * 2 * (ic + NC)], 2);
223  set_sp4_ym(&v2[ic2], wt1, wt2);
224  }
225  }
226 
227 
228 //====================================================================
229  template<typename REALTYPE>
230  inline void mult_wilson_ymb(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
231  {
232  Vsimd_t vt1[NVC], vt2[NVC];
233  set_sp2_ym(vt1, vt2, v1);
234 
235  Vsimd_t ut[NDF];
236  load_vec(ut, u, NDF);
237 
238  Vsimd_t wt1[2], wt2[2];
239  for (int ic = 0; ic < NC; ++ic) {
240  int ic2 = NVC * ic;
241  int ic3 = ND * 2 * ic;
242  mult_udagv(wt1, &ut[ic2], vt1, NC);
243  mult_udagv(wt2, &ut[ic2], vt2, NC);
244  set_sp4_ym(&v2[ic3], wt1, wt2);
245  }
246  }
247 
248 
249 //====================================================================
250  template<typename REALTYPE>
251  inline void mult_wilson_zp1(REALTYPE *buf, REALTYPE *v1)
252  {
253  Vsimd_t vt1[NVC], vt2[NVC];
254  set_sp2_zp(vt1, vt2, v1);
255 
256  save_vec(&buf[0], vt1, NVC);
257  save_vec(&buf[VLEN * NVC], vt2, NVC);
258  }
259 
260 
261 //====================================================================
262  template<typename REALTYPE>
263  inline void mult_wilson_zp2(Vsimd_t *v2, REALTYPE *u, REALTYPE *buf)
264  {
265  Vsimd_t vt1[NVC], vt2[NVC];
266  load_vec(vt1, &buf[0], NVC);
267  load_vec(vt2, &buf[VLEN * NVC], NVC);
268 
269  Vsimd_t ut[NDF];
270  load_vec(ut, u, NDF);
271 
272  Vsimd_t wt1[2], wt2[2];
273  for (int ic = 0; ic < NC; ++ic) {
274  int ic2 = ND * 2 * ic;
275  mult_uv(wt1, &ut[2 * ic], vt1, NC);
276  mult_uv(wt2, &ut[2 * ic], vt2, NC);
277  set_sp4_zp(&v2[ic2], wt1, wt2);
278  }
279  }
280 
281 
282 //====================================================================
283  template<typename REALTYPE>
284  inline void mult_wilson_zpb(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
285  {
286  Vsimd_t vt1[NVC], vt2[NVC];
287  set_sp2_zp(vt1, vt2, v1);
288 
289  Vsimd_t ut[NDF];
290  load_vec(ut, u, NDF);
291 
292  Vsimd_t wt1[2], wt2[2];
293  for (int ic = 0; ic < NC; ++ic) {
294  int ic2 = ND * 2 * ic;
295  mult_uv(wt1, &ut[2 * ic], vt1, NC);
296  mult_uv(wt2, &ut[2 * ic], vt2, NC);
297  set_sp4_zp(&v2[ic2], wt1, wt2);
298  }
299  }
300 
301 
302 //====================================================================
303  template<typename REALTYPE>
304  inline void mult_wilson_zm1(REALTYPE *buf, REALTYPE *u, REALTYPE *v1)
305  {
306  Vsimd_t vt1[NVC], vt2[NVC];
307  set_sp2_zm(vt1, vt2, v1);
308 
309  Vsimd_t ut[NDF];
310  load_vec(ut, u, NDF);
311 
312  Vsimd_t wt1[NVC], wt2[NVC];
313  for (int ic = 0; ic < NC; ++ic) {
314  int ic2 = NVC * ic;
315  mult_udagv(&wt1[2 * ic], &ut[ic2], vt1, NC);
316  mult_udagv(&wt2[2 * ic], &ut[ic2], vt2, NC);
317  }
318 
319  save_vec(&buf[0], wt1, NVC);
320  save_vec(&buf[VLEN * NVC], wt2, NVC);
321  }
322 
323 
324 //====================================================================
325  template<typename REALTYPE>
326  inline void mult_wilson_zm2(Vsimd_t *v2, REALTYPE *buf)
327  {
328  Vsimd_t wt1[2], wt2[2];
329  for (int ic = 0; ic < NC; ++ic) {
330  int ic2 = ND * 2 * ic;
331  load_vec(wt1, &buf[VLEN * 2 * ic], 2);
332  load_vec(wt2, &buf[VLEN * 2 * (ic + NC)], 2);
333  set_sp4_zm(&v2[ic2], wt1, wt2);
334  }
335  }
336 
337 
338 //====================================================================
339  template<typename REALTYPE>
340  inline void mult_wilson_zmb(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
341  {
342  Vsimd_t vt1[NVC], vt2[NVC];
343  set_sp2_zm(vt1, vt2, v1);
344 
345  Vsimd_t ut[NDF];
346  load_vec(ut, u, NDF);
347 
348  Vsimd_t wt1[2], wt2[2];
349  for (int ic = 0; ic < NC; ++ic) {
350  int ic2 = NVC * ic;
351  int ic3 = ND * 2 * ic;
352  mult_udagv(wt1, &ut[ic2], vt1, NC);
353  mult_udagv(wt2, &ut[ic2], vt2, NC);
354  set_sp4_zm(&v2[ic3], wt1, wt2);
355  }
356  }
357 
358 
359 //====================================================================
360  template<typename REALTYPE>
361  inline void mult_wilson_tp1_dirac(REALTYPE *buf, REALTYPE *v1)
362  {
363  Vsimd_t vt1[NVC], vt2[NVC];
364  set_sp2_tp_dirac(vt1, vt2, v1);
365 
366  save_vec(&buf[0], vt1, NVC);
367  save_vec(&buf[VLEN * NVC], vt2, NVC);
368  }
369 
370 
371 //====================================================================
372  template<typename REALTYPE>
373  inline void mult_wilson_tp2_dirac(Vsimd_t *v2, REALTYPE *u, REALTYPE *buf)
374  {
375  Vsimd_t vt1[NVC], vt2[NVC];
376  load_vec(vt1, &buf[0], NVC);
377  load_vec(vt2, &buf[VLEN * NVC], NVC);
378 
379  Vsimd_t ut[NDF];
380  load_vec(ut, u, NDF);
381 
382  Vsimd_t wt1[2], wt2[2];
383  for (int ic = 0; ic < NC; ++ic) {
384  int ic2 = ND * 2 * ic;
385  mult_uv(wt1, &ut[2 * ic], vt1, NC);
386  mult_uv(wt2, &ut[2 * ic], vt2, NC);
387  set_sp4_tp_dirac(&v2[ic2], wt1, wt2);
388  }
389  }
390 
391 
392 //====================================================================
393  template<typename REALTYPE>
394  inline void mult_wilson_tpb_dirac(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
395  {
396  Vsimd_t vt1[NVC], vt2[NVC];
397  set_sp2_tp_dirac(vt1, vt2, v1);
398 
399  Vsimd_t ut[NDF];
400  load_vec(ut, u, NDF);
401 
402  Vsimd_t wt1[2], wt2[2];
403  for (int ic = 0; ic < NC; ++ic) {
404  int ic2 = ND * 2 * ic;
405  mult_uv(wt1, &ut[2 * ic], vt1, NC);
406  mult_uv(wt2, &ut[2 * ic], vt2, NC);
407  set_sp4_tp_dirac(&v2[ic2], wt1, wt2);
408  }
409  }
410 
411 
412 //====================================================================
413  template<typename REALTYPE>
414  inline void mult_wilson_tm1_dirac(REALTYPE *buf, REALTYPE *u, REALTYPE *v1)
415  {
416  Vsimd_t vt1[NVC], vt2[NVC];
417  set_sp2_tm_dirac(vt1, vt2, v1);
418 
419  Vsimd_t ut[NDF];
420  load_vec(ut, u, NDF);
421 
422  Vsimd_t wt1[NVC], wt2[NVC];
423  for (int ic = 0; ic < NC; ++ic) {
424  int ic2 = NVC * ic;
425  mult_udagv(&wt1[2 * ic], &ut[ic2], vt1, NC);
426  mult_udagv(&wt2[2 * ic], &ut[ic2], vt2, NC);
427  }
428 
429  save_vec(&buf[0], wt1, NVC);
430  save_vec(&buf[VLEN * NVC], wt2, NVC);
431  }
432 
433 
434 //====================================================================
435  template<typename REALTYPE>
436  inline void mult_wilson_tm2_dirac(Vsimd_t *v2, REALTYPE *buf)
437  {
438  Vsimd_t wt1[2], wt2[2];
439  for (int ic = 0; ic < NC; ++ic) {
440  int ic2 = ND * 2 * ic;
441  load_vec(wt1, &buf[VLEN * 2 * ic], 2);
442  load_vec(wt2, &buf[VLEN * 2 * (ic + NC)], 2);
443  set_sp4_tm_dirac(&v2[ic2], wt1, wt2);
444  }
445  }
446 
447 
448 //====================================================================
449  template<typename REALTYPE>
450  inline void mult_wilson_tmb_dirac(Vsimd_t *v2, REALTYPE *u, REALTYPE *v1)
451  {
452  Vsimd_t vt1[NVC], vt2[NVC];
453  set_sp2_tm_dirac(vt1, vt2, v1);
454 
455  Vsimd_t ut[NDF];
456  load_vec(ut, u, NDF);
457 
458  Vsimd_t wt1[2], wt2[2];
459  for (int ic = 0; ic < NC; ++ic) {
460  int ic2 = NVC * ic;
461  int ic3 = ND * 2 * ic;
462  mult_udagv(wt1, &ut[ic2], vt1, NC);
463  mult_udagv(wt2, &ut[ic2], vt2, NC);
464  set_sp4_tm_dirac(&v2[ic3], wt1, wt2);
465  }
466  }
467 
468 
469 //====================================================================
470 } // nameless namespace end
471 
472 #endif
NVCD
#define NVCD
Definition: define_params_SU3.h:20
VLEN
#define VLEN
Definition: bridgeQXS_Clover_coarse_double.cpp:12
NDF
#define NDF
Definition: field_F_imp_SU2-inc.h:4
Vsimd_t
Definition: vsimd_double-inc.h:13
NC
#define NC
Definition: field_F_imp_SU2-inc.h:2
ND
#define ND
Definition: field_F_imp_SU2-inc.h:5
NVC
#define NVC
Definition: fopr_Wilson_impl_SU2-inc.h:15