Bridge++  Ver.2.1.3
afield-inc.h
Go to the documentation of this file.
1 
10 #ifndef QXS_AFIELD_INC_INCLUDED
11 #define QXS_AFIELD_INC_INCLUDED
12 
13 #include <cstdlib>
14 
15 #include "complexTraits.h"
17 #include "lib_alt_QXS/inline/define_vlen.h"
18 #include "lib_alt_QXS/inline/afield_th-inc.h"
19 
20 
21 //====================================================================
22 template<typename REALTYPE>
24 {
25  v.copy(w);
26 }
27 
28 
29 //====================================================================
30 template<typename REALTYPE>
31 void copy(AField<REALTYPE, QXS>& v, const int ex,
32  const AField<REALTYPE, QXS>& w, const int ex_w)
33 {
34  v.copy(ex, w, ex_w);
35 }
36 
37 
38 //====================================================================
39 template<typename REALTYPE>
40 void axpy(AField<REALTYPE, QXS>& v, const int exv,
41  const typename AField<REALTYPE, QXS>::real_t a,
42  const AField<REALTYPE, QXS>& w, const int exw)
43 {
44  v.axpy(exv, a, w, exw);
45 }
46 
47 
48 //====================================================================
49 template<typename REALTYPE>
51  const typename AField<REALTYPE, QXS>::real_t a,
52  const AField<REALTYPE, QXS>& w)
53 {
54  v.axpy(a, w);
55 }
56 
57 
58 //====================================================================
59 template<typename REALTYPE>
61 {
62  v.axpy(real(a), imag(a), w);
63 }
64 
65 
66 //====================================================================
67 template<typename REALTYPE>
68 void axpy(AField<REALTYPE, QXS>& v, const int ex,
69  const typename AField<REALTYPE, QXS>::complex_t a,
70  const AField<REALTYPE, QXS>& w, const int ex_w)
71 {
72  v.axpy(ex, real(a), imag(a), w, ex_w);
73 }
74 
75 
76 //====================================================================
77 template<typename REALTYPE>
78 void aypx(const typename AField<REALTYPE, QXS>::real_t a,
80 {
81  v.aypx(a, w);
82 }
83 
84 
85 //====================================================================
86 template<typename REALTYPE>
88 {
89  v.aypx(real(a), imag(a), w);
90 }
91 
92 
93 //====================================================================
94 template<typename REALTYPE>
95 void scal(AField<REALTYPE, QXS>& v, REALTYPE a)
96 {
97  v.scal(a);
98 }
99 
100 
101 //====================================================================
102 template<typename REALTYPE>
104 {
105  v.scal(real(a), imag(a));
106 }
107 
108 
109 //====================================================================
110 template<typename REALTYPE>
112 {
113  return v.dot(w);
114 }
115 
116 
117 //====================================================================
118 template<typename REALTYPE>
120 {
121  REALTYPE vw_r, vw_i;
122  v.dotc(vw_r, vw_i, w);
123  return typename AField<REALTYPE, QXS>::complex_t(vw_r, vw_i);
124 }
125 
126 
127 //====================================================================
128 template<class INDEX, class AFIELD>
129 void convert(INDEX& index, AFIELD& v, const Field& w)
130 {
131  int Nin = w.nin();
132  int Nvol = w.nvol();
133  int Nex = w.nex();
134  assert(v.check_size(Nin, Nvol, Nex));
135 
136  typename AFIELD::real_t *v2 = const_cast<AFIELD *>(&v)->ptr(0);
137 
138  int ith, nth, is, ns;
139  set_threadtask(ith, nth, is, ns, Nvol);
140 
141 #pragma omp barrier
142 
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);
148  v2[iv] = w.cmp(iw);
149  }
150  }
151  }
152 
153 #pragma omp barrier
154 }
155 
156 
157 //====================================================================
158 template<class INDEX, class AFIELD>
159 void reverse(INDEX& index, Field& v, const AFIELD& w)
160 {
161  int Nin = w.nin();
162  int Nvol = w.nvol();
163  int Nex = w.nex();
164  assert(v.check_size(Nin, Nvol, Nex));
165 
166  int ith, nth, is, ns;
167  set_threadtask(ith, nth, is, ns, Nvol);
168 
169 #pragma omp barrier
170 
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)));
177  }
178  }
179  }
180 
181 #pragma omp barrier
182 }
183 
184 
185 //====================================================================
186 template<class INDEX, class AFIELD>
187 void convert_spinor(INDEX& index, AFIELD& v, const Field& w)
188 {
189  int Nin = w.nin();
190  int Nvol = w.nvol();
191  int Nex = w.nex();
192  assert(v.check_size(Nin, Nvol, Nex));
193 
194  int Nc = CommonParameters::Nc();
195  int Nd = CommonParameters::Nd();
196  assert(Nin == 2 * Nc * Nd);
197 
198  typename AFIELD::real_t *v2 = const_cast<AFIELD *>(&v)->ptr(0);
199 
200  int ith, nth, is, ns;
201  set_threadtask(ith, nth, is, ns, Nvol);
202 
203 #pragma omp barrier
204 
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);
213  //v.e(ivr) = w.cmp(iwr);
214  //v.e(ivi) = w.cmp(iwi);
215  v2[ivr] = w.cmp(iwr);
216  v2[ivi] = w.cmp(iwi);
217  }
218  }
219  }
220  }
221 
222 #pragma omp barrier
223 }
224 
225 
226 //====================================================================
227 template<class INDEX, class AFIELD>
228 void convert_gauge(INDEX& index, AFIELD& v, const Field& w)
229 {
230  int Nin = w.nin();
231  int Nvol = w.nvol();
232  int Nex = w.nex();
233  assert(v.check_size(Nin, Nvol, Nex));
234 
235  int Nc = CommonParameters::Nc();
236  assert(Nin == 2 * Nc * Nc);
237 
238  typename AFIELD::real_t *v2 = const_cast<AFIELD *>(&v)->ptr(0);
239 
240  int ith, nth, is, ns;
241  set_threadtask(ith, nth, is, ns, Nvol);
242 
243 #pragma omp barrier
244 
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);
253  //v.e(ivr) = w.cmp(iwr);
254  //v.e(ivi) = w.cmp(iwi);
255  v2[ivr] = w.cmp(iwr);
256  v2[ivi] = w.cmp(iwi);
257  }
258  }
259  }
260  }
261 
262 #pragma omp barrier
263 }
264 
265 
266 //====================================================================
267 template<class INDEX2, class FIELD2, class INDEX1, class FIELD1>
268 void convert(INDEX2& index2, FIELD2& v2,
269  const INDEX1& index1, const FIELD1& v1)
270 {
271  int Nin = v1.nin();
272  int Nvol = v1.nvol();
273  int Nex = v1.nex();
274  assert(v2.check_size(Nin, Nvol, Nex));
275 
276  int ith, nth, is, ns;
277 
278  if ((sizeof(typename FIELD1::real_t) == 4) || (sizeof(typename FIELD2::real_t) == 4)) {
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);
288  }
289  }
290  }
291  }
292  } else {
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);
302  }
303  }
304  }
305  }
306  }
307 
308 
309 #pragma omp barrier
310 }
311 
312 
313 //====================================================================
314 template<class INDEX2, class FIELD2, class INDEX1, class FIELD1>
315 void convert_h(INDEX2& index2, FIELD2& v2,
316  const INDEX1& index1, const FIELD1& v1)
317 {
318  int Nin = v1.nin();
319  int Nvol = v1.nvol();
320  int Nex = v1.nex();
321  assert(v2.check_size(Nin, Nvol, Nex));
322 
323  int ith, nth, is, ns;
324  if ((sizeof(typename FIELD1::real_t) == 4) || (sizeof(typename FIELD2::real_t) == 4)) {
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);
334  }
335  }
336  }
337  }
338  } else {
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);
348  }
349  }
350  }
351  }
352  }
353 
354 #pragma omp barrier
355 }
356 
357 
358 //====================================================================
359 template<class INDEX, class FIELD>
360 void reverse(INDEX& index, Field& v, FIELD& w)
361 {
362  int Nin = v.nin();
363  int Nvol = v.nvol();
364  int Nex = v.nex();
365  w.check_size(Nin, Nvol, Nex);
366 
367  int ith, nth, is, ns;
368  set_threadtask(ith, nth, is, ns, Nvol);
369 
370 #pragma omp barrier
371 
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)));
378  }
379  }
380  }
381 
382 #pragma omp barrier
383 }
384 
385 
386 //====================================================================
387 template<class INDEX, class FIELD>
388 void reverse_spinor(INDEX& index, Field& v, FIELD& w)
389 {
390  int Nin = v.nin();
391  int Nvol = v.nvol();
392  int Nex = v.nex();
393  w.check_size(Nin, Nvol, Nex);
394 
395  int Nc = CommonParameters::Nc();
396  int Nd = CommonParameters::Nd();
397  assert(Nin == 2 * Nc * Nd);
398 
399  int ith, nth, is, ns;
400  set_threadtask(ith, nth, is, ns, Nvol);
401 
402 #pragma omp barrier
403 
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)));
414  }
415  }
416  }
417  }
418 
419 #pragma omp barrier
420 }
421 
422 
423 //====================================================================
424 template<class INDEX, class FIELD>
425 void reverse_gauge(INDEX& index, Field& v, FIELD& w)
426 {
427  int Nin = v.nin();
428  int Nvol = v.nvol();
429  int Nex = v.nex();
430  w.check_size(Nin, Nvol, Nex);
431 
432  int Nc = CommonParameters::Nc();
433  assert(Nin == 2 * Nc * Nc);
434 
435  int ith, nth, is, ns;
436  set_threadtask(ith, nth, is, ns, Nvol);
437 
438 #pragma omp barrier
439 
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)));
450  }
451  }
452  }
453  }
454 
455 #pragma omp barrier
456 }
457 
458 
459 //====================================================================
460 template<typename REALTYPE>
461 REALTYPE norm2(const AField<REALTYPE, QXS>& v)
462 {
463  AField<REALTYPE, QXS> *vp = const_cast<AField<REALTYPE, QXS> *>(&v);
464  return vp->norm2();
465  // return v.norm2();
466 }
467 
468 
469 //====================================================================
470 template<typename REALTYPE>
472  REALTYPE& v_norm2, REALTYPE& w_norm2,
473  const AField<REALTYPE, QXS>& v,
474  const AField<REALTYPE, QXS>& w)
475 {
476  // returns <v|w>, <v|v>, <w|w>
477  assert(v.nex() == w.nex());
478  assert(v.nvol() == w.nvol());
479  assert(v.nin() == w.nin());
480 
481  dotc = v.dotc_and_norm2(v_norm2, w_norm2, w);
482 }
483 
484 
485 #define AFIELD_HAS_DOTC_AND_NORM2
486 
487 //============================================================END=====
488 #endif
AField< REALTYPE, QXS >::nex
int nex() const
returning size of extra d.o.f.
Definition: afield.h:115
AField< REALTYPE, QXS >::axpy
void axpy(const real_t, const AField< real_t, QXS > &)
this is to be discarded.
Definition: afield-tmpl.h:154
VLEND
#define VLEND
Definition: define_vlen.h:42
convert_gauge
void convert_gauge(INDEX &index, AFIELD &v, const Field &w)
Definition: afield-inc.h:223
AField< REALTYPE, QXS >::dot
real_t dot(const AField< real_t, QXS > &) const
Definition: afield-tmpl.h:523
norm2
REALTYPE norm2(const AField< REALTYPE, ACCEL > &v)
Definition: afield-inc.h:131
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
AField< REALTYPE, QXS >
Definition: afield.h:35
AField
Definition: afield_base.h:16
AField< REALTYPE, QXS >::nvol
int nvol() const
returning size of site d.o.f.
Definition: afield.h:112
Field::nex
int nex() const
Definition: field.h:128
Field::check_size
bool check_size(const int nin, const int nvol, const int nex) const
checking size parameters. [23 May 2016 H.Matsufuru]
Definition: field.h:135
AField< REALTYPE, QXS >::norm2
real_t norm2(void) const
Definition: afield-tmpl.h:656
VLENS
#define VLENS
Definition: define_vlen.h:41
AField< REALTYPE, QXS >::copy
void copy(const Field &w)
Definition: afield-tmpl.h:71
reverse
void reverse(INDEX &index, Field &v, const AFIELD &w)
Definition: afield-inc.h:452
Field::nin
int nin() const
Definition: field.h:126
Field::real_t
double real_t
Definition: field.h:51
aypx
void aypx(const REALTYPE a, AField< REALTYPE, ACCEL > &v, const AField< REALTYPE, ACCEL > &w)
Definition: afield-inc.h:81
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
reverse_gauge
void reverse_gauge(INDEX &index, Field &v, const AFIELD &w)
Definition: afield-inc.h:552
dotc
ComplexTraits< REALTYPE >::complex_t dotc(const AField< REALTYPE, ACCEL > &v, const AField< REALTYPE, ACCEL > &w)
Definition: afield-inc.h:120
convert
void convert(INDEX &index, AFIELD &v, const Field &w)
Definition: afield-inc.h:152
reverse_spinor
void reverse_spinor(INDEX &index, Field &v, const AFIELD &w)
Definition: afield-inc.h:539
threadManager.h
copy
void copy(AField< REALTYPE, ACCEL > &v, const AField< REALTYPE, ACCEL > &w)
Definition: afield-inc.h:40
Field::nvol
int nvol() const
Definition: field.h:127
real_t
double real_t
Definition: bridgeACC_AField_double.cpp:14
AField< REALTYPE, QXS >::scal
void scal(const real_t)
Definition: afield-tmpl.h:453
dotc_and_norm2
void dotc_and_norm2(typename AField< REALTYPE, QXS >::complex_t &dotc, REALTYPE &v_norm2, REALTYPE &w_norm2, const AField< REALTYPE, QXS > &v, const AField< REALTYPE, QXS > &w)
Definition: afield-inc.h:471
AField< REALTYPE, QXS >::dotc
void dotc(real_t &, real_t &, const AField< real_t, QXS > &) const
Definition: afield-tmpl.h:579
Field::cmp
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:143
CommonParameters::Nd
static int Nd()
Definition: commonParameters.h:116
dot
REALTYPE dot(AField< REALTYPE, ACCEL > &v, AField< REALTYPE, ACCEL > &w)
Definition: afield-inc.h:113
convert_h
void convert_h(INDEX2 &index2, AFIELD2 &v2, const INDEX1 &index1, const AFIELD1 &v1)
Definition: afield-inc.h:343
complex_t
ComplexTraits< double >::complex_t complex_t
Definition: afopr_Clover_coarse_double.cpp:23
complexTraits.h
Field
Container of Field-type object.
Definition: field.h:46
scal
void scal(AField< REALTYPE, ACCEL > &v, const REALTYPE a)
Definition: afield-inc.h:98
convert_spinor
void convert_spinor(INDEX &index, AFIELD &v, const Field &w)
Definition: afield-inc.h:210
AField< REALTYPE, QXS >::aypx
void aypx(const int ex, const real_t ar, const real_t ai, const AField< real_t, QXS > &w, const int ex_w)
Definition: afield-tmpl.h:401
AField< REALTYPE, QXS >::nin
int nin() const
returning size of inner (on site) d.o.f.
Definition: afield.h:109
AField< REALTYPE, QXS >::dotc_and_norm2
complex_t dotc_and_norm2(real_t &, real_t &, const AField< real_t, QXS > &) const
Definition: afield-tmpl.h:707
axpy
void axpy(AField< REALTYPE, ACCEL > &v, const REALTYPE a, const AField< REALTYPE, ACCEL > &w)
Definition: afield-inc.h:55