9 template<
typename AFIELD>
11 =
"AFopr_Clover<AFIELD>";
15 inline void set_kernel_thread(
int& ith,
int& nth,
int& ith_kernel)
20 if(nth > 1) ith_kernel = 1;
24 template<
typename AFIELD>
29 m_memory_saved =
false;
40 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
47 m_Ndf = 2 * m_Nc * m_Nc;
48 m_Ndm2 = m_Nd * m_Nd / 2,
64 if (!params.
fetch_int(
"require_communication", req_comm)) {
65 vout.
general(m_vl,
"req_comm = %d (input)\n", req_comm);
67 vout.
general(m_vl,
"req_comm = %d (default)\n", req_comm);
71 for(
int mu = 0; mu < m_Ndim; ++mu){
74 do_comm_any += do_comm[mu];
75 vout.
general(
"do_comm[%d] = %d\n", mu, do_comm[mu]);
78 m_Nbdsize.resize(m_Ndim);
80 m_Nbdsize[0] = m_Nvc * Nd2 * ceil_nwp(m_Ny * m_Nz * m_Nt);
81 m_Nbdsize[1] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Nz * m_Nt);
82 m_Nbdsize[2] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Ny * m_Nt);
83 m_Nbdsize[3] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Ny * m_Nz);
90 m_T.reset(m_Ndf, m_Nst, m_Ndm2);
93 m_U.reset(m_Ndf, m_Nst, m_Ndim);
96 int NinF = 2 * m_Nc * m_Nd;
97 if(!m_memory_saved) m_v1.reset(NinF, m_Nst, 1);
98 m_v2.reset(NinF, m_Nst, 1);
100 set_parameters(params);
109 template<
typename AFIELD>
112 chsend_up.resize(m_Ndim);
113 chrecv_up.resize(m_Ndim);
114 chsend_dn.resize(m_Ndim);
115 chrecv_dn.resize(m_Ndim);
117 for(
int mu = 0; mu < m_Ndim; ++mu){
119 int Nvsize = m_Nbdsize[mu] *
sizeof(
real_t);
121 chsend_dn[mu].send_init(Nvsize, mu, -1);
122 chsend_up[mu].send_init(Nvsize, mu, 1);
124 chrecv_up[mu].recv_init(Nvsize, mu, 1);
125 chrecv_dn[mu].recv_init(Nvsize, mu, -1);
127 void* buf_up = (
void*)chsend_dn[mu].ptr();
128 chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
129 void* buf_dn = (
void*)chsend_up[mu].ptr();
130 chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
133 if(do_comm[mu] == 1){
134 chset_send.append(chsend_up[mu]);
135 chset_send.append(chsend_dn[mu]);
136 chset_recv.append(chrecv_up[mu]);
137 chset_recv.append(chrecv_dn[mu]);
160 template<
typename AFIELD>
165 for(
int mu = 0; mu < m_Ndim; ++mu){
186 if(!m_memory_saved)
delete m_fopr_ct;
191 template<
typename AFIELD>
209 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
218 vout.
general(m_vl,
" gamma_matrix_type is not given - set to Dirac\n");
220 }
else if(repr ==
"Dirac"){
222 }
else if(repr ==
"Chiral"){
225 vout.
crucial(m_vl,
"Error in %s: irrelevant gamma_matrix_type: %s\n",
226 class_name.c_str(), repr.c_str());
232 if(!m_memory_saved) m_fopr_ct->set_parameters(params);
237 template<
typename AFIELD>
240 const std::vector<int> bc)
242 assert(bc.size() == m_Ndim);
251 m_boundary.resize(m_Ndim);
252 for (
int mu = 0; mu < m_Ndim; ++mu) {
253 m_boundary[mu] = bc[mu];
256 for (
int mu = 0; mu < m_Ndim; ++mu) {
263 m_bc2[mu] = m_boundary[mu];
269 vout.
general(m_vl,
"Parameters of %s:\n", class_name.c_str());
271 vout.
general(m_vl,
" gamma-matrix type = Dirac\n");
273 vout.
general(m_vl,
" gamma-matrix type = Chiral\n");
277 for (
int mu = 0; mu < m_Ndim; ++mu) {
278 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
285 template<
typename AFIELD>
288 params.
set_double(
"hopping_parameter",
double(m_CKs));
289 params.
set_double(
"clover_coefficient",
double(m_cSW));
293 if(m_repr == DIRAC) repr =
"Dirac";
294 if(m_repr == CHIRAL) repr =
"Chiral";
301 template<
typename AFIELD>
317 template<
typename AFIELD>
327 template<
typename AFIELD>
335 vout.
detailed(m_vl,
"%s: set_config start\n", class_name.c_str());
344 double elapsed_time1 = m_timer.elapsed_sec();
345 vout.
detailed(m_vl,
" convert_gauge: %10.6f [sec]\n", elapsed_time1);
351 m_fopr_ct->set_config(u);
355 double elapsed_time2 = m_timer.elapsed_sec();
356 vout.
detailed(m_vl,
" ct set_config: %10.6f [sec]\n", elapsed_time2);
361 m_fopr_ct->get_csw(m_T);
364 double elapsed_time3 = m_timer.elapsed_sec();
365 vout.
detailed(m_vl,
" set_csw: %10.6f [sec]\n", elapsed_time3);
367 double elapsed_time = elapsed_time1 + elapsed_time2 + elapsed_time3;
368 vout.
detailed(m_vl,
"%s: set_config finished in %10.6f [sec]\n",
369 class_name.c_str(), elapsed_time);
375 template<
typename AFIELD>
379 vout.
crucial(m_vl,
"%s: set_config_saved start\n", class_name.c_str());
384 vout.
general(m_vl,
"%s: set_config start\n", class_name.c_str());
396 double elapsed_time1 = m_timer.elapsed_sec();
397 vout.
general(m_vl,
" convert_gauge: %10.6f [sec]\n", elapsed_time1);
405 get_parameters(params);
408 m_fopr_ct->set_config(u);
413 double elapsed_time2 = m_timer.elapsed_sec();
414 vout.
general(m_vl,
" ct set_config: %10.6f [sec]\n", elapsed_time2);
419 m_fopr_ct->get_csw(m_T);
424 double elapsed_time3 = m_timer.elapsed_sec();
425 vout.
general(m_vl,
" set_csw: %10.6f [sec]\n", elapsed_time3);
427 double elapsed_time = elapsed_time1 + elapsed_time2 + elapsed_time3;
428 vout.
general(m_vl,
"%s: set_config finished in %10.6f [sec]\n",
429 class_name.c_str(), elapsed_time);
434 template<
typename AFIELD>
440 if (ith == 0) m_mode = mode;
446 template<
typename AFIELD>
453 template<
typename AFIELD>
459 }
else if(m_mode ==
"DdagD") {
461 }
else if(m_mode ==
"Ddag") {
463 }
else if(m_mode ==
"H") {
466 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
473 template<
typename AFIELD>
479 }
else if(m_mode ==
"DdagD"){
481 }
else if(m_mode ==
"Ddag"){
483 }
else if(m_mode ==
"H"){
486 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
493 template<
typename AFIELD>
495 const std::string mode)
499 }
else if(mode ==
"Ddag"){
501 }
else if(mode ==
"DdagD"){
503 }
else if(mode ==
"H"){
506 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
514 template<
typename AFIELD>
516 const std::string mode)
520 }
else if(mode ==
"Ddag"){
522 }
else if(mode ==
"DdagD"){
524 }
else if(mode ==
"H"){
527 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
535 template<
typename AFIELD>
544 set_thread(ith, nth);
559 template<
typename AFIELD>
574 vout.
crucial(m_vl,
"%s: mult_up for %d direction is undefined.",
575 class_name.c_str(), mu);
582 template<
typename AFIELD>
597 vout.
crucial(m_vl,
"%s: mult_dn for %d direction is undefined.",
598 class_name.c_str(), mu);
605 template<
typename AFIELD>
608 mult_DorH(m_v2, w, 1);
609 mult_DorH(v, m_v2, 1);
619 template<
typename AFIELD>
623 mult_DorH(v, m_v2, 1);
631 template<
typename AFIELD>
636 vout.
detailed(
"%s: D_alt is not available in memory saved mode\n",
657 m_fopr_ct->mult_csw(v, w);
659 axpy(v, -m_CKs, m_v1);
667 template<
typename AFIELD>
674 template<
typename AFIELD>
683 template<
typename AFIELD>
691 template<
typename AFIELD>
697 int ith, nth, ith_kernel;
698 set_kernel_thread(ith, nth, ith_kernel);
705 if (do_comm_any > 0 && ith == ith_kernel){
718 buf1xp, buf1xm, buf1yp, buf1ym,
719 buf1zp, buf1zm, buf1tp, buf1tm,
720 u, v1, m_Nsize, m_bc, do_comm);
723 buf1xp, buf1xm, buf1yp, buf1ym,
724 buf1zp, buf1zm, buf1tp, buf1tm,
725 u, v1, m_Nsize, m_bc, do_comm);
730 if(do_comm_any > 0 && ith == 0){
736 if (ith == ith_kernel){
739 m_CKs, m_Nsize, m_bc2, flag);
743 m_CKs, m_Nsize, m_bc2, flag);
748 if(do_comm_any > 0 && ith == 0){
754 if(do_comm_any > 0 && ith == ith_kernel){
767 buf2xp, buf2xm, buf2yp, buf2ym,
768 buf2zp, buf2zm, buf2tp, buf2tm,
769 m_CKs, m_Nsize, m_bc, do_comm, flag);
772 buf2xp, buf2xm, buf2yp, buf2ym,
773 buf2zp, buf2zm, buf2tp, buf2tm,
774 m_CKs, m_Nsize, m_bc, do_comm, flag);
783 template<
typename AFIELD>
794 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
796 int ith, nth, ith_kernel;
797 set_kernel_thread(ith, nth, ith_kernel);
799 if(do_comm[
idir] > 0 && ith == ith_kernel){
806 if(do_comm[
idir] > 0 && ith == 0){
807 chrecv_up[
idir].start();
808 chsend_dn[
idir].start();
812 if(ith == ith_kernel){
816 if(do_comm[
idir] > 0 && ith == 0){
817 chsend_dn[
idir].wait();
818 chrecv_up[
idir].wait();
823 if(do_comm[
idir] > 0 && ith == ith_kernel){
833 template<
typename AFIELD>
844 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
846 int ith, nth, ith_kernel;
847 set_kernel_thread(ith, nth, ith_kernel);
849 if(do_comm[
idir] > 0 && ith == ith_kernel){
856 if(do_comm[
idir] > 0 && ith == 0){
857 chrecv_dn[
idir].start();
858 chsend_up[
idir].start();
862 if(ith == ith_kernel){
866 if(do_comm[
idir] > 0 && ith == 0){
867 chsend_up[
idir].wait();
868 chrecv_dn[
idir].wait();
873 if(do_comm[
idir] > 0 && ith == ith_kernel){
883 template<
typename AFIELD>
894 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
896 int ith, nth, ith_kernel;
897 set_kernel_thread(ith, nth, ith_kernel);
899 if(do_comm[
idir] > 0 && ith == ith_kernel){
906 if(do_comm[
idir] > 0 && ith == 0){
907 chrecv_up[
idir].start();
908 chsend_dn[
idir].start();
912 if(ith == ith_kernel){
916 if(do_comm[
idir] > 0 && ith == 0){
917 chsend_dn[
idir].wait();
918 chrecv_up[
idir].wait();
922 if(do_comm[
idir] > 0 && ith == ith_kernel){
932 template<
typename AFIELD>
943 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
945 int ith, nth, ith_kernel;
946 set_kernel_thread(ith, nth, ith_kernel);
948 if(do_comm[
idir] > 0 && ith == ith_kernel){
955 if(do_comm[
idir] > 0 && ith == 0){
956 chrecv_dn[
idir].start();
957 chsend_up[
idir].start();
961 if(ith == ith_kernel){
965 if(do_comm[
idir] > 0 && ith == 0){
966 chsend_up[
idir].wait();
967 chrecv_dn[
idir].wait();
972 if(do_comm[
idir] > 0 && ith == ith_kernel){
982 template<
typename AFIELD>
993 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
995 int ith, nth, ith_kernel;
996 set_kernel_thread(ith, nth, ith_kernel);
998 if(do_comm[
idir] > 0 && ith == ith_kernel){
1005 if(do_comm[
idir] > 0 && ith == 0){
1006 chrecv_up[
idir].start();
1007 chsend_dn[
idir].start();
1011 if(ith == ith_kernel){
1015 if(do_comm[
idir] > 0 && ith == 0){
1016 chsend_dn[
idir].wait();
1017 chrecv_up[
idir].wait();
1022 if(do_comm[
idir] > 0 && ith == ith_kernel){
1032 template<
typename AFIELD>
1043 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
1045 int ith, nth, ith_kernel;
1046 set_kernel_thread(ith, nth, ith_kernel);
1048 if(do_comm[
idir] > 0 && ith == ith_kernel){
1054 if(do_comm[
idir] > 0 && ith == 0){
1055 chrecv_dn[
idir].start();
1056 chsend_up[
idir].start();
1060 if(ith == ith_kernel){
1064 if(do_comm[
idir] > 0 && ith == 0){
1065 chsend_up[
idir].wait();
1066 chrecv_dn[
idir].wait();
1071 if(do_comm[
idir] > 0 && ith == ith_kernel){
1081 template<
typename AFIELD>
1092 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
1094 int ith, nth, ith_kernel;
1095 set_kernel_thread(ith, nth, ith_kernel);
1097 if(do_comm[
idir] > 0 && ith == ith_kernel){
1098 if(m_repr == DIRAC){
1108 if(do_comm[
idir] > 0 && ith == 0){
1109 chrecv_up[
idir].start();
1110 chsend_dn[
idir].start();
1114 if(ith == ith_kernel){
1115 if(m_repr == DIRAC){
1122 if(do_comm[
idir] > 0 && ith == 0){
1123 chsend_dn[
idir].wait();
1124 chrecv_up[
idir].wait();
1129 if(do_comm[
idir] > 0 && ith == ith_kernel){
1131 if(m_repr == DIRAC){
1143 template<
typename AFIELD>
1150 int ith, nth, ith_kernel;
1151 set_kernel_thread(ith, nth, ith_kernel);
1157 real_t *u = m_U.ptr(index_lex.idx_G(0, 0,
idir));
1159 if(do_comm[
idir] > 0 && ith == ith_kernel){
1160 if(m_repr == DIRAC){
1170 if(do_comm[
idir] > 0 && ith == 0){
1171 chrecv_dn[
idir].start();
1172 chsend_up[
idir].start();
1176 if(ith == ith_kernel){
1177 if(m_repr == DIRAC){
1184 if(do_comm[
idir] > 0 && ith == 0){
1185 chsend_up[
idir].wait();
1186 chrecv_dn[
idir].wait();
1191 if(do_comm[
idir] > 0 && ith == ith_kernel){
1193 if(m_repr == DIRAC){
1205 template<
typename AFIELD>
1213 double flop_site, flop;
1215 if (m_repr == DIRAC) {
1216 flop_site =
static_cast<double>(
1217 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1))
1218 + 8 * m_Nc * m_Nc * m_Nd * m_Nd);
1219 }
else if (m_repr == CHIRAL) {
1220 flop_site =
static_cast<double>(
1221 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2))
1222 + 8 * m_Nc * m_Nc * m_Nd * m_Nd);
1224 vout.
crucial(m_vl,
"%s: input repr is undefined.\n",
1225 class_name.c_str());
1229 flop = flop_site *
static_cast<double>(Lvol);
1230 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;