Bridge++  Version 1.4.4
 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 
17 
18 #ifdef USE_FACTORY
19 namespace {
20  ForceSmear *create_object(Projection *proj)
21  {
22  return new ForceSmear_APE_SF(proj);
23  }
24 
25 
26  bool init = ForceSmear::Factory::Register("APE_SF", create_object);
27 }
28 #endif
29 
30 
31 
32 const std::string ForceSmear_APE_SF::class_name = "ForceSmear_APE_SF";
33 
34 //====================================================================
36 {
37  const string str_vlevel = params.get_string("verbose_level");
38 
39  m_vl = vout.set_verbose_level(str_vlevel);
40 
41  //- fetch and check input parameters
42  double rho1;
43  std::vector<double> phi, phipr;
44 
45  int err = 0;
46  err += params.fetch_double("rho_uniform", rho1);
47  err += params.fetch_double_vector("phi", phi);
48  err += params.fetch_double_vector("phipr", phipr);
49 
50  if (err) {
51  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
52  exit(EXIT_FAILURE);
53  }
54 
55 
56  set_parameters(rho1, &phi[0], &phipr[0]);
57 }
58 
59 
60 //====================================================================
61 void ForceSmear_APE_SF::set_parameters(const double rho1, double *phi, double *phipr)
62 {
63  //- print input parameters
64  vout.general(m_vl, "%s:\n", class_name.c_str());
65  vout.general(m_vl, " rho = %8.4f\n", rho1);
66 
67  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
68  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
69  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
70  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
71  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
72  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
73 
74  //- range check
75  // NB. rho == 0 is allowed.
76  // NB. phi,phipr == 0 is allowed.
77 
78  //- store values
79  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
80  for (int mu = 0; mu < m_Ndim; ++mu) {
81  for (int nu = 0; nu < m_Ndim; ++nu) {
82  m_rho[mu + nu * m_Ndim] = rho1;
83  }
84  }
85 
86  for (int i = 0; i < 3; ++i) {
87  m_phi[i] = phi[i];
88  m_phipr[i] = phipr[i];
89  }
90 
91  //- propagate parameters
93 }
94 
95 
96 //====================================================================
97 void ForceSmear_APE_SF::set_parameters(const std::vector<double>& rho, double *phi, double *phipr)
98 {
99  //- print input parameters
100  vout.general(m_vl, "%s:\n", class_name.c_str());
101  for (int mu = 0; mu < m_Ndim; ++mu) {
102  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
103  }
104 
105  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
106  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
107  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
108  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
109  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
110  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
111 
112  //- range check
113  // NB. rho == 0 is allowed.
114  // NB. phi,phipr == 0 is allowed.
115  assert(rho.size() == m_Ndim * m_Ndim);
116 
117  // store values
118  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
119  for (int mu = 0; mu < m_Ndim; ++mu) {
120  for (int nu = 0; nu < m_Ndim; ++nu) {
121  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
122  }
123  }
124 
125  for (int i = 0; i < 3; ++i) {
126  m_phi[i] = phi[i];
127  m_phipr[i] = phipr[i];
128  }
129 
130  // propagate parameters
132 }
133 
134 
135 //====================================================================
137 {
140 
141  m_rho.resize(m_Ndim * m_Ndim);
142  m_U.resize(m_Ndim);
143  m_iTheta.resize(m_Ndim);
144 
145  for (int mu = 0; mu < m_Ndim; ++mu) {
146  for (int nu = 0; nu < m_Ndim; ++nu) {
147  m_rho[mu + nu * m_Ndim] = 0.0;
148  }
149  }
150 }
151 
152 
153 //====================================================================
154 
167 /*
168 Field ForceSmear_APE_SF::force_udiv(const Field_G& Sigmap, const Field_G& U)
169 {
170  Field_G Sigma(Sigmap.nvol(), Sigmap.nex());
171 
172  force_udiv(Sigma, Sigmap, U);
173 
174  return Sigma;
175 }
176 */
177 
178 //====================================================================
179 void ForceSmear_APE_SF::force_udiv(Field_G& Sigma, const Field_G& Sigmap, const Field_G& U)
180 {
181  int Nc = CommonParameters::Nc();
182  int NinG = 2 * Nc * Nc;
183 
184  assert(Sigmap.nin() == NinG);
185  assert(Sigmap.nvol() == m_Nvol);
186  assert(Sigmap.nex() == m_Ndim);
187 
188  Field_G C(m_Nvol, 1);
189  Field_G sigmap_tmp(m_Nvol, 1), Xi(m_Nvol, 1);
190 
191  for (int mu = 0; mu < m_Ndim; ++mu) {
192  m_U[mu].setpart_ex(0, U, mu);
193  if (mu != 3) set_wk.set_boundary_wk(m_U[mu]);
194  }
195 
196  Field_G c_tmp(m_Nvol, 1);
197  for (int mu = 0; mu < m_Ndim; ++mu) {
198  C.set(0.0);
199  for (int nu = 0; nu < m_Ndim; ++nu) {
200  if (nu == mu) continue;
201  double rho = m_rho[mu + m_Ndim * nu];
202  staple(c_tmp, m_U[mu], m_U[nu], mu, nu);
203  C.addpart_ex(0, c_tmp, 0, rho);
204  }
205 
206  sigmap_tmp.setpart_ex(0, Sigmap, mu);
207 
208  double alpha = m_rho[mu + m_Ndim * mu];
210  alpha, sigmap_tmp, C, m_U[mu]);
211  Sigma.setpart_ex(mu, Xi, 0);
212  }
213 
214  Field_G sigma_tmp(m_Nvol, 1);
215  for (int mu = 0; mu < m_Ndim; ++mu) {
216  for (int nu = 0; nu < m_Ndim; ++nu) {
217  if (nu == mu) continue;
218  double rho = m_rho[mu + m_Ndim * nu];
219  force_each(sigma_tmp, m_U[mu], m_U[nu],
220  m_iTheta[mu], m_iTheta[nu], mu, nu);
221  Sigma.addpart_ex(mu, sigma_tmp, 0, rho);
222  }
223  }
225 }
226 
227 
228 //====================================================================
229 
243  const Field_G& V_mu, const Field_G& V_nu,
244  const Field_G& iTheta_mu,
245  const Field_G& iTheta_nu,
246  int mu, int nu)
247 {
248  Field_G vt1(m_Nvol, 1), vt2(m_Nvol, 1), vt3(m_Nvol, 1);
249 
250  Sigma_mu.set(0.0);
251  //- The 1st block
252  m_shift.backward(vt1, V_nu, mu);
253  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
254  m_shift.backward(vt2, V_mu, nu);
255  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
256  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
257  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, iTheta_nu, 0, 1.0);
258 
259  //- The 2nd block
260  mult_Field_Gdn(vt3, 0, iTheta_mu, 0, V_nu, 0);
261  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
262  m_shift.forward(vt3, vt2, nu);
263  axpy(Sigma_mu, 1.0, vt3); // Sigma_mu += vt3;
264 
265  //- The 3rd block
266  mult_Field_Gdn(vt3, 0, V_mu, 0, iTheta_nu, 0);
267  mult_Field_Gdn(vt2, 0, vt1, 0, vt3, 0);
268  m_shift.forward(vt3, vt2, nu);
269  axpy(Sigma_mu, 1.0, vt3); // Sigma_mu += vt3;
270 
271  //- The 4th block
272  m_shift.backward(vt1, iTheta_nu, mu);
273  m_shift.backward(vt2, V_mu, nu);
274  if (nu == 3) set_wk.set_boundary_wkpr(vt2);
275  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
276  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
277 
278  //- The 5th block
279  mult_Field_Gdd(vt2, 0, vt1, 0, V_mu, 0);
280  mult_Field_Gnn(vt3, 0, vt2, 0, V_nu, 0);
281  m_shift.forward(vt2, vt3, nu);
282  axpy(Sigma_mu, 1.0, vt2); // Sigma_mu += vt2;
283 
284  //- The 6th block
285  m_shift.backward(vt1, V_nu, mu);
286  if (mu == 3) set_wk.set_boundary_wkpr(vt1);
287  m_shift.backward(vt2, iTheta_mu, nu);
288  mult_Field_Gnd(vt3, 0, vt1, 0, vt2, 0);
289  multadd_Field_Gnd(Sigma_mu, 0, vt3, 0, V_nu, 0, 1.0);
290 }
291 
292 
293 //====================================================================
295  const Field_G& u_mu, const Field_G& u_nu,
296  int mu, int nu)
297 {
298  Field_G v1(m_Nvol, 1), v2(m_Nvol, 1);
299 
300  //- upper direction
301  m_shift.backward(v1, u_mu, nu);
302  if (nu == 3) set_wk.set_boundary_wkpr(v1);
303  mult_Field_Gnn(v2, 0, u_nu, 0, v1, 0);
304 
305  m_shift.backward(v1, u_nu, mu);
306  if (mu == 3) set_wk.set_boundary_wkpr(v1);
307  mult_Field_Gnd(c, 0, v2, 0, v1, 0);
308 
309  //- lower direction
310  m_shift.backward(v2, u_nu, mu);
311  if (mu == 3) set_wk.set_boundary_wkpr(v2);
312  mult_Field_Gnn(v1, 0, u_mu, 0, v2, 0);
313  mult_Field_Gdn(v2, 0, u_nu, 0, v1, 0);
314  m_shift.forward(v1, v2, nu);
315  c.addpart_ex(0, v1, 0);
316 }
317 
318 
319 //====================================================================
320 //============================================================END=====
Bridge::VerboseLevel m_vl
Definition: forceSmear.h:56
BridgeIO vout
Definition: bridgeIO.cpp:495
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:55
int fetch_double_vector(const string &key, vector< double > &value) const
Definition: parameters.cpp:275
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:164
void force_udiv(Field_G &Sigma, const Field_G &Sigma_p, const Field_G &U)
void general(const char *format,...)
Definition: bridgeIO.cpp:195
static const std::string class_name
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 set_parameters(const Parameters &params)
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:211
int nvol() const
Definition: field.h:116
void mult_Field_Gdn(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)
std::vector< Field_G > m_iTheta
Class for parameters.
Definition: parameters.h:46
void addpart_ex(int ex, const Field &w, int exw)
Definition: field.h:193
void force_each(Field_G &, const Field_G &, const Field_G &, const Field_G &, const Field_G &, int mu, int nu)
int nin() const
Definition: field.h:115
Base class for force calculation of smeared operators.
Definition: forceSmear.h:34
std::vector< double > m_rho
void set_boundary_spatial_link_zero()
Set the boundary spatial link to 0 for SF bc.
Definition: field_G_SF.cpp:104
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 set_parameters(const std::vector< double > &phi, const std::vector< double > &phipr)
Set the parameter by giving vector objects.
Definition: field_G_SF.cpp:247
double m_phi[3]
SF boundary condition at t=0.
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 set_boundary_wk(const Mat_SU_N &U)
Set the boundary spatial link at t=0 for SF bc.
Definition: field_G_SF.cpp:29
ShiftField_lex m_shift
void backward(Field &, const Field &, const int mu)
int nex() const
Definition: field.h:117
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
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 crucial(const char *format,...)
Definition: bridgeIO.cpp:178
base class for projection operator into gauge group.
Definition: projection.h:31
std::vector< Field_G > m_U
double m_phipr[3]
SF boundary condition at t=Nt.
void staple(Field_G &, const Field_G &, const Field_G &, int mu, int nu)
Recursive calculation for APE smeared fermion force.
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:186
string get_string(const string &key) const
Definition: parameters.cpp:116
double rho(int mu, int nu)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
void forward(Field &, const Field &, const int mu)
void mult_Field_Gnd(Field_G &W, const int ex, const Field_G &U1, const int ex1, const Field_G &U2, const int ex2)