23 #if defined USE_GROUP_SU3
24 #include "fopr_Wilson_impl_SU3.inc"
25 #elif defined USE_GROUP_SU2
26 #include "fopr_Wilson_impl_SU2.inc"
27 #elif defined USE_GROUP_SU_N
28 #include "fopr_Wilson_impl_SU_N.inc"
82 }
else if (
m_repr ==
"Chiral") {
132 }
else if (m_mode ==
"Ddag") {
135 }
else if (m_mode ==
"DdagD") {
138 }
else if (m_mode ==
"DDdag") {
141 }
else if (m_mode ==
"H") {
185 const std::vector<int> bc)
187 assert(bc.size() ==
m_Ndim);
191 for (
int mu = 0; mu <
m_Ndim; ++mu) {
192 m_boundary[mu] = bc[mu];
197 for (
int mu = 0; mu <
m_Ndim; ++mu) {
202 for (
int idir = 0; idir <
m_Ndim; ++idir) {
203 m_boundary2[idir] = 1.0;
217 double flop_site, flop;
219 if (m_repr ==
"Dirac") {
220 flop_site =
static_cast<double>(
221 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
222 }
else if (m_repr ==
"Chiral") {
223 flop_site =
static_cast<double>(
224 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
231 flop = flop_site *
static_cast<double>(Lvol);
233 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;
242 D_ex_dirac(w, 0, f, 0);
249 D_ex_chiral(w, 0, f, 0);
259 }
else if (mu == 1) {
261 }
else if (mu == 2) {
263 }
else if (mu == 3) {
264 (this->*m_mult_tp)(w, f);
277 }
else if (mu == 1) {
279 }
else if (mu == 2) {
281 }
else if (mu == 3) {
282 (this->*m_mult_tm)(w, f);
292 const Field& f,
const int ex2)
294 int Ninvol = m_Nvc * m_Nd * m_Nvol;
295 const double *v1 = f.
ptr(Ninvol * ex2);
296 double *v2 = w.
ptr(Ninvol * ex1);
301 int is = m_Ntask * i_thread / Nthread;
302 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
304 for (
int i = is; i < is + ns; ++i) {
305 mult_xp1_thread(i, vcp1_xp, v1);
306 mult_xm1_thread(i, vcp1_xm, v1);
307 mult_yp1_thread(i, vcp1_yp, v1);
308 mult_ym1_thread(i, vcp1_ym, v1);
309 mult_zp1_thread(i, vcp1_zp, v1);
310 mult_zm1_thread(i, vcp1_zm, v1);
311 mult_tp1_dirac_thread(i, vcp1_tp, v1);
312 mult_tm1_dirac_thread(i, vcp1_tm, v1);
318 int Nvx = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
322 int Nvy = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
326 int Nvz = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
330 int Nvt = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
336 for (
int i = is; i < is + ns; ++i) {
338 mult_xpb_thread(i, v2, v1);
339 mult_xmb_thread(i, v2, v1);
340 mult_ypb_thread(i, v2, v1);
341 mult_ymb_thread(i, v2, v1);
342 mult_zpb_thread(i, v2, v1);
343 mult_zmb_thread(i, v2, v1);
344 mult_tpb_dirac_thread(i, v2, v1);
345 mult_tmb_dirac_thread(i, v2, v1);
348 for (
int i = is; i < is + ns; ++i) {
349 mult_xp2_thread(i, v2, vcp2_xp);
350 mult_xm2_thread(i, v2, vcp2_xm);
351 mult_yp2_thread(i, v2, vcp2_yp);
352 mult_ym2_thread(i, v2, vcp2_ym);
353 mult_zp2_thread(i, v2, vcp2_zp);
354 mult_zm2_thread(i, v2, vcp2_zm);
355 mult_tp2_dirac_thread(i, v2, vcp2_tp);
356 mult_tm2_dirac_thread(i, v2, vcp2_tm);
357 daypx_thread(i, v2, -m_kappa, v1);
366 const Field& f,
const int ex2)
368 int Ninvol = m_Nvc * m_Nd * m_Nvol;
369 const double *v1 = f.
ptr(Ninvol * ex2);
370 double *v2 = w.
ptr(Ninvol * ex1);
375 int is = m_Ntask * i_thread / Nthread;
376 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
378 for (
int i = is; i < is + ns; ++i) {
379 mult_xp1_thread(i, vcp1_xp, v1);
380 mult_xm1_thread(i, vcp1_xm, v1);
381 mult_yp1_thread(i, vcp1_yp, v1);
382 mult_ym1_thread(i, vcp1_ym, v1);
383 mult_zp1_thread(i, vcp1_zp, v1);
384 mult_zm1_thread(i, vcp1_zm, v1);
385 mult_tp1_chiral_thread(i, vcp1_tp, v1);
386 mult_tm1_chiral_thread(i, vcp1_tm, v1);
392 int Nvx = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
396 int Nvy = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
400 int Nvz = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
404 int Nvt = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
410 for (
int i = is; i < is + ns; ++i) {
412 mult_xpb_thread(i, v2, v1);
413 mult_xmb_thread(i, v2, v1);
414 mult_ypb_thread(i, v2, v1);
415 mult_ymb_thread(i, v2, v1);
416 mult_zpb_thread(i, v2, v1);
417 mult_zmb_thread(i, v2, v1);
418 mult_tpb_chiral_thread(i, v2, v1);
419 mult_tmb_chiral_thread(i, v2, v1);
422 for (
int i = is; i < is + ns; ++i) {
423 mult_xp2_thread(i, v2, vcp2_xp);
424 mult_xm2_thread(i, v2, vcp2_xm);
425 mult_yp2_thread(i, v2, vcp2_yp);
426 mult_ym2_thread(i, v2, vcp2_ym);
427 mult_zp2_thread(i, v2, vcp2_zp);
428 mult_zm2_thread(i, v2, vcp2_zm);
429 mult_tp2_chiral_thread(i, v2, vcp2_tp);
430 mult_tm2_chiral_thread(i, v2, vcp2_tm);
431 daypx_thread(i, v2, -m_kappa, v1);
464 const Field& v,
const int ex2,
const int ipm)
470 }
else if (ipm == -1) {
477 m_w1.setpart_ex(0, v, ex2);
479 m_w1.addpart_ex(0, m_w2, 0, fpm);
488 double fac,
const Field& f)
490 const double *v1 = f.
ptr(0);
491 double *v2 = w.
ptr(0);
496 int is = m_Ntask * i_thread / Nthread;
497 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
499 for (
int i = is; i < is + ns; ++i) {
500 daypx_thread(i, v2, fac, v1);
509 double *v2 = w.
ptr(0);
514 int is = m_Ntask * i_thread / Nthread;
515 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
517 for (
int i = is; i < is + ns; ++i) {
527 const double *v1 = f.
ptr(0);
528 double *v2 = w.
ptr(0);
533 int is = m_Ntask * i_thread / Nthread;
534 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
536 for (
int i = is; i < is + ns; ++i) {
537 gm5_dirac_thread(i, v2, v1);
546 const double *v1 = f.
ptr(0);
547 double *v2 = w.
ptr(0);
552 int is = m_Ntask * i_thread / Nthread;
553 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
555 for (
int i = is; i < is + ns; ++i) {
556 gm5_chiral_thread(i, v2, v1);
565 const double *v1 = f.
ptr(0);
566 double *v2 = w.
ptr(0);
571 int is = m_Ntask * i_thread / Nthread;
572 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
576 for (
int i = is; i < is + ns; ++i) {
577 mult_xp1_thread(i, vcp1_xp, v1);
583 int Nv = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
588 for (
int i = is; i < is + ns; ++i) {
589 mult_xpb_thread(i, v2, v1);
592 for (
int i = is; i < is + ns; ++i) {
593 mult_xp2_thread(i, v2, vcp2_xp);
603 double *v2 = w.
ptr(0);
604 const double *v1 = f.
ptr(0);
609 int is = m_Ntask * i_thread / Nthread;
610 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
614 for (
int i = is; i < is + ns; ++i) {
615 mult_xm1_thread(i, vcp1_xm, v1);
621 int Nv = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
626 for (
int i = is; i < is + ns; ++i) {
627 mult_xmb_thread(i, v2, v1);
630 for (
int i = is; i < is + ns; ++i) {
631 mult_xm2_thread(i, v2, vcp2_xm);
641 const double *v1 = f.
ptr(0);
642 double *v2 = w.
ptr(0);
647 int is = m_Ntask * i_thread / Nthread;
648 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
652 for (
int i = is; i < is + ns; ++i) {
653 mult_yp1_thread(i, vcp1_yp, v1);
659 int Nv = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
664 for (
int i = is; i < is + ns; ++i) {
665 mult_ypb_thread(i, v2, v1);
668 for (
int i = is; i < is + ns; ++i) {
669 mult_yp2_thread(i, v2, vcp2_yp);
679 double *v2 = w.
ptr(0);
680 const double *v1 = f.
ptr(0);
685 int is = m_Ntask * i_thread / Nthread;
686 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
690 for (
int i = is; i < is + ns; ++i) {
691 mult_ym1_thread(i, vcp1_ym, v1);
697 int Nv = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
702 for (
int i = is; i < is + ns; ++i) {
703 mult_ymb_thread(i, v2, v1);
706 for (
int i = is; i < is + ns; ++i) {
707 mult_ym2_thread(i, v2, vcp2_ym);
717 const double *v1 = f.
ptr(0);
718 double *v2 = w.
ptr(0);
723 int is = m_Ntask * i_thread / Nthread;
724 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
728 for (
int i = is; i < is + ns; ++i) {
729 mult_zp1_thread(i, vcp1_zp, v1);
735 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
740 for (
int i = is; i < is + ns; ++i) {
741 mult_zpb_thread(i, v2, v1);
744 for (
int i = is; i < is + ns; ++i) {
745 mult_zp2_thread(i, v2, vcp2_zp);
755 double *v2 = w.
ptr(0);
756 const double *v1 = f.
ptr(0);
761 int is = m_Ntask * i_thread / Nthread;
762 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
766 for (
int i = is; i < is + ns; ++i) {
767 mult_zm1_thread(i, vcp1_zm, v1);
773 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
778 for (
int i = is; i < is + ns; ++i) {
779 mult_zmb_thread(i, v2, v1);
782 for (
int i = is; i < is + ns; ++i) {
783 mult_zm2_thread(i, v2, vcp2_zm);
793 const double *v1 = f.
ptr(0);
794 double *v2 = w.
ptr(0);
799 int is = m_Ntask * i_thread / Nthread;
800 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
804 for (
int i = is; i < is + ns; ++i) {
805 mult_tp1_dirac_thread(i, vcp1_tp, v1);
811 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
816 for (
int i = is; i < is + ns; ++i) {
817 mult_tpb_dirac_thread(i, v2, v1);
820 for (
int i = is; i < is + ns; ++i) {
821 mult_tp2_dirac_thread(i, v2, vcp2_tp);
831 double *v2 = w.
ptr(0);
832 const double *v1 = f.
ptr(0);
837 int is = m_Ntask * i_thread / Nthread;
838 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
842 for (
int i = is; i < is + ns; ++i) {
843 mult_tm1_dirac_thread(i, vcp1_tm, v1);
849 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
854 for (
int i = is; i < is + ns; ++i) {
855 mult_tmb_dirac_thread(i, v2, v1);
858 for (
int i = is; i < is + ns; ++i) {
859 mult_tm2_dirac_thread(i, v2, vcp2_tm);
869 const double *v1 = f.
ptr(0);
870 double *v2 = w.
ptr(0);
875 int is = m_Ntask * i_thread / Nthread;
876 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
880 for (
int i = is; i < is + ns; ++i) {
881 mult_tp1_chiral_thread(i, vcp1_tp, v1);
887 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
892 for (
int i = is; i < is + ns; ++i) {
893 mult_tpb_chiral_thread(i, v2, v1);
896 for (
int i = is; i < is + ns; ++i) {
897 mult_tp2_chiral_thread(i, v2, vcp2_tp);
907 double *v2 = w.
ptr(0);
908 const double *v1 = f.
ptr(0);
913 int is = m_Ntask * i_thread / Nthread;
914 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
918 for (
int i = is; i < is + ns; ++i) {
919 mult_tm1_chiral_thread(i, vcp1_tm, v1);
925 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
930 for (
int i = is; i < is + ns; ++i) {
931 mult_tmb_chiral_thread(i, v2, v1);
934 for (
int i = is; i < is + ns; ++i) {
935 mult_tm2_chiral_thread(i, v2, vcp2_tm);
void daypx(Field &, double, const Field &)
std::vector< GammaMatrix > m_GM
gamma matrices.
void mult_zp(Field &, const Field &)
static int get_num_threads()
returns available number of threads.
const double * ptr(const int jin, const int site, const int jex) const
void set_parameters(const double kappa, const std::vector< int > bc)
std::vector< int > m_boundary
boundary condition.
void gm5_chiral(Field &, const Field &)
void proj_chiral(Field &w, const int ex1, const Field &v, const int ex2, const int ipm)
double * vcp1_xp
arrays for data transfer.
void mult_tm_dirac(Field &, const Field &)
void general(const char *format,...)
GammaMatrix get_GM(GMspecies spec)
static Bridge::VerboseLevel Vlevel()
Container of Field-type object.
void(Fopr_Wilson::Fopr_Wilson_impl::* m_D_ex)(Field &, const int, const Field &, const int)
void D(Field &v, const Field &f)
void(Fopr_Wilson::Fopr_Wilson_impl::* m_mult_dag)(Field &, const Field &)
void mult_up(int mu, Field &w, const Field &v)
adding the hopping to nearest neighbor site in mu-th direction.
void mult_tp_chiral(Field &, const Field &)
static int ipe(const int dir)
logical coordinate of current proc.
void H(Field &w, const Field &f)
void D_chiral(Field &, const Field &)
static int get_thread_id()
returns thread id.
void mult_xm(Field &, const Field &)
void DdagD(Field &w, const Field &f)
const Field_G * m_U
gauge configuration.
Field m_w2
temporary fields.
std::string get_mode() const
void(Fopr_Wilson::Fopr_Wilson_impl::* m_mult)(Field &, const Field &)
void DDdag(Field &w, const Field &f)
Bridge::VerboseLevel m_vl
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Bridge::VerboseLevel m_vl
static void sync_barrier_all()
barrier among all the threads and nodes.
void mult_ym(Field &, const Field &)
void(Fopr_Wilson::Fopr_Wilson_impl::* m_D)(Field &, const Field &)
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...
Set of Gamma Matrices: basis class.
static const std::string class_name
void(Fopr_Wilson::Fopr_Wilson_impl::* m_gm5)(Field &, const Field &)
void D_ex_chiral(Field &, const int ex1, const Field &, const int ex2)
void D_ex_dirac(Field &, const int ex1, const Field &, const int ex2)
static const std::string class_name
const Field_F mult_gm5p(int mu, const Field_F &w)
void crucial(const char *format,...)
void set_mode(std::string mode)
void mult_gm5(Field &w, const Field &v)
void(Fopr_Wilson::Fopr_Wilson_impl::* m_mult_tm)(Field &, const Field &)
void mult_tp_dirac(Field &, const Field &)
void mult_up(int mu, Field &, const Field &)
void D_dirac(Field &, const Field &)
void mult_zm(Field &, const Field &)
void mult_undef(Field &, const Field &f)
std::vector< double > m_boundary2
b.c. for each node.
void mult_yp(Field &, const Field &)
void setpart_ex(int ex, const Field &w, int exw)
void mult_xp(Field &, const Field &)
void mult_dn(int mu, Field &, const Field &)
void Ddag(Field &w, const Field &f)
void init(std::string repr)
void(Fopr_Wilson::Fopr_Wilson_impl::* m_mult_tp)(Field &, const Field &)
void mult_tm_chiral(Field &, const Field &)
void gm5_dirac(Field &, const Field &)