22 template<
typename AFIELD>
26 template<
typename AFIELD>
33 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
44 string vlevel = params.
get_string(
"verbose_level");
50 err += params.
fetch_string(
"kernel_type", m_kernel_type);
52 vout.
crucial(m_vl,
"%s: Error: kernel_type is not specified.\n",
61 vout.
crucial(m_vl,
"Error at %s: domain_wall_height is not specified.\n",
67 double kappa = 1.0 / (8.0 - 2.0 * M0);
68 params_kernel.
set_double(
"hopping_parameter", kappa);
72 m_kernel_created =
true;
74 m_foprw->set_mode(
"D");
78 set_parameters(params);
80 m_w4.reset(m_NinF, m_Nvol, 1);
81 m_v4.reset(m_NinF, m_Nvol, 1);
82 m_t4.reset(m_NinF, m_Nvol, 1);
83 m_y4.reset(m_NinF, m_Nvol, 1);
85 if (needs_convert()) {
86 m_w4lex.reset(m_NinF, m_Nvol, 1);
87 m_v4lex.reset(m_NinF, m_Nvol, 1);
97 template<
typename AFIELD>
105 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
110 m_NinF = 2 * Nc * Nd;
116 string vlevel = params.
get_string(
"verbose_level");
119 vout.
general(m_vl,
"%s: Initialization start\n", class_name.c_str());
122 m_kernel_type =
"unknown";
123 m_kernel_created =
false;
129 set_parameters(params);
131 m_w4.reset(m_NinF, m_Nvol, 1);
132 m_v4.reset(m_NinF, m_Nvol, 1);
133 m_t4.reset(m_NinF, m_Nvol, 1);
134 m_y4.reset(m_NinF, m_Nvol, 1);
136 if (needs_convert()) {
137 m_w4lex.reset(m_NinF, m_Nvol, 1);
138 m_v4lex.reset(m_NinF, m_Nvol, 1);
148 template<
typename AFIELD>
155 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
160 m_NinF = 2 * Nc * Nd;
165 vout.
general(m_vl,
"%s: Initialization start\n", class_name.c_str());
168 m_kernel_type =
"unknown";
169 m_kernel_created =
false;
175 m_w4.reset(m_NinF, m_Nvol, 1);
176 m_v4.reset(m_NinF, m_Nvol, 1);
177 m_t4.reset(m_NinF, m_Nvol, 1);
178 m_y4.reset(m_NinF, m_Nvol, 1);
180 if (needs_convert()) {
181 m_w4lex.reset(m_NinF, m_Nvol, 1);
182 m_v4lex.reset(m_NinF, m_Nvol, 1);
192 template<
typename AFIELD>
195 if (m_kernel_created ==
true)
delete m_foprw;
200 template<
typename AFIELD>
216 int err_optional = 0;
217 err_optional += params.
fetch_string(
"gamma_matrix_type", gmset_type);
222 err += params.
fetch_int(
"extent_of_5th_dimension", Ns);
226 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
236 vout.
general(m_vl,
"gamma_matrix_type is not given: defalt = %s\n",
245 vout.
general(m_vl,
" coefficients b, c are not provided:"
246 " set to Shamir's form.\n");
251 int err3 = params.
fetch_double(
"parameter_alpha", alpha);
253 vout.
general(m_vl,
" parameter alpha is not provided: set to 1.0.\n");
260 if (
real_t(M0) != m_M0) set_kernel_parameters(params);
265 template<
typename AFIELD>
268 params.
set_string(
"kernel_type", m_kernel_type);
269 params.
set_string(
"gamma_matrix_type", m_repr);
270 params.
set_double(
"quark_mass",
double(m_mq));
271 params.
set_double(
"domain_wall_height",
double(m_M0));
272 params.
set_int(
"extent_of_5th_dimension", m_Ns);
274 params.
set_double(
"coefficient_b",
double(m_b[0]));
275 params.
set_double(
"coefficient_c",
double(m_c[0]));
276 params.
set_double(
"parameter_alpha",
double(m_alpha));
277 params.
set_string(
"gamma_matrix_type", m_repr);
284 template<
typename AFIELD>
289 const std::vector<int> bc,
302 assert(bc.size() == m_Ndim);
303 if (m_boundary.size() != m_Ndim) m_boundary.resize(m_Ndim);
304 for (
int mu = 0; mu < m_Ndim; ++mu) {
305 m_boundary[mu] = bc[mu];
308 if (m_b.size() != m_Ns) {
312 for (
int is = 0; is < m_Ns; ++is) {
319 vout.
general(m_vl,
"%s: input parameters\n", class_name.c_str());
323 for (
int mu = 0; mu < m_Ndim; ++mu) {
324 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
327 for (
int is = 0; is < m_Ns; ++is) {
328 vout.
general(m_vl,
" b[%2d] = %16.10f c[%2d] = %16.10f\n",
329 is, m_b[is], is, m_c[is]);
333 set_precond_parameters();
336 if (m_w1.nex() != Ns) {
338 m_w1.reset(m_NinF, m_Nvol, m_Ns);
339 m_v1.reset(m_NinF, m_Nvol, m_Ns);
340 m_v2.reset(m_NinF, m_Nvol, m_Ns);
349 template<
typename AFIELD>
354 const std::vector<int> bc,
355 const std::vector<real_t> vec_b,
356 const std::vector<real_t> vec_c,
367 assert(bc.size() == m_Ndim);
368 if (m_boundary.size() != m_Ndim) m_boundary.resize(m_Ndim);
369 for (
int mu = 0; mu < m_Ndim; ++mu) {
370 m_boundary[mu] = bc[mu];
373 if (m_b.size() != m_Ns) {
377 for (
int is = 0; is < m_Ns; ++is) {
378 m_b[is] =
real_t(vec_b[is]);
379 m_c[is] =
real_t(vec_c[is]);
384 vout.
general(m_vl,
"%s: parameters\n", class_name.c_str());
388 for (
int mu = 0; mu < m_Ndim; ++mu) {
389 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
392 for (
int is = 0; is < m_Ns; ++is) {
393 vout.
general(m_vl,
" b[%2d] = %16.10f c[%2d] = %16.10f\n",
394 is, m_b[is], is, m_c[is]);
398 set_precond_parameters();
401 if (m_w1.nex() != Ns) {
403 m_w1.reset(m_NinF, m_Nvol, m_Ns);
404 m_v1.reset(m_NinF, m_Nvol, m_Ns);
405 m_v2.reset(m_NinF, m_Nvol, m_Ns);
414 template<
typename AFIELD>
416 const std::vector<real_t> vec_b,
417 const std::vector<real_t> vec_c)
419 if ((vec_b.size() != m_Ns) || (vec_c.size() != m_Ns)) {
420 vout.
crucial(m_vl,
"%s: size of coefficient vectors incorrect.\n",
424 vout.
general(m_vl,
"%s: coefficient vectors are set:\n",
427 for (
int is = 0; is < m_Ns; ++is) {
428 m_b[is] =
real_t(vec_b[is]);
429 m_c[is] =
real_t(vec_c[is]);
430 vout.
general(m_vl,
"b[%2d] = %16.10f c[%2d] = %16.10f\n",
431 is, m_b[is], is, m_c[is]);
434 set_precond_parameters();
439 template<
typename AFIELD>
448 double kappa = 1.0 / (8.0 - 2.0 * M0);
449 params_kernel.
set_double(
"hopping_parameter", kappa);
451 m_foprw->set_parameters(params_kernel);
456 template<
typename AFIELD>
462 if (m_dp.size() != m_Ns) {
465 m_e.resize(m_Ns - 1);
466 m_f.resize(m_Ns - 1);
469 for (
int is = 0; is < m_Ns; ++is) {
472 m_dp[is] = m_alpha * (1.0 + m_b[is] * (4.0 - m_M0));
473 m_dm[is] = m_alpha * (1.0 - m_c[is] * (4.0 - m_M0));
476 m_e[0] = m_mq * m_dm[m_Ns - 1] / m_dp[0];
478 m_f[0] = m_mq * m_dm[0]/m_alpha;
479 for (
int is = 1; is < m_Ns - 1; ++is) {
480 m_e[is] = m_e[is - 1] * m_dm[is - 1] / m_dp[is];
481 m_f[is] = m_f[is - 1] * m_dm[is] / m_dp[is - 1];
484 m_g = m_e[m_Ns - 2] * m_dm[m_Ns - 2];
493 template<
typename AFIELD>
496 if (!needs_convert()) {
497 vout.
crucial(m_vl,
"%s: convert is not necessary.\n",
505 for (
int ex = 0; ex < Nex; ++ex) {
506 copy(m_w4lex, 0, w, ex);
507 m_foprw->convert(m_v4lex, m_w4lex);
508 copy(v, ex, m_v4lex, 0);
516 template<
typename AFIELD>
519 if (!needs_convert()) {
520 vout.
crucial(m_vl,
"%s: convert is not necessary.\n",
528 for (
int ex = 0; ex < Nex; ++ex) {
529 copy(m_v4lex, 0, w, ex);
530 m_foprw->reverse(m_w4lex, m_v4lex);
531 copy(v, ex, m_w4lex, 0);
539 template<
typename AFIELD>
545 if (ith == 0) m_mode = mode;
552 template<
typename AFIELD>
557 }
else if (m_mode ==
"Ddag") {
559 }
else if (m_mode ==
"DdagD") {
561 }
else if (m_mode ==
"DDdag") {
563 }
else if (m_mode ==
"H") {
565 }
else if (m_mode ==
"Hdag") {
567 }
else if (m_mode ==
"D_prec") {
569 }
else if (m_mode ==
"Ddag_prec") {
571 }
else if (m_mode ==
"DdagD_prec") {
573 }
else if (m_mode ==
"Prec") {
576 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
583 template<
typename AFIELD>
588 }
else if (m_mode ==
"Ddag") {
590 }
else if (m_mode ==
"DdagD") {
592 }
else if (m_mode ==
"DDdag") {
594 }
else if (m_mode ==
"H") {
596 }
else if (m_mode ==
"Hdag") {
598 }
else if (m_mode ==
"D_prec") {
600 }
else if (m_mode ==
"Ddag_prec") {
602 }
else if (m_mode ==
"DdagD_prec") {
604 }
else if (m_mode ==
"Prec") {
607 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
614 template<
typename AFIELD>
621 if (mode ==
"Prec") {
623 }
else if (mode ==
"Precdag") {
625 }
else if (mode ==
"D") {
627 }
else if (mode ==
"Ddag") {
629 }
else if (mode ==
"DdagD") {
631 }
else if (mode ==
"DDdag") {
633 }
else if (mode ==
"D_prec") {
635 }
else if (mode ==
"Ddag_prec") {
637 }
else if (mode ==
"DdagD_prec") {
641 class_name.c_str(), mode.c_str());
648 template<
typename AFIELD>
655 if (mode ==
"Prec") {
657 }
else if (mode ==
"Precdag") {
659 }
else if (mode ==
"D") {
661 }
else if (mode ==
"Ddag") {
663 }
else if (mode ==
"DdagD") {
665 }
else if (mode ==
"DDdag") {
667 }
else if (mode ==
"D_prec") {
669 }
else if (mode ==
"Ddag_prec") {
671 }
else if (mode ==
"DdagD_prec") {
674 std::cout <<
"mode undeifined in AFopr_Domainwall.\n";
681 template<
typename AFIELD>
691 m_foprw->mult_gm5(v, w);
694 for (
int ex = 0; ex < Nex; ++ex) {
695 copy(m_w4, 0, w, ex);
696 m_foprw->mult_gm5(m_v4, m_w4);
697 copy(v, ex, m_v4, 0);
705 template<
typename AFIELD>
714 m_foprw->mult_gm5(m_w4, w);
724 template<
typename AFIELD>
727 m_foprw->mult_gm5(v, w);
732 template<
typename AFIELD>
744 template<
typename AFIELD>
756 template<
typename AFIELD>
768 template<
typename AFIELD>
778 template<
typename AFIELD>
788 template<
typename AFIELD>
797 template<
typename AFIELD>
806 template<
typename AFIELD>
815 template<
typename AFIELD>
824 template<
typename AFIELD>
829 for (
int is = 0; is < m_Ns; ++is) {
830 copy(m_w4, 0, w, is);
831 mult_gm5_4d(m_v4, m_w4);
832 copy(v, m_Ns - 1 - is, m_v4, 0);
840 template<
typename AFIELD>
848 for (
int is = 0; is < m_Ns; ++is) {
849 copy(v, m_Ns - 1 - is, w, is);
857 template<
typename AFIELD>
862 for (
int is = 0; is < m_Ns; ++is) {
866 int is_up = (is + 1) % m_Ns;
867 real_t Fup = 0.5 * m_alpha;
868 if (is == m_Ns-1) Fup = -0.5 * m_mq;
869 copy(m_v4, 0, w, is_up);
870 mult_gm5_4d(m_t4, m_v4);
872 axpy(m_y4, 0, Fup, m_v4, 0);
874 int is_dn = (is - 1 + m_Ns) % m_Ns;
875 real_t Fdn = 0.5 * m_alpha;
876 if (is == 0) Fdn = -0.5 * m_mq;
877 copy(m_v4, 0, w, is_dn);
878 mult_gm5_4d(m_t4, m_v4);
880 axpy(m_y4, 0, Fdn, m_v4, 0);
882 copy(m_w4, 0, w, is);
886 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
887 real_t fac2 = 0.5 * (-1.0 + m_alpha);
888 mult_gm5_4d(m_t4, m_w4);
890 axpy(m_w4, fac2, m_t4);
891 }
else if(is == m_Ns-1){
892 real_t fac1 = 0.5 * (1.0 + m_alpha);
893 real_t fac2 = 0.5 * (1.0 - m_alpha);
894 mult_gm5_4d(m_t4, m_w4);
896 axpy(m_w4, fac2, m_t4);
902 copy(v, is, m_w4, 0);
906 axpy(m_w4, m_c[is], m_y4);
908 m_foprw->mult(m_v4, m_w4);
918 template<
typename AFIELD>
926 for (
int is = 0; is < m_Ns; ++is) {
928 copy(m_w4, 0, w, is);
930 m_foprw->mult_dag(m_v4, m_w4);
932 axpy(m_w4, m_b[is] * (
real_t(4.0) - m_M0), m_v4);
936 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
937 real_t fac2 = 0.5 * (-1.0 + m_alpha);
938 mult_gm5_4d(m_t4, m_w4);
940 axpy(m_w4, fac2, m_t4);
941 }
else if(is == m_Ns-1){
942 real_t fac1 = 0.5 * (1.0 + m_alpha);
943 real_t fac2 = 0.5 * (1.0 - m_alpha);
944 mult_gm5_4d(m_t4, m_w4);
946 axpy(m_w4, fac2, m_t4);
954 axpy(m_y4, -m_c[is] * (
real_t(4.0) - m_M0), m_v4);
956 int is_up = (is + 1) % m_Ns;
957 real_t Fup = 0.5 * m_alpha;
958 if (is_up == 0) Fup = -0.5 * m_mq;
959 mult_gm5_4d(m_t4, m_y4);
961 axpy(v, is_up, Fup, m_t4, 0);
963 int is_dn = (is - 1 + m_Ns) % m_Ns;
964 real_t Fdn = 0.5 * m_alpha;
965 if (is_dn == m_Ns - 1) Fdn = -0.5 * m_mq;
966 mult_gm5_4d(m_t4, m_y4);
968 axpy(v, is_dn, -Fdn, m_t4, 0);
976 template<
typename AFIELD>
985 for (
int is = 1; is < m_Ns - 1; ++is) {
988 copy(m_v4, 0, v, is - 1);
989 mult_gm5_4d(m_t4, m_v4);
991 scal(m_v4,
real_t(0.5) * m_dm[is] / m_dp[is - 1]);
994 copy(m_t4, 0, v, is);
995 axpy(m_y4, m_e[is], m_t4);
1000 copy(m_v4, 0, v, is - 1);
1001 mult_gm5_4d(m_t4, m_v4);
1003 scal(m_v4,
real_t(0.5) * m_dm[is] / m_dp[is - 1]);
1007 mult_gm5_4d(m_t4, m_y4);
1017 template<
typename AFIELD>
1023 copy(m_y4, 0, w, is);
1026 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
1027 real_t fac2 = 0.5 * (-1.0 + m_alpha);
1029 mult_gm5_4d(m_t4, m_y4);
1031 axpy(m_y4, fac2, m_t4);
1034 copy(v, is, m_y4, 0);
1036 mult_gm5_4d(m_w4, m_y4);
1042 for (
int is = m_Ns - 2; is >= 0; --is) {
1043 copy(m_v4, 0, w, is);
1045 copy(m_w4, 0, v, is + 1);
1046 mult_gm5_4d(m_t4, m_w4);
1051 axpy(m_v4, -m_f[is], m_y4);
1056 real_t fac1 = 0.5 * (1.0 + m_alpha);
1057 real_t fac2 = 0.5 * (1.0 - m_alpha);
1059 mult_gm5_4d(m_t4, m_v4);
1061 axpy(m_v4, fac2, m_t4);
1065 copy(v, is, m_v4, 0);
1074 template<
typename AFIELD>
1079 copy(m_v4, 0, w, 0);
1082 real_t fac1 = 0.5 * (1.0 + m_alpha);
1083 real_t fac2 = 0.5 * (1.0 - m_alpha);
1085 mult_gm5_4d(m_t4, m_v4);
1087 axpy(m_v4, fac2, m_t4);
1090 copy(v, 0, m_v4, 0);
1098 for (
int is = 1; is < m_Ns - 1; ++is) {
1099 copy(m_t4, 0, w, is);
1101 copy(m_v4, 0, v, is - 1);
1102 mult_gm5_4d(m_w4, m_v4);
1104 axpy(m_t4,
real_t(0.5) * m_dm[is - 1], m_v4);
1107 copy(v, is, m_t4, 0);
1109 axpy(m_y4, m_f[is], m_t4);
1116 copy(m_t4, 0, w, is);
1118 copy(m_v4, 0, v, is - 1);
1119 mult_gm5_4d(m_w4, m_v4);
1121 axpy(m_t4,
real_t(0.5) * m_dm[is - 1], m_v4);
1123 mult_gm5_4d(m_w4, m_y4);
1132 fac1 = 0.5 * ( 1.0 + m_alpha);
1133 fac2 = 0.5 * (-1.0 + m_alpha);
1135 mult_gm5_4d(m_y4, m_t4);
1137 axpy(m_t4, fac2, m_y4);
1140 copy(v, is, m_t4, 0);
1147 template<
typename AFIELD>
1156 copy(m_y4, 0, w, is);
1157 mult_gm5_4d(m_w4, m_y4);
1161 for (
int is = m_Ns - 2; is >= 0; --is) {
1164 copy(m_v4, 0, v, is + 1);
1165 mult_gm5_4d(m_w4, m_v4);
1167 scal(m_v4,
real_t(0.5) * m_dm[is + 1] / m_dp[is]);
1169 axpy(m_v4, -m_e[is], m_y4);
1179 template<
typename AFIELD>
1183 double vsite =
static_cast<double>(Lvol);
1184 double vNs =
static_cast<double>(m_Ns);
1187 double flop_Wilson = m_foprw->flop_count();
1189 double axpy1 =
static_cast<double>(2 * m_NinF);
1190 double scal1 =
static_cast<double>(1 * m_NinF);
1192 double flop_DW = vNs * (flop_Wilson + vsite * (6 * axpy1 + 2 * scal1));
1195 double flop_LU_inv = 2.0 * vsite *
1196 ( (3.0 * axpy1 + scal1) * (vNs - 1.0)
1197 + axpy1 + 2.0 * scal1);
1200 if (mode ==
"Prec") {
1202 }
else if ((mode ==
"D") || (mode ==
"Ddag")) {
1204 }
else if (mode ==
"DdagD") {
1205 flop = 2.0 * flop_DW;
1206 }
else if ((mode ==
"D_prec") || (mode ==
"Ddag_prec")) {
1207 flop = flop_LU_inv + flop_DW;
1208 }
else if (mode ==
"DdagD_prec") {
1209 flop = 2.0 * (flop_LU_inv + flop_DW);
1211 vout.
crucial(m_vl,
"Error at %s: input repr is undefined.\n",
1212 class_name.c_str());