10 #ifndef QXS_AFIELD_GAUGE_INC_INCLUDED
11 #define QXS_AFIELD_GAUGE_INC_INCLUDED
19 #include "lib_alt_QXS/inline/afield_th-inc.h"
31 template <
typename REALTYPE>
33 const std::vector<int>& boundary)
44 int Nvol = Nx * Ny * Nz * Nt;
49 vout.
crucial(
"set_boundary: wrong size of input field\n");
59 if(boundary[mu] != 1 && ipex == npex-1){
62 int Nyzt = Ny * Nz * Nt;
65 set_threadtask(ith, nth, is, ns, Nyzt);
68 int site = Nx-1 + Nx *
iyzt;
69 for(
int in = 0; in < Nin; ++in){
70 int idx = index.idx_G(in, site, mu);
82 if(boundary[mu] != 1 && ipey == npey-1){
85 int Nxzt = Nx * Nz * Nt;
88 set_threadtask(ith, nth, is, ns, Nxzt);
90 for(
int ixzt = is; ixzt < ns; ++ixzt){
93 int site =
ix + Nx * (Ny-1 + Ny *
izt);
94 for(
int in = 0; in < Nin; ++in){
95 int idx = index.idx_G(in, site, mu);
107 if(boundary[mu] != 1 && ipez == npez-1){
113 int ith, nth, is, ns;
114 set_threadtask(ith, nth, is, ns, Nxyt);
116 for(
int ixyt = is; ixyt < ns; ++ixyt){
117 int ixy = ixyt % Nxy;
119 int site =
ixy + Nxy * (Nz-1 + Nz *
it);
120 for(
int in = 0; in < Nin; ++in){
121 int idx = index.idx_G(in, site, mu);
133 if(boundary[mu] != 1 && ipet == npet-1){
136 int Nxyz = Nx * Ny * Nz;
138 int ith, nth, is, ns;
139 set_threadtask(ith, nth, is, ns, Nxyz);
142 int site =
ixyz + Nxyz * (Nt-1);
143 for(
int in = 0; in < Nin; ++in){
144 int idx = index.idx_G(in, site, mu);
157 template <
typename REALTYPE>
169 REALTYPE* up = u.
ptr(
NDF * Nst * exu);
170 REALTYPE* vp =
const_cast<AFIELD*
>(&v)->ptr(
NDF * Nst * exv);
171 REALTYPE* wp =
const_cast<AFIELD*
>(&w)->ptr(
NDF * Nst * exw);
173 int ith, nth, is, ns;
174 set_threadtask(ith, nth, is, ns, Nstv);
178 for(
int site = is; site < ns; ++site){
179 REALTYPE* upt = &up[
VLEN *
NDF * site];
180 REALTYPE* vpt = &vp[
VLEN *
NDF * site];
181 REALTYPE* wpt = &wp[
VLEN *
NDF * site];
183 svreal_t w00r, w00i, w01r, w01i, w02r, w02i;
184 load_vec(pg, w00r, &wpt[
VLEN * idxGr(0,0)]);
185 load_vec(pg, w00i, &wpt[
VLEN * idxGi(0,0)]);
186 load_vec(pg, w01r, &wpt[
VLEN * idxGr(0,1)]);
187 load_vec(pg, w01i, &wpt[
VLEN * idxGi(0,1)]);
188 load_vec(pg, w02r, &wpt[
VLEN * idxGr(0,2)]);
189 load_vec(pg, w02i, &wpt[
VLEN * idxGi(0,2)]);
191 svreal_t w10r, w10i, w11r, w11i, w12r, w12i;
192 load_vec(pg, w10r, &wpt[
VLEN * idxGr(1,0)]);
193 load_vec(pg, w10i, &wpt[
VLEN * idxGi(1,0)]);
194 load_vec(pg, w11r, &wpt[
VLEN * idxGr(1,1)]);
195 load_vec(pg, w11i, &wpt[
VLEN * idxGi(1,1)]);
196 load_vec(pg, w12r, &wpt[
VLEN * idxGr(1,2)]);
197 load_vec(pg, w12i, &wpt[
VLEN * idxGi(1,2)]);
199 svreal_t w20r, w20i, w21r, w21i, w22r, w22i;
200 load_vec(pg, w20r, &wpt[
VLEN * idxGr(2,0)]);
201 load_vec(pg, w20i, &wpt[
VLEN * idxGi(2,0)]);
202 load_vec(pg, w21r, &wpt[
VLEN * idxGr(2,1)]);
203 load_vec(pg, w21i, &wpt[
VLEN * idxGi(2,1)]);
204 load_vec(pg, w22r, &wpt[
VLEN * idxGr(2,2)]);
205 load_vec(pg, w22i, &wpt[
VLEN * idxGi(2,2)]);
207 for(
int ic1 = 0; ic1 <
NC; ++ic1){
209 svreal_t v0r, v0i, v1r, v1i, v2r, v2i;
210 load_vec(pg, v0r, &vpt[
VLEN * idxGr(ic1,0)]);
211 load_vec(pg, v0i, &vpt[
VLEN * idxGi(ic1,0)]);
212 load_vec(pg, v1r, &vpt[
VLEN * idxGr(ic1,1)]);
213 load_vec(pg, v1i, &vpt[
VLEN * idxGi(ic1,1)]);
214 load_vec(pg, v2r, &vpt[
VLEN * idxGr(ic1,2)]);
215 load_vec(pg, v2i, &vpt[
VLEN * idxGi(ic1,2)]);
217 svreal_t ut0r, ut0i, ut1r, ut1i, ut2r, ut2i;
218 mul_vec( pg, ut0r, v0r, w00r);
219 mul_vec( pg, ut0i, v0r, w00i);
220 mul_vec( pg, ut1r, v0r, w01r);
221 mul_vec( pg, ut1i, v0r, w01i);
222 mul_vec( pg, ut2r, v0r, w02r);
223 mul_vec( pg, ut2i, v0r, w02i);
225 ymax_vec(pg, ut0r, v0i, w00i);
226 axpy_vec(pg, ut0i, v0i, w00r);
227 ymax_vec(pg, ut1r, v0i, w01i);
228 axpy_vec(pg, ut1i, v0i, w01r);
229 ymax_vec(pg, ut2r, v0i, w02i);
230 axpy_vec(pg, ut2i, v0i, w02r);
232 axpy_vec(pg, ut0r, v1r, w10r);
233 axpy_vec(pg, ut0i, v1r, w10i);
234 axpy_vec(pg, ut1r, v1r, w11r);
235 axpy_vec(pg, ut1i, v1r, w11i);
236 axpy_vec(pg, ut2r, v1r, w12r);
237 axpy_vec(pg, ut2i, v1r, w12i);
239 ymax_vec(pg, ut0r, v1i, w10i);
240 axpy_vec(pg, ut0i, v1i, w10r);
241 ymax_vec(pg, ut1r, v1i, w11i);
242 axpy_vec(pg, ut1i, v1i, w11r);
243 ymax_vec(pg, ut2r, v1i, w12i);
244 axpy_vec(pg, ut2i, v1i, w12r);
246 axpy_vec(pg, ut0r, v2r, w20r);
247 axpy_vec(pg, ut0i, v2r, w20i);
248 axpy_vec(pg, ut1r, v2r, w21r);
249 axpy_vec(pg, ut1i, v2r, w21i);
250 axpy_vec(pg, ut2r, v2r, w22r);
251 axpy_vec(pg, ut2i, v2r, w22i);
253 ymax_vec(pg, ut0r, v2i, w20i);
254 axpy_vec(pg, ut0i, v2i, w20r);
255 ymax_vec(pg, ut1r, v2i, w21i);
256 axpy_vec(pg, ut1i, v2i, w21r);
257 ymax_vec(pg, ut2r, v2i, w22i);
258 axpy_vec(pg, ut2i, v2i, w22r);
260 save_vec(pg, &upt[
VLEN * idxGr(ic1,0)], ut0r);
261 save_vec(pg, &upt[
VLEN * idxGi(ic1,0)], ut0i);
262 save_vec(pg, &upt[
VLEN * idxGr(ic1,1)], ut1r);
263 save_vec(pg, &upt[
VLEN * idxGi(ic1,1)], ut1i);
264 save_vec(pg, &upt[
VLEN * idxGr(ic1,2)], ut2r);
265 save_vec(pg, &upt[
VLEN * idxGi(ic1,2)], ut2i);
274 template <
typename REALTYPE>
286 REALTYPE* up = u.
ptr(
NDF * Nst * exu);
287 REALTYPE* vp =
const_cast<AFIELD*
>(&v)->ptr(
NDF * Nst * exv);
288 REALTYPE* wp =
const_cast<AFIELD*
>(&w)->ptr(
NDF * Nst * exw);
290 int ith, nth, is, ns;
291 set_threadtask(ith, nth, is, ns, Nstv);
295 for(
int site = is; site < ns; ++site){
296 REALTYPE* upt = &up[
VLEN *
NDF * site];
297 REALTYPE* vpt = &vp[
VLEN *
NDF * site];
298 REALTYPE* wpt = &wp[
VLEN *
NDF * site];
300 svreal_t w00r, w00i, w01r, w01i, w02r, w02i;
301 load_vec(pg, w00r, &wpt[
VLEN * idxGr(0,0)]);
302 load_vec(pg, w00i, &wpt[
VLEN * idxGi(0,0)]);
303 load_vec(pg, w01r, &wpt[
VLEN * idxGr(0,1)]);
304 load_vec(pg, w01i, &wpt[
VLEN * idxGi(0,1)]);
305 load_vec(pg, w02r, &wpt[
VLEN * idxGr(0,2)]);
306 load_vec(pg, w02i, &wpt[
VLEN * idxGi(0,2)]);
308 svreal_t w10r, w10i, w11r, w11i, w12r, w12i;
309 load_vec(pg, w10r, &wpt[
VLEN * idxGr(1,0)]);
310 load_vec(pg, w10i, &wpt[
VLEN * idxGi(1,0)]);
311 load_vec(pg, w11r, &wpt[
VLEN * idxGr(1,1)]);
312 load_vec(pg, w11i, &wpt[
VLEN * idxGi(1,1)]);
313 load_vec(pg, w12r, &wpt[
VLEN * idxGr(1,2)]);
314 load_vec(pg, w12i, &wpt[
VLEN * idxGi(1,2)]);
316 svreal_t w20r, w20i, w21r, w21i, w22r, w22i;
317 load_vec(pg, w20r, &wpt[
VLEN * idxGr(2,0)]);
318 load_vec(pg, w20i, &wpt[
VLEN * idxGi(2,0)]);
319 load_vec(pg, w21r, &wpt[
VLEN * idxGr(2,1)]);
320 load_vec(pg, w21i, &wpt[
VLEN * idxGi(2,1)]);
321 load_vec(pg, w22r, &wpt[
VLEN * idxGr(2,2)]);
322 load_vec(pg, w22i, &wpt[
VLEN * idxGi(2,2)]);
324 for(
int ic1 = 0; ic1 <
NC; ++ic1){
326 svreal_t v0r, v0i, v1r, v1i, v2r, v2i;
327 load_vec(pg, v0r, &vpt[
VLEN * idxGr(ic1,0)]);
328 load_vec(pg, v0i, &vpt[
VLEN * idxGi(ic1,0)]);
329 load_vec(pg, v1r, &vpt[
VLEN * idxGr(ic1,1)]);
330 load_vec(pg, v1i, &vpt[
VLEN * idxGi(ic1,1)]);
331 load_vec(pg, v2r, &vpt[
VLEN * idxGr(ic1,2)]);
332 load_vec(pg, v2i, &vpt[
VLEN * idxGi(ic1,2)]);
334 svreal_t ut0r, ut0i, ut1r, ut1i, ut2r, ut2i;
335 mul_vec( pg, ut0r, v0r, w00r);
336 mul_vec( pg, ut0i, v0i, w00r);
337 mul_vec( pg, ut1r, v0r, w10r);
338 mul_vec( pg, ut1i, v0i, w10r);
339 mul_vec( pg, ut2r, v0r, w20r);
340 mul_vec( pg, ut2i, v0i, w20r);
342 axpy_vec(pg, ut0r, v0i, w00i);
343 ymax_vec(pg, ut0i, v0r, w00i);
344 axpy_vec(pg, ut1r, v0i, w10i);
345 ymax_vec(pg, ut1i, v0r, w10i);
346 axpy_vec(pg, ut2r, v0i, w20i);
347 ymax_vec(pg, ut2i, v0r, w20i);
349 axpy_vec(pg, ut0r, v1r, w01r);
350 axpy_vec(pg, ut0i, v1i, w01r);
351 axpy_vec(pg, ut1r, v1r, w11r);
352 axpy_vec(pg, ut1i, v1i, w11r);
353 axpy_vec(pg, ut2r, v1r, w21r);
354 axpy_vec(pg, ut2i, v1i, w21r);
356 axpy_vec(pg, ut0r, v1i, w01i);
357 ymax_vec(pg, ut0i, v1r, w01i);
358 axpy_vec(pg, ut1r, v1i, w11i);
359 ymax_vec(pg, ut1i, v1r, w11i);
360 axpy_vec(pg, ut2r, v1i, w21i);
361 ymax_vec(pg, ut2i, v1r, w21i);
363 axpy_vec(pg, ut0r, v2r, w02r);
364 axpy_vec(pg, ut0i, v2i, w02r);
365 axpy_vec(pg, ut1r, v2r, w12r);
366 axpy_vec(pg, ut1i, v2i, w12r);
367 axpy_vec(pg, ut2r, v2r, w22r);
368 axpy_vec(pg, ut2i, v2i, w22r);
370 axpy_vec(pg, ut0r, v2i, w02i);
371 ymax_vec(pg, ut0i, v2r, w02i);
372 axpy_vec(pg, ut1r, v2i, w12i);
373 ymax_vec(pg, ut1i, v2r, w12i);
374 axpy_vec(pg, ut2r, v2i, w22i);
375 ymax_vec(pg, ut2i, v2r, w22i);
377 save_vec(pg, &upt[
VLEN * idxGr(ic1,0)], ut0r);
378 save_vec(pg, &upt[
VLEN * idxGi(ic1,0)], ut0i);
379 save_vec(pg, &upt[
VLEN * idxGr(ic1,1)], ut1r);
380 save_vec(pg, &upt[
VLEN * idxGi(ic1,1)], ut1i);
381 save_vec(pg, &upt[
VLEN * idxGr(ic1,2)], ut2r);
382 save_vec(pg, &upt[
VLEN * idxGi(ic1,2)], ut2i);
391 template <
typename REALTYPE>
403 REALTYPE* up = u.
ptr(
NDF * Nst * exu);
404 REALTYPE* vp =
const_cast<AFIELD*
>(&v)->ptr(
NDF * Nst * exv);
405 REALTYPE* wp =
const_cast<AFIELD*
>(&w)->ptr(
NDF * Nst * exw);
407 int ith, nth, is, ns;
408 set_threadtask(ith, nth, is, ns, Nstv);
412 for(
int site = is; site < ns; ++site){
413 REALTYPE* upt = &up[
VLEN *
NDF * site];
414 REALTYPE* vpt = &vp[
VLEN *
NDF * site];
415 REALTYPE* wpt = &wp[
VLEN *
NDF * site];
417 svreal_t w00r, w00i, w01r, w01i, w02r, w02i;
418 load_vec(pg, w00r, &wpt[
VLEN * idxGr(0,0)]);
419 load_vec(pg, w00i, &wpt[
VLEN * idxGi(0,0)]);
420 load_vec(pg, w01r, &wpt[
VLEN * idxGr(0,1)]);
421 load_vec(pg, w01i, &wpt[
VLEN * idxGi(0,1)]);
422 load_vec(pg, w02r, &wpt[
VLEN * idxGr(0,2)]);
423 load_vec(pg, w02i, &wpt[
VLEN * idxGi(0,2)]);
425 svreal_t w10r, w10i, w11r, w11i, w12r, w12i;
426 load_vec(pg, w10r, &wpt[
VLEN * idxGr(1,0)]);
427 load_vec(pg, w10i, &wpt[
VLEN * idxGi(1,0)]);
428 load_vec(pg, w11r, &wpt[
VLEN * idxGr(1,1)]);
429 load_vec(pg, w11i, &wpt[
VLEN * idxGi(1,1)]);
430 load_vec(pg, w12r, &wpt[
VLEN * idxGr(1,2)]);
431 load_vec(pg, w12i, &wpt[
VLEN * idxGi(1,2)]);
433 svreal_t w20r, w20i, w21r, w21i, w22r, w22i;
434 load_vec(pg, w20r, &wpt[
VLEN * idxGr(2,0)]);
435 load_vec(pg, w20i, &wpt[
VLEN * idxGi(2,0)]);
436 load_vec(pg, w21r, &wpt[
VLEN * idxGr(2,1)]);
437 load_vec(pg, w21i, &wpt[
VLEN * idxGi(2,1)]);
438 load_vec(pg, w22r, &wpt[
VLEN * idxGr(2,2)]);
439 load_vec(pg, w22i, &wpt[
VLEN * idxGi(2,2)]);
441 for(
int ic1 = 0; ic1 <
NC; ++ic1){
443 svreal_t v0r, v0i, v1r, v1i, v2r, v2i;
444 load_vec(pg, v0r, &vpt[
VLEN * idxGr(0,ic1)]);
445 load_vec(pg, v0i, &vpt[
VLEN * idxGi(0,ic1)]);
446 load_vec(pg, v1r, &vpt[
VLEN * idxGr(1,ic1)]);
447 load_vec(pg, v1i, &vpt[
VLEN * idxGi(1,ic1)]);
448 load_vec(pg, v2r, &vpt[
VLEN * idxGr(2,ic1)]);
449 load_vec(pg, v2i, &vpt[
VLEN * idxGi(2,ic1)]);
451 svreal_t ut0r, ut0i, ut1r, ut1i, ut2r, ut2i;
452 mul_vec( pg, ut0r, v0r, w00r);
453 mul_vec( pg, ut0i, v0r, w00i);
454 mul_vec( pg, ut1r, v0r, w01r);
455 mul_vec( pg, ut1i, v0r, w01i);
456 mul_vec( pg, ut2r, v0r, w02r);
457 mul_vec( pg, ut2i, v0r, w02i);
459 axpy_vec(pg, ut0r, v0i, w00i);
460 ymax_vec(pg, ut0i, v0i, w00r);
461 axpy_vec(pg, ut1r, v0i, w01i);
462 ymax_vec(pg, ut1i, v0i, w01r);
463 axpy_vec(pg, ut2r, v0i, w02i);
464 ymax_vec(pg, ut2i, v0i, w02r);
466 axpy_vec(pg, ut0r, v1r, w10r);
467 axpy_vec(pg, ut0i, v1r, w10i);
468 axpy_vec(pg, ut1r, v1r, w11r);
469 axpy_vec(pg, ut1i, v1r, w11i);
470 axpy_vec(pg, ut2r, v1r, w12r);
471 axpy_vec(pg, ut2i, v1r, w12i);
473 axpy_vec(pg, ut0r, v1i, w10i);
474 ymax_vec(pg, ut0i, v1i, w10r);
475 axpy_vec(pg, ut1r, v1i, w11i);
476 ymax_vec(pg, ut1i, v1i, w11r);
477 axpy_vec(pg, ut2r, v1i, w12i);
478 ymax_vec(pg, ut2i, v1i, w12r);
480 axpy_vec(pg, ut0r, v2r, w20r);
481 axpy_vec(pg, ut0i, v2r, w20i);
482 axpy_vec(pg, ut1r, v2r, w21r);
483 axpy_vec(pg, ut1i, v2r, w21i);
484 axpy_vec(pg, ut2r, v2r, w22r);
485 axpy_vec(pg, ut2i, v2r, w22i);
487 axpy_vec(pg, ut0r, v2i, w20i);
488 ymax_vec(pg, ut0i, v2i, w20r);
489 axpy_vec(pg, ut1r, v2i, w21i);
490 ymax_vec(pg, ut1i, v2i, w21r);
491 axpy_vec(pg, ut2r, v2i, w22i);
492 ymax_vec(pg, ut2i, v2i, w22r);
494 save_vec(pg, &upt[
VLEN * idxGr(ic1,0)], ut0r);
495 save_vec(pg, &upt[
VLEN * idxGi(ic1,0)], ut0i);
496 save_vec(pg, &upt[
VLEN * idxGr(ic1,1)], ut1r);
497 save_vec(pg, &upt[
VLEN * idxGi(ic1,1)], ut1i);
498 save_vec(pg, &upt[
VLEN * idxGr(ic1,2)], ut2r);
499 save_vec(pg, &upt[
VLEN * idxGi(ic1,2)], ut2i);
508 template <
typename REALTYPE>
519 REALTYPE* up = u.
ptr(
NDF * Nst * ex);
521 int ith, nth, is, ns;
522 set_threadtask(ith, nth, is, ns, Nstv);
526 set_vec(pg, zero, 0.0);
528 for(
int site = is; site < ns; ++site){
530 REALTYPE* upt = &up[
VLEN *
NDF * site];
533 set_vec(pg, tri,
real_t(0.0));
535 for(
int ic1 = 0; ic1 <
NC; ++ic1){
536 for(
int ic2 = ic1; ic2 <
NC; ++ic2){
538 svreal_t ur, ui, unr, uni, utr, uti;
539 load_vec(pg, unr, &upt[
VLEN * idxGr(ic1,ic2)]);
540 load_vec(pg, uni, &upt[
VLEN * idxGi(ic1,ic2)]);
541 load_vec(pg, utr, &upt[
VLEN * idxGr(ic2,ic1)]);
542 load_vec(pg, uti, &upt[
VLEN * idxGi(ic2,ic1)]);
543 sub_vec(pg, ur, unr, utr);
544 add_vec(pg, ui, uni, uti);
545 scal_vec(pg, ur,
real_t(0.5));
546 scal_vec(pg, ui,
real_t(0.5));
547 save_vec(pg, &upt[
VLEN * idxGr(ic1,ic2)], ur);
548 save_vec(pg, &upt[
VLEN * idxGi(ic1,ic2)], ui);
549 scal_vec(pg, ur,
real_t(-1.0));
550 save_vec(pg, &upt[
VLEN * idxGr(ic2,ic1)], ur);
551 save_vec(pg, &upt[
VLEN * idxGi(ic2,ic1)], ui);
554 load_vec(pg, uti, &upt[
VLEN * idxGi(ic1,ic1)]);
555 add_vec(pg, tri, uti);
561 for(
int ic1 = 0; ic1 <
NC; ++ic1){
562 load_vec(pg, uti, &upt[
VLEN * idxGi(ic1,ic1)]);
563 axpy_vec(pg, uti, -1.0/3.0, tri);
564 save_vec(pg, &upt[
VLEN * idxGr(ic1,ic1)], zero);
565 save_vec(pg, &upt[
VLEN * idxGi(ic1,ic1)], uti);