Bridge++  Ver. 1.3.x
fopr_Wilson_General_impl.cpp
Go to the documentation of this file.
1 
15 
16 #if defined USE_GROUP_SU3
17 #include "fopr_Wilson_impl_SU3.inc"
18 #elif defined USE_GROUP_SU2
19 #include "fopr_Wilson_impl_SU2.inc"
20 #elif defined USE_GROUP_SU_N
21 #include "fopr_Wilson_impl_SU_N.inc"
22 #endif
23 
24 const std::string Fopr_Wilson_General::Fopr_Wilson_General_impl::class_name = "Fopr_Wilson_General_impl";
25 
26 //====================================================================
28 {
30 
31  vout.general(m_vl, "%s: Construction of fermion operator(imp).\n", class_name.c_str());
32 
33  check_Nc();
34 
37  m_Nvc = 2 * m_Nc;
38  m_Ndf = 2 * m_Nc * m_Nc;
39 
44 
47  m_boundary.resize(m_Ndim);
48  m_boundary2.resize(m_Ndim);
49 
50  m_repr = repr;
51 
52  m_GM.resize(m_Ndim + 1);
53 
54  unique_ptr<GammaMatrixSet> gmset(GammaMatrixSet::New(m_repr));
55 
56  m_GM[0] = gmset->get_GM(GammaMatrixSet::GAMMA1);
57  m_GM[1] = gmset->get_GM(GammaMatrixSet::GAMMA2);
58  m_GM[2] = gmset->get_GM(GammaMatrixSet::GAMMA3);
59  m_GM[3] = gmset->get_GM(GammaMatrixSet::GAMMA4);
60  m_GM[4] = gmset->get_GM(GammaMatrixSet::GAMMA5);
61 
62  m_U = 0;
63 
66 
67  if (m_repr == "Dirac") {
73  } else if (m_repr == "Chiral") {
79  } else {
80  vout.crucial(m_vl, "%s: input repr is undefined.\n", class_name.c_str());
81  exit(EXIT_FAILURE);
82  }
83 
84  m_w1.reset(m_Nvc * m_Nd, m_Nvol, 1);
85  m_w2.reset(m_Nvc * m_Nd, m_Nvol, 1);
86 
87  int Nvx = 2 * m_Nvc * m_Nd * m_Ny * m_Nz * m_Nt;
88  vcp1_x_plus = new double[Nvx];
89  vcp2_x_plus = new double[Nvx];
90  vcp1_x_minus = new double[Nvx];
91  vcp2_x_minus = new double[Nvx];
92 
93  int Nvy = 2 * m_Nvc * m_Nd * m_Nx * m_Nz * m_Nt;
94  vcp1_y_plus = new double[Nvy];
95  vcp2_y_plus = new double[Nvy];
96  vcp1_y_minus = new double[Nvy];
97  vcp2_y_minus = new double[Nvy];
98 
99  int Nvz = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nt;
100  vcp1_z_plus = new double[Nvz];
101  vcp2_z_plus = new double[Nvz];
102  vcp1_z_minus = new double[Nvz];
103  vcp2_z_minus = new double[Nvz];
104 
105  // int Nvt = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
106  int Nvt = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
107  vcp1_t_plus = new double[Nvt];
108  vcp2_t_plus = new double[Nvt];
109  vcp1_t_minus = new double[Nvt];
110  vcp2_t_minus = new double[Nvt];
111 
112  setup_thread();
113 }
114 
115 
116 //====================================================================
118 {
119  m_mode = mode;
120 
121  if (m_mode == "D") {
124  } else if (m_mode == "Ddag") {
127  } else if (m_mode == "DdagD") {
130  } else if (m_mode == "DDdag") {
133  } else if (m_mode == "H") {
136  } else {
137  vout.crucial(m_vl, "%s: input mode is undefined.\n", class_name.c_str());
138  exit(EXIT_FAILURE);
139  }
140 }
141 
142 
143 //====================================================================
145 {
146  delete[] vcp1_x_plus;
147  delete[] vcp2_x_plus;
148  delete[] vcp1_x_minus;
149  delete[] vcp2_x_minus;
150 
151  delete[] vcp1_y_plus;
152  delete[] vcp2_y_plus;
153  delete[] vcp1_y_minus;
154  delete[] vcp2_y_minus;
155 
156  delete[] vcp1_z_plus;
157  delete[] vcp2_z_plus;
158  delete[] vcp1_z_minus;
159  delete[] vcp2_z_minus;
160 
161  delete[] vcp1_t_plus;
162  delete[] vcp2_t_plus;
163  delete[] vcp1_t_minus;
164  delete[] vcp2_t_minus;
165 }
166 
167 
168 //====================================================================
170 {
171  return m_mode;
172 }
173 
174 
175 //====================================================================
177  const double kappa_t,
178  const double nu_s,
179  const double r_s,
180  const std::vector<int> bc)
181 {
182  assert(bc.size() == m_Ndim);
183 
184  //- print input parameters
185  vout.general(m_vl, "%s: input parameters\n", class_name.c_str());
186  vout.general(m_vl, " kappa_s = %12.8f\n", kappa_s);
187  vout.general(m_vl, " kappa_t = %12.8f\n", kappa_t);
188  vout.general(m_vl, " nu_s = %12.8f\n", nu_s);
189  vout.general(m_vl, " r_s = %12.8f\n", r_s);
190  for (int mu = 0; mu < m_Ndim; ++mu) {
191  vout.general(m_vl, " boundary[%d] = %2d\n", mu, bc[mu]);
192  }
193 
194  //- store values
195  m_kappa_s = kappa_s;
196  m_kappa_t = kappa_t;
197  m_nu_s = nu_s;
198  m_r_s = r_s;
199 
200  for (int mu = 0; mu < m_Ndim; ++mu) {
201  m_boundary[mu] = bc[mu];
202  }
203 
204  //- additional boundary condition for each node:
205  for (int idir = 0; idir < m_Ndim; ++idir) {
206  m_boundary2[idir] = 1.0;
207  if (Communicator::ipe(idir) == 0) m_boundary2[idir] = m_boundary[idir];
208  }
209 }
210 
211 
212 //====================================================================
214 {
215  // The following counting explicitly depends on the implementation.
216  // It will be recalculated when the code is modified.
217  // The present counting is based on rev.1107. [24 Aug 2014 H.Matsufuru]
218 
219  int Lvol = CommonParameters::Lvol();
220  double flop_site, flop;
221 
222  if (m_repr == "Dirac") {
223  flop_site = static_cast<double>(
224  m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
225  } else if (m_repr == "Chiral") {
226  flop_site = static_cast<double>(
227  m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
228  } else {
229  vout.crucial(m_vl, "%s: input repr is undefined.\n",
230  class_name.c_str());
231  exit(EXIT_FAILURE);
232  }
233 
234  flop = flop_site * static_cast<double>(Lvol);
235 
236  if ((m_mode == "DdagD") || (m_mode == "DDdag")) flop *= 2.0;
237 
238  return flop;
239 }
240 
241 
242 //====================================================================
244 {
245  // D_ex_dirac(w, 0, f, 0);
246  // daypx(w, -m_kappa_s, f);
247 
248  clear(w);
249 
250  clear(m_w1);
251  for (int mu = 0; mu < (m_Ndim - 1); ++mu) {
252  mult_up(mu, m_w1, f);
253  mult_dn(mu, m_w1, f);
254  }
255  daxpy(w, -m_kappa_s, m_w1);
256 
257  clear(m_w1);
258  int mu = (m_Ndim - 1);
259  {
260  mult_up(mu, m_w1, f);
261  mult_dn(mu, m_w1, f);
262  }
263  daxpy(w, -m_kappa_t, m_w1);
264 
265 
266  daxpy(w, 1.0, f); // w += f;
267 }
268 
269 
270 //====================================================================
272 {
273  // D_ex_chiral(w, 0, f, 0);
274  // daypx(w, -m_kappa_s, f);
275 
276  clear(w);
277 
278  clear(m_w1);
279  for (int mu = 0; mu < (m_Ndim - 1); ++mu) {
280  mult_up(mu, m_w1, f);
281  mult_dn(mu, m_w1, f);
282  }
283  daxpy(w, -m_kappa_s, m_w1);
284 
285  clear(m_w1);
286  int mu = (m_Ndim - 1);
287  {
288  mult_up(mu, m_w1, f);
289  mult_dn(mu, m_w1, f);
290  }
291  daxpy(w, -m_kappa_t, m_w1);
292 
293 
294  daxpy(w, 1.0, f); // w += f;
295 }
296 
297 
298 //====================================================================
300  Field& w, const Field& f)
301 {
302  if (mu == 0) {
303  mult_x_plus(w, f);
304  } else if (mu == 1) {
305  mult_y_plus(w, f);
306  } else if (mu == 2) {
307  mult_z_plus(w, f);
308  } else if (mu == 3) {
309  (this->*m_mult_t_plus)(w, f);
310  } else {
311  vout.crucial(m_vl, "%s: illegal direction of mu in mult_up.\n", class_name.c_str());
312  exit(EXIT_FAILURE);
313  }
314 }
315 
316 
317 //====================================================================
319 {
320  if (mu == 0) {
321  mult_x_minus(w, f);
322  } else if (mu == 1) {
323  mult_y_minus(w, f);
324  } else if (mu == 2) {
325  mult_z_minus(w, f);
326  } else if (mu == 3) {
327  (this->*m_mult_t_minus)(w, f);
328  } else {
329  vout.crucial(m_vl, "%s: illegal direction of mu in mult_dn.\n", class_name.c_str());
330  exit(EXIT_FAILURE);
331  }
332 }
333 
334 
335 //====================================================================
337  const Field& f, const int ex2)
338 {
339  int Ninvol = m_Nvc * m_Nd * m_Nvol;
340  const double *v1 = f.ptr(Ninvol * ex2);
341  double *v2 = w.ptr(Ninvol * ex1);
342 
344  int i_thread = ThreadManager_OpenMP::get_thread_id();
345 
346  int is = m_Ntask * i_thread / Nthread;
347  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
348 
349  for (int i = is; i < is + ns; ++i) {
350  mult_x_plus1_thread(i, vcp1_x_plus, v1);
351  mult_x_minus1_thread(i, vcp1_x_minus, v1);
352  mult_y_plus1_thread(i, vcp1_y_plus, v1);
353  mult_y_minus1_thread(i, vcp1_y_minus, v1);
354  mult_z_plus1_thread(i, vcp1_z_plus, v1);
355  mult_z_minus1_thread(i, vcp1_z_minus, v1);
356  mult_t_plus1_dirac_thread(i, vcp1_t_plus, v1);
357  mult_t_minus1_dirac_thread(i, vcp1_t_minus, v1);
358  }
359 
360 #pragma omp barrier
361 #pragma omp master
362  {
363  int idir_x = 0;
364  int Nvx = 2 * m_Nvc * m_Nd * m_Ny * m_Nz * m_Nt;
365  Communicator::exchange(Nvx, vcp2_x_plus, vcp1_x_plus, idir_x, 1, 1);
366  Communicator::exchange(Nvx, vcp2_x_minus, vcp1_x_minus, idir_x, -1, 2);
367 
368  int idir_y = 1;
369  int Nvy = 2 * m_Nvc * m_Nd * m_Nx * m_Nz * m_Nt;
370  Communicator::exchange(Nvy, vcp2_y_plus, vcp1_y_plus, idir_y, 1, 3);
371  Communicator::exchange(Nvy, vcp2_y_minus, vcp1_y_minus, idir_y, -1, 4);
372 
373  int idir_z = 2;
374  int Nvz = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nt;
375  Communicator::exchange(Nvz, vcp2_z_plus, vcp1_z_plus, idir_z, 1, 5);
376  Communicator::exchange(Nvz, vcp2_z_minus, vcp1_z_minus, idir_z, -1, 6);
377 
378  int idir_t = 3;
379  // int Nvt = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
380  int Nvt = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
381  Communicator::exchange(Nvt, vcp2_t_plus, vcp1_t_plus, idir_t, 1, 7);
382  Communicator::exchange(Nvt, vcp2_t_minus, vcp1_t_minus, idir_t, -1, 8);
383  }
384 #pragma omp barrier
385 
386  for (int i = is; i < is + ns; ++i) {
387  clear_thread(i, v2);
388  mult_x_plus_bulk_thread(i, v2, v1);
389  mult_x_minus_bulk_thread(i, v2, v1);
390  mult_y_plus_bulk_thread(i, v2, v1);
391  mult_y_minus_bulk_thread(i, v2, v1);
392  mult_z_plus_bulk_thread(i, v2, v1);
393  mult_z_minus_bulk_thread(i, v2, v1);
394  mult_t_plus_bulk_dirac_thread(i, v2, v1);
395  mult_t_minus_bulk_dirac_thread(i, v2, v1);
396  }
397 
398  for (int i = is; i < is + ns; ++i) {
399  mult_x_plus2_thread(i, v2, vcp2_x_plus);
400  mult_x_minus2_thread(i, v2, vcp2_x_minus);
401  mult_y_plus2_thread(i, v2, vcp2_y_plus);
402  mult_y_minus2_thread(i, v2, vcp2_y_minus);
403  mult_z_plus2_thread(i, v2, vcp2_z_plus);
404  mult_z_minus2_thread(i, v2, vcp2_z_minus);
405  mult_t_plus2_dirac_thread(i, v2, vcp2_t_plus);
406  mult_t_minus2_dirac_thread(i, v2, vcp2_t_minus);
407  }
408 
409  // for (int i = is; i < is + ns; ++i) {
410  // daypx_thread(i, v2, -m_kappa, v1); // w = -m_kappa * w + f.
411  // daypx_thread(i, v2, -m_kappa_s, v1);
412  // }
413 
414 
416 }
417 
418 
419 //====================================================================
421  const Field& f, const int ex2)
422 {
423  int Ninvol = m_Nvc * m_Nd * m_Nvol;
424  const double *v1 = f.ptr(Ninvol * ex2);
425  double *v2 = w.ptr(Ninvol * ex1);
426 
428  int i_thread = ThreadManager_OpenMP::get_thread_id();
429 
430  int is = m_Ntask * i_thread / Nthread;
431  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
432 
433  for (int i = is; i < is + ns; ++i) {
434  mult_x_plus1_thread(i, vcp1_x_plus, v1);
435  mult_x_minus1_thread(i, vcp1_x_minus, v1);
436  mult_y_plus1_thread(i, vcp1_y_plus, v1);
437  mult_y_minus1_thread(i, vcp1_y_minus, v1);
438  mult_z_plus1_thread(i, vcp1_z_plus, v1);
439  mult_z_minus1_thread(i, vcp1_z_minus, v1);
440  mult_t_plus1_chiral_thread(i, vcp1_t_plus, v1);
441  mult_t_minus1_chiral_thread(i, vcp1_t_minus, v1);
442  }
443 #pragma omp barrier
444 
445 #pragma omp master
446  {
447  int idir_x = 0;
448  int Nvx = 2 * m_Nvc * m_Nd * m_Ny * m_Nz * m_Nt;
449  Communicator::exchange(Nvx, vcp2_x_plus, vcp1_x_plus, idir_x, 1, 1);
450  Communicator::exchange(Nvx, vcp2_x_minus, vcp1_x_minus, idir_x, -1, 2);
451 
452  int idir_y = 1;
453  int Nvy = 2 * m_Nvc * m_Nd * m_Nx * m_Nz * m_Nt;
454  Communicator::exchange(Nvy, vcp2_y_plus, vcp1_y_plus, idir_y, 1, 3);
455  Communicator::exchange(Nvy, vcp2_y_minus, vcp1_y_minus, idir_y, -1, 4);
456 
457  int idir_z = 2;
458  int Nvz = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nt;
459  Communicator::exchange(Nvz, vcp2_z_plus, vcp1_z_plus, idir_z, 1, 5);
460  Communicator::exchange(Nvz, vcp2_z_minus, vcp1_z_minus, idir_z, -1, 6);
461 
462  int idir_t = 3;
463  // int Nvt = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
464  int Nvt = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
465  Communicator::exchange(Nvt, vcp2_t_plus, vcp1_t_plus, idir_t, 1, 7);
466  Communicator::exchange(Nvt, vcp2_t_minus, vcp1_t_minus, idir_t, -1, 8);
467  }
468 #pragma omp barrier
469 
470  for (int i = is; i < is + ns; ++i) {
471  clear_thread(i, v2);
472  mult_x_plus_bulk_thread(i, v2, v1);
473  mult_x_minus_bulk_thread(i, v2, v1);
474  mult_y_plus_bulk_thread(i, v2, v1);
475  mult_y_minus_bulk_thread(i, v2, v1);
476  mult_z_plus_bulk_thread(i, v2, v1);
477  mult_z_minus_bulk_thread(i, v2, v1);
478  mult_t_plus_bulk_chiral_thread(i, v2, v1);
479  mult_t_minus_bulk_chiral_thread(i, v2, v1);
480  }
481 
482  for (int i = is; i < is + ns; ++i) {
483  mult_x_plus2_thread(i, v2, vcp2_x_plus);
484  mult_x_minus2_thread(i, v2, vcp2_x_minus);
485  mult_y_plus2_thread(i, v2, vcp2_y_plus);
486  mult_y_minus2_thread(i, v2, vcp2_y_minus);
487  mult_z_plus2_thread(i, v2, vcp2_z_plus);
488  mult_z_minus2_thread(i, v2, vcp2_z_minus);
489  mult_t_plus2_chiral_thread(i, v2, vcp2_t_plus);
490  mult_t_minus2_chiral_thread(i, v2, vcp2_t_minus);
491  }
492 
493  // for (int i = is; i < is + ns; ++i) {
494  // daypx_thread(i, v2, -m_kappa, v1); // w = -m_kappa * w + f.
495  // daypx_thread(i, v2, -m_kappa_s, v1); // w = -m_kappa * w + f.
496  // }
497 
498 
500 
501  // clear(w);
502  // mult_x_plus(w,f);
503  // mult_x_minus(w,f);
504  // mult_y_plus(w,f);
505  // mult_y_minus(w,f);
506  // mult_z_plus(w,f);
507  // mult_z_minus(w,f);
508  // mult_t_plus_chiral(w,f);
509  // mult_t_minus_chiral(w,f);
510  // daypx(w, -m_kappa, f); // w = -m_kappa * w + f.
511 }
512 
513 
514 //====================================================================
516  Field& v, const Field& w)
517 {
518  clear(m_w2);
519 
520  mult_up(mu, m_w2, w);
521  mult_gm5(v, m_w2);
522 }
523 
524 
525 //====================================================================
527  const Field& v, const int ex2,
528  const int ipm)
529 {
530  double fpm = 0.0;
531 
532  if (ipm == 1) {
533  fpm = 1.0;
534  } else if (ipm == -1) {
535  fpm = -1.0;
536  } else {
537  vout.crucial(m_vl, "%s: illegal chirality = %d.\n", class_name.c_str(), ipm);
538  exit(EXIT_FAILURE);
539  }
540 
541  m_w1.setpart_ex(0, v, ex2);
542  mult_gm5(m_w2, m_w1);
543  m_w1.addpart_ex(0, m_w2, 0, fpm);
544  w.setpart_ex(ex1, m_w1, 0);
545 
546 #pragma omp barrier
547 }
548 
549 
550 //====================================================================
552  double fac, const Field& f)
553 {
554  const double *v1 = f.ptr(0);
555  double *v2 = w.ptr(0);
556 
558  int i_thread = ThreadManager_OpenMP::get_thread_id();
559 
560  int is = m_Ntask * i_thread / Nthread;
561  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
562 
563  for (int i = is; i < is + ns; ++i) {
564  daxpy_thread(i, v2, fac, v1);
565  }
566 #pragma omp barrier
567 }
568 
569 
570 //====================================================================
572  double fac, const Field& f)
573 {
574  const double *v1 = f.ptr(0);
575  double *v2 = w.ptr(0);
576 
578  int i_thread = ThreadManager_OpenMP::get_thread_id();
579 
580  int is = m_Ntask * i_thread / Nthread;
581  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
582 
583  for (int i = is; i < is + ns; ++i) {
584  daypx_thread(i, v2, fac, v1);
585  }
586 #pragma omp barrier
587 }
588 
589 
590 //====================================================================
592  double fac)
593 {
594  double *v2 = w.ptr(0);
595 
597  int i_thread = ThreadManager_OpenMP::get_thread_id();
598 
599  int is = m_Ntask * i_thread / Nthread;
600  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
601 
602  for (int i = is; i < is + ns; ++i) {
603  scal_thread(i, v2, fac);
604  }
605 #pragma omp barrier
606 }
607 
608 
609 //====================================================================
611 {
612  double *v2 = w.ptr(0);
613 
615  int i_thread = ThreadManager_OpenMP::get_thread_id();
616 
617  int is = m_Ntask * i_thread / Nthread;
618  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
619 
620  for (int i = is; i < is + ns; ++i) {
621  clear_thread(i, v2);
622  }
623 #pragma omp barrier
624 }
625 
626 
627 //====================================================================
629 {
630  const double *v1 = f.ptr(0);
631  double *v2 = w.ptr(0);
632 
634  int i_thread = ThreadManager_OpenMP::get_thread_id();
635 
636  int is = m_Ntask * i_thread / Nthread;
637  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
638 
639  for (int i = is; i < is + ns; ++i) {
640  gm5_dirac_thread(i, v2, v1);
641  }
642 #pragma omp barrier
643 }
644 
645 
646 //====================================================================
648 {
649  const double *v1 = f.ptr(0);
650  double *v2 = w.ptr(0);
651 
653  int i_thread = ThreadManager_OpenMP::get_thread_id();
654 
655  int is = m_Ntask * i_thread / Nthread;
656  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
657 
658  for (int i = is; i < is + ns; ++i) {
659  gm5_chiral_thread(i, v2, v1);
660  }
661 #pragma omp barrier
662 }
663 
664 
665 //====================================================================
667 {
668  const double *v1 = f.ptr(0);
669  double *v2 = w.ptr(0);
670 
672  int i_thread = ThreadManager_OpenMP::get_thread_id();
673 
674  int is = m_Ntask * i_thread / Nthread;
675  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
676 
677 #pragma omp barrier
678 
679  for (int i = is; i < is + ns; ++i) {
680  mult_x_plus1_thread(i, vcp1_x_plus, v1);
681  }
682 
683 #pragma omp barrier
684 #pragma omp master
685  {
686  int idir_x = 0;
687  int Nv = 2 * m_Nvc * m_Nd * m_Ny * m_Nz * m_Nt;
688  Communicator::exchange(Nv, vcp2_x_plus, vcp1_x_plus, idir_x, 1, 1);
689  }
690 #pragma omp barrier
691 
692  for (int i = is; i < is + ns; ++i) {
693  mult_x_plus_bulk_thread(i, v2, v1);
694  }
695 
696  for (int i = is; i < is + ns; ++i) {
697  mult_x_plus2_thread(i, v2, vcp2_x_plus);
698  }
699 
701 }
702 
703 
704 //====================================================================
706 {
707  const double *v1 = f.ptr(0);
708  double *v2 = w.ptr(0);
709 
711  int i_thread = ThreadManager_OpenMP::get_thread_id();
712 
713  int is = m_Ntask * i_thread / Nthread;
714  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
715 
716 #pragma omp barrier
717 
718  for (int i = is; i < is + ns; ++i) {
719  mult_x_minus1_thread(i, vcp1_x_minus, v1);
720  }
721 
722 #pragma omp barrier
723 #pragma omp master
724  {
725  int idir_x = 0;
726  int Nv = 2 * m_Nvc * m_Nd * m_Ny * m_Nz * m_Nt;
727  Communicator::exchange(Nv, vcp2_x_minus, vcp1_x_minus, idir_x, -1, 2);
728  }
729 #pragma omp barrier
730 
731  for (int i = is; i < is + ns; ++i) {
732  mult_x_minus_bulk_thread(i, v2, v1);
733  }
734 
735  for (int i = is; i < is + ns; ++i) {
736  mult_x_minus2_thread(i, v2, vcp2_x_minus);
737  }
738 
740 }
741 
742 
743 //====================================================================
745 {
746  const double *v1 = f.ptr(0);
747  double *v2 = w.ptr(0);
748 
750  int i_thread = ThreadManager_OpenMP::get_thread_id();
751 
752  int is = m_Ntask * i_thread / Nthread;
753  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
754 
755 #pragma omp barrier
756 
757  for (int i = is; i < is + ns; ++i) {
758  mult_y_plus1_thread(i, vcp1_y_plus, v1);
759  }
760 
761 #pragma omp barrier
762 #pragma omp master
763  {
764  int idir_y = 1;
765  int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Nz * m_Nt;
766  Communicator::exchange(Nv, vcp2_y_plus, vcp1_y_plus, idir_y, 1, 3);
767  }
768 #pragma omp barrier
769 
770  for (int i = is; i < is + ns; ++i) {
771  mult_y_plus_bulk_thread(i, v2, v1);
772  }
773 
774  for (int i = is; i < is + ns; ++i) {
775  mult_y_plus2_thread(i, v2, vcp2_y_plus);
776  }
777 
779 }
780 
781 
782 //====================================================================
784 {
785  const double *v1 = f.ptr(0);
786  double *v2 = w.ptr(0);
787 
789  int i_thread = ThreadManager_OpenMP::get_thread_id();
790 
791  int is = m_Ntask * i_thread / Nthread;
792  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
793 
794 #pragma omp barrier
795 
796  for (int i = is; i < is + ns; ++i) {
797  mult_y_minus1_thread(i, vcp1_y_minus, v1);
798  }
799 
800 #pragma omp barrier
801 #pragma omp master
802  {
803  int idir_y = 1;
804  int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Nz * m_Nt;
805  Communicator::exchange(Nv, vcp2_y_minus, vcp1_y_minus, idir_y, -1, 4);
806  }
807 #pragma omp barrier
808 
809  for (int i = is; i < is + ns; ++i) {
810  mult_y_minus_bulk_thread(i, v2, v1);
811  }
812 
813  for (int i = is; i < is + ns; ++i) {
814  mult_y_minus2_thread(i, v2, vcp2_y_minus);
815  }
816 
818 }
819 
820 
821 //====================================================================
823 {
824  const double *v1 = f.ptr(0);
825  double *v2 = w.ptr(0);
826 
828  int i_thread = ThreadManager_OpenMP::get_thread_id();
829 
830  int is = m_Ntask * i_thread / Nthread;
831  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
832 
833 #pragma omp barrier
834 
835  for (int i = is; i < is + ns; ++i) {
836  mult_z_plus1_thread(i, vcp1_z_plus, v1);
837  }
838 
839 #pragma omp barrier
840 #pragma omp master
841  {
842  int idir_z = 2;
843  int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nt;
844  Communicator::exchange(Nv, vcp2_z_plus, vcp1_z_plus, idir_z, 1, 5);
845  }
846 #pragma omp barrier
847 
848  for (int i = is; i < is + ns; ++i) {
849  mult_z_plus_bulk_thread(i, v2, v1);
850  }
851 
852  for (int i = is; i < is + ns; ++i) {
853  mult_z_plus2_thread(i, v2, vcp2_z_plus);
854  }
855 
857 }
858 
859 
860 //====================================================================
862 {
863  const double *v1 = f.ptr(0);
864  double *v2 = w.ptr(0);
865 
867  int i_thread = ThreadManager_OpenMP::get_thread_id();
868 
869  int is = m_Ntask * i_thread / Nthread;
870  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
871 
872 #pragma omp barrier
873 
874  for (int i = is; i < is + ns; ++i) {
875  mult_z_minus1_thread(i, vcp1_z_minus, v1);
876  }
877 
878 #pragma omp barrier
879 #pragma omp master
880  {
881  int idir_z = 2;
882  int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nt;
883  Communicator::exchange(Nv, vcp2_z_minus, vcp1_z_minus, idir_z, -1, 6);
884  }
885 #pragma omp barrier
886 
887  for (int i = is; i < is + ns; ++i) {
888  mult_z_minus_bulk_thread(i, v2, v1);
889  }
890 
891  for (int i = is; i < is + ns; ++i) {
892  mult_z_minus2_thread(i, v2, vcp2_z_minus);
893  }
894 
896 }
897 
898 
899 //====================================================================
901 {
902  const double *v1 = f.ptr(0);
903  double *v2 = w.ptr(0);
904 
906  int i_thread = ThreadManager_OpenMP::get_thread_id();
907 
908  int is = m_Ntask * i_thread / Nthread;
909  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
910 
911 #pragma omp barrier
912 
913  for (int i = is; i < is + ns; ++i) {
914  mult_t_plus1_dirac_thread(i, vcp1_t_plus, v1);
915  }
916 
917 #pragma omp barrier
918 #pragma omp master
919  {
920  int idir_t = 3;
921  // int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
922  int Nv = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
923  Communicator::exchange(Nv, vcp2_t_plus, vcp1_t_plus, idir_t, 1, 7);
924  }
925 #pragma omp barrier
926 
927  for (int i = is; i < is + ns; ++i) {
928  mult_t_plus_bulk_dirac_thread(i, v2, v1);
929  }
930 
931  for (int i = is; i < is + ns; ++i) {
932  mult_t_plus2_dirac_thread(i, v2, vcp2_t_plus);
933  }
934 
936 }
937 
938 
939 //====================================================================
941 {
942  const double *v1 = f.ptr(0);
943  double *v2 = w.ptr(0);
944 
946  int i_thread = ThreadManager_OpenMP::get_thread_id();
947 
948  int is = m_Ntask * i_thread / Nthread;
949  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
950 
951 #pragma omp barrier
952 
953  for (int i = is; i < is + ns; ++i) {
954  mult_t_minus1_dirac_thread(i, vcp1_t_minus, v1);
955  }
956 
957 #pragma omp barrier
958 #pragma omp master
959  {
960  int idir_t = 3;
961  // int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
962  int Nv = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
963  Communicator::exchange(Nv, vcp2_t_minus, vcp1_t_minus, idir_t, -1, 8);
964  }
965 #pragma omp barrier
966 
967  for (int i = is; i < is + ns; ++i) {
968  mult_t_minus_bulk_dirac_thread(i, v2, v1);
969  }
970 
971  for (int i = is; i < is + ns; ++i) {
972  mult_t_minus2_dirac_thread(i, v2, vcp2_t_minus);
973  }
974 
976 }
977 
978 
979 //====================================================================
981 {
982  const double *v1 = f.ptr(0);
983  double *v2 = w.ptr(0);
984 
986  int i_thread = ThreadManager_OpenMP::get_thread_id();
987 
988  int is = m_Ntask * i_thread / Nthread;
989  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
990 
991 #pragma omp barrier
992 
993  for (int i = is; i < is + ns; ++i) {
994  mult_t_plus1_chiral_thread(i, vcp1_t_plus, v1);
995  }
996 
997 #pragma omp barrier
998 #pragma omp master
999  {
1000  int idir_t = 3;
1001  // int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
1002  int Nv = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
1003  Communicator::exchange(Nv, vcp2_t_plus, vcp1_t_plus, idir_t, 1, 7);
1004  }
1005 #pragma omp barrier
1006 
1007  for (int i = is; i < is + ns; ++i) {
1008  mult_t_plus_bulk_chiral_thread(i, v2, v1);
1009  }
1010 
1011  for (int i = is; i < is + ns; ++i) {
1012  mult_t_plus2_chiral_thread(i, v2, vcp2_t_plus);
1013  }
1014 
1016 }
1017 
1018 
1019 //====================================================================
1021 {
1022  const double *v1 = f.ptr(0);
1023  double *v2 = w.ptr(0);
1024 
1025  int Nthread = ThreadManager_OpenMP::get_num_threads();
1026  int i_thread = ThreadManager_OpenMP::get_thread_id();
1027 
1028  int is = m_Ntask * i_thread / Nthread;
1029  int ns = m_Ntask * (i_thread + 1) / Nthread - is;
1030 
1031 #pragma omp barrier
1032 
1033  for (int i = is; i < is + ns; ++i) {
1034  mult_t_minus1_chiral_thread(i, vcp1_t_minus, v1);
1035  }
1036 
1037 #pragma omp barrier
1038 #pragma omp master
1039  {
1040  int idir_t = 3;
1041  // int Nv = 2 * m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
1042  int Nv = m_Nvc * m_Nd * m_Nx * m_Ny * m_Nz;
1043  Communicator::exchange(Nv, vcp2_t_minus, vcp1_t_minus, idir_t, -1, 8);
1044  }
1045 #pragma omp barrier
1046 
1047  for (int i = is; i < is + ns; ++i) {
1048  mult_t_minus_bulk_chiral_thread(i, v2, v1);
1049  }
1050 
1051  for (int i = is; i < is + ns; ++i) {
1052  mult_t_minus2_chiral_thread(i, v2, vcp2_t_minus);
1053  }
1054 
1056 }
1057 
1058 
1059 //====================================================================
1060 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:278
static int get_num_threads()
returns available number of threads.
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:133
void general(const char *format,...)
Definition: bridgeIO.cpp:65
GammaMatrix get_GM(GMspecies spec)
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_mult)(Field &, const Field &)
std::vector< GammaMatrix > m_GM
gamma matrices.
static Bridge::VerboseLevel Vlevel()
Container of Field-type object.
Definition: field.h:39
double * vcp1_x_plus
arrays for data transfer.
static int m_Ndim
static int ipe(const int dir)
logical coordinate of current proc.
static int Lvol()
void set_parameters(const double kappa_s, const double kappa_t, const double nu_s, const double r_s, const std::vector< int > bc)
std::vector< double > m_boundary2
b.c. for each node.
static int get_thread_id()
returns thread id.
void D_ex_dirac(Field &, const int ex1, const Field &, const int ex2)
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_gm5)(Field &, const Field &)
const Field_F mult_gm5p(int mu, const Field_F &w)
void mult_dn(int mu, Field &w, const Field &v)
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_mult_t_minus)(Field &, const Field &)
Bridge::VerboseLevel m_vl
Definition: fopr.h:113
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:84
void mult_up(int mu, Field &w, const Field &v)
adding the hopping to nearest neighbor site in mu-th direction.
static void sync_barrier_all()
barrier among all the threads and nodes.
static int exchange(int count, double *recv_buf, double *send_buf, int idir, int ipm, int tag)
receive array of double from upstream specified by idir and ipm, and send array to downstream...
std::vector< int > m_boundary
boundary condition.
void mult_gm5(Field &w, const Field &v)
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_mult_dag)(Field &, const Field &)
void proj_chiral(Field &w, const int ex1, const Field &v, const int ex2, const int ipm)
void D_ex_chiral(Field &, const int ex1, const Field &, const int ex2)
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_mult_t_plus)(Field &, const Field &)
static const std::string class_name
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:177
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_D_ex)(Field &, const int, const Field &, const int)
void(Fopr_Wilson_General::Fopr_Wilson_General_impl::* m_D)(Field &, const Field &)