24 template<
typename AFIELD>
26 =
"AFopr_Domainwall_5din";
28 template<
typename AFIELD>
40 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
47 if (repr !=
"Dirac") {
48 vout.
crucial(
" Error at %s: unsupported gamma-matrix type: %s\n",
49 class_name.c_str(), repr.c_str());
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 set_parameters(params);
100 m_U.reset(m_Ndf, m_Nvol, m_Ndim);
102 m_Nbdsize.resize(m_Ndim);
103 m_Nbdsize[0] = (m_Nvcd/2) * m_Ns * ceil_nwp(m_Nvol/m_Nx);
104 m_Nbdsize[1] = (m_Nvcd/2) * m_Ns * ceil_nwp(m_Nvol/m_Ny);
105 m_Nbdsize[2] = (m_Nvcd/2) * m_Ns * ceil_nwp(m_Nvol/m_Nz);
106 m_Nbdsize[3] = (m_Nvcd/2) * m_Ns * ceil_nwp(m_Nvol/m_Nt);
116 template<
typename AFIELD>
122 for(
int mu = 0; mu < m_Ndim; ++mu){
145 template<
typename AFIELD>
150 chsend_up.resize(m_Ndim);
151 chrecv_up.resize(m_Ndim);
152 chsend_dn.resize(m_Ndim);
153 chrecv_dn.resize(m_Ndim);
155 for (
int mu = 0; mu < m_Ndim; ++mu) {
156 size_t Nvsize = m_Nbdsize[mu] *
sizeof(
real_t);
158 chsend_dn[mu].send_init(Nvsize, mu, -1);
159 chsend_up[mu].send_init(Nvsize, mu, 1);
161 chrecv_up[mu].recv_init(Nvsize, mu, 1);
162 chrecv_dn[mu].recv_init(Nvsize, mu, -1);
164 void *buf_up = (
void *)chsend_dn[mu].ptr();
165 chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
166 void *buf_dn = (
void *)chsend_up[mu].ptr();
167 chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
170 if (do_comm[mu] == 1) {
171 chset_send.append(chsend_up[mu]);
172 chset_send.append(chsend_dn[mu]);
173 chset_recv.append(chrecv_up[mu]);
174 chset_recv.append(chrecv_dn[mu]);
197 template<
typename AFIELD>
212 int err_optional = 0;
213 err_optional += params.
fetch_string(
"gamma_matrix_type", gmset_type);
216 err_optional += params.
fetch_string(
"code_implementation", m_impl);
218 vout.
crucial(m_vl,
" code_implementation is not given\n");
225 err += params.
fetch_int(
"extent_of_5th_dimension", Ns);
229 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
238 vout.
general(m_vl,
" coefficients b, c are not provided:"
239 " set to Shamir's form.\n");
244 int err3 = params.
fetch_double(
"parameter_alpha", alpha);
246 vout.
general(m_vl,
" parameter alpha is not provided: set to 1.0.\n");
258 template<
typename AFIELD>
262 params.
set_string(
"kernel_type", m_kernel_type);
263 params.
set_string(
"gamma_matrix_type", m_repr);
264 params.
set_string(
"code_implementation", m_impl);
265 params.
set_double(
"quark_mass",
double(m_mq));
266 params.
set_double(
"domain_wall_height",
double(m_M0));
267 params.
set_int(
"extent_of_5th_dimension", m_Ns);
269 params.
set_double(
"coefficient_b",
double(m_b[0]));
270 params.
set_double(
"coefficient_c",
double(m_c[0]));
271 params.
set_double(
"parameter_alpha",
double(m_alpha));
272 params.
set_string(
"gamma_matrix_type", m_repr);
279 template<
typename AFIELD>
284 const std::vector<int> bc,
297 m_NinF = m_Nvcd * m_Ns;
300 assert(bc.size() == m_Ndim);
301 if (m_boundary.size() != m_Ndim) m_boundary.resize(m_Ndim);
303 for (
int mu = 0; mu < m_Ndim; ++mu) {
304 m_boundary[mu] = bc[mu];
311 m_bc2[mu] = m_boundary[mu];
315 if (m_b.size() != m_Ns) {
319 for (
int is = 0; is < m_Ns; ++is) {
327 vout.
general(m_vl,
"%s: input parameters\n", class_name.c_str());
331 for (
int mu = 0; mu < m_Ndim; ++mu) {
332 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
335 for (
int is = 0; is < m_Ns; ++is) {
336 vout.
general(m_vl,
" b[%2d] = %16.10f c[%2d] = %16.10f\n",
337 is, m_b[is], is, m_c[is]);
341 set_precond_parameters();
344 if (m_w1.nin() != m_NinF) {
346 m_w1.reset(m_NinF, m_Nvol, 1);
347 m_v1.reset(m_NinF, m_Nvol, 1);
356 template<
typename AFIELD>
358 const std::vector<real_t> vec_b,
359 const std::vector<real_t> vec_c)
361 if ((vec_b.size() != m_Ns) || (vec_c.size() != m_Ns)) {
362 vout.
crucial(m_vl,
"%s: size of coefficient vectors incorrect.\n",
366 vout.
general(m_vl,
"%s: coefficient vectors are set:\n",
371 for (
int is = 0; is < m_Ns; ++is) {
372 m_b[is] =
real_t(vec_b[is]);
373 m_c[is] =
real_t(vec_c[is]);
374 vout.
general(m_vl,
"b[%2d] = %16.10f c[%2d] = %16.10f\n",
375 is, m_b[is], is, m_c[is]);
379 set_precond_parameters();
384 template<
typename AFIELD>
392 if (m_dp.size() != m_Ns) {
395 m_dpinv.resize(m_Ns);
396 m_e.resize(m_Ns - 1);
397 m_f.resize(m_Ns - 1);
400 for (
int is = 0; is < m_Ns; ++is) {
401 m_dp[is] = m_alpha * (1.0 + m_b[is] * (4.0 - m_M0));
402 m_dm[is] = m_alpha * (1.0 - m_c[is] * (4.0 - m_M0));
405 m_e[0] = m_mq * m_dm[m_Ns - 1] / m_dp[0];
406 m_f[0] = m_mq * m_dm[0]/m_alpha;
407 for (
int is = 1; is < m_Ns - 1; ++is) {
408 m_e[is] = m_e[is - 1] * m_dm[is - 1] / m_dp[is];
409 m_f[is] = m_f[is - 1] * m_dm[is] / m_dp[is - 1];
412 m_g = m_e[m_Ns - 2] * m_dm[m_Ns - 2];
414 for (
int is = 0; is < m_Ns - 1; ++is) {
415 m_dpinv[is] = 1.0 / m_dp[is];
417 m_dpinv[m_Ns - 1] = 1.0 / (m_dp[m_Ns - 1] + m_g);
425 template<
typename AFIELD>
430 vout.
detailed(m_vl,
"%s: set_config is called: num_threads = %d\n",
431 class_name.c_str(), nth);
439 vout.
detailed(m_vl,
"%s: set_config finished\n", class_name.c_str());
444 template<
typename AFIELD>
457 template<
typename AFIELD>
470 template<
typename AFIELD>
475 int ith, nth, isite, nsite;
476 set_threadtask_afopr(ith, nth, isite, nsite, m_Nvol);
480 for (
int site = isite; site < nsite; ++site) {
481 for (
int is = 0; is < m_Ns; ++is) {
482 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
483 int in_alt = ivcd +
NVCD * is;
485 v.set_host(index.idx(in_alt, m_NinF, site, 0), vt);
495 template<
typename AFIELD>
500 int ith, nth, isite, nsite;
501 set_threadtask_afopr(ith, nth, isite, nsite, m_Nvol);
507 for (
int site = isite; site < nsite; ++site) {
508 for (
int is = 0; is < m_Ns; ++is) {
509 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
510 int in_alt = ivcd +
NVCD * is;
511 double vt = double(w.cmp_host(index.idx(in_alt, m_NinF, site, 0)));
512 v.
set(ivcd, site, is, vt);
522 template<
typename AFIELD>
528 if (ith == 0) m_mode = mode;
535 template<
typename AFIELD>
540 }
else if (m_mode ==
"Ddag") {
542 }
else if (m_mode ==
"DdagD") {
544 }
else if (m_mode ==
"DDdag") {
546 }
else if (m_mode ==
"H") {
548 }
else if (m_mode ==
"Hdag") {
550 }
else if (m_mode ==
"D_prec") {
552 }
else if (m_mode ==
"Ddag_prec") {
554 }
else if (m_mode ==
"DdagD_prec") {
556 }
else if (m_mode ==
"Prec") {
559 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
566 template<
typename AFIELD>
571 }
else if (m_mode ==
"Ddag") {
573 }
else if (m_mode ==
"DdagD") {
575 }
else if (m_mode ==
"DDdag") {
577 }
else if (m_mode ==
"H") {
579 }
else if (m_mode ==
"Hdag") {
581 }
else if (m_mode ==
"D_prec") {
583 }
else if (m_mode ==
"Ddag_prec") {
585 }
else if (m_mode ==
"DdagD_prec") {
587 }
else if (m_mode ==
"Prec") {
590 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
597 template<
typename AFIELD>
604 if (mode ==
"Prec") {
606 }
else if (mode ==
"Precdag") {
608 }
else if (mode ==
"D") {
610 }
else if (mode ==
"Ddag") {
612 }
else if (mode ==
"DdagD") {
614 }
else if (mode ==
"DDdag") {
616 }
else if (mode ==
"D_prec") {
618 }
else if (mode ==
"Ddag_prec") {
620 }
else if (mode ==
"DdagD_prec") {
624 class_name.c_str(), mode.c_str());
631 template<
typename AFIELD>
638 if (mode ==
"Prec") {
640 }
else if (mode ==
"Precdag") {
642 }
else if (mode ==
"D") {
644 }
else if (mode ==
"Ddag") {
646 }
else if (mode ==
"DdagD") {
648 }
else if (mode ==
"DDdag") {
650 }
else if (mode ==
"D_prec") {
652 }
else if (mode ==
"Ddag_prec") {
654 }
else if (mode ==
"DdagD_prec") {
657 std::cout <<
"mode undeifined in AFopr_Domainwall_5din.\n";
664 template<
typename AFIELD>
676 vp, wp, m_Ns, m_Nsize);
682 template<
typename AFIELD>
694 template<
typename AFIELD>
706 template<
typename AFIELD>
720 template<
typename AFIELD>
729 template<
typename AFIELD>
738 template<
typename AFIELD>
746 template<
typename AFIELD>
754 template<
typename AFIELD>
763 template<
typename AFIELD>
772 template<
typename AFIELD>
784 vp, wp, m_Ns, m_Nsize);
791 template<
typename AFIELD>
812 template<
typename AFIELD>
820 if(nth > 1) ith_kernel = 1;
827 if (ith == ith_kernel){
830 vp, yp, wp, m_mq, m_M0, m_Ns,
831 &m_b[0], &m_c[0], m_alpha, m_Nsize);
833 if (do_comm_any > 0) {
845 buf1_xp, buf1_xm, buf1_yp, buf1_ym,
846 buf1_zp, buf1_zm, buf1_tp, buf1_tm,
848 m_Ns, m_bc, m_Nsize, do_comm);
853 if(do_comm_any > 0 && ith == 0){
858 if (ith == ith_kernel){
861 vp, up, yp, m_Ns, m_bc2, m_Nsize, do_comm, 1);
863 #ifdef USE_DOMAINWALL_5DIN_4D_KERNEL
865 vp, up, yp, m_Ns, m_bc2, m_Nsize, do_comm, 1);
874 if(do_comm_any > 0 && ith == 0){
881 if(do_comm_any > 0 && ith == ith_kernel){
894 buf2_xp, buf2_xm, buf2_yp, buf2_ym,
895 buf2_zp, buf2_zm, buf2_tp, buf2_tm,
896 m_Ns, m_bc, m_Nsize, do_comm);
903 template<
typename AFIELD>
911 if(nth > 1) ith_kernel = 1;
918 if (ith == ith_kernel){
921 vp, wp, m_Ns, m_Nsize);
923 if (do_comm_any > 0) {
935 buf1_xp, buf1_xm, buf1_yp, buf1_ym,
936 buf1_zp, buf1_zm, buf1_tp, buf1_tm,
937 up, vp, m_Ns, m_bc, m_Nsize, do_comm);
942 if(do_comm_any > 0 && ith == 0){
947 if(ith == ith_kernel){
950 yp, up, vp, m_Ns, m_bc2, m_Nsize, do_comm, 0);
952 #ifdef USE_DOMAINWALL_5DIN_4D_KERNEL
954 yp, up, vp, m_Ns, m_bc2, m_Nsize, do_comm, 0);
963 if(do_comm_any > 0 && ith == 0){
970 if (ith == ith_kernel) {
972 if (do_comm_any > 0) {
985 buf2_xp, buf2_xm, buf2_yp, buf2_ym,
986 buf2_zp, buf2_zm, buf2_tp, buf2_tm,
987 m_Ns, m_bc, m_Nsize, do_comm);
991 vp, yp, wp, m_mq, m_M0, m_Ns,
992 &m_b[0], &m_c[0], m_alpha, m_Nsize);
1001 template<
typename AFIELD>
1013 vp, wp, m_Ns, m_Nsize,
1014 &m_e[0], &m_f[0], &m_dpinv[0], &m_dm[0], m_alpha);
1021 template<
typename AFIELD>
1034 vp, wp, m_Ns, m_Nsize,
1035 &m_e[0], &m_f[0], &m_dpinv[0], &m_dm[0], m_alpha);
1042 template<
typename AFIELD>
1046 double vsite =
static_cast<double>(Lvol);
1047 double vNs =
static_cast<double>(m_Ns);
1053 double axpy1 =
static_cast<double>(2 * m_NinF);
1054 double scal1 =
static_cast<double>(1 * m_NinF);
1055 if (m_repr ==
"Dirac") {
1056 flop_Wilson =
static_cast<double>(
1057 Nc * Nd * (4 + 6 * (4 * Nc + 2) + 2 * (4 * Nc + 1))) * vsite;
1058 flop_LU_inv =
static_cast<double>(Nc * Nd * (2 + (vNs - 1) * 26)) * vsite;
1059 }
else if (m_repr ==
"Chiral") {
1060 flop_Wilson =
static_cast<double>(
1061 Nc * Nd * (4 + 8 * (4 * Nc + 2))) * vsite;
1062 flop_LU_inv =
static_cast<double>(Nc * Nd * (2 + (vNs - 1) * 10)) * vsite;
1066 double flop_DW = vNs * flop_Wilson + vsite * (6 * axpy1 + 2 * scal1);
1073 if (mode ==
"Prec") {
1075 }
else if ((mode ==
"D") || (mode ==
"Ddag")) {
1077 }
else if (mode ==
"DdagD") {
1078 flop = 2.0 * flop_DW;
1079 }
else if ((mode ==
"D_prec") || (mode ==
"Ddag_prec")) {
1080 flop = flop_LU_inv + flop_DW;
1081 }
else if (mode ==
"DdagD_prec") {
1082 flop = 2.0 * (flop_LU_inv + flop_DW);
1084 vout.
crucial(m_vl,
"Error at %s: input mode is undefined.\n",
1085 class_name.c_str());