Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
smear_APE.cpp
Go to the documentation of this file.
1 
14 #include "smear_APE.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(proj);
27  }
28 
29 
30  bool init = Smear::Factory::Register("APE", create_object);
31 }
32 #endif
33 
34 //- parameter entry
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_double("rho_uniform", 0.0);
39  // Register_double_vector("rho", std::valarray<double>());
40  // anisotropic setup is not supported in this version.
41 
42  param.Register_string("verbose_level", "NULL");
43  }
44 
45 
46 #ifdef USE_PARAMETERS_FACTORY
47  bool init_param = ParametersFactory::Register("Smear.APE", 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 
66  int err = 0;
67  err += params.fetch_double("rho_uniform", rho1);
68 
69  if (err) {
70  vout.crucial(m_vl, "Smear_APE: fetch error, input parameter not found.\n");
71  abort();
72  }
73 
74 
75  set_parameters(rho1);
76 }
77 
78 
79 //====================================================================
80 void Smear_APE::set_parameters(const double rho1)
81 {
82  //- print input parameters
83  vout.general(m_vl, "Parameters of Smear_APE:\n");
84  vout.general(m_vl, " rho = %8.4f\n", rho1);
85 
86  //- range check
87  // NB. rho == 0 is allowed.
88 
89  //- store values
90  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
91  for (int mu = 0; mu < m_Ndim; ++mu) {
92  for (int nu = 0; nu < m_Ndim; ++nu) {
93  m_rho[mu + nu * m_Ndim] = rho1;
94  }
95  }
96 }
97 
98 
99 //====================================================================
100 void Smear_APE::set_parameters(const valarray<double>& rho)
101 {
102  //- print input parameters
103  vout.general(m_vl, "Parameters of Smear_APE:\n");
104  for (int mu = 0; mu < m_Ndim; ++mu) {
105  vout.general(m_vl, " rho[%d] = %8.4f\n", mu, rho[mu]);
106  }
107 
108  // range check
109  // NB. rho == 0 is allowed.
110  assert(rho.size() == m_Ndim * m_Ndim);
111 
112  //- store values
113  // m_rho.resize(m_Ndim * m_Ndim); // already resized in init.
114  for (int mu = 0; mu < m_Ndim; ++mu) {
115  for (int nu = 0; nu < m_Ndim; ++nu) {
116  m_rho[mu + nu * m_Ndim] = rho[mu + nu * m_Ndim];
117  }
118  }
119 }
120 
121 
122 //====================================================================
123 void Smear_APE::smear(Field_G& Usmear, const Field_G& U)
124 {
125  int Nvol = CommonParameters::Nvol();
126 
127  assert(U.nvol() == Nvol);
128  assert(U.nex() == m_Ndim);
129  assert(Usmear.nvol() == Nvol);
130  assert(Usmear.nex() == m_Ndim);
131 
132  Field_G c_tmp(Nvol, 1), u_tmp(Nvol, 1), u_tmp2(Nvol, 1);
133 
134  Staples staple;
135 
136  Usmear = 0.0;
137 
138  for (int mu = 0; mu < m_Ndim; ++mu) {
139  c_tmp = 0.0;
140  u_tmp.setpart_ex(0, U, mu);
141 
142  for (int nu = 0; nu < m_Ndim; ++nu) {
143  if (nu != mu) {
144  double rho = m_rho[mu + m_Ndim * nu];
145  u_tmp2 = staple.upper(U, mu, nu);
146  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
147 
148  u_tmp2 = staple.lower(U, mu, nu);
149  c_tmp.addpart_ex(0, u_tmp2, 0, rho);
150  }
151  }
152 
153  double rho0 = m_rho[mu + m_Ndim * mu];
154  m_proj->project(u_tmp2, rho0, c_tmp, u_tmp);
155  Usmear.setpart_ex(mu, u_tmp2, 0);
156  }
157 }
158 
159 
160 //====================================================================
161 //============================================================END=====