14 #if defined(BUILD_JIT_CLOVER_TERM)
15 #ifdef QDPJIT_IS_QDPJITPTX
16 CUfunction function_get_fs_bs_exec(CUfunction
function,
17 const LatticeColorMatrix&
Q,
18 const LatticeColorMatrix& QQ,
19 multi1d<LatticeComplex>& f,
20 multi1d<LatticeComplex>& b1,
21 multi1d<LatticeComplex>& b2,
23 CUfunction function_get_fs_bs_build(
const LatticeColorMatrix&
Q,
24 const LatticeColorMatrix& QQ,
25 multi1d<LatticeComplex>& f,
26 multi1d<LatticeComplex>& b1,
27 multi1d<LatticeComplex>& b2,
29 #elif defined(QDPJIT_IS_QDPJITNVVM)
30 CUfunction function_get_fs_bs_exec(CUfunction
function,
31 const LatticeColorMatrix&
Q,
32 const LatticeColorMatrix& QQ,
33 multi1d<LatticeComplex>& f,
34 multi1d<LatticeComplex>& b1,
35 multi1d<LatticeComplex>& b2,
37 CUfunction function_get_fs_bs_build(
const LatticeColorMatrix&
Q,
38 const LatticeColorMatrix& QQ,
39 multi1d<LatticeComplex>& f,
40 multi1d<LatticeComplex>& b1,
41 multi1d<LatticeComplex>& b2);
43 void function_get_fs_bs_exec(
const JitFunction&
func,
44 const LatticeColorMatrix&
Q,
45 const LatticeColorMatrix& QQ,
46 multi1d<LatticeComplex>& f,
47 multi1d<LatticeComplex>& b1,
48 multi1d<LatticeComplex>& b2,
50 void *function_get_fs_bs_build(JitFunction&
function,
51 const LatticeColorMatrix&
Q,
52 const LatticeColorMatrix& QQ,
53 multi1d<LatticeComplex>& f,
54 multi1d<LatticeComplex>& b1,
55 multi1d<LatticeComplex>& b2);
66 namespace StoutLinkTimings {
89 void getQs(
const multi1d<LatticeColorMatrix>&
u, LatticeColorMatrix&
Q,
90 LatticeColorMatrix& QQ,
92 const multi1d<bool>& smear_in_this_dirP,
93 const multi2d<Real>& rho)
105 void getQsandCs(
const multi1d<LatticeColorMatrix>&
u, LatticeColorMatrix&
Q,
106 LatticeColorMatrix& QQ,
107 LatticeColorMatrix&
C,
109 const multi1d<bool>& smear_in_this_dirP,
110 const multi2d<Real>& rho)
120 if( (
mu !=
nu) && smear_in_this_dirP[
nu] )
122 LatticeColorMatrix U_nu_plus_mu = shift(
u[
nu],
FORWARD,
mu);
123 LatticeColorMatrix tmp_mat;
124 LatticeColorMatrix tmp_mat2;
137 tmp_mat2 =
u[
nu]*tmp_mat;
138 tmp_mat = tmp_mat2*adj(U_nu_plus_mu);
157 LatticeColorMatrix tmp_mat3;
158 tmp_mat3 = adj(
u[
nu])*
u[
mu];
159 tmp_mat2 = tmp_mat3*U_nu_plus_mu;
161 tmp_mat *= rho(
mu,
nu);
169 LatticeColorMatrix Omega;
170 Omega =
C*adj(
u[
mu]);
172 LatticeColorMatrix
tmp2 = adj(Omega) - Omega;
173 LatticeColorMatrix
tmp3 = trace(
tmp2);
174 tmp3 *= Real(1)/Real(Nc);
187 const multi1d<bool>& smear_in_this_dirP,
188 const multi2d<Real>& rho,
189 const multi1d<LatticeColorMatrix>&
u)
196 multi1d<LatticeColorMatrix> F_plus(
Nd);
202 multi1d<LatticeColorMatrix> Lambda(
Nd);
203 multi1d<LatticeColorMatrix>
C(
Nd);
210 if( smear_in_this_dirP[
mu] )
212 LatticeColorMatrix
Q,QQ;
218 multi1d<LatticeComplex> f;
219 multi1d<LatticeComplex> b_1;
220 multi1d<LatticeComplex> b_2;
227 LatticeColorMatrix B_1 = b_1[0] + b_1[1]*
Q + b_1[2]*QQ;
228 LatticeColorMatrix B_2 = b_2[0] + b_2[1]*
Q + b_2[2]*QQ;
232 LatticeColorMatrix USigma =
u[
mu]*F_plus[
mu];
233 LatticeColorMatrix Gamma = f[1]*USigma + f[2]*(USigma*
Q +
Q*USigma)
234 + trace(B_1*USigma)*
Q
235 + trace(B_2*USigma)*QQ;
238 Lambda[
mu] = Gamma + adj(Gamma);
245 F[
mu] = F_plus[
mu]*(f[0] + f[1]*
Q + f[2]*QQ);
248 QDPIO::cout << __func__ <<
": F[" <<
mu <<
"]= " << norm2(
F[
mu])
249 <<
" F_plus[mu]=" << norm2(F_plus[
mu])
250 <<
" f[0]=" << norm2(f[0])
251 <<
" f[1]=" << norm2(f[1])
252 <<
" f[2]=" << norm2(f[2])
253 <<
" B_1=" << norm2(B_1)
254 <<
" B_2=" << norm2(B_2)
256 <<
" QQ=" << norm2(QQ)
275 if( smear_in_this_dirP[
mu] )
277 LatticeColorMatrix staple_sum =
zero;
280 if((
mu !=
nu) && smear_in_this_dirP[
nu] ) {
281 LatticeColorMatrix U_nu_plus_mu = shift(
u[
nu],
FORWARD,
mu);
282 LatticeColorMatrix U_mu_plus_nu = shift(
u[
mu],
FORWARD,
nu);
283 LatticeColorMatrix Lambda_nu_plus_mu = shift(Lambda[
nu],
FORWARD,
mu);
284 LatticeColorMatrix tmp_mat;
285 LatticeColorMatrix tmp_mat2;
304 LatticeColorMatrix tmp_mat3;
305 LatticeColorMatrix tmp_mat4;
307 tmp_mat = U_nu_plus_mu*adj(U_mu_plus_nu);
308 tmp_mat2 = tmp_mat*adj(
u[
nu]);
309 tmp_mat3 = tmp_mat2*Lambda[
nu];
310 tmp_mat4 = Lambda_nu_plus_mu*tmp_mat2;
311 tmp_mat3 -= tmp_mat4;
312 tmp_mat3 *= rho(
nu,
mu);
315 tmp_mat2 = tmp_mat*tmp_mat4;
316 tmp_mat = tmp_mat2*adj(
u[
nu]);
317 tmp_mat *= rho(
mu,
nu);
319 staple_sum += tmp_mat;
340 LatticeColorMatrix tmp_mat4;
342 tmp_mat = Lambda_nu_plus_mu*adj(
u[
mu]);
343 tmp_mat4 = adj(
u[
mu])*Lambda[
nu];
345 tmp_mat *= rho(
nu,
mu);
346 tmp_mat2 = adj(
u[
mu])*Lambda[
mu];
347 tmp_mat2 *= rho(
mu,
nu);
350 tmp_mat2 = adj(U_nu_plus_mu)*tmp_mat;
351 tmp_mat = tmp_mat2*
u[
nu];
361 staple_sum -= adj(
C[
mu])*Lambda[
mu];
363 F[
mu] -= timesI(staple_sum);
366 QDPIO::cout << __func__ <<
":b, F[" <<
mu <<
"]= " << norm2(
F[
mu])
367 <<
" staple=" << norm2(staple_sum)
368 <<
" Lambda=" << norm2(Lambda[
mu])
369 <<
" C=" << norm2(
C[
mu])
384 const LatticeColorMatrix& QQ,
385 multi1d<LatticeComplex>& f)
391 multi1d<LatticeComplex> b_1;
392 multi1d<LatticeComplex> b_2;
401 namespace StoutUtils {
403 const LatticeColorMatrix&
Q;
404 const LatticeColorMatrix&
QQ;
405 multi1d<LatticeComplex>&
f;
406 multi1d<LatticeComplex>&
b1;
407 multi1d<LatticeComplex>&
b2;
418 #ifndef QDP_IS_QDPJIT
419 const LatticeColorMatrix&
Q = arg->
Q;
420 const LatticeColorMatrix& QQ = arg->
QQ;
421 multi1d<LatticeComplex>& f = arg->
f;
422 multi1d<LatticeComplex>& b1 = arg->
b1;
423 multi1d<LatticeComplex>& b2 = arg->
b2;
426 for(
int site=lo; site < hi; site++)
429 PColorMatrix<QDP::RComplex<REAL>, Nc> Q_site =
Q.elem(site).elem();
430 PColorMatrix<QDP::RComplex<REAL>, Nc> QQ_site = QQ.elem(site).elem();
431 PColorMatrix<QDP::RComplex<REAL>, Nc> QQQ = QQ_site*Q_site;
434 trQQQ.elem() = realTrace(QQQ);
436 trQQ.elem() = realTrace(QQ_site);
438 REAL c0 = ((REAL)1/(REAL)3) * trQQQ.elem().elem().elem().elem();
439 REAL c1 = ((REAL)1/(REAL)2) * trQQ.elem().elem().elem().elem();
516 f[0].elem(site).elem().elem().real() = 1.0-c0*c0/720.0;
517 f[0].elem(site).elem().elem().imag() = -(c0/6.0)*(1.0-(c1/20.0)*(1.0-(c1/42.0))) ;
519 f[1].elem(site).elem().elem().real() = c0/24.0*(1.0-c1/15.0*(1.0-3.0*c1/112.0)) ;
520 f[1].elem(site).elem().elem().imag() = 1.0-c1/6.0*(1.0-c1/20.0*(1.0-c1/42.0))-c0*c0/5040.0 ;
522 f[2].elem(site).elem().elem().real() = 0.5*(-1.0+c1/12.0*(1.0-c1/30.0*(1.0-c1/56.0))+c0*c0/20160.0);
523 f[2].elem(site).elem().elem().imag() = 0.5*(c0/60.0*(1.0-c1/21.0*(1.0-c1/48.0)));
527 b2[0].elem(site).elem().elem().real() = -c0/360.0;
528 b2[0].elem(site).elem().elem().imag() = -(1.0/6.0)*(1.0-(c1/20.0)*(1.0-c1/42.0));
532 b1[0].elem(site).elem().elem().real() = 0;
533 b1[0].elem(site).elem().elem().imag() = (c0/120.0)*(1.0-c1/21.0);
537 b2[1].elem(site).elem().elem().real() = (1.0/24.0)*(1.0-c1/15.0*(1.0-3.0*c1/112.0));
538 b2[1].elem(site).elem().elem().imag() = -c0/2520.0;
542 b1[1].elem(site).elem().elem().real() = -c0/360.0*(1.0 - 3.0*c1/56.0 );
543 b1[1].elem(site).elem().elem().imag() = -1.0/6.0*(1.0-c1/10.0*(1.0-c1/28.0));
546 b2[2].elem(site).elem().elem().real() = 0.5*c0/10080.0;
547 b2[2].elem(site).elem().elem().imag() = 0.5*( 1.0/60.0*(1.0-c1/21.0*(1.0-c1/48.0)) );
550 b1[2].elem(site).elem().elem().real() = 0.5*( 1.0/12.0*(1.0-(2.0*c1/30.0)*(1.0-3.0*c1/112.0)) );
551 b1[2].elem(site).elem().elem().imag() = 0.5*( -c0/1260.0*(1.0-c1/24.0) );
555 multi1d<int>
coord = Layout::siteCoords(Layout::nodeNumber(), site);
558 "%s: corner; site=%d coord=[%d,%d,%d,%d] f[0]=%g f[1]=%g f[2]=%g b1[0]=%g b1[1]=%g b1[2]=%g b2[0]=%g b2[1]=%g b2[2]=%g c0=%g c1=%g",
561 toDouble(localNorm2(f[0].elem(site))),
562 toDouble(localNorm2(f[1].elem(site))),
563 toDouble(localNorm2(f[2].elem(site))),
564 toDouble(localNorm2(b1[0].elem(site))),
565 toDouble(localNorm2(b1[1].elem(site))),
566 toDouble(localNorm2(b1[2].elem(site))),
567 toDouble(localNorm2(b2[0].elem(site))),
568 toDouble(localNorm2(b2[1].elem(site))),
569 toDouble(localNorm2(b2[2].elem(site))),
580 bool c0_negativeP = c0 < 0;
581 REAL c0abs = fabs((
double)c0);
582 REAL c0max = 2*pow( (
double)(c1/(
double)3), (
double)1.5);
591 REAL
eps = (c0max - c0abs)/c0max;
600 multi1d<int>
coord = Layout::siteCoords(Layout::nodeNumber(), site);
609 else if (
eps < 1.0e-3 ) {
618 REAL sqtwo = sqrt((REAL)2);
620 theta = sqtwo*sqrt(
eps)*( 1.0 + ( (1/(REAL)12) + ( (3/(REAL)160) + ( (5/(REAL)896) + ( (35/(REAL)18432) + (63/(REAL)90112)*
eps ) *
eps) *
eps) *
eps) *
eps);
625 theta = acos( c0abs/c0max );
628 multi1d<REAL> f_site_re(3);
629 multi1d<REAL> f_site_im(3);
631 multi1d<REAL> b1_site_re(3);
632 multi1d<REAL> b1_site_im(3);
634 multi1d<REAL> b2_site_re(3);
635 multi1d<REAL> b2_site_im(3);
639 REAL
u = sqrt(c1/3)*cos(theta/3);
640 REAL w = sqrt(c1)*sin(theta/3);
647 bool w_smallP = fabs(w) < 0.05;
649 xi0 = (REAL)1 - ((REAL)1/(REAL)6)*w_sq*( 1 - ((REAL)1/(REAL)20)*w_sq*( (REAL)1 - ((REAL)1/(REAL)42)*w_sq ) );
658 xi1 = -1*( ((REAL)1/(REAL)3) - ((REAL)1/(REAL)30)*w_sq*( (REAL)1 - ((REAL)1/(REAL)28)*w_sq*( (REAL)1 - ((REAL)1/(REAL)54)*w_sq ) ) );
661 xi1 = cos(w)/w_sq - sin(w)/(w_sq*w);
670 REAL sin2u = sin(2*
u);
671 REAL cos2u = cos(2*
u);
674 REAL ucos2u =
u*cos2u;
675 REAL usin2u =
u*sin2u;
677 REAL denum = (REAL)9*u_sq - w_sq;
680 REAL subexp1 = u_sq - w_sq;
681 REAL subexp2 = 8*u_sq*cosw;
682 REAL subexp3 = (3*u_sq + w_sq)*xi0;
684 f_site_re[0] = ( (subexp1)*cos2u + cosu*subexp2 + 2*usinu*subexp3 ) / denum ;
685 f_site_im[0] = ( (subexp1)*sin2u - sinu*subexp2 + 2*ucosu*subexp3 ) / denum ;
688 REAL subexp = (3*u_sq -w_sq)*xi0;
690 f_site_re[1] = (2*(ucos2u - ucosu*cosw)+subexp*sinu)/denum;
691 f_site_im[1] = (2*(usin2u + usinu*cosw)+subexp*cosu)/denum;
698 f_site_re[2] = (cos2u - cosu*cosw -usinu*subexp) /denum ;
699 f_site_im[2] = (sin2u + sinu*cosw -ucosu*subexp) /denum ;
704 multi1d<REAL> r_1_re(3);
705 multi1d<REAL> r_1_im(3);
706 multi1d<REAL> r_2_re(3);
707 multi1d<REAL> r_2_im(3);
713 REAL subexp1 = u_sq - w_sq;
714 REAL subexp2 = 8*cosw + (3*u_sq + w_sq)*xi0 ;
715 REAL subexp3 = 4*u_sq*cosw - (9*u_sq + w_sq)*xi0 ;
717 r_1_re[0] = 2*(ucos2u - sin2u *(subexp1)+ucosu*( subexp2 )- sinu*( subexp3 ) );
718 r_1_im[0] = 2*(usin2u + cos2u *(subexp1)-usinu*( subexp2 )- cosu*( subexp3 ) );
723 REAL subexp1 = cosw+3*xi0;
724 REAL subexp2 = 2*cosw + xi0*(w_sq - 3*u_sq);
726 r_1_re[1] = 2*((cos2u - 2*usin2u) + usinu*( subexp1 )) - cosu*( subexp2 );
727 r_1_im[1] = 2*((sin2u + 2*ucos2u) + ucosu*( subexp1 )) + sinu*( subexp2 );
733 REAL subexp = cosw - 3*xi0;
734 r_1_re[2] = -2*sin2u -3*ucosu*xi0 + sinu*( subexp );
735 r_1_im[2] = 2*cos2u +3*usinu*xi0 + cosu*( subexp );
742 REAL subexp = cosw + xi0 + 3*u_sq*xi1;
743 r_2_re[0] = -2*(cos2u +
u*( 4*ucosu*xi0 - sinu*(subexp )) );
744 r_2_im[0] = -2*(sin2u -
u*( 4*usinu*xi0 + cosu*(subexp )) );
751 REAL subexp = cosw + xi0 - 3*u_sq*xi1;
752 r_2_re[1] = 2*ucosu*xi0 - sinu*( subexp ) ;
753 r_2_im[1] = -2*usinu*xi0 - cosu*( subexp ) ;
760 r_2_re[2] = cosu*xi0 - usinu*subexp ;
761 r_2_im[2] = -( sinu*xi0 + ucosu*subexp ) ;
764 REAL b_denum=2*denum*denum;
767 for(
int j=0;
j < 3;
j++) {
771 REAL subexp2 = 3*u_sq - w_sq;
772 REAL subexp3 = 2*(15*u_sq + w_sq);
774 b1_site_re[
j]=( subexp1*r_1_re[
j] + subexp2*r_2_re[
j] - subexp3*f_site_re[
j] )/b_denum;
775 b1_site_im[
j]=( subexp1*r_1_im[
j] + subexp2*r_2_im[
j] - subexp3*f_site_im[
j] )/b_denum;
782 b2_site_re[
j]=( r_1_re[
j]- subexp1*r_2_re[
j] - subexp2 * f_site_re[
j] )/b_denum;
783 b2_site_im[
j]=( r_1_im[
j] -subexp1*r_2_im[
j] - subexp2 * f_site_im[
j] )/b_denum;
810 for(
int j=0;
j < 3;
j++) {
812 b1[
j].elem(site).elem().elem().real() = b1_site_re[
j];
813 b1[
j].elem(site).elem().elem().imag() = b1_site_im[
j];
815 b2[
j].elem(site).elem().elem().real() = b2_site_re[
j];
816 b2[
j].elem(site).elem().elem().imag() = b2_site_im[
j];
820 multi1d<int>
coord = Layout::siteCoords(Layout::nodeNumber(), site);
821 REAL rat = c0abs/c0max;
824 "%s: site=%d coord=[%d,%d,%d,%d] f_site[0]=%g f_site[1]=%g f_site[2]=%g 1[0]=%g b1[1]=%g b1[2]=%g b2[0]=%g b2[1]=%g b2[2]=%g denum=%g c0=%g c1=%g c0max=%g rat=%g theta=%g",
827 toDouble(localNorm2(cmplx(Real(f_site_re[0]),Real(f_site_im[0])))),
828 toDouble(localNorm2(cmplx(Real(f_site_re[1]),Real(f_site_im[1])))),
829 toDouble(localNorm2(cmplx(Real(f_site_re[2]),Real(f_site_im[2])))),
830 toDouble(localNorm2(b1[0].elem(site))),
831 toDouble(localNorm2(b1[1].elem(site))),
832 toDouble(localNorm2(b1[2].elem(site))),
833 toDouble(localNorm2(b2[0].elem(site))),
834 toDouble(localNorm2(b2[1].elem(site))),
835 toDouble(localNorm2(b2[2].elem(site))),
861 for(
int j=0;
j < 3;
j++) {
862 f[
j].elem(site).elem().elem().real() = f_site_re[
j];
863 f[
j].elem(site).elem().elem().imag() = f_site_im[
j];
875 const LatticeColorMatrix& QQ,
876 multi1d<LatticeComplex>& f,
877 multi1d<LatticeComplex>& b1,
878 multi1d<LatticeComplex>& b2,
882 QDP::StopWatch swatch;
892 int num_sites = Layout::sitesOnNode();
896 #if !defined(BUILD_JIT_CLOVER_TERM)
897 #warning "Using QDP++ stouting"
900 #if defined(QDPJIT_IS_QDPJITPTX)
901 #warning "Using QDP-JIT/PTX stouting"
903 static CUfunction
function;
905 if (
function == NULL)
906 function = function_get_fs_bs_build(
Q,QQ,f,b1,b2,dobs );
909 function_get_fs_bs_exec(
function,
Q,QQ,f,b1,b2,dobs );
910 #elif defined(QDPJIT_IS_QDPJITNVVM)
911 #warning "Using QDP-JIT/NVVM stouting"
912 static CUfunction
function;
913 if (
function == NULL)
914 function = function_get_fs_bs_build(
Q,QQ,f,b1,b2 );
915 function_get_fs_bs_exec(
function,
Q,QQ,f,b1,b2,dobs );
917 #warning "Using QDP-JIT/LLVM stouting"
918 static JitFunction
function;
920 if (!
function.built()) {
921 QDPIO::cout <<
"Building JIT stouting function\n";
922 function_get_fs_bs_build(
function,
Q,QQ,f,b1,b2 );
926 function_get_fs_bs_exec(
function,
Q,QQ,f,b1,b2,dobs );
937 multi1d<LatticeColorMatrix>& next,
938 const multi1d<bool>& smear_in_this_dirP,
939 const multi2d<Real>& rho)
945 if( smear_in_this_dirP[
mu] )
947 LatticeColorMatrix
Q, QQ;
950 getQs(current,
Q, QQ,
mu, smear_in_this_dirP, rho);
953 multi1d<LatticeComplex> f;
957 next[
mu]=(f[0] + f[1]*
Q + f[2]*QQ)*current[
mu];
960 next[
mu]=current[
mu];
971 const multi1d<LatticeColorMatrix>& current,
973 const multi1d<bool>& smear_in_this_dirP,
974 const multi2d<Real>& rho)
978 LatticeColorMatrix
Q, QQ;
981 getQs(current,
Q, QQ,
mu, smear_in_this_dirP, rho);
984 multi1d<LatticeComplex> f;
988 next = (f[0] + f[1]*
Q + f[2]*QQ)*current[
mu];
Primary include file for CHROMA library code.
void getFs(const LatticeColorMatrix &Q, const LatticeColorMatrix &QQ, multi1d< LatticeComplex > &f)
Given c0 and c1 compute the f-s and b-s.
void smear_links(const multi1d< LatticeColorMatrix > ¤t, multi1d< LatticeColorMatrix > &next, const multi1d< bool > &smear_in_this_dirP, const multi2d< Real > &rho)
Do the smearing from level i to level i+1.
void getQs(const multi1d< LatticeColorMatrix > &u, LatticeColorMatrix &Q, LatticeColorMatrix &QQ, int mu, const multi1d< bool > &smear_in_this_dirP, const multi2d< Real > &rho)
Given field U, form Q and Q^2.
void deriv_recurse(multi1d< LatticeColorMatrix > &F, const multi1d< bool > &smear_in_this_dirP, const multi2d< Real > &rho, const multi1d< LatticeColorMatrix > &u)
Do the force recursion from level i+1, to level i.
void getFsAndBs(const LatticeColorMatrix &Q, const LatticeColorMatrix &QQ, multi1d< LatticeComplex > &f, multi1d< LatticeComplex > &b1, multi1d< LatticeComplex > &b2, bool dobs)
Given c0 and c1 compute the f-s and b-s.
void getQsandCs(const multi1d< LatticeColorMatrix > &u, LatticeColorMatrix &Q, LatticeColorMatrix &QQ, LatticeColorMatrix &C, int mu, const multi1d< bool > &smear_in_this_dirP, const multi2d< Real > &rho)
Given field U, construct the staples into C, form Q and Q^2 and compute c0 and c1.
void stout_smear(LatticeColorMatrix &next, const multi1d< LatticeColorMatrix > ¤t, int mu, const multi1d< bool > &smear_in_this_dirP, const multi2d< Real > &rho)
Stout smear in a specific link direction.
SpinMatrix C()
C = Gamma(10)
static double functions_secs
static double smearing_secs
double getFunctionsTime()
void getFsAndBsSiteLoop(int lo, int hi, int myId, GetFsAndBsArgs *arg)
Asqtad Staggered-Dirac operator.
static multi1d< LatticeColorMatrix > u
LinOpSysSolverMGProtoClover::Q Q
FloatingPoint< double > Double
const LatticeColorMatrix & Q
multi1d< LatticeComplex > & b2
multi1d< LatticeComplex > & f
const LatticeColorMatrix & QQ
multi1d< LatticeComplex > & b1
multi1d< LatticeColorMatrix > Q
static INTERNAL_PRECISION F