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