18 #if defined USE_GROUP_SU3
20 #elif defined USE_GROUP_SU2
22 #elif defined USE_GROUP_SU_N
29 #ifdef USE_FACTORY_AUTOREGISTER
31 bool init = Fopr_Wilson_eo::register_factory();
59 vout.
crucial(
"Error at %s: unsupported gamma-matrix type: %s\n",
117 if ((
m_Nx % 2) != 0) {
124 if ((
m_Ny % 2) != 0) {
144 = (iy_global + iz_global + it_global) % 2;
241 const std::vector<int> bc)
243 assert(bc.size() ==
m_Ndim);
264 for (
int mu = 0; mu <
m_Ndim; ++mu) {
323 if (ith == 0)
m_mode = mode;
333 }
else if (
m_mode ==
"Ddag") {
335 }
else if (
m_mode ==
"DdagD") {
337 }
else if (
m_mode ==
"DDdag") {
340 vout.
crucial(
"Error at %s: irrelevant mult mode = %s.\n",
352 }
else if (
m_mode ==
"Ddag") {
354 }
else if (
m_mode ==
"DdagD") {
356 }
else if (
m_mode ==
"DDdag") {
359 vout.
crucial(
"Error at %s: irrelevant mult mode = %s.\n",
368 const std::string mode)
372 }
else if (mode ==
"Doe") {
375 vout.
crucial(
"Error at %s: irrelevant mult mode = %s.\n",
384 const std::string mode)
388 }
else if (mode ==
"Doe") {
391 vout.
crucial(
"Error at %s: irrelevant mult mode = %s.\n",
455 assert(w.
nex() == 1);
568 double *vp = v.
ptr(0);
569 const double *wp = w.
ptr(0);
571 int ith, nth, is, ns;
572 set_threadtask(ith, nth, is, ns,
m_Nvol2);
578 for (
int site = is; site < ns; ++site) {
579 mult_gamma5_dirac(&vp[Nvcd * site], &wp[Nvcd * site],
m_Nc);
589 double *vp = v.
ptr(0);
590 const double *wp = w.
ptr(0);
592 int ith, nth, is, ns;
593 set_threadtask(ith, nth, is, ns,
m_Nvol2);
599 for (
int site = is; site < ns; ++site) {
600 mult_gamma5_chiral(&vp[Nvcd * site], &wp[Nvcd * site],
m_Nc);
623 int Nvc2 =
m_Nvc * 2;
628 double *vp = v.
ptr(0);
629 const double *wp = w.
ptr(0);
632 int ith, nth, is, ns;
633 set_threadtask(ith, nth, is, ns,
m_Nvol2);
637 for (
int site = is; site < ns; ++site) {
641 if ((
ix2 == 0) && (keo == 1)) {
642 int iyzt2 =
iyzt / 2;
643 int in = Nvcd * site;
644 int ib1 = Nvc2 * iyzt2;
648 for (
int ivc = 0; ivc <
NVC; ++ivc) {
664 for (
int site = is; site < ns; ++site) {
668 int ix2n =
ix2 + keo;
670 int iv = Nvcd * site;
671 int ig =
m_Ndf * site;
677 for (
int ic = 0; ic <
m_Nc; ++ic) {
686 int iyzt2 =
iyzt / 2;
687 int ib1 = Nvc2 * iyzt2;
689 for (
int ic = 0; ic <
m_Nc; ++ic) {
709 int Nvc2 =
m_Nvc * 2;
714 double *vp = v.
ptr(0);
715 const double *wp = w.
ptr(0);
718 int ith, nth, is, ns;
719 set_threadtask(ith, nth, is, ns,
m_Nvol2);
723 for (
int site = is; site < ns; ++site) {
727 if ((
ix2 ==
m_Nx2 - 1) && (keo == 0)) {
728 int iyzt2 =
iyzt / 2;
729 int in = Nvcd * site;
730 int ig =
m_Ndf * site;
731 int ib1 = Nvc2 * iyzt2;
735 for (
int ic = 0; ic <
m_Nc; ++ic) {
738 int ici = 2 * ic + 1;
757 for (
int site = is; site < ns; ++site) {
761 int ix2n =
ix2 - (1 - keo);
763 int iv = Nvcd * site;
766 int ig =
m_Ndf * nei;
770 for (
int ic = 0; ic <
m_Nc; ++ic) {
772 double wt1r = mult_udagv_r(&up[ic2 + ig],
vt1,
m_Nc);
773 double wt1i = mult_udagv_i(&up[ic2 + ig],
vt1,
m_Nc);
774 double wt2r = mult_udagv_r(&up[ic2 + ig],
vt2,
m_Nc);
775 double wt2i = mult_udagv_i(&up[ic2 + ig],
vt2,
m_Nc);
779 int iyzt2 =
iyzt / 2;
780 int ib1 = Nvc2 * iyzt2;
782 for (
int ic = 0; ic <
m_Nc; ++ic) {
801 int Nvc2 =
m_Nvc * 2;
806 double *vp = v.
ptr(0);
807 const double *wp = w.
ptr(0);
810 int ith, nth, is, ns;
811 set_threadtask(ith, nth, is, ns,
m_Nvol2);
815 for (
int site = is; site < ns; ++site) {
822 int in = Nvcd * site;
823 int ix1 = Nvc2 * ixzt;
827 for (
int ivc = 0; ivc <
NVC; ++ivc) {
843 for (
int site = is; site < ns; ++site) {
850 int iv = Nvcd * site;
851 int ig =
m_Ndf * site;
857 for (
int ic = 0; ic <
m_Nc; ++ic) {
866 int ix1 = Nvc2 * ixzt;
868 for (
int ic = 0; ic <
m_Nc; ++ic) {
888 int Nvc2 =
m_Nvc * 2;
893 double *vp = v.
ptr(0);
894 const double *wp = w.
ptr(0);
897 int ith, nth, is, ns;
898 set_threadtask(ith, nth, is, ns,
m_Nvol2);
902 for (
int site = is; site < ns; ++site) {
909 int in = Nvcd * site;
910 int ig =
m_Ndf * site;
911 int ix1 = Nvc2 * ixzt;
916 for (
int ic = 0; ic <
m_Nc; ++ic) {
919 int ici = 2 * ic + 1;
937 for (
int site = is; site < ns; ++site) {
944 int iv = Nvcd * site;
947 int ig =
m_Ndf * nei;
951 for (
int ic = 0; ic <
m_Nc; ++ic) {
953 double wt1r = mult_udagv_r(&up[ic2 + ig],
vt1,
m_Nc);
954 double wt1i = mult_udagv_i(&up[ic2 + ig],
vt1,
m_Nc);
955 double wt2r = mult_udagv_r(&up[ic2 + ig],
vt2,
m_Nc);
956 double wt2i = mult_udagv_i(&up[ic2 + ig],
vt2,
m_Nc);
960 int ix1 = Nvc2 * ixzt;
962 for (
int ic = 0; ic <
m_Nc; ++ic) {
981 int Nvc2 =
m_Nvc * 2;
986 double *vp = v.
ptr(0);
987 const double *wp = w.
ptr(0);
990 int ith, nth, is, ns;
991 set_threadtask(ith, nth, is, ns,
m_Nvol2);
997 for (
int site = is; site < ns; ++site) {
998 int ixy = site % Nxy;
999 int izt = site / Nxy;
1002 int ixyt =
ixy + Nxy *
it;
1004 int in = Nvcd * site;
1005 int ix1 = Nvc2 * ixyt;
1009 for (
int ivc = 0; ivc <
NVC; ++ivc) {
1025 for (
int site = is; site < ns; ++site) {
1026 int ixy = site % Nxy;
1027 int izt = site / Nxy;
1030 int ixyt =
ixy + Nxy *
it;
1032 int iv = Nvcd * site;
1033 int ig =
m_Ndf * site;
1036 int in = Nvcd * nei;
1039 for (
int ic = 0; ic <
m_Nc; ++ic) {
1041 double wt1r = mult_uv_r(&up[ic2 + ig],
vt1,
m_Nc);
1042 double wt1i = mult_uv_i(&up[ic2 + ig],
vt1,
m_Nc);
1043 double wt2r = mult_uv_r(&up[ic2 + ig],
vt2,
m_Nc);
1044 double wt2i = mult_uv_i(&up[ic2 + ig],
vt2,
m_Nc);
1048 int ix1 = Nvc2 * ixyt;
1050 for (
int ic = 0; ic <
m_Nc; ++ic) {
1070 int Nvc2 =
m_Nvc * 2;
1075 double *vp = v.
ptr(0);
1076 const double *wp = w.
ptr(0);
1079 int ith, nth, is, ns;
1080 set_threadtask(ith, nth, is, ns,
m_Nvol2);
1086 for (
int site = is; site < ns; ++site) {
1087 int ixy = site % Nxy;
1088 int izt = site / Nxy;
1091 int ixyt =
ixy + Nxy *
it;
1093 int in = Nvcd * site;
1094 int ig =
m_Ndf * site;
1095 int ix1 = Nvc2 * ixyt;
1100 for (
int ic = 0; ic <
m_Nc; ++ic) {
1103 int ici = 2 * ic + 1;
1121 for (
int site = is; site < ns; ++site) {
1122 int ixy = site % Nxy;
1123 int izt = site / Nxy;
1126 int ixyt =
ixy + Nxy *
it;
1128 int iv = Nvcd * site;
1131 int ig =
m_Ndf * nei;
1132 int in = Nvcd * nei;
1135 for (
int ic = 0; ic <
m_Nc; ++ic) {
1137 double wt1r = mult_udagv_r(&up[ic2 + ig],
vt1,
m_Nc);
1138 double wt1i = mult_udagv_i(&up[ic2 + ig],
vt1,
m_Nc);
1139 double wt2r = mult_udagv_r(&up[ic2 + ig],
vt2,
m_Nc);
1140 double wt2i = mult_udagv_i(&up[ic2 + ig],
vt2,
m_Nc);
1144 int ix1 = Nvc2 * ixyt;
1146 for (
int ic = 0; ic <
m_Nc; ++ic) {
1162 const Field& w,
const int ieo)
1166 int Nvc2 =
m_Nvc * 2;
1171 double *vp = v.
ptr(0);
1172 const double *wp = w.
ptr(0);
1175 int ith, nth, is, ns;
1176 set_threadtask(ith, nth, is, ns,
m_Nvol2);
1182 for (
int site = is; site < ns; ++site) {
1183 int ixyz = site % Nxyz;
1184 int it = site / Nxyz;
1186 int in = Nvcd * site;
1187 int ix1 = Nvc2 *
ixyz;
1191 for (
int ivc = 0; ivc <
NVC; ++ivc) {
1207 for (
int site = is; site < ns; ++site) {
1208 int ixyz = site % Nxyz;
1209 int it = site / Nxyz;
1210 int nei =
ixyz + Nxyz * (
it + 1);
1211 int iv = Nvcd * site;
1212 int ig =
m_Ndf * site;
1215 int in = Nvcd * nei;
1218 for (
int ic = 0; ic <
m_Nc; ++ic) {
1220 double wt1r = mult_uv_r(&up[ic2 + ig],
vt1,
m_Nc);
1221 double wt1i = mult_uv_i(&up[ic2 + ig],
vt1,
m_Nc);
1222 double wt2r = mult_uv_r(&up[ic2 + ig],
vt2,
m_Nc);
1223 double wt2i = mult_uv_i(&up[ic2 + ig],
vt2,
m_Nc);
1227 int ix1 = Nvc2 *
ixyz;
1229 for (
int ic = 0; ic <
m_Nc; ++ic) {
1246 const Field& w,
const int ieo)
1250 int Nvc2 =
m_Nvc * 2;
1255 double *vp = v.
ptr(0);
1256 const double *wp = w.
ptr(0);
1259 int ith, nth, is, ns;
1260 set_threadtask(ith, nth, is, ns,
m_Nvol2);
1266 for (
int site = is; site < ns; ++site) {
1267 int ixyz = site % Nxyz;
1268 int it = site / Nxyz;
1270 int in = Nvcd * site;
1271 int ig =
m_Ndf * site;
1272 int ix1 = Nvc2 *
ixyz;
1277 for (
int ic = 0; ic <
m_Nc; ++ic) {
1280 int ici = 2 * ic + 1;
1298 for (
int site = is; site < ns; ++site) {
1299 int ixyz = site % Nxyz;
1300 int it = site / Nxyz;
1301 int nei =
ixyz + Nxyz * (
it - 1);
1302 int iv = Nvcd * site;
1305 int ig =
m_Ndf * nei;
1306 int in = Nvcd * nei;
1309 for (
int ic = 0; ic <
m_Nc; ++ic) {
1311 double wt1r = mult_udagv_r(&up[ic2 + ig],
vt1,
m_Nc);
1312 double wt1i = mult_udagv_i(&up[ic2 + ig],
vt1,
m_Nc);
1313 double wt2r = mult_udagv_r(&up[ic2 + ig],
vt2,
m_Nc);
1314 double wt2i = mult_udagv_i(&up[ic2 + ig],
vt2,
m_Nc);
1318 int ix1 = Nvc2 *
ixyz;
1320 for (
int ic = 0; ic <
m_Nc; ++ic) {
1322 int ici = 2 * ic + 1;
1338 const Field& w,
const int ieo)
1342 int Nvc2 =
m_Nvc * 2;
1347 double *vp = v.
ptr(0);
1348 const double *wp = w.
ptr(0);
1351 int ith, nth, is, ns;
1352 set_threadtask(ith, nth, is, ns,
m_Nvol2);
1358 for (
int site = is; site < ns; ++site) {
1359 int ixyz = site % Nxyz;
1360 int it = site / Nxyz;
1362 int in = Nvcd * site;
1363 int ix1 = Nvc2 *
ixyz;
1367 for (
int ivc = 0; ivc <
NVC; ++ivc) {
1383 for (
int site = is; site < ns; ++site) {
1384 int ixyz = site % Nxyz;
1385 int it = site / Nxyz;
1386 int nei =
ixyz + Nxyz * (
it + 1);
1387 int iv = Nvcd * site;
1388 int ig =
m_Ndf * site;
1391 int in = Nvcd * nei;
1394 for (
int ic = 0; ic <
m_Nc; ++ic) {
1396 double wt1r = mult_uv_r(&up[ic2 + ig],
vt1,
m_Nc);
1397 double wt1i = mult_uv_i(&up[ic2 + ig],
vt1,
m_Nc);
1398 double wt2r = mult_uv_r(&up[ic2 + ig],
vt2,
m_Nc);
1399 double wt2i = mult_uv_i(&up[ic2 + ig],
vt2,
m_Nc);
1403 int ix1 = Nvc2 *
ixyz;
1405 for (
int ic = 0; ic <
m_Nc; ++ic) {
1422 const Field& w,
const int ieo)
1426 int Nvc2 =
m_Nvc * 2;
1431 double *vp = v.
ptr(0);
1432 const double *wp = w.
ptr(0);
1435 int ith, nth, is, ns;
1436 set_threadtask(ith, nth, is, ns,
m_Nvol2);
1442 for (
int site = is; site < ns; ++site) {
1443 int ixyz = site % Nxyz;
1444 int it = site / Nxyz;
1446 int in = Nvcd * site;
1447 int ig =
m_Ndf * site;
1448 int ix1 = Nvc2 *
ixyz;
1453 for (
int ic = 0; ic <
m_Nc; ++ic) {
1456 int ici = 2 * ic + 1;
1474 for (
int site = is; site < ns; ++site) {
1475 int ixyz = site % Nxyz;
1476 int it = site / Nxyz;
1477 int nei =
ixyz + Nxyz * (
it - 1);
1478 int iv = Nvcd * site;
1481 int ig =
m_Ndf * nei;
1482 int in = Nvcd * nei;
1485 for (
int ic = 0; ic <
m_Nc; ++ic) {
1487 double wt1r = mult_udagv_r(&up[ic2 + ig],
vt1,
m_Nc);
1488 double wt1i = mult_udagv_i(&up[ic2 + ig],
vt1,
m_Nc);
1489 double wt2r = mult_udagv_r(&up[ic2 + ig],
vt2,
m_Nc);
1490 double wt2i = mult_udagv_i(&up[ic2 + ig],
vt2,
m_Nc);
1494 int ix1 = Nvc2 *
ixyz;
1496 for (
int ic = 0; ic <
m_Nc; ++ic) {
1525 }
else if (
m_repr ==
"Chiral") {
1533 double gflop = flop_site * ((Nvol / 2) * (NPE / 1.0e+9));