6 #ifndef __clover_term_qdp_w_h__
7 #define __clover_term_qdp_w_h__
10 #include "qdp_allocator.h"
23 RComplex<R>
offd[2][2*Nc*Nc-Nc];
37 void read(XMLReader& xml,
const std::string& path, PrimitiveClovTriang& param);
40 void write(XMLWriter& xml,
const std::string& path,
const PrimitiveClovTriang& param);
48 template<
typename T,
typename U>
53 typedef typename WordType<T>::Type_t
REALT;
55 typedef OLattice< PScalar< PScalar< RScalar< typename WordType<T>::Type_t> > > >
LatticeREAL;
56 typedef OScalar< PScalar< PScalar< RScalar<REALT> > > >
RealT;
63 if (
tri !=
nullptr ) {
64 QDP::Allocator::theQDPAllocator::Instance().free(
tri);
142 const multi1d<U>&
getU()
const {
return u;}
162 template<
typename T,
typename U>
165 int nodeSites = Layout::sitesOnNode();
172 template<
typename T,
typename U>
177 #ifndef QDP_IS_QDPJIT
182 fbc = fs->getFermBC();
186 if (fbc.operator->() == 0) {
187 QDPIO::cerr <<
"QDPCloverTerm: error: fbc is null" << std::endl;
192 RealT ff = where(param.anisoParam.anisoP, Real(1) / param.anisoParam.xi_0, Real(1));
193 param.clovCoeffR *= Real(0.5) * ff;
194 param.clovCoeffT *= Real(0.5);
204 RealT ff = where(param.anisoParam.anisoP, param.anisoParam.nu / param.anisoParam.xi_0, Real(1));
205 diag_mass = 1 + (
Nd-1)*ff + param.Mass;
214 choles_done.resize(rb.numSubsets());
215 for(
int i=0;
i < rb.numSubsets();
i++) {
223 int nodeSites = Layout::sitesOnNode();
225 #pragma omp parallel for
226 for(
int site=0; site < nodeSites;++site) {
228 for(
int d=0;
d < 6; ++
d) {
231 for(
int od=0; od < 15; ++od) {
244 template<
typename T,
typename U>
248 #ifndef QDP_IS_QDPJIT
254 fbc = fs->getFermBC();
258 if (fbc.operator->() == 0) {
259 QDPIO::cerr <<
"QDPCloverTerm: error: fbc is null" << std::endl;
264 RealT ff = where(param.anisoParam.anisoP, Real(1) / param.anisoParam.xi_0, Real(1));
265 param.clovCoeffR *=
RealT(0.5) * ff;
266 param.clovCoeffT *=
RealT(0.5);
276 RealT ff = where(param.anisoParam.anisoP, param.anisoParam.nu / param.anisoParam.xi_0, Real(1));
277 diag_mass = 1 + (
Nd-1)*ff + param.Mass;
283 makeClov(f, diag_mass);
286 choles_done.resize(rb.numSubsets());
287 for(
int i=0;
i < rb.numSubsets();
i++) {
288 choles_done[
i] =
false;
380 namespace QDPCloverEnv {
384 typedef typename WordType<U>::Type_t
REALT;
385 typedef OScalar< PScalar< PScalar< RScalar<REALT> > > >
RealT;
402 #ifndef QDP_IS_QDPJIT
406 const RealT& diag_mass =
a->diag_mass;
416 for(
int site = lo; site < hi; ++site) {
419 for(
int jj = 0; jj < 2; jj++) {
421 for(
int ii = 0; ii < 2*Nc; ii++) {
423 tri[site].
diag[jj][ii] = diag_mass.elem().elem().elem();
429 RComplex<REALT> E_minus;
430 RComplex<REALT> B_minus;
431 RComplex<REALT> ctmp_0;
432 RComplex<REALT> ctmp_1;
433 RScalar<REALT> rtmp_0;
434 RScalar<REALT> rtmp_1;
436 for(
int i = 0;
i < Nc; ++
i) {
440 ctmp_0 =
f5.elem(site).elem().elem(
i,
i);
441 ctmp_0 -= f0.elem(site).elem().elem(
i,
i);
442 rtmp_0 = imag(ctmp_0);
443 tri[site].
diag[0][
i] += rtmp_0;
447 tri[site].
diag[0][
i+Nc] -= rtmp_0;
451 ctmp_1 =
f5.elem(site).elem().elem(
i,
i);
452 ctmp_1 += f0.elem(site).elem().elem(
i,
i);
453 rtmp_1 = imag(ctmp_1);
454 tri[site].
diag[1][
i] -= rtmp_1;
458 tri[site].
diag[1][
i+Nc] += rtmp_1;
463 for(
int i = 1;
i < Nc; ++
i) {
465 for(
int j = 0;
j <
i; ++
j) {
468 int elem_tmp = (
i+Nc)*(
i+Nc-1)/2 +
j+Nc;
472 ctmp_0 = f0.elem(site).elem().elem(
i,
j);
473 ctmp_0 -=
f5.elem(site).elem().elem(
i,
j);
482 ctmp_1 =
f5.elem(site).elem().elem(
i,
j);
483 ctmp_1 += f0.elem(site).elem().elem(
i,
j);
493 for(
int i = 0;
i < Nc; ++
i) {
495 for(
int j = 0;
j < Nc; ++
j) {
504 E_minus = timesI(
f2.elem(site).elem().elem(
i,
j));
505 E_minus +=
f4.elem(site).elem().elem(
i,
j);
509 B_minus = timesI(
f3.elem(site).elem().elem(
i,
j));
510 B_minus -=
f1.elem(site).elem().elem(
i,
j);
525 template<
typename T,
typename U>
531 QDPIO::cerr << __func__ <<
": expecting Nd==4" << std::endl;
536 QDPIO::cerr << __func__ <<
": expecting Ns==4" << std::endl;
540 U f0 = f[0] * getCloverCoeff(0,1);
541 U f1 = f[1] * getCloverCoeff(0,2);
542 U f2 = f[2] * getCloverCoeff(0,3);
543 U f3 = f[3] * getCloverCoeff(1,2);
544 U f4 = f[4] * getCloverCoeff(1,3);
545 U f5 = f[5] * getCloverCoeff(2,3);
547 const int nodeSites = QDP::Layout::sitesOnNode();
549 dispatch_to_threads(nodeSites, arg, QDPCloverEnv::makeClovSiteLoop<U>);
560 template<
typename T,
typename U>
568 ldagdlinv(tr_log_diag_,
cb);
580 template<
typename T,
typename U>
583 #ifndef QDP_IS_QDPJIT
586 if( choles_done[
cb] ==
false )
588 QDPIO::cout << __func__ <<
": Error: you have not done the Cholesky.on this operator on this subset" << std::endl;
589 QDPIO::cout <<
"You sure you should not be asking invclov?" << std::endl;
600 return sum(tr_log_diag_, rb[
cb]);
608 namespace QDPCloverEnv {
611 typedef typename WordType<U>::Type_t
REALT;
612 typedef OScalar< PScalar< PScalar< RScalar<REALT> > > >
RealT;
627 LatticeRealT& tr_log_diag =
a->tr_log_diag;
632 RScalar<REALT> zip=0;
636 for(
int ssite=lo; ssite < hi; ++ssite) {
638 int site = rb[
cb].siteTable()[ssite];
640 int site_neg_logdet=0;
645 RScalar<REALT> inv_d[6] QDP_ALIGN16;
646 RComplex<REALT> inv_offd[15] QDP_ALIGN16;
647 RComplex<REALT> v[6] QDP_ALIGN16;
648 RScalar<REALT> diag_g[6] QDP_ALIGN16;
651 for(
int i=0;
i < N;
i++) {
655 for(
int i=0;
i < 15;
i++) {
659 for(
int j=0;
j < N; ++
j) {
668 for(
int i=0;
i <
j;
i++) {
671 RComplex<REALT> A_ii = cmplx( inv_d[
i], zip );
683 v[
j] = cmplx(inv_d[
j],zip);
685 for(
int k=0;
k <
j;
k++) {
686 int elem_jk =
j*(
j-1)/2 +
k;
687 v[
j] -= inv_offd[elem_jk]*v[
k];
696 inv_d[
j] = real( v[
j] );
710 for(
int k=
j+1;
k < N;
k++) {
711 int elem_kj =
k*(
k-1)/2 +
j;
712 for(
int l=0;
l <
j;
l++) {
713 int elem_kl =
k*(
k-1)/2 +
l;
714 inv_offd[elem_kj] -= inv_offd[elem_kl] * v[
l];
716 inv_offd[elem_kj] /= v[
j];
722 one.elem() = (REALT)1;
724 for(
int i=0;
i < N;
i++) {
725 diag_g[
i] =
one/inv_d[
i];
731 tr_log_diag.elem(site).elem().elem().elem() += log(fabs(inv_d[
i].elem()));
734 if( inv_d[
i].elem() < 0 ) {
753 for(
int k = 0;
k < N; ++
k) {
755 for(
int i = 0;
i <
k; ++
i) {
762 v[
k] = cmplx(diag_g[
k],zip);
764 for(
int i =
k+1;
i < N; ++
i) {
767 for(
int j =
k;
j <
i; ++
j) {
783 for(
int i = N-2; (int)
i >= (
int)
k; --
i) {
784 for(
int j =
i+1;
j < N; ++
j) {
792 inv_d[
k] = real(v[
k]);
793 for(
int i =
k+1;
i < N; ++
i) {
795 int elem_ik =
i*(
i-1)/2+
k;
796 inv_offd[elem_ik] = v[
i];
802 for(
int i=0;
i < N;
i++) {
805 for(
int i=0;
i < 15;
i++) {
810 if( site_neg_logdet != 0 ) {
812 std::cout <<
"WARNING: found " << site_neg_logdet
813 <<
" negative eigenvalues in Clover DET at site: " << site << std::endl;
821 template<
typename T,
typename U>
824 #ifndef QDP_IS_QDPJIT
829 QDPIO::cerr << __func__ <<
": Matrix is too small" << std::endl;
834 tr_log_diag[rb[
cb]] =
zero;
837 int num_site_table = rb[
cb].numSiteTable();
838 dispatch_to_threads(num_site_table,
a, QDPCloverEnv::LDagDLInvSiteLoop<U>);
842 choles_done[
cb] =
true;
859 namespace QDPCloverEnv {
869 LatticeRealT& tr_log_diag =
a->tr_log_diag;
877 for(
int ssite=lo; ssite < hi; ++ssite) {
878 int site = rb[
cb].siteTable()[ssite];
882 multi1d< RScalar<REALT> > diag_g(
n);
883 multi1d< RComplex<REALT> > v1(
n);
887 RScalar<REALT> lrtmp;
892 for(
int s = 0;
s < 2; ++
s) {
897 for(
int j = 0;
j <
n; ++
j) {
901 v1[
j] = cmplx(tri[site].diag[
s][
j],
zero);
905 for(
int i =
j+1;
i <
n; ++
i) {
912 for(
int k = 0;
k <
j; ++
k) {
914 int elem_ik = elem_jk;
916 for(
int i =
j;
i <
n; ++
i) {
918 v1[
i] -= adj(invcl.
offd[
s][elem_jk]) * invcl.
offd[
s][elem_ik];
925 diag_g[
j] = real(v1[
j]);
930 if ( diag_g[
j].elem() > 0 ) {
932 lrtmp = log(diag_g[
j]);
937 std::cerr <<
"Clover term has negative diagonal element: "
938 <<
"diag_g[" <<
j <<
"]= " << diag_g[
j]
939 <<
" at site: " << site << std::endl;
943 tr_log_diag.elem(site).elem().elem() += lrtmp;
945 diag_g[
j] = sqrt(diag_g[
j]);
946 diag_g[
j] =
one / diag_g[
j];
950 for(
int i =
j+1;
i <
n; ++
i) {
958 for(
int k = 0;
k <
n; ++
k) {
960 for(
int i = 0;
i <
k; ++
i)
964 v1[
k] = cmplx(diag_g[
k],
zero);
966 for(
int i =
k+1;
i <
n; ++
i) {
970 for(
int j =
k;
j <
i; ++
j) {
976 v1[
i] =
sum * diag_g[
i];
980 v1[
n-1] = v1[
n-1] * diag_g[
n-1];
982 for(
int i =
n-2; (int)
i >= (
int)
k; --
i) {
987 for(
int j =
i+1;
j <
n; ++
j) {
992 v1[
i] =
sum * diag_g[
i];
996 invcl.
diag[
s][
k] = real(v1[
k]);
998 int elem_ik = ((
k+1)*
k)/2+
k;
1000 for(
int i =
k+1;
i <
n; ++
i) {
1002 invcl.
offd[
s][elem_ik] = v1[
i];
1016 template<
typename T,
typename U>
1019 #ifndef QDP_IS_QDPJIT
1024 QDPIO::cerr << __func__ <<
": Matrix is too small" << std::endl;
1030 dispatch_to_threads(rb[
cb].numSiteTable(),
a, QDPCloverEnv::cholesSiteLoop<U>);
1032 choles_done[
cb] =
true;
1056 template<
typename T,
typename U>
1060 #ifndef QDP_IS_QDPJIT
1065 QDPIO::cerr << __func__ <<
": CloverTerm::applySite requires Ns==4" << std::endl;
1071 RComplex<REALT>* cchi = (RComplex<REALT>*)&(
chi.elem(site).elem(0).elem(0));
1072 const RComplex<REALT>* ppsi = (
const RComplex<REALT>*)&(
psi.elem(site).elem(0).elem(0));
1075 cchi[ 0] = tri[site].diag[0][ 0] * ppsi[ 0]
1076 + conj(tri[site].offd[0][ 0]) * ppsi[ 1]
1077 + conj(tri[site].offd[0][ 1]) * ppsi[ 2]
1078 + conj(tri[site].offd[0][ 3]) * ppsi[ 3]
1079 + conj(tri[site].offd[0][ 6]) * ppsi[ 4]
1080 + conj(tri[site].offd[0][10]) * ppsi[ 5];
1082 cchi[ 1] = tri[site].diag[0][ 1] * ppsi[ 1]
1083 + tri[site].offd[0][ 0] * ppsi[ 0]
1084 + conj(tri[site].offd[0][ 2]) * ppsi[ 2]
1085 + conj(tri[site].offd[0][ 4]) * ppsi[ 3]
1086 + conj(tri[site].offd[0][ 7]) * ppsi[ 4]
1087 + conj(tri[site].offd[0][11]) * ppsi[ 5];
1089 cchi[ 2] = tri[site].diag[0][ 2] * ppsi[ 2]
1090 + tri[site].offd[0][ 1] * ppsi[ 0]
1091 + tri[site].offd[0][ 2] * ppsi[ 1]
1092 + conj(tri[site].offd[0][ 5]) * ppsi[ 3]
1093 + conj(tri[site].offd[0][ 8]) * ppsi[ 4]
1094 + conj(tri[site].offd[0][12]) * ppsi[ 5];
1096 cchi[ 3] = tri[site].diag[0][ 3] * ppsi[ 3]
1097 + tri[site].offd[0][ 3] * ppsi[ 0]
1098 + tri[site].offd[0][ 4] * ppsi[ 1]
1099 + tri[site].offd[0][ 5] * ppsi[ 2]
1100 + conj(tri[site].offd[0][ 9]) * ppsi[ 4]
1101 + conj(tri[site].offd[0][13]) * ppsi[ 5];
1103 cchi[ 4] = tri[site].diag[0][ 4] * ppsi[ 4]
1104 + tri[site].offd[0][ 6] * ppsi[ 0]
1105 + tri[site].offd[0][ 7] * ppsi[ 1]
1106 + tri[site].offd[0][ 8] * ppsi[ 2]
1107 + tri[site].offd[0][ 9] * ppsi[ 3]
1108 + conj(tri[site].offd[0][14]) * ppsi[ 5];
1110 cchi[ 5] = tri[site].diag[0][ 5] * ppsi[ 5]
1111 + tri[site].offd[0][10] * ppsi[ 0]
1112 + tri[site].offd[0][11] * ppsi[ 1]
1113 + tri[site].offd[0][12] * ppsi[ 2]
1114 + tri[site].offd[0][13] * ppsi[ 3]
1115 + tri[site].offd[0][14] * ppsi[ 4];
1117 cchi[ 6] = tri[site].diag[1][ 0] * ppsi[ 6]
1118 + conj(tri[site].offd[1][ 0]) * ppsi[ 7]
1119 + conj(tri[site].offd[1][ 1]) * ppsi[ 8]
1120 + conj(tri[site].offd[1][ 3]) * ppsi[ 9]
1121 + conj(tri[site].offd[1][ 6]) * ppsi[10]
1122 + conj(tri[site].offd[1][10]) * ppsi[11];
1124 cchi[ 7] = tri[site].diag[1][ 1] * ppsi[ 7]
1125 + tri[site].offd[1][ 0] * ppsi[ 6]
1126 + conj(tri[site].offd[1][ 2]) * ppsi[ 8]
1127 + conj(tri[site].offd[1][ 4]) * ppsi[ 9]
1128 + conj(tri[site].offd[1][ 7]) * ppsi[10]
1129 + conj(tri[site].offd[1][11]) * ppsi[11];
1131 cchi[ 8] = tri[site].diag[1][ 2] * ppsi[ 8]
1132 + tri[site].offd[1][ 1] * ppsi[ 6]
1133 + tri[site].offd[1][ 2] * ppsi[ 7]
1134 + conj(tri[site].offd[1][ 5]) * ppsi[ 9]
1135 + conj(tri[site].offd[1][ 8]) * ppsi[10]
1136 + conj(tri[site].offd[1][12]) * ppsi[11];
1138 cchi[ 9] = tri[site].diag[1][ 3] * ppsi[ 9]
1139 + tri[site].offd[1][ 3] * ppsi[ 6]
1140 + tri[site].offd[1][ 4] * ppsi[ 7]
1141 + tri[site].offd[1][ 5] * ppsi[ 8]
1142 + conj(tri[site].offd[1][ 9]) * ppsi[10]
1143 + conj(tri[site].offd[1][13]) * ppsi[11];
1145 cchi[10] = tri[site].diag[1][ 4] * ppsi[10]
1146 + tri[site].offd[1][ 6] * ppsi[ 6]
1147 + tri[site].offd[1][ 7] * ppsi[ 7]
1148 + tri[site].offd[1][ 8] * ppsi[ 8]
1149 + tri[site].offd[1][ 9] * ppsi[ 9]
1150 + conj(tri[site].offd[1][14]) * ppsi[11];
1152 cchi[11] = tri[site].diag[1][ 5] * ppsi[11]
1153 + tri[site].offd[1][10] * ppsi[ 6]
1154 + tri[site].offd[1][11] * ppsi[ 7]
1155 + tri[site].offd[1][12] * ppsi[ 8]
1156 + tri[site].offd[1][13] * ppsi[ 9]
1157 + tri[site].offd[1][14] * ppsi[10];
1200 namespace QDPCloverEnv {
1201 template<
typename U>
1203 typedef typename WordType<U>::Type_t
REALT;
1211 template<
typename U>
1215 typedef typename WordType<U>::Type_t REALT;
1221 for(
int ssite=lo; ssite < hi; ++ssite) {
1223 int site = rb[
cb].siteTable()[ssite];
1234 RComplex<REALT> lctmp0;
1235 RScalar<REALT> lr_zero0;
1236 RScalar<REALT> lrtmp0;
1240 for(
int i0 = 0; i0 < Nc; ++i0) {
1242 lrtmp0 = tri[site].
diag[0][i0];
1243 lrtmp0 += tri[site].
diag[0][i0+Nc];
1244 lrtmp0 += tri[site].
diag[1][i0];
1245 lrtmp0 += tri[site].
diag[1][i0+Nc];
1246 B.elem(site).elem().elem(i0,i0) = cmplx(lrtmp0,lr_zero0);
1251 for(
int i0 = 1; i0 < Nc; ++i0) {
1253 int elem_ijb0 = (i0+Nc)*(i0+Nc-1)/2 + Nc;
1255 for(
int j0 = 0; j0 < i0; ++j0) {
1257 lctmp0 = tri[site].
offd[0][elem_ij0];
1258 lctmp0 += tri[site].
offd[0][elem_ijb0];
1259 lctmp0 += tri[site].
offd[1][elem_ij0];
1260 lctmp0 += tri[site].
offd[1][elem_ijb0];
1262 B.elem(site).elem().elem(j0,i0) = lctmp0;
1263 B.elem(site).elem().elem(i0,j0) = adj(lctmp0);
1282 RComplex<REALT> lctmp3;
1283 RScalar<REALT> lr_zero3;
1284 RScalar<REALT> lrtmp3;
1288 for(
int i3 = 0; i3 < Nc; ++i3) {
1290 lrtmp3 = tri[site].
diag[0][i3+Nc];
1291 lrtmp3 -= tri[site].
diag[0][i3];
1292 lrtmp3 -= tri[site].
diag[1][i3];
1293 lrtmp3 += tri[site].
diag[1][i3+Nc];
1294 B.elem(site).elem().elem(i3,i3) = cmplx(lr_zero3,lrtmp3);
1299 for(
int i3 = 1; i3 < Nc; ++i3) {
1301 int elem_ijb3 = (i3+Nc)*(i3+Nc-1)/2 + Nc;
1303 for(
int j3 = 0; j3 < i3; ++j3) {
1305 lctmp3 = tri[site].
offd[0][elem_ijb3];
1306 lctmp3 -= tri[site].
offd[0][elem_ij3];
1307 lctmp3 -= tri[site].
offd[1][elem_ij3];
1308 lctmp3 += tri[site].
offd[1][elem_ijb3];
1310 B.elem(site).elem().elem(j3,i3) = timesI(adj(lctmp3));
1311 B.elem(site).elem().elem(i3,j3) = timesI(lctmp3);
1328 RComplex<REALT> lctmp5;
1329 RScalar<REALT> lrtmp5;
1331 for(
int i5 = 0; i5 < Nc; ++i5) {
1333 int elem_ij5 = (i5+Nc)*(i5+Nc-1)/2;
1335 for(
int j5 = 0; j5 < Nc; ++j5) {
1337 int elem_ji5 = (j5+Nc)*(j5+Nc-1)/2 + i5;
1340 lctmp5 = adj(tri[site].offd[0][elem_ji5]);
1341 lctmp5 -= tri[site].
offd[0][elem_ij5];
1342 lctmp5 += adj(tri[site].offd[1][elem_ji5]);
1343 lctmp5 -= tri[site].
offd[1][elem_ij5];
1346 B.elem(site).elem().elem(i5,j5) = lctmp5;
1361 RComplex<REALT> lctmp6;
1362 RScalar<REALT> lrtmp6;
1364 for(
int i6 = 0; i6 < Nc; ++i6) {
1366 int elem_ij6 = (i6+Nc)*(i6+Nc-1)/2;
1368 for(
int j6 = 0; j6 < Nc; ++j6) {
1370 int elem_ji6 = (j6+Nc)*(j6+Nc-1)/2 + i6;
1372 lctmp6 = adj(tri[site].offd[0][elem_ji6]);
1373 lctmp6 += tri[site].
offd[0][elem_ij6];
1374 lctmp6 += adj(tri[site].offd[1][elem_ji6]);
1375 lctmp6 += tri[site].
offd[1][elem_ij6];
1377 B.elem(site).elem().elem(i6,j6) = timesMinusI(lctmp6);
1392 RComplex<REALT> lctmp9;
1393 RScalar<REALT> lrtmp9;
1395 for(
int i9 = 0; i9 < Nc; ++i9) {
1397 int elem_ij9 = (i9+Nc)*(i9+Nc-1)/2;
1399 for(
int j9 = 0; j9 < Nc; ++j9) {
1401 int elem_ji9 = (j9+Nc)*(j9+Nc-1)/2 + i9;
1403 lctmp9 = adj(tri[site].offd[0][elem_ji9]);
1404 lctmp9 += tri[site].
offd[0][elem_ij9];
1405 lctmp9 -= adj(tri[site].offd[1][elem_ji9]);
1406 lctmp9 -= tri[site].
offd[1][elem_ij9];
1408 B.elem(site).elem().elem(i9,j9) = timesI(lctmp9);
1422 RComplex<REALT> lctmp10;
1423 RScalar<REALT> lrtmp10;
1425 for(
int i10 = 0; i10 < Nc; ++i10) {
1427 int elem_ij10 = (i10+Nc)*(i10+Nc-1)/2;
1429 for(
int j10 = 0; j10 < Nc; ++j10) {
1431 int elem_ji10 = (j10+Nc)*(j10+Nc-1)/2 + i10;
1433 lctmp10 = adj(tri[site].offd[0][elem_ji10]);
1434 lctmp10 -= tri[site].
offd[0][elem_ij10];
1435 lctmp10 -= adj(tri[site].offd[1][elem_ji10]);
1436 lctmp10 += tri[site].
offd[1][elem_ij10];
1438 B.elem(site).elem().elem(i10,j10) = lctmp10;
1454 RComplex<REALT> lctmp12;
1455 RScalar<REALT> lr_zero12;
1456 RScalar<REALT> lrtmp12;
1460 for(
int i12 = 0; i12 < Nc; ++i12) {
1462 lrtmp12 = tri[site].
diag[0][i12];
1463 lrtmp12 -= tri[site].
diag[0][i12+Nc];
1464 lrtmp12 -= tri[site].
diag[1][i12];
1465 lrtmp12 += tri[site].
diag[1][i12+Nc];
1466 B.elem(site).elem().elem(i12,i12) = cmplx(lr_zero12,lrtmp12);
1471 for(
int i12 = 1; i12 < Nc; ++i12) {
1473 int elem_ijb12 = (i12+Nc)*(i12+Nc-1)/2 + Nc;
1475 for(
int j12 = 0; j12 < i12; ++j12) {
1477 lctmp12 = tri[site].
offd[0][elem_ij12];
1478 lctmp12 -= tri[site].
offd[0][elem_ijb12];
1479 lctmp12 -= tri[site].
offd[1][elem_ij12];
1480 lctmp12 += tri[site].
offd[1][elem_ijb12];
1482 B.elem(site).elem().elem(i12,j12) = timesI(lctmp12);
1483 B.elem(site).elem().elem(j12,i12) = timesI(adj(lctmp12));
1493 QDPIO::cout << __func__ <<
": invalid Gamma matrix int" << std::endl;
1502 template<
typename T,
typename U>
1505 #ifndef QDP_IS_QDPJIT
1510 if ( mat < 0 || mat > 15 )
1512 QDPIO::cerr << __func__ <<
": Gamma out of range: mat = " << mat << std::endl;
1517 dispatch_to_threads(rb[
cb].numSiteTable(),
a,
1518 QDPCloverEnv::triaCntrSiteLoop<U>);
1525 template<
typename T,
typename U>
1531 if( param.anisoParam.anisoP ) {
1532 if (
mu==param.anisoParam.t_dir ||
nu == param.anisoParam.t_dir) {
1533 return param.clovCoeffT;
1537 return param.clovCoeffR;
1543 return param.clovCoeffR;
1550 namespace QDPCloverEnv {
1552 template<
typename T>
1554 typedef typename WordType<T>::Type_t
REALT;
1562 template<
typename T>
1573 typedef typename WordType<T>::Type_t REALT;
1583 const int* tab = rb[
cb].siteTable().slice();
1586 for(
int ssite=lo; ssite < hi; ++ssite) {
1588 int site = tab[ssite];
1591 RComplex<REALT>* cchi = (RComplex<REALT>*)&(
chi.elem(site).elem(0).elem(0));
1592 const RComplex<REALT>* ppsi = (
const RComplex<REALT>*)&(
psi.elem(site).elem(0).elem(0));
1594 std::complex<REALT>* cchi = (std::complex<REALT>*)&(
chi.elem(site).elem(0).elem(0));
1595 std::complex<REALT>* ppsi = (std::complex<REALT>*)&(
psi.elem(site).elem(0).elem(0));
1596 const REALT*
const diag0 = (
const REALT*
const)(&(tri[site].diag[0][0].elem()));
1597 const REALT*
const diag1 = (
const REALT*
const)(&(tri[site].diag[1][0].elem()));
1598 const std::complex<REALT>*
const offdiag0 =
1599 (
const std::complex<REALT>*
const)(&(tri[site].offd[0][0].real()));
1600 const std::complex<REALT>*
const offdiag1 =
1601 (
const std::complex<REALT>*
const)(&(tri[site].offd[1][0].real()));
1605 #warning "Using unrolled clover term"
1607 for(
int i = 0;
i <
n; ++
i) {
1609 cchi[0*
n+
i] = tri[site].
diag[0][
i] * ppsi[0*
n+
i];
1610 cchi[1*
n+
i] = tri[site].
diag[1][
i] * ppsi[1*
n+
i];
1612 cchi[0*
n+
i] = diag0[
i] * ppsi[0*
n+
i];
1613 cchi[1*
n+
i] = diag1[
i] * ppsi[1*
n+
i];
1619 for(
int i = 0;
i <
n; ++
i) {
1621 for(
int j = 0;
j <
i;
j++) {
1623 cchi[0*
n+
i] += tri[site].
offd[0][kij] * ppsi[0*
n+
j];
1624 cchi[0*
n+
j] += conj(tri[site].offd[0][kij]) * ppsi[0*
n+
i];
1625 cchi[1*
n+
i] += tri[site].
offd[1][kij] * ppsi[1*
n+
j];
1626 cchi[1*
n+
j] += conj(tri[site].offd[1][kij]) * ppsi[1*
n+
i];
1628 cchi[0*
n+
i] += offdiag0[kij] * ppsi[0*
n+
j];
1629 cchi[0*
n+
j] += conj(offdiag0[kij]) * ppsi[0*
n+
i];
1630 cchi[1*
n+
i] += offdiag1[kij] * ppsi[1*
n+
j];
1631 cchi[1*
n+
j] += conj(offdiag1[kij]) * ppsi[1*
n+
i];
1638 #warning "Using unrolled clover term - version 1"
1640 cchi[ 0] = tri[site].
diag[0][0] * ppsi[ 0];
1641 cchi[ 1] = tri[site].
diag[0][1] * ppsi[ 1];
1642 cchi[ 2] = tri[site].
diag[0][2] * ppsi[ 2];
1643 cchi[ 3] = tri[site].
diag[0][3] * ppsi[ 3];
1644 cchi[ 4] = tri[site].
diag[0][4] * ppsi[ 4];
1645 cchi[ 5] = tri[site].
diag[0][5] * ppsi[ 5];
1646 cchi[ 6] = tri[site].
diag[1][0] * ppsi[ 6];
1647 cchi[ 7] = tri[site].
diag[1][1] * ppsi[ 7];
1648 cchi[ 8] = tri[site].
diag[1][2] * ppsi[ 8];
1649 cchi[ 9] = tri[site].
diag[1][3] * ppsi[ 9];
1650 cchi[10] = tri[site].
diag[1][4] * ppsi[10];
1651 cchi[11] = tri[site].
diag[1][5] * ppsi[11];
1654 cchi[ 1] += tri[site].
offd[0][ 0] * ppsi[ 0];
1655 cchi[ 2] += tri[site].
offd[0][ 1] * ppsi[ 0];
1656 cchi[ 2] += tri[site].
offd[0][ 2] * ppsi[ 1];
1657 cchi[ 3] += tri[site].
offd[0][ 3] * ppsi[ 0];
1658 cchi[ 3] += tri[site].
offd[0][ 4] * ppsi[ 1];
1659 cchi[ 3] += tri[site].
offd[0][ 5] * ppsi[ 2];
1660 cchi[ 4] += tri[site].
offd[0][ 6] * ppsi[ 0];
1661 cchi[ 4] += tri[site].
offd[0][ 7] * ppsi[ 1];
1662 cchi[ 4] += tri[site].
offd[0][ 8] * ppsi[ 2];
1663 cchi[ 4] += tri[site].
offd[0][ 9] * ppsi[ 3];
1664 cchi[ 5] += tri[site].
offd[0][10] * ppsi[ 0];
1665 cchi[ 5] += tri[site].
offd[0][11] * ppsi[ 1];
1666 cchi[ 5] += tri[site].
offd[0][12] * ppsi[ 2];
1667 cchi[ 5] += tri[site].
offd[0][13] * ppsi[ 3];
1668 cchi[ 5] += tri[site].
offd[0][14] * ppsi[ 4];
1671 cchi[ 0] += conj(tri[site].offd[0][ 0]) * ppsi[ 1];
1672 cchi[ 0] += conj(tri[site].offd[0][ 1]) * ppsi[ 2];
1673 cchi[ 1] += conj(tri[site].offd[0][ 2]) * ppsi[ 2];
1674 cchi[ 0] += conj(tri[site].offd[0][ 3]) * ppsi[ 3];
1675 cchi[ 1] += conj(tri[site].offd[0][ 4]) * ppsi[ 3];
1676 cchi[ 2] += conj(tri[site].offd[0][ 5]) * ppsi[ 3];
1677 cchi[ 0] += conj(tri[site].offd[0][ 6]) * ppsi[ 4];
1678 cchi[ 1] += conj(tri[site].offd[0][ 7]) * ppsi[ 4];
1679 cchi[ 2] += conj(tri[site].offd[0][ 8]) * ppsi[ 4];
1680 cchi[ 3] += conj(tri[site].offd[0][ 9]) * ppsi[ 4];
1681 cchi[ 0] += conj(tri[site].offd[0][10]) * ppsi[ 5];
1682 cchi[ 1] += conj(tri[site].offd[0][11]) * ppsi[ 5];
1683 cchi[ 2] += conj(tri[site].offd[0][12]) * ppsi[ 5];
1684 cchi[ 3] += conj(tri[site].offd[0][13]) * ppsi[ 5];
1685 cchi[ 4] += conj(tri[site].offd[0][14]) * ppsi[ 5];
1688 cchi[ 7] += tri[site].
offd[1][ 0] * ppsi[ 6];
1689 cchi[ 8] += tri[site].
offd[1][ 1] * ppsi[ 6];
1690 cchi[ 8] += tri[site].
offd[1][ 2] * ppsi[ 7];
1691 cchi[ 9] += tri[site].
offd[1][ 3] * ppsi[ 6];
1692 cchi[ 9] += tri[site].
offd[1][ 4] * ppsi[ 7];
1693 cchi[ 9] += tri[site].
offd[1][ 5] * ppsi[ 8];
1694 cchi[10] += tri[site].
offd[1][ 6] * ppsi[ 6];
1695 cchi[10] += tri[site].
offd[1][ 7] * ppsi[ 7];
1696 cchi[10] += tri[site].
offd[1][ 8] * ppsi[ 8];
1697 cchi[10] += tri[site].
offd[1][ 9] * ppsi[ 9];
1698 cchi[11] += tri[site].
offd[1][10] * ppsi[ 6];
1699 cchi[11] += tri[site].
offd[1][11] * ppsi[ 7];
1700 cchi[11] += tri[site].
offd[1][12] * ppsi[ 8];
1701 cchi[11] += tri[site].
offd[1][13] * ppsi[ 9];
1702 cchi[11] += tri[site].
offd[1][14] * ppsi[10];
1705 cchi[ 6] += conj(tri[site].offd[1][ 0]) * ppsi[ 7];
1706 cchi[ 6] += conj(tri[site].offd[1][ 1]) * ppsi[ 8];
1707 cchi[ 7] += conj(tri[site].offd[1][ 2]) * ppsi[ 8];
1708 cchi[ 6] += conj(tri[site].offd[1][ 3]) * ppsi[ 9];
1709 cchi[ 7] += conj(tri[site].offd[1][ 4]) * ppsi[ 9];
1710 cchi[ 8] += conj(tri[site].offd[1][ 5]) * ppsi[ 9];
1711 cchi[ 6] += conj(tri[site].offd[1][ 6]) * ppsi[10];
1712 cchi[ 7] += conj(tri[site].offd[1][ 7]) * ppsi[10];
1713 cchi[ 8] += conj(tri[site].offd[1][ 8]) * ppsi[10];
1714 cchi[ 9] += conj(tri[site].offd[1][ 9]) * ppsi[10];
1715 cchi[ 6] += conj(tri[site].offd[1][10]) * ppsi[11];
1716 cchi[ 7] += conj(tri[site].offd[1][11]) * ppsi[11];
1717 cchi[ 8] += conj(tri[site].offd[1][12]) * ppsi[11];
1718 cchi[ 9] += conj(tri[site].offd[1][13]) * ppsi[11];
1719 cchi[10] += conj(tri[site].offd[1][14]) * ppsi[11];
1721 #warning "Using unrolled clover term - version 2"
1723 cchi[ 0] = tri[site].
diag[0][ 0] * ppsi[ 0];
1724 cchi[ 0] += conj(tri[site].offd[0][ 0]) * ppsi[ 1];
1725 cchi[ 0] += conj(tri[site].offd[0][ 1]) * ppsi[ 2];
1726 cchi[ 0] += conj(tri[site].offd[0][ 3]) * ppsi[ 3];
1727 cchi[ 0] += conj(tri[site].offd[0][ 6]) * ppsi[ 4];
1728 cchi[ 0] += conj(tri[site].offd[0][10]) * ppsi[ 5];
1730 cchi[ 1] = tri[site].
diag[0][ 1] * ppsi[ 1];
1731 cchi[ 1] += tri[site].
offd[0][ 0] * ppsi[ 0];
1732 cchi[ 1] += conj(tri[site].offd[0][ 2]) * ppsi[ 2];
1733 cchi[ 1] += conj(tri[site].offd[0][ 4]) * ppsi[ 3];
1734 cchi[ 1] += conj(tri[site].offd[0][ 7]) * ppsi[ 4];
1735 cchi[ 1] += conj(tri[site].offd[0][11]) * ppsi[ 5];
1737 cchi[ 2] = tri[site].
diag[0][ 2] * ppsi[ 2];
1738 cchi[ 2] += tri[site].
offd[0][ 1] * ppsi[ 0];
1739 cchi[ 2] += tri[site].
offd[0][ 2] * ppsi[ 1];
1740 cchi[ 2] += conj(tri[site].offd[0][ 5]) * ppsi[ 3];
1741 cchi[ 2] += conj(tri[site].offd[0][ 8]) * ppsi[ 4];
1742 cchi[ 2] += conj(tri[site].offd[0][12]) * ppsi[ 5];
1744 cchi[ 3] = tri[site].
diag[0][ 3] * ppsi[ 3];
1745 cchi[ 3] += tri[site].
offd[0][ 3] * ppsi[ 0];
1746 cchi[ 3] += tri[site].
offd[0][ 4] * ppsi[ 1];
1747 cchi[ 3] += tri[site].
offd[0][ 5] * ppsi[ 2];
1748 cchi[ 3] += conj(tri[site].offd[0][ 9]) * ppsi[ 4];
1749 cchi[ 3] += conj(tri[site].offd[0][13]) * ppsi[ 5];
1751 cchi[ 4] = tri[site].
diag[0][ 4] * ppsi[ 4];
1752 cchi[ 4] += tri[site].
offd[0][ 6] * ppsi[ 0];
1753 cchi[ 4] += tri[site].
offd[0][ 7] * ppsi[ 1];
1754 cchi[ 4] += tri[site].
offd[0][ 8] * ppsi[ 2];
1755 cchi[ 4] += tri[site].
offd[0][ 9] * ppsi[ 3];
1756 cchi[ 4] += conj(tri[site].offd[0][14]) * ppsi[ 5];
1758 cchi[ 5] = tri[site].
diag[0][ 5] * ppsi[ 5];
1759 cchi[ 5] += tri[site].
offd[0][10] * ppsi[ 0];
1760 cchi[ 5] += tri[site].
offd[0][11] * ppsi[ 1];
1761 cchi[ 5] += tri[site].
offd[0][12] * ppsi[ 2];
1762 cchi[ 5] += tri[site].
offd[0][13] * ppsi[ 3];
1763 cchi[ 5] += tri[site].
offd[0][14] * ppsi[ 4];
1765 cchi[ 6] = tri[site].
diag[1][ 0] * ppsi[ 6];
1766 cchi[ 6] += conj(tri[site].offd[1][ 0]) * ppsi[ 7];
1767 cchi[ 6] += conj(tri[site].offd[1][ 1]) * ppsi[ 8];
1768 cchi[ 6] += conj(tri[site].offd[1][ 3]) * ppsi[ 9];
1769 cchi[ 6] += conj(tri[site].offd[1][ 6]) * ppsi[10];
1770 cchi[ 6] += conj(tri[site].offd[1][10]) * ppsi[11];
1772 cchi[ 7] = tri[site].
diag[1][ 1] * ppsi[ 7];
1773 cchi[ 7] += tri[site].
offd[1][ 0] * ppsi[ 6];
1774 cchi[ 7] += conj(tri[site].offd[1][ 2]) * ppsi[ 8];
1775 cchi[ 7] += conj(tri[site].offd[1][ 4]) * ppsi[ 9];
1776 cchi[ 7] += conj(tri[site].offd[1][ 7]) * ppsi[10];
1777 cchi[ 7] += conj(tri[site].offd[1][11]) * ppsi[11];
1779 cchi[ 8] = tri[site].
diag[1][ 2] * ppsi[ 8];
1780 cchi[ 8] += tri[site].
offd[1][ 1] * ppsi[ 6];
1781 cchi[ 8] += tri[site].
offd[1][ 2] * ppsi[ 7];
1782 cchi[ 8] += conj(tri[site].offd[1][ 5]) * ppsi[ 9];
1783 cchi[ 8] += conj(tri[site].offd[1][ 8]) * ppsi[10];
1784 cchi[ 8] += conj(tri[site].offd[1][12]) * ppsi[11];
1786 cchi[ 9] = tri[site].
diag[1][ 3] * ppsi[ 9];
1787 cchi[ 9] += tri[site].
offd[1][ 3] * ppsi[ 6];
1788 cchi[ 9] += tri[site].
offd[1][ 4] * ppsi[ 7];
1789 cchi[ 9] += tri[site].
offd[1][ 5] * ppsi[ 8];
1790 cchi[ 9] += conj(tri[site].offd[1][ 9]) * ppsi[10];
1791 cchi[ 9] += conj(tri[site].offd[1][13]) * ppsi[11];
1793 cchi[10] = tri[site].
diag[1][ 4] * ppsi[10];
1794 cchi[10] += tri[site].
offd[1][ 6] * ppsi[ 6];
1795 cchi[10] += tri[site].
offd[1][ 7] * ppsi[ 7];
1796 cchi[10] += tri[site].
offd[1][ 8] * ppsi[ 8];
1797 cchi[10] += tri[site].
offd[1][ 9] * ppsi[ 9];
1798 cchi[10] += conj(tri[site].offd[1][14]) * ppsi[11];
1800 cchi[11] = tri[site].
diag[1][ 5] * ppsi[11];
1801 cchi[11] += tri[site].
offd[1][10] * ppsi[ 6];
1802 cchi[11] += tri[site].
offd[1][11] * ppsi[ 7];
1803 cchi[11] += tri[site].
offd[1][12] * ppsi[ 8];
1804 cchi[11] += tri[site].
offd[1][13] * ppsi[ 9];
1805 cchi[11] += tri[site].
offd[1][14] * ppsi[10];
1813 cchi[ 0].real() = tri[site].
diag[0][0].elem() * ppsi[0].real();
1814 cchi[ 0].real() += tri[site].
offd[0][0].real() * ppsi[1].real();
1815 cchi[ 0].real() += tri[site].
offd[0][0].imag() * ppsi[1].imag();
1816 cchi[ 0].real() += tri[site].
offd[0][1].real() * ppsi[2].real();
1817 cchi[ 0].real() += tri[site].
offd[0][1].imag() * ppsi[2].imag();
1818 cchi[ 0].real() += tri[site].
offd[0][3].real() * ppsi[3].real();
1819 cchi[ 0].real() += tri[site].
offd[0][3].imag() * ppsi[3].imag();
1820 cchi[ 0].real() += tri[site].
offd[0][6].real() * ppsi[4].real();
1821 cchi[ 0].real() += tri[site].
offd[0][6].imag() * ppsi[4].imag();
1822 cchi[ 0].real() += tri[site].
offd[0][10].real() * ppsi[5].real();
1823 cchi[ 0].real() += tri[site].
offd[0][10].imag() * ppsi[5].imag();
1825 cchi[ 0].imag() = tri[site].
diag[0][0].elem() * ppsi[ 0].imag();
1826 cchi[ 0].imag() += tri[site].
offd[0][0].real() * ppsi[1].imag();
1827 cchi[ 0].imag() -= tri[site].
offd[0][0].imag() * ppsi[1].real();
1828 cchi[ 0].imag() += tri[site].
offd[0][3].real() * ppsi[3].imag();
1829 cchi[ 0].imag() -= tri[site].
offd[0][3].imag() * ppsi[3].real();
1830 cchi[ 0].imag() += tri[site].
offd[0][1].real() * ppsi[2].imag();
1831 cchi[ 0].imag() -= tri[site].
offd[0][1].imag() * ppsi[2].real();
1832 cchi[ 0].imag() += tri[site].
offd[0][6].real() * ppsi[4].imag();
1833 cchi[ 0].imag() -= tri[site].
offd[0][6].imag() * ppsi[4].real();
1834 cchi[ 0].imag() += tri[site].
offd[0][10].real() * ppsi[5].imag();
1835 cchi[ 0].imag() -= tri[site].
offd[0][10].imag() * ppsi[5].real();
1838 cchi[ 1].real() = tri[site].
diag[0][ 1].elem() * ppsi[ 1].real();
1839 cchi[ 1].real() += tri[site].
offd[0][ 0].real() * ppsi[ 0].real();
1840 cchi[ 1].real() -= tri[site].
offd[0][ 0].imag() * ppsi[ 0].imag();
1841 cchi[ 1].real() += tri[site].
offd[0][ 2].real() * ppsi[ 2].real();
1842 cchi[ 1].real() += tri[site].
offd[0][ 2].imag() * ppsi[ 2].imag();
1843 cchi[ 1].real() += tri[site].
offd[0][ 4].real() * ppsi[ 3].real();
1844 cchi[ 1].real() += tri[site].
offd[0][ 4].imag() * ppsi[ 3].imag();
1845 cchi[ 1].real() += tri[site].
offd[0][ 7].real() * ppsi[ 4].real();
1846 cchi[ 1].real() += tri[site].
offd[0][ 7].imag() * ppsi[ 4].imag();
1847 cchi[ 1].real() += tri[site].
offd[0][11].real() * ppsi[ 5].real();
1848 cchi[ 1].real() += tri[site].
offd[0][11].imag() * ppsi[ 5].imag();
1851 cchi[ 1].imag() = tri[site].
diag[0][ 1].elem() * ppsi[ 1].imag();
1852 cchi[ 1].imag() += tri[site].
offd[0][ 0].real() * ppsi[ 0].imag();
1853 cchi[ 1].imag() += tri[site].
offd[0][ 0].imag() * ppsi[ 0].real();
1854 cchi[ 1].imag() += tri[site].
offd[0][ 2].real() * ppsi[ 2].imag();
1855 cchi[ 1].imag() -= tri[site].
offd[0][ 2].imag() * ppsi[ 2].real();
1856 cchi[ 1].imag() += tri[site].
offd[0][ 4].real() * ppsi[ 3].imag();
1857 cchi[ 1].imag() -= tri[site].
offd[0][ 4].imag() * ppsi[ 3].real();
1858 cchi[ 1].imag() += tri[site].
offd[0][ 7].real() * ppsi[ 4].imag();
1859 cchi[ 1].imag() -= tri[site].
offd[0][ 7].imag() * ppsi[ 4].real();
1860 cchi[ 1].imag() += tri[site].
offd[0][11].real() * ppsi[ 5].imag();
1861 cchi[ 1].imag() -= tri[site].
offd[0][11].imag() * ppsi[ 5].real();
1864 cchi[ 2].real() = tri[site].
diag[0][ 2].elem() * ppsi[ 2].real();
1865 cchi[ 2].real() += tri[site].
offd[0][ 1].real() * ppsi[ 0].real();
1866 cchi[ 2].real() -= tri[site].
offd[0][ 1].imag() * ppsi[ 0].imag();
1867 cchi[ 2].real() += tri[site].
offd[0][ 2].real() * ppsi[ 1].real();
1868 cchi[ 2].real() -= tri[site].
offd[0][ 2].imag() * ppsi[ 1].imag();
1869 cchi[ 2].real() += tri[site].
offd[0][5].real() * ppsi[ 3].real();
1870 cchi[ 2].real() += tri[site].
offd[0][5].imag() * ppsi[ 3].imag();
1871 cchi[ 2].real() += tri[site].
offd[0][8].real() * ppsi[ 4].real();
1872 cchi[ 2].real() += tri[site].
offd[0][8].imag() * ppsi[ 4].imag();
1873 cchi[ 2].real() += tri[site].
offd[0][12].real() * ppsi[ 5].real();
1874 cchi[ 2].real() += tri[site].
offd[0][12].imag() * ppsi[ 5].imag();
1877 cchi[ 2].imag() = tri[site].
diag[0][ 2].elem() * ppsi[ 2].imag();
1878 cchi[ 2].imag() += tri[site].
offd[0][ 1].real() * ppsi[ 0].imag();
1879 cchi[ 2].imag() += tri[site].
offd[0][ 1].imag() * ppsi[ 0].real();
1880 cchi[ 2].imag() += tri[site].
offd[0][ 2].real() * ppsi[ 1].imag();
1881 cchi[ 2].imag() += tri[site].
offd[0][ 2].imag() * ppsi[ 1].real();
1882 cchi[ 2].imag() += tri[site].
offd[0][5].real() * ppsi[ 3].imag();
1883 cchi[ 2].imag() -= tri[site].
offd[0][5].imag() * ppsi[ 3].real();
1884 cchi[ 2].imag() += tri[site].
offd[0][8].real() * ppsi[ 4].imag();
1885 cchi[ 2].imag() -= tri[site].
offd[0][8].imag() * ppsi[ 4].real();
1886 cchi[ 2].imag() += tri[site].
offd[0][12].real() * ppsi[ 5].imag();
1887 cchi[ 2].imag() -= tri[site].
offd[0][12].imag() * ppsi[ 5].real();
1890 cchi[ 3].real() = tri[site].
diag[0][ 3].elem() * ppsi[ 3].real();
1891 cchi[ 3].real() += tri[site].
offd[0][ 3].real() * ppsi[ 0].real();
1892 cchi[ 3].real() -= tri[site].
offd[0][ 3].imag() * ppsi[ 0].imag();
1893 cchi[ 3].real() += tri[site].
offd[0][ 4].real() * ppsi[ 1].real();
1894 cchi[ 3].real() -= tri[site].
offd[0][ 4].imag() * ppsi[ 1].imag();
1895 cchi[ 3].real() += tri[site].
offd[0][ 5].real() * ppsi[ 2].real();
1896 cchi[ 3].real() -= tri[site].
offd[0][ 5].imag() * ppsi[ 2].imag();
1897 cchi[ 3].real() += tri[site].
offd[0][ 9].real() * ppsi[ 4].real();
1898 cchi[ 3].real() += tri[site].
offd[0][ 9].imag() * ppsi[ 4].imag();
1899 cchi[ 3].real() += tri[site].
offd[0][13].real() * ppsi[ 5].real();
1900 cchi[ 3].real() += tri[site].
offd[0][13].imag() * ppsi[ 5].imag();
1903 cchi[ 3].imag() = tri[site].
diag[0][ 3].elem() * ppsi[ 3].imag();
1904 cchi[ 3].imag() += tri[site].
offd[0][ 3].real() * ppsi[ 0].imag();
1905 cchi[ 3].imag() += tri[site].
offd[0][ 3].imag() * ppsi[ 0].real();
1906 cchi[ 3].imag() += tri[site].
offd[0][ 4].real() * ppsi[ 1].imag();
1907 cchi[ 3].imag() += tri[site].
offd[0][ 4].imag() * ppsi[ 1].real();
1908 cchi[ 3].imag() += tri[site].
offd[0][ 5].real() * ppsi[ 2].imag();
1909 cchi[ 3].imag() += tri[site].
offd[0][ 5].imag() * ppsi[ 2].real();
1910 cchi[ 3].imag() += tri[site].
offd[0][ 9].real() * ppsi[ 4].imag();
1911 cchi[ 3].imag() -= tri[site].
offd[0][ 9].imag() * ppsi[ 4].real();
1912 cchi[ 3].imag() += tri[site].
offd[0][13].real() * ppsi[ 5].imag();
1913 cchi[ 3].imag() -= tri[site].
offd[0][13].imag() * ppsi[ 5].real();
1916 cchi[ 4].real() = tri[site].
diag[0][ 4].elem() * ppsi[ 4].real();
1917 cchi[ 4].real() += tri[site].
offd[0][ 6].real() * ppsi[ 0].real();
1918 cchi[ 4].real() -= tri[site].
offd[0][ 6].imag() * ppsi[ 0].imag();
1919 cchi[ 4].real() += tri[site].
offd[0][ 7].real() * ppsi[ 1].real();
1920 cchi[ 4].real() -= tri[site].
offd[0][ 7].imag() * ppsi[ 1].imag();
1921 cchi[ 4].real() += tri[site].
offd[0][ 8].real() * ppsi[ 2].real();
1922 cchi[ 4].real() -= tri[site].
offd[0][ 8].imag() * ppsi[ 2].imag();
1923 cchi[ 4].real() += tri[site].
offd[0][ 9].real() * ppsi[ 3].real();
1924 cchi[ 4].real() -= tri[site].
offd[0][ 9].imag() * ppsi[ 3].imag();
1925 cchi[ 4].real() += tri[site].
offd[0][14].real() * ppsi[ 5].real();
1926 cchi[ 4].real() += tri[site].
offd[0][14].imag() * ppsi[ 5].imag();
1929 cchi[ 4].imag() = tri[site].
diag[0][ 4].elem() * ppsi[ 4].imag();
1930 cchi[ 4].imag() += tri[site].
offd[0][ 6].real() * ppsi[ 0].imag();
1931 cchi[ 4].imag() += tri[site].
offd[0][ 6].imag() * ppsi[ 0].real();
1932 cchi[ 4].imag() += tri[site].
offd[0][ 7].real() * ppsi[ 1].imag();
1933 cchi[ 4].imag() += tri[site].
offd[0][ 7].imag() * ppsi[ 1].real();
1934 cchi[ 4].imag() += tri[site].
offd[0][ 8].real() * ppsi[ 2].imag();
1935 cchi[ 4].imag() += tri[site].
offd[0][ 8].imag() * ppsi[ 2].real();
1936 cchi[ 4].imag() += tri[site].
offd[0][ 9].real() * ppsi[ 3].imag();
1937 cchi[ 4].imag() += tri[site].
offd[0][ 9].imag() * ppsi[ 3].real();
1938 cchi[ 4].imag() += tri[site].
offd[0][14].real() * ppsi[ 5].imag();
1939 cchi[ 4].imag() -= tri[site].
offd[0][14].imag() * ppsi[ 5].real();
1942 cchi[ 5].real() = tri[site].
diag[0][ 5].elem() * ppsi[ 5].real();
1943 cchi[ 5].real() += tri[site].
offd[0][10].real() * ppsi[ 0].real();
1944 cchi[ 5].real() -= tri[site].
offd[0][10].imag() * ppsi[ 0].imag();
1945 cchi[ 5].real() += tri[site].
offd[0][11].real() * ppsi[ 1].real();
1946 cchi[ 5].real() -= tri[site].
offd[0][11].imag() * ppsi[ 1].imag();
1947 cchi[ 5].real() += tri[site].
offd[0][12].real() * ppsi[ 2].real();
1948 cchi[ 5].real() -= tri[site].
offd[0][12].imag() * ppsi[ 2].imag();
1949 cchi[ 5].real() += tri[site].
offd[0][13].real() * ppsi[ 3].real();
1950 cchi[ 5].real() -= tri[site].
offd[0][13].imag() * ppsi[ 3].imag();
1951 cchi[ 5].real() += tri[site].
offd[0][14].real() * ppsi[ 4].real();
1952 cchi[ 5].real() -= tri[site].
offd[0][14].imag() * ppsi[ 4].imag();
1955 cchi[ 5].imag() = tri[site].
diag[0][ 5].elem() * ppsi[ 5].imag();
1956 cchi[ 5].imag() += tri[site].
offd[0][10].real() * ppsi[ 0].imag();
1957 cchi[ 5].imag() += tri[site].
offd[0][10].imag() * ppsi[ 0].real();
1958 cchi[ 5].imag() += tri[site].
offd[0][11].real() * ppsi[ 1].imag();
1959 cchi[ 5].imag() += tri[site].
offd[0][11].imag() * ppsi[ 1].real();
1960 cchi[ 5].imag() += tri[site].
offd[0][12].real() * ppsi[ 2].imag();
1961 cchi[ 5].imag() += tri[site].
offd[0][12].imag() * ppsi[ 2].real();
1962 cchi[ 5].imag() += tri[site].
offd[0][13].real() * ppsi[ 3].imag();
1963 cchi[ 5].imag() += tri[site].
offd[0][13].imag() * ppsi[ 3].real();
1964 cchi[ 5].imag() += tri[site].
offd[0][14].real() * ppsi[ 4].imag();
1965 cchi[ 5].imag() += tri[site].
offd[0][14].imag() * ppsi[ 4].real();
1968 cchi[ 6].real() = tri[site].
diag[1][0].elem() * ppsi[6].real();
1969 cchi[ 6].real() += tri[site].
offd[1][0].real() * ppsi[7].real();
1970 cchi[ 6].real() += tri[site].
offd[1][0].imag() * ppsi[7].imag();
1971 cchi[ 6].real() += tri[site].
offd[1][1].real() * ppsi[8].real();
1972 cchi[ 6].real() += tri[site].
offd[1][1].imag() * ppsi[8].imag();
1973 cchi[ 6].real() += tri[site].
offd[1][3].real() * ppsi[9].real();
1974 cchi[ 6].real() += tri[site].
offd[1][3].imag() * ppsi[9].imag();
1975 cchi[ 6].real() += tri[site].
offd[1][6].real() * ppsi[10].real();
1976 cchi[ 6].real() += tri[site].
offd[1][6].imag() * ppsi[10].imag();
1977 cchi[ 6].real() += tri[site].
offd[1][10].real() * ppsi[11].real();
1978 cchi[ 6].real() += tri[site].
offd[1][10].imag() * ppsi[11].imag();
1980 cchi[ 6].imag() = tri[site].
diag[1][0].elem() * ppsi[6].imag();
1981 cchi[ 6].imag() += tri[site].
offd[1][0].real() * ppsi[7].imag();
1982 cchi[ 6].imag() -= tri[site].
offd[1][0].imag() * ppsi[7].real();
1983 cchi[ 6].imag() += tri[site].
offd[1][1].real() * ppsi[8].imag();
1984 cchi[ 6].imag() -= tri[site].
offd[1][1].imag() * ppsi[8].real();
1985 cchi[ 6].imag() += tri[site].
offd[1][3].real() * ppsi[9].imag();
1986 cchi[ 6].imag() -= tri[site].
offd[1][3].imag() * ppsi[9].real();
1987 cchi[ 6].imag() += tri[site].
offd[1][6].real() * ppsi[10].imag();
1988 cchi[ 6].imag() -= tri[site].
offd[1][6].imag() * ppsi[10].real();
1989 cchi[ 6].imag() += tri[site].
offd[1][10].real() * ppsi[11].imag();
1990 cchi[ 6].imag() -= tri[site].
offd[1][10].imag() * ppsi[11].real();
1993 cchi[ 7].real() = tri[site].
diag[1][ 1].elem() * ppsi[ 7].real();
1994 cchi[ 7].real() += tri[site].
offd[1][ 0].real() * ppsi[ 6].real();
1995 cchi[ 7].real() -= tri[site].
offd[1][ 0].imag() * ppsi[ 6].imag();
1996 cchi[ 7].real() += tri[site].
offd[1][ 2].real() * ppsi[ 8].real();
1997 cchi[ 7].real() += tri[site].
offd[1][ 2].imag() * ppsi[ 8].imag();
1998 cchi[ 7].real() += tri[site].
offd[1][ 4].real() * ppsi[ 9].real();
1999 cchi[ 7].real() += tri[site].
offd[1][ 4].imag() * ppsi[ 9].imag();
2000 cchi[ 7].real() += tri[site].
offd[1][ 7].real() * ppsi[10].real();
2001 cchi[ 7].real() += tri[site].
offd[1][ 7].imag() * ppsi[10].imag();
2002 cchi[ 7].real() += tri[site].
offd[1][11].real() * ppsi[11].real();
2003 cchi[ 7].real() += tri[site].
offd[1][11].imag() * ppsi[11].imag();
2005 cchi[ 7].imag() = tri[site].
diag[1][ 1].elem() * ppsi[ 7].imag();
2006 cchi[ 7].imag() += tri[site].
offd[1][ 0].real() * ppsi[ 6].imag();
2007 cchi[ 7].imag() += tri[site].
offd[1][ 0].imag() * ppsi[ 6].real();
2008 cchi[ 7].imag() += tri[site].
offd[1][ 2].real() * ppsi[ 8].imag();
2009 cchi[ 7].imag() -= tri[site].
offd[1][ 2].imag() * ppsi[ 8].real();
2010 cchi[ 7].imag() += tri[site].
offd[1][ 4].real() * ppsi[ 9].imag();
2011 cchi[ 7].imag() -= tri[site].
offd[1][ 4].imag() * ppsi[ 9].real();
2012 cchi[ 7].imag() += tri[site].
offd[1][ 7].real() * ppsi[10].imag();
2013 cchi[ 7].imag() -= tri[site].
offd[1][ 7].imag() * ppsi[10].real();
2014 cchi[ 7].imag() += tri[site].
offd[1][11].real() * ppsi[11].imag();
2015 cchi[ 7].imag() -= tri[site].
offd[1][11].imag() * ppsi[11].real();
2018 cchi[ 8].real() = tri[site].
diag[1][ 2].elem() * ppsi[ 8].real();
2019 cchi[ 8].real() += tri[site].
offd[1][ 1].real() * ppsi[ 6].real();
2020 cchi[ 8].real() -= tri[site].
offd[1][ 1].imag() * ppsi[ 6].imag();
2021 cchi[ 8].real() += tri[site].
offd[1][ 2].real() * ppsi[ 7].real();
2022 cchi[ 8].real() -= tri[site].
offd[1][ 2].imag() * ppsi[ 7].imag();
2023 cchi[ 8].real() += tri[site].
offd[1][5].real() * ppsi[ 9].real();
2024 cchi[ 8].real() += tri[site].
offd[1][5].imag() * ppsi[ 9].imag();
2025 cchi[ 8].real() += tri[site].
offd[1][8].real() * ppsi[10].real();
2026 cchi[ 8].real() += tri[site].
offd[1][8].imag() * ppsi[10].imag();
2027 cchi[ 8].real() += tri[site].
offd[1][12].real() * ppsi[11].real();
2028 cchi[ 8].real() += tri[site].
offd[1][12].imag() * ppsi[11].imag();
2030 cchi[ 8].imag() = tri[site].
diag[1][ 2].elem() * ppsi[ 8].imag();
2031 cchi[ 8].imag() += tri[site].
offd[1][ 1].real() * ppsi[ 6].imag();
2032 cchi[ 8].imag() += tri[site].
offd[1][ 1].imag() * ppsi[ 6].real();
2033 cchi[ 8].imag() += tri[site].
offd[1][ 2].real() * ppsi[ 7].imag();
2034 cchi[ 8].imag() += tri[site].
offd[1][ 2].imag() * ppsi[ 7].real();
2035 cchi[ 8].imag() += tri[site].
offd[1][5].real() * ppsi[ 9].imag();
2036 cchi[ 8].imag() -= tri[site].
offd[1][5].imag() * ppsi[ 9].real();
2037 cchi[ 8].imag() += tri[site].
offd[1][8].real() * ppsi[10].imag();
2038 cchi[ 8].imag() -= tri[site].
offd[1][8].imag() * ppsi[10].real();
2039 cchi[ 8].imag() += tri[site].
offd[1][12].real() * ppsi[11].imag();
2040 cchi[ 8].imag() -= tri[site].
offd[1][12].imag() * ppsi[11].real();
2043 cchi[ 9].real() = tri[site].
diag[1][ 3].elem() * ppsi[ 9].real();
2044 cchi[ 9].real() += tri[site].
offd[1][ 3].real() * ppsi[ 6].real();
2045 cchi[ 9].real() -= tri[site].
offd[1][ 3].imag() * ppsi[ 6].imag();
2046 cchi[ 9].real() += tri[site].
offd[1][ 4].real() * ppsi[ 7].real();
2047 cchi[ 9].real() -= tri[site].
offd[1][ 4].imag() * ppsi[ 7].imag();
2048 cchi[ 9].real() += tri[site].
offd[1][ 5].real() * ppsi[ 8].real();
2049 cchi[ 9].real() -= tri[site].
offd[1][ 5].imag() * ppsi[ 8].imag();
2050 cchi[ 9].real() += tri[site].
offd[1][ 9].real() * ppsi[10].real();
2051 cchi[ 9].real() += tri[site].
offd[1][ 9].imag() * ppsi[10].imag();
2052 cchi[ 9].real() += tri[site].
offd[1][13].real() * ppsi[11].real();
2053 cchi[ 9].real() += tri[site].
offd[1][13].imag() * ppsi[11].imag();
2055 cchi[ 9].imag() = tri[site].
diag[1][ 3].elem() * ppsi[ 9].imag();
2056 cchi[ 9].imag() += tri[site].
offd[1][ 3].real() * ppsi[ 6].imag();
2057 cchi[ 9].imag() += tri[site].
offd[1][ 3].imag() * ppsi[ 6].real();
2058 cchi[ 9].imag() += tri[site].
offd[1][ 4].real() * ppsi[ 7].imag();
2059 cchi[ 9].imag() += tri[site].
offd[1][ 4].imag() * ppsi[ 7].real();
2060 cchi[ 9].imag() += tri[site].
offd[1][ 5].real() * ppsi[ 8].imag();
2061 cchi[ 9].imag() += tri[site].
offd[1][ 5].imag() * ppsi[ 8].real();
2062 cchi[ 9].imag() += tri[site].
offd[1][ 9].real() * ppsi[10].imag();
2063 cchi[ 9].imag() -= tri[site].
offd[1][ 9].imag() * ppsi[10].real();
2064 cchi[ 9].imag() += tri[site].
offd[1][13].real() * ppsi[11].imag();
2065 cchi[ 9].imag() -= tri[site].
offd[1][13].imag() * ppsi[11].real();
2068 cchi[10].real() = tri[site].
diag[1][ 4].elem() * ppsi[10].real();
2069 cchi[10].real() += tri[site].
offd[1][ 6].real() * ppsi[ 6].real();
2070 cchi[10].real() -= tri[site].
offd[1][ 6].imag() * ppsi[ 6].imag();
2071 cchi[10].real() += tri[site].
offd[1][ 7].real() * ppsi[ 7].real();
2072 cchi[10].real() -= tri[site].
offd[1][ 7].imag() * ppsi[ 7].imag();
2073 cchi[10].real() += tri[site].
offd[1][ 8].real() * ppsi[ 8].real();
2074 cchi[10].real() -= tri[site].
offd[1][ 8].imag() * ppsi[ 8].imag();
2075 cchi[10].real() += tri[site].
offd[1][ 9].real() * ppsi[ 9].real();
2076 cchi[10].real() -= tri[site].
offd[1][ 9].imag() * ppsi[ 9].imag();
2077 cchi[10].real() += tri[site].
offd[1][14].real() * ppsi[11].real();
2078 cchi[10].real() += tri[site].
offd[1][14].imag() * ppsi[11].imag();
2080 cchi[10].imag() = tri[site].
diag[1][ 4].elem() * ppsi[10].imag();
2081 cchi[10].imag() += tri[site].
offd[1][ 6].real() * ppsi[ 6].imag();
2082 cchi[10].imag() += tri[site].
offd[1][ 6].imag() * ppsi[ 6].real();
2083 cchi[10].imag() += tri[site].
offd[1][ 7].real() * ppsi[ 7].imag();
2084 cchi[10].imag() += tri[site].
offd[1][ 7].imag() * ppsi[ 7].real();
2085 cchi[10].imag() += tri[site].
offd[1][ 8].real() * ppsi[ 8].imag();
2086 cchi[10].imag() += tri[site].
offd[1][ 8].imag() * ppsi[ 8].real();
2087 cchi[10].imag() += tri[site].
offd[1][ 9].real() * ppsi[ 9].imag();
2088 cchi[10].imag() += tri[site].
offd[1][ 9].imag() * ppsi[ 9].real();
2089 cchi[10].imag() += tri[site].
offd[1][14].real() * ppsi[11].imag();
2090 cchi[10].imag() -= tri[site].
offd[1][14].imag() * ppsi[11].real();
2093 cchi[11].real() = tri[site].
diag[1][ 5].elem() * ppsi[11].real();
2094 cchi[11].real() += tri[site].
offd[1][10].real() * ppsi[ 6].real();
2095 cchi[11].real() -= tri[site].
offd[1][10].imag() * ppsi[ 6].imag();
2096 cchi[11].real() += tri[site].
offd[1][11].real() * ppsi[ 7].real();
2097 cchi[11].real() -= tri[site].
offd[1][11].imag() * ppsi[ 7].imag();
2098 cchi[11].real() += tri[site].
offd[1][12].real() * ppsi[ 8].real();
2099 cchi[11].real() -= tri[site].
offd[1][12].imag() * ppsi[ 8].imag();
2100 cchi[11].real() += tri[site].
offd[1][13].real() * ppsi[ 9].real();
2101 cchi[11].real() -= tri[site].
offd[1][13].imag() * ppsi[ 9].imag();
2102 cchi[11].real() += tri[site].
offd[1][14].real() * ppsi[10].real();
2103 cchi[11].real() -= tri[site].
offd[1][14].imag() * ppsi[10].imag();
2105 cchi[11].imag() = tri[site].
diag[1][ 5].elem() * ppsi[11].imag();
2106 cchi[11].imag() += tri[site].
offd[1][10].real() * ppsi[ 6].imag();
2107 cchi[11].imag() += tri[site].
offd[1][10].imag() * ppsi[ 6].real();
2108 cchi[11].imag() += tri[site].
offd[1][11].real() * ppsi[ 7].imag();
2109 cchi[11].imag() += tri[site].
offd[1][11].imag() * ppsi[ 7].real();
2110 cchi[11].imag() += tri[site].
offd[1][12].real() * ppsi[ 8].imag();
2111 cchi[11].imag() += tri[site].
offd[1][12].imag() * ppsi[ 8].real();
2112 cchi[11].imag() += tri[site].
offd[1][13].real() * ppsi[ 9].imag();
2113 cchi[11].imag() += tri[site].
offd[1][13].imag() * ppsi[ 9].real();
2114 cchi[11].imag() += tri[site].
offd[1][14].real() * ppsi[10].imag();
2115 cchi[11].imag() += tri[site].
offd[1][14].imag() * ppsi[10].real();
2140 template<
typename T,
typename U>
2144 #ifndef QDP_IS_QDPJIT
2148 QDPIO::cerr << __func__ <<
": CloverTerm::apply requires Ns==4" << std::endl;
2153 int num_sites = rb[
cb].siteTable().size();
2157 dispatch_to_threads(num_sites, arg, QDPCloverEnv::applySiteLoop<T>);
2158 (*this).getFermBC().modifyF(
chi, QDP::rb[
cb]);
2165 namespace QDPCloverEnv {
2166 template<
typename R>
2167 struct QUDAPackArgs {
2169 multi1d< QUDAPackedClovSite<R> >&
quda_array;
2173 template<
typename R>
2178 multi1d< QUDAPackedClovSite<R> >& quda_array =
a->quda_array;
2181 const int idtab[15]={0,1,3,6,10,2,4,7,11,5,8,12,9,13,14};
2183 for(
int ssite=lo; ssite < hi; ++ssite) {
2184 int site = rb[
cb].siteTable()[ssite];
2186 for(
int i=0;
i < 6;
i++) {
2187 quda_array[site].diag1[
i] = tri[site].
diag[0][
i].elem();
2192 for(
int col=0; col < Nc*Ns2-1; col++) {
2193 for(
int row=col+1; row < Nc*Ns2; row++) {
2195 int source_index = row*(row-1)/2 + col;
2197 quda_array[site].offDiag1[target_index][0] = tri[site].
offd[0][source_index].real();
2198 quda_array[site].offDiag1[target_index][1] = tri[site].
offd[0][source_index].imag();
2203 for(
int i=0;
i < 6;
i++) {
2204 quda_array[site].diag2[
i] = tri[site].
diag[1][
i].elem();
2208 for(
int col=0; col < Nc*Ns2-1; col++) {
2209 for(
int row=col+1; row < Nc*Ns2; row++) {
2211 int source_index = row*(row-1)/2 + col;
2212 quda_array[site].offDiag2[target_index][0] = tri[site].
offd[1][source_index].real();
2213 quda_array[site].offDiag2[target_index][1] = tri[site].
offd[1][source_index].imag();
2221 template<
typename T,
typename U>
2224 typedef typename WordType<T>::Type_t
REALT;
2225 int num_sites = rb[
cb].siteTable().size();
2228 dispatch_to_threads(num_sites, args, QDPCloverEnv::qudaPackSiteLoop<REALT>);
Base class for all fermion action boundary conditions.
Support class for fermion actions and linear operators.
Class for counted reference semantics.
Handle< FermBC< T, multi1d< U >, multi1d< U > > > fbc
CloverFermActParams param
multi1d< bool > choles_done
void create(Handle< FermState< T, multi1d< U >, multi1d< U > > > fs, const CloverFermActParams ¶m_)
Creation routine.
Double cholesDet(int cb) const
Computes the inverse of the term on cb using Cholesky.
~QDPCloverTermT()
No real need for cleanup here.
OLattice< PScalar< PScalar< RScalar< typename WordType< T >::Type_t > > > > LatticeREAL
void applySite(T &chi, const T &psi, enum PlusMinus isign, int site) const
OScalar< PScalar< PScalar< RScalar< REALT > > > > RealT
void packForQUDA(multi1d< QUDAPackedClovSite< REALT > > &quda_pack, int cb) const
PACK UP the Clover term for QUDA library:
const FermBC< T, multi1d< U >, multi1d< U > > & getFermBC() const
Return the fermion BC object for this linear operator.
void apply(T &chi, const T &psi, enum PlusMinus isign, int cb) const
void choles(int cb)
Computes the inverse of the term on cb using Cholesky.
void chlclovms(LatticeREAL &log_diag, int cb)
Invert the clover term on cb.
PrimitiveClovTriang< REALT > * tri
const multi1d< U > & getU() const
Get the u field.
void triacntr(U &B, int mat, int cb) const
Calculates Tr_D ( Gamma_mat L )
void ldagdlinv(LatticeREAL &tr_log_diag, int cb)
QDPCloverTermT()
Empty constructor. Must use create later.
void makeClov(const multi1d< U > &f, const RealT &diag_mass)
Create the clover term on cb.
WordType< T >::Type_t REALT
Real getCloverCoeff(int mu, int nu) const
Calculates Tr_D ( Gamma_mat L )
Parameters for Clover fermion action.
Clover term linear operator.
void read(XMLReader &xml, const std::string &path, AsqtadFermActParams ¶m)
Read parameters.
void write(XMLWriter &xml, const std::string &path, const AsqtadFermActParams ¶m)
Writer parameters.
void block(LatticeColorMatrix &u_block, const multi1d< LatticeColorMatrix > &u, int mu, int bl_level, const Real &BlkAccu, int BlkMax, int j_decay)
Construct block links.
Calculates the antihermitian field strength tensor iF(mu,nu)
void qudaPackSiteLoop(int lo, int hi, int myId, QUDAPackArgs< R, TD, TO > *a)
void LDagDLInvSiteLoop(int lo, int hi, int myId, LDagDLInvArgs< U > *a)
void applySiteLoop(int lo, int hi, int MyId, ApplyArgs< T > *arg)
void triaCntrSiteLoop(int lo, int hi, int myId, TriaCntrArgs< U > *a)
void cholesSiteLoop(int lo, int hi, int myId, LDagDLInvArgs< U > *a)
void makeClovSiteLoop(int lo, int hi, int myId, QDPCloverMakeClovArg< U > *a)
Asqtad Staggered-Dirac operator.
static multi1d< LatticeColorMatrix > u
QDPCloverTermT< LatticeFermionF, LatticeColorMatrixF > QDPCloverTermF
LinOpSysSolverMGProtoClover::T T
QDPCloverTermT< LatticeFermionD, LatticeColorMatrixD > QDPCloverTermD
multi1d< LatticeFermion > chi(Ncb)
void mesField(multi1d< LatticeColorMatrixF > &f, const multi1d< LatticeColorMatrixF > &u)
Calculates the antihermitian field strength tensor iF(mu,nu)
QDPCloverTermT< LatticeFermion, LatticeColorMatrix > QDPCloverTerm
multi1d< LatticeFermion > s(Ncb)
const T1 const T2 const T3 & f3
const T1 const T2 const T3 const T4 const T5 & f5
const T1 const T2 const T3 const T4 & f4
FloatingPoint< double > Double
Support class for fermion actions and linear operators.
Params for clover ferm acts.
Special structure used for triangular objects.
RScalar< R > diag[2][2 *Nc]
RComplex< R > offd[2][2 *Nc *Nc-Nc]
WordType< T >::Type_t REALT
const PrimitiveClovTriang< REALT > * tri
OScalar< PScalar< PScalar< RScalar< REALT > > > > RealT
LatticeRealT & tr_log_diag
OLattice< PScalar< PScalar< RScalar< REALT > > > > LatticeRealT
PrimitiveClovTriang< REALT > * tri
WordType< U >::Type_t REALT
PrimitiveClovTriang< REALT > * tri
WordType< U >::Type_t REALT
OScalar< PScalar< PScalar< RScalar< REALT > > > > RealT
const PrimitiveClovTriang< R > * tri
multi1d< QUDAPackedClovSite< R > > & quda_array
WordType< U >::Type_t REALT
const PrimitiveClovTriang< REALT > * tri
multi1d< LatticeColorMatrix > U