13 template<
typename AFIELD>
15 =
"AFopr_Wilson<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());
49 int Ndf = 2 * m_Nc * m_Nc;
63 if (!params.
fetch_int(
"require_communication", req_comm)) {
64 vout.
general(m_vl,
"req_comm = %d (input)\n", req_comm);
66 vout.
general(m_vl,
"req_comm = %d (default)\n", req_comm);
70 for(
int mu = 0; mu < m_Ndim; ++mu){
73 do_comm_any += do_comm[mu];
74 vout.
general(m_vl,
"do_comm[%d] = %d\n", mu, do_comm[mu]);
77 m_Nbdsize.resize(m_Ndim);
79 m_Nbdsize[0] = Nvc * Nd2 * ceil_nwp(Ny * Nz * Nt);
80 m_Nbdsize[1] = Nvc * Nd2 * ceil_nwp(Nx * Nz * Nt);
81 m_Nbdsize[2] = Nvc * Nd2 * ceil_nwp(Nx * Ny * Nt);
82 m_Nbdsize[3] = Nvc * Nd2 * ceil_nwp(Nx * Ny * Nz);
87 m_U.reset(Ndf, m_Nst, m_Ndim);
90 int NinF = 2 * m_Nc * m_Nd;
91 m_v2.reset(NinF, m_Nst, 1);
93 set_parameters(params);
101 template<
typename AFIELD>
106 chsend_up.resize(m_Ndim);
107 chrecv_up.resize(m_Ndim);
108 chsend_dn.resize(m_Ndim);
109 chrecv_dn.resize(m_Ndim);
111 for(
int mu = 0; mu < m_Ndim; ++mu){
113 int Nvsize = m_Nbdsize[mu] *
sizeof(
real_t);
115 chsend_dn[mu].send_init(Nvsize, mu, -1);
116 chsend_up[mu].send_init(Nvsize, mu, 1);
118 chrecv_up[mu].recv_init(Nvsize, mu, 1);
119 chrecv_dn[mu].recv_init(Nvsize, mu, -1);
121 void* buf_up = (
void*)chsend_dn[mu].ptr();
122 chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
123 void* buf_dn = (
void*)chsend_up[mu].ptr();
124 chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
127 if(do_comm[mu] == 1){
128 chset_send.append(chsend_up[mu]);
129 chset_send.append(chsend_dn[mu]);
130 chset_recv.append(chrecv_up[mu]);
131 chset_recv.append(chrecv_dn[mu]);
154 template<
typename AFIELD>
160 for(
int mu = 0; mu < m_Ndim; ++mu){
183 template<
typename AFIELD>
201 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
210 vout.
general(m_vl,
" gamma_matrix_type is not given - set to Dirac\n");
212 }
else if(repr ==
"Dirac"){
214 }
else if(repr ==
"Chiral"){
217 vout.
crucial(m_vl,
"Error in %s: irrelevant gamma_matrix_type: %s\n",
218 class_name.c_str(), repr.c_str());
222 set_parameters(
real_t(kappa), bc);
227 template<
typename AFIELD>
229 const std::vector<int> bc)
231 assert(bc.size() == m_Ndim);
239 m_boundary.resize(m_Ndim);
240 for (
int mu = 0; mu < m_Ndim; ++mu) {
241 m_boundary[mu] = bc[mu];
244 for (
int mu = 0; mu < m_Ndim; ++mu) {
251 m_bc2[mu] = m_boundary[mu];
258 vout.
general(m_vl,
"%s: input parameters\n", class_name.c_str());
260 vout.
general(m_vl,
" gamma-matrix type = Dirac\n");
262 vout.
general(m_vl,
" gamma-matrix type = Chiral\n");
265 for (
int mu = 0; mu < m_Ndim; ++mu) {
266 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
273 template<
typename AFIELD>
278 vout.
paranoiac(m_vl,
"%s: set_config is called: num_threads = %d\n",
279 class_name.c_str(), nth);
287 vout.
paranoiac(m_vl,
"%s: set_config finished\n", class_name.c_str());
291 template<
typename AFIELD>
304 template<
typename AFIELD>
311 if (ith == 0) m_conf = u;
320 template<
typename AFIELD>
323 params.
set_double(
"hopping_parameter",
double(m_CKs));
327 if(m_repr == DIRAC) repr =
"Dirac";
328 if(m_repr == CHIRAL) repr =
"Chiral";
336 template<
typename AFIELD>
342 if (ith == 0) m_mode = mode;
348 template<
typename AFIELD>
354 }
else if (m_mode ==
"DdagD") {
356 }
else if (m_mode ==
"Ddag") {
358 }
else if (m_mode ==
"H") {
362 class_name.c_str(), m_mode.c_str());
369 template<
typename AFIELD>
374 }
else if (m_mode ==
"DdagD") {
376 }
else if (m_mode ==
"Ddag") {
378 }
else if (m_mode ==
"H") {
382 class_name.c_str(), m_mode.c_str());
389 template<
typename AFIELD>
391 const std::string mode)
395 }
else if(mode ==
"Ddag"){
397 }
else if(mode ==
"DdagD"){
399 }
else if(mode ==
"H"){
402 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
410 template<
typename AFIELD>
412 const std::string mode)
416 }
else if(mode ==
"Ddag"){
418 }
else if(mode ==
"DdagD"){
420 }
else if(mode ==
"H"){
423 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
431 template<
typename AFIELD>
453 template<
typename AFIELD>
460 template<
typename AFIELD>
463 mult_DorH(m_v2, w, 1);
464 mult_DorH(v, m_v2, 1);
468 template<
typename AFIELD>
472 mult_DorH(v, m_v2, 1);
476 template<
typename AFIELD>
483 template<
typename AFIELD>
491 template<
typename AFIELD>
497 int ith, nth, ith_kernel;
498 set_kernel_thread(ith, nth, ith_kernel);
504 if (do_comm_any > 0 && ith == ith_kernel){
520 buf1xp, buf1xm, buf1yp, buf1ym,
521 buf1zp, buf1zm, buf1tp, buf1tm,
522 u, v1, m_Nsize, m_bc, do_comm);
525 buf1xp, buf1xm, buf1yp, buf1ym,
526 buf1zp, buf1zm, buf1tp, buf1tm,
527 u, v1, m_Nsize, m_bc, do_comm);
533 if(do_comm_any > 0 && ith == 0){
539 if (ith == ith_kernel){
542 m_CKs, m_Nsize, m_bc2, flag);
545 m_CKs, m_Nsize, m_bc2, flag);
549 if(do_comm_any > 0 && ith == 0){
555 if(do_comm_any > 0 && ith == ith_kernel){
568 buf2xp, buf2xm, buf2yp, buf2ym,
569 buf2zp, buf2zm, buf2tp, buf2tm,
570 m_CKs, m_Nsize, m_bc, do_comm, flag);
573 buf2xp, buf2xm, buf2yp, buf2ym,
574 buf2zp, buf2zm, buf2tp, buf2tm,
575 m_CKs, m_Nsize, m_bc, do_comm, flag);
584 template<
typename AFIELD>
607 template<
typename AFIELD>
622 vout.
crucial(m_vl,
"%s: mult_up for %d direction is undefined.",
623 class_name.c_str(), mu);
630 template<
typename AFIELD>
645 vout.
crucial(m_vl,
"%s: mult_dn for %d direction is undefined.",
646 class_name.c_str(), mu);
653 template<
typename AFIELD>
664 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
666 int ith, nth, ith_kernel;
667 set_kernel_thread(ith, nth, ith_kernel);
669 if(do_comm[
idir] > 0 && ith == ith_kernel){
676 if(do_comm[
idir] > 0 && ith == 0){
677 chrecv_up[
idir].start();
678 chsend_dn[
idir].start();
682 if(ith == ith_kernel){
686 if(do_comm[
idir] > 0 && ith == 0){
687 chsend_dn[
idir].wait();
688 chrecv_up[
idir].wait();
693 if(do_comm[
idir] > 0 && ith == ith_kernel){
703 template<
typename AFIELD>
714 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
716 int ith, nth, ith_kernel;
717 set_kernel_thread(ith, nth, ith_kernel);
719 if(do_comm[
idir] > 0 && ith == ith_kernel){
726 if(do_comm[
idir] > 0 && ith == 0){
727 chrecv_dn[
idir].start();
728 chsend_up[
idir].start();
732 if(ith == ith_kernel){
736 if(do_comm[
idir] > 0 && ith == 0){
737 chsend_up[
idir].wait();
738 chrecv_dn[
idir].wait();
743 if(do_comm[
idir] > 0 && ith == ith_kernel){
753 template<
typename AFIELD>
764 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
766 int ith, nth, ith_kernel;
767 set_kernel_thread(ith, nth, ith_kernel);
769 if(do_comm[
idir] > 0 && ith == ith_kernel){
776 if(do_comm[
idir] > 0 && ith == 0){
777 chrecv_up[
idir].start();
778 chsend_dn[
idir].start();
782 if(ith == ith_kernel){
786 if(do_comm[
idir] > 0 && ith == 0){
787 chsend_dn[
idir].wait();
788 chrecv_up[
idir].wait();
792 if(do_comm[
idir] > 0 && ith == ith_kernel){
802 template<
typename AFIELD>
813 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
815 int ith, nth, ith_kernel;
816 set_kernel_thread(ith, nth, ith_kernel);
818 if(do_comm[
idir] > 0 && ith == ith_kernel){
825 if(do_comm[
idir] > 0 && ith == 0){
826 chrecv_dn[
idir].start();
827 chsend_up[
idir].start();
831 if(ith == ith_kernel){
835 if(do_comm[
idir] > 0 && ith == 0){
836 chsend_up[
idir].wait();
837 chrecv_dn[
idir].wait();
842 if(do_comm[
idir] > 0 && ith == ith_kernel){
852 template<
typename AFIELD>
863 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
865 int ith, nth, ith_kernel;
866 set_kernel_thread(ith, nth, ith_kernel);
868 if(do_comm[
idir] > 0 && ith == ith_kernel){
875 if(do_comm[
idir] > 0 && ith == 0){
876 chrecv_up[
idir].start();
877 chsend_dn[
idir].start();
881 if(ith == ith_kernel){
885 if(do_comm[
idir] > 0 && ith == 0){
886 chsend_dn[
idir].wait();
887 chrecv_up[
idir].wait();
892 if(do_comm[
idir] > 0 && ith == ith_kernel){
902 template<
typename AFIELD>
913 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
915 int ith, nth, ith_kernel;
916 set_kernel_thread(ith, nth, ith_kernel);
918 if(do_comm[
idir] > 0 && ith == ith_kernel){
924 if(do_comm[
idir] > 0 && ith == 0){
925 chrecv_dn[
idir].start();
926 chsend_up[
idir].start();
930 if(ith == ith_kernel){
934 if(do_comm[
idir] > 0 && ith == 0){
935 chsend_up[
idir].wait();
936 chrecv_dn[
idir].wait();
941 if(do_comm[
idir] > 0 && ith == ith_kernel){
951 template<
typename AFIELD>
962 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
964 int ith, nth, ith_kernel;
965 set_kernel_thread(ith, nth, ith_kernel);
967 if(do_comm[
idir] > 0 && ith == ith_kernel){
978 if(do_comm[
idir] > 0 && ith == 0){
979 chrecv_up[
idir].start();
980 chsend_dn[
idir].start();
984 if(ith == ith_kernel){
992 if(do_comm[
idir] > 0 && ith == 0){
993 chsend_dn[
idir].wait();
994 chrecv_up[
idir].wait();
999 if(do_comm[
idir] > 0 && ith == ith_kernel){
1001 if(m_repr == DIRAC){
1013 template<
typename AFIELD>
1020 int ith, nth, ith_kernel;
1021 set_kernel_thread(ith, nth, ith_kernel);
1027 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
1029 if(do_comm[
idir] > 0 && ith == ith_kernel){
1030 if(m_repr == DIRAC){
1040 if(do_comm[
idir] > 0 && ith == 0){
1041 chrecv_dn[
idir].start();
1042 chsend_up[
idir].start();
1046 if(ith == ith_kernel){
1047 if(m_repr == DIRAC){
1054 if(do_comm[
idir] > 0 && ith == 0){
1055 chsend_up[
idir].wait();
1056 chrecv_dn[
idir].wait();
1061 if(do_comm[
idir] > 0 && ith == ith_kernel){
1063 if(m_repr == DIRAC){
1075 template<
typename AFIELD>
1078 return flop_count(m_mode);
1082 template<
typename AFIELD>
1091 double flop_site, flop;
1093 if (m_repr == DIRAC) {
1094 flop_site =
static_cast<double>(
1095 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1)));
1096 }
else if (m_repr == CHIRAL) {
1097 flop_site =
static_cast<double>(
1098 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2)));
1100 vout.
crucial(m_vl,
"%s: gamma matrix repr is undefined.\n",
1101 class_name.c_str());
1105 flop = flop_site *
static_cast<double>(Lvol);
1106 if ((mode ==
"DdagD") || (mode ==
"DDdag")) flop *= 2.0;