Bridge++  Ver. 1.3.x
fopr_CloverTerm_imp.cpp
Go to the documentation of this file.
1 
14 #include "fopr_CloverTerm.h"
15 
16 #include "threadManager_OpenMP.h"
17 
18 #ifdef USE_PARAMETERS_FACTORY
19 #include "parameters_factory.h"
20 #endif
21 
22 using std::string;
23 
24 #if defined USE_GROUP_SU3
25 #include "fopr_Wilson_impl_SU3.inc"
26 #elif defined USE_GROUP_SU2
27 #include "fopr_Wilson_impl_SU2.inc"
28 #elif defined USE_GROUP_SU_N
29 #include "fopr_Wilson_impl_SU_N.inc"
30 #endif
31 
32 //====================================================================
33 //- parameter entries
34 namespace {
35  void append_entry(Parameters& param)
36  {
37  param.Register_double("hopping_parameter", 0.0);
38  param.Register_double("clover_coefficient", 0.0);
39  param.Register_int_vector("boundary_condition", std::vector<int>());
40 
41  param.Register_string("verbose_level", "NULL");
42  }
43 
44 
45 #ifdef USE_PARAMETERS_FACTORY
46  bool init_param = ParametersFactory::Register("", append_entry);
47 #endif
48 }
49 //- end
50 
51 //- parameters class
53 //- end
54 
55 const std::string Fopr_CloverTerm::class_name = "Fopr_CloverTerm";
56 
57 //====================================================================
59 {
60  const string str_vlevel = params.get_string("verbose_level");
61 
62  m_vl = vout.set_verbose_level(str_vlevel);
63 
64  //- fetch and check input parameters
65  double kappa, cSW;
66  std::vector<int> bc;
67 
68  int err = 0;
69  err += params.fetch_double("hopping_parameter", kappa);
70  err += params.fetch_double("clover_coefficient", cSW);
71  err += params.fetch_int_vector("boundary_condition", bc);
72 
73  if (err) {
74  vout.crucial(m_vl, "Fopr_CloverTerm: fetch error, input parameter not found.\n");
75  exit(EXIT_FAILURE);
76  }
77 
78 
79  set_parameters(kappa, cSW, bc);
80 }
81 
82 
83 //====================================================================
84 void Fopr_CloverTerm::set_parameters(double kappa, double cSW,
85  std::vector<int> bc)
86 {
87  //- print input parameters
88  vout.general(m_vl, "Parameters of Fopr_CloverTerm:\n");
89  vout.general(m_vl, " kappa = %8.4f\n", kappa);
90  vout.general(m_vl, " cSW = %8.4f\n", cSW);
91  for (int mu = 0; mu < m_Ndim; ++mu) {
92  vout.general(m_vl, " boundary[%d] = %2d\n", mu, bc[mu]);
93  }
94 
95  //- range check
96  // NB. kappa,cSW == 0 is allowed.
97  assert(bc.size() == m_Ndim);
98 
99  //- store values
100  m_kappa = kappa;
101  m_cSW = cSW;
102 
103  // m_boundary.resize(m_Ndim); // already resized in init.
104  for (int mu = 0; mu < m_Ndim; ++mu) {
105  m_boundary[mu] = bc[mu];
106  }
107 }
108 
109 
110 //====================================================================
112 {
113  m_U = (Field_G *)U;
114  set_csw();
115 }
116 
117 
118 //====================================================================
119 void Fopr_CloverTerm::init(string repr)
120 {
122  m_Ndim = CommonParameters::Ndim();
125  m_NinF = 2 * m_Nc * m_Nd;
126 
127  m_U = 0;
128 
129  m_repr = repr;
130 
131  m_boundary.resize(m_Ndim);
132  m_SG.resize(m_Ndim * m_Ndim);
133 
134  GammaMatrixSet *gmset = GammaMatrixSet::New(m_repr);
135 
136  m_GM5 = gmset->get_GM(gmset->GAMMA5);
137 
138  m_SG[sg_index(0, 1)] = gmset->get_GM(gmset->SIGMA12);
139  m_SG[sg_index(1, 2)] = gmset->get_GM(gmset->SIGMA23);
140  m_SG[sg_index(2, 0)] = gmset->get_GM(gmset->SIGMA31);
141  m_SG[sg_index(3, 0)] = gmset->get_GM(gmset->SIGMA41);
142  m_SG[sg_index(3, 1)] = gmset->get_GM(gmset->SIGMA42);
143  m_SG[sg_index(3, 2)] = gmset->get_GM(gmset->SIGMA43);
144 
145  m_SG[sg_index(1, 0)] = m_SG[sg_index(0, 1)].mult(-1);
146  m_SG[sg_index(2, 1)] = m_SG[sg_index(1, 2)].mult(-1);
147  m_SG[sg_index(0, 2)] = m_SG[sg_index(2, 0)].mult(-1);
148  m_SG[sg_index(0, 3)] = m_SG[sg_index(3, 0)].mult(-1);
149  m_SG[sg_index(1, 3)] = m_SG[sg_index(3, 1)].mult(-1);
150  m_SG[sg_index(2, 3)] = m_SG[sg_index(3, 2)].mult(-1);
151 
152  m_SG[sg_index(0, 0)] = gmset->get_GM(gmset->UNITY);
153  m_SG[sg_index(1, 1)] = gmset->get_GM(gmset->UNITY);
154  m_SG[sg_index(2, 2)] = gmset->get_GM(gmset->UNITY);
155  m_SG[sg_index(3, 3)] = gmset->get_GM(gmset->UNITY);
156  // these 4 gamma matrices are actually not used.
157 
158  // m_fopr_w = new Fopr_Wilson(repr);
159  if (m_repr == "Dirac") {
162  } else if (m_repr == "Chiral") {
165  }
166 
167  delete gmset;
168 
169  // m_w2.reset(m_NinF,m_Nvol,1);
170 }
171 
172 
173 //====================================================================
175 {
176  // nothing to do.
177 }
178 
179 
180 //====================================================================
181 void Fopr_CloverTerm::mult_gm5(Field& v, const Field& f)
182 {
183  (this->*m_gm5)(v, f);
184 }
185 
186 
187 //====================================================================
188 void Fopr_CloverTerm::gm5_dirac(Field& w, const Field& f)
189 {
190  int Nvc = 2 * CommonParameters::Nc();
191  int Nd = CommonParameters::Nd();
192 
193  const double *v1 = f.ptr(0);
194  double *v2 = w.ptr(0);
195 
196  int id1 = 0;
197  int id2 = Nvc;
198  int id3 = Nvc * 2;
199  int id4 = Nvc * 3;
200 
201  // threadding applied.
204 
205  int is = m_Nvol * ith / nth;
206  int ns = m_Nvol * (ith + 1) / nth - is;
207 
208  for (int site = is; site < is + ns; ++site) {
209  // for (int site = 0; site < m_Nvol; ++site) {
210  for (int icc = 0; icc < Nvc; icc++) {
211  int in = Nvc * Nd * site;
212  v2[icc + id1 + in] = v1[icc + id3 + in];
213  v2[icc + id2 + in] = v1[icc + id4 + in];
214  v2[icc + id3 + in] = v1[icc + id1 + in];
215  v2[icc + id4 + in] = v1[icc + id2 + in];
216  }
217  }
218 }
219 
220 
221 //====================================================================
222 void Fopr_CloverTerm::gm5_chiral(Field& w, const Field& f)
223 {
224  int Nvc = 2 * CommonParameters::Nc();
225  int Nd = CommonParameters::Nd();
226 
227  const double *v1 = f.ptr(0);
228  double *v2 = w.ptr(0);
229 
230  int id1 = 0;
231  int id2 = Nvc;
232  int id3 = Nvc * 2;
233  int id4 = Nvc * 3;
234 
235  // threadding applied.
238 
239  int is = m_Nvol * ith / nth;
240  int ns = m_Nvol * (ith + 1) / nth - is;
241 
242  for (int site = is; site < is + ns; ++site) {
243  // for (int site = 0; site < m_Nvol; ++site) {
244  for (int icc = 0; icc < Nvc; icc++) {
245  int in = Nvc * Nd * site;
246  v2[icc + id1 + in] = v1[icc + id1 + in];
247  v2[icc + id2 + in] = v1[icc + id2 + in];
248  v2[icc + id3 + in] = -v1[icc + id3 + in];
249  v2[icc + id4 + in] = -v1[icc + id4 + in];
250  }
251  }
252 }
253 
254 
255 //====================================================================
257  const int mu, const int nu)
258 {
259  assert(mu != nu);
260  mult_iGM(v, m_SG[sg_index(mu, nu)], w);
261 }
262 
263 
264 //====================================================================
265 void Fopr_CloverTerm::mult_sigmaF(Field& v, const Field& f)
266 {
267  mult_csw(v, f);
268 }
269 
270 
271 //====================================================================
272 void Fopr_CloverTerm::mult_csw(Field& v, const Field& w)
273 {
274  (this->*m_csw)(v, w);
275 }
276 
277 
278 //====================================================================
280 {
281  assert(w.nex() == 1);
282 
283  int Nc = CommonParameters::Nc();
284  int Nvc = 2 * Nc;
285  int Ndf = 2 * Nc * Nc;
286  int Nd = CommonParameters::Nd();
287  int Nvol = w.nvol();
288 
289  int id1 = 0;
290  int id2 = Nvc;
291  int id3 = Nvc * 2;
292  int id4 = Nvc * 3;
293 
294  double kappa_cSW = m_kappa * m_cSW;
295 
296  const double *w2 = w.ptr(0);
297  double *v2 = v.ptr(0);
298 
299  double *Bx = m_Bx.ptr(0);
300  double *By = m_By.ptr(0);
301  double *Bz = m_Bz.ptr(0);
302  double *Ex = m_Ex.ptr(0);
303  double *Ey = m_Ey.ptr(0);
304  double *Ez = m_Ez.ptr(0);
305 
306  // threadding applied.
309 
310  int is = m_Nvol * ith / nth;
311  int ns = m_Nvol * (ith + 1) / nth - is;
312 
313  for (int site = is; site < is + ns; ++site) {
314  int iv = Nvc * Nd * site;
315  int ig = Ndf * site;
316 
317  for (int ic = 0; ic < Nc; ++ic) {
318  int icr = 2 * ic;
319  int ici = icr + 1;
320  int icg = ic * Nvc + ig;
321 
322  v2[icr + id1 + iv] = 0.0;
323  v2[ici + id1 + iv] = 0.0;
324  v2[icr + id2 + iv] = 0.0;
325  v2[ici + id2 + iv] = 0.0;
326 
327  v2[icr + id3 + iv] = 0.0;
328  v2[ici + id3 + iv] = 0.0;
329  v2[icr + id4 + iv] = 0.0;
330  v2[ici + id4 + iv] = 0.0;
331 
332  // isigma_23 * Bx
333  v2[icr + id1 + iv] -= mult_uv_i(&Bx[icg], &w2[id2 + iv], Nc);
334  v2[ici + id1 + iv] += mult_uv_r(&Bx[icg], &w2[id2 + iv], Nc);
335  v2[icr + id2 + iv] -= mult_uv_i(&Bx[icg], &w2[id1 + iv], Nc);
336  v2[ici + id2 + iv] += mult_uv_r(&Bx[icg], &w2[id1 + iv], Nc);
337 
338  v2[icr + id3 + iv] -= mult_uv_i(&Bx[icg], &w2[id4 + iv], Nc);
339  v2[ici + id3 + iv] += mult_uv_r(&Bx[icg], &w2[id4 + iv], Nc);
340  v2[icr + id4 + iv] -= mult_uv_i(&Bx[icg], &w2[id3 + iv], Nc);
341  v2[ici + id4 + iv] += mult_uv_r(&Bx[icg], &w2[id3 + iv], Nc);
342 
343  // isigma_31 * By
344  v2[icr + id1 + iv] += mult_uv_r(&By[icg], &w2[id2 + iv], Nc);
345  v2[ici + id1 + iv] += mult_uv_i(&By[icg], &w2[id2 + iv], Nc);
346  v2[icr + id2 + iv] -= mult_uv_r(&By[icg], &w2[id1 + iv], Nc);
347  v2[ici + id2 + iv] -= mult_uv_i(&By[icg], &w2[id1 + iv], Nc);
348 
349  v2[icr + id3 + iv] += mult_uv_r(&By[icg], &w2[id4 + iv], Nc);
350  v2[ici + id3 + iv] += mult_uv_i(&By[icg], &w2[id4 + iv], Nc);
351  v2[icr + id4 + iv] -= mult_uv_r(&By[icg], &w2[id3 + iv], Nc);
352  v2[ici + id4 + iv] -= mult_uv_i(&By[icg], &w2[id3 + iv], Nc);
353 
354  // isigma_12 * Bz
355  v2[icr + id1 + iv] -= mult_uv_i(&Bz[icg], &w2[id1 + iv], Nc);
356  v2[ici + id1 + iv] += mult_uv_r(&Bz[icg], &w2[id1 + iv], Nc);
357  v2[icr + id2 + iv] += mult_uv_i(&Bz[icg], &w2[id2 + iv], Nc);
358  v2[ici + id2 + iv] -= mult_uv_r(&Bz[icg], &w2[id2 + iv], Nc);
359 
360  v2[icr + id3 + iv] -= mult_uv_i(&Bz[icg], &w2[id3 + iv], Nc);
361  v2[ici + id3 + iv] += mult_uv_r(&Bz[icg], &w2[id3 + iv], Nc);
362  v2[icr + id4 + iv] += mult_uv_i(&Bz[icg], &w2[id4 + iv], Nc);
363  v2[ici + id4 + iv] -= mult_uv_r(&Bz[icg], &w2[id4 + iv], Nc);
364 
365  // isigma_41 * Ex
366  v2[icr + id1 + iv] += mult_uv_i(&Ex[icg], &w2[id2 + iv], Nc);
367  v2[ici + id1 + iv] -= mult_uv_r(&Ex[icg], &w2[id2 + iv], Nc);
368  v2[icr + id2 + iv] += mult_uv_i(&Ex[icg], &w2[id1 + iv], Nc);
369  v2[ici + id2 + iv] -= mult_uv_r(&Ex[icg], &w2[id1 + iv], Nc);
370 
371  v2[icr + id3 + iv] -= mult_uv_i(&Ex[icg], &w2[id4 + iv], Nc);
372  v2[ici + id3 + iv] += mult_uv_r(&Ex[icg], &w2[id4 + iv], Nc);
373  v2[icr + id4 + iv] -= mult_uv_i(&Ex[icg], &w2[id3 + iv], Nc);
374  v2[ici + id4 + iv] += mult_uv_r(&Ex[icg], &w2[id3 + iv], Nc);
375 
376  // isigma_42 * Ey
377  v2[icr + id1 + iv] -= mult_uv_r(&Ey[icg], &w2[id2 + iv], Nc);
378  v2[ici + id1 + iv] -= mult_uv_i(&Ey[icg], &w2[id2 + iv], Nc);
379  v2[icr + id2 + iv] += mult_uv_r(&Ey[icg], &w2[id1 + iv], Nc);
380  v2[ici + id2 + iv] += mult_uv_i(&Ey[icg], &w2[id1 + iv], Nc);
381 
382  v2[icr + id3 + iv] += mult_uv_r(&Ey[icg], &w2[id4 + iv], Nc);
383  v2[ici + id3 + iv] += mult_uv_i(&Ey[icg], &w2[id4 + iv], Nc);
384  v2[icr + id4 + iv] -= mult_uv_r(&Ey[icg], &w2[id3 + iv], Nc);
385  v2[ici + id4 + iv] -= mult_uv_i(&Ey[icg], &w2[id3 + iv], Nc);
386 
387  // isigma_43 * Ez
388  v2[icr + id1 + iv] += mult_uv_i(&Ez[icg], &w2[id1 + iv], Nc);
389  v2[ici + id1 + iv] -= mult_uv_r(&Ez[icg], &w2[id1 + iv], Nc);
390  v2[icr + id2 + iv] -= mult_uv_i(&Ez[icg], &w2[id2 + iv], Nc);
391  v2[ici + id2 + iv] += mult_uv_r(&Ez[icg], &w2[id2 + iv], Nc);
392 
393  v2[icr + id3 + iv] -= mult_uv_i(&Ez[icg], &w2[id3 + iv], Nc);
394  v2[ici + id3 + iv] += mult_uv_r(&Ez[icg], &w2[id3 + iv], Nc);
395  v2[icr + id4 + iv] += mult_uv_i(&Ez[icg], &w2[id4 + iv], Nc);
396  v2[ici + id4 + iv] -= mult_uv_r(&Ez[icg], &w2[id4 + iv], Nc);
397 
398  // v *= m_kappa * m_cSW;
399  v2[icr + id1 + iv] *= kappa_cSW;
400  v2[ici + id1 + iv] *= kappa_cSW;
401  v2[icr + id2 + iv] *= kappa_cSW;
402  v2[ici + id2 + iv] *= kappa_cSW;
403 
404  v2[icr + id3 + iv] *= kappa_cSW;
405  v2[ici + id3 + iv] *= kappa_cSW;
406  v2[icr + id4 + iv] *= kappa_cSW;
407  v2[ici + id4 + iv] *= kappa_cSW;
408  }
409  }
410 #pragma omp barrier
411 }
412 
413 
414 //====================================================================
416 {
417  assert(w.nex() == 1);
418 
419  int Nc = CommonParameters::Nc();
420  int Nvc = 2 * Nc;
421  int Ndf = 2 * Nc * Nc;
422  int Nd = CommonParameters::Nd();
423  int Nvol = w.nvol();
424 
425  int id1 = 0;
426  int id2 = Nvc;
427  int id3 = Nvc * 2;
428  int id4 = Nvc * 3;
429 
430  double kappa_cSW = m_kappa * m_cSW;
431 
432  const double *w2 = w.ptr(0);
433  double *v2 = v.ptr(0);
434 
435  double *Bx = m_Bx.ptr(0);
436  double *By = m_By.ptr(0);
437  double *Bz = m_Bz.ptr(0);
438  double *Ex = m_Ex.ptr(0);
439  double *Ey = m_Ey.ptr(0);
440  double *Ez = m_Ez.ptr(0);
441 
442  // threadding applied.
445 
446  int is = m_Nvol * ith / nth;
447  int ns = m_Nvol * (ith + 1) / nth - is;
448 
449  for (int site = is; site < is + ns; ++site) {
450  int iv = Nvc * Nd * site;
451  int ig = Ndf * site;
452 
453  for (int ic = 0; ic < Nc; ++ic) {
454  int icr = 2 * ic;
455  int ici = icr + 1;
456  int icg = ic * Nvc + ig;
457 
458  v2[icr + id1 + iv] = 0.0;
459  v2[ici + id1 + iv] = 0.0;
460  v2[icr + id2 + iv] = 0.0;
461  v2[ici + id2 + iv] = 0.0;
462 
463  v2[icr + id3 + iv] = 0.0;
464  v2[ici + id3 + iv] = 0.0;
465  v2[icr + id4 + iv] = 0.0;
466  v2[ici + id4 + iv] = 0.0;
467 
468  // isigma_23 * Bx
469  v2[icr + id1 + iv] -= mult_uv_i(&Bx[icg], &w2[id2 + iv], Nc);
470  v2[ici + id1 + iv] += mult_uv_r(&Bx[icg], &w2[id2 + iv], Nc);
471  v2[icr + id2 + iv] -= mult_uv_i(&Bx[icg], &w2[id1 + iv], Nc);
472  v2[ici + id2 + iv] += mult_uv_r(&Bx[icg], &w2[id1 + iv], Nc);
473 
474  v2[icr + id3 + iv] -= mult_uv_i(&Bx[icg], &w2[id4 + iv], Nc);
475  v2[ici + id3 + iv] += mult_uv_r(&Bx[icg], &w2[id4 + iv], Nc);
476  v2[icr + id4 + iv] -= mult_uv_i(&Bx[icg], &w2[id3 + iv], Nc);
477  v2[ici + id4 + iv] += mult_uv_r(&Bx[icg], &w2[id3 + iv], Nc);
478 
479  // isigma_31 * By
480  v2[icr + id1 + iv] += mult_uv_r(&By[icg], &w2[id2 + iv], Nc);
481  v2[ici + id1 + iv] += mult_uv_i(&By[icg], &w2[id2 + iv], Nc);
482  v2[icr + id2 + iv] -= mult_uv_r(&By[icg], &w2[id1 + iv], Nc);
483  v2[ici + id2 + iv] -= mult_uv_i(&By[icg], &w2[id1 + iv], Nc);
484 
485  v2[icr + id3 + iv] += mult_uv_r(&By[icg], &w2[id4 + iv], Nc);
486  v2[ici + id3 + iv] += mult_uv_i(&By[icg], &w2[id4 + iv], Nc);
487  v2[icr + id4 + iv] -= mult_uv_r(&By[icg], &w2[id3 + iv], Nc);
488  v2[ici + id4 + iv] -= mult_uv_i(&By[icg], &w2[id3 + iv], Nc);
489 
490  // isigma_12 * Bz
491  v2[icr + id1 + iv] -= mult_uv_i(&Bz[icg], &w2[id1 + iv], Nc);
492  v2[ici + id1 + iv] += mult_uv_r(&Bz[icg], &w2[id1 + iv], Nc);
493  v2[icr + id2 + iv] += mult_uv_i(&Bz[icg], &w2[id2 + iv], Nc);
494  v2[ici + id2 + iv] -= mult_uv_r(&Bz[icg], &w2[id2 + iv], Nc);
495 
496  v2[icr + id3 + iv] -= mult_uv_i(&Bz[icg], &w2[id3 + iv], Nc);
497  v2[ici + id3 + iv] += mult_uv_r(&Bz[icg], &w2[id3 + iv], Nc);
498  v2[icr + id4 + iv] += mult_uv_i(&Bz[icg], &w2[id4 + iv], Nc);
499  v2[ici + id4 + iv] -= mult_uv_r(&Bz[icg], &w2[id4 + iv], Nc);
500 
501  // isigma_41 * Ex
502  v2[icr + id1 + iv] += mult_uv_i(&Ex[icg], &w2[id4 + iv], Nc);
503  v2[ici + id1 + iv] -= mult_uv_r(&Ex[icg], &w2[id4 + iv], Nc);
504  v2[icr + id2 + iv] += mult_uv_i(&Ex[icg], &w2[id3 + iv], Nc);
505  v2[ici + id2 + iv] -= mult_uv_r(&Ex[icg], &w2[id3 + iv], Nc);
506 
507  v2[icr + id3 + iv] += mult_uv_i(&Ex[icg], &w2[id2 + iv], Nc);
508  v2[ici + id3 + iv] -= mult_uv_r(&Ex[icg], &w2[id2 + iv], Nc);
509  v2[icr + id4 + iv] += mult_uv_i(&Ex[icg], &w2[id1 + iv], Nc);
510  v2[ici + id4 + iv] -= mult_uv_r(&Ex[icg], &w2[id1 + iv], Nc);
511 
512  // isigma_42 * Ey
513  v2[icr + id1 + iv] -= mult_uv_r(&Ey[icg], &w2[id4 + iv], Nc);
514  v2[ici + id1 + iv] -= mult_uv_i(&Ey[icg], &w2[id4 + iv], Nc);
515  v2[icr + id2 + iv] += mult_uv_r(&Ey[icg], &w2[id3 + iv], Nc);
516  v2[ici + id2 + iv] += mult_uv_i(&Ey[icg], &w2[id3 + iv], Nc);
517 
518  v2[icr + id3 + iv] -= mult_uv_r(&Ey[icg], &w2[id2 + iv], Nc);
519  v2[ici + id3 + iv] -= mult_uv_i(&Ey[icg], &w2[id2 + iv], Nc);
520  v2[icr + id4 + iv] += mult_uv_r(&Ey[icg], &w2[id1 + iv], Nc);
521  v2[ici + id4 + iv] += mult_uv_i(&Ey[icg], &w2[id1 + iv], Nc);
522 
523  // isigma_43 * Ez
524  v2[icr + id1 + iv] += mult_uv_i(&Ez[icg], &w2[id3 + iv], Nc);
525  v2[ici + id1 + iv] -= mult_uv_r(&Ez[icg], &w2[id3 + iv], Nc);
526  v2[icr + id2 + iv] -= mult_uv_i(&Ez[icg], &w2[id4 + iv], Nc);
527  v2[ici + id2 + iv] += mult_uv_r(&Ez[icg], &w2[id4 + iv], Nc);
528 
529  v2[icr + id3 + iv] += mult_uv_i(&Ez[icg], &w2[id1 + iv], Nc);
530  v2[ici + id3 + iv] -= mult_uv_r(&Ez[icg], &w2[id1 + iv], Nc);
531  v2[icr + id4 + iv] -= mult_uv_i(&Ez[icg], &w2[id2 + iv], Nc);
532  v2[ici + id4 + iv] += mult_uv_r(&Ez[icg], &w2[id2 + iv], Nc);
533 
534  // v *= m_kappa * m_cSW;
535  v2[icr + id1 + iv] *= kappa_cSW;
536  v2[ici + id1 + iv] *= kappa_cSW;
537  v2[icr + id2 + iv] *= kappa_cSW;
538  v2[ici + id2 + iv] *= kappa_cSW;
539 
540  v2[icr + id3 + iv] *= kappa_cSW;
541  v2[ici + id3 + iv] *= kappa_cSW;
542  v2[icr + id4 + iv] *= kappa_cSW;
543  v2[ici + id4 + iv] *= kappa_cSW;
544  }
545  }
546 #pragma omp barrier
547 }
548 
549 
550 //====================================================================
552 {
553  set_fieldstrength(m_Bx, 1, 2);
554  set_fieldstrength(m_By, 2, 0);
555  set_fieldstrength(m_Bz, 0, 1);
556  set_fieldstrength(m_Ex, 3, 0);
557  set_fieldstrength(m_Ey, 3, 1);
558  set_fieldstrength(m_Ez, 3, 2);
559 }
560 
561 
562 //====================================================================
564  const int mu, const int nu)
565 {
567 
568  assert(nth == 1);
569  // this function must be called in single thread region.
570 
571  m_staple.upper(m_Cup, *m_U, mu, nu); // these staple constructions
572  m_staple.lower(m_Cdn, *m_U, mu, nu); // are multi-threaded.
573 
574  //#pragma omp parallel
575  {
576  mult_Field_Gnd(Fst, 0, *m_U, mu, m_Cup, 0);
577  multadd_Field_Gnd(Fst, 0, *m_U, mu, m_Cdn, 0, -1.0);
578 
579  mult_Field_Gdn(m_v1, 0, m_Cup, 0, *m_U, mu);
580  multadd_Field_Gdn(m_v1, 0, m_Cdn, 0, *m_U, mu, -1.0);
581  }
582 
583  m_shift.forward(m_v2, m_v1, mu);
584 
585  //#pragma omp parallel
586  {
587  axpy(Fst, 1.0, m_v2);
588  ah_Field_G(Fst, 0);
589  scal(Fst, 0.25);
590  }
591 }
592 
593 
594 //====================================================================
596 {
597  // The following counting explicitly depends on the implementation
598  // and to be recalculated when the code is modified.
599  // Present counting is based on rev.1107. [24 Aug 2014 H.Matsufuru]
600 
601  int Lvol = CommonParameters::Lvol();
602 
603  double flop_site
604  = static_cast<double>(m_Nc * m_Nd * (2 + 48 * m_Nc));
605  double flop = flop_site * static_cast<double>(Lvol);
606 
607  return flop;
608 }
609 
610 
611 //====================================================================
612 //============================================================END=====
void Register_int_vector(const string &, const std::vector< int > &)
Definition: parameters.cpp:344
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:282
void set_config(Field *U)
setting pointer to the gauge configuration.
BridgeIO vout
Definition: bridgeIO.cpp:278
static int get_num_threads()
returns available number of threads.
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:133
void mult_sigmaF(Field &, const Field &)
Field_G m_Ez
field strength.
GammaMatrix m_GM5
void mult_Field_Gdn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
void mult_csw_chiral(Field &, const Field &)
void gm5_chiral(Field &, const Field &)
void general(const char *format,...)
Definition: bridgeIO.cpp:65
GammaMatrix get_GM(GMspecies spec)
Container of Field-type object.
Definition: field.h:39
void set_parameters(const Parameters &params)
int nvol() const
Definition: field.h:116
void set_fieldstrength(Field_G &, const int, const int)
Class for parameters.
Definition: parameters.h:38
static int Lvol()
static int get_thread_id()
returns thread id.
Wilson-type fermion field.
Definition: field_F.h:37
void ah_Field_G(Field_G &w, const int ex)
Field_G m_v2
for calculation of field strength.
SU(N) gauge field.
Definition: field_G.h:38
void mult_gm5(Field &v, const Field &w)
void gm5_dirac(Field &, const Field &)
void(Fopr_CloverTerm::* m_gm5)(Field &, const Field &)
void multadd_Field_Gdn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2, const double ff)
void mult_Field_Gnd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
void mult_iGM(Field_F &y, const GammaMatrix &gm, const Field_F &x)
gamma matrix multiplication (i is multiplied)
Bridge::VerboseLevel m_vl
Definition: fopr.h:113
void mult_isigma(Field_F &, const Field_F &, const int mu, const int nu)
Set of Gamma Matrices: basis class.
int nex() const
Definition: field.h:117
void init(std::string repr)
void multadd_Field_Gnd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2, const double ff)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
std::string m_repr
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
double flop_count()
this returns the number of floating point operations.
ShiftField_lex m_shift
void mult_csw(Field &, const Field &)
void lower(Field_G &, const Field_G &, const int mu, const int nu)
constructs lower staple in mu-nu plane.
Definition: staples.cpp:152
static bool Register(const std::string &realm, const creator_callback &cb)
const Field_G * m_U
pointer to gauge configuration.
static const std::string class_name
int sg_index(int mu, int nu)
void Register_double(const string &, const double)
Definition: parameters.cpp:323
std::vector< int > m_boundary
void mult_csw_dirac(Field &, const Field &)
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:87
void upper(Field_G &, const Field_G &, const int mu, const int nu)
constructs upper staple in mu-nu plane.
Definition: staples.cpp:128
void(Fopr_CloverTerm::* m_csw)(Field &, const Field &)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
int fetch_int_vector(const string &key, std::vector< int > &val) const
Definition: parameters.cpp:176
void forward(Field &, const Field &, const int mu)
std::vector< GammaMatrix > m_SG