21 =
"Fopr_Wilson_eo_impl";
45 if ((
m_Nx % 2) != 0) {
51 if ((
m_Ny % 2) != 0) {
63 for (
int t = 0; t <
m_Nt; ++t) {
64 for (
int z = 0; z <
m_Nz; ++z) {
65 for (
int y = 0; y <
m_Ny; ++y) {
69 m_Leo[y + m_Ny * (z + m_Nz * t)] = (y2 + z2 + t2) % 2;
81 }
else if (
m_repr ==
"Chiral") {
92 int Nvx =
m_Nvc * 2 * (
m_Ny / 2) * m_Nz * m_Nt;
117 buf_size[0] =
sizeof(double) *
m_Nvc * 2 * (
m_Ny / 2) * m_Nz *
m_Nt;
118 buf_size[1] =
sizeof(double) *
m_Nvc * 2 *
m_Nx2 * m_Nz * m_Nt;
136 for (
int imu = 0; imu <
m_Ndim; ++imu) {
196 const std::valarray<int> bc)
201 for (
int mu = 0; mu <
m_Ndim; ++mu) {
207 assert(bc.size() ==
m_Ndim);
213 for (
int mu = 0; mu <
m_Ndim; ++mu) {
218 for (
int idir = 0; idir <
m_Ndim; ++idir) {
219 m_boundary2[idir] = 1.0;
245 double flop_site, flop;
248 flop_site =
static_cast<double>(
249 m_Nc * m_Nd * (6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
250 }
else if (
m_repr ==
"Chiral") {
251 flop_site =
static_cast<double>(
252 m_Nc * m_Nd * 8 * (4 * m_Nc + 2));
259 flop = flop_site *
static_cast<double>(Lvol / 2);
356 assert(f.
nex() == 1);
412 const Field& f,
const int ieo)
433 (this->*m_mult_tp)(w, f, ieo);
434 (this->*m_mult_tm)(w, f, ieo);
445 const Field& f,
const int ieo)
459 const Field& f,
const int ieo)
469 (this->*
m_gm5)(w, f);
476 (this->*m_gm5_self)(w);
484 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
485 double *
v2 = w.
ptr(0);
490 int is = m_Ntask * ith / nth;
491 int ns = m_Ntask * (ith + 1) / nth - is;
493 for (
int i = is; i < is + ns; ++i) {
494 gm5_dirac_thread(i, v2, v1);
503 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
504 double *v2 = w.
ptr(0);
509 int is = m_Ntask * ith / nth;
510 int ns = m_Ntask * (ith + 1) / nth - is;
512 for (
int i = is; i < is + ns; ++i) {
513 gm5_chiral_thread(i, v2, v1);
521 double *wp = w.
ptr(0);
526 int is = m_Ntask * ith / nth;
527 int ns = m_Ntask * (ith + 1) / nth - is;
529 for (
int i = is; i < is + ns; ++i) {
530 gm5_dirac_thread(i, wp);
538 double *wp = w.
ptr(0);
543 int is = m_Ntask * ith / nth;
544 int ns = m_Ntask * (ith + 1) / nth - is;
546 for (
int i = is; i < is + ns; ++i) {
547 gm5_chiral_thread(i, wp);
569 }
else if (mu == 1) {
571 }
else if (mu == 2) {
573 }
else if (mu == 3) {
574 mult_tp_dirac(w, f, ieo);
590 }
else if (mu == 1) {
592 }
else if (mu == 2) {
594 }
else if (mu == 3) {
595 mult_tm_dirac(w, f, ieo);
607 double *wp = w.
ptr(0);
612 int is = m_Ntask * ith / nth;
613 int ns = m_Ntask * (ith + 1) / nth - is;
615 for (
int i = is; i < is + ns; ++i) {
624 double *wp = w.
ptr(0);
629 int is = m_Ntask * ith / nth;
630 int ns = m_Ntask * (ith + 1) / nth - is;
632 for (
int i = is; i < is + ns; ++i) {
633 scal_thread(i, wp, a);
640 const Field& f,
const int ieo)
642 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
643 double *v2 = w.
ptr(0);
648 int is = m_Ntask * ith / nth;
649 int ns = m_Ntask * (ith + 1) / nth - is;
651 for (
int i = is; i < is + ns; ++i) {
652 mult_xp1_thread(i, vcp1_xp, v1, ieo);
665 for (
int i = is; i < is + ns; ++i) {
666 mult_xpb_thread(i, v2, v1, ieo);
669 for (
int i = is; i < is + ns; ++i) {
670 mult_xp2_thread(i, v2, vcp2_xp, ieo);
677 const Field& f,
const int ieo)
679 double *v2 = w.
ptr(0);
680 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
685 int is = m_Ntask * ith / nth;
686 int ns = m_Ntask * (ith + 1) / nth - is;
688 for (
int i = is; i < is + ns; ++i) {
689 mult_xm1_thread(i, vcp1_xm, v1, ieo);
703 for (
int i = is; i < is + ns; ++i) {
704 mult_xmb_thread(i, v2, v1, ieo);
707 for (
int i = is; i < is + ns; ++i) {
708 mult_xm2_thread(i, v2, vcp2_xm, ieo);
715 const Field& f,
const int ieo)
717 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
718 double *v2 = w.
ptr(0);
723 int is = m_Ntask * ith / nth;
724 int ns = m_Ntask * (ith + 1) / nth - is;
726 for (
int i = is; i < is + ns; ++i) {
727 mult_yp1_thread(i, vcp1_yp, v1, ieo);
741 for (
int i = is; i < is + ns; ++i) {
742 mult_ypb_thread(i, v2, v1, ieo);
745 for (
int i = is; i < is + ns; ++i) {
746 mult_yp2_thread(i, v2, vcp2_yp, ieo);
753 const Field& f,
const int ieo)
755 double *v2 = w.
ptr(0);
756 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
761 int is = m_Ntask * ith / nth;
762 int ns = m_Ntask * (ith + 1) / nth - is;
764 for (
int i = is; i < is + ns; ++i) {
765 mult_ym1_thread(i, vcp1_ym, v1, ieo);
779 for (
int i = is; i < is + ns; ++i) {
780 mult_ymb_thread(i, v2, v1, ieo);
783 for (
int i = is; i < is + ns; ++i) {
784 mult_ym2_thread(i, v2, vcp2_ym, ieo);
791 const Field& f,
const int ieo)
793 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
794 double *v2 = w.
ptr(0);
799 int is = m_Ntask * ith / nth;
800 int ns = m_Ntask * (ith + 1) / nth - is;
802 for (
int i = is; i < is + ns; ++i) {
803 mult_zp1_thread(i, vcp1_zp, v1, ieo);
817 for (
int i = is; i < is + ns; ++i) {
818 mult_zpb_thread(i, v2, v1, ieo);
821 for (
int i = is; i < is + ns; ++i) {
822 mult_zp2_thread(i, v2, vcp2_zp, ieo);
829 const Field& f,
const int ieo)
831 double *v2 = w.
ptr(0);
832 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
837 int is = m_Ntask * ith / nth;
838 int ns = m_Ntask * (ith + 1) / nth - is;
840 for (
int i = is; i < is + ns; ++i) {
841 mult_zm1_thread(i, vcp1_zm, v1, ieo);
855 for (
int i = is; i < is + ns; ++i) {
856 mult_zmb_thread(i, v2, v1, ieo);
859 for (
int i = is; i < is + ns; ++i) {
860 mult_zm2_thread(i, v2, vcp2_zm, ieo);
867 const Field& f,
const int ieo)
869 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
870 double *v2 = w.
ptr(0);
875 int is = m_Ntask * ith / nth;
876 int ns = m_Ntask * (ith + 1) / nth - is;
878 for (
int i = is; i < is + ns; ++i) {
879 mult_tp1_dirac_thread(i, vcp1_tp, v1, ieo);
886 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
892 for (
int i = is; i < is + ns; ++i) {
893 mult_tpb_dirac_thread(i, v2, v1, ieo);
896 for (
int i = is; i < is + ns; ++i) {
897 mult_tp2_dirac_thread(i, v2, vcp2_tp, ieo);
904 const Field& f,
const int ieo)
906 double *v2 = w.
ptr(0);
907 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
912 int is = m_Ntask * ith / nth;
913 int ns = m_Ntask * (ith + 1) / nth - is;
915 for (
int i = is; i < is + ns; ++i) {
916 mult_tm1_dirac_thread(i, vcp1_tm, v1, ieo);
923 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
929 for (
int i = is; i < is + ns; ++i) {
930 mult_tmb_dirac_thread(i, v2, v1, ieo);
933 for (
int i = is; i < is + ns; ++i) {
934 mult_tm2_dirac_thread(i, v2, vcp2_tm, ieo);
941 const Field& f,
const int ieo)
943 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
944 double *v2 = w.
ptr(0);
949 int is = m_Ntask * ith / nth;
950 int ns = m_Ntask * (ith + 1) / nth - is;
952 for (
int i = is; i < is + ns; ++i) {
953 mult_tp1_chiral_thread(i, vcp1_tp, v1, ieo);
967 for (
int i = is; i < is + ns; ++i) {
968 mult_tpb_chiral_thread(i, v2, v1, ieo);
971 for (
int i = is; i < is + ns; ++i) {
972 mult_tp2_chiral_thread(i, v2, vcp2_tp, ieo);
979 const Field& f,
const int ieo)
981 double *v2 = w.
ptr(0);
982 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
987 int is = m_Ntask * ith / nth;
988 int ns = m_Ntask * (ith + 1) / nth - is;
990 for (
int i = is; i < is + ns; ++i) {
991 mult_tm1_chiral_thread(i, vcp1_tm, v1, ieo);
1005 for (
int i = is; i < is + ns; ++i) {
1006 mult_tmb_chiral_thread(i, v2, v1, ieo);
1009 for (
int i = is; i < is + ns; ++i) {
1010 mult_tm2_chiral_thread(i, v2, vcp2_tm, ieo);
void scal(Field &x, const double a)
scal(x, a): x = a * x
const Field_F Meo(const Field_F &, const int ieo)
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)
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)
const Field_F Mdageo(const Field_F &, const int ieo)
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()
std::valarray< Channel * > m_bw_recv
void set_parameters(const double kappa, const std::valarray< int > bc)
double * ptr(const int jin, const int site, const int jex)
Container of Field-type object.
std::valarray< Channel * > m_fw_recv
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 &)
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 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)
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(Fopr_Wilson_eo::* m_gm5)(Field &, const Field &)
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.
std::valarray< Channel * > m_bw_send
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 paranoiac(const char *format,...)
void mult_ym(Field &, const Field &, const int ieo)
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,...)
std::valarray< Channel * > m_fw_send
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::valarray< double > m_boundary2
b.c. for each node.
void reverseField(Field &lex, const Field &eo)
std::valarray< int > m_boundary
boundary condition.
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)
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.
std::valarray< int > m_npe
void gm5p(const int mu, Field &, const Field &v)
gamma_5 (1 - gamma_mu) v(x + mu) used in force calculation.
std::valarray< int > m_boundary