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") {
91 int Nvx =
m_Nvc * 2 * (
m_Ny / 2) * m_Nz * m_Nt;
116 buf_size[0] =
sizeof(double) *
m_Nvc * 2 * (
m_Ny / 2) * m_Nz *
m_Nt;
117 buf_size[1] =
sizeof(double) *
m_Nvc * 2 *
m_Nx2 * m_Nz * m_Nt;
135 for (
int imu = 0; imu <
m_Ndim; ++imu) {
195 const std::vector<int> bc)
200 for (
int mu = 0; mu <
m_Ndim; ++mu) {
206 assert(bc.size() ==
m_Ndim);
212 for (
int mu = 0; mu <
m_Ndim; ++mu) {
217 for (
int idir = 0; idir <
m_Ndim; ++idir) {
218 m_boundary2[idir] = 1.0;
244 double flop_site, flop;
247 flop_site =
static_cast<double>(
248 m_Nc * m_Nd * (6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
249 }
else if (
m_repr ==
"Chiral") {
250 flop_site =
static_cast<double>(
251 m_Nc * m_Nd * 8 * (4 * m_Nc + 2));
258 flop = flop_site *
static_cast<double>(Lvol / 2);
355 assert(f.
nex() == 1);
411 const Field& f,
const int ieo)
432 (this->*m_mult_tp)(w, f, ieo);
433 (this->*m_mult_tm)(w, f, ieo);
444 const Field& f,
const int ieo)
458 const Field& f,
const int ieo)
468 (this->*
m_gm5)(w, f);
475 (this->*m_gm5_self)(w);
483 const double *
v1 = f.
ptr(0);
484 double *
v2 = w.
ptr(0);
489 int is = m_Ntask * ith / nth;
490 int ns = m_Ntask * (ith + 1) / nth - is;
492 for (
int i = is; i < is + ns; ++i) {
493 gm5_dirac_thread(i, v2, v1);
502 const double *v1 = f.
ptr(0);
503 double *v2 = w.
ptr(0);
508 int is = m_Ntask * ith / nth;
509 int ns = m_Ntask * (ith + 1) / nth - is;
511 for (
int i = is; i < is + ns; ++i) {
512 gm5_chiral_thread(i, v2, v1);
520 double *wp = w.
ptr(0);
525 int is = m_Ntask * ith / nth;
526 int ns = m_Ntask * (ith + 1) / nth - is;
528 for (
int i = is; i < is + ns; ++i) {
529 gm5_dirac_thread(i, wp);
537 double *wp = w.
ptr(0);
542 int is = m_Ntask * ith / nth;
543 int ns = m_Ntask * (ith + 1) / nth - is;
545 for (
int i = is; i < is + ns; ++i) {
546 gm5_chiral_thread(i, wp);
568 }
else if (mu == 1) {
570 }
else if (mu == 2) {
572 }
else if (mu == 3) {
573 mult_tp_dirac(w, f, ieo);
589 }
else if (mu == 1) {
591 }
else if (mu == 2) {
593 }
else if (mu == 3) {
594 mult_tm_dirac(w, f, ieo);
606 double *wp = w.
ptr(0);
611 int is = m_Ntask * ith / nth;
612 int ns = m_Ntask * (ith + 1) / nth - is;
614 for (
int i = is; i < is + ns; ++i) {
623 double *wp = w.
ptr(0);
628 int is = m_Ntask * ith / nth;
629 int ns = m_Ntask * (ith + 1) / nth - is;
631 for (
int i = is; i < is + ns; ++i) {
632 scal_thread(i, wp, a);
639 const Field& f,
const int ieo)
641 const double *v1 = f.
ptr(0);
642 double *v2 = w.
ptr(0);
647 int is = m_Ntask * ith / nth;
648 int ns = m_Ntask * (ith + 1) / nth - is;
650 for (
int i = is; i < is + ns; ++i) {
651 mult_xp1_thread(i, vcp1_xp, v1, ieo);
664 for (
int i = is; i < is + ns; ++i) {
665 mult_xpb_thread(i, v2, v1, ieo);
668 for (
int i = is; i < is + ns; ++i) {
669 mult_xp2_thread(i, v2, vcp2_xp, ieo);
676 const Field& f,
const int ieo)
678 const double *v1 = f.
ptr(0);
679 double *v2 = w.
ptr(0);
684 int is = m_Ntask * ith / nth;
685 int ns = m_Ntask * (ith + 1) / nth - is;
687 for (
int i = is; i < is + ns; ++i) {
688 mult_xm1_thread(i, vcp1_xm, v1, ieo);
702 for (
int i = is; i < is + ns; ++i) {
703 mult_xmb_thread(i, v2, v1, ieo);
706 for (
int i = is; i < is + ns; ++i) {
707 mult_xm2_thread(i, v2, vcp2_xm, ieo);
714 const Field& f,
const int ieo)
716 const double *v1 = f.
ptr(0);
717 double *v2 = w.
ptr(0);
722 int is = m_Ntask * ith / nth;
723 int ns = m_Ntask * (ith + 1) / nth - is;
725 for (
int i = is; i < is + ns; ++i) {
726 mult_yp1_thread(i, vcp1_yp, v1, ieo);
740 for (
int i = is; i < is + ns; ++i) {
741 mult_ypb_thread(i, v2, v1, ieo);
744 for (
int i = is; i < is + ns; ++i) {
745 mult_yp2_thread(i, v2, vcp2_yp, ieo);
752 const Field& f,
const int ieo)
754 const double *v1 = f.
ptr(0);
755 double *v2 = w.
ptr(0);
760 int is = m_Ntask * ith / nth;
761 int ns = m_Ntask * (ith + 1) / nth - is;
763 for (
int i = is; i < is + ns; ++i) {
764 mult_ym1_thread(i, vcp1_ym, v1, ieo);
778 for (
int i = is; i < is + ns; ++i) {
779 mult_ymb_thread(i, v2, v1, ieo);
782 for (
int i = is; i < is + ns; ++i) {
783 mult_ym2_thread(i, v2, vcp2_ym, ieo);
790 const Field& f,
const int ieo)
792 const double *v1 = f.
ptr(0);
793 double *v2 = w.
ptr(0);
798 int is = m_Ntask * ith / nth;
799 int ns = m_Ntask * (ith + 1) / nth - is;
801 for (
int i = is; i < is + ns; ++i) {
802 mult_zp1_thread(i, vcp1_zp, v1, ieo);
816 for (
int i = is; i < is + ns; ++i) {
817 mult_zpb_thread(i, v2, v1, ieo);
820 for (
int i = is; i < is + ns; ++i) {
821 mult_zp2_thread(i, v2, vcp2_zp, ieo);
828 const Field& f,
const int ieo)
830 const double *v1 = f.
ptr(0);
831 double *v2 = w.
ptr(0);
836 int is = m_Ntask * ith / nth;
837 int ns = m_Ntask * (ith + 1) / nth - is;
839 for (
int i = is; i < is + ns; ++i) {
840 mult_zm1_thread(i, vcp1_zm, v1, ieo);
854 for (
int i = is; i < is + ns; ++i) {
855 mult_zmb_thread(i, v2, v1, ieo);
858 for (
int i = is; i < is + ns; ++i) {
859 mult_zm2_thread(i, v2, vcp2_zm, ieo);
866 const Field& f,
const int ieo)
868 const double *v1 = f.
ptr(0);
869 double *v2 = w.
ptr(0);
874 int is = m_Ntask * ith / nth;
875 int ns = m_Ntask * (ith + 1) / nth - is;
877 for (
int i = is; i < is + ns; ++i) {
878 mult_tp1_dirac_thread(i, vcp1_tp, v1, ieo);
885 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
891 for (
int i = is; i < is + ns; ++i) {
892 mult_tpb_dirac_thread(i, v2, v1, ieo);
895 for (
int i = is; i < is + ns; ++i) {
896 mult_tp2_dirac_thread(i, v2, vcp2_tp, ieo);
903 const Field& f,
const int ieo)
905 const double *v1 = f.
ptr(0);
906 double *v2 = w.
ptr(0);
911 int is = m_Ntask * ith / nth;
912 int ns = m_Ntask * (ith + 1) / nth - is;
914 for (
int i = is; i < is + ns; ++i) {
915 mult_tm1_dirac_thread(i, vcp1_tm, v1, ieo);
922 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
928 for (
int i = is; i < is + ns; ++i) {
929 mult_tmb_dirac_thread(i, v2, v1, ieo);
932 for (
int i = is; i < is + ns; ++i) {
933 mult_tm2_dirac_thread(i, v2, vcp2_tm, ieo);
940 const Field& f,
const int ieo)
942 const double *v1 = f.
ptr(0);
943 double *v2 = w.
ptr(0);
948 int is = m_Ntask * ith / nth;
949 int ns = m_Ntask * (ith + 1) / nth - is;
951 for (
int i = is; i < is + ns; ++i) {
952 mult_tp1_chiral_thread(i, vcp1_tp, v1, ieo);
966 for (
int i = is; i < is + ns; ++i) {
967 mult_tpb_chiral_thread(i, v2, v1, ieo);
970 for (
int i = is; i < is + ns; ++i) {
971 mult_tp2_chiral_thread(i, v2, vcp2_tp, ieo);
978 const Field& f,
const int ieo)
980 const double *v1 = f.
ptr(0);
981 double *v2 = w.
ptr(0);
986 int is = m_Ntask * ith / nth;
987 int ns = m_Ntask * (ith + 1) / nth - is;
989 for (
int i = is; i < is + ns; ++i) {
990 mult_tm1_chiral_thread(i, vcp1_tm, v1, ieo);
1004 for (
int i = is; i < is + ns; ++i) {
1005 mult_tmb_chiral_thread(i, v2, v1, ieo);
1008 for (
int i = is; i < is + ns; ++i) {
1009 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)
static Channel * recv_init(int count, int idir, int ipm)
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 &)
std::vector< Channel * > m_bw_recv
void mult_zp(Field &, const Field &, const int ieo)
void mult_tm_chiral(Field &, const Field &, const int ieo)
void paranoiac(const char *format,...)
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)
std::vector< Channel * > m_fw_send
std::vector< Channel * > m_fw_recv
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.
static Channel * send_init(int count, int idir, int ipm)
void Ddag(Field &v, const Field &f)
Bridge::VerboseLevel m_vl
void mult_yp(Field &, const Field &, const int ieo)
static int sync()
synchronize within small world.
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::vector< Channel * > m_bw_send
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.