Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
smear_HYP_SF.cpp
Go to the documentation of this file.
1 
14 #include "smear_HYP_SF.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  Smear *create_object(Projection *proj)
25  {
26  return new Smear_HYP_SF(proj);
27  }
28 
29 
30  bool init = Smear::Factory::Register("HYP_SF", 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  param.Register_double_vector("phi", std::valarray<double>());
42  param.Register_double_vector("phipr", std::valarray<double>());
43 
44  param.Register_string("verbose_level", "NULL");
45  }
46 
47 
48 #ifdef USE_PARAMETERS_FACTORY
49  bool init_param = ParametersFactory::Register("Smear.HYP_SF", append_entry);
50 #endif
51 }
52 //- end
53 
54 //- parameters class
56 //- end
57 
58 //====================================================================
60 {
61  const string str_vlevel = params.get_string("verbose_level");
62 
63  m_vl = vout.set_verbose_level(str_vlevel);
64 
65  //- fetch and check input parameters
66  double alpha1, alpha2, alpha3;
67  valarray<double> phi, phipr;
68 
69  int err = 0;
70  err += params.fetch_double("alpha1", alpha1);
71  err += params.fetch_double("alpha2", alpha2);
72  err += params.fetch_double("alpha3", alpha3);
73  err += params.fetch_double_vector("phi", phi);
74  err += params.fetch_double_vector("phipr", phipr);
75 
76  if (err) {
77  vout.crucial(m_vl, "Smear_HYP_SF: fetch error, input parameter not found.\n");
78  abort();
79  }
80 
81 
82  set_parameters(alpha1, alpha2, alpha3, &phi[0], &phipr[0]);
83 }
84 
85 
86 //====================================================================
87 void Smear_HYP_SF::set_parameters(double alpha1, double alpha2, double alpha3,
88  double *phi, double *phipr)
89 {
90  //- print input parameters
91  vout.general(m_vl, "Parameters of Smear_HYP_SF:\n");
92  vout.general(m_vl, " alpha1 = %10.6F\n", alpha1);
93  vout.general(m_vl, " alpha2 = %10.6F\n", alpha2);
94  vout.general(m_vl, " alpha3 = %10.6F\n", alpha3);
95 
96  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
97  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
98  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
99  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
100  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
101  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
102 
103  //- range check
104  // NB. alpha1,alpha2,alpha3 == 0 is allowed.
105  // NB. phi,phipr == 0 is allowed.
106 
107  //- store values
108  m_alpha1 = alpha1;
109  m_alpha2 = alpha2;
110  m_alpha3 = alpha3;
111 
112  //- post-process
113  set_wk.set_parameters(phi, phipr);
114 }
115 
116 
117 //====================================================================
119 {
122 
123  m_U.resize(m_Ndim);
124  m_v1.resize(size_v1());
125  m_v2.resize(size_v2());
126 }
127 
128 
129 //====================================================================
130 void Smear_HYP_SF::smear(Field_G& Usmear, const Field_G& U)
131 {
132  assert(U.nvol() == m_Nvol);
133  assert(U.nex() == m_Ndim);
134 
135  assert(Usmear.nvol() == m_Nvol);
136  assert(Usmear.nex() == m_Ndim);
137 
138  for (int mu = 0; mu < m_Ndim; ++mu) {
139  m_U[mu].setpart_ex(0, U, mu);
140  if (mu != 3) set_wk.set_boundary_wk(m_U[mu]);
141  }
142 
143  step1();
144  // vout.general(m_vl,"level-1 step finished.\n");
145  step2();
146  // vout.general(m_vl,"level-2 step finished.\n");
147  step3(Usmear);
148  // vout.general(m_vl,"level-3 step finished.\n");
149 }
150 
151 
152 //====================================================================
154 {
155  Field_G c1(m_Nvol, 1);
156 
157  for (int mu = 0; mu < m_Ndim; ++mu) {
158  for (int nu = 0; nu < m_Ndim; ++nu) {
159  if (nu == mu) continue;
160 
161  for (int rho = nu + 1; rho < m_Ndim; ++rho) {
162  if (rho == mu) continue;
163  int sig = 6 - mu - nu - rho;
164  staple(c1, m_U[mu], m_U[sig], mu, sig);
165  c1 *= m_alpha3 / 2.0;
166  m_proj->project(m_v1[index_v1(mu, nu, rho)], m_alpha3, c1, m_U[mu]);
167 
168  if (mu != 3) set_wk.set_boundary_wk(m_v1[index_v1(mu, nu, rho)]);
169  }
170  }
171  }
172 }
173 
174 
175 //====================================================================
177 {
178  Field_G c2(m_Nvol, 1), u_tmp(m_Nvol, 1);
179 
180  for (int mu = 0; mu < m_Ndim; ++mu) {
181  for (int nu = 0; nu < m_Ndim; ++nu) {
182  if (nu == mu) continue;
183  c2 = 0.0;
184 
185  for (int rho = 0; rho < m_Ndim; ++rho) {
186  if ((rho != mu) && (rho != nu)) {
187  staple(u_tmp, m_v1[index_v1(mu, nu, rho)],
188  m_v1[index_v1(rho, nu, mu)], mu, rho);
189  c2.addpart_ex(0, u_tmp, 0);
190  }
191  }
192 
193  c2 *= m_alpha2 / 4.0;
194  m_proj->project(m_v2[index_v2(mu, nu)], m_alpha2, c2, m_U[mu]);
195 
196  if (mu != 3) set_wk.set_boundary_wk(m_v2[index_v2(mu, nu)]);
197  }
198  }
199 }
200 
201 
202 //====================================================================
204 {
205  Field_G c3(m_Nvol, 1), u_tmp(m_Nvol, 1);
206 
207  for (int mu = 0; mu < m_Ndim; ++mu) {
208  c3 = 0.0;
209 
210  for (int nu = 0; nu < m_Ndim; ++nu) {
211  if (nu != mu) {
212  staple(u_tmp, m_v2[index_v2(mu, nu)],
213  m_v2[index_v2(nu, mu)], mu, nu);
214  c3.addpart_ex(0, u_tmp, 0);
215  }
216  }
217 
218  c3 *= m_alpha1 / 6.0;
219  m_proj->project(u_tmp, m_alpha1, c3, m_U[mu]);
220 
221  if (mu != 3) set_wk.set_boundary_wk(u_tmp);
222 
223  v.setpart_ex(mu, u_tmp, 0);
224  }
225 }
226 
227 
228 //====================================================================
230  const Field_G& u_mu, const Field_G& u_nu,
231  int mu, int nu)
232 {
233  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
234 
235  //- upper direction
236  m_shift.backward(v1, u_mu, nu);
237  if (nu == 3) set_wk.set_boundary_wkpr(v1);
238  v2.mult_Field_Gnn(0, u_nu, 0, v1, 0);
239 
240  m_shift.backward(v1, u_nu, mu);
241  if (mu == 3) set_wk.set_boundary_wkpr(v1);
242  c.mult_Field_Gnd(0, v2, 0, v1, 0);
243 
244  //- lower direction
245  m_shift.backward(v2, u_nu, mu);
246  if (mu == 3) set_wk.set_boundary_wkpr(v2);
247  v1.mult_Field_Gnn(0, u_mu, 0, v2, 0);
248  v2.mult_Field_Gdn(0, u_nu, 0, v1, 0);
249  m_shift.forward(v1, v2, nu);
250  c.addpart_ex(0, v1, 0);
251  // if(mu!=3) c.set_boundary_zero();
252 }
253 
254 
255 //====================================================================
256 //============================================================END=====