25 #if defined USE_GROUP_SU3
26 #include "fopr_Wilson_impl_SU3.inc"
27 #elif defined USE_GROUP_SU2
28 #include "fopr_Wilson_impl_SU2.inc"
29 #elif defined USE_GROUP_SU_N
30 #include "fopr_Wilson_impl_SU_N.inc"
84 }
else if (
m_repr ==
"Chiral") {
133 }
else if (m_mode ==
"Ddag") {
136 }
else if (m_mode ==
"DdagD") {
139 }
else if (m_mode ==
"DDdag") {
142 }
else if (m_mode ==
"H") {
184 const valarray<int> bc)
186 assert(bc.size() == m_Ndim);
190 for (
int mu = 0; mu < m_Ndim; ++mu) {
191 m_boundary[mu] = bc[mu];
196 for (
int mu = 0; mu < m_Ndim; ++mu) {
201 for (
int idir = 0; idir < m_Ndim; ++idir) {
202 m_boundary2[idir] = 1.0;
216 double flop_site, flop;
218 if (m_repr ==
"Dirac") {
219 flop_site =
static_cast<double>(
220 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
221 }
else if (m_repr ==
"Chiral") {
222 flop_site =
static_cast<double>(
223 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
230 flop = flop_site *
static_cast<double>(Lvol);
232 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;
240 D_ex_dirac(w, 0, f, 0);
246 D_ex_chiral(w, 0, f, 0);
255 }
else if (mu == 1) {
257 }
else if (mu == 2) {
259 }
else if (mu == 3) {
260 (this->*m_mult_tp)(w, f);
273 }
else if (mu == 1) {
275 }
else if (mu == 2) {
277 }
else if (mu == 3) {
278 (this->*m_mult_tm)(w, f);
288 const Field& f,
const int ex2)
290 int Ninvol = m_Nvc * m_Nd * m_Nvol;
291 double *v1 =
const_cast<Field *
>(&f)->ptr(Ninvol * ex2);
292 double *v2 = w.
ptr(Ninvol * ex1);
297 int is = m_Ntask * ith / nth;
298 int ns = m_Ntask * (ith + 1) / nth - is;
300 for (
int i = is; i < is + ns; ++i) {
301 mult_xp1_thread(i, vcp1_xp, v1);
302 mult_xm1_thread(i, vcp1_xm, v1);
303 mult_yp1_thread(i, vcp1_yp, v1);
304 mult_ym1_thread(i, vcp1_ym, v1);
305 mult_zp1_thread(i, vcp1_zp, v1);
306 mult_zm1_thread(i, vcp1_zm, v1);
307 mult_tp1_dirac_thread(i, vcp1_tp, v1);
308 mult_tm1_dirac_thread(i, vcp1_tm, v1);
314 int Nvx = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
318 int Nvy = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
322 int Nvz = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
326 int Nvt = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
332 for (
int i = is; i < is + ns; ++i) {
334 mult_xpb_thread(i, v2, v1);
335 mult_xmb_thread(i, v2, v1);
336 mult_ypb_thread(i, v2, v1);
337 mult_ymb_thread(i, v2, v1);
338 mult_zpb_thread(i, v2, v1);
339 mult_zmb_thread(i, v2, v1);
340 mult_tpb_dirac_thread(i, v2, v1);
341 mult_tmb_dirac_thread(i, v2, v1);
344 for (
int i = is; i < is + ns; ++i) {
345 mult_xp2_thread(i, v2, vcp2_xp);
346 mult_xm2_thread(i, v2, vcp2_xm);
347 mult_yp2_thread(i, v2, vcp2_yp);
348 mult_ym2_thread(i, v2, vcp2_ym);
349 mult_zp2_thread(i, v2, vcp2_zp);
350 mult_zm2_thread(i, v2, vcp2_zm);
351 mult_tp2_dirac_thread(i, v2, vcp2_tp);
352 mult_tm2_dirac_thread(i, v2, vcp2_tm);
353 daypx_thread(i, v2, -m_kappa, v1);
361 const Field& f,
const int ex2)
363 int Ninvol = m_Nvc * m_Nd * m_Nvol;
364 double *v1 =
const_cast<Field *
>(&f)->ptr(Ninvol * ex2);
365 double *v2 = w.
ptr(Ninvol * ex1);
370 int is = m_Ntask * ith / nth;
371 int ns = m_Ntask * (ith + 1) / nth - is;
373 for (
int i = is; i < is + ns; ++i) {
374 mult_xp1_thread(i, vcp1_xp, v1);
375 mult_xm1_thread(i, vcp1_xm, v1);
376 mult_yp1_thread(i, vcp1_yp, v1);
377 mult_ym1_thread(i, vcp1_ym, v1);
378 mult_zp1_thread(i, vcp1_zp, v1);
379 mult_zm1_thread(i, vcp1_zm, v1);
380 mult_tp1_chiral_thread(i, vcp1_tp, v1);
381 mult_tm1_chiral_thread(i, vcp1_tm, v1);
387 int Nvx = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
391 int Nvy = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
395 int Nvz = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
399 int Nvt = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
405 for (
int i = is; i < is + ns; ++i) {
407 mult_xpb_thread(i, v2, v1);
408 mult_xmb_thread(i, v2, v1);
409 mult_ypb_thread(i, v2, v1);
410 mult_ymb_thread(i, v2, v1);
411 mult_zpb_thread(i, v2, v1);
412 mult_zmb_thread(i, v2, v1);
413 mult_tpb_chiral_thread(i, v2, v1);
414 mult_tmb_chiral_thread(i, v2, v1);
417 for (
int i = is; i < is + ns; ++i) {
418 mult_xp2_thread(i, v2, vcp2_xp);
419 mult_xm2_thread(i, v2, vcp2_xm);
420 mult_yp2_thread(i, v2, vcp2_yp);
421 mult_ym2_thread(i, v2, vcp2_ym);
422 mult_zp2_thread(i, v2, vcp2_zp);
423 mult_zm2_thread(i, v2, vcp2_zm);
424 mult_tp2_chiral_thread(i, v2, vcp2_tp);
425 mult_tm2_chiral_thread(i, v2, vcp2_tm);
426 daypx_thread(i, v2, -m_kappa, v1);
457 const Field& v,
const int ex2,
const int ipm)
463 }
else if (ipm == -1) {
470 m_w1.setpart_ex(0, v, ex2);
472 m_w1.addpart_ex(0, m_w2, 0, fpm);
478 double fac,
const Field& f)
480 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
481 double *v2 = w.
ptr(0);
486 int is = m_Ntask * ith / nth;
487 int ns = m_Ntask * (ith + 1) / nth - is;
489 for (
int i = is; i < is + ns; ++i) {
490 daypx_thread(i, v2, fac, v1);
498 double *v2 = w.
ptr(0);
503 int is = m_Ntask * ith / nth;
504 int ns = m_Ntask * (ith + 1) / nth - is;
506 for (
int i = is; i < is + ns; ++i) {
515 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
516 double *v2 = w.
ptr(0);
521 int is = m_Ntask * ith / nth;
522 int ns = m_Ntask * (ith + 1) / nth - is;
524 for (
int i = is; i < is + ns; ++i) {
525 gm5_dirac_thread(i, v2, v1);
533 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
534 double *v2 = w.
ptr(0);
539 int is = m_Ntask * ith / nth;
540 int ns = m_Ntask * (ith + 1) / nth - is;
542 for (
int i = is; i < is + ns; ++i) {
543 gm5_chiral_thread(i, v2, v1);
551 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
552 double *v2 = w.
ptr(0);
557 int is = m_Ntask * ith / nth;
558 int ns = m_Ntask * (ith + 1) / nth - is;
562 for (
int i = is; i < is + ns; ++i) {
563 mult_xp1_thread(i, vcp1_xp, v1);
569 int Nv = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
574 for (
int i = is; i < is + ns; ++i) {
575 mult_xpb_thread(i, v2, v1);
578 for (
int i = is; i < is + ns; ++i) {
579 mult_xp2_thread(i, v2, vcp2_xp);
588 double *v2 = w.
ptr(0);
589 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
594 int is = m_Ntask * ith / nth;
595 int ns = m_Ntask * (ith + 1) / nth - is;
599 for (
int i = is; i < is + ns; ++i) {
600 mult_xm1_thread(i, vcp1_xm, v1);
606 int Nv = m_Nvc * 2 * m_Ny * m_Nz * m_Nt;
611 for (
int i = is; i < is + ns; ++i) {
612 mult_xmb_thread(i, v2, v1);
615 for (
int i = is; i < is + ns; ++i) {
616 mult_xm2_thread(i, v2, vcp2_xm);
625 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
626 double *v2 = w.
ptr(0);
631 int is = m_Ntask * ith / nth;
632 int ns = m_Ntask * (ith + 1) / nth - is;
636 for (
int i = is; i < is + ns; ++i) {
637 mult_yp1_thread(i, vcp1_yp, v1);
643 int Nv = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
648 for (
int i = is; i < is + ns; ++i) {
649 mult_ypb_thread(i, v2, v1);
652 for (
int i = is; i < is + ns; ++i) {
653 mult_yp2_thread(i, v2, vcp2_yp);
662 double *v2 = w.
ptr(0);
663 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
668 int is = m_Ntask * ith / nth;
669 int ns = m_Ntask * (ith + 1) / nth - is;
673 for (
int i = is; i < is + ns; ++i) {
674 mult_ym1_thread(i, vcp1_ym, v1);
680 int Nv = m_Nvc * 2 * m_Nx * m_Nz * m_Nt;
685 for (
int i = is; i < is + ns; ++i) {
686 mult_ymb_thread(i, v2, v1);
689 for (
int i = is; i < is + ns; ++i) {
690 mult_ym2_thread(i, v2, vcp2_ym);
699 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
700 double *v2 = w.
ptr(0);
705 int is = m_Ntask * ith / nth;
706 int ns = m_Ntask * (ith + 1) / nth - is;
710 for (
int i = is; i < is + ns; ++i) {
711 mult_zp1_thread(i, vcp1_zp, v1);
717 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
722 for (
int i = is; i < is + ns; ++i) {
723 mult_zpb_thread(i, v2, v1);
726 for (
int i = is; i < is + ns; ++i) {
727 mult_zp2_thread(i, v2, vcp2_zp);
736 double *v2 = w.
ptr(0);
737 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
742 int is = m_Ntask * ith / nth;
743 int ns = m_Ntask * (ith + 1) / nth - is;
747 for (
int i = is; i < is + ns; ++i) {
748 mult_zm1_thread(i, vcp1_zm, v1);
754 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nt;
759 for (
int i = is; i < is + ns; ++i) {
760 mult_zmb_thread(i, v2, v1);
763 for (
int i = is; i < is + ns; ++i) {
764 mult_zm2_thread(i, v2, vcp2_zm);
773 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
774 double *v2 = w.
ptr(0);
779 int is = m_Ntask * ith / nth;
780 int ns = m_Ntask * (ith + 1) / nth - is;
784 for (
int i = is; i < is + ns; ++i) {
785 mult_tp1_dirac_thread(i, vcp1_tp, v1);
791 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
796 for (
int i = is; i < is + ns; ++i) {
797 mult_tpb_dirac_thread(i, v2, v1);
800 for (
int i = is; i < is + ns; ++i) {
801 mult_tp2_dirac_thread(i, v2, vcp2_tp);
810 double *v2 = w.
ptr(0);
811 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
816 int is = m_Ntask * ith / nth;
817 int ns = m_Ntask * (ith + 1) / nth - is;
821 for (
int i = is; i < is + ns; ++i) {
822 mult_tm1_dirac_thread(i, vcp1_tm, v1);
828 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
833 for (
int i = is; i < is + ns; ++i) {
834 mult_tmb_dirac_thread(i, v2, v1);
837 for (
int i = is; i < is + ns; ++i) {
838 mult_tm2_dirac_thread(i, v2, vcp2_tm);
847 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
848 double *v2 = w.
ptr(0);
853 int is = m_Ntask * ith / nth;
854 int ns = m_Ntask * (ith + 1) / nth - is;
858 for (
int i = is; i < is + ns; ++i) {
859 mult_tp1_chiral_thread(i, vcp1_tp, v1);
865 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
870 for (
int i = is; i < is + ns; ++i) {
871 mult_tpb_chiral_thread(i, v2, v1);
874 for (
int i = is; i < is + ns; ++i) {
875 mult_tp2_chiral_thread(i, v2, vcp2_tp);
884 double *v2 = w.
ptr(0);
885 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
890 int is = m_Ntask * ith / nth;
891 int ns = m_Ntask * (ith + 1) / nth - is;
895 for (
int i = is; i < is + ns; ++i) {
896 mult_tm1_chiral_thread(i, vcp1_tm, v1);
902 int Nv = m_Nvc * 2 * m_Nx * m_Ny * m_Nz;
907 for (
int i = is; i < is + ns; ++i) {
908 mult_tmb_chiral_thread(i, v2, v1);
911 for (
int i = is; i < is + ns; ++i) {
912 mult_tm2_chiral_thread(i, v2, vcp2_tm);
void daypx(Field &, double, const Field &)
void mult_zp(Field &, const Field &)
static int get_num_threads()
returns available number of threads.
void set_parameters(const double kappa, const std::valarray< int > bc)
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()
double * ptr(const int jin, const int site, const int jex)
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)
std::valarray< double > m_boundary2
b.c. for each node.
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
std::valarray< GammaMatrix > m_GM
gamma matrices.
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(Fopr_Wilson::Fopr_Wilson_impl::* m_mult_tm)(Field &, const Field &)
void mult_tp_dirac(Field &, const Field &)
std::valarray< int > m_boundary
boundary condition.
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)
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 &)
const Field mult_gm5(const Field &f)
void mult_tm_chiral(Field &, const Field &)
void gm5_dirac(Field &, const Field &)