10 #ifndef QXS_AFIELD_INC_INCLUDED
11 #define QXS_AFIELD_INC_INCLUDED
17 #include "lib_alt_QXS/inline/define_vlen.h"
18 #include "lib_alt_QXS/inline/afield_th-inc.h"
22 template<
typename REALTYPE>
30 template<
typename REALTYPE>
39 template<
typename REALTYPE>
44 v.
axpy(exv, a, w, exw);
49 template<
typename REALTYPE>
59 template<
typename REALTYPE>
62 v.
axpy(real(a), imag(a), w);
67 template<
typename REALTYPE>
72 v.
axpy(ex, real(a), imag(a), w, ex_w);
77 template<
typename REALTYPE>
86 template<
typename REALTYPE>
89 v.
aypx(real(a), imag(a), w);
94 template<
typename REALTYPE>
102 template<
typename REALTYPE>
105 v.
scal(real(a), imag(a));
110 template<
typename REALTYPE>
118 template<
typename REALTYPE>
122 v.
dotc(vw_r, vw_i, w);
128 template<
class INDEX,
class AFIELD>
138 int ith, nth, is, ns;
139 set_threadtask(ith, nth, is, ns, Nvol);
143 for (
int ex = 0; ex < Nex; ++ex) {
144 for (
int site = is; site < ns; ++site) {
145 for (
int in = 0; in < Nin; ++in) {
146 int iw = in + Nin * (site + Nvol * ex);
147 int iv = index.idx(in, Nin, site, ex);
158 template<
class INDEX,
class AFIELD>
166 int ith, nth, is, ns;
167 set_threadtask(ith, nth, is, ns, Nvol);
171 for (
int ex = 0; ex < Nex; ++ex) {
172 for (
int site = is; site < ns; ++site) {
173 for (
int in = 0; in < Nin; ++in) {
174 int iw = in + Nin * (site + Nvol * ex);
175 int iv = index.idx(in, Nin, site, ex);
176 v.
set(iv,
double(w.
cmp(iw)));
186 template<
class INDEX,
class AFIELD>
196 assert(Nin == 2 * Nc * Nd);
200 int ith, nth, is, ns;
201 set_threadtask(ith, nth, is, ns, Nvol);
205 for (
int ex = 0; ex < Nex; ++ex) {
206 for (
int site = is; site < ns; ++site) {
207 for (
int id = 0;
id < Nd; ++id) {
208 for (
int ic = 0; ic < Nc; ++ic) {
209 int iwr = 2 * (ic + Nc * id) + Nin * (site + Nvol * ex);
210 int iwi = 1 + 2 * (ic + Nc * id) + Nin * (site + Nvol * ex);
211 int ivr = index.idx_SPr(ic,
id, site, ex);
212 int ivi = index.idx_SPi(ic,
id, site, ex);
215 v2[ivr] = w.
cmp(iwr);
216 v2[ivi] = w.
cmp(iwi);
227 template<
class INDEX,
class AFIELD>
236 assert(Nin == 2 * Nc * Nc);
240 int ith, nth, is, ns;
241 set_threadtask(ith, nth, is, ns, Nvol);
245 for (
int ex = 0; ex < Nex; ++ex) {
246 for (
int site = is; site < ns; ++site) {
247 for (
int ic2 = 0; ic2 < Nc; ++ic2) {
248 for (
int ic1 = 0; ic1 < Nc; ++ic1) {
249 int iwr = 2 * (ic1 + Nc * ic2) + Nin * (site + Nvol * ex);
250 int iwi = 1 + 2 * (ic1 + Nc * ic2) + Nin * (site + Nvol * ex);
251 int ivr = index.idx_Gr(ic1, ic2, site, ex);
252 int ivi = index.idx_Gi(ic1, ic2, site, ex);
255 v2[ivr] = w.
cmp(iwr);
256 v2[ivi] = w.
cmp(iwi);
267 template<
class INDEX2,
class FIELD2,
class INDEX1,
class FIELD1>
269 const INDEX1& index1,
const FIELD1& v1)
272 int Nvol = v1.nvol();
274 assert(v2.check_size(Nin, Nvol, Nex));
276 int ith, nth, is, ns;
279 set_threadtask(ith, nth, is, ns, Nvol /
VLENS);
280 for (
int ex = 0; ex < Nex; ++ex) {
281 for (
int vsite = is; vsite < ns; ++vsite) {
282 for (
int in = 0; in < Nin; ++in) {
283 for (
int vin = 0; vin <
VLENS; ++vin) {
284 int site =
VLENS * vsite + vin;
285 int iv1 = index1.idx(in, Nin, site, ex);
286 int iv2 = index2.idx(in, Nin, site, ex);
287 v2.e(iv2) = v1.cmp(iv1);
293 set_threadtask(ith, nth, is, ns, Nvol /
VLEND);
294 for (
int ex = 0; ex < Nex; ++ex) {
295 for (
int vsite = is; vsite < ns; ++vsite) {
296 for (
int in = 0; in < Nin; ++in) {
297 for (
int vin = 0; vin <
VLEND; ++vin) {
298 int site =
VLEND * vsite + vin;
299 int iv1 = index1.idx(in, Nin, site, ex);
300 int iv2 = index2.idx(in, Nin, site, ex);
301 v2.e(iv2) = v1.cmp(iv1);
314 template<
class INDEX2,
class FIELD2,
class INDEX1,
class FIELD1>
316 const INDEX1& index1,
const FIELD1& v1)
319 int Nvol = v1.nvol();
321 assert(v2.check_size(Nin, Nvol, Nex));
323 int ith, nth, is, ns;
325 set_threadtask(ith, nth, is, ns, Nvol /
VLENS);
326 for (
int ex = 0; ex < Nex; ++ex) {
327 for (
int vsite = is; vsite < ns; ++vsite) {
328 for (
int in = 0; in < Nin; ++in) {
329 for (
int vin = 0; vin <
VLENS; ++vin) {
330 int site =
VLENS * vsite + vin;
331 int iv1 = index1.idxh(in, Nin, site, ex);
332 int iv2 = index2.idxh(in, Nin, site, ex);
333 v2.e(iv2) = v1.cmp(iv1);
339 set_threadtask(ith, nth, is, ns, Nvol /
VLEND);
340 for (
int ex = 0; ex < Nex; ++ex) {
341 for (
int vsite = is; vsite < ns; ++vsite) {
342 for (
int in = 0; in < Nin; ++in) {
343 for (
int vin = 0; vin <
VLEND; ++vin) {
344 int site =
VLEND * vsite + vin;
345 int iv1 = index1.idxh(in, Nin, site, ex);
346 int iv2 = index2.idxh(in, Nin, site, ex);
347 v2.e(iv2) = v1.cmp(iv1);
359 template<
class INDEX,
class FIELD>
365 w.check_size(Nin, Nvol, Nex);
367 int ith, nth, is, ns;
368 set_threadtask(ith, nth, is, ns, Nvol);
372 for (
int ex = 0; ex < Nex; ++ex) {
373 for (
int site = is; site < ns; ++site) {
374 for (
int in = 0; in < Nin; ++in) {
375 int iv = in + Nin * (site + Nvol * ex);
376 int iw = index.idx(in, Nin, site, ex);
377 v.
set(iv,
double(w.cmp(iw)));
387 template<
class INDEX,
class FIELD>
393 w.check_size(Nin, Nvol, Nex);
397 assert(Nin == 2 * Nc * Nd);
399 int ith, nth, is, ns;
400 set_threadtask(ith, nth, is, ns, Nvol);
404 for (
int ex = 0; ex < Nex; ++ex) {
405 for (
int site = is; site < ns; ++site) {
406 for (
int id = 0;
id < Nd; ++id) {
407 for (
int ic = 0; ic < Nc; ++ic) {
408 int ivr = 2 * (ic + Nc * id) + Nin * (site + Nvol * ex);
409 int ivi = 1 + 2 * (ic + Nc * id) + Nin * (site + Nvol * ex);
410 int iwr = index.idx_SPr(ic,
id, site, ex);
411 int iwi = index.idx_SPi(ic,
id, site, ex);
412 v.
set(ivr,
double(w.cmp(iwr)));
413 v.
set(ivi,
double(w.cmp(iwi)));
424 template<
class INDEX,
class FIELD>
430 w.check_size(Nin, Nvol, Nex);
433 assert(Nin == 2 * Nc * Nc);
435 int ith, nth, is, ns;
436 set_threadtask(ith, nth, is, ns, Nvol);
440 for (
int ex = 0; ex < Nex; ++ex) {
441 for (
int site = is; site < ns; ++site) {
442 for (
int ic2 = 0; ic2 < Nc; ++ic2) {
443 for (
int ic1 = 0; ic1 < Nc; ++ic1) {
444 int ivr = 2 * (ic1 + Nc * ic2) + Nin * (site + Nvol * ex);
445 int ivi = 1 + 2 * (ic1 + Nc * ic2) + Nin * (site + Nvol * ex);
446 int iwr = index.idx_Gr(ic1, ic2, site, ex);
447 int iwi = index.idx_Gi(ic1, ic2, site, ex);
448 v.
set(ivr,
double(w.cmp(iwr)));
449 v.
set(ivi,
double(w.cmp(iwi)));
460 template<
typename REALTYPE>
470 template<
typename REALTYPE>
472 REALTYPE& v_norm2, REALTYPE& w_norm2,
477 assert(v.
nex() == w.
nex());
479 assert(v.
nin() == w.
nin());
485 #define AFIELD_HAS_DOTC_AND_NORM2