13 template<
typename AFIELD>
15 =
"AFopr_Wilson_eo<AFIELD>";
19 inline void set_kernel_thread(
int& ith,
int& nth,
int& ith_kernel)
24 if(nth > 1) ith_kernel = 1;
29 template<
typename AFIELD>
41 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
75 m_Ieo_origin = (ipe1 * m_Ny + ipe2 * m_Nz + ipe3 * m_Nt) % 2;
80 if (!params.
fetch_int(
"require_communication", req_comm)) {
81 vout.
general(m_vl,
"req_comm = %d (input)\n", req_comm);
83 vout.
general(m_vl,
"req_comm = %d (default)\n", req_comm);
87 for(
int mu = 0; mu < m_Ndim; ++mu){
90 do_comm_any += do_comm[mu];
91 vout.
general(
" do_comm[%d] = %d\n", mu, do_comm[mu]);
95 m_Nbdsize.resize(m_Ndim);
97 m_Nbdsize[0] = m_Nvc * Nd2 * ceil_nwp((m_Ny * m_Nz * m_Nt + 1)/2);
98 m_Nbdsize[1] = m_Nvc * Nd2 * ceil_nwp(m_Nx2 * m_Nz * m_Nt);
99 m_Nbdsize[2] = m_Nvc * Nd2 * ceil_nwp(m_Nx2 * m_Ny * m_Nt);
100 m_Nbdsize[3] = m_Nvc * Nd2 * ceil_nwp(m_Nx2 * m_Ny * m_Nz);
105 int Nst_pad2 = 2 * ceil_nwp(m_Nst2);
106 m_Ueo.reset(m_Ndf, Nst_pad2, m_Ndim);
109 int NinF = 2 * m_Nc * m_Nd;
110 m_v1.reset(NinF, m_Nst2, 1);
111 m_v2.reset(NinF, m_Nst2, 1);
113 set_parameters(params);
122 template<
typename AFIELD>
125 chsend_up.resize(m_Ndim);
126 chrecv_up.resize(m_Ndim);
127 chsend_dn.resize(m_Ndim);
128 chrecv_dn.resize(m_Ndim);
130 for(
int mu = 0; mu < m_Ndim; ++mu){
132 int Nvsize = m_Nbdsize[mu] *
sizeof(
real_t);
134 chsend_dn[mu].send_init(Nvsize, mu, -1);
135 chsend_up[mu].send_init(Nvsize, mu, 1);
137 chrecv_up[mu].recv_init(Nvsize, mu, 1);
138 chrecv_dn[mu].recv_init(Nvsize, mu, -1);
140 void* buf_up = (
void*)chsend_dn[mu].ptr();
141 chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
142 void* buf_dn = (
void*)chsend_up[mu].ptr();
143 chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
146 if(do_comm[mu] == 1){
147 chset_send.append(chsend_up[mu]);
148 chset_send.append(chsend_dn[mu]);
149 chset_recv.append(chrecv_up[mu]);
150 chset_recv.append(chrecv_dn[mu]);
173 template<
typename AFIELD>
179 for(
int mu = 0; mu < m_Ndim; ++mu){
202 template<
typename AFIELD>
220 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
229 vout.
general(m_vl,
" gamma_matrix_type is not given - set to Dirac\n");
231 }
else if(repr ==
"Dirac"){
233 }
else if(repr ==
"Chiral"){
236 vout.
crucial(m_vl,
"Error in %s: irrelevant gamma_matrix_type: %s\n",
237 class_name.c_str(), repr.c_str());
241 set_parameters(
real_t(kappa), bc);
246 template<
typename AFIELD>
248 const std::vector<int> bc)
250 assert(bc.size() == m_Ndim);
258 m_boundary.resize(m_Ndim);
259 for (
int mu = 0; mu < m_Ndim; ++mu) {
260 m_boundary[mu] = bc[mu];
263 for (
int mu = 0; mu < m_Ndim; ++mu) {
270 m_bc2[mu] = m_boundary[mu];
277 vout.
general(m_vl,
"%s: input parameters\n", class_name.c_str());
279 vout.
general(m_vl,
" gamma-matrix type = Dirac\n");
281 vout.
general(m_vl,
" gamma-matrix type = Chiral\n");
284 for (
int mu = 0; mu < m_Ndim; ++mu) {
285 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
292 template<
typename AFIELD>
295 params.
set_double(
"hopping_parameter",
double(m_CKs));
299 if(m_repr == DIRAC) repr =
"Dirac";
300 if(m_repr == CHIRAL) repr =
"Chiral";
307 template<
typename AFIELD>
312 vout.
paranoiac(m_vl,
"%s: set_config is called: num_threads = %d\n",
313 class_name.c_str(), nth);
321 vout.
paranoiac(m_vl,
"%s: set_config finished\n", class_name.c_str());
325 template<
typename AFIELD>
338 template<
typename AFIELD>
345 if (ith == 0) m_conf = u;
347 convert(m_index_eo, m_Ueo, *u);
353 template<
typename AFIELD>
359 if (ith == 0) m_mode = mode;
366 template<
typename AFIELD>
372 }
else if (m_mode ==
"DdagD") {
374 }
else if (m_mode ==
"Ddag") {
377 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
384 template<
typename AFIELD>
390 }
else if (m_mode ==
"DdagD") {
392 }
else if (m_mode ==
"Ddag") {
395 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
402 template<
typename AFIELD>
404 const std::string mode)
408 }
else if(mode ==
"Doo"){
410 }
else if(mode ==
"Dee_inv"){
412 }
else if(mode ==
"Doo_inv"){
414 }
else if(mode ==
"Deo_test"){
416 }
else if(mode ==
"Deo"){
418 }
else if(mode ==
"Doe"){
423 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
431 template<
typename AFIELD>
454 template<
typename AFIELD>
464 template<
typename AFIELD>
475 template<
typename AFIELD>
479 Meo(v, m_v1, w, 0, 1);
485 template<
typename AFIELD>
489 Meo(v, w, w, ieo, 0);
494 template<
typename AFIELD>
504 mult_xp(vp, wp, ieo);
505 mult_xm(vp, wp, ieo);
506 mult_yp(vp, wp, ieo);
507 mult_ym(vp, wp, ieo);
508 mult_zp(vp, wp, ieo);
509 mult_zm(vp, wp, ieo);
510 mult_tp(vp, wp, ieo);
511 mult_tm(vp, wp, ieo);
518 template<
typename AFIELD>
521 const int ieo,
const int iflag)
530 mult_xp(vp, wp, ieo);
531 mult_xm(vp, wp, ieo);
532 mult_yp(vp, wp, ieo);
533 mult_ym(vp, wp, ieo);
534 mult_zp(vp, wp, ieo);
535 mult_zm(vp, wp, ieo);
536 mult_tp(vp, wp, ieo);
537 mult_tm(vp, wp, ieo);
549 template<
typename AFIELD>
552 const int ieo,
const int iflag)
556 int ith, nth, ith_kernel;
557 set_kernel_thread(ith, nth, ith_kernel);
563 int jeo = (m_Ieo_origin + ieo) % 2;
565 if (do_comm_any > 0 && ith == ith_kernel){
578 buf1xp, buf1xm, buf1yp, buf1ym,
579 buf1zp, buf1zm, buf1tp, buf1tm,
581 m_Nsize, m_bc, do_comm,
NC);
584 buf1xp, buf1xm, buf1yp, buf1ym,
585 buf1zp, buf1zm, buf1tp, buf1tm,
587 m_Nsize, m_bc, do_comm,
NC);
592 if(do_comm_any > 0 && ith == 0){
598 if (ith == ith_kernel){
601 ieo, jeo, m_CKs, m_Nsize, m_bc2, iflag);
604 ieo, jeo, m_CKs, m_Nsize, m_bc2, iflag);
608 if(do_comm_any > 0 && ith == 0){
615 if(do_comm_any > 0 && ith == ith_kernel){
628 buf2xp, buf2xm, buf2yp, buf2ym,
629 buf2zp, buf2zm, buf2tp, buf2tm,
630 m_CKs, ieo, jeo, iflag,
631 m_Nsize, m_bc, do_comm,
NC);
634 buf2xp, buf2xm, buf2yp, buf2ym,
635 buf2zp, buf2zm, buf2tp, buf2tm,
636 m_CKs, ieo, jeo, iflag,
637 m_Nsize, m_bc, do_comm,
NC);
646 template<
typename AFIELD>
653 int jeo = (m_Ieo_origin + ieo) % 2;
657 int Nst2_pad = ceil_nwp(m_Nst2);
660 int ith, nth, ith_kernel;
661 set_kernel_thread(ith, nth, ith_kernel);
663 if(do_comm[
idir] > 0 && ith == ith_kernel){
670 if(do_comm[
idir] > 0 && ith == 0){
671 chrecv_up[
idir].start();
672 chsend_dn[
idir].start();
676 if(ith == ith_kernel){
680 if(do_comm[
idir] > 0 && ith == 0){
681 chsend_dn[
idir].wait();
682 chrecv_up[
idir].wait();
687 if(do_comm[
idir] > 0 && ith == ith_kernel){
696 template<
typename AFIELD>
703 int jeo = (m_Ieo_origin + ieo) % 2;
707 int Nst2_pad = ceil_nwp(m_Nst2);
710 int ith, nth, ith_kernel;
711 set_kernel_thread(ith, nth, ith_kernel);
713 if(do_comm[
idir] > 0 && ith == ith_kernel){
720 if(do_comm[
idir] > 0 && ith == 0){
721 chrecv_dn[
idir].start();
722 chsend_up[
idir].start();
726 if(ith == ith_kernel){
730 if(do_comm[
idir] > 0 && ith == 0){
731 chsend_up[
idir].wait();
732 chrecv_dn[
idir].wait();
737 if(do_comm[
idir] > 0 && ith == ith_kernel){
746 template<
typename AFIELD>
756 int Nst2_pad = ceil_nwp(m_Nst2);
759 int ith, nth, ith_kernel;
760 set_kernel_thread(ith, nth, ith_kernel);
762 if(do_comm[
idir] > 0 && ith == ith_kernel){
769 if(do_comm[
idir] > 0 && ith == 0){
770 chrecv_up[
idir].start();
771 chsend_dn[
idir].start();
775 if(ith == ith_kernel){
779 if(do_comm[
idir] > 0 && ith == 0){
780 chsend_dn[
idir].wait();
781 chrecv_up[
idir].wait();
786 if(do_comm[
idir] > 0 && ith == ith_kernel){
796 template<
typename AFIELD>
806 int Nst2_pad = ceil_nwp(m_Nst2);
809 int ith, nth, ith_kernel;
810 set_kernel_thread(ith, nth, ith_kernel);
812 if(do_comm[
idir] > 0 && ith == ith_kernel){
819 if(do_comm[
idir] > 0 && ith == 0){
820 chrecv_dn[
idir].start();
821 chsend_up[
idir].start();
825 if(ith == ith_kernel){
829 if(do_comm[
idir] > 0 && ith == 0){
830 chsend_up[
idir].wait();
831 chrecv_dn[
idir].wait();
836 if(do_comm[
idir] > 0 && ith == ith_kernel){
846 template<
typename AFIELD>
856 int Nst2_pad = ceil_nwp(m_Nst2);
859 int ith, nth, ith_kernel;
860 set_kernel_thread(ith, nth, ith_kernel);
862 if(do_comm[
idir] > 0 && ith == ith_kernel){
869 if(do_comm[
idir] > 0 && ith == 0){
870 chrecv_up[
idir].start();
871 chsend_dn[
idir].start();
875 if(ith == ith_kernel){
879 if(do_comm[
idir] > 0 && ith == 0){
880 chsend_dn[
idir].wait();
881 chrecv_up[
idir].wait();
886 if(do_comm[
idir] > 0 && ith == ith_kernel){
896 template<
typename AFIELD>
906 int Nst2_pad = ceil_nwp(m_Nst2);
909 int ith, nth, ith_kernel;
910 set_kernel_thread(ith, nth, ith_kernel);
912 if(do_comm[
idir] > 0 && ith == ith_kernel){
918 if(do_comm[
idir] > 0 && ith == 0){
919 chrecv_dn[
idir].start();
920 chsend_up[
idir].start();
924 if(ith == ith_kernel){
928 if(do_comm[
idir] > 0 && ith == 0){
929 chsend_up[
idir].wait();
930 chrecv_dn[
idir].wait();
935 if(do_comm[
idir] > 0 && ith == ith_kernel){
945 template<
typename AFIELD>
955 int Nst2_pad = ceil_nwp(m_Nst2);
958 int ith, nth, ith_kernel;
959 set_kernel_thread(ith, nth, ith_kernel);
961 if(do_comm[
idir] > 0 && ith == ith_kernel){
972 if(do_comm[
idir] > 0 && ith == 0){
973 chrecv_up[
idir].start();
974 chsend_dn[
idir].start();
978 if(ith == ith_kernel){
986 if(do_comm[
idir] > 0 && ith == 0){
987 chsend_dn[
idir].wait();
988 chrecv_up[
idir].wait();
993 if(do_comm[
idir] > 0 && ith == ith_kernel){
1007 template<
typename AFIELD>
1017 int Nst2_pad = ceil_nwp(m_Nst2);
1020 int ith, nth, ith_kernel;
1021 set_kernel_thread(ith, nth, ith_kernel);
1023 if(do_comm[
idir] > 0 && ith == ith_kernel){
1024 if(m_repr == DIRAC){
1034 if(do_comm[
idir] > 0 && ith == 0){
1035 chrecv_dn[
idir].start();
1036 chsend_up[
idir].start();
1040 if(ith == ith_kernel){
1041 if(m_repr == DIRAC){
1048 if(do_comm[
idir] > 0 && ith == 0){
1049 chsend_up[
idir].wait();
1050 chrecv_dn[
idir].wait();
1055 if(do_comm[
idir] > 0 && ith == ith_kernel){
1057 if(m_repr == DIRAC){
1069 template<
typename AFIELD>
1072 return flop_count(m_mode);
1075 template<
typename AFIELD>
1084 double flop_site, flop;
1086 if (m_repr == DIRAC) {
1087 flop_site =
static_cast<double>(
1088 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
1089 }
else if (m_repr == CHIRAL) {
1090 flop_site =
static_cast<double>(
1091 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
1093 vout.
crucial(m_vl,
"%s: gamma matrix repr is undefined.\n",
1094 class_name.c_str());
1098 flop = flop_site *
static_cast<double>(Lvol);
1099 if ((mode ==
"DdagD") || (mode ==
"DDdag")) flop *= 2.0;