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