20 =
"Fopr_Wilson_eo_impl";
44 if ((
m_Nx % 2) != 0) {
50 if ((
m_Ny % 2) != 0) {
62 for (
int t = 0; t <
m_Nt; ++t) {
63 for (
int z = 0; z <
m_Nz; ++z) {
64 for (
int y = 0; y <
m_Ny; ++y) {
68 m_Leo[y + m_Ny * (z + m_Nz * t)] = (y2 + z2 + t2) % 2;
80 }
else if (
m_repr ==
"Chiral") {
154 const std::vector<int> bc)
159 for (
int mu = 0; mu <
m_Ndim; ++mu) {
165 assert(bc.size() ==
m_Ndim);
171 for (
int mu = 0; mu <
m_Ndim; ++mu) {
176 for (
int idir = 0; idir <
m_Ndim; ++idir) {
177 m_boundary2[idir] = 1.0;
199 double flop_site, flop;
202 flop_site =
static_cast<double>(
204 }
else if (
m_repr ==
"Chiral") {
205 flop_site =
static_cast<double>(
213 flop = flop_site *
static_cast<double>(Lvol / 2);
350 assert(f.
nex() == 1);
373 const Field& f,
const int ieo)
394 (this->*m_mult_tp)(w, f, ieo);
395 (this->*m_mult_tm)(w, f, ieo);
406 const Field& f,
const int ieo)
420 const Field& f,
const int ieo)
430 (this->*
m_gm5)(w, f);
437 (this->*m_gm5_self)(w);
445 const double *
v1 = f.
ptr(0);
446 double *
v2 = w.
ptr(0);
451 int is = m_Ntask * i_thread / Nthread;
452 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
454 for (
int i = is; i < is + ns; ++i) {
455 gm5_dirac_thread(i, v2, v1);
465 const double *
v1 = f.
ptr(0);
466 double *
v2 = w.
ptr(0);
471 int is = m_Ntask * i_thread / Nthread;
472 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
474 for (
int i = is; i < is + ns; ++i) {
475 gm5_chiral_thread(i, v2, v1);
484 double *wp = w.
ptr(0);
489 int is = m_Ntask * i_thread / Nthread;
490 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
492 for (
int i = is; i < is + ns; ++i) {
493 gm5_dirac_thread(i, wp);
502 double *wp = w.
ptr(0);
507 int is = m_Ntask * i_thread / Nthread;
508 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
510 for (
int i = is; i < is + ns; ++i) {
511 gm5_chiral_thread(i, wp);
534 }
else if (mu == 1) {
536 }
else if (mu == 2) {
538 }
else if (mu == 3) {
539 mult_tp_dirac(w, f, ieo);
555 }
else if (mu == 1) {
557 }
else if (mu == 2) {
559 }
else if (mu == 3) {
560 mult_tm_dirac(w, f, ieo);
572 double *wp = w.
ptr(0);
577 int is = m_Ntask * i_thread / Nthread;
578 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
580 for (
int i = is; i < is + ns; ++i) {
590 double *wp = w.
ptr(0);
595 int is = m_Ntask * i_thread / Nthread;
596 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
598 for (
int i = is; i < is + ns; ++i) {
599 scal_thread(i, wp, a);
607 const Field& f,
const int ieo)
609 const double *
v1 = f.
ptr(0);
610 double *
v2 = w.
ptr(0);
615 int is = m_Ntask * i_thread / Nthread;
616 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
618 for (
int i = is; i < is + ns; ++i) {
619 mult_xp1_thread(i, vcp1_xp, v1, ieo);
625 int Nv = m_Nvc * 2 * (m_Ny / 2) * m_Nz * m_Nt;
630 for (
int i = is; i < is + ns; ++i) {
631 mult_xpb_thread(i, v2, v1, ieo);
634 for (
int i = is; i < is + ns; ++i) {
635 mult_xp2_thread(i, v2, vcp2_xp, ieo);
643 const Field& f,
const int ieo)
645 const double *
v1 = f.
ptr(0);
646 double *
v2 = w.
ptr(0);
651 int is = m_Ntask * i_thread / Nthread;
652 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
654 for (
int i = is; i < is + ns; ++i) {
655 mult_xm1_thread(i, vcp1_xm, v1, ieo);
661 int Nv = m_Nvc * 2 * (m_Ny / 2) * m_Nz * m_Nt;
666 for (
int i = is; i < is + ns; ++i) {
667 mult_xmb_thread(i, v2, v1, ieo);
670 for (
int i = is; i < is + ns; ++i) {
671 mult_xm2_thread(i, v2, vcp2_xm, ieo);
679 const Field& f,
const int ieo)
681 const double *
v1 = f.
ptr(0);
682 double *
v2 = w.
ptr(0);
687 int is = m_Ntask * i_thread / Nthread;
688 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
690 for (
int i = is; i < is + ns; ++i) {
691 mult_yp1_thread(i, vcp1_yp, v1, ieo);
697 int Nv = m_Nvc * 2 * m_Nx2 * m_Nz * m_Nt;
702 for (
int i = is; i < is + ns; ++i) {
703 mult_ypb_thread(i, v2, v1, ieo);
706 for (
int i = is; i < is + ns; ++i) {
707 mult_yp2_thread(i, v2, vcp2_yp, ieo);
715 const Field& f,
const int ieo)
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;
726 for (
int i = is; i < is + ns; ++i) {
727 mult_ym1_thread(i, vcp1_ym, v1, ieo);
733 int Nv = m_Nvc * 2 * m_Nx2 * m_Nz * m_Nt;
738 for (
int i = is; i < is + ns; ++i) {
739 mult_ymb_thread(i, v2, v1, ieo);
742 for (
int i = is; i < is + ns; ++i) {
743 mult_ym2_thread(i, v2, vcp2_ym, ieo);
751 const Field& f,
const int ieo)
753 const double *
v1 = f.
ptr(0);
754 double *
v2 = w.
ptr(0);
759 int is = m_Ntask * i_thread / Nthread;
760 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
762 for (
int i = is; i < is + ns; ++i) {
763 mult_zp1_thread(i, vcp1_zp, v1, ieo);
769 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nt;
774 for (
int i = is; i < is + ns; ++i) {
775 mult_zpb_thread(i, v2, v1, ieo);
778 for (
int i = is; i < is + ns; ++i) {
779 mult_zp2_thread(i, v2, vcp2_zp, ieo);
787 const Field& f,
const int ieo)
789 const double *
v1 = f.
ptr(0);
790 double *
v2 = w.
ptr(0);
795 int is = m_Ntask * i_thread / Nthread;
796 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
798 for (
int i = is; i < is + ns; ++i) {
799 mult_zm1_thread(i, vcp1_zm, v1, ieo);
805 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nt;
810 for (
int i = is; i < is + ns; ++i) {
811 mult_zmb_thread(i, v2, v1, ieo);
814 for (
int i = is; i < is + ns; ++i) {
815 mult_zm2_thread(i, v2, vcp2_zm, ieo);
823 const Field& f,
const int ieo)
825 const double *
v1 = f.
ptr(0);
826 double *
v2 = w.
ptr(0);
831 int is = m_Ntask * i_thread / Nthread;
832 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
834 for (
int i = is; i < is + ns; ++i) {
835 mult_tp1_dirac_thread(i, vcp1_tp, v1, ieo);
841 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
846 for (
int i = is; i < is + ns; ++i) {
847 mult_tpb_dirac_thread(i, v2, v1, ieo);
850 for (
int i = is; i < is + ns; ++i) {
851 mult_tp2_dirac_thread(i, v2, vcp2_tp, ieo);
859 const Field& f,
const int ieo)
861 const double *
v1 = f.
ptr(0);
862 double *
v2 = w.
ptr(0);
867 int is = m_Ntask * i_thread / Nthread;
868 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
870 for (
int i = is; i < is + ns; ++i) {
871 mult_tm1_dirac_thread(i, vcp1_tm, v1, ieo);
877 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
882 for (
int i = is; i < is + ns; ++i) {
883 mult_tmb_dirac_thread(i, v2, v1, ieo);
886 for (
int i = is; i < is + ns; ++i) {
887 mult_tm2_dirac_thread(i, v2, vcp2_tm, ieo);
895 const Field& f,
const int ieo)
897 const double *
v1 = f.
ptr(0);
898 double *
v2 = w.
ptr(0);
903 int is = m_Ntask * i_thread / Nthread;
904 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
906 for (
int i = is; i < is + ns; ++i) {
907 mult_tp1_chiral_thread(i, vcp1_tp, v1, ieo);
913 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
918 for (
int i = is; i < is + ns; ++i) {
919 mult_tpb_chiral_thread(i, v2, v1, ieo);
922 for (
int i = is; i < is + ns; ++i) {
923 mult_tp2_chiral_thread(i, v2, vcp2_tp, ieo);
931 const Field& f,
const int ieo)
933 const double *
v1 = f.
ptr(0);
934 double *
v2 = w.
ptr(0);
939 int is = m_Ntask * i_thread / Nthread;
940 int ns = m_Ntask * (i_thread + 1) / Nthread - is;
942 for (
int i = is; i < is + ns; ++i) {
943 mult_tm1_chiral_thread(i, vcp1_tm, v1, ieo);
949 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
954 for (
int i = is; i < is + ns; ++i) {
955 mult_tmb_chiral_thread(i, v2, v1, ieo);
958 for (
int i = is; i < is + ns; ++i) {
959 mult_tm2_chiral_thread(i, v2, vcp2_tm, ieo);
void scal(Field &x, const double a)
scal(x, a): x = a * x
void prePropD(Field &, Field &, const Field &)
void mult_xp(Field &, const Field &, const int ieo)
void mult_tp_chiral(Field &, const Field &, const int ieo)
void prePropDag(Field &, Field &, const Field &)
static int get_num_threads()
returns available number of threads.
void(Fopr_Wilson_eo::Fopr_Wilson_eo_impl::* m_mult_tp)(Field &, const Field &, const int ieo)
const double * ptr(const int jin, const int site, const int jex) const
void MeoMoe(Field &, const Field &)
void set(const int jin, const int site, const int jex, double v)
static const std::string class_name
void mult_gm5(Field &v, const Field &f)
void mult_tp_dirac(Field &, const Field &, const int ieo)
void D(Field &v, const Field &f)
void mult_xm(Field &, const Field &, const int ieo)
void general(const char *format,...)
void Meo_gm5(Field &, const Field &, const int ieo)
static Bridge::VerboseLevel Vlevel()
Container of Field-type object.
void DdagD(Field &v, const Field &f)
void gm5_chiral(Field &, const Field &)
void mult_zm(Field &, const Field &, const int ieo)
void gm5_dirac(Field &, const Field &)
std::vector< int > m_boundary
boundary condition.
static int ipe(const int dir)
logical coordinate of current proc.
void(Fopr_Wilson_eo::Fopr_Wilson_eo_impl::* m_mult_tm)(Field &, const Field &, const int ieo)
void copy(Field &y, const Field &x)
copy(y, x): y = x
double * vcp1_xp
arrays for data transfer.
void convertField(Field &eo, const Field &lex)
void scal_impl(Field &, double)
void(Fopr_Wilson_eo::* m_gm5)(Field &, const Field &)
void mult_gm5(Field &, const Field &)
void gm5_self_dirac(Field &)
void postPropDag(Field &, const Field &, const Field &)
static int get_thread_id()
returns thread id.
Wilson-type fermion field.
void mult_tm_dirac(Field &, const Field &, const int ieo)
std::vector< int > m_boundary
void Meo(Field &, const Field &, const int ieo)
void(Fopr_Wilson_eo::Fopr_Wilson_eo_impl::* m_gm5_self)(Field &)
void postPropD(Field &, const Field &, const Field &)
void DDdag(Field &v, const Field &f)
Bridge::VerboseLevel m_vl
void Ddag(Field &v, const Field &f)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
static void sync_barrier_all()
barrier among all the threads and nodes.
void aypx(const double a, Field &y, const Field &x)
aypx(y, a, x): y := a * y + x
void Mdageo(Field &, const Field &, const int ieo)
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...
void(Fopr_Wilson_eo::Fopr_Wilson_eo_impl::* m_gm5)(Field &, const Field &)
void mult_zp(Field &, const Field &, const int ieo)
void mult_tm_chiral(Field &, const Field &, const int ieo)
void mult_ym(Field &, const Field &, const int ieo)
void set_parameters(const double kappa, const std::vector< int > bc)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
void init(const std::string)
void crucial(const char *format,...)
void set_config(Field *U)
void gm5_self_chiral(Field &)
void H(Field &v, const Field &f)
void D(Field &v, const Field &f)
void Meo(Field &, const Field &, const int ieo)
even-odd operatior: ieo=0: even <– odd, ieo=1: odd <– even
void reverseField(Field &lex, const Field &eo)
std::vector< double > m_boundary2
b.c. for each node.
void Ddag(Field &v, const Field &f)
Bridge::VerboseLevel m_vl
void mult_yp(Field &, const Field &, const int ieo)
void mult_m(int mu, Field_F &, const Field_F &, const int ieo)
void Mdageo(Field &, const Field &, const int ieo)
double flop_count()
this returns the number of floating point operations of Meo.
static const std::string class_name
void mult_p(int mu, Field_F &, const Field_F &, const int ieo)
std::string m_repr
Dirac matrix representation.
void gm5p(const int mu, Field &, const Field &v)
gamma_5 (1 - gamma_mu) v(x + mu) used in force calculation.