31 #if defined USE_GROUP_SU3
32 #include "fopr_Wilson_impl_SU3.inc"
33 #elif defined USE_GROUP_SU2
34 #include "fopr_Wilson_impl_SU2.inc"
35 #elif defined USE_GROUP_SU_N
36 #include "fopr_Wilson_impl_SU_N.inc"
45 vout.
general(
m_vl,
"Fopr_Wilson: Construction of Wilson fermion operator(imp).\n");
72 }
else if (
m_repr ==
"Chiral") {
98 }
else if (
m_repr ==
"Chiral") {
141 buf_size[0] =
sizeof(double) *
m_Nvc * 2 *
m_Ny * m_Nz * m_Nt;
142 buf_size[1] =
sizeof(double) *
m_Nvc * 2 *
m_Nx * m_Nz * m_Nt;
143 buf_size[2] =
sizeof(double) *
m_Nvc * 2 *
m_Nx *
m_Ny * m_Nt;
144 buf_size[3] =
sizeof(double) *
m_Nvc * 2 *
m_Nx *
m_Ny * m_Nz;
160 for (
int imu = 0; imu <
m_Ndim; ++imu) {
195 }
else if (m_mode ==
"Ddag") {
198 }
else if (m_mode ==
"DdagD") {
201 }
else if (m_mode ==
"DDdag") {
204 }
else if (m_mode ==
"H") {
208 vout.
crucial(
m_vl,
"Fopr_Wilson: input mode is undefined in Fopr_Wilson.\n");
246 const valarray<int> bc)
248 assert(bc.size() == m_Ndim);
252 for (
int mu = 0; mu < m_Ndim; ++mu) {
253 m_boundary[mu] = bc[mu];
258 for (
int mu = 0; mu < m_Ndim; ++mu) {
263 for (
int idir = 0; idir < m_Ndim; ++idir) {
264 m_boundary2[idir] = 1.0;
278 double flop_site, flop;
280 if (m_repr ==
"Dirac") {
281 flop_site =
static_cast<double>(
282 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
283 }
else if (m_repr ==
"Chiral") {
284 flop_site =
static_cast<double>(
285 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
292 flop = flop_site *
static_cast<double>(Lvol);
293 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;
301 D_ex_dirac(w, 0, f, 0);
307 D_ex_chiral(w, 0, f, 0);
312 const Field& f,
const int ex2)
314 int Ninvol = m_Nvc * m_Nd * m_Nvol;
315 double *v1 =
const_cast<Field *
>(&f)->ptr(Ninvol * ex2);
316 double *v2 = w.
ptr(Ninvol * ex1);
321 int is = m_Ntask * ith / nth;
322 int ns = m_Ntask * (ith + 1) / nth - is;
326 for (
int i = is; i < is + ns; ++i) {
327 mult_xp1_thread(i, vcp1_xp, v1);
328 mult_xm1_thread(i, vcp1_xm, v1);
329 mult_yp1_thread(i, vcp1_yp, v1);
330 mult_ym1_thread(i, vcp1_ym, v1);
331 mult_zp1_thread(i, vcp1_zp, v1);
332 mult_zm1_thread(i, vcp1_zm, v1);
333 mult_tp1_dirac_thread(i, vcp1_tp, v1);
334 mult_tm1_dirac_thread(i, vcp1_tm, v1);
338 for (
int i = is; i < is + ns; ++i) {
340 mult_xpb_thread(i, v2, v1);
341 mult_xmb_thread(i, v2, v1);
342 mult_ypb_thread(i, v2, v1);
343 mult_ymb_thread(i, v2, v1);
344 mult_zpb_thread(i, v2, v1);
345 mult_zmb_thread(i, v2, v1);
346 mult_tpb_dirac_thread(i, v2, v1);
347 mult_tmb_dirac_thread(i, v2, v1);
350 for (
int i = is; i < is + ns; ++i) {
351 mult_xp2_thread(i, v2, vcp2_xp);
352 mult_xm2_thread(i, v2, vcp2_xm);
353 mult_yp2_thread(i, v2, vcp2_yp);
354 mult_ym2_thread(i, v2, vcp2_ym);
355 mult_zp2_thread(i, v2, vcp2_zp);
356 mult_zm2_thread(i, v2, vcp2_zm);
357 mult_tp2_dirac_thread(i, v2, vcp2_tp);
358 mult_tm2_dirac_thread(i, v2, vcp2_tm);
359 daypx_thread(i, v2, -m_kappa, v1);
368 const Field& f,
const int ex2)
370 int Ninvol = m_Nvc * m_Nd * m_Nvol;
371 double *v1 =
const_cast<Field *
>(&f)->ptr(Ninvol * ex2);
372 double *v2 = w.
ptr(Ninvol * ex1);
377 int is = m_Ntask * ith / nth;
378 int ns = m_Ntask * (ith + 1) / nth - is;
382 for (
int i = is; i < is + ns; ++i) {
383 mult_xp1_thread(i, vcp1_xp, v1);
384 mult_xm1_thread(i, vcp1_xm, v1);
385 mult_yp1_thread(i, vcp1_yp, v1);
386 mult_ym1_thread(i, vcp1_ym, v1);
387 mult_zp1_thread(i, vcp1_zp, v1);
388 mult_zm1_thread(i, vcp1_zm, v1);
389 mult_tp1_chiral_thread(i, vcp1_tp, v1);
390 mult_tm1_chiral_thread(i, vcp1_tm, v1);
394 for (
int i = is; i < is + ns; ++i) {
396 mult_xpb_thread(i, v2, v1);
397 mult_xmb_thread(i, v2, v1);
398 mult_ypb_thread(i, v2, v1);
399 mult_ymb_thread(i, v2, v1);
400 mult_zpb_thread(i, v2, v1);
401 mult_zmb_thread(i, v2, v1);
402 mult_tpb_chiral_thread(i, v2, v1);
403 mult_tmb_chiral_thread(i, v2, v1);
406 for (
int i = is; i < is + ns; ++i) {
407 mult_xp2_thread(i, v2, vcp2_xp);
408 mult_xm2_thread(i, v2, vcp2_xm);
409 mult_yp2_thread(i, v2, vcp2_yp);
410 mult_ym2_thread(i, v2, vcp2_ym);
411 mult_zp2_thread(i, v2, vcp2_zp);
412 mult_zm2_thread(i, v2, vcp2_zm);
413 mult_tp2_chiral_thread(i, v2, vcp2_tp);
414 mult_tm2_chiral_thread(i, v2, vcp2_tm);
415 daypx_thread(i, v2, -m_kappa, v1);
440 }
else if (mu == 1) {
442 }
else if (mu == 2) {
444 }
else if (mu == 3) {
445 (this->*m_mult_tp)(w, f);
458 }
else if (mu == 1) {
460 }
else if (mu == 2) {
462 }
else if (mu == 3) {
463 (this->*m_mult_tm)(w, f);
473 Field& w,
const int ex1,
474 const Field& v,
const int ex2,
const int ipm)
480 }
else if (ipm == -1) {
484 "Fopr_Wilson_impl::proj_chiral: illegal chirality = %d.\n", ipm);
488 m_w1.setpart_ex(0, v, ex2);
490 m_w1.addpart_ex(0, m_w2, 0, fpm);
505 double fac,
const Field& f)
507 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
508 double *v2 = w.
ptr(0);
513 int is = m_Ntask * ith / nth;
514 int ns = m_Ntask * (ith + 1) / nth - is;
516 for (
int i = is; i < is + ns; ++i) {
517 daypx_thread(i, v2, fac, v1);
525 scal(v, 2.0 * m_kappa);
531 scal(v, 1.0 / (2.0 * m_kappa));
537 double *v2 = 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) {
554 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
555 double *v2 = w.
ptr(0);
560 int is = m_Ntask * ith / nth;
561 int ns = m_Ntask * (ith + 1) / nth - is;
563 for (
int i = is; i < is + ns; ++i) {
564 gm5_dirac_thread(i, v2, v1);
573 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
574 double *v2 = w.
ptr(0);
579 int is = m_Ntask * ith / nth;
580 int ns = m_Ntask * (ith + 1) / nth - is;
582 for (
int i = is; i < is + ns; ++i) {
583 gm5_chiral_thread(i, v2, v1);
592 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
593 double *v2 = w.
ptr(0);
598 int is = m_Ntask * ith / nth;
599 int ns = m_Ntask * (ith + 1) / nth - is;
603 for (
int i = is; i < is + ns; ++i) {
604 mult_xp1_thread(i, vcp1_xp, v1);
608 for (
int i = is; i < is + ns; ++i) {
609 mult_xpb_thread(i, v2, v1);
612 for (
int i = is; i < is + ns; ++i) {
613 mult_xp2_thread(i, v2, vcp2_xp);
622 double *v2 = w.
ptr(0);
623 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
628 int is = m_Ntask * ith / nth;
629 int ns = m_Ntask * (ith + 1) / nth - is;
633 for (
int i = is; i < is + ns; ++i) {
634 mult_xm1_thread(i, vcp1_xm, v1);
638 for (
int i = is; i < is + ns; ++i) {
639 mult_xmb_thread(i, v2, v1);
642 for (
int i = is; i < is + ns; ++i) {
643 mult_xm2_thread(i, v2, vcp2_xm);
652 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
653 double *v2 = w.
ptr(0);
658 int is = m_Ntask * ith / nth;
659 int ns = m_Ntask * (ith + 1) / nth - is;
663 for (
int i = is; i < is + ns; ++i) {
664 mult_yp1_thread(i, vcp1_yp, v1);
668 for (
int i = is; i < is + ns; ++i) {
669 mult_ypb_thread(i, v2, v1);
672 for (
int i = is; i < is + ns; ++i) {
673 mult_yp2_thread(i, v2, vcp2_yp);
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;
693 for (
int i = is; i < is + ns; ++i) {
694 mult_ym1_thread(i, vcp1_ym, v1);
698 for (
int i = is; i < is + ns; ++i) {
699 mult_ymb_thread(i, v2, v1);
702 for (
int i = is; i < is + ns; ++i) {
703 mult_ym2_thread(i, v2, vcp2_ym);
712 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
713 double *v2 = w.
ptr(0);
718 int is = m_Ntask * ith / nth;
719 int ns = m_Ntask * (ith + 1) / nth - is;
723 for (
int i = is; i < is + ns; ++i) {
724 mult_zp1_thread(i, vcp1_zp, v1);
728 for (
int i = is; i < is + ns; ++i) {
729 mult_zpb_thread(i, v2, v1);
732 for (
int i = is; i < is + ns; ++i) {
733 mult_zp2_thread(i, v2, vcp2_zp);
742 double *v2 = w.
ptr(0);
743 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
748 int is = m_Ntask * ith / nth;
749 int ns = m_Ntask * (ith + 1) / nth - is;
753 for (
int i = is; i < is + ns; ++i) {
754 mult_zm1_thread(i, vcp1_zm, v1);
758 for (
int i = is; i < is + ns; ++i) {
759 mult_zmb_thread(i, v2, v1);
762 for (
int i = is; i < is + ns; ++i) {
763 mult_zm2_thread(i, v2, vcp2_zm);
772 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
773 double *v2 = w.
ptr(0);
778 int is = m_Ntask * ith / nth;
779 int ns = m_Ntask * (ith + 1) / nth - is;
783 for (
int i = is; i < is + ns; ++i) {
784 mult_tp1_dirac_thread(i, vcp1_tp, v1);
788 for (
int i = is; i < is + ns; ++i) {
789 mult_tpb_dirac_thread(i, v2, v1);
792 for (
int i = is; i < is + ns; ++i) {
793 mult_tp2_dirac_thread(i, v2, vcp2_tp);
802 double *v2 = w.
ptr(0);
803 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
808 int is = m_Ntask * ith / nth;
809 int ns = m_Ntask * (ith + 1) / nth - is;
813 for (
int i = is; i < is + ns; ++i) {
814 mult_tm1_dirac_thread(i, vcp1_tm, v1);
818 for (
int i = is; i < is + ns; ++i) {
819 mult_tmb_dirac_thread(i, v2, v1);
822 for (
int i = is; i < is + ns; ++i) {
823 mult_tm2_dirac_thread(i, v2, vcp2_tm);
832 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
833 double *v2 = w.
ptr(0);
838 int is = m_Ntask * ith / nth;
839 int ns = m_Ntask * (ith + 1) / nth - is;
843 for (
int i = is; i < is + ns; ++i) {
844 mult_tp1_chiral_thread(i, vcp1_tp, v1);
848 for (
int i = is; i < is + ns; ++i) {
849 mult_tpb_chiral_thread(i, v2, v1);
852 for (
int i = is; i < is + ns; ++i) {
853 mult_tp2_chiral_thread(i, v2, vcp2_tp);
862 double *v2 = w.
ptr(0);
863 double *v1 =
const_cast<Field *
>(&f)->ptr(0);
868 int is = m_Ntask * ith / nth;
869 int ns = m_Ntask * (ith + 1) / nth - is;
873 for (
int i = is; i < is + ns; ++i) {
874 mult_tm1_chiral_thread(i, vcp1_tm, v1);
878 for (
int i = is; i < is + ns; ++i) {
879 mult_tmb_chiral_thread(i, v2, v1);
882 for (
int i = is; i < is + ns; ++i) {
883 mult_tm2_chiral_thread(i, v2, vcp2_tm);
void daypx(Field &, double, const Field &)
void scal(Field &x, const double a)
scal(x, a): x = a * x
void mult_zp(Field &, const Field &)
void detailed(const char *format,...)
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 &)
std::valarray< Channel * > m_fw_recv
std::valarray< int > m_npe
static Channel * recv_init(int count, int idir, int ipm)
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 &)
std::valarray< Channel * > m_bw_send
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 &)
std::valarray< Channel * > m_bw_recv
Set of Gamma Matrix: chiral representation.
static int get_thread_id()
returns thread id.
void mult_xm(Field &, const Field &)
void fprop_normalize(Field &v)
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 &)
Set of Gamma Matrices: basis class.
Set of Gamma Matrix: Dirac representation.
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
void paranoiac(const char *format,...)
const Field_F mult_gm5p(int mu, const Field_F &w)
void crucial(const char *format,...)
void set_mode(std::string mode)
void fopr_normalize(Field &v)
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 &)
static Channel * send_init(int count, int idir, int ipm)
void D_dirac(Field &, const Field &)
void mult_zm(Field &, const Field &)
static int sync()
synchronize within small world.
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)
std::valarray< Channel * > m_fw_send
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 &)