Bridge++  Ver.2.1.3
force_F_Rational.cpp
Go to the documentation of this file.
1 
13 
14 const std::string Force_F_Rational::class_name = "Force_F_Rational";
15 
16 //====================================================================
18 {
20 
21  std::string vlevel;
22  if (!params.fetch_string("verbose_level", vlevel)) {
23  m_vl = vout.set_verbose_level(vlevel);
24  } else {
26  }
27 
28  vout.general(m_vl, "%s: construction\n", class_name.c_str());
30 
31  set_parameters_impl(params);
32 
33  setup(0);
34 
36  vout.general(m_vl, "%s: construction finished.\n",
37  class_name.c_str());
38 
39 }
40 
41 //====================================================================
43 {
45 
47 
48  vout.general(m_vl, "%s: construction\n", class_name.c_str());
50 
51  m_Np = 0;
52 
54  vout.general(m_vl, "%s: construction finished.\n",
55  class_name.c_str());
56 
57 }
58 
59 //====================================================================
60 void Force_F_Rational::setup(int Np_prev)
61 {
63 
64  if(Np_prev != 0) tidyup();
65 
66  Parameters params_solver;
67  params_solver.set_int("number_of_shifts", m_Np);
68  params_solver.set_int("maximum_number_of_iteration", m_Niter);
69  params_solver.set_double("convergence_criterion_squared", m_Stop_cond);
70  params_solver.set_string("verbose_level", vout.get_verbose_level(m_vl));
71 
72  m_solver = new Shiftsolver_CG(m_fopr, params_solver);
73 
74  const int Nvol = CommonParameters::Nvol();
75  const int Ndim = CommonParameters::Ndim();
76 
77  m_force1 = new Field_G(Nvol, Ndim);
78  m_force2 = new Field_G(Nvol, Ndim);
79 
80  m_psi.resize(m_Np);
81 
82  const int NinF = m_fopr->field_nin();
83  const int NvolF = m_fopr->field_nvol();
84  const int NexF = m_fopr->field_nex();
85 
86  for (int i = 0; i < m_Np; ++i) {
87  m_psi[i].reset(NinF, NvolF, NexF);
88  }
89 
90  m_eta = new Field(NinF, NvolF, NexF);
91 
92 }
93 
94 //====================================================================
96 {
98 
99  delete m_solver;
100 
101  delete m_force1;
102  delete m_force2;
103  delete m_eta;
104 
105 }
106 
107 
108 //====================================================================
110 {
111 
112  int Np_prev = m_Np;
113 
114  set_parameters_impl(params);
115 
116  if(Np_prev != m_Np) setup(Np_prev);
117 
118 
119 }
120 
121 
122 //====================================================================
124 {
125 #pragma omp barrier
126 
127  int ith = ThreadManager::get_thread_id();
128  if (ith == 0) {
129  std::string vlevel;
130  if (!params.fetch_string("verbose_level", vlevel)) {
131  m_vl = vout.set_verbose_level(vlevel);
132  }
133  }
134 #pragma omp barrier
135 
136  //- fetch and check input parameters
137  int Np, n_exp, d_exp;
138  double x_min, x_max;
139  int Niter;
140  double Stop_cond;
141 
142  int err = 0;
143  err += params.fetch_int("number_of_poles", Np);
144  err += params.fetch_int("exponent_numerator", n_exp);
145  err += params.fetch_int("exponent_denominator", d_exp);
146  err += params.fetch_double("lower_bound", x_min);
147  err += params.fetch_double("upper_bound", x_max);
148  err += params.fetch_int("maximum_number_of_iteration", Niter);
149  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
150 
151  if (err) {
152  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
153  class_name.c_str());
154  exit(EXIT_FAILURE);
155  }
156 
157  set_parameters_impl(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
158 
159 }
160 
161 
162 //====================================================================
164 {
165  params.set_int("number_of_poles", m_Np);
166  params.set_int("exponent_numerator", m_n_exp);
167  params.set_int("exponent_denominator", m_d_exp);
168  params.set_double("lower_bound", m_x_min);
169  params.set_double("upper_bound", m_x_max);
170  params.set_int("maximum_number_of_iteration", m_Niter);
171  params.set_double("convergence_criterion_squared", m_Stop_cond);
172 
173  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
174 }
175 
176 
177 //====================================================================
179  const int Np,
180  const int n_exp, const int d_exp,
181  const double x_min, const double x_max,
182  const int Niter, const double Stop_cond)
183 {
184  int Np_prev = m_Np;
185 
186  set_parameters(Np, n_exp, d_exp, x_min, x_max, Niter, Stop_cond);
187 
188  if(Np_prev != m_Np) setup(Np_prev);
189 
190 }
191 
192 
193 //====================================================================
195  const int Np,
196  const int n_exp, const int d_exp,
197  const double x_min, const double x_max,
198  const int Niter, const double Stop_cond)
199 {
200 #pragma omp barrier
201 
202  //- range check
203  int err = 0;
204  err += ParameterCheck::non_zero(Np);
205  err += ParameterCheck::non_zero(n_exp);
206  err += ParameterCheck::non_zero(d_exp);
207  // NB. x_min, x_max = 0.0 is allowed.
208  err += ParameterCheck::non_zero(Niter);
209  err += ParameterCheck::square_non_zero(Stop_cond);
210 
211  if (err) {
212  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n",
213  class_name.c_str());
214  exit(EXIT_FAILURE);
215  }
216 
217  int ith = ThreadManager::get_thread_id();
218  if (ith == 0) {
219  m_Np = Np;
220  m_n_exp = n_exp;
221  m_d_exp = d_exp;
222  m_x_min = x_min;
223  m_x_max = x_max;
224  m_Niter = Niter;
225  m_Stop_cond = Stop_cond;
226 
227  m_cl.resize(m_Np);
228  m_bl.resize(m_Np);
229 
230  //- Rational approximation
231  const double x_min2 = m_x_min * m_x_min;
232  const double x_max2 = m_x_max * m_x_max;
233 
234  Math_Rational rational;
235  rational.set_parameters(m_Np, m_n_exp, m_d_exp, x_min2, x_max2);
236  rational.get_parameters(m_a0, m_bl, m_cl);
237  }
238 #pragma omp barrier
239 
240  //- print input parameters
241  vout.general(m_vl, "%s: parameters:\n", class_name.c_str());
242  vout.general(m_vl, " Np = %d\n", m_Np);
243  vout.general(m_vl, " n_exp = %d\n", m_n_exp);
244  vout.general(m_vl, " d_exp = %d\n", m_d_exp);
245  vout.general(m_vl, " x_min = %12.8f\n", m_x_min);
246  vout.general(m_vl, " x_max = %12.8f\n", m_x_max);
247  vout.general(m_vl, " Niter = %d\n", m_Niter);
248  vout.general(m_vl, " Stop_cond = %8.2e\n", m_Stop_cond);
249  vout.general(m_vl, " a0 = %18.14f\n", m_a0);
250  for (int i = 0; i < m_Np; i++) {
251  vout.general(m_vl, " bl[%d] = %18.14f cl[%d] = %18.14f\n",
252  i, m_bl[i], i, m_cl[i]);
253  }
254 
255 #pragma omp barrier
256 }
257 
258 
259 //====================================================================
261 {
262 #pragma omp barrier
263 
264  int ith = ThreadManager::get_thread_id();
265  if (ith == 0) m_U = (Field_G *)U;
266 #pragma omp barrier
267 
268  m_fopr->set_config(U);
269  m_force->set_config(U);
270 
271 }
272 
273 //====================================================================
274 void Force_F_Rational::force_udiv(Field& force_, const Field& eta_)
275 {
276 #pragma omp barrier
277 
278  copy(*m_eta, eta_);
279 #pragma omp barrier
280 
282 
283  copy(force_, *m_force2);
284 #pragma omp barrier
285 
286 }
287 
288 
289 //====================================================================
291 {
292 #pragma omp barrier
293 
294  vout.general(m_vl, " Shift solver in force calculation\n");
295  vout.general(m_vl, " Number of shift values = %d\n", m_cl.size());
296 
297  m_fopr->set_mode("DdagD");
298 
299  int Nconv;
300  double diff;
301  m_solver->solve(m_psi, m_cl, eta, Nconv, diff);
302  vout.general(m_vl, " diff(max) = %22.15e \n", diff);
303 
304  force.set(0.0);
305 #pragma omp barrier
306 
307  for (int i = 0; i < m_Np; ++i) {
309  scal(*m_force1, m_bl[i]);
310  axpy(force, 1.0, *m_force1);
311 #pragma omp barrier
312  }
313 
314 }
315 
316 
317 //====================================================================
319 {
320  vout.crucial(m_vl, "Error at %s: not implemented.\n", __func__);
321  exit(EXIT_FAILURE);
322 }
323 
324 
325 //====================================================================
327 {
328  vout.crucial(m_vl, "Error at %s: not implemented.\n", __func__);
329  exit(EXIT_FAILURE);
330 }
331 
332 
333 //===========================================================END======
Force_F_Rational::setup
void setup(int Np_prev)
Definition: force_F_Rational.cpp:60
Force_F_Rational::m_Niter
int m_Niter
maximum iteration of shiftsolver
Definition: force_F_Rational.h:42
Force_F_Rational::m_solver
Shiftsolver_CG * m_solver
Definition: force_F_Rational.h:49
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
Force_F_Rational::set_config
void set_config(Field *U)
sets verbose level.
Definition: force_F_Rational.cpp:260
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
AForce_F::force_udiv
virtual void force_udiv(AFIELD &, const AFIELD &)
Definition: aforce_F.h:93
Force_F_Rational::tidyup
void tidyup()
Finial clean-up.
Definition: force_F_Rational.cpp:95
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
force_F_Rational.h
Force_F_Rational::m_Stop_cond
double m_Stop_cond
stopping condition of shift solver
Definition: force_F_Rational.h:43
Parameters
Class for parameters.
Definition: parameters.h:46
Force_F_Rational::m_d_exp
int m_d_exp
denominator of the exponent
Definition: force_F_Rational.h:39
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
AFopr::field_nex
virtual int field_nex()=0
returns the external degree of freedom of the fermion field.
Force_F_Rational::force_udiv
void force_udiv(Field &, const Field &)
Definition: force_F_Rational.cpp:274
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Force_F_Rational::m_force2
Field_G * m_force2
Definition: force_F_Rational.h:59
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
Math_Rational::get_parameters
void get_parameters(double &norm, std::vector< double > &res, std::vector< double > &pole)
Definition: math_Rational.cpp:100
Force_F_Rational::force_udiv1
void force_udiv1(Field &, const Field &, const Field &)
Definition: force_F_Rational.cpp:326
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
Force_F_Rational::m_n_exp
int m_n_exp
numerator of the exponent
Definition: force_F_Rational.h:38
AFopr::set_mode
virtual void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: afopr.h:81
Force_F_Rational::m_a0
double m_a0
rational approx. coefficients
Definition: force_F_Rational.h:51
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
Math_Rational::set_parameters
void set_parameters(const Parameters &params)
Definition: math_Rational.cpp:20
Force_F_Rational::class_name
static const std::string class_name
Definition: force_F_Rational.h:34
math_Rational.h
Force_F_Rational::m_bl
std::vector< double > m_bl
rational approx. coefficients
Definition: force_F_Rational.h:52
AFopr::set_config
virtual void set_config(Field *)=0
sets the gauge configuration.
Force_F_Rational::m_force1
Field_G * m_force1
Definition: force_F_Rational.h:58
Force_F_Rational::m_x_max
double m_x_max
upper bound of approximate sign function
Definition: force_F_Rational.h:41
AShiftsolver_CG::solve
void solve(std::vector< FIELD > &solution, const std::vector< double > &shift, const FIELD &source, int &Nconv, double &diff)
Definition: ashiftsolver_CG-tmpl.h:165
Force_F_Rational::m_Np
int m_Np
number of poles in rational approx.
Definition: force_F_Rational.h:37
AFopr::field_nvol
virtual int field_nvol()=0
returns the volume of the fermion field.
Force_F_Rational::set_parameters_impl
void set_parameters_impl(const Parameters &params)
Definition: force_F_Rational.cpp:123
Force_F_Rational::m_eta
Field * m_eta
Definition: force_F_Rational.h:56
ParameterCheck::square_non_zero
int square_non_zero(const double v)
Definition: parameterCheck.cpp:43
threadManager.h
Force_F_Rational::set_parameters
void set_parameters(const Parameters &params)
sets parameters by a Parameter object: to be implemented in a subclass.
Definition: force_F_Rational.cpp:109
Shiftsolver_CG
AShiftsolver_CG< Field, Fopr > Shiftsolver_CG
Multishift Conjugate Gradient solver.
Definition: shiftsolver_CG.h:35
Force_F_Rational::force_core1
void force_core1(Field &, const Field &, const Field &)
Definition: force_F_Rational.cpp:318
AForce_F::set_config
virtual void set_config(Field *)=0
sets verbose level.
Force_F_Rational::m_x_min
double m_x_min
lower bound of approximate sign function
Definition: force_F_Rational.h:40
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Force_F_Rational::m_psi
std::vector< Field > m_psi
Definition: force_F_Rational.h:55
Force_F_Rational::m_cl
std::vector< double > m_cl
rational approx. coefficients
Definition: force_F_Rational.h:53
AForce_F< Field >::m_U
Field_G * m_U
Gauge configuration.
Definition: aforce_F.h:42
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
ParameterCheck::non_zero
int non_zero(const double v)
Definition: parameterCheck.cpp:32
Force_F_Rational::m_force
Force * m_force
kernel fermion force
Definition: force_F_Rational.h:47
Parameters::set_int
void set_int(const string &key, const int value)
Definition: parameters.cpp:36
scal
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:262
Force_F_Rational::force_udiv_impl
void force_udiv_impl(Field_G &, const Field &)
Definition: force_F_Rational.cpp:290
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
Force_F_Rational::init
void init()
Obsolete initial setup with parameters.
Definition: force_F_Rational.cpp:42
Force_F_Rational::m_vl
Bridge::VerboseLevel m_vl
verbose level
Definition: force_F_Rational.h:44
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
Field
Container of Field-type object.
Definition: field.h:46
AFopr::field_nin
virtual int field_nin()=0
returns the on-site degree of freedom of the fermion field.
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
Field_G
SU(N) gauge field.
Definition: field_G.h:38
Force_F_Rational::m_fopr
Fopr * m_fopr
kernel fermion operator
Definition: force_F_Rational.h:46
Math_Rational
Determionation of coefficients of rational approximation.
Definition: math_Rational.h:40
Parameters::fetch_int
int fetch_int(const string &key, int &value) const
Definition: parameters.cpp:346
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
Force_F_Rational::get_parameters
void get_parameters(Parameters &params) const
Definition: force_F_Rational.cpp:163
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216