Bridge++  Ver. 1.1.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 //====================================================================
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  valarray<double> phi, phipr;
66 
67  int err = 0;
68  err += params.fetch_double("rho_uniform", rho1);
69  err += params.fetch_double_vector("phi", phi);
70  err += params.fetch_double_vector("phipr", phipr);
71 
72  if (err) {
73  vout.crucial(m_vl, "Smear_APE_SF: fetch error, input parameter not found.\n");
74  abort();
75  }
76 
77 
78  set_parameters(rho1, &phi[0], &phipr[0]);
79 }
80 
81 
82 //====================================================================
83 void Smear_APE_SF::set_parameters(const double rho1,
84  double *phi, double *phipr)
85 {
86  //- print input parameters
87  vout.general(m_vl, "Parameters of Smear_APE_SF:\n");
88  vout.general(m_vl, " rho = %8.4f\n", rho1);
89 
90  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
91  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
92  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
93  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
94  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
95  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
96 
97  //- range check
98  // NB. rho == 0 is allowed.
99  // NB. phi,phipr == 0 is allowed.
100 
101  //- store values
102  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
103  for (int mu = 0; mu < m_Ndim; ++mu) {
104  for (int nu = 0; nu < m_Ndim; ++nu) {
105  m_rho[mu + nu * m_Ndim] = rho1;
106  }
107  }
108 
109  for (int i = 0; i < 3; ++i) {
110  m_phi[i] = phi[i];
111  m_phipr[i] = phipr[i];
112  }
113 }
114 
115 
116 //====================================================================
117 void Smear_APE_SF::set_parameters(const valarray<double>& rho, double *phi, double *phipr)
118 {
119  //- print input parameters
120  vout.general(m_vl, "Parameters of Smear_APE_SF:\n");
121  for (int mu = 0; mu < m_Ndim; ++mu) {
122  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
123  }
124 
125  vout.general(m_vl, " phi1 = %12.6f\n", phi[0]);
126  vout.general(m_vl, " phi2 = %12.6f\n", phi[1]);
127  vout.general(m_vl, " phi3 = %12.6f\n", phi[2]);
128  vout.general(m_vl, " phipr1= %12.6f\n", phipr[0]);
129  vout.general(m_vl, " phipr2= %12.6f\n", phipr[1]);
130  vout.general(m_vl, " phipr3= %12.6f\n", phipr[2]);
131 
132  //- range check
133  // NB. rho == 0 is allowed.
134  // NB. phi,phipr == 0 is allowed.
135  assert(rho.size() == m_Ndim * m_Ndim);
136 
137  // store values
138  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
139  for (int mu = 0; mu < m_Ndim; ++mu) {
140  for (int nu = 0; nu < m_Ndim; ++nu) {
141  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
142  }
143  }
144 
145  for (int i = 0; i < 3; ++i) {
146  m_phi[i] = phi[i];
147  m_phipr[i] = phipr[i];
148  }
149 }
150 
151 
152 //====================================================================
153 void Smear_APE_SF::smear(Field_G& Usmear, const Field_G& U)
154 {
155  int Nvol = CommonParameters::Nvol();
156 
157  assert(U.nvol() == Nvol);
158  assert(U.nex() == m_Ndim);
159  assert(Usmear.nvol() == Nvol);
160  assert(Usmear.nex() == m_Ndim);
161 
162  Field_G c_tmp(Nvol, 1), u_tmp(Nvol, 1), u_tmp2(Nvol, 1);
163 
164  Staples_SF staple;
165  staple.set_parameters(m_phi, m_phipr);
166 
167  Field_G_SF set_wk(m_phi, m_phipr);
168 
169  Usmear = 0.0;
170 
171  for (int mu = 0; mu < m_Ndim; ++mu) {
172  c_tmp = 0.0;
173  u_tmp.setpart_ex(0, U, mu);
174 
175  for (int nu = 0; nu < m_Ndim; ++nu) {
176  if (nu != mu) {
177  double rho = m_rho[mu + m_Ndim * nu];
178  u_tmp2 = staple.upper(U, mu, nu);
179  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
180 
181  u_tmp2 = staple.lower(U, mu, nu);
182  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
183  }
184  }
185 
186  double rho0 = m_rho[mu + m_Ndim * mu];
187  // vout.general(m_vl,"mu=%d\n",mu);
188  m_proj->project(u_tmp2, rho0, c_tmp, u_tmp);
189  if (mu != 3) set_wk.set_boundary_wk(u_tmp2);
190  Usmear.setpart_ex(mu, u_tmp2, 0);
191 
192  /* For a debugging
193  for(int site = 0; site < Nvol; ++site){
194  vout.general(m_vl,"site smeared=%d\n",site);
195  for(int ll=0; ll<9; ++ll){
196  vout.general(m_vl,"(%lf %lf)\n",u_tmp2.cmp_r(ll,site,0),u_tmp2.cmp_i(ll,site,0));
197  }
198  }
199  */
200  }
201 }
202 
203 
204 //====================================================================
205 //============================================================END=====