Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fprop_Wilson_Shift.cpp
Go to the documentation of this file.
1 
14 #include "fprop_Wilson_Shift.h"
15 
16 
17 
18 const std::string Fprop_Wilson_Shift::class_name = "Fprop_Wilson_Shift";
19 
20 //====================================================================
22 {
23  const string str_vlevel = params.get_string("verbose_level");
24 
25  m_vl = vout.set_verbose_level(str_vlevel);
26 
27  //- fetch and check input parameters
28  int Nshift;
29  std::vector<double> sigma;
30  int Niter;
31  double Stop_cond;
32 
33  int err = 0;
34  err += params.fetch_int("number_of_shifts", Nshift);
35  err += params.fetch_double_vector("shifted_mass_difference", sigma);
36  err += params.fetch_int("maximum_number_of_iteration", Niter);
37  err += params.fetch_double("convergence_criterion_squared", Stop_cond);
38 
39  if (err) {
40  vout.crucial(m_vl, "Error at %s: input parameter not found.\n", class_name.c_str());
41  exit(EXIT_FAILURE);
42  }
43 
44 
45  set_parameters(Nshift, sigma, Niter, Stop_cond);
46 }
47 
48 
49 //====================================================================
50 void Fprop_Wilson_Shift::set_parameters(const int Nshift, const std::vector<double> sigma,
51  const int Niter, const double Stop_cond)
52 {
53  //- print input parameters
54  vout.general(m_vl, "%s:\n", class_name.c_str());
55  vout.general(m_vl, " Nshift = %d\n", Nshift);
56  for (int i = 0; i < Nshift; ++i) {
57  vout.general(m_vl, " sigma[%d] = %16.8e\n", i, sigma[i]);
58  }
59  vout.general(m_vl, " Niter = %d\n", Niter);
60  vout.general(m_vl, " Stop_cond = %8.2e\n", Stop_cond);
61 
62  //- range check
63  // NB. Nshift,sigma == 0 is allowed.
64  int err = 0;
65  err += ParameterCheck::non_zero(Niter);
66  err += ParameterCheck::square_non_zero(Stop_cond);
67 
68  if (err) {
69  vout.crucial(m_vl, "Error at %s: parameter range check failed.\n", class_name.c_str());
70  exit(EXIT_FAILURE);
71  }
72 
73  //- store values
74  m_Nshift = Nshift;
75  m_sigma.resize(Nshift);
76  m_sigma = sigma;
77 
78  m_Niter = Niter;
79  m_Stop_cond = Stop_cond;
80 }
81 
82 
83 //====================================================================
84 double Fprop_Wilson_Shift::invert_D(std::vector<Field_F> *xq2, const Field_F& b)
85 {
86  int Nin = b.nin();
87  int Nvol = b.nvol();
88  int Nex = b.nex();
89 
90  int Nshift = m_Nshift;
91 
92  std::vector<double> sigma = m_sigma;
93 
94  std::vector<Field> xq(Nshift);
95 
96  for (int i = 0; i < Nshift; ++i) {
97  xq[i].reset(Nin, Nvol, Nex);
98  }
99 
100  int Nconv;
101  double diff;
102 
103 
104  // vout.general(m_vl, "size of xq = %d\n", xq->size());
105  // vout.general(m_vl, "size of xq[0] = %d\n", xq[0].nvol());
106 
107  vout.general(m_vl, "%s:\n", class_name.c_str());
108  vout.general(m_vl, " Number of shift values = %d\n", sigma.size());
109  assert(xq2->size() == sigma.size());
110 
111  m_fopr->set_mode("DdagD");
112 
113  // std::vector<Field_F>* xq2 = new std::vector<Field_F>;
114 
115  /*
116  std::vector<Field_F>* xq2;
117  xq2->resize(xq->size());
118  for(int i=0; i<xq->size(); ++i){
119  xq2[i] = (Field*) xq[i];
120  }
121  */
122 
124  solver->solve(xq, sigma, (Field)b, Nconv, diff);
125 
126  vout.general(m_vl, " residues of solutions(2):\n");
127 
128  // Field version: works
129  Field s((Field)b);
130  Field x((Field)b);
131  Field t((Field)b);
132  double diff1 = 0.0; // superficial initialization
133  for (int i = 0; i < Nshift; ++i) {
134  x = xq[i];
135  double sg = sigma[i];
136  m_fopr->mult(s, x);
137  axpy(s, sg, x);
138  axpy(s, -1.0, t);
139  diff1 = dot(s, s);
140 
141  vout.general(m_vl, "i_shift,diff = %6d %22.15e\n", i, diff1);
142  }
143 
144  for (int i = 0; i < Nshift; ++i) {
145  (*xq2)[i] = (Field_F)xq[i];
146  }
147 
148  double result = diff1;
149 
150  delete solver;
151 
152  return result;
153 }
BridgeIO vout
Definition: bridgeIO.cpp:495
int fetch_double_vector(const string &key, vector< double > &value) const
Definition: parameters.cpp:275
double dot(const Field &y, const Field &x)
Definition: field.cpp:46
void general(const char *format,...)
Definition: bridgeIO.cpp:195
Container of Field-type object.
Definition: field.h:39
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:211
int nvol() const
Definition: field.h:116
Multishift Conjugate Gradient solver.
static const std::string class_name
Class for parameters.
Definition: parameters.h:46
Wilson-type fermion field.
Definition: field_F.h:37
int square_non_zero(const double v)
Definition: checker.cpp:41
int nin() const
Definition: field.h:115
std::vector< double > m_sigma
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
int fetch_int(const string &key, int &value) const
Definition: parameters.cpp:230
int nex() const
Definition: field.h:117
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:168
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
int non_zero(const double v)
Definition: checker.cpp:31
Bridge::VerboseLevel m_vl
void mult(Field &v, const Field &f)
multiplies fermion operator to a given field (2nd argument)
void set_parameters(const Parameters &params)
double invert_D(std::vector< Field_F > *, const Field_F &)
string get_string(const string &key) const
Definition: parameters.cpp:116
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:131
void solve(std::vector< Field > &solution, const std::vector< double > &shift, const Field &source, int &Nconv, double &diff)