Bridge++  Ver. 1.3.x
smear_APE_SF.cpp
Go to the documentation of this file.
1 
14 #include "smear_APE_SF.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 
21 #ifdef USE_FACTORY
22 namespace {
23  Smear *create_object(Projection *proj)
24  {
25  return new Smear_APE_SF(proj);
26  }
27 
28 
29  bool init = Smear::Factory::Register("APE_SF", 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("phi", std::vector<double>());
39  param.Register_double_vector("phipr", std::vector<double>());
40 
41  param.Register_string("verbose_level", "NULL");
42  }
43 
44 
45 #ifdef USE_PARAMETERS_FACTORY
46  bool init_param = ParametersFactory::Register("Smear.APE_SF", append_entry);
47 #endif
48 }
49 //- end
50 
51 //- parameters class
53 //- end
54 
55 const std::string Smear_APE_SF::class_name = "Smear_APE_SF";
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  std::vector<double> phi, phipr;
67 
68  int err = 0;
69  err += params.fetch_double("rho_uniform", rho1);
70  err += params.fetch_double_vector("phi", phi);
71  err += params.fetch_double_vector("phipr", phipr);
72 
73  if (err) {
74  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n", class_name.c_str());
75  exit(EXIT_FAILURE);
76  }
77 
78 
79  set_parameters(rho1, &phi[0], &phipr[0]);
80 }
81 
82 
83 //====================================================================
84 void Smear_APE_SF::set_parameters(const double rho1,
85  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 
116 
117 //====================================================================
118 void Smear_APE_SF::set_parameters(const std::vector<double>& rho, double *phi, double *phipr)
119 {
120  //- print input parameters
121  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
122  for (int mu = 0; mu < m_Ndim; ++mu) {
123  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
124  }
125 
126  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
127  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
128  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
129  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
130  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
131  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
132 
133  //- range check
134  // NB. rho == 0 is allowed.
135  // NB. phi,phipr == 0 is allowed.
136  assert(rho.size() == m_Ndim * m_Ndim);
137 
138  // store values
139  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
140  for (int mu = 0; mu < m_Ndim; ++mu) {
141  for (int nu = 0; nu < m_Ndim; ++nu) {
142  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
143  }
144  }
145 
146  for (int i = 0; i < 3; ++i) {
147  m_phi[i] = phi[i];
148  m_phipr[i] = phipr[i];
149  }
150 }
151 
152 
153 //====================================================================
154 void Smear_APE_SF::smear(Field_G& Usmear, const Field_G& U)
155 {
156  int Nvol = CommonParameters::Nvol();
157 
158  assert(U.nvol() == Nvol);
159  assert(U.nex() == m_Ndim);
160  assert(Usmear.nvol() == Nvol);
161  assert(Usmear.nex() == m_Ndim);
162 
163  Field_G c_tmp(Nvol, 1), u_tmp(Nvol, 1);
164  Field_G_SF u_tmp2(Nvol, 1);
165 
166  Staples_SF staple;
167  staple.set_parameters(m_phi, m_phipr);
168 
169  Field_G_SF set_wk(m_phi, m_phipr);
170 
171  Usmear.set(0.0);
172 
173  for (int mu = 0; mu < m_Ndim; ++mu) {
174  c_tmp.set(0.0);
175  u_tmp.setpart_ex(0, U, mu);
176 
177  for (int nu = 0; nu < m_Ndim; ++nu) {
178  if (nu != mu) {
179  double rho = m_rho[mu + m_Ndim * nu];
180  staple.upper(u_tmp2, U, mu, nu);
181  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
182 
183  staple.lower(u_tmp2, U, mu, nu);
184  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
185  }
186  }
187 
188  double rho0 = m_rho[mu + m_Ndim * mu];
189  // vout.general(m_vl,"mu=%d\n",mu);
190  m_proj->project(u_tmp2, rho0, c_tmp, u_tmp);
191  if (mu != 3) set_wk.set_boundary_wk(u_tmp2);
192  Usmear.setpart_ex(mu, u_tmp2, 0);
193 
194  /* For a debugging
195  for(int site = 0; site < Nvol; ++site){
196  vout.general(m_vl,"site smeared=%d\n",site);
197  for(int ll=0; ll<9; ++ll){
198  vout.general(m_vl,"(%lf %lf)\n",u_tmp2.cmp_r(ll,site,0),u_tmp2.cmp_i(ll,site,0));
199  }
200  }
201  */
202  }
203 }
204 
205 
206 //====================================================================
207 //============================================================END=====
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 upper(Field_G_SF &, const Field_G &, const int, const int)
Definition: staples_SF.cpp:860
void set_parameters(const Parameters &params)
Definition: staples_SF.cpp:62
Projection * m_proj
Definition: smear_APE_SF.h:50
void general(const char *format,...)
Definition: bridgeIO.cpp:65
int nvol() const
Definition: field.h:116
Class for parameters.
Definition: parameters.h:38
double m_phi[3]
SF boundary condition at t=0.
Definition: smear_APE_SF.h:53
static const std::string class_name
Definition: smear_APE_SF.h:45
SU(N) gauge field.
Definition: field_G.h:38
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
int nex() const
Definition: field.h:117
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
base class for projection operator into gauge group.
Definition: projection.h:31
void set_parameters(const Parameters &params)
double m_phipr[3]
SF boundary condition at t=Nt.
Definition: smear_APE_SF.h:55
static bool Register(const std::string &realm, const creator_callback &cb)
void Register_double_vector(const string &, const std::vector< double > &)
Definition: parameters.cpp:337
std::valarray< double > m_rho
Definition: smear_APE_SF.h:49
void lower(Field_G_SF &, const Field_G &, const int, const int)
Definition: staples_SF.cpp:903
int fetch_double_vector(const string &key, std::vector< double > &val) const
Definition: parameters.cpp:158
void Register_double(const string &, const double)
Definition: parameters.cpp:323
base class for smearing of link variables.
Definition: smear.h:36
virtual void project(Field_G &v, double alpha, const Field_G &C, const Field_G &U)=0
projection V = P[alpha, C, U]
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
Bridge::VerboseLevel m_vl
Definition: smear.h:39
void smear(Field_G &Usmear, const Field_G &U)
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:28