CHROMA
rect_gaugeact.cc
Go to the documentation of this file.
1 /*! \file
2  * \brief Rectangle gauge action
3  */
4 
5 #include "chromabase.h"
9 
10 namespace Chroma
11 {
12 
13 
14 
15  namespace RectGaugeActEnv
16  {
17  //! Callback
18  GaugeAction< multi1d<LatticeColorMatrix>, multi1d<LatticeColorMatrix> >* createGaugeAct(XMLReader& xml,
19  const std::string& path)
20  {
21  return new RectGaugeAct(CreateGaugeStateEnv::reader(xml, path),
22  RectGaugeActParams(xml, path));
23  }
24 
25  const std::string name = "RECT_GAUGEACT";
26 
27  //! Local registration flag
28  static bool registered = false;
29 
30  //! Register all the factories
31  bool registerAll()
32  {
33  bool success = true;
34  if (! registered)
35  {
36  success &= TheGaugeActFactory::Instance().registerObject(name, createGaugeAct);
37  registered = true;
38  }
39  return success;
40  }
41 
42  static double time_spent = 0;
43 
44  double getTime(void) { return time_spent; }
45  }
46 
47 
48 
49  // Param constructor/reader
50  RectGaugeActParams::RectGaugeActParams(XMLReader& xml_in, const std::string& path) {
51  XMLReader paramtop(xml_in, path);
52 
53  try {
54 
55  // Read AnisoParam if it exists
56  if( paramtop.count("AnisoParam") != 0 ) {
57  read(paramtop, "AnisoParam", aniso);
58  }
59  else {
60  // Set aniso to not be anisotropic if it doesn't
61  aniso.anisoP = false;
62  aniso.t_dir = Nd -1;
63  aniso.xi_0 = 1;
64  aniso.nu = 1;
65  }
66 
67 
68  if ( aniso.anisoP == false ) {
69 
70  // If we are not anisotropic look for coeff
71  // and set both coeff_s = coeff_t = coeff, do temporal = true
72 
73  read(paramtop, "coeff", coeff_s);
74  coeff_t1 = coeff_s;
75  coeff_t2 = coeff_s;
76 
77  }
78  else {
79 
80  // If we are ansotropic, look for coeff_s and coeff_t
81  read(paramtop, "coeff_s", coeff_s);
82  read(paramtop, "coeff_t1", coeff_t1);
83  read(paramtop, "coeff_t2", coeff_t2);
84 
85  }
86 
87  // In either anisotropic or isotropic case we can optionally
88  // specify whether we want to omit temporal rectangles
89  if( paramtop.count("no_temporal_2link") == 0 ) {
90  // Default: always do temporal
91  no_temporal_2link = false;
92  }
93  else {
94  // If it is specified in the file, then read it.
95  read(paramtop, "no_temporal_2link", no_temporal_2link);
96  }
97 
98  }
99  catch( const std::string& e ) {
100  QDPIO::cerr << "Error reading XML: " << e << std::endl;
101  QDP_abort(1);
102  }
103  }
104 
105  // Read params
106  void read(XMLReader& xml, const std::string& path, RectGaugeActParams& p)
107  {
108  RectGaugeActParams tmp(xml, path);
109  p=tmp;
110  }
111 
112 
113  //! Compute staple
114  /*!
115  * \param u_staple result ( Write )
116  * \param state gauge field ( Read )
117  * \param mu direction for staple ( Read )
118  * \param cb subset on which to compute ( Read )
119  */
120  void
121  RectGaugeAct::staple(LatticeColorMatrix& u_staple,
122  const Handle< GaugeState<P,Q> >& state,
123  int mu, int cb) const
124  {
125  START_CODE();
126  QDPIO::cerr << "RectGaugeAct::staple() - not converted from szin" << std::endl;
127  QDP_abort(1);
128 
129  END_CODE();
130  }
131 
132  inline
133  void RectGaugeAct::deriv_part(int mu, int nu, Real c_munu,
134  multi1d<LatticeColorMatrix>& ds_u,
135  const multi1d<LatticeColorMatrix>& u) const
136  {
137  START_CODE();
138 
139  // ---> ---> = U(x,mu)*U(x+mu, mu)
140  LatticeColorMatrix from_left_2link = u[mu]*shift(u[mu], FORWARD, mu);
141 
142 
143  // upper_l = ----> --->
144  // ^
145  // |
146  //
147  // U(x, nu)*U(x+nu,mu)*U(x+mu+nu, mu)
148  LatticeColorMatrix upper_l = u[nu]*shift(from_left_2link, FORWARD, nu);
149 
150 
151  // <--- <----
152  // |
153  // |
154  // V ---> ---> (x+2mu)
155  //
156  // so here we have the staple for x + 2mu
157  // we need to shift it forward by 2 mu
158 
159  // Here we shift it by mu after assembly
160 
161  // shift, backward mu of:
162  // U^dag(x+mu+nu, mu)*U^dag(x+nu, mu)*U^dag(x, nu)*U(x,mu)*U(x+mu,mu)
163  //=U^dag(x+nu, mu)*U^dag(x-mu+nu, mu)*U^dag(x-mu, nu)*U(x-mu,mu)*U(x,mu)
164  LatticeColorMatrix tmp = shift( adj(upper_l)*from_left_2link, BACKWARD, mu);
165 
166 
167  // and we shift it again
168  // <--- <----
169  // |
170  // |
171  // V ---> ---> (x)
172  //=U^dag(x+-mu+nu, mu)*U^dag(x-2mu+nu, mu)*U^dag(x-2mu, nu)*U(x-2mu,mu)*U(x-mu,mu)
173  ds_u[nu] = shift(tmp, BACKWARD, mu);
174 
175 
176  // Tmp = u(x+mu, nu)
177  tmp = shift(u[nu], FORWARD, mu);
178 
179  // tmp2 = u(x + 2mu, nu)
180  LatticeColorMatrix tmp2 = shift(tmp, FORWARD, mu);
181 
182  // Upper_le = from_left_2link(x+nu) * u^dag(x + 2mu, nu)
183  // = u(x+nu, mu)*u(x+mu+nu, mu)*u^dag(x+2mu, nu)
184 
185  // = ----> ----> |
186  // |
187  // V
188 
189  upper_l = tmp2*adj(shift(from_left_2link, FORWARD, nu));
190 
191  // ds_u = ----> ----> |
192  // |
193  // <---- <--- V
194 
195  // = u(x+nu, mu)*u(x+mu+nu, mu)*u^dag(x+2mu, nu)*u^dag(x+mu, mu)*u^dag(x,mu)
196 
197  ds_u[nu] += adj(upper_l)*adj(from_left_2link);
198 
199 
200 
201  // | <---- <--- ^
202  // | |
203  // | |
204  // x V | x + 2mu
205 
206  // u(x+2mu,nu)*u^dag(x+mu+nu,mu)*u^dag(x+nu, mu)*u^dag(x, nu)
207  LatticeColorMatrix up_staple = upper_l*adj(u[nu]);
208 
209  // ^ |
210  // | |
211  // | |
212  // x <----- <---- V x + 2mu
213 
214  // u^dag(x+2mu,nu) U^dag(x+mu,mu) U^dag(x,mu) U(x,nu)
215  tmp = adj(tmp2)*adj(from_left_2link);
216 
217  LatticeColorMatrix down_staple = tmp*u[nu];
218 
219  // The following terms generate force staple for U(x+mu)
220  // the backward shift moves the contribution to the correct place
221  //
222  // | <---- <--- ^
223  // | |
224  // | |
225  // x V-----> | x + 2mu
226 
227 
228  // u(x+mu,nu)*u^dag(x+nu,mu)*u^dag(x-mu+nu, mu)*u^dag(x-mu, nu) u(x-mu,mu)
229  ds_u[mu] = shift( up_staple*u[mu], BACKWARD, mu);
230 
231  // x ^--- | x+2mu
232  // | |
233  // | |
234  // <----- <---- V
235 
236  // shift backward nu shift backward mu of
237  // u^dag(x+mu-nu,nu) U^dag(x-nu,mu) U^dag(x-mu-nu,mu) U(x-mu-nu,nu) U(x-mu,mu)
238 
239  tmp2 = shift(down_staple, BACKWARD, nu);
240  ds_u[mu] += shift(tmp2*u[mu], BACKWARD, mu);
241 
242  // | <---- <--- ^
243  // | |
244  // | |
245  // x V ----->| x + 2mu
246  tmp = shift(u[mu], FORWARD, mu);
247  ds_u[mu] += tmp*up_staple;
248 
249 
250  // x ^ ----->| x + 2mu + nu
251  // | |
252  // | |
253  // <----- <---- V
254 
255 
256  ds_u[mu] += tmp*tmp2;
257 
258  ds_u[mu] *= c_munu/Real(-2*Nc);
259  ds_u[nu] *= c_munu/Real(-2*Nc);
260 
261  END_CODE();
262  }
263 
264 
265  void
266  RectGaugeAct::deriv(multi1d<LatticeColorMatrix>& ds_u,
267  const Handle< GaugeState<P,Q> >& state) const
268  {
269  START_CODE();
270 
271 
272 #if 1
273  // More efficient version
274  QDP::StopWatch swatch;
275  swatch.reset();
276  swatch.start();
277 
278  ds_u.resize(Nd);
279  Real c;
280 
281  multi1d<LatticeColorMatrix> ds_tmp(Nd);
282 
283  const multi1d<LatticeColorMatrix>& u = state->getLinks();
284 
285  ds_u = zero;
286  ds_tmp = zero;
287 
288  for(int mu=0; mu < Nd; mu++) {
289  for(int nu=0; nu < Nd; nu++) {
290 
291  if (mu == nu) continue;
292 
293  if ( mu == params.aniso.t_dir ) {
294  c = params.coeff_t1;
295  }
296  else if( nu == params.aniso.t_dir ) {
297  c = params.coeff_t2;
298  }
299  else {
300  c = params.coeff_s;
301  }
302 
303  bool skip = (mu == params.aniso.t_dir && params.no_temporal_2link );
304  if (!skip) {
305  deriv_part(mu, nu, c, ds_u, u);
306 
307  ds_tmp[mu] += ds_u[mu];
308  ds_tmp[nu] += ds_u[nu];
309  }
310  }
311  }
312 
313  for(int mu = 0; mu < Nd; mu++) {
314  ds_u[mu] = u[mu]*ds_tmp[mu];
315  }
316 
317  getGaugeBC().zero(ds_u);
318  swatch.stop();
319  RectGaugeActEnv::time_spent += swatch.getTimeInSeconds();
320 #else
321 
322  // This version uses new deriv_spatial/deriv_temporal structure.
323  // Above version saves a couple of closings of the staples
324  // so is faster and should be preferred.
325  // This is for testing only
326  ds_u.resize(Nd);
327  multi1d<LatticeColorMatrix> ds_tmp(Nd);
328 
329  ds_u = zero;
330  ds_tmp = zero;
331 
332  derivSpatial(ds_u, state);
333  derivTemporal(ds_tmp, state);
334 
335  for(int mu=0; mu < Nd; ++mu) {
336  ds_u[mu] += ds_tmp[mu];
337  }
338 #endif
339  END_CODE();
340  }
341 
342  void
343  RectGaugeAct::derivSpatial(multi1d<LatticeColorMatrix>& ds_u,
344  const Handle< GaugeState<P,Q> >& state) const
345 
346  {
347  START_CODE();
348 
349  ds_u.resize(Nd);
350  Real c;
351 
352  multi1d<LatticeColorMatrix> ds_tmp(Nd);
353 
354  const multi1d<LatticeColorMatrix>& u = state->getLinks();
355 
356  ds_u = zero;
357  ds_tmp = zero;
358  const int t_dir = params.aniso.t_dir;
359 
360  // Use spatial coefficient
361  c = params.coeff_s;
362 
363  for(int mu=0; mu < Nd; mu++) {
364  for(int nu=0; nu < Nd; nu++) {
365 
366  // Ensure mu!=nu (so we have a rectangle instead of a line
367  // also that mu and nu are both spatial (neither is t_dir)
368  if ( (mu != nu ) && (mu != t_dir) && (nu != t_dir) ) {
369 
370  deriv_part(mu, nu, c, ds_u, u);
371 
372  ds_tmp[mu] += ds_u[mu];
373  ds_tmp[nu] += ds_u[nu];
374 
375  }
376  }
377  }
378 
379  for(int mu = 0; mu < Nd; mu++) {
380  if( mu != t_dir ) {
381  ds_u[mu] = u[mu]*ds_tmp[mu];
382  }
383  }
384  getGaugeBC().zero(ds_u);
385 
386 
387  END_CODE();
388  }
389 
390 
391  void
392  RectGaugeAct::derivTemporal(multi1d<LatticeColorMatrix>& ds_u,
393  const Handle< GaugeState<P,Q> >& state) const
394 
395  {
396  START_CODE();
397 
398  QDP::StopWatch swatch;
399  swatch.reset();
400  swatch.start();
401 
402  ds_u.resize(Nd);
403  Real c;
404  int mu, nu;
405 
406  multi1d<LatticeColorMatrix> ds_tmp(Nd);
407 
408  const multi1d<LatticeColorMatrix>& u = state->getLinks();
409 
410  ds_u = zero;
411  ds_tmp = zero;
412 
413  // length 1 in the t_dir (nu = t_dir)
414  const int t_dir = params.aniso.t_dir;
415  nu = t_dir;
416  c = params.coeff_t2;
417  for(mu=0; mu < Nd; mu++) {
418  if( mu != nu ) {
419  deriv_part(mu,nu,c,ds_u, u);
420  ds_tmp[mu] += ds_u[mu];
421  ds_tmp[nu] += ds_u[nu];
422  }
423  }
424 
425 
426  // length 2 in the t_dir (mu = t_dir)
427  mu = t_dir;
428  c = params.coeff_t1;
429  for(int nu=0; nu < Nd; nu++) {
430  if( (!params.no_temporal_2link) && (nu != mu ) ) {
431  deriv_part(mu, nu, c, ds_u, u);
432 
433  ds_tmp[mu] += ds_u[mu];
434  ds_tmp[nu] += ds_u[nu];
435  }
436  }
437 
438 
439  for(int mu = 0; mu < Nd; mu++) {
440  ds_u[mu] = u[mu]*ds_tmp[mu];
441  }
442  getGaugeBC().zero(ds_u);
443 
444  END_CODE();
445  }
446 
447 
448  // Get the gauge action
449  //
450  // S = -(coeff/(Nc) Sum Re Tr Rect
451  //
452  // w_rect is defined in MesPlq as
453  //
454  // w_rect =( 2/(V*Nd*(Nd-1)*Nc)) * Sum Re Tr Rect
455  //
456  // so
457  // S = -coeff * (V*Nd*(Nd-1)/2) w_rect
458  // = -coeff * (V*Nd*(Nd-1)/2)*(2/(V*Nd*(Nd-1)*Nc))* Sum Re Tr Rect
459  // = -coeff * (1/(Nc)) * Sum Re Tr Rect
460  Double
462  {
463  START_CODE();
464 
465 #if 1
466  const multi1d<LatticeColorMatrix>& u = state->getLinks();
467  LatticeReal lgimp = zero;
468  Real c;
469 
470  for(int mu=0; mu < Nd; ++mu) {
471  for(int nu = 0; nu < Nd; ++nu) {
472  if( mu == nu) continue;
473 
474  if( mu == params.aniso.t_dir ) {
475  c = params.coeff_t1; // Param for 2x1 in t
476  }
477  else if ( nu == params.aniso.t_dir ) {
478  c = params.coeff_t2;
479  }
480  else {
481  c = params.coeff_s;
482  }
483 
484 
485 
486  // if mu (the long direction) is t_dir and we need to skip this
487  // then skip = true
488  bool skip = ( mu == params.aniso.t_dir && params.no_temporal_2link );
489  if( !skip ) {
490  S_part(mu, nu, c, lgimp, u);
491  }
492  }
493  }
494 
495  Double S_rect = sum(lgimp);
496  S_rect *= -Double(1) / Double(Nc); // note sign here
497 
498  END_CODE();
499 
500  return S_rect;
501 #else
502 
503  // This way ought to work, but has two reductions -- one sum re tr
504  // in spatialS and one sum re tr in the temporalS so the old way
505  // with just 1 reduction is more efficient. Enable this for testing
506  // only
507  START_CODE();
508  Double S_rect = spatialS(state) + temporalS(state);
509  END_CODE();
510  return S_rect;
511 #endif
512  }
513 
514 
515  Double
517  {
518  START_CODE();
519 
520  const multi1d<LatticeColorMatrix>& u = state->getLinks();
521  LatticeReal lgimp = zero;
522  Real c;
523  const int t_dir = params.aniso.t_dir;
524  c = params.coeff_s;
525 
526  for(int mu=0; mu < Nd; ++mu) {
527  for(int nu = 0; nu < Nd; ++nu) {
528  if( (mu != nu) && (mu != t_dir) && (nu != t_dir) ) {
529  S_part(mu, nu, c, lgimp, u);
530  }
531  }
532  }
533 
534  Double S_rect = sum(lgimp);
535  S_rect *= -Double(1) / Double(Nc); // note sign here
536 
537  END_CODE();
538 
539  return S_rect;
540  }
541 
542  Double
544  {
545  START_CODE();
546 
547  const multi1d<LatticeColorMatrix>& u = state->getLinks();
548  LatticeReal lgimp = zero;
549 
550  Real c;
551 
552  int t_dir = params.aniso.t_dir;
553  int nu = t_dir;
554  c = params.coeff_t2;
555 
556  for(int mu=0; mu < Nd; ++mu) {
557  if( mu != nu ) {
558  S_part(mu,nu, c, lgimp, u);
559  }
560  }
561 
562  // previous mu out of scope by here
563  int mu = t_dir;
564  c = params.coeff_t1;
565  for(nu = 0; nu < Nd; ++nu) {
566  if( (!params.no_temporal_2link) && (nu != mu) ) {
567  S_part(mu,nu, c, lgimp, u);
568  }
569  }
570 
571  Double S_rect = sum(lgimp);
572  S_rect *= -Double(1) / Double(Nc); // note sign here
573 
574  END_CODE();
575 
576  return S_rect;
577  }
578 
579 
580  inline
581  void RectGaugeAct::S_part(int mu, int nu, Real c, LatticeReal& lgimp,
582  const multi1d<LatticeColorMatrix>& u) const
583  {
584  START_CODE();
585 
586  LatticeColorMatrix tmp1;
587  LatticeColorMatrix tmp2;
588  LatticeColorMatrix lr_corner;
589  LatticeColorMatrix lower_l;
590  LatticeColorMatrix upper_l;
591  LatticeColorMatrix rectangle_2munu;
592  LatticeColorMatrix rectangle_mu2nu;
593 
594 
595  // ^
596  // lr_corner = | = u(x, mu) * u(x + mu, nu)
597  // |
598  // ----->
599  //
600 
601  lr_corner = u[mu]*shift(u[nu], FORWARD, mu);
602 
603  // ^
604  // lower_l = |
605  // -----> ----->
606 
607  //
608  // lower_l = u(x, mu) u(x + mu, mu) * u(x + 2mu, nu) OK!!
609  lower_l = u[mu]*shift(lr_corner, FORWARD, mu);
610 
611  // Upper L = <----- <-----
612  // |
613  // V
614 
615  // tmp2 = adj(tmp_1)*adj(u[mu]) = u^dag(x + mu, nu) u^dag(x, mu)
616  tmp2 = adj(shift(u[mu], FORWARD, mu))*adj(u[mu]);
617 
618  // tmp1 = tmp2(x+nu) = u^dag(x + mu + nu, mu) * u^dag(x + nu, mu)
619  tmp1 = shift(tmp2, FORWARD, nu);
620 
621  // upper_l = u^dag(x + mu + nu, mu) * u^dag(x + nu, mu) * u^dag(nu)
622  upper_l = tmp1*adj(u[nu]);
623 
624  // Loop = Lower_l * upper_l
625  // = u(x, mu) u(x + mu, mu) * u(x + 2mu, nu)
626  // * u^dag(x + mu + nu, mu) * u^dag(x + nu, mu) * u^dag(nu)
627  rectangle_2munu = lower_l*upper_l;
628 
629 
630  lgimp += c * real(trace(rectangle_2munu));
631  // lgimp += c2 * real(trace(rectangle_mu2nu));
632 
633  END_CODE();
634  }
635 
636 
637 
638  // Isotropic case
640  const Real& coeff_s_) : cgs(cgs_)
641  {
642  START_CODE();
643 
644  // Setup the params structure
645  params.coeff_s = params.coeff_t1 = params.coeff_t2 = coeff_s_;
646  params.no_temporal_2link = false;
647  params.aniso.anisoP = false;
648  params.aniso.t_dir = Nd -1;
649  params.aniso.xi_0 = 1;
650  params.aniso.nu = 1;
651 
652  END_CODE();
653  }
654 
655  // Anisotropic case
657  const Real& coeff_s_,
658  const Real& coeff_t1_,
659  const Real& coeff_t2_,
660  const bool no_temporal_2link_,
661  const AnisoParam_t& aniso_) : cgs(cgs_)
662  {
663  START_CODE();
664 
665  // Setup the params structure
666  params.coeff_s = coeff_s_;
667  params.coeff_t1 = coeff_t1_;
668  params.coeff_t2 = coeff_t2_;
669  params.aniso = aniso_ ; // Rely on struct copy constructor here
670  if( params.aniso.anisoP ) {
674  }
675  params.no_temporal_2link = no_temporal_2link_ ;
676 
677 
678  END_CODE();
679  }
680 
681  //! Read rectangle coefficient from a param struct
683  const RectGaugeActParams& p) : cgs(cgs_)
684  {
685  START_CODE();
686 
687  params = p;
688 
689  if( params.aniso.anisoP ) {
693  }
694 
695  END_CODE();
696  }
697 
698 }
699 
Primary include file for CHROMA library code.
Create a gauge connection state.
Definition: create_state.h:47
Abstract base class for gauge actions.
Definition: gaugeact.h:25
virtual const GaugeBC< multi1d< LatticeColorMatrix >, multi1d< LatticeColorMatrix > > & getGaugeBC() const
Return the gauge BC object for this action.
Definition: gaugeact.h:46
virtual void zero(P &ds_u) const =0
Zero some gauge-like field in place on the masked links.
Support class for fermion actions and linear operators.
Definition: state.h:74
Class for counted reference semantics.
Definition: handle.h:33
Rect gauge action.
Definition: rect_gaugeact.h:54
void derivSpatial(multi1d< LatticeColorMatrix > &result, const Handle< GaugeState< P, Q > > &state) const
compute spatial dS/dU given a time direction
RectGaugeAct()
Partial construcor.
Double temporalS(const Handle< GaugeState< P, Q > > &state) const
Compute the temporal part of the action given a time direction.
void deriv_part(int mu, int nu, Real c_munu, multi1d< LatticeColorMatrix > &ds_u, const multi1d< LatticeColorMatrix > &u) const
RectGaugeActParams params
void derivTemporal(multi1d< LatticeColorMatrix > &result, const Handle< GaugeState< P, Q > > &state) const
compute spatial dS/dU given a time direction
Double spatialS(const Handle< GaugeState< P, Q > > &state) const
Compute the spatial part of the action given a time direction.
void deriv(multi1d< LatticeColorMatrix > &result, const Handle< GaugeState< P, Q > > &state) const
Compute dS/dU.
Double S(const Handle< GaugeState< P, Q > > &state) const
Compute the actions.
void S_part(int mu, int nu, Real c, LatticeReal &lgimp, const multi1d< LatticeColorMatrix > &u) const
void staple(LatticeColorMatrix &result, const Handle< GaugeState< P, Q > > &state, int mu, int cb) const
Compute staple.
static T & Instance()
Definition: singleton.h:432
int mu
Definition: cool.cc:24
int nu
Definition: cool.cc:25
All gauge create-state method.
Fermion action factories.
void read(XMLReader &xml, const std::string &path, AsqtadFermActParams &param)
Read parameters.
Nd
Definition: meslate.cc:74
Double tmp2
Definition: mesq.cc:30
Handle< CreateGaugeState< multi1d< LatticeColorMatrix >, multi1d< LatticeColorMatrix > > > reader(XMLReader &xml_in, const std::string &path)
Helper function for the CreateGaugeState readers.
GaugeAction< multi1d< LatticeColorMatrix >, multi1d< LatticeColorMatrix > > * createGaugeAct(XMLReader &xml, const std::string &path)
Callback.
static bool registered
Local registration flag.
bool registerAll()
Register all the factories.
const std::string name
static double time_spent
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
START_CODE()
int cb
Definition: invbicg.cc:120
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > state
Definition: pbg5p_w.cc:28
Double zero
Definition: invbicg.cc:106
FloatingPoint< double > Double
Definition: gtest.h:7351
::std::string string
Definition: gtest.h:1979
#define FORWARD
Definition: primitives.h:82
#define BACKWARD
Definition: primitives.h:83
Double sum
Definition: qtopcor.cc:37
Rectangle gauge action.
Parameters for anisotropy.
Definition: aniso_io.h:24
Parameter structure.
Definition: rect_gaugeact.h:27