Bridge++  Ver. 1.2.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 const std::string ForceSmear_APE::class_name = "ForceSmear_APE";
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 rho1;
66 
67  int err = 0;
68  err += params.fetch_double("rho_uniform", rho1);
69 
70  if (err) {
71  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
72  abort();
73  }
74 
75 
76  set_parameters(rho1);
77 }
78 
79 
80 //====================================================================
81 void ForceSmear_APE::set_parameters(const double rho1)
82 {
83  //- print input parameters
84  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
85  vout.general(m_vl, " rho = %8.4f\n", rho1);
86 
87  //- range check
88  // NB. rho == 0 is allowed.
89 
90  //- store values
91  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
92  for (int mu = 0; mu < m_Ndim; ++mu) {
93  for (int nu = 0; nu < m_Ndim; ++nu) {
94  m_rho[mu + nu * m_Ndim] = rho1;
95  }
96  }
97 }
98 
99 
100 //====================================================================
101 void ForceSmear_APE::set_parameters(const valarray<double>& rho)
102 {
103  //- print input parameters
104  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
105  for (int mu = 0; mu < m_Ndim; ++mu) {
106  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
107  }
108 
109  //- range check
110  // NB. rho == 0 is allowed.
111  assert(rho.size() == m_Ndim * m_Ndim);
112 
113  //- store values
114  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
115  for (int mu = 0; mu < m_Ndim; ++mu) {
116  for (int nu = 0; nu < m_Ndim; ++nu) {
117  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
118  }
119  }
120 }
121 
122 
123 //====================================================================
125 {
126  m_Ndim = CommonParameters::Ndim();
128 
129  m_rho.resize(m_Ndim * m_Ndim);
130  m_U.resize(m_Ndim);
131  m_iTheta.resize(m_Ndim);
132 
133  for (int mu = 0; mu < m_Ndim; ++mu) {
134  for (int nu = 0; nu < m_Ndim; ++nu) {
135  m_rho[mu + nu * m_Ndim] = 0.0;
136  }
137  }
138 }
139 
140 
141 //====================================================================
143 {
144  Field_G sigma(Sigmap.nvol(), Sigmap.nex());
145 
146  force_udiv(sigma, Sigmap, U);
147  return sigma;
148 }
149 
150 
151 //====================================================================
152 void ForceSmear_APE::force_udiv(Field_G& Sigma, const Field_G& Sigmap, const Field_G& U)
153 {
154  int Nc = CommonParameters::Nc();
155  int NinG = 2 * Nc * Nc;
156 
157  assert(Sigmap.nin() == NinG);
158  assert(Sigmap.nvol() == m_Nvol);
159  assert(Sigmap.nex() == m_Ndim);
160 
161  Field_G C(m_Nvol, 1);
162  Field_G sigmap_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
163 
164  for (int mu = 0; mu < m_Ndim; ++mu) {
165  m_U[mu].setpart_ex(0, U, mu);
166  }
167 
168  Field_G c_tmp(m_Nvol, 1);
169  for (int mu = 0; mu < m_Ndim; ++mu) {
170  C = 0.0;
171  for (int nu = 0; nu < m_Ndim; ++nu) {
172  if (nu == mu) continue;
173  double rho = m_rho[mu + m_Ndim * nu];
174  staple(c_tmp, m_U[mu], m_U[nu], mu, nu);
175  C.addpart_ex(0, c_tmp, 0, rho);
176  }
177 
178  sigmap_tmp.setpart_ex(0, Sigmap, mu);
179 
180  double alpha = m_rho[mu + m_Ndim * mu];
182  alpha, sigmap_tmp, C, m_U[mu]);
183  Sigma.setpart_ex(mu, Xi, 0);
184  }
185 
186  Field_G sigma_tmp(m_Nvol, 1);
187  for (int mu = 0; mu < m_Ndim; ++mu) {
188  for (int nu = 0; nu < m_Ndim; ++nu) {
189  if (nu == mu) continue;
190  double rho = m_rho[mu + m_Ndim * nu];
191  force_each(sigma_tmp, m_U[mu], m_U[nu],
192  m_iTheta[mu], m_iTheta[nu], mu, nu);
193  Sigma.addpart_ex(mu, sigma_tmp, 0, rho);
194  }
195  }
196 }
197 
198 
199 //====================================================================
201  const Field_G& V_mu, const Field_G& V_nu,
202  const Field_G& iTheta_mu,
203  const Field_G& iTheta_nu,
204  int mu, int nu)
205 {
206  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
207 
208  Sigma_mu = 0.0;
209 
210  m_shift.backward(vt1, V_nu, mu);
211  m_shift.backward(vt2, V_mu, nu);
212  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
213  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, iTheta_nu, 0, 1.0);
214 
215  mult_Field_Gdn(vt3, 0, iTheta_mu, 0, V_nu, 0);
216  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
217  m_shift.forward(vt3, vt2, nu);
218  Sigma_mu += vt3;
219 
220  mult_Field_Gdn(vt3, 0, V_mu, 0, iTheta_nu, 0);
221  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
222  m_shift.forward(vt3, vt2, nu);
223  Sigma_mu += vt3;
224 
225  m_shift.backward(vt1, iTheta_nu, mu);
226  m_shift.backward(vt2, V_mu, nu);
227  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
228  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
229 
230  mult_Field_Gdd(vt2, 0, vt1, 0, V_mu, 0);
231  mult_Field_Gnn(vt3, 0, vt2, 0, V_nu, 0);
232  m_shift.forward(vt2, vt3, nu);
233  Sigma_mu += vt2;
234 
235  m_shift.backward(vt1, V_nu, mu);
236  m_shift.backward(vt2, iTheta_mu, nu);
237  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
238  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
239 }
240 
241 
242 //====================================================================
244  const Field_G& u_mu, const Field_G& u_nu,
245  int mu, int nu)
246 {
247  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
248 
249  //- upper direction
250  m_shift.backward(v1, u_mu, nu);
251  mult_Field_Gnn(v2, 0, u_nu, 0, v1, 0);
252 
253  m_shift.backward(v1, u_nu, mu);
254  mult_Field_Gnd(c, 0, v2, 0, v1, 0);
255 
256  //- lower direction
257  m_shift.backward(v2, u_nu, mu);
258  mult_Field_Gnn(v1, 0, u_mu, 0, v2, 0);
259  mult_Field_Gdn(v2, 0, u_nu, 0, v1, 0);
260  m_shift.forward(v1, v2, nu);
261  c.addpart_ex(0, v1, 0);
262 }
263 
264 
265 //====================================================================
266 //============================================================END=====
Bridge::VerboseLevel m_vl
Definition: forceSmear.h:56
BridgeIO vout
Definition: bridgeIO.cpp:207
std::valarray< Field_G > m_U
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
void force_each(Field_G &, const Field_G &, const Field_G &, const Field_G &, const Field_G &, int mu, int nu)
std::valarray< double > m_rho
void mult_Field_Gdn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
void general(const char *format,...)
Definition: bridgeIO.cpp:38
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
Class for parameters.
Definition: parameters.h:40
void addpart_ex(int ex, const Field &w, int exw)
Definition: field.h:162
void mult_Field_Gdd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
int nin() const
Definition: field.h:100
Base class for force calculation of smeared operators.
Definition: forceSmear.h:37
void staple(Field_G &, const Field_G &, const Field_G &, int mu, int nu)
SU(N) gauge field.
Definition: field_G.h:36
virtual void force_recursive(Field_G &Xi, Field_G &iTheta, double alpha, const Field_G &Sigmap, const Field_G &C, const Field_G &U)=0
determination of fields for force calculation
void mult_Field_Gnd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
void mult_Field_Gnn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
void set_parameters(const Parameters &params)
void backward(Field &, const Field &, const int mu)
int nex() const
Definition: field.h:102
void multadd_Field_Gnd(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2, const double ff)
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
void force_udiv(Field_G &Sigma, const Field_G &Sigma_p, const Field_G &U)
base class for projection operator into gauge group.
Definition: projection.h:33
static bool Register(const std::string &realm, const creator_callback &cb)
ShiftField_lex m_shift
void Register_double(const string &, const double)
Definition: parameters.cpp:324
std::valarray< Field_G > m_iTheta
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:150
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:85
static const std::string class_name
Projection * m_proj
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191
void forward(Field &, const Field &, const int mu)