Bridge++  Ver. 1.3.x
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 
21 #ifdef USE_FACTORY
22 namespace {
23  ForceSmear *create_object(Projection *proj)
24  {
25  return new ForceSmear_APE(proj);
26  }
27 
28 
29  bool init = ForceSmear::Factory::Register("APE", create_object);
30 }
31 #endif
32 
33 //- parameter entries
34 namespace {
35  void append_entry(Parameters& param)
36  {
37  param.Register_double("rho_uniform", 0.0);
38  // param.Register_double_vector("rho", std::vector<double>());
39 
40  param.Register_string("verbose_level", "NULL");
41  }
42 
43 
44 #ifdef USE_PARAMETERS_FACTORY
45  bool init_param = ParametersFactory::Register("ForceSmear.APE", append_entry);
46 #endif
47 }
48 //- end
49 
50 //- parameters class
52 //- end
53 
54 const std::string ForceSmear_APE::class_name = "ForceSmear_APE";
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 rho1;
65 
66  int err = 0;
67  err += params.fetch_double("rho_uniform", rho1);
68 
69  if (err) {
70  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
71  exit(EXIT_FAILURE);
72  }
73 
74 
75  set_parameters(rho1);
76 }
77 
78 
79 //====================================================================
80 void ForceSmear_APE::set_parameters(const double rho1)
81 {
82  //- print input parameters
83  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
84  vout.general(m_vl, " rho = %8.4f\n", rho1);
85 
86  //- range check
87  // NB. rho == 0 is allowed.
88 
89  //- store values
90  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
91  for (int mu = 0; mu < m_Ndim; ++mu) {
92  for (int nu = 0; nu < m_Ndim; ++nu) {
93  m_rho[mu + nu * m_Ndim] = rho1;
94  }
95  }
96 }
97 
98 
99 //====================================================================
100 void ForceSmear_APE::set_parameters(const std::vector<double>& rho)
101 {
102  //- print input parameters
103  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
104  for (int mu = 0; mu < m_Ndim; ++mu) {
105  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
106  }
107 
108  //- range check
109  // NB. rho == 0 is allowed.
110  assert(rho.size() == m_Ndim * m_Ndim);
111 
112  //- store values
113  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
114  for (int mu = 0; mu < m_Ndim; ++mu) {
115  for (int nu = 0; nu < m_Ndim; ++nu) {
116  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
117  }
118  }
119 }
120 
121 
122 //====================================================================
124 {
127 
128  m_rho.resize(m_Ndim * m_Ndim);
129  m_U.resize(m_Ndim);
130  m_iTheta.resize(m_Ndim);
131 
132  for (int mu = 0; mu < m_Ndim; ++mu) {
133  for (int nu = 0; nu < m_Ndim; ++nu) {
134  m_rho[mu + nu * m_Ndim] = 0.0;
135  }
136  }
137 }
138 
139 
140 //====================================================================
141 void ForceSmear_APE::force_udiv(Field_G& Sigma, const Field_G& Sigmap, 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 C(m_Nvol, 1);
151  Field_G sigmap_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
152 
153  for (int mu = 0; mu < m_Ndim; ++mu) {
154  m_U[mu].setpart_ex(0, U, mu);
155  }
156 
157  Field_G c_tmp(m_Nvol, 1);
158  for (int mu = 0; mu < m_Ndim; ++mu) {
159  C.set(0.0);
160 
161  for (int nu = 0; nu < m_Ndim; ++nu) {
162  if (nu == mu) continue;
163  double rho = m_rho[mu + m_Ndim * nu];
164  staple(c_tmp, m_U[mu], m_U[nu], mu, nu);
165  C.addpart_ex(0, c_tmp, 0, rho);
166  }
167 
168  sigmap_tmp.setpart_ex(0, Sigmap, mu);
169 
170  double alpha = m_rho[mu + m_Ndim * mu];
172  alpha, sigmap_tmp, C, m_U[mu]);
173  Sigma.setpart_ex(mu, Xi, 0);
174  }
175 
176  Field_G sigma_tmp(m_Nvol, 1);
177  for (int mu = 0; mu < m_Ndim; ++mu) {
178  for (int nu = 0; nu < m_Ndim; ++nu) {
179  if (nu == mu) continue;
180  double rho = m_rho[mu + m_Ndim * nu];
181  force_each(sigma_tmp, m_U[mu], m_U[nu],
182  m_iTheta[mu], m_iTheta[nu], mu, nu);
183  Sigma.addpart_ex(mu, sigma_tmp, 0, rho);
184  }
185  }
186 }
187 
188 
189 //====================================================================
191  const Field_G& V_mu, const Field_G& V_nu,
192  const Field_G& iTheta_mu,
193  const Field_G& iTheta_nu,
194  int mu, int nu)
195 {
196  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
197 
198  Sigma_mu.set(0.0);
199 
200  m_shift.backward(vt1, V_nu, mu);
201  m_shift.backward(vt2, V_mu, nu);
202  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
203  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, iTheta_nu, 0, 1.0);
204 
205  mult_Field_Gdn(vt3, 0, iTheta_mu, 0, V_nu, 0);
206  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
207  m_shift.forward(vt3, vt2, nu);
208  axpy(Sigma_mu, 1.0, vt3); // Sigma_mu += vt3;
209 
210  mult_Field_Gdn(vt3, 0, V_mu, 0, iTheta_nu, 0);
211  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
212  m_shift.forward(vt3, vt2, nu);
213  axpy(Sigma_mu, 1.0, vt3); // Sigma_mu += vt3;
214 
215  m_shift.backward(vt1, iTheta_nu, mu);
216  m_shift.backward(vt2, V_mu, nu);
217  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
218  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
219 
220  mult_Field_Gdd(vt2, 0, vt1, 0, V_mu, 0);
221  mult_Field_Gnn(vt3, 0, vt2, 0, V_nu, 0);
222  m_shift.forward(vt2, vt3, nu);
223  axpy(Sigma_mu, 1.0, vt2); // Sigma_mu += vt2;
224 
225  m_shift.backward(vt1, V_nu, mu);
226  m_shift.backward(vt2, iTheta_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 
231 
232 //====================================================================
234  const Field_G& u_mu, const Field_G& u_nu,
235  int mu, int nu)
236 {
237  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
238 
239  //- upper direction
240  m_shift.backward(v1, u_mu, nu);
241  mult_Field_Gnn(v2, 0, u_nu, 0, v1, 0);
242 
243  m_shift.backward(v1, u_nu, mu);
244  mult_Field_Gnd(c, 0, v2, 0, v1, 0);
245 
246  //- lower direction
247  m_shift.backward(v2, u_nu, mu);
248  mult_Field_Gnn(v1, 0, u_mu, 0, v2, 0);
249  mult_Field_Gdn(v2, 0, u_nu, 0, v1, 0);
250  m_shift.forward(v1, v2, nu);
251  c.addpart_ex(0, v1, 0);
252 }
253 
254 
255 //====================================================================
256 //============================================================END=====
Bridge::VerboseLevel m_vl
Definition: forceSmear.h:56
BridgeIO vout
Definition: bridgeIO.cpp:278
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:155
void force_each(Field_G &, const Field_G &, const Field_G &, const Field_G &, const Field_G &, int mu, int nu)
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:65
std::vector< Field_G > m_iTheta
int nvol() const
Definition: field.h:116
Class for parameters.
Definition: parameters.h:38
void addpart_ex(int ex, const Field &w, int exw)
Definition: field.h:189
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:115
Base class for force calculation of smeared operators.
Definition: forceSmear.h:34
void staple(Field_G &, const Field_G &, const Field_G &, int mu, int nu)
SU(N) gauge field.
Definition: field_G.h:38
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:117
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 axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
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:31
static bool Register(const std::string &realm, const creator_callback &cb)
ShiftField_lex m_shift
std::vector< Field_G > m_U
void Register_double(const string &, const double)
Definition: parameters.cpp:323
double rho(int mu, int nu)
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:177
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:87
std::vector< double > m_rho
static const std::string class_name
Projection * m_proj
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28
void forward(Field &, const Field &, const int mu)