Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
forceSmear_HYP_SF.cpp
Go to the documentation of this file.
1 
14 #include "forceSmear_HYP_SF.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 #ifdef USE_FACTORY
21 namespace {
22  ForceSmear *create_object(Projection *proj)
23  {
24  return new ForceSmear_HYP_SF(proj);
25  }
26 
27 
28  bool init = ForceSmear::Factory::Register("HYP_SF", create_object);
29 }
30 #endif
31 
32 //- parameter entries
33 namespace {
34  void append_entry(Parameters& param)
35  {
36  param.Register_double("alpha1", 0.0);
37  param.Register_double("alpha2", 0.0);
38  param.Register_double("alpha3", 0.0);
39 
40  param.Register_double_vector("phi", std::valarray<double>());
41  param.Register_double_vector("phipr", std::valarray<double>());
42 
43  param.Register_string("verbose_level", "NULL");
44  }
45 
46 
47 #ifdef USE_PARAMETERS_FACTORY
48  bool init_param = ParametersFactory::Register("ForceSmear.HYP_SF", append_entry);
49 #endif
50 }
51 //- end
52 
53 //- parameters class
55 //- end
56 
57 //====================================================================
59 {
60  const string str_vlevel = params.get_string("verbose_level");
61 
62  m_vl = vout.set_verbose_level(str_vlevel);
63 
64  //- fetch and check input parameters
65  double alpha1, alpha2, alpha3;
66  valarray<double> phi, phipr;
67 
68  int err = 0;
69  err += params.fetch_double("alpha1", alpha1);
70  err += params.fetch_double("alpha2", alpha2);
71  err += params.fetch_double("alpha3", alpha3);
72  err += params.fetch_double_vector("phi", phi);
73  err += params.fetch_double_vector("phipr", phipr);
74 
75  if (err) {
76  vout.crucial(m_vl, "ForceSmear_HYP_SF: fetch error, input parameter not found.\n");
77  abort();
78  }
79 
80 
81  set_parameters(alpha1, alpha2, alpha3, &phi[0], &phipr[0]);
82 }
83 
84 
85 //====================================================================
86 void ForceSmear_HYP_SF::set_parameters(double alpha1, double alpha2, double alpha3,
87  double *phi, double *phipr)
88 {
89  //- print input parameters
90  vout.general(m_vl, "Force of HYP smearing parameters:\n");
91  vout.general(m_vl, " alpha1 = %10.6F\n", alpha1);
92  vout.general(m_vl, " alpha2 = %10.6F\n", alpha2);
93  vout.general(m_vl, " alpha3 = %10.6F\n", alpha3);
94 
95  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
96  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
97  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
98  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
99  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
100  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
101 
102  //- range check
103  // NB. alpha1,alpha2,alpha3 == 0 is allowed.
104  // NB. phi,phipr == 0 is allowed.
105 
106  //- store values
107  m_alpha1 = alpha1;
108  m_alpha2 = alpha2;
109  m_alpha3 = alpha3;
110 
111  for (int i = 0; i < 3; ++i) {
112  m_phi[i] = phi[i];
113  m_phipr[i] = phipr[i];
114  }
115 
116  //- propagate parameters
118 }
119 
120 
121 //====================================================================
123 {
126 
127  m_U.resize(m_Ndim);
128 
129  m_v1.resize(size1());
130  m_v2.resize(size2());
131 
132  m_Sigma3.resize(size2());
133  m_Sigma2.resize(size1b());
134 
135  m_iTheta3.resize(m_Ndim);
136  m_iTheta2.resize(size2());
137  m_iTheta1.resize(size1b());
138 }
139 
140 
141 //====================================================================
143 {
144  assert(U.nvol() == m_Nvol);
145  assert(U.nex() == m_Ndim);
146  assert(Sigmap.nvol() == m_Nvol);
147  assert(Sigmap.nex() == m_Ndim);
148 
149  Field_G Sigma(m_Nvol, m_Ndim);
150 
151  for (int mu = 0; mu < m_Ndim; ++mu) {
152  m_U[mu].setpart_ex(0, U, mu);
153  if (mu != 3) set_wk.set_boundary_wk(m_U[mu]);
154  }
155 
156  // vout.general(m_vl," smearing step-1\n");
157  smear_step1();
158  // vout.general(m_vl," smearing step-2\n");
159  smear_step2();
160 
161  Sigma = 0.0;
162 
163  // vout.general(m_vl," smeared force step-3\n");
164  force_step3(Sigma, Sigmap);
165  // vout.general(m_vl," smeared force step-2\n");
166  force_step2(Sigma);
167  // vout.general(m_vl," smeared force step-1\n");
168  force_step1(Sigma);
169  // vout.general(m_vl," smeared force finished\n");
170 
171  return (Field)Sigma;
172 }
173 
174 
175 //====================================================================
176 
188 void ForceSmear_HYP_SF::force_step3(Field_G& Sigma, const Field_G& Sigmap)
189 {
190  Field_G Sigmap_tmp(m_Nvol, 1), C(m_Nvol, 1), c_tmp(m_Nvol, 1);
191  Field_G Xi(m_Nvol, 1);
192 
193  for (int mu = 0; mu < m_Ndim; ++mu) {
194  C = 0.0;
195  for (int nu = 0; nu < m_Ndim; ++nu) {
196  if (nu == mu) continue;
197  staple(c_tmp, m_v2[idx2(mu, nu)], m_v2[idx2(nu, mu)], mu, nu);
198  C.addpart_ex(0, c_tmp, 0);
199  }
200  C *= m_alpha1 / 6.0;
201 
202  Sigmap_tmp.setpart_ex(0, Sigmap, mu);
204  m_alpha1, Sigmap_tmp, C, m_U[mu]);
205  Sigma.addpart_ex(mu, Xi, 0);
206  }
207 
208  for (int mu = 0; mu < m_Ndim; ++mu) {
209  for (int nu = 0; nu < m_Ndim; ++nu) {
210  if (nu == mu) continue;
211 
212  force_each(m_Sigma3[idx2(mu, nu)],
213  m_v2[idx2(mu, nu)], m_v2[idx2(nu, mu)],
214  m_iTheta3[mu], m_iTheta3[nu], mu, nu);
215 
216  m_Sigma3[idx2(mu, nu)] *= m_alpha1 / 6.0;
217  if (mu != 3) set_wk.set_boundary_zero(m_Sigma3[idx2(mu, nu)]);
218  }
219  }
220 }
221 
222 
223 //====================================================================
224 
236 {
237  Field_G C(m_Nvol, 1), c_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
238 
239  for (int mu = 0; mu < m_Ndim; ++mu) {
240  for (int nu = 0; nu < m_Ndim; ++nu) {
241  if (nu == mu) continue;
242 
243  C = 0.0;
244  for (int rho = 0; rho < m_Ndim; ++rho) {
245  if ((rho == mu) || (rho == nu)) continue;
246  staple(c_tmp, m_v1[idx1(mu, nu, rho)],
247  m_v1[idx1(rho, nu, mu)], mu, rho);
248  C.addpart_ex(0, c_tmp, 0);
249  }
250  C *= m_alpha2 / 4.0;
251 
252  m_proj->force_recursive(Xi, m_iTheta2[idx2(mu, nu)],
253  m_alpha2, m_Sigma3[idx2(mu, nu)], C, m_U[mu]);
254  Sigma.addpart_ex(mu, Xi, 0);
255  }
256  }
257 
258  for (int mu = 0; mu < m_Ndim; ++mu) {
259  for (int nu = 0; nu < m_Ndim; ++nu) {
260  if (nu == mu) continue;
261  for (int rho = 0; rho < m_Ndim; ++rho) {
262  if ((rho == mu) || (rho == nu)) continue;
263  force_each(m_Sigma2[idx1b(mu, nu, rho)],
264  m_v1[idx1(mu, nu, rho)], m_v1[idx1(rho, nu, mu)],
265  m_iTheta2[idx2(mu, nu)], m_iTheta2[idx2(rho, nu)], mu, rho);
266  m_Sigma2[idx1b(mu, nu, rho)] *= m_alpha2 / 4.0;
267  if (mu != 3) set_wk.set_boundary_zero(m_Sigma2[idx1b(mu, nu, rho)]);
268  }
269  }
270  }
271 }
272 
273 
274 //====================================================================
275 
286 {
287  Field_G Sigma_tmp(m_Nvol, 1), C(m_Nvol, 1), Xi(m_Nvol, 1);
288 
289  for (int mu = 0; mu < m_Ndim; ++mu) {
290  for (int nu = 0; nu < m_Ndim; ++nu) {
291  if (nu == mu) continue;
292  for (int rho = 0; rho < m_Ndim; ++rho) {
293  if ((rho == mu) || (rho == nu)) continue;
294 
295  int sig = 6 - mu - nu - rho;
296  staple(C, m_U[mu], m_U[sig], mu, sig);
297  C *= m_alpha3 / 2.0;
298 
299  m_proj->force_recursive(Xi, m_iTheta1[idx1b(mu, nu, rho)],
300  m_alpha3, m_Sigma2[idx1b(mu, nu, rho)], C, m_U[mu]);
301  Sigma.addpart_ex(mu, Xi, 0);
302  }
303  }
304  }
305 
306  for (int mu = 0; mu < m_Ndim; ++mu) {
307  for (int nu = 0; nu < m_Ndim; ++nu) {
308  if (nu == mu) continue;
309  for (int rho = 0; rho < m_Ndim; ++rho) {
310  if ((rho == mu) || (rho == nu)) continue;
311  int sig = 6 - mu - nu - rho;
312  force_each(Sigma_tmp, m_U[mu], m_U[sig],
313  m_iTheta1[idx1b(mu, nu, rho)], m_iTheta1[idx1b(sig, nu, rho)],
314  mu, sig);
315  Sigma_tmp *= m_alpha3 / 2.0;
316  Sigma.addpart_ex(mu, Sigma_tmp, 0);
317  }
318  }
319  }
320 
322 }
323 
324 
325 //====================================================================
326 
339  const Field_G& V_mu, const Field_G& V_nu,
340  const Field_G& iTheta_mu,
341  const Field_G& iTheta_nu,
342  int mu, int nu)
343 {
344  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
345 
346  Sigma_mu = 0.0;
347 
348  //- The 1st block
349  m_shift.backward(vt1, V_nu, mu);
350  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
351  m_shift.backward(vt2, V_mu, nu);
352  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
353  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
354  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, iTheta_nu, 0, 1.0);
355 
356  //- The 2nd block
357  vt3.mult_Field_Gdn(0, iTheta_mu, 0, V_nu, 0);
358  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
359  m_shift.forward(vt3, vt2, nu);
360  Sigma_mu += vt3;
361 
362  //- The 3rd block
363  vt3.mult_Field_Gdn(0, V_mu, 0, iTheta_nu, 0);
364  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
365  m_shift.forward(vt3, vt2, nu);
366  Sigma_mu += vt3;
367 
368  //- The 4th block
369  m_shift.backward(vt1, iTheta_nu, mu);
370  m_shift.backward(vt2, V_mu, nu);
371  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
372  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
373  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
374 
375  //- The 5th block
376  vt2.mult_Field_Gdd(0, vt1, 0, V_mu, 0);
377  vt3.mult_Field_Gnn(0, vt2, 0, V_nu, 0);
378  m_shift.forward(vt2, vt3, nu);
379  Sigma_mu += vt2;
380 
381  //- The 6th block
382  m_shift.backward(vt1, V_nu, mu);
383  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
384  m_shift.backward(vt2, iTheta_mu, nu);
385  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
386  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
387 }
388 
389 
390 //====================================================================
392 {
393  Field_G c1(m_Nvol, 1);
394 
395  for (int mu = 0; mu < m_Ndim; ++mu) {
396  for (int nu = 0; nu < m_Ndim; ++nu) {
397  if (nu == mu) continue;
398  for (int rho = nu + 1; rho < m_Ndim; ++rho) {
399  if (rho == mu) continue;
400  int sig = 6 - mu - nu - rho;
401  staple(c1, m_U[mu], m_U[sig], mu, sig);
402  c1 *= m_alpha3 / 2.0;
403  m_proj->project(m_v1[idx1(mu, nu, rho)], m_alpha3, c1, m_U[mu]);
404  if (mu != 3) set_wk.set_boundary_wk(m_v1[idx1(mu, nu, rho)]);
405  }
406  }
407  }
408 }
409 
410 
411 //====================================================================
413 {
414  Field_G c2(m_Nvol, 1), u_tmp(m_Nvol, 1);
415 
416  for (int mu = 0; mu < m_Ndim; ++mu) {
417  for (int nu = 0; nu < m_Ndim; ++nu) {
418  if (nu == mu) continue;
419  c2 = 0.0;
420  for (int rho = 0; rho < m_Ndim; ++rho) {
421  if ((rho != mu) && (rho != nu)) {
422  staple(u_tmp, m_v1[idx1(mu, nu, rho)],
423  m_v1[idx1(rho, nu, mu)], mu, rho);
424  c2.addpart_ex(0, u_tmp, 0);
425  }
426  }
427  c2 *= m_alpha2 / 4.0;
428  m_proj->project(m_v2[idx2(mu, nu)], m_alpha2, c2, m_U[mu]);
429  if (mu != 3) set_wk.set_boundary_wk(m_v2[idx2(mu, nu)]);
430  }
431  }
432 }
433 
434 
435 //====================================================================
437  const Field_G& u_mu, const Field_G& u_nu,
438  int mu, int nu)
439 {
440  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
441 
442  // upper direction
443  m_shift.backward(v1, u_mu, nu);
444  if (nu == 3) set_wk.set_boundary_wkpr(v1);
445  v2.mult_Field_Gnn(0, u_nu, 0, v1, 0);
446 
447  m_shift.backward(v1, u_nu, mu);
448  if (mu == 3) set_wk.set_boundary_wkpr(v1);
449  c.mult_Field_Gnd(0, v2, 0, v1, 0);
450 
451  // lower direction
452  m_shift.backward(v2, u_nu, mu);
453  if (mu == 3) set_wk.set_boundary_wkpr(v2);
454  v1.mult_Field_Gnn(0, u_mu, 0, v2, 0);
455  v2.mult_Field_Gdn(0, u_nu, 0, v1, 0);
456  m_shift.forward(v1, v2, nu);
457  c.addpart_ex(0, v1, 0);
458 }
459 
460 
461 //====================================================================
462 //============================================================END=====