Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
forceSmear_APE.cpp
Go to the documentation of this file.
1 
14 #include "forceSmear_APE.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_APE(proj);
27  }
28 
29 
30  bool init = ForceSmear::Factory::Register("APE", create_object);
31 }
32 #endif
33 
34 //- parameter entries
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_double("rho_uniform", 0.0);
39  // param.Register_double_vector("rho", std::valarray<double>());
40 
41  param.Register_string("verbose_level", "NULL");
42  }
43 
44 
45 #ifdef USE_PARAMETERS_FACTORY
46  bool init_param = ParametersFactory::Register("ForceSmear.APE", append_entry);
47 #endif
48 }
49 //- end
50 
51 //- parameters class
53 //- end
54 
55 //====================================================================
57 {
58  const string str_vlevel = params.get_string("verbose_level");
59 
60  m_vl = vout.set_verbose_level(str_vlevel);
61 
62  //- fetch and check input parameters
63  double rho1;
64 
65  int err = 0;
66  err += params.fetch_double("rho_uniform", rho1);
67 
68  if (err) {
69  vout.crucial(m_vl, "ForceSmear_APE: fetch error, input parameter not found.\n");
70  abort();
71  }
72 
73 
74  set_parameters(rho1);
75 }
76 
77 
78 //====================================================================
79 void ForceSmear_APE::set_parameters(const double rho1)
80 {
81  //- print input parameters
82  vout.general(m_vl, "Parameters of ForceSmear_APE:\n");
83  vout.general(m_vl, " rho = %8.4f\n", rho1);
84 
85  //- range check
86  // NB. rho == 0 is allowed.
87 
88  //- store values
89  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
90  for (int mu = 0; mu < m_Ndim; ++mu) {
91  for (int nu = 0; nu < m_Ndim; ++nu) {
92  m_rho[mu + nu * m_Ndim] = rho1;
93  }
94  }
95 }
96 
97 
98 //====================================================================
99 void ForceSmear_APE::set_parameters(const valarray<double>& rho)
100 {
101  //- print input parameters
102  vout.general(m_vl, "Parameters of ForceSmear_APE:\n");
103  for (int mu = 0; mu < m_Ndim; ++mu) {
104  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
105  }
106 
107  //- range check
108  // NB. rho == 0 is allowed.
109  assert(rho.size() == m_Ndim * m_Ndim);
110 
111  //- store values
112  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
113  for (int mu = 0; mu < m_Ndim; ++mu) {
114  for (int nu = 0; nu < m_Ndim; ++nu) {
115  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
116  }
117  }
118 }
119 
120 
121 //====================================================================
123 {
124  m_Ndim = CommonParameters::Ndim();
126 
127  m_rho.resize(m_Ndim * m_Ndim);
128  m_U.resize(m_Ndim);
129  m_iTheta.resize(m_Ndim);
130 
131  for (int mu = 0; mu < m_Ndim; ++mu) {
132  for (int nu = 0; nu < m_Ndim; ++nu) {
133  m_rho[mu + nu * m_Ndim] = 0.0;
134  }
135  }
136 }
137 
138 
139 //====================================================================
141  const Field_G& U)
142 {
143  int Nc = CommonParameters::Nc();
144  int NinG = 2 * Nc * Nc;
145 
146  assert(Sigmap.nin() == NinG);
147  assert(Sigmap.nvol() == m_Nvol);
148  assert(Sigmap.nex() == m_Ndim);
149 
150  Field_G Sigma(m_Nvol, m_Ndim);
151 
152  Field_G C(m_Nvol, 1);
153  Field_G sigmap_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
154 
155  for (int mu = 0; mu < m_Ndim; ++mu) {
156  m_U[mu].setpart_ex(0, U, mu);
157  }
158 
159  Field_G c_tmp(m_Nvol, 1);
160  for (int mu = 0; mu < m_Ndim; ++mu) {
161  C = 0.0;
162  for (int nu = 0; nu < m_Ndim; ++nu) {
163  if (nu == mu) continue;
164  double rho = m_rho[mu + m_Ndim * nu];
165  staple(c_tmp, m_U[mu], m_U[nu], mu, nu);
166  C.addpart_ex(0, c_tmp, 0, rho);
167  }
168 
169  sigmap_tmp.setpart_ex(0, Sigmap, mu);
170 
171  double alpha = m_rho[mu + m_Ndim * mu];
173  alpha, sigmap_tmp, C, m_U[mu]);
174  Sigma.setpart_ex(mu, Xi, 0);
175  }
176 
177  Field_G sigma_tmp(m_Nvol, 1);
178  for (int mu = 0; mu < m_Ndim; ++mu) {
179  for (int nu = 0; nu < m_Ndim; ++nu) {
180  if (nu == mu) continue;
181  double rho = m_rho[mu + m_Ndim * nu];
182  force_each(sigma_tmp, m_U[mu], m_U[nu],
183  m_iTheta[mu], m_iTheta[nu], mu, nu);
184  Sigma.addpart_ex(mu, sigma_tmp, 0, rho);
185  }
186  }
187 
188  return (Field)Sigma;
189 }
190 
191 
192 //====================================================================
194  const Field_G& V_mu, const Field_G& V_nu,
195  const Field_G& iTheta_mu,
196  const Field_G& iTheta_nu,
197  int mu, int nu)
198 {
199  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
200 
201  Sigma_mu = 0.0;
202 
203  m_shift.backward(vt1, V_nu, mu);
204  m_shift.backward(vt2, V_mu, nu);
205  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
206  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, iTheta_nu, 0, 1.0);
207 
208  vt3.mult_Field_Gdn(0, iTheta_mu, 0, V_nu, 0);
209  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
210  m_shift.forward(vt3, vt2, nu);
211  Sigma_mu += vt3;
212 
213  vt3.mult_Field_Gdn(0, V_mu, 0, iTheta_nu, 0);
214  vt2.mult_Field_Gdn(0, vt1, 0, vt3, 0);
215  m_shift.forward(vt3, vt2, nu);
216  Sigma_mu += vt3;
217 
218  m_shift.backward(vt1, iTheta_nu, mu);
219  m_shift.backward(vt2, V_mu, nu);
220  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
221  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
222 
223  vt2.mult_Field_Gdd(0, vt1, 0, V_mu, 0);
224  vt3.mult_Field_Gnn(0, vt2, 0, V_nu, 0);
225  m_shift.forward(vt2, vt3, nu);
226  Sigma_mu += vt2;
227 
228  m_shift.backward(vt1, V_nu, mu);
229  m_shift.backward(vt2, iTheta_mu, nu);
230  vt3.mult_Field_Gnd(0, vt1, 0, vt2, 0);
231  Sigma_mu.multadd_Field_Gnd(0, vt3, 0, V_nu, 0, 1.0);
232 }
233 
234 
235 //====================================================================
237  const Field_G& u_mu, const Field_G& u_nu,
238  int mu, int nu)
239 {
240  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
241 
242  //- upper direction
243  m_shift.backward(v1, u_mu, nu);
244  v2.mult_Field_Gnn(0, u_nu, 0, v1, 0);
245 
246  m_shift.backward(v1, u_nu, mu);
247  c.mult_Field_Gnd(0, v2, 0, v1, 0);
248 
249  //- lower direction
250  m_shift.backward(v2, u_nu, mu);
251  v1.mult_Field_Gnn(0, u_mu, 0, v2, 0);
252  v2.mult_Field_Gdn(0, u_nu, 0, v1, 0);
253  m_shift.forward(v1, v2, nu);
254  c.addpart_ex(0, v1, 0);
255 }
256 
257 
258 //====================================================================
259 //============================================================END=====