21 template<
typename AFIELD>
23 =
"AFopr_Domainwall_eo";
26 template<
typename AFIELD>
38 string vlevel = params.
get_string(
"verbose_level");
41 vout.
general(m_vl,
"%s: Initialization start\n", class_name.c_str());
45 std::string kernel_type;
48 vout.
crucial(m_vl,
"Error at %s: kernel_type is not specified.\n",
52 m_kernel_type = kernel_type;
59 vout.
crucial(m_vl,
"Error at %s: domain_wall_height is not specified.\n",
65 double kappa = 1.0 / (8.0 - 2.0 * M0);
66 params_kernel.
set_double(
"hopping_parameter", kappa);
70 m_foprw->set_mode(
"D");
74 set_parameters(params);
76 m_w4.reset(m_NinF, m_Nvol2, 1);
77 m_v4.reset(m_NinF, m_Nvol2, 1);
78 m_y4.reset(m_NinF, m_Nvol2, 1);
79 m_t4.reset(m_NinF, m_Nvol2, 1);
81 if (needs_convert()) {
82 m_w4lex.reset(m_NinF, m_Nvol, 1);
83 m_v4lex.reset(m_NinF, m_Nvol, 1);
92 template<
typename AFIELD>
101 template<
typename AFIELD>
105 const string str_vlevel = params.
get_string(
"verbose_level");
116 int err_optional = 0;
117 err_optional += params.
fetch_string(
"gamma_matrix_type", gmset_type);
122 err += params.
fetch_int(
"extent_of_5th_dimension", Ns);
128 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
138 vout.
general(m_vl,
"gamma_matrix_type is not given: defalt = %s\n",
146 vout.
general(m_vl,
" coefficients b, c are not provided:"
147 " set to Shamir's form.\n");
152 int err3 = params.
fetch_double(
"parameter_alpha", alpha);
154 vout.
general(m_vl,
" parameter alpha is not provided: set to 1.0.\n");
161 if (
real_t(M0) != m_M0) set_kernel_parameters(params);
166 template<
typename AFIELD>
170 params.
set_string(
"kernel_type", m_kernel_type);
171 params.
set_string(
"gamma_matrix_type", m_repr);
172 params.
set_double(
"quark_mass",
double(m_mq));
173 params.
set_double(
"domain_wall_height",
double(m_M0));
174 params.
set_int(
"extent_of_5th_dimension", m_Ns);
176 params.
set_double(
"coefficient_b",
double(m_b[0]));
177 params.
set_double(
"coefficient_c",
double(m_c[0]));
178 params.
set_double(
"parameter_alpha",
double(m_alpha));
179 params.
set_string(
"gamma_matrix_type", m_repr);
186 template<
typename AFIELD>
191 const std::vector<int> bc,
203 m_boundary.resize(m_Ndim);
204 assert(bc.size() == m_Ndim);
205 for (
int mu = 0; mu < m_Ndim; ++mu) {
206 m_boundary[mu] = bc[mu];
209 if (m_b.size() != m_Ns) {
213 for (
int is = 0; is < m_Ns; ++is) {
220 vout.
general(m_vl,
"Parameters of %s:\n", class_name.c_str());
224 for (
int mu = 0; mu < m_Ndim; ++mu) {
225 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
230 for (
int is = 0; is < m_Ns; ++is) {
231 vout.
general(m_vl,
" b[%2d] = %16.10f c[%2d] = %16.10f\n",
232 is, m_b[is], is, m_c[is]);
237 set_precond_parameters();
240 if (m_w1.nex() != Ns) {
242 m_w1.reset(m_NinF, m_Nvol2, m_Ns);
243 m_v1.reset(m_NinF, m_Nvol2, m_Ns);
244 m_v2.reset(m_NinF, m_Nvol2, m_Ns);
251 template<
typename AFIELD>
260 double kappa = 1.0 / (8.0 - 2.0 * M0);
261 params_kernel.
set_double(
"hopping_parameter", kappa);
263 m_foprw->set_parameters(params_kernel);
268 template<
typename AFIELD>
276 if (m_dp.size() != m_Ns) {
279 m_e.resize(m_Ns - 1);
280 m_f.resize(m_Ns - 1);
283 for (
int is = 0; is < m_Ns; ++is) {
286 m_dp[is] = m_alpha * (1.0 + m_b[is] * (4.0 - m_M0));
287 m_dm[is] = m_alpha * (1.0 - m_c[is] * (4.0 - m_M0));
290 m_e[0] = m_mq * m_dm[m_Ns - 1] / m_dp[0];
292 m_f[0] = m_mq * m_dm[0]/m_alpha;
293 for (
int is = 1; is < m_Ns - 1; ++is) {
294 m_e[is] = m_e[is - 1] * m_dm[is - 1] / m_dp[is];
295 m_f[is] = m_f[is - 1] * m_dm[is] / m_dp[is - 1];
298 m_g = m_e[m_Ns - 2] * m_dm[m_Ns - 2];
306 template<
typename AFIELD>
308 const std::vector<real_t> vec_b,
309 const std::vector<real_t> vec_c)
311 if ((vec_b.size() != m_Ns) || (vec_c.size() != m_Ns)) {
312 vout.
crucial(m_vl,
"%s: size of coefficient vectors incorrect.\n",
316 vout.
general(m_vl,
"%s: coefficient vectors are set:\n",
319 for (
int is = 0; is < m_Ns; ++is) {
322 vout.
general(m_vl,
"b[%2d] = %16.10f c[%2d] = %16.10f\n",
323 is, m_b[is], is, m_c[is]);
326 set_precond_parameters();
331 template<
typename AFIELD>
334 if (!needs_convert()) {
335 vout.
crucial(m_vl,
"%s: convert is not necessary.\n",
343 for (
int ex = 0; ex < Nex; ++ex) {
344 copy(m_w4lex, 0, w, ex);
345 m_foprw->convert(m_v4lex, m_w4lex);
346 copy(v, ex, m_v4lex, 0);
354 template<
typename AFIELD>
357 if (!needs_convert()) {
358 vout.
crucial(m_vl,
"%s: convert is not necessary.\n",
366 for (
int ex = 0; ex < Nex; ++ex) {
367 copy(m_v4lex, 0, w, ex);
368 m_foprw->reverse(m_w4lex, m_v4lex);
369 copy(v, ex, m_w4lex, 0);
377 template<
typename AFIELD>
383 if (ith == 0) m_mode = mode;
391 template<
typename AFIELD>
396 }
else if (m_mode ==
"Ddag") {
398 }
else if (m_mode ==
"DdagD") {
400 }
else if (m_mode ==
"DDdag") {
403 }
else if (m_mode ==
"H") {
405 }
else if (m_mode ==
"Deo") {
407 }
else if (m_mode ==
"Doe") {
409 }
else if (m_mode ==
"Dee") {
411 }
else if (m_mode ==
"Doo") {
413 }
else if (m_mode ==
"Dee_inv") {
416 }
else if (m_mode ==
"Doo_inv") {
420 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
421 vout.
crucial(m_vl,
"in mult, mode=%s.\n", m_mode.c_str());
428 template<
typename AFIELD>
433 }
else if (m_mode ==
"Ddag") {
435 }
else if (m_mode ==
"DdagD") {
437 }
else if (m_mode ==
"DDdag") {
440 }
else if (m_mode ==
"H") {
442 }
else if (m_mode ==
"Deo") {
444 }
else if (m_mode ==
"Doe") {
446 }
else if (m_mode ==
"Dee") {
448 }
else if (m_mode ==
"Doo") {
450 }
else if (m_mode ==
"Dee_inv") {
453 }
else if (m_mode ==
"Doo_inv") {
457 vout.
crucial(m_vl,
"mode undeifined in %s.\n", class_name.c_str());
458 vout.
crucial(m_vl,
"in mult_dag, mode=%s.\n", m_mode.c_str());
465 template<
typename AFIELD>
474 }
else if (mode ==
"Doe") {
476 }
else if (mode ==
"Dee") {
478 }
else if (mode ==
"Doo") {
480 }
else if (mode ==
"Dee_inv") {
483 }
else if (mode ==
"Doo_inv") {
487 std::cout <<
"mode undeifined in AFopr_Domainwall_eo.\n";
493 template<
typename AFIELD>
500 if (m_mode ==
"Deo") {
502 }
else if (m_mode ==
"Doe") {
504 }
else if (m_mode ==
"Dee") {
506 }
else if (m_mode ==
"Doo") {
508 }
else if (m_mode ==
"Dee_inv") {
511 }
else if (m_mode ==
"Doo_inv") {
515 std::cout <<
"mode undeifined in AFopr_Domainwall_eo.\n";
521 template<
typename AFIELD>
530 m_index_eo->split(Be, m_w1, b);
540 Udag_inv(m_v1, m_w1);
542 Ddag_eo(m_w1, bo, 0);
548 template<
typename AFIELD>
566 m_index_eo->merge(x, xe, m_w1);
569 Ldag_inv(m_v2, m_v1);
570 Ddag_eo(m_w1, m_v2, 1);
571 Udag_inv(m_v1, m_w1);
572 Ldag_inv(m_w1, m_v1);
575 m_index_eo->merge(x, m_v2, m_w1);
581 template<
typename AFIELD>
609 template<
typename AFIELD>
626 template<
typename AFIELD>
646 template<
typename AFIELD>
653 Ldag_inv(m_v2, m_v1);
654 Ddag_eo(m_v1, m_v2, 1);
655 Udag_inv(m_v2, m_v1);
656 Ldag_inv(m_v1, m_v2);
657 Ddag_eo(m_v2, m_v1, 0);
666 template<
typename AFIELD>
675 Ldag_inv(m_v2, m_v1);
676 Ddag_eo(m_v1, m_v2, 1);
677 Udag_inv(m_v2, m_v1);
678 Ldag_inv(m_v1, m_v2);
679 Ddag_eo(m_v2, m_v1, 0);
688 template<
typename AFIELD>
692 assert(Nex == w.
nex());
700 for (
int ex = 0; ex < Nex; ++ex) {
701 copy(m_w4, 0, w, ex);
702 m_foprw->mult_gm5(m_v4, m_w4);
703 copy(v, ex, m_v4, 0);
711 template<
typename AFIELD>
715 m_foprw->mult_gm5(v, w);
720 template<
typename AFIELD>
728 for (
int is = 0; is < m_Ns; ++is) {
729 copy(v, m_Ns - 1 - is, w, is);
737 template<
typename AFIELD>
745 for (
int is = 0; is < m_Ns; ++is) {
746 copy(m_w4, 0, w, is);
747 mult_gm5_4d(m_v4, m_w4);
748 copy(v, m_Ns - 1 - is, m_v4, 0);
756 template<
typename AFIELD>
762 for (
int is = 0; is < m_Ns; ++is) {
764 int is_up = (is + 1) % m_Ns;
765 real_t Fup = 0.5 * m_alpha;
766 if (is == m_Ns-1) Fup = -0.5 * m_mq;
767 copy(m_y4, 0, w, is_up);
768 mult_gm5_4d(m_t4, m_y4);
770 axpy(m_v4, 0, Fup, m_y4, 0);
772 int is_dn = (is - 1 + m_Ns) % m_Ns;
773 real_t Fdn = 0.5 * m_alpha;
774 if (is == 0) Fdn = -0.5 * m_mq;
775 copy(m_y4, 0, w, is_dn);
776 mult_gm5_4d(m_t4, m_y4);
778 axpy(m_v4, 0, Fdn, m_y4, 0);
780 copy(m_w4, 0, w, is);
783 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
784 real_t fac2 = 0.5 * (-1.0 + m_alpha);
786 mult_gm5_4d(m_t4, m_w4);
788 axpy(m_w4, fac2, m_t4);
790 }
else if(is == m_Ns-1){
791 real_t fac1 = 0.5 * (1.0 + m_alpha);
792 real_t fac2 = 0.5 * (1.0 - m_alpha);
794 mult_gm5_4d(m_t4, m_w4);
796 axpy(m_w4, fac2, m_t4);
803 axpy(m_w4, m_c[is], m_v4);
806 m_foprw->mult(m_v4, m_w4,
"Deo");
808 m_foprw->mult(m_v4, m_w4,
"Doe");
813 copy(v, is, m_v4, 0);
821 template<
typename AFIELD>
831 for (
int is = 0; is < m_Ns; ++is) {
832 copy(m_w4, 0, w, is);
835 mult_gm5_4d(m_v4, m_w4);
837 m_foprw->mult(m_y4, m_v4,
"Deo");
839 m_foprw->mult(m_y4, m_v4,
"Doe");
841 mult_gm5_4d(m_v4, m_y4);
848 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
849 real_t fac2 = 0.5 * (-1.0 + m_alpha);
851 mult_gm5_4d(m_t4, m_v4);
853 axpy(m_v4, fac2, m_t4);
855 }
else if(is == m_Ns-1){
856 real_t fac1 = 0.5 * (1.0 + m_alpha);
857 real_t fac2 = 0.5 * (1.0 - m_alpha);
859 mult_gm5_4d(m_t4, m_v4);
861 axpy(m_v4, fac2, m_t4);
867 axpy(v, is, m_b[is], m_v4, 0);
871 int is_up = (is + 1) % m_Ns;
872 real_t Fup = 0.5 * m_alpha;
873 if (is_up == 0) Fup = -0.5 * m_mq;
874 mult_gm5_4d(m_y4, m_w4);
876 axpy(v, is_up, -Fup, m_y4, 0);
878 int is_dn = (is - 1 + m_Ns) % m_Ns;
879 real_t Fdn = 0.5 * m_alpha;
880 if (is_dn == m_Ns - 1) Fdn = -0.5 * m_mq;
881 mult_gm5_4d(m_y4, m_w4);
883 axpy(v, is_dn, Fdn, m_y4, 0);
891 template<
typename AFIELD>
897 for (
int is = 0; is < m_Ns; ++is) {
901 int is_up = (is + 1) % m_Ns;
902 real_t Fup = 0.5 * m_alpha;
903 if (is == m_Ns - 1) Fup = -0.5 * m_mq;
904 copy(m_y4, 0, w, is_up);
905 mult_gm5_4d(m_t4, m_y4);
907 axpy(m_v4, 0, Fup, m_y4, 0);
909 int is_dn = (is - 1 + m_Ns) % m_Ns;
910 real_t Fdn = 0.5 * m_alpha;
911 if (is == 0) Fdn = -0.5 * m_mq;
912 copy(m_y4, 0, w, is_dn);
913 mult_gm5_4d(m_t4, m_y4);
915 axpy(m_v4, 0, Fdn, m_y4, 0);
917 copy(m_w4, 0, w, is);
920 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
921 real_t fac2 = 0.5 * (-1.0 + m_alpha);
923 mult_gm5_4d(m_t4, m_w4);
925 axpy(m_w4, fac2, m_t4);
927 }
else if(is == m_Ns-1){
928 real_t fac1 = 0.5 * (1.0 + m_alpha);
929 real_t fac2 = 0.5 * (1.0 - m_alpha);
931 mult_gm5_4d(m_t4, m_w4);
933 axpy(m_w4, fac2, m_t4);
939 real_t F1 = m_b[is] * (4.0 - m_M0) + 1.0;
942 real_t F2 = m_c[is] * (4.0 - m_M0) - 1.0;
943 axpy(m_w4, F2, m_v4);
945 copy(v, is, m_w4, 0);
952 template<
typename AFIELD>
961 for (
int is = 0; is < m_Ns; ++is) {
963 copy(m_w4, 0, w, is);
964 real_t F1 = m_b[is] * (4.0 - m_M0) + 1.0;
968 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
969 real_t fac2 = 0.5 * (-1.0 + m_alpha);
971 mult_gm5_4d(m_t4, m_w4);
973 axpy(m_w4, fac2, m_t4);
975 }
else if(is == m_Ns-1){
976 real_t fac1 = 0.5 * (1.0 + m_alpha);
977 real_t fac2 = 0.5 * (1.0 - m_alpha);
979 mult_gm5_4d(m_t4, m_w4);
981 axpy(m_w4, fac2, m_t4);
989 copy(m_y4, 0, w, is);
990 real_t F2 = m_c[is] * (4.0 - m_M0) - 1.0;
993 int is_up = (is + 1) % m_Ns;
994 real_t Fup = 0.5 * m_alpha;
995 if (is_up == 0) Fup = -0.5 * m_mq;
996 mult_gm5_4d(m_t4, m_y4);
998 axpy(v, is_up, -Fup, m_t4, 0);
1000 int is_dn = (is - 1 + m_Ns) % m_Ns;
1001 real_t Fdn = 0.5 * m_alpha;
1002 if (is_dn == m_Ns-1) Fdn = -0.5 * m_mq;
1003 mult_gm5_4d(m_t4, m_y4);
1005 axpy(v, is_dn, Fdn, m_t4, 0);
1013 template<
typename AFIELD>
1019 copy(m_y4, 0, w, 0);
1024 for (
int is = 1; is < m_Ns - 1; ++is) {
1027 copy(m_v4, 0, v, is - 1);
1028 mult_gm5_4d(m_w4, m_v4);
1030 scal(m_v4,
real_t(0.5) * m_dm[is] / m_dp[is - 1]);
1033 copy(m_w4, 0, v, is);
1034 axpy(m_y4, m_e[is], m_w4);
1041 copy(m_v4, 0, v, is - 1);
1042 mult_gm5_4d(m_w4, m_v4);
1044 scal(m_v4,
real_t(0.5) * m_dm[is] / m_dp[is - 1]);
1048 mult_gm5_4d(m_w4, m_y4);
1058 template<
typename AFIELD>
1064 copy(m_y4, 0, w, is);
1067 real_t fac1 = 0.5 * ( 1.0 + m_alpha);
1068 real_t fac2 = 0.5 * (-1.0 + m_alpha);
1070 mult_gm5_4d(m_t4, m_y4);
1072 axpy(m_y4, fac2, m_t4);
1075 copy(v, is, m_y4, 0);
1077 mult_gm5_4d(m_w4, m_y4);
1083 for (
int is = m_Ns - 2; is >= 0; --is) {
1084 copy(m_v4, 0, w, is);
1086 copy(m_w4, 0, v, is + 1);
1087 mult_gm5_4d(m_t4, m_w4);
1092 axpy(m_v4, -m_f[is], m_y4);
1097 real_t fac1 = 0.5 * (1.0 + m_alpha);
1098 real_t fac2 = 0.5 * (1.0 - m_alpha);
1100 mult_gm5_4d(m_t4, m_v4);
1102 axpy(m_v4, fac2, m_t4);
1106 copy(v, is, m_v4, 0);
1115 template<
typename AFIELD>
1120 copy(m_v4, 0, w, 0);
1123 real_t fac1 = 0.5 * (1.0 + m_alpha);
1124 real_t fac2 = 0.5 * (1.0 - m_alpha);
1126 mult_gm5_4d(m_t4, m_v4);
1128 axpy(m_v4, fac2, m_t4);
1131 copy(v, 0, m_v4, 0);
1138 for (
int is = 1; is < m_Ns - 1; ++is) {
1139 copy(m_t4, 0, w, is);
1141 copy(m_v4, 0, v, is - 1);
1142 mult_gm5_4d(m_w4, m_v4);
1144 axpy(m_t4,
real_t(0.5) * m_dm[is - 1], m_v4);
1147 copy(v, is, m_t4, 0);
1149 axpy(m_y4, m_f[is], m_t4);
1156 copy(m_t4, 0, w, is);
1158 copy(m_v4, 0, v, is - 1);
1159 mult_gm5_4d(m_w4, m_v4);
1161 axpy(m_t4,
real_t(0.5) * m_dm[is - 1], m_v4);
1163 mult_gm5_4d(m_w4, m_y4);
1172 fac1 = 0.5 * ( 1.0 + m_alpha);
1173 fac2 = 0.5 * (-1.0 + m_alpha);
1175 mult_gm5_4d(m_y4, m_t4);
1177 axpy(m_t4, fac2, m_y4);
1179 copy(v, is, m_t4, 0);
1186 template<
typename AFIELD>
1194 copy(m_y4, 0, w, is);
1195 mult_gm5_4d(m_t4, m_y4);
1201 for (
int is = m_Ns - 2; is >= 0; --is) {
1204 copy(m_v4, 0, v, is + 1);
1205 mult_gm5_4d(m_t4, m_v4);
1207 scal(m_v4,
real_t(0.5) * m_dm[is + 1] / m_dp[is]);
1209 axpy(m_v4, -m_e[is], m_y4);
1219 template<
typename AFIELD>
1223 double vsite =
static_cast<double>(Lvol2);
1224 double vNs =
static_cast<double>(m_Ns);
1227 double flop_Wilson = m_foprw->flop_count();
1229 double axpy1 =
static_cast<double>(2 * m_NinF) * vsite;
1230 double scal1 =
static_cast<double>(1 * m_NinF) * vsite;
1232 double flop_Deo = (flop_Wilson + 5.0 * axpy1 + 2.0 * scal1) * vNs;
1234 double flop_Dee = vNs * (7.0 * axpy1 + scal1);
1236 double flop_LU_inv =
1237 2.0 * ((3.0 * axpy1 + scal1) * (vNs - 1.0) + axpy1 + 2.0 * scal1);
1240 if ((mode ==
"Meo") || (mode ==
"Moe")) {
1241 flop = flop_Deo + flop_LU_inv;
1242 }
else if ((mode ==
"Dee_inv") || (mode ==
"Doo_inv")) {
1244 }
else if ((mode ==
"Deo") || (mode ==
"Doe")) {
1246 }
else if ((mode ==
"Dee") || (mode ==
"Doo")) {
1248 }
else if ((mode ==
"D") || (mode ==
"Ddag")) {
1249 flop = 2.0 * (flop_LU_inv + flop_Deo) + vNs * axpy1;
1250 }
else if (mode ==
"DdagD") {
1251 flop = 2.0 * (2.0 * (flop_LU_inv + flop_Deo) + vNs * axpy1);
1253 vout.
crucial(m_vl,
"Error at %s: input mode %s is undefined.\n",
1254 class_name.c_str(), mode.c_str());