Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Clover_SF.h
Go to the documentation of this file.
1 
14 #ifndef FOPR_CLOVER_SF_INCLUDED
15 #define FOPR_CLOVER_SF_INCLUDED
16 
17 #include "fopr_Wilson_SF.h"
18 #include "staples_SF.h"
19 
20 #include "shiftField_lex.h"
21 #include "gammaMatrixSet.h"
22 
23 #include "bridgeIO.h"
24 using Bridge::vout;
25 
27 
40 //- parameters class
41 class Parameters_Fopr_Clover_SF : virtual public Parameters
42 {
43  public:
45 };
46 //- end
47 
48 class Fopr_Clover_SF : public Fopr
49 {
50  private:
52  double m_kappa, m_cSW;
53  std::valarray<int> m_boundary;
54  std::string m_repr;
55  std::string m_mode;
56 
57  void (Fopr_Clover_SF::*m_csw) (Field_F&, const Field_F&);
58 
59  // Index_lex m_idx;
61  const Field_G *m_U;
63 
65  // Bx = -iF(1,2), By = -iF(2,1), -iBz = F(0,1)
66  // Ex = -iF(4,0), Ey = -iF(4,1), Ez = -iF(4,2)
67 
68  std::valarray<GammaMatrix> m_GM, m_SG;
69 
71  double m_phi[3];
73  double m_phipr[3];
74 
77 
78  public:
80  {
81  init("Dirac");
82  }
83 
84  /*
85  Fopr_Clover_SF(std::string repr){
86  init(repr);
87  }
88  */
89 
91  {
92  tidyup();
93  }
94 
95  void set_parameters(const Parameters& params);
96  void set_parameters(double kappa, double cSW, std::valarray<int> bc,
97  double *phi, double *phipr);
98 
99  void set_config(Field *U)
100  {
101  m_U = (Field_G *)U;
102  m_fopr_w->set_config(U);
103 
104  set_csw();
105  }
106 
107  void set_mode(std::string mode)
108  {
109  m_mode = mode;
110  }
111 
112  std::string get_mode() const
113  {
114  return m_mode;
115  }
116 
117  const Field mult(const Field& f)
118  {
119  Field v(f.nin(), f.nvol(), f.nex());
120 
121  mult(v, f);
122  return v;
123  }
124 
125  const Field mult_dag(const Field& f)
126  {
127  Field v(f.nin(), f.nvol(), f.nex());
128 
129  mult_dag(v, f);
130  return v;
131  }
132 
133  void mult(Field& v, const Field& f)
134  {
135  if (m_mode == "D") {
136  D(v, f);
137  } else if (m_mode == "DdagD") {
138  DdagD(v, f);
139  } else if (m_mode == "Ddag") {
140  Ddag(v, f);
141  } else if (m_mode == "H") {
142  H(v, f);
143  } else {
144  vout.crucial(m_vl, "Fopr_Clover_SF: undefined mode = %s.\n", m_mode.c_str());
145  abort();
146  }
147  }
148 
149  void mult_dag(Field& v, const Field& f)
150  {
151  if (m_mode == "D") {
152  Ddag(v, f);
153  } else if (m_mode == "DdagD") {
154  DdagD(v, f);
155  } else if (m_mode == "Ddag") {
156  D(v, f);
157  } else if (m_mode == "H") {
158  H(v, f);
159  } else {
160  vout.crucial(m_vl, "Fopr_Clover_SF: undefined mode = %s.\n", m_mode.c_str());
161  abort();
162  }
163  }
164 
165  const Field_F DdagD(const Field_F&);
166  const Field_F D(const Field_F&);
167  const Field_F Ddag(const Field_F&);
168  const Field_F H(const Field_F&);
169 
170  const Field mult_gm5(const Field& w)
171  {
172  return m_fopr_w->mult_gm5(w);
173  }
174 
175  void DdagD(Field&, const Field&);
176  void D(Field&, const Field&);
177  void Ddag(Field&, const Field&);
178  void H(Field&, const Field&);
179 
180  void mult_gm5(Field& v, const Field& w)
181  {
182  m_fopr_w->mult_gm5(v, w);
183  }
184 
185  void mult_isigma(Field_F&, const Field_F&,
186  const int mu, const int nu);
187 
188  int field_nvol() { return m_Nvol; }
189  int field_nin() { return 2 * m_Nc * m_Nd; }
190  int field_nex() { return 1; }
191 
192  private:
193  void init(std::string repr);
194  void tidyup();
195 
196  void set_csw();
197  void mult_csw(Field_F&, const Field_F&);
198  void set_fieldstrength(Field_G&, const int, const int);
199 
200  void mult_csw_dirac(Field_F&, const Field_F&);
201  void mult_csw_chiral(Field_F&, const Field_F&);
202 
203  int sg_index(int mu, int nu) { return mu * m_Ndim + nu; }
204 };
205 #endif