Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 using std::valarray;
21 
22 #ifdef USE_FACTORY
23 namespace {
24  Smear *create_object(Projection *proj)
25  {
26  return new Smear_APE_SF(proj);
27  }
28 
29 
30  bool init = Smear::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("Smear.APE_SF", append_entry);
48 #endif
49 }
50 //- end
51 
52 //- parameters class
54 //- end
55 
56 const std::string Smear_APE_SF::class_name = "Smear_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 Smear_APE_SF::set_parameters(const double rho1,
86  double *phi, double *phipr)
87 {
88  //- print input parameters
89  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
90  vout.general(m_vl, " rho = %8.4f\n", rho1);
91 
92  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
93  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
94  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
95  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
96  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
97  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
98 
99  //- range check
100  // NB. rho == 0 is allowed.
101  // NB. phi,phipr == 0 is allowed.
102 
103  //- store values
104  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
105  for (int mu = 0; mu < m_Ndim; ++mu) {
106  for (int nu = 0; nu < m_Ndim; ++nu) {
107  m_rho[mu + nu * m_Ndim] = rho1;
108  }
109  }
110 
111  for (int i = 0; i < 3; ++i) {
112  m_phi[i] = phi[i];
113  m_phipr[i] = phipr[i];
114  }
115 }
116 
117 
118 //====================================================================
119 void Smear_APE_SF::set_parameters(const valarray<double>& rho, double *phi, double *phipr)
120 {
121  //- print input parameters
122  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
123  for (int mu = 0; mu < m_Ndim; ++mu) {
124  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
125  }
126 
127  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
128  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
129  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
130  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
131  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
132  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
133 
134  //- range check
135  // NB. rho == 0 is allowed.
136  // NB. phi,phipr == 0 is allowed.
137  assert(rho.size() == m_Ndim * m_Ndim);
138 
139  // store values
140  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
141  for (int mu = 0; mu < m_Ndim; ++mu) {
142  for (int nu = 0; nu < m_Ndim; ++nu) {
143  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
144  }
145  }
146 
147  for (int i = 0; i < 3; ++i) {
148  m_phi[i] = phi[i];
149  m_phipr[i] = phipr[i];
150  }
151 }
152 
153 
154 //====================================================================
155 void Smear_APE_SF::smear(Field_G& Usmear, const Field_G& U)
156 {
157  int Nvol = CommonParameters::Nvol();
158 
159  assert(U.nvol() == Nvol);
160  assert(U.nex() == m_Ndim);
161  assert(Usmear.nvol() == Nvol);
162  assert(Usmear.nex() == m_Ndim);
163 
164  Field_G c_tmp(Nvol, 1), u_tmp(Nvol, 1), 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 = 0.0;
172 
173  for (int mu = 0; mu < m_Ndim; ++mu) {
174  c_tmp = 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  u_tmp2 = staple.upper(U, mu, nu);
181  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
182 
183  u_tmp2 = staple.lower(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:207
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
void set_parameters(const Parameters &params)
Definition: staples_SF.cpp:63
Projection * m_proj
Definition: smear_APE_SF.h:48
void general(const char *format,...)
Definition: bridgeIO.cpp:38
int nvol() const
Definition: field.h:101
Class for parameters.
Definition: parameters.h:40
double m_phi[3]
SF boundary condition at t=0.
Definition: smear_APE_SF.h:51
static const std::string class_name
Definition: smear_APE_SF.h:43
void addpart_ex(int ex, const Field &w, int exw)
Definition: field.h:162
int fetch_double_vector(const string &key, std::valarray< double > &val) const
Definition: parameters.cpp:158
SU(N) gauge field.
Definition: field_G.h:36
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:102
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 &params)
double m_phipr[3]
SF boundary condition at t=Nt.
Definition: smear_APE_SF.h:53
static bool Register(const std::string &realm, const creator_callback &cb)
std::valarray< double > m_rho
Definition: smear_APE_SF.h:47
void Register_double_vector(const string &, const std::valarray< double > &)
Definition: parameters.cpp:338
void Register_double(const string &, const double)
Definition: parameters.cpp:324
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]
Field_G_SF lower(const Field_G &, const int, const int)
Definition: staples_SF.cpp:910
void setpart_ex(int ex, const Field &w, int exw)
Definition: field.h:150
Field_G_SF upper(const Field_G &, const int, const int)
Definition: staples_SF.cpp:864
int fetch_double(const string &key, double &val) const
Definition: parameters.cpp:124
string get_string(const string &key) const
Definition: parameters.cpp:85
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:191