Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
force_F_CloverTerm.cpp
Go to the documentation of this file.
1 
14 #include "force_F_CloverTerm.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 //- parameter entries
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_double("hopping_parameter", 0.0);
27  param.Register_double("clover_coefficient", 0.0);
28  param.Register_int_vector("boundary_condition", std::valarray<int>());
29 
30  param.Register_string("verbose_level", "NULL");
31  }
32 
33 
34 #ifdef USE_PARAMETERS_FACTORY
35  bool init_param = ParametersFactory::Register("Force.F_CloverTerm", append_entry);
36 #endif
37 }
38 //- end
39 
40 //- parameters class
42 //- end
43 
44 //====================================================================
46 {
47  const string str_vlevel = params.get_string("verbose_level");
48 
49  m_vl = vout.set_verbose_level(str_vlevel);
50 
51  //- fetch and check input parameters
52  double kappa, cSW;
53  valarray<int> bc;
54 
55  int err = 0;
56  err += params.fetch_double("hopping_parameter", kappa);
57  err += params.fetch_double("clover_coefficient", cSW);
58  err += params.fetch_int_vector("boundary_condition", bc);
59 
60  if (err) {
61  vout.crucial(m_vl, "Force_F_CloverTerm: fetch error, input parameter not found.\n");
62  abort();
63  }
64 
65 
66  set_parameters(kappa, cSW, bc);
67 }
68 
69 
70 //====================================================================
71 void Force_F_CloverTerm::set_parameters(double kappa, double cSW, const valarray<int> bc)
72 {
73  int Ndim = CommonParameters::Ndim();
74 
75  //- print input parameters
76  vout.general(m_vl, "Parameters of Force_F_CloverTerm:\n");
77  vout.general(m_vl, " kappa = %8.4f\n", kappa);
78  vout.general(m_vl, " cSW = %8.4f\n", cSW);
79  for (int mu = 0; mu < Ndim; ++mu) {
80  vout.general(m_vl, " boundary[%d] = %2d\n", mu, bc[mu]);
81  }
82 
83  //- range check
84  // NB. kappa,cSW == 0 is allowed.
85  assert(bc.size() == Ndim);
86 
87  //- store values
88  m_kappa = kappa;
89  m_cSW = cSW;
90 
91  m_boundary.resize(Ndim);
92  for (int mu = 0; mu < Ndim; ++mu) {
93  m_boundary[mu] = bc[mu];
94  }
95 }
96 
97 
98 //====================================================================
99 void Force_F_CloverTerm::init(std::string repr)
100 {
101  m_repr = repr;
102 
104 
106 
108  int Nvol = CommonParameters::Nvol();
109  m_Cud = new Field_G(Nvol, m_Ndim * m_Ndim);
110 }
111 
112 
113 //====================================================================
115 {
116  delete m_Cud;
117  delete m_fopr_csw;
118 }
119 
120 
121 //====================================================================
123 {
124  vout.crucial(m_vl, "force_core() is not available in Force_F_CloverTerm.\n");
125  abort();
126 
127  return eta;
128 }
129 
130 
131 //====================================================================
133  const Field& eta)
134 {
135  int Nc = CommonParameters::Nc();
136  int Nvol = CommonParameters::Nvol();
137  int Ndim = CommonParameters::Ndim();
138  int NinG = 2 * Nc * Nc;
139 
140  Field_G force(Nvol, Ndim), force1(Nvol, Ndim);
141  Mat_SU_N ut(Nc);
142 
143  force1 = force_udiv1(zeta, eta);
144 
145  for (int mu = 0; mu < Ndim; ++mu) {
146  force.mult_Field_Gnn(mu, *m_U, mu, force1, mu);
147  force.at_Field_G(mu);
148  }
149  force *= -2.0;
150 
151  return (Field)force;
152 }
153 
154 
155 //====================================================================
157 {
158  vout.crucial(m_vl, "force_udiv() is not available in Force_F_CloverTerm.\n");
159  abort();
160 
161  return eta;
162 }
163 
164 
165 //====================================================================
167  const Field& eta)
168 {
169  int Nc = CommonParameters::Nc();
170  int Nvol = CommonParameters::Nvol();
171  int Ndim = CommonParameters::Ndim();
172  int NinG = 2 * Nc * Nc;
173 
174  Field force(NinG, Nvol, Ndim);
175 
176  force = force_udiv1_impl((Field_F)zeta, (Field_F)eta);
177 
178  return force;
179 }
180 
181 
182 //====================================================================
184  const Field_F& eta)
185 {
186  int Nc = CommonParameters::Nc();
187  int Nd = CommonParameters::Nd();
188  int Nvol = CommonParameters::Nvol();
189  int Ndim = CommonParameters::Ndim();
190  int NinG = 2 * Nc * Nc;
191 
193 
194  Field force(NinG, Nvol, Ndim);
195  Field_G force1(Nvol, 1), force2(Nvol, 1);
196  Field_G Umu(Nvol, 1), Unu(Nvol, 1), Utmp(Nvol, 1), Utmp2(Nvol, 1);
197  Field_F vt1(Nvol, 1), vt2(Nvol, 1), vt3(Nvol, 1), vt4(Nvol, 1);
198  Field_F zeta_mu(Nvol, 1);
199 
200  Mat_SU_N ut(Nc);
201  Vec_SU_N vec1(Nc), vec2(Nc);
202 
203  Field_F eta2(Nvol, 1), eta3(Nvol, 1);
204 
205  eta2 = (Field_F)m_fopr_csw->mult_gm5(eta);
206 
207  for (int mu = 0; mu < Ndim; ++mu) {
208  for (int nu = 0; nu < Ndim; ++nu) {
209  if (nu == mu) continue;
210 
211  m_fopr_csw->mult_isigma(eta3, eta2, mu, nu);
212 
213  Umu.setpart_ex(0, *m_U, mu);
214  Unu.setpart_ex(0, *m_U, nu);
215 
216  int ex = 0;
217  // R(1) and R(5)
218  vt1.mult_Field_Gd(0, *m_Cud, index_dir(mu, nu), eta3, ex);
219  tensorProd_Field_F(force1, zeta, vt1);
220  force2 = force1;
221 
222  // R(2)
223  vt3.mult_Field_Gd(0, Umu, 0, eta3, ex);
224  shift.backward(vt1, vt3, nu);
225  shift.backward(vt2, zeta, nu);
226  shift.backward(Utmp, Unu, mu);
227  vt3.mult_Field_Gn(0, Utmp, 0, vt1, ex);
228  vt4.mult_Field_Gn(0, Unu, 0, vt2, ex);
229  tensorProd_Field_F(force1, vt4, vt3);
230  force2 += force1;
231 
232  // R(4) and R(8)
233  shift.backward(vt1, eta3, mu);
234  shift.backward(zeta_mu, zeta, mu);
235  vt4.mult_Field_Gn(0, *m_Cud, index_dir(mu, nu), zeta_mu, ex);
236  tensorProd_Field_F(force1, vt4, vt1);
237  force2 += force1;
238 
239  // R(3)
240  shift.backward(vt1, eta3, nu);
241  vt3.mult_Field_Gn(0, Unu, 0, vt1, ex);
242  vt4.mult_Field_Gn(0, Umu, 0, zeta_mu, ex);
243  shift.backward(vt1, vt3, mu);
244  shift.backward(vt2, vt4, nu);
245  vt4.mult_Field_Gn(0, Unu, 0, vt2, ex);
246  tensorProd_Field_F(force1, vt4, vt1);
247  force2 += force1;
248 
249  // R(6)
250  shift.backward(Utmp, Unu, mu);
251  Utmp2.mult_Field_Gdd(0, Utmp, 0, Umu, 0);
252  vt1.mult_Field_Gn(0, Utmp2, 0, eta3, ex);
253  vt2.mult_Field_Gd(0, Unu, 0, zeta, ex);
254  shift.forward(vt3, vt1, nu);
255  shift.forward(vt4, vt2, nu);
256  tensorProd_Field_F(force1, vt4, vt3);
257  force2 -= force1;
258 
259  // R(7)
260  vt1.mult_Field_Gd(0, Unu, 0, eta3, ex);
261  vt2.mult_Field_Gn(0, Umu, 0, zeta_mu, ex);
262  shift.backward(vt3, vt1, mu);
263  shift.forward(vt1, vt3, nu);
264  vt4.mult_Field_Gd(0, Unu, 0, vt2, ex);
265  shift.forward(vt2, vt4, nu);
266  tensorProd_Field_F(force1, vt2, vt1);
267  force2 -= force1;
268 
269  force2 *= -m_kappa * m_cSW / 8.0;
270  force.addpart_ex(mu, force2, 0);
271  }
272  }
273 
274  return force;
275 }
276 
277 
278 //====================================================================
280 {
281  int Nc = CommonParameters::Nc();
282  int Nd = CommonParameters::Nd();
283  int Nvol = CommonParameters::Nvol();
284 
285  Staples staple;
286  Field_G Cmu_ud(Nvol, 1);
287 
288  for (int mu = 0; mu < m_Ndim; ++mu) {
289  for (int nu = 0; nu < m_Ndim; ++nu) {
290  if (nu == mu) continue;
291 
292  Cmu_ud = staple.upper(*m_U, mu, nu);
293  Cmu_ud -= staple.lower(*m_U, mu, nu);
294  m_Cud->setpart_ex(index_dir(mu, nu), Cmu_ud, 0);
295  }
296  }
297 }
298 
299 
300 //====================================================================
301 //============================================================END=====