Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Overlap.cpp
Go to the documentation of this file.
1 
14 #include "fopr_Overlap.h"
15 
16 #ifdef USE_PARAMETERS_FACTORY
17 #include "parameters_factory.h"
18 #endif
19 
20 using std::valarray;
21 
22 //- parameter entries
23 namespace {
24  void append_entry(Parameters& param)
25  {
26  param.Register_double("quark_mass", 0.0);
27  param.Register_double("domain_wall_height", 0.0);
28  param.Register_int("number_of_poles", 0);
29  param.Register_double("lower_bound", 0.0);
30  param.Register_double("upper_bound", 0.0);
31  param.Register_int("maximum_number_of_iteration", 0);
32  param.Register_double("convergence_criterion_squared", 0.0);
33  param.Register_int_vector("boundary_condition", std::valarray<int>());
34 
35  param.Register_string("verbose_level", "NULL");
36  }
37 
38 
39 #ifdef USE_PARAMETERS_FACTORY
40  bool init_param = ParametersFactory::Register("Fopr.Overlap", append_entry);
41 #endif
42 }
43 //- end
44 
45 //- parameters class
47 //- end
48 
49 //====================================================================
51 {
52  const string str_vlevel = params.get_string("verbose_level");
53 
54  m_vl = vout.set_verbose_level(str_vlevel);
55 
56  //- fetch and check input parameters
57  double mq, M0;
58  int Np;
59  double x_min, x_max;
60  int Niter;
61  double Stop_cond;
62  valarray<int> bc;
63 
64  int err = 0;
65  err += params.fetch_double("quark_mass", mq);
66  err += params.fetch_double("domain_wall_height", M0);
67  err += params.fetch_int("number_of_poles", Np);
68  err += params.fetch_double("lower_bound", x_min);
69  err += params.fetch_double("upper_bound", x_max);
70  err += params.fetch_int("maximum_number_of_iteration", Niter);
71  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
72  err += params.fetch_int_vector("boundary_condition", bc);
73 
74  if (err) {
75  vout.crucial(m_vl, "Fopr_Overlap: fetch error, input parameter not found.\n");
76  abort();
77  }
78 
79 
80  set_parameters(mq, M0, Np, x_min, x_max, Niter, Stop_cond, bc);
81 }
82 
83 
84 //====================================================================
85 void Fopr_Overlap::set_parameters(const double mq, const double M0, const int Np,
86  const double x_min, const double x_max,
87  const int Niter, const double Stop_cond,
88  const std::valarray<int> bc)
89 {
90  int Ndim = CommonParameters::Ndim();
91 
92  //- print input parameters
93  vout.general(m_vl, "Fopr_Overlap paramters:\n");
94  vout.general(m_vl, " mq = %10.6f\n", mq);
95  vout.general(m_vl, " M0 = %10.6f\n", M0);
96  vout.general(m_vl, " Np = %4d\n", Np);
97  vout.general(m_vl, " x_min = %12.8f\n", x_min);
98  vout.general(m_vl, " x_max = %12.6f\n", x_max);
99  vout.general(m_vl, " Niter = %6d\n", Niter);
100  vout.general(m_vl, " Stop_cond = %12.4e\n", Stop_cond);
101  for (int mu = 0; mu < Ndim; ++mu) {
102  vout.general(m_vl, " boundary[%d] = %2d\n", mu, bc[mu]);
103  }
104 
105  //- range check
106  int err = 0;
107  err += ParameterCheck::non_zero(mq);
108  err += ParameterCheck::non_zero(M0);
109  err += ParameterCheck::non_zero(Np);
110  // NB. x_min,x_max == 0 is allowed.
111  err += ParameterCheck::non_zero(Niter);
112  err += ParameterCheck::square_non_zero(Stop_cond);
113 
114  if (err) {
115  vout.crucial(m_vl, "Fopr_Overlap: parameter range check failed.\n");
116  abort();
117  }
118 
119  assert(bc.size() == Ndim);
120 
121  //- store values
122  m_mq = mq;
123  m_M0 = M0;
124 
125  m_Np = Np;
126  m_x_min = x_min;
127  m_x_max = x_max;
128 
129  m_Niter = Niter;
130  m_Stop_cond = Stop_cond;
131 
132  m_boundary.resize(Ndim);
133  for (int mu = 0; mu < Ndim; ++mu) {
134  m_boundary[mu] = bc[mu];
135  }
136 
137  //- propagate parameters
139 }
140 
141 
142 //====================================================================
143 void Fopr_Overlap::set_lowmodes(int Nsbt, valarray<double> *ev, valarray<Field> *vk)
144 {
145  m_Nsbt = Nsbt;
146  m_ev = ev;
147  m_vk = vk;
148 
150 }
151 
152 
153 //====================================================================
154 void Fopr_Overlap::DdagD(Field& v, const Field& b)
155 {
156  Field w(b.nin(), b.nvol(), b.nex());
157 
158  H(w, b);
159  H(v, w);
160 }
161 
162 
163 //====================================================================
164 void Fopr_Overlap::H(Field& v, const Field& b)
165 {
166  Field w(b.nin(), b.nvol(), b.nex());
167 
168  D(w, b);
169  m_fopr_w->mult_gm5(v, w);
170 }
171 
172 
173 //====================================================================
174 void Fopr_Overlap::Ddag(Field& v, const Field& b)
175 {
176  Field w(b.nin(), b.nvol(), b.nex());
177 
178  m_fopr_w->mult_gm5(w, b);
179  H(v, w);
180 }
181 
182 
183 //====================================================================
184 void Fopr_Overlap::D(Field& v, const Field& b)
185 {
186  assert(b.nin() == m_fopr_w->field_nin());
187  assert(b.nvol() == m_fopr_w->field_nvol());
188  assert(b.nex() == m_fopr_w->field_nex());
189 
190  assert(v.nin() == m_fopr_w->field_nin());
191  assert(v.nvol() == m_fopr_w->field_nvol());
192  assert(v.nex() == m_fopr_w->field_nex());
193 
194  double f1 = m_M0 + 0.5 * m_mq;
195  double f2 = m_M0 - 0.5 * m_mq;
196 
197  Field w(b.nin(), b.nvol(), b.nex());
198 
199  m_sign->mult(w, b);
200  m_fopr_w->mult_gm5(v, w);
201 
202  v *= f2;
203  v += f1 * b;
204 }
205 
206 
207 //====================================================================
208 //============================================================END=====