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