CHROMA
central_tprec_nospin_utils.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 /*! \file
3  * \brief Support for time preconditioning
4  */
5 
6 #ifndef CENTRAL_TPREC_NOSPIN_UTILS_H
7 #define CENTRAL_TPREC_NOSPIN_UTILS_H
8 #include "qdp_config.h"
9 
10 #if QDP_NS == 4
11 #if QDP_NC == 3
12 #if QDP_ND == 4
13 #include "chromabase.h"
14 
15 namespace Chroma
16 {
17 
18  //! Support for time preconditioning
19  /*!
20  * \ingroup linop
21  */
22  namespace CentralTPrecNoSpinUtils
23  {
24  typedef PScalar<PColorMatrix<RComplex<REAL>, 3> > CMat; // Useful type: ColorMat with no Outer<>
25  typedef PSpinVector<PColorVector<RComplex<REAL>, 3>, 2 > HVec_site; // Useful type: Half Vec with no Outer<>
26 
27  /*! \ingroup linop */
28  inline
29  void TOp(LatticeHalfFermion& chi,
30  const LatticeHalfFermion& psi,
31  const multi1d<LatticeColorMatrix>& u,
32  const multi2d<int>& tsite,
33  const Real& fact,
34  enum PlusMinus isign,
35  const bool schroedingerTP=false) {
36  const int t_index = 3; // Fixed
37  int Nt = tsite.size1();
38 
39  for(int site=0; site < tsite.size2(); site++) {
40 
41  // tsite[t] now holds the index for the elem() so that we can cycle
42  // through the time
43 
44  // Now we need to apply different matrices
45  switch(isign) {
46  case PLUS:
47  {
48  // Now we need to apply the matrix
49  //
50  // [ chi( t_0 ) ] [ fact -U(x,t_0) 0 ... ] [ psi( t_0 ) ]
51  // [ chi( t_1 ) ] [ 0 fact -U(x,t_1) 0 ... ] [ psi( t_1 ) ]
52  // [ .... ]= [ ... 0 fact -U(x, t_Nt-2) ] [ psi( ... ) ]
53  // [ chi(t_Nt-1)] [ -U(x, t_Nt-1) 0 .... fact ] [ psi( t_Nt-1 ) ]
54  //
55  // where t_i = tsite( i )
56  //
57  // This need a loop over spatial sites
58 
59  // Last row
60  chi.elem(tsite(site,Nt-1)) = fact.elem()*psi.elem( tsite(site,Nt-1) );
61  // If boundaries are not Schroedinger add the lower left piece
62  if( ! schroedingerTP ) {
63  chi.elem(tsite(site,Nt-1)) -= u[t_index].elem(tsite(site,Nt-1)) * psi.elem( tsite(site,0) );
64  }
65  // Rest of the rows
66  for(int t=Nt-2; t >= 0; t--) {
67  chi.elem( tsite(site,t) ) = fact.elem()*psi.elem(tsite(site,t));
68  chi.elem( tsite(site,t) ) -= u[t_index].elem(tsite(site,t)) * psi.elem(tsite(site,t+1) );
69  }
70  }
71  break;
72  case MINUS:
73  {
74  // Now we need to apply the matrix
75  //
76  // [ chi( t_0 ) ] [ fact 0 0 ... -U^{+}(x,t_Nt-1) ] [ psi( t_0 ) ]
77  // [ chi( t_1 ) ] [ -U^{+}(x,t_0) fact 0 ... 0 ] [ psi( t_1 ) ]
78  // [ .... ]= [ 0 -U^{+}(x,t_1) fact 0 ] [ psi( ... ) ]
79  // [ chi(t_Nt-1)] [ 0 -U^{+}(x,t_Nt-2) fact ] [ psi( t_Nt-1 ) ]
80  //
81  // where t_i = tsite(site, i )
82  //
83  // This need a loop over spatial sites
84 
85  // Last row
86 
87  chi.elem(tsite(site,0)) = fact.elem()*psi.elem(tsite(site,0));
88 
89  // If not Schroedinger, then subtrac off upper right contribution
90  if( !schroedingerTP ) {
91  chi.elem(tsite(site,0)) -= adj( u[t_index].elem(tsite(site,Nt-1)) ) * psi.elem(tsite(site,Nt-1));
92  }
93 
94  for(int t=1; t < Nt; t++) {
95 
96  chi.elem(tsite(site,t)) = fact.elem() *psi.elem(tsite(site,t));
97  chi.elem(tsite(site,t)) -= adj( u[t_index].elem( tsite(site,t-1) ) ) * psi.elem(tsite(site,t-1) );
98  }
99  }
100  break;
101  default:
102  QDPIO::cout << "Unknown Sign " << std::endl;
103  QDP_abort(1);
104  }
105 
106  }
107  }
108 
109 
110 
111  /*! \ingroup linop */
112  inline
113  void invTOp(LatticeHalfFermion& chi,
114  const LatticeHalfFermion& psi,
115  const multi1d<LatticeColorMatrix>& u,
116  const multi2d<int>& tsite,
117  const multi2d<CMat>& P_mat,
118  const multi2d<CMat>& P_mat_dag,
119  const multi1d<CMat>& Q_mat_inv,
120  const multi1d<CMat>& Q_mat_dag_inv,
121  const Real& invfact,
122  enum PlusMinus isign,
123  const int t_max,
124  const bool schroedingerTP=false)
125  {
126 #ifndef QDP_IS_QDPJIT
127  const int t_index=3;
128  int Nt=tsite.size1();
129 
130  for(int site=0; site < tsite.size2(); site++) {
131 
132  // I can index the psi and u directly, but I can keep the temporary in just a site's worth.
133  // Better for cacheing maybe.
134  // multi1d<HVec_site> z_strip(Nt);
135 
136  // First apply (T_0)^{-1} -- easy to do with backward / forward (for dagger) subsitution
137  //
138  // z = T_{0}^{-1} psi
139  switch(isign) {
140  case PLUS:
141  {
142  // Now we need to solve
143  //
144  // [ fact -U(x,t_0) 0 ... ] [ chi( t_0 ) ] [ psi( t_0 ) ]
145  // [ 0 fact -U(x,t_1) 0 ... ] [ chi( t_1 ) ] [ psi( t_1 ) ]
146  // [ ... 0 fact -U(x, t_Nt-2) ] [ chi( ... ) ] = [ psi( ... ) ]
147  // [ 0 0 .... fact ] [ chi( t_Nt-1 ) ] [ psi( t_Nt-1 ) ]
148  //
149  // where t_i = tsite(z,y,x)( i )
150  //
151  // by backsubstitution
152 
153  // Last row
154  chi.elem( tsite(site,Nt-1) )= invfact.elem()*psi.elem( tsite(site,Nt-1) );
155 
156 
157  // Rest of the rows
158  for(int t=Nt-2; t >= 0; t--) {
159  chi.elem( tsite(site,t) ) = psi.elem( tsite(site,t) );
160  chi.elem( tsite(site,t) ) += u[t_index].elem( tsite(site,t) ) * chi.elem( tsite(site,t+1) );
161  chi.elem( tsite(site,t) ) *= invfact.elem();
162 
163  }
164 
165  // NB: For Schroedinger boundaries we don't need
166  // To do the Woodbury piece since the matrix is strictly
167  // bidiagonal (no wraparound piece that needs Woodbury correction)
168  if( !schroedingerTP ) {
169  // Now get ( 1 - P Q W^\dag ) z ( SMW Formula )
170  // P and Q precomputed in constructor as P_mat and Q_mat_inv
171 
172  // Compute z - P Q W^\dag z
173  // W^\dag = (1, 0, 0, ...)
174  // W^\dag z = z_0
175  // Let x = Q z_0 = Q W z
176  HVec_site x_site = Q_mat_inv(site) * chi.elem( tsite(site,0) );
177 
178  // Now ( 1 - P Q W z ) = z - P x
179 
180  // OK Basically we can save flops here.
181  // We only need to add on Px if P not numerically zero
182  int loop_end;
183  if( Nt-1-t_max <= 0 ) {
184  loop_end=-1;
185  }
186  else {
187  loop_end=Nt-1-t_max;
188  }
189 
190  for(int t=Nt-1; t > loop_end ; t--) {
191  chi.elem( tsite(site,t) ) -= P_mat(site,t) * x_site;
192  }
193  }
194  // Done! Not as painful as I thought
195  }
196  break;
197  case MINUS:
198  {
199  // Now we need to apply the matrix
200  //
201  // [ fact 0 0 ... 0 ] [ chi( t_0 ) ] [ psi(t_0) ]
202  // [ -U^{+}(x,t_0) fact 0 ... 0 ] [ chi( t_1 ) ] [ psi(t_1) ]
203  // [ 0 -U^{+}(x,t_1) fact 0 ] [ chi( ... ) ] = [ psi(...) ]
204  // [ 0 -U^{+}(x,t_Nt-2) fact ] [ chi( t_Nt-1 ) ] [ psi(t_Nt-1) ]
205  //
206  // where t_i = tsite(z,y,x)( i )
207  //
208  // This need a loop over spatial sites
209 
210  // Last row
211  chi.elem( tsite(site,0) )= invfact.elem()*psi.elem( tsite(site,0) );
212 
213  for(int t=1; t < Nt; t++) {
214  chi.elem( tsite(site,t) ) = psi.elem( tsite(site,t) );
215  chi.elem( tsite(site,t) ) += adj( u[t_index].elem(tsite(site,t-1) ) ) * chi.elem( tsite(site,t-1) );
216  chi.elem( tsite(site,t) ) *= invfact.elem();
217  }
218 
219  // NB: For Schroedinger boundaries we don't need
220  // To do the Woodbury piece since the matrix is strictly
221  // bidiagonal (no wraparound piece that needs Woodbury correction)
222  if( !schroedingerTP ) {
223  // Compute z - P^dag Q^dag W^dag z
224  // W^\dag = ( 0, ...., 1) => \W^\dag z = z_Nt-1
225 
226  HVec_site x_site = Q_mat_dag_inv(site) * chi.elem( tsite(site,Nt-1) );
227 
228  // Now ( 1 - P Q W z) = z - P x
229  int loop_end;
230  if ( t_max >= Nt-1 ) {
231  loop_end=Nt;
232  }
233  else {
234  loop_end=t_max;
235  }
236 
237  for(int t=0; t < loop_end; t++) {
238  chi.elem( tsite(site,t) ) -= P_mat_dag(site,t)*x_site;
239  }
240  }
241  // Done! Not as painful as I thought
242  }
243  break;
244  default:
245  QDPIO::cout << "Unknown Sign " << std::endl;
246  QDP_abort(1);
247  }
248  }
249 #endif
250  }
251 
252 
253  /*! \ingroup linop */
254  inline
255  void invert3by3( CMat& M_inv, const CMat& M )
256  {
257 #ifndef QDP_IS_QDPJIT
258  START_CODE();
259 
260  int Nvec = 3;
261 
262  // Copy b and M so that we can change elements of the copies
263  // during the pivoting and the LU decomposition. We can save
264  // memory by just destroying M, but we never really expect
265  // it to be really big: At most 20x20 I should imagine.
266 
267  PScalar<PColorMatrix<RComplex<REAL>, Nc> > M_tmp;
268  for(int i=0; i < 3; i++) {
269  for(int j=0; j < 3; j++) {
270  M_tmp.elem().elem(i,j).real() = 0;
271  M_tmp.elem().elem(i,j).imag() = 0;
272  }
273  M_tmp.elem().elem(i,i).real() = 1;
274  }
275 
276  PScalar<PColorMatrix<RComplex<REAL>, Nc> > M_local = M;
277 
278  // -----------------------------------------------------------------
279  // LU Decompose M_local, in place (Crone's algorithm?)
280  // It's in Numerical Recipes but also a more understandable
281  // description can be found at:
282  // http://csep10.phys.utk.edu/guidry/
283  // phys594/lectures/linear_algebra/lanotes/node3.html
284  //
285  // OR look in your favourite Matrix Analysis text
286  // -----------------------------------------------------------------
287 
288  // -------------------------------------------------------------
289  // Start LU Decomp. Definition. 0-th row of U is 0-th row of M
290  // and L_{i,i} = 1 for all i
291  //
292  // So we start with the 1-th (2nd) row
293  // ------------------------------------------------------------
294 
295  for(int i = 1; i < Nvec; i++) {
296 
297  // ------------------------------------------------------------
298  // Parital Pivot: Find the row with the largest element in the
299  // ith-column and make that the i-th row. This swaps rows.
300  // so I don't need to reorder the unknowns, but I do need
301  // to reorder the b_local
302  // ------------------------------------------------------------
303  REAL maxnorm = M_local.elem().elem(i,i).real()*M_local.elem().elem(i,i).real()
304  + M_local.elem().elem(i,i).imag()*M_local.elem().elem(i,i).imag();
305 
306  int maxrow = i;
307 
308  // Compare norms with other elements in column j for row i+1.N
309  for(int row=i+1; row < Nvec; row++) {
310  REAL normcheck = M_local.elem().elem(row,i).real()*M_local.elem().elem(row,i).real()
311  + M_local.elem().elem(row,i).imag()*M_local.elem().elem(row,i).imag();
312 
313  if ( toBool( normcheck > maxnorm ) ) {
314  // Norm of M_local(j,i) is bigger, store it as the maximum
315  // and store its index
316  maxnorm = normcheck;
317  maxrow = row;
318  }
319  }
320 
321  // If the element with maximum norm is not in row i, swap
322  // its row with row i
323  if( maxrow != i ) {
324  Complex tmp;
325 
326  // Swap rows i and maxindex
327  for(int j=0; j < Nvec; j++ ) {
328 
329  tmp.elem().elem().elem() = M_local.elem().elem(i, j);
330  M_local.elem().elem(i,j) = M_local.elem().elem(maxrow, j);
331  M_local.elem().elem(maxrow, j) = tmp.elem().elem().elem();
332 
333  // Swap elems of Minx
334  tmp.elem().elem().elem() = M_tmp.elem().elem(i,j);
335  M_tmp.elem().elem(i,j) = M_tmp.elem().elem(maxrow,j);
336  M_tmp.elem().elem(maxrow,j) = tmp.elem().elem().elem();
337 
338  }
339 
340  }
341 
342  // --------------------------------------------------------
343  // End of pivoting code
344  // --------------------------------------------------------
345 
346 
347  // --------------------------------------------------------
348  // Work out elements of L & U in place in M_local for row i
349  // --------------------------------------------------------
350  for(int j=0; j < i; j++) {
351 
352  Complex sum_LU(0);
353 
354  for(int k = 0; k < j; k++) {
355  sum_LU.elem().elem().elem() += M_local.elem().elem(i,k)*M_local.elem().elem(k,j);
356  }
357 
358  M_local.elem().elem(i,j) -= sum_LU.elem().elem().elem();
359  M_local.elem().elem(i,j) /= M_local.elem().elem(j,j);
360  }
361 
362  for(int j=i; j < Nvec; j++) {
363  Complex sum_LU(0);
364  for(int k = 0; k < i; k++) {
365  sum_LU.elem().elem().elem() += M_local.elem().elem(i,k)*M_local.elem().elem(k,j);
366  }
367  M_local.elem().elem(i,j) -= sum_LU.elem().elem().elem();
368  }
369 
370  }
371 
372  // ----------------------------------------------------
373  // LU Decomp finished. M_local now holds the
374  // U matrix in its diagonal and superdiagonal elements
375  // and the subdiagonal elements of the L matrix in its
376  // subdiagonal. Recall that the Diagonal elements of L
377  // are chosen to be 1
378  // -----------------------------------------------------
379 
380  // Solve L y = b by forward substitution
381  multi1d< Complex > y(Nvec);
382 
383  for(int k=0; k < Nvec; k++) {
384 
385  y[0].elem().elem().elem() = M_tmp.elem().elem(0,k);
386  for(int i=1; i < Nvec; i++) {
387  y[i].elem().elem().elem() = M_tmp.elem().elem(i,k);
388  for(int j=0; j < i; j++) {
389  y[i].elem().elem().elem() -= M_local.elem().elem(i,j)*y[j].elem().elem().elem();
390  }
391  }
392 
393  // Solve U a = y by back substitution
394  M_inv.elem().elem(Nvec-1,k) = y[Nvec-1].elem().elem().elem() / M_local.elem().elem(Nvec-1, Nvec-1);
395 
396  for(int i = Nvec-2; i >= 0; i--) {
397  Complex tmpcmpx = y[i];
398  for(int j=i+1; j < Nvec; j++) {
399  tmpcmpx.elem().elem().elem() -= M_local.elem().elem(i,j)*M_inv.elem().elem(j,k);
400  }
401  M_inv.elem().elem(i,k) = tmpcmpx.elem().elem().elem() /M_local.elem().elem(i,i);
402  }
403 
404  }
405 #endif
406  }
407 
408  inline
409  Double logDet(const CMat& M) {
410 #ifndef QDP_IS_QDPJIT
411  // Possibly this is the Dumb way but it is only a small matrix
412  // This is to be done by the matrix of cofactors:
413  //
414  // [ M_00 M_01 M_02 ]
415  // [ M_10 M_11 M_12 ]
416  // [ M_20 M_21 M_22 ]
417  //
418  // I express by the top row so M_00 det( A ) - M_01 det(B) + M_02 det(C)
419  //
420  // [ M_11 M_12 ] [ M_10 M_12 ] [ M_10 M_11 ]
421  // A = [ ] B = [ ] C = [ ]
422  // { M_21 M_22 ] [ M_20 M_22 ] [ M_20 M_21 ]
423  //
424  // and the 2 by 2 determinant is (eg for A) det(A)= M_11 M_22 - M_21 M_12
425  //
426  // Since our Matrix M has to be of the form ( 1 + P_0 )^\dagger (1 + P_0)
427  // we KNOW that the determinant has to be real, so just take real part and return.
428 
429  //PScalar< PScalar< PScalar< RComplex<REAL> > > > ret_val;
430  Complex ret_val;
431 
432  ret_val.elem().elem().elem() = M.elem().elem(0,0)*( M.elem().elem(1,1)*M.elem().elem(2,2) - M.elem().elem(2,1)*M.elem().elem(1,2) );
433  ret_val.elem().elem().elem() -= M.elem().elem(0,1)*( M.elem().elem(1,0)*M.elem().elem(2,2) - M.elem().elem(2,0)*M.elem().elem(1,2) );
434  ret_val.elem().elem().elem() += M.elem().elem(0,2)*( M.elem().elem(1,0)*M.elem().elem(2,1) - M.elem().elem(2,0)*M.elem().elem(1,1) );
435 
436  return Double(log(real(ret_val)));
437 #endif
438  Double tmp; // Make compiler happy
439  return tmp;
440  }
441 
442 
443  inline
444  void derivLogDet(multi1d<LatticeColorMatrix>& F,
445  const multi1d<LatticeColorMatrix>& U,
446  const multi1d<CMat>& Q,
447  const multi2d<int>& tsites,
448  const int t_dir,
449  const Real NdPlusM,
450  const bool schroedingerTP=false)
451  {
452 #ifndef QDP_IS_QDPJIT
453 
454 
455  F.resize(Nd);
456 
457  // Initial setup. Zero out all the non-time directions
458  for(int mu=0; mu < Nd; mu++) {
459  if( mu != t_dir ) {
460  F[mu] = zero;
461  }
462  }
463 
464  if( ! schroedingerTP ) {
465 
466  LatticeColorMatrix T1;
467  Real invmass = Real(1)/ NdPlusM;
468  Real factor;
469 
470  // Work out factor
471  int Nspace=tsites.size2();
472  int Nt = tsites.size1();
473 
474  factor=Real(2);
475  for(int t=0; t < Nt; t++) {
476  factor*=invmass;
477  }
478 
479  for(int site=0; site < Nspace; site++) {
480 
481  // Compute force for all timeslices T
482  for(int t=0; t < Nt; t++) {
483 
484  // Initialize temporary
485  CMat F_tmp;
486 
487  // This creates a unit matrix
488  for(int r=0; r < 3; r++) {
489  for(int c=0; c < 3; c++) {
490  F_tmp.elem().elem(r,c).real() = 0;
491  F_tmp.elem().elem(r,c).imag() = 0;
492  }
493  }
494 
495  for(int r=0; r < 3; r++) {
496  F_tmp.elem().elem(r,r).real() = 1;
497  F_tmp.elem().elem(r,r).imag() = 0;
498  }
499 
500  CMat F_tmp2;
501 
502  // Do the U-s from t+1 to Nt unless you already are Nt-1
503  for(int j=t+1; j < Nt; j++) {
504  F_tmp2 = F_tmp;
505  int s = tsites(site,j);
506  F_tmp = F_tmp2 * U[t_dir].elem(s);
507  }
508 
509  // Insert the Q
510  F_tmp2 = F_tmp;
511  F_tmp = F_tmp2 * Q[site];
512 
513  // Do the U-s from zero up to t-1
514  for(int j=0; j < t; j++) {
515  F_tmp2 = F_tmp;
516  int s = tsites(site,j);
517  F_tmp = F_tmp2*U[t_dir].elem(s);
518  }
519  // Copy force to temporary
520  T1.elem(tsites(site,t)) = F_tmp;
521 
522  }
523  }
524 
525  // Create the force
526  F[t_dir] = factor*T1;
527  }
528  else {
529  // Schroedinger BC-s. Matrix is upper/lower bidiagonal
530  // and the determinant is a constant independent of the
531  // gauge fields.-In this case we ignore the constant
532  // and generate no_force
533  F[t_dir] = zero;
534  }
535 #endif
536  }
537 
538 
539  // For use by the checkerboarded version...
540  inline
541  void derivLogDet(multi1d<LatticeColorMatrix>& F,
542  const multi1d<LatticeColorMatrix>& U,
543  const multi2d<CMat>& Q,
544  const multi3d<int>& tsites,
545  const int t_dir,
546  const Real NdPlusM,
547  const bool schroedingerTP=false)
548  {
549 #ifndef QDP_IS_QDPJIT
550 
551 
552  F.resize(Nd);
553 
554  // Initial setup. Zero out all the non-time directions
555  for(int mu=0; mu < Nd; mu++) {
556  if( mu != t_dir ) {
557  F[mu] = zero;
558  }
559  }
560 
561  if( ! schroedingerTP ) {
562 
563  LatticeColorMatrix T1;
564  Real invmass = Real(1)/ NdPlusM;
565  Real factor;
566 
567  // Work out factor
568  int Nspace=tsites.size2();
569  int Nt = tsites.size1();
570 
571  factor=Real(2);
572  for(int t=0; t < Nt; t++) {
573  factor*=invmass;
574  }
575 
576  for(int cb3=0; cb3 < 2; cb3++) {
577  for(int site=0; site < Nspace; site++) {
578 
579  // Compute force for all timeslices T
580  for(int t=0; t < Nt; t++) {
581 
582  // Initialize temporary
583  CMat F_tmp;
584 
585  // This creates a unit matrix
586  for(int r=0; r < 3; r++) {
587  for(int c=0; c < 3; c++) {
588  F_tmp.elem().elem(r,c).real() = 0;
589  F_tmp.elem().elem(r,c).imag() = 0;
590  }
591  }
592 
593  for(int r=0; r < 3; r++) {
594  F_tmp.elem().elem(r,r).real() = 1;
595  F_tmp.elem().elem(r,r).imag() = 0;
596  }
597 
598  CMat F_tmp2;
599 
600  // Do the U-s from t+1 to Nt unless you already are Nt-1
601  for(int j=t+1; j < Nt; j++) {
602  F_tmp2 = F_tmp;
603  int s = tsites(cb3,site,j);
604  F_tmp = F_tmp2 * U[t_dir].elem(s);
605  }
606 
607  // Insert the Q
608  F_tmp2 = F_tmp;
609  F_tmp = F_tmp2 * Q[cb3][site];
610 
611  // Do the U-s from zero up to t-1
612  for(int j=0; j < t; j++) {
613  F_tmp2 = F_tmp;
614  int s = tsites(cb3,site,j);
615  F_tmp = F_tmp2*U[t_dir].elem(s);
616  }
617  // Copy force to temporary
618  T1.elem(tsites(cb3,site,t)) = F_tmp;
619 
620  }
621  }
622  }
623  // Create the force
624  F[t_dir] = factor*T1;
625  }
626  else {
627  // Schroedinger BC-s. Matrix is upper/lower bidiagonal
628  // and the determinant is a constant independent of the
629  // gauge fields.-In this case we ignore the constant
630  // and generate no_force
631  F[t_dir] = zero;
632  }
633 #endif
634  }
635  } // Namespace
636 
637 } // Namespace chroma
638 
639 #endif
640 #endif
641 #endif
642 
643 #endif
Primary include file for CHROMA library code.
int mu
Definition: cool.cc:24
unsigned j
Definition: ldumul_w.cc:35
int y
Definition: meslate.cc:35
int t
Definition: meslate.cc:37
Nd
Definition: meslate.cc:74
Asqtad Staggered-Dirac operator.
Definition: klein_gord.cc:10
static multi1d< LatticeColorMatrix > u
LatticeFermion tmp
Definition: mespbg5p_w.cc:36
Double c
Definition: invbicg.cc:108
int i
Definition: pbg5p_w.cc:55
@ MINUS
Definition: chromabase.h:45
@ PLUS
Definition: chromabase.h:45
multi1d< LatticeFermion > chi(Ncb)
LatticeFermion psi
Definition: mespbg5p_w.cc:35
START_CODE()
Double zero
Definition: invbicg.cc:106
int k
Definition: invbicg.cc:119
multi1d< LatticeFermion > s(Ncb)
FloatingPoint< double > Double
Definition: gtest.h:7351
multi1d< LatticeColorMatrix > U
multi1d< LatticeColorMatrix > Q
Definition: t_clover.cc:12
static INTERNAL_PRECISION F