9 template<
typename AFIELD>
11 =
"AFopr_Clover_eo<AFIELD>";
15 inline void set_kernel_thread(
int& ith,
int& nth,
int& ith_kernel)
20 if(nth > 1) ith_kernel = 1;
25 template<
typename AFIELD>
37 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
48 m_Ndf = 2 * m_Nc * m_Nc;
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 m_fee_inv.reset(m_Ndf, m_Nst2, m_Nd * m_Nd);
114 m_foo_inv.reset(m_Ndf, m_Nst2, m_Nd * m_Nd);
116 m_Tinv.reset(m_Ndf, m_Nst, 1);
120 set_parameters(params);
129 template<
typename AFIELD>
132 chsend_up.resize(m_Ndim);
133 chrecv_up.resize(m_Ndim);
134 chsend_dn.resize(m_Ndim);
135 chrecv_dn.resize(m_Ndim);
137 for(
int mu = 0; mu < m_Ndim; ++mu){
139 int Nvsize = m_Nbdsize[mu] *
sizeof(
real_t);
141 chsend_dn[mu].send_init(Nvsize, mu, -1);
142 chsend_up[mu].send_init(Nvsize, mu, 1);
144 chrecv_up[mu].recv_init(Nvsize, mu, 1);
145 chrecv_dn[mu].recv_init(Nvsize, mu, -1);
147 void* buf_up = (
void*)chsend_dn[mu].ptr();
148 chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
149 void* buf_dn = (
void*)chsend_up[mu].ptr();
150 chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
153 if(do_comm[mu] == 1){
154 chset_send.append(chsend_up[mu]);
155 chset_send.append(chsend_dn[mu]);
156 chset_recv.append(chrecv_up[mu]);
157 chset_recv.append(chrecv_dn[mu]);
180 template<
typename AFIELD>
185 for(
int mu = 0; mu < m_Ndim; ++mu){
210 template<
typename AFIELD>
227 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
236 vout.
general(m_vl,
" gamma_matrix_type is not given - set to Dirac\n");
238 }
else if(repr ==
"Dirac"){
240 }
else if(repr ==
"Chiral"){
243 vout.
crucial(m_vl,
"Error in %s: irrelevant gamma_matrix_type: %s\n",
244 class_name.c_str(), repr.c_str());
250 m_fopr_ct->set_parameters(params);
255 template<
typename AFIELD>
258 const std::vector<int> bc)
260 assert(bc.size() == m_Ndim);
269 m_boundary.resize(m_Ndim);
270 for (
int mu = 0; mu < m_Ndim; ++mu) {
271 m_boundary[mu] = bc[mu];
274 for (
int mu = 0; mu < m_Ndim; ++mu) {
281 m_bc2[mu] = m_boundary[mu];
288 vout.
general(m_vl,
"Parameters of %s:\n", class_name.c_str());
290 vout.
general(m_vl,
" gamma-matrix type = Dirac\n");
292 vout.
general(m_vl,
" gamma-matrix type = Chiral\n");
295 for (
int mu = 0; mu < m_Ndim; ++mu) {
296 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
302 template<
typename AFIELD>
305 params.
set_double(
"hopping_parameter",
double(m_CKs));
306 params.
set_double(
"clover_coefficient",
double(m_cSW));
310 if(m_repr == DIRAC) repr =
"Dirac";
311 if(m_repr == CHIRAL) repr =
"Chiral";
318 template<
typename AFIELD>
323 vout.
paranoiac(m_vl,
"%s: set_config is called: num_threads = %d\n",
324 class_name.c_str(), nth);
332 vout.
paranoiac(m_vl,
"%s: set_config finished\n", class_name.c_str());
336 template<
typename AFIELD>
349 template<
typename AFIELD>
357 vout.
general(m_vl,
"%s: set_config start\n", class_name.c_str());
361 if (ith == 0) m_conf = u;
363 convert(m_index_eo, m_Ueo, *u);
366 m_fopr_ct->set_config(u);
369 int Ncsw = m_Nd * m_Nd/2;
370 for(
int j = 0; j < Ncsw; ++j){
371 m_fopr_ct->get_csw_inv(m_Tinv, j);
372 m_index_eo.split(m_fee_inv, j, m_foo_inv, j, m_Tinv, 0);
376 double elapsed_time = m_timer.elapsed_sec();
377 vout.
general(m_vl,
"%s: set_config finished in %11.6f [sec]\n",
378 class_name.c_str(), elapsed_time);
383 template<
typename AFIELD>
389 if (ith == 0) m_mode = mode;
395 template<
typename AFIELD>
400 }
else if(m_mode ==
"DdagD"){
402 }
else if(m_mode ==
"Ddag"){
405 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
412 template<
typename AFIELD>
417 }
else if (m_mode ==
"DdagD") {
419 }
else if (m_mode ==
"Ddag") {
422 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
429 template<
typename AFIELD>
443 template<
typename AFIELD>
445 const std::string mode)
447 if(mode ==
"Dee_inv"){
448 mult_cswinv(v, w, 0);
449 }
else if(mode ==
"Doo_inv"){
450 mult_cswinv(v, w, 1);
451 }
else if(mode ==
"Deo"){
453 }
else if(mode ==
"Doe"){
456 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
464 template<
typename AFIELD>
472 template<
typename AFIELD>
479 mult_cswinv(v, m_v1, 0);
483 mult_cswinv(v, m_v1, 1);
496 template<
typename AFIELD>
503 mult_cswinv(v, m_v1, 1);
508 mult_cswinv(v, m_v1, 0);
516 template<
typename AFIELD>
526 mult_xp(vp, wp, ieo);
527 mult_xm(vp, wp, ieo);
528 mult_yp(vp, wp, ieo);
529 mult_ym(vp, wp, ieo);
530 mult_zp(vp, wp, ieo);
531 mult_zm(vp, wp, ieo);
532 mult_tp(vp, wp, ieo);
533 mult_tm(vp, wp, ieo);
541 template<
typename AFIELD>
559 template<
typename AFIELD>
573 u = m_fee_inv.
ptr(0);
575 u = m_foo_inv.ptr(0);
594 template<
typename AFIELD>
598 Meo(v, w, w, ieo, 0);
603 template<
typename AFIELD>
606 const int ieo,
const int iflag)
613 if(nth > 1) ith_kernel = 1;
619 int jeo = (m_Ieo_origin + ieo) % 2;
621 if(do_comm_any > 0 && ith == ith_kernel){
634 buf1xp, buf1xm, buf1yp, buf1ym,
635 buf1zp, buf1zm, buf1tp, buf1tm,
637 m_Nsize, m_bc, do_comm,
NC);
640 buf1xp, buf1xm, buf1yp, buf1ym,
641 buf1zp, buf1zm, buf1tp, buf1tm,
643 m_Nsize, m_bc, do_comm,
NC);
648 if(do_comm_any > 0 && ith == 0){
654 if (ith == ith_kernel){
657 ieo, jeo, m_CKs, m_Nsize, m_bc2, iflag);
660 ieo, jeo, m_CKs, m_Nsize, m_bc2, iflag);
664 if(do_comm_any > 0 && ith == 0){
670 if(do_comm_any > 0 && ith == ith_kernel){
683 buf2xp, buf2xm, buf2yp, buf2ym,
684 buf2zp, buf2zm, buf2tp, buf2tm,
685 m_CKs, ieo, jeo, iflag,
686 m_Nsize, m_bc, do_comm,
NC);
689 buf2xp, buf2xm, buf2yp, buf2ym,
690 buf2zp, buf2zm, buf2tp, buf2tm,
691 m_CKs, ieo, jeo, iflag,
692 m_Nsize, m_bc, do_comm,
NC);
701 template<
typename AFIELD>
708 int jeo = (m_Ieo_origin + ieo) % 2;
712 int Nst2_pad = ceil_nwp(m_Nst2);
715 int ith, nth, ith_kernel;
716 set_kernel_thread(ith, nth, ith_kernel);
718 if(do_comm[
idir] > 0 && ith == ith_kernel){
725 if(do_comm[
idir] > 0 && ith == 0){
726 chrecv_up[
idir].start();
727 chsend_dn[
idir].start();
731 if(ith == ith_kernel){
735 if(do_comm[
idir] > 0 && ith == 0){
736 chsend_dn[
idir].wait();
737 chrecv_up[
idir].wait();
742 if(do_comm[
idir] > 0 && ith == ith_kernel){
751 template<
typename AFIELD>
758 int jeo = (m_Ieo_origin + ieo) % 2;
762 int Nst2_pad = ceil_nwp(m_Nst2);
765 int ith, nth, ith_kernel;
766 set_kernel_thread(ith, nth, ith_kernel);
768 if(do_comm[
idir] > 0 && ith == ith_kernel){
775 if(do_comm[
idir] > 0 && ith == 0){
776 chrecv_dn[
idir].start();
777 chsend_up[
idir].start();
781 if(ith == ith_kernel){
785 if(do_comm[
idir] > 0 && ith == 0){
786 chsend_up[
idir].wait();
787 chrecv_dn[
idir].wait();
792 if(do_comm[
idir] > 0 && ith == ith_kernel){
801 template<
typename AFIELD>
811 int Nst2_pad = ceil_nwp(m_Nst2);
814 int ith, nth, ith_kernel;
815 set_kernel_thread(ith, nth, ith_kernel);
817 if(do_comm[
idir] > 0 && ith == ith_kernel){
824 if(do_comm[
idir] > 0 && ith == 0){
825 chrecv_up[
idir].start();
826 chsend_dn[
idir].start();
830 if(ith == ith_kernel){
834 if(do_comm[
idir] > 0 && ith == 0){
835 chsend_dn[
idir].wait();
836 chrecv_up[
idir].wait();
841 if(do_comm[
idir] > 0 && ith == ith_kernel){
851 template<
typename AFIELD>
861 int Nst2_pad = ceil_nwp(m_Nst2);
864 int ith, nth, ith_kernel;
865 set_kernel_thread(ith, nth, ith_kernel);
867 if(do_comm[
idir] > 0 && ith == ith_kernel){
874 if(do_comm[
idir] > 0 && ith == 0){
875 chrecv_dn[
idir].start();
876 chsend_up[
idir].start();
880 if(ith == ith_kernel){
884 if(do_comm[
idir] > 0 && ith == 0){
885 chsend_up[
idir].wait();
886 chrecv_dn[
idir].wait();
891 if(do_comm[
idir] > 0 && ith == ith_kernel){
901 template<
typename AFIELD>
911 int Nst2_pad = ceil_nwp(m_Nst2);
914 int ith, nth, ith_kernel;
915 set_kernel_thread(ith, nth, ith_kernel);
917 if(do_comm[
idir] > 0 && ith == ith_kernel){
924 if(do_comm[
idir] > 0 && ith == 0){
925 chrecv_up[
idir].start();
926 chsend_dn[
idir].start();
930 if(ith == ith_kernel){
934 if(do_comm[
idir] > 0 && ith == 0){
935 chsend_dn[
idir].wait();
936 chrecv_up[
idir].wait();
941 if(do_comm[
idir] > 0 && ith == ith_kernel){
951 template<
typename AFIELD>
961 int Nst2_pad = ceil_nwp(m_Nst2);
964 int ith, nth, ith_kernel;
965 set_kernel_thread(ith, nth, ith_kernel);
967 if(do_comm[
idir] > 0 && ith == ith_kernel){
973 if(do_comm[
idir] > 0 && ith == 0){
974 chrecv_dn[
idir].start();
975 chsend_up[
idir].start();
979 if(ith == ith_kernel){
983 if(do_comm[
idir] > 0 && ith == 0){
984 chsend_up[
idir].wait();
985 chrecv_dn[
idir].wait();
990 if(do_comm[
idir] > 0 && ith == ith_kernel){
1000 template<
typename AFIELD>
1010 int Nst2_pad = ceil_nwp(m_Nst2);
1013 int ith, nth, ith_kernel;
1014 set_kernel_thread(ith, nth, ith_kernel);
1016 if(do_comm[
idir] > 0 && ith == ith_kernel){
1017 if(m_repr == DIRAC){
1027 if(do_comm[
idir] > 0 && ith == 0){
1028 chrecv_up[
idir].start();
1029 chsend_dn[
idir].start();
1033 if(ith == ith_kernel){
1034 if(m_repr == DIRAC){
1041 if(do_comm[
idir] > 0 && ith == 0){
1042 chsend_dn[
idir].wait();
1043 chrecv_up[
idir].wait();
1048 if(do_comm[
idir] > 0 && ith == ith_kernel){
1050 if(m_repr == DIRAC){
1062 template<
typename AFIELD>
1073 int Nst2_pad = ceil_nwp(m_Nst2);
1076 int ith, nth, ith_kernel;
1077 set_kernel_thread(ith, nth, ith_kernel);
1079 if(do_comm[
idir] > 0 && ith == ith_kernel){
1080 if(m_repr == DIRAC){
1090 if(do_comm[
idir] > 0 && ith == 0){
1091 chrecv_dn[
idir].start();
1092 chsend_up[
idir].start();
1096 if(ith == ith_kernel){
1097 if(m_repr == DIRAC){
1104 if(do_comm[
idir] > 0 && ith == 0){
1105 chsend_up[
idir].wait();
1106 chrecv_dn[
idir].wait();
1111 if(do_comm[
idir] > 0 && ith == ith_kernel){
1113 if(m_repr == DIRAC){
1125 template<
typename AFIELD>
1133 double flop_site, flop;
1135 if (m_repr == DIRAC) {
1136 flop_site =
static_cast<double>(
1137 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1))
1138 + 8 * m_Nc * m_Nc * m_Nd * m_Nd);
1139 }
else if (m_repr == CHIRAL) {
1140 flop_site =
static_cast<double>(
1141 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2))
1142 + 4 * m_Nc * m_Nc * m_Nd * m_Nd);
1144 vout.
crucial(m_vl,
"%s: input repr is undefined.\n",
1145 class_name.c_str());
1149 flop = flop_site *
static_cast<double>(Lvol);
1150 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;