Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
forceSmear_HYP.cpp
Go to the documentation of this file.
1 
14 #include "forceSmear_HYP.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 #ifdef USE_FACTORY
23 namespace {
24  ForceSmear *create_object(Projection *proj)
25  {
26  return new ForceSmear_HYP(proj);
27  }
28 
29 
30  bool init = ForceSmear::Factory::Register("HYP", create_object);
31 }
32 #endif
33 
34 //- parameter entries
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_double("alpha1", 0.0);
39  param.Register_double("alpha2", 0.0);
40  param.Register_double("alpha3", 0.0);
41 
42  param.Register_string("verbose_level", "NULL");
43  }
44 
45 
46 #ifdef USE_PARAMETERS_FACTORY
47  bool init_param = ParametersFactory::Register("ForceSmear.HYP", append_entry);
48 #endif
49 }
50 //- end
51 
52 //- parameters class
54 //- end
55 
56 //====================================================================
58 {
59  const string str_vlevel = params.get_string("verbose_level");
60 
61  m_vl = vout.set_verbose_level(str_vlevel);
62 
63  //- fetch and check input parameters
64  double alpha1, alpha2, alpha3;
65 
66  int err = 0;
67  err += params.fetch_double("alpha1", alpha1);
68  err += params.fetch_double("alpha2", alpha2);
69  err += params.fetch_double("alpha3", alpha3);
70 
71  if (err) {
72  vout.crucial(m_vl, "ForceSmear_HYP: fetch error, input parameter not found.\n");
73  abort();
74  }
75 
76 
77  set_parameters(alpha1, alpha2, alpha3);
78 }
79 
80 
81 //====================================================================
82 void ForceSmear_HYP::set_parameters(double alpha1, double alpha2, double alpha3)
83 {
84  //- print input parameters
85  vout.general(m_vl, "Force of HYP smearing parameters:\n");
86  vout.general(m_vl, " alpha1 = %10.6F\n", alpha1);
87  vout.general(m_vl, " alpha2 = %10.6F\n", alpha2);
88  vout.general(m_vl, " alpha3 = %10.6F\n", alpha3);
89 
90  //- range check
91  // NB. alpha1,alpha2,alpha3 == 0 is allowed.
92 
93  //- store values
94  m_alpha1 = alpha1;
95  m_alpha2 = alpha2;
96  m_alpha3 = alpha3;
97 }
98 
99 
100 //====================================================================
102 {
105 
106  m_U.resize(m_Ndim);
107 
108  m_v1.resize(size1());
109  m_v2.resize(size2());
110 
111  m_Sigma3.resize(size2());
112  m_Sigma2.resize(size1b());
113 
114  m_iTheta3.resize(m_Ndim);
115  m_iTheta2.resize(size2());
116  m_iTheta1.resize(size1b());
117 }
118 
119 
120 //====================================================================
122 {
123  assert(U.nvol() == m_Nvol);
124  assert(U.nex() == m_Ndim);
125  assert(Sigmap.nvol() == m_Nvol);
126  assert(Sigmap.nex() == m_Ndim);
127 
128  Field_G Sigma(m_Nvol, m_Ndim);
129 
130  for (int mu = 0; mu < m_Ndim; ++mu) {
131  m_U[mu].setpart_ex(0, U, mu);
132  }
133 
134  // vout.general(m_vl, " smearing step-1\n");
135  smear_step1();
136  // vout.general(m_vl, " smearing step-2\n");
137  smear_step2();
138 
139  Sigma = 0.0;
140 
141  // vout.general(m_vl, " smeared force step-3\n");
142  force_step3(Sigma, Sigmap);
143  // vout.general(m_vl, " smeared force step-2\n");
144  force_step2(Sigma);
145  // vout.general(m_vl, " smeared force step-1\n");
146  force_step1(Sigma);
147  // vout.general(m_vl, " smeared force finished\n");
148 
149  return (Field)Sigma;
150 }
151 
152 
153 //====================================================================
154 void ForceSmear_HYP::force_step3(Field_G& Sigma, const Field_G& Sigmap)
155 {
156  Field_G Sigmap_tmp(m_Nvol, 1), C(m_Nvol, 1), c_tmp(m_Nvol, 1);
157  Field_G Xi(m_Nvol, 1);
158 
159  for (int mu = 0; mu < m_Ndim; ++mu) {
160  C = 0.0;
161  for (int nu = 0; nu < m_Ndim; ++nu) {
162  if (nu == mu) continue;
163  staple(c_tmp, m_v2[idx2(mu, nu)], m_v2[idx2(nu, mu)], mu, nu);
164  C.addpart_ex(0, c_tmp, 0);
165  }
166  C *= m_alpha1 / 6.0;
167 
168  Sigmap_tmp.setpart_ex(0, Sigmap, mu);
170  m_alpha1, Sigmap_tmp, C, m_U[mu]);
171  Sigma.addpart_ex(mu, Xi, 0);
172  }
173 
174  for (int mu = 0; mu < m_Ndim; ++mu) {
175  for (int nu = 0; nu < m_Ndim; ++nu) {
176  if (nu == mu) continue;
177 
178  force_each(m_Sigma3[idx2(mu, nu)],
179  m_v2[idx2(mu, nu)], m_v2[idx2(nu, mu)],
180  m_iTheta3[mu], m_iTheta3[nu], mu, nu);
181 
182  m_Sigma3[idx2(mu, nu)] *= m_alpha1 / 6.0;
183  }
184  }
185 }
186 
187 
188 //====================================================================
190 {
191  Field_G C(m_Nvol, 1), c_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
192 
193  for (int mu = 0; mu < m_Ndim; ++mu) {
194  for (int nu = 0; nu < m_Ndim; ++nu) {
195  if (nu == mu) continue;
196 
197  C = 0.0;
198  for (int rho = 0; rho < m_Ndim; ++rho) {
199  if ((rho == mu) || (rho == nu)) continue;
200  staple(c_tmp, m_v1[idx1(mu, nu, rho)],
201  m_v1[idx1(rho, nu, mu)], mu, rho);
202  C.addpart_ex(0, c_tmp, 0);
203  }
204  C *= m_alpha2 / 4.0;
205 
206  m_proj->force_recursive(Xi, m_iTheta2[idx2(mu, nu)],
207  m_alpha2, m_Sigma3[idx2(mu, nu)], C, m_U[mu]);
208  Sigma.addpart_ex(mu, Xi, 0);
209  }
210  }
211 
212  for (int mu = 0; mu < m_Ndim; ++mu) {
213  for (int nu = 0; nu < m_Ndim; ++nu) {
214  if (nu == mu) continue;
215  for (int rho = 0; rho < m_Ndim; ++rho) {
216  if ((rho == mu) || (rho == nu)) continue;
217  force_each(m_Sigma2[idx1b(mu, nu, rho)],
218  m_v1[idx1(mu, nu, rho)], m_v1[idx1(rho, nu, mu)],
219  m_iTheta2[idx2(mu, nu)], m_iTheta2[idx2(rho, nu)], mu, rho);
220  m_Sigma2[idx1b(mu, nu, rho)] *= m_alpha2 / 4.0;
221  }
222  }
223  }
224 }
225 
226 
227 //====================================================================
229 {
230  Field_G Sigma_tmp(m_Nvol, 1), C(m_Nvol, 1), Xi(m_Nvol, 1);
231 
232  for (int mu = 0; mu < m_Ndim; ++mu) {
233  for (int nu = 0; nu < m_Ndim; ++nu) {
234  if (nu == mu) continue;
235  for (int rho = 0; rho < m_Ndim; ++rho) {
236  if ((rho == mu) || (rho == nu)) continue;
237 
238  int sig = 6 - mu - nu - rho;
239  staple(C, m_U[mu], m_U[sig], mu, sig);
240  C *= m_alpha3 / 2.0;
241 
242  m_proj->force_recursive(Xi, m_iTheta1[idx1b(mu, nu, rho)],
243  m_alpha3, m_Sigma2[idx1b(mu, nu, rho)], C, m_U[mu]);
244  Sigma.addpart_ex(mu, Xi, 0);
245  }
246  }
247  }
248 
249  for (int mu = 0; mu < m_Ndim; ++mu) {
250  for (int nu = 0; nu < m_Ndim; ++nu) {
251  if (nu == mu) continue;
252  for (int rho = 0; rho < m_Ndim; ++rho) {
253  if ((rho == mu) || (rho == nu)) continue;
254  int sig = 6 - mu - nu - rho;
255  force_each(Sigma_tmp, m_U[mu], m_U[sig],
256  m_iTheta1[idx1b(mu, nu, rho)], m_iTheta1[idx1b(sig, nu, rho)],
257  mu, sig);
258  Sigma_tmp *= m_alpha3 / 2.0;
259  Sigma.addpart_ex(mu, Sigma_tmp, 0);
260  }
261  }
262  }
263 }
264 
265 
266 //====================================================================
268  const Field_G& V_mu, const Field_G& V_nu,
269  const Field_G& iTheta_mu,
270  const Field_G& iTheta_nu,
271  int mu, int nu)
272 {
273  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
274 
275  Sigma_mu = 0.0;
276 
277  m_shift.backward(vt1, V_nu, mu);
278  m_shift.backward(vt2, V_mu, nu);
279  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
280  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, iTheta_nu, 0, 1.0);
281 
282  vt3.mult_Field_Gdn(0, iTheta_mu, 0, V_nu, 0);
283  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
284  m_shift.forward(vt3, vt2, nu);
285  Sigma_mu += vt3;
286 
287  vt3.mult_Field_Gdn(0, V_mu, 0, iTheta_nu, 0);
288  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
289  m_shift.forward(vt3, vt2, nu);
290  Sigma_mu += vt3;
291 
292  m_shift.backward(vt1, iTheta_nu, mu);
293  m_shift.backward(vt2, V_mu, nu);
294  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
295  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
296 
297  vt2.mult_Field_Gdd(0, vt1, 0, V_mu, 0);
298  vt3.mult_Field_Gnn(0, vt2, 0, V_nu, 0);
299  m_shift.forward(vt2, vt3, nu);
300  Sigma_mu += vt2;
301 
302  m_shift.backward(vt1, V_nu, mu);
303  m_shift.backward(vt2, iTheta_mu, nu);
304  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
305  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
306 }
307 
308 
309 //====================================================================
311 {
312  Field_G c1(m_Nvol, 1);
313 
314  for (int mu = 0; mu < m_Ndim; ++mu) {
315  for (int nu = 0; nu < m_Ndim; ++nu) {
316  if (nu == mu) continue;
317  for (int rho = nu + 1; rho < m_Ndim; ++rho) {
318  if (rho == mu) continue;
319  int sig = 6 - mu - nu - rho;
320  staple(c1, m_U[mu], m_U[sig], mu, sig);
321  c1 *= m_alpha3 / 2.0;
322  m_proj->project(m_v1[idx1(mu, nu, rho)], m_alpha3, c1, m_U[mu]);
323  }
324  }
325  }
326 }
327 
328 
329 //====================================================================
331 {
332  Field_G c2(m_Nvol, 1), u_tmp(m_Nvol, 1);
333 
334  for (int mu = 0; mu < m_Ndim; ++mu) {
335  for (int nu = 0; nu < m_Ndim; ++nu) {
336  if (nu == mu) continue;
337  c2 = 0.0;
338  for (int rho = 0; rho < m_Ndim; ++rho) {
339  if ((rho != mu) && (rho != nu)) {
340  staple(u_tmp,
341  m_v1[idx1(mu, nu, rho)], m_v1[idx1(rho, nu, mu)], mu, rho);
342  c2.addpart_ex(0, u_tmp, 0);
343  }
344  }
345  c2 *= m_alpha2 / 4.0;
346  m_proj->project(m_v2[idx2(mu, nu)], m_alpha2, c2, m_U[mu]);
347  }
348  }
349 }
350 
351 
352 //====================================================================
354  const Field_G& u_mu, const Field_G& u_nu,
355  int mu, int nu)
356 {
357  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
358 
359  //- upper direction
360  m_shift.backward(v1, u_mu, nu);
361  v2.mult_Field_Gnn(0, u_nu, 0, v1, 0);
362 
363  m_shift.backward(v1, u_nu, mu);
364  c.mult_Field_Gnd(0, v2, 0, v1, 0);
365 
366  //- lower direction
367  m_shift.backward(v2, u_nu, mu);
368  v1.mult_Field_Gnn(0, u_mu, 0, v2, 0);
369  v2.mult_Field_Gdn(0, u_nu, 0, v1, 0);
370  m_shift.forward(v1, v2, nu);
371  c.addpart_ex(0, v1, 0);
372 }
373 
374 
375 //====================================================================
376 //============================================================END=====