Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
forceSmear_APE_SF.cpp
Go to the documentation of this file.
1 
14 #include "forceSmear_APE_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  ForceSmear *create_object(Projection *proj)
25  {
26  return new ForceSmear_APE_SF(proj);
27  }
28 
29 
30  bool init = ForceSmear::Factory::Register("APE_SF", 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("phi", std::valarray<double>());
40  param.Register_double_vector("phipr", std::valarray<double>());
41 
42  param.Register_string("verbose_level", "NULL");
43  }
44 
45 
46 #ifdef USE_PARAMETERS_FACTORY
47  bool init_param = ParametersFactory::Register("ForceSmear.APE_SF", append_entry);
48 #endif
49 }
50 //- end
51 
52 //- parameters class
54 //- end
55 
56 const std::string ForceSmear_APE_SF::class_name = "ForceSmear_APE_SF";
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 rho1;
67  valarray<double> phi, phipr;
68 
69  int err = 0;
70  err += params.fetch_double("rho_uniform", rho1);
71  err += params.fetch_double_vector("phi", phi);
72  err += params.fetch_double_vector("phipr", phipr);
73 
74  if (err) {
75  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
76  abort();
77  }
78 
79 
80  set_parameters(rho1, &phi[0], &phipr[0]);
81 }
82 
83 
84 //====================================================================
85 void ForceSmear_APE_SF::set_parameters(const double rho1, double *phi, double *phipr)
86 {
87  //- print input parameters
88  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
89  vout.general(m_vl, " rho = %8.4f\n", rho1);
90 
91  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
92  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
93  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
94  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
95  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
96  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
97 
98  //- range check
99  // NB. rho == 0 is allowed.
100  // NB. phi,phipr == 0 is allowed.
101 
102  //- store values
103  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
104  for (int mu = 0; mu < m_Ndim; ++mu) {
105  for (int nu = 0; nu < m_Ndim; ++nu) {
106  m_rho[mu + nu * m_Ndim] = rho1;
107  }
108  }
109 
110  for (int i = 0; i < 3; ++i) {
111  m_phi[i] = phi[i];
112  m_phipr[i] = phipr[i];
113  }
114 
115  //- propagate parameters
117 }
118 
119 
120 //====================================================================
121 void ForceSmear_APE_SF::set_parameters(const valarray<double>& rho, double *phi, double *phipr)
122 {
123  //- print input parameters
124  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
125  for (int mu = 0; mu < m_Ndim; ++mu) {
126  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
127  }
128 
129  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
130  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
131  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
132  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
133  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
134  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
135 
136  //- range check
137  // NB. rho == 0 is allowed.
138  // NB. phi,phipr == 0 is allowed.
139  assert(rho.size() == m_Ndim * m_Ndim);
140 
141  // store values
142  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
143  for (int mu = 0; mu < m_Ndim; ++mu) {
144  for (int nu = 0; nu < m_Ndim; ++nu) {
145  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
146  }
147  }
148 
149  for (int i = 0; i < 3; ++i) {
150  m_phi[i] = phi[i];
151  m_phipr[i] = phipr[i];
152  }
153 
154  // propagate parameters
156 }
157 
158 
159 //====================================================================
161 {
162  m_Ndim = CommonParameters::Ndim();
164 
165  m_rho.resize(m_Ndim * m_Ndim);
166  m_U.resize(m_Ndim);
167  m_iTheta.resize(m_Ndim);
168 
169  for (int mu = 0; mu < m_Ndim; ++mu) {
170  for (int nu = 0; nu < m_Ndim; ++nu) {
171  m_rho[mu + nu * m_Ndim] = 0.0;
172  }
173  }
174 }
175 
176 
177 //====================================================================
178 
191 {
192  Field_G Sigma(Sigmap.nvol(), Sigmap.nex());
193 
194  force_udiv(Sigma, Sigmap, U);
195  return Sigma;
196 }
197 
198 
199 void ForceSmear_APE_SF::force_udiv(Field_G& Sigma, const Field_G& Sigmap, const Field_G& U)
200 {
201  int Nc = CommonParameters::Nc();
202  int NinG = 2 * Nc * Nc;
203 
204  assert(Sigmap.nin() == NinG);
205  assert(Sigmap.nvol() == m_Nvol);
206  assert(Sigmap.nex() == m_Ndim);
207 
208  Field_G C(m_Nvol, 1);
209  Field_G sigmap_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
210 
211  for (int mu = 0; mu < m_Ndim; ++mu) {
212  m_U[mu].setpart_ex(0, U, mu);
213  if (mu != 3) set_wk.set_boundary_wk(m_U[mu]);
214  }
215 
216  Field_G c_tmp(m_Nvol, 1);
217  for (int mu = 0; mu < m_Ndim; ++mu) {
218  C = 0.0;
219  for (int nu = 0; nu < m_Ndim; ++nu) {
220  if (nu == mu) continue;
221  double rho = m_rho[mu + m_Ndim * nu];
222  staple(c_tmp, m_U[mu], m_U[nu], mu, nu);
223  C.addpart_ex(0, c_tmp, 0, rho);
224  }
225 
226  sigmap_tmp.setpart_ex(0, Sigmap, mu);
227 
228  double alpha = m_rho[mu + m_Ndim * mu];
230  alpha, sigmap_tmp, C, m_U[mu]);
231  Sigma.setpart_ex(mu, Xi, 0);
232  }
233 
234  Field_G sigma_tmp(m_Nvol, 1);
235  for (int mu = 0; mu < m_Ndim; ++mu) {
236  for (int nu = 0; nu < m_Ndim; ++nu) {
237  if (nu == mu) continue;
238  double rho = m_rho[mu + m_Ndim * nu];
239  force_each(sigma_tmp, m_U[mu], m_U[nu],
240  m_iTheta[mu], m_iTheta[nu], mu, nu);
241  Sigma.addpart_ex(mu, sigma_tmp, 0, rho);
242  }
243  }
245 }
246 
247 
248 //====================================================================
249 
263  const Field_G& V_mu, const Field_G& V_nu,
264  const Field_G& iTheta_mu,
265  const Field_G& iTheta_nu,
266  int mu, int nu)
267 {
268  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
269 
270  Sigma_mu = 0.0;
271  //- The 1st block
272  m_shift.backward(vt1, V_nu, mu);
273  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
274  m_shift.backward(vt2, V_mu, nu);
275  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
276  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
277  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, iTheta_nu, 0, 1.0);
278 
279  //- The 2nd block
280  mult_Field_Gdn(vt3, 0, iTheta_mu, 0, V_nu, 0);
281  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
282  m_shift.forward(vt3, vt2, nu);
283  Sigma_mu += vt3;
284 
285  //- The 3rd block
286  mult_Field_Gdn(vt3, 0, V_mu, 0, iTheta_nu, 0);
287  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
288  m_shift.forward(vt3, vt2, nu);
289  Sigma_mu += vt3;
290 
291  //- The 4th block
292  m_shift.backward(vt1, iTheta_nu, mu);
293  m_shift.backward(vt2, V_mu, nu);
294  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
295  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
296  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
297 
298  //- The 5th block
299  mult_Field_Gdd(vt2, 0, vt1, 0, V_mu, 0);
300  mult_Field_Gnn(vt3, 0, vt2, 0, V_nu, 0);
301  m_shift.forward(vt2, vt3, nu);
302  Sigma_mu += vt2;
303 
304  //- The 6th block
305  m_shift.backward(vt1, V_nu, mu);
306  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
307  m_shift.backward(vt2, iTheta_mu, nu);
308  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
309  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
310 }
311 
312 
313 //====================================================================
315  const Field_G& u_mu, const Field_G& u_nu,
316  int mu, int nu)
317 {
318  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
319 
320  //- upper direction
321  m_shift.backward(v1, u_mu, nu);
322  if (nu == 3) set_wk.set_boundary_wkpr(v1);
323  mult_Field_Gnn(v2, 0, u_nu, 0, v1, 0);
324 
325  m_shift.backward(v1, u_nu, mu);
326  if (mu == 3) set_wk.set_boundary_wkpr(v1);
327  mult_Field_Gnd(c, 0, v2, 0, v1, 0);
328 
329  //- lower direction
330  m_shift.backward(v2, u_nu, mu);
331  if (mu == 3) set_wk.set_boundary_wkpr(v2);
332  mult_Field_Gnn(v1, 0, u_mu, 0, v2, 0);
333  mult_Field_Gdn(v2, 0, u_nu, 0, v1, 0);
334  m_shift.forward(v1, v2, nu);
335  c.addpart_ex(0, v1, 0);
336 }
337 
338 
339 //====================================================================
340 //============================================================END=====
Bridge::VerboseLevel m_vl
Definition: forceSmear.h:56
BridgeIO vout
Definition: bridgeIO.cpp:207
void set_boundary_wkpr(const Mat_SU_N &U)
Set the boundary spatial link at t=Nt-1 for SF bc.
Definition: field_G_SF.cpp:76
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
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 force_udiv(Field_G &Sigma, const Field_G &Sigma_p, const Field_G &U)
void general(const char *format,...)
Definition: bridgeIO.cpp:38
static const std::string class_name
void set_parameters(const Parameters &params)
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
std::valarray< Field_G > m_iTheta
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)
void force_each(Field_G &, const Field_G &, const Field_G &, const Field_G &, const Field_G &, int mu, int nu)
int fetch_double_vector(const string &key, std::valarray< double > &val) const
Definition: parameters.cpp:158
int nin() const
Definition: field.h:100
Base class for force calculation of smeared operators.
Definition: forceSmear.h:37
void set_boundary_spatial_link_zero()
Set the boundary spatial link to 0 for SF bc.
Definition: field_G_SF.cpp:125
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)
double m_phi[3]
SF boundary condition at t=0.
void set_boundary_wk(const Mat_SU_N &U)
Set the boundary spatial link at t=0 for SF bc.
Definition: field_G_SF.cpp:50
void mult_Field_Gnn(Field_G &w, const int ex, const Field_G &u1, const int ex1, const Field_G &u2, const int ex2)
ShiftField_lex m_shift
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
base class for projection operator into gauge group.
Definition: projection.h:33
void set_parameters(const Parameters_Field_G_SF &params)
Set the parameter with Parameters_Field_G_SF class.
Definition: field_G_SF.cpp:268
static bool Register(const std::string &realm, const creator_callback &cb)
double m_phipr[3]
SF boundary condition at t=Nt.
void staple(Field_G &, const Field_G &, const Field_G &, int mu, int nu)
std::valarray< Field_G > m_U
void Register_double_vector(const string &, const std::valarray< double > &)
Definition: parameters.cpp:338
std::valarray< double > m_rho
void Register_double(const string &, const double)
Definition: parameters.cpp:324
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 VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:191
void forward(Field &, const Field &, const int mu)