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") {
153 const std::valarray<int> bc)
158 for (
int mu = 0; mu <
m_Ndim; ++mu) {
164 assert(bc.size() ==
m_Ndim);
170 for (
int mu = 0; mu <
m_Ndim; ++mu) {
175 for (
int idir = 0; idir <
m_Ndim; ++idir) {
176 m_boundary2[idir] = 1.0;
197 double flop_site, flop;
200 flop_site =
static_cast<double>(
202 }
else if (
m_repr ==
"Chiral") {
203 flop_site =
static_cast<double>(
211 flop = flop_site *
static_cast<double>(Lvol / 2);
334 assert(f.
nex() == 1);
353 const Field& f,
const int ieo)
374 (this->*m_mult_tp)(w, f, ieo);
375 (this->*m_mult_tm)(w, f, ieo);
385 const Field& f,
const int ieo)
398 const Field& f,
const int ieo)
407 (this->*
m_gm5)(w, f);
413 (this->*m_gm5_self)(w);
420 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
421 double *
v2 = w.
ptr(0);
426 int is = m_Ntask * ith / nth;
427 int ns = m_Ntask * (ith + 1) / nth - is;
429 for (
int i = is; i < is + ns; ++i) {
430 gm5_dirac_thread(i, v2, v1);
439 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
440 double *
v2 = w.
ptr(0);
445 int is = m_Ntask * ith / nth;
446 int ns = m_Ntask * (ith + 1) / nth - is;
448 for (
int i = is; i < is + ns; ++i) {
449 gm5_chiral_thread(i, v2, v1);
457 double *wp = w.
ptr(0);
462 int is = m_Ntask * ith / nth;
463 int ns = m_Ntask * (ith + 1) / nth - is;
465 for (
int i = is; i < is + ns; ++i) {
466 gm5_dirac_thread(i, wp);
474 double *wp = w.
ptr(0);
479 int is = m_Ntask * ith / nth;
480 int ns = m_Ntask * (ith + 1) / nth - is;
482 for (
int i = is; i < is + ns; ++i) {
483 gm5_chiral_thread(i, wp);
504 }
else if (mu == 1) {
506 }
else if (mu == 2) {
508 }
else if (mu == 3) {
509 mult_tp_dirac(w, f, ieo);
525 }
else if (mu == 1) {
527 }
else if (mu == 2) {
529 }
else if (mu == 3) {
530 mult_tm_dirac(w, f, ieo);
542 double *wp = w.
ptr(0);
547 int is = m_Ntask * ith / nth;
548 int ns = m_Ntask * (ith + 1) / nth - is;
550 for (
int i = is; i < is + ns; ++i) {
559 double *wp = w.
ptr(0);
564 int is = m_Ntask * ith / nth;
565 int ns = m_Ntask * (ith + 1) / nth - is;
567 for (
int i = is; i < is + ns; ++i) {
568 scal_thread(i, wp, a);
575 const Field& f,
const int ieo)
577 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
578 double *
v2 = w.
ptr(0);
583 int is = m_Ntask * ith / nth;
584 int ns = m_Ntask * (ith + 1) / nth - is;
586 for (
int i = is; i < is + ns; ++i) {
587 mult_xp1_thread(i, vcp1_xp, v1, ieo);
593 int Nv = m_Nvc * 2 * (m_Ny / 2) * m_Nz * m_Nt;
598 for (
int i = is; i < is + ns; ++i) {
599 mult_xpb_thread(i, v2, v1, ieo);
602 for (
int i = is; i < is + ns; ++i) {
603 mult_xp2_thread(i, v2, vcp2_xp, ieo);
610 const Field& f,
const int ieo)
612 double *
v2 = w.
ptr(0);
613 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
618 int is = m_Ntask * ith / nth;
619 int ns = m_Ntask * (ith + 1) / nth - is;
621 for (
int i = is; i < is + ns; ++i) {
622 mult_xm1_thread(i, vcp1_xm, v1, ieo);
628 int Nv = m_Nvc * 2 * (m_Ny / 2) * m_Nz * m_Nt;
633 for (
int i = is; i < is + ns; ++i) {
634 mult_xmb_thread(i, v2, v1, ieo);
637 for (
int i = is; i < is + ns; ++i) {
638 mult_xm2_thread(i, v2, vcp2_xm, ieo);
645 const Field& f,
const int ieo)
647 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
648 double *
v2 = w.
ptr(0);
653 int is = m_Ntask * ith / nth;
654 int ns = m_Ntask * (ith + 1) / nth - is;
656 for (
int i = is; i < is + ns; ++i) {
657 mult_yp1_thread(i, vcp1_yp, v1, ieo);
663 int Nv = m_Nvc * 2 * m_Nx2 * m_Nz * m_Nt;
668 for (
int i = is; i < is + ns; ++i) {
669 mult_ypb_thread(i, v2, v1, ieo);
672 for (
int i = is; i < is + ns; ++i) {
673 mult_yp2_thread(i, v2, vcp2_yp, ieo);
680 const Field& f,
const int ieo)
682 double *
v2 = w.
ptr(0);
683 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
688 int is = m_Ntask * ith / nth;
689 int ns = m_Ntask * (ith + 1) / nth - is;
691 for (
int i = is; i < is + ns; ++i) {
692 mult_ym1_thread(i, vcp1_ym, v1, ieo);
698 int Nv = m_Nvc * 2 * m_Nx2 * m_Nz * m_Nt;
703 for (
int i = is; i < is + ns; ++i) {
704 mult_ymb_thread(i, v2, v1, ieo);
707 for (
int i = is; i < is + ns; ++i) {
708 mult_ym2_thread(i, v2, vcp2_ym, 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_zp1_thread(i, vcp1_zp, v1, ieo);
733 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nt;
738 for (
int i = is; i < is + ns; ++i) {
739 mult_zpb_thread(i, v2, v1, ieo);
742 for (
int i = is; i < is + ns; ++i) {
743 mult_zp2_thread(i, v2, vcp2_zp, ieo);
750 const Field& f,
const int ieo)
752 double *
v2 = w.
ptr(0);
753 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
758 int is = m_Ntask * ith / nth;
759 int ns = m_Ntask * (ith + 1) / nth - is;
761 for (
int i = is; i < is + ns; ++i) {
762 mult_zm1_thread(i, vcp1_zm, v1, ieo);
768 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nt;
773 for (
int i = is; i < is + ns; ++i) {
774 mult_zmb_thread(i, v2, v1, ieo);
777 for (
int i = is; i < is + ns; ++i) {
778 mult_zm2_thread(i, v2, vcp2_zm, ieo);
785 const Field& f,
const int ieo)
787 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
788 double *
v2 = w.
ptr(0);
793 int is = m_Ntask * ith / nth;
794 int ns = m_Ntask * (ith + 1) / nth - is;
796 for (
int i = is; i < is + ns; ++i) {
797 mult_tp1_dirac_thread(i, vcp1_tp, v1, ieo);
803 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
808 for (
int i = is; i < is + ns; ++i) {
809 mult_tpb_dirac_thread(i, v2, v1, ieo);
812 for (
int i = is; i < is + ns; ++i) {
813 mult_tp2_dirac_thread(i, v2, vcp2_tp, ieo);
820 const Field& f,
const int ieo)
822 double *
v2 = w.
ptr(0);
823 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
828 int is = m_Ntask * ith / nth;
829 int ns = m_Ntask * (ith + 1) / nth - is;
831 for (
int i = is; i < is + ns; ++i) {
832 mult_tm1_dirac_thread(i, vcp1_tm, v1, ieo);
838 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
843 for (
int i = is; i < is + ns; ++i) {
844 mult_tmb_dirac_thread(i, v2, v1, ieo);
847 for (
int i = is; i < is + ns; ++i) {
848 mult_tm2_dirac_thread(i, v2, vcp2_tm, ieo);
855 const Field& f,
const int ieo)
857 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
858 double *
v2 = w.
ptr(0);
863 int is = m_Ntask * ith / nth;
864 int ns = m_Ntask * (ith + 1) / nth - is;
866 for (
int i = is; i < is + ns; ++i) {
867 mult_tp1_chiral_thread(i, vcp1_tp, v1, ieo);
873 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
878 for (
int i = is; i < is + ns; ++i) {
879 mult_tpb_chiral_thread(i, v2, v1, ieo);
882 for (
int i = is; i < is + ns; ++i) {
883 mult_tp2_chiral_thread(i, v2, vcp2_tp, ieo);
890 const Field& f,
const int ieo)
892 double *
v2 = w.
ptr(0);
893 double *
v1 =
const_cast<Field *
>(&f)->ptr(0);
898 int is = m_Ntask * ith / nth;
899 int ns = m_Ntask * (ith + 1) / nth - is;
901 for (
int i = is; i < is + ns; ++i) {
902 mult_tm1_chiral_thread(i, vcp1_tm, v1, ieo);
908 int Nv = m_Nvc * 2 * m_Nx2 * m_Ny * m_Nz;
913 for (
int i = is; i < is + ns; ++i) {
914 mult_tmb_chiral_thread(i, v2, v1, ieo);
917 for (
int i = is; i < is + ns; ++i) {
918 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()
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.
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 &)
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.
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 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::valarray< double > m_boundary2
b.c. for each node.
void reverseField(Field &lex, const Field &eo)
std::valarray< int > m_boundary
boundary condition.
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)
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.
std::valarray< int > m_boundary