37 const string str_vlevel = params.
get_string(
"verbose_level");
46 err += params.
fetch_int(
"maximum_number_of_iteration", Niter);
47 err += params.
fetch_double(
"convergence_criterion_squared", Stop_cond);
85 const std::vector<double>& sigma,
87 int& Nconv,
double& diff)
89 int Nshift = sigma.size();
94 for (
int i = 0; i < Nshift; ++i) {
113 bool is_converged =
false;
115 for (
int iter = 0; iter <
m_Niter; iter++) {
133 std::vector<double> diffs(Nshift);
134 for (
int i = 0; i < Nshift; ++i) {
138 for (
int i = 0; i < Nshift; ++i) {
156 for (
int i = 0; i < Nshift; ++i) {
157 if (diffs[i] > diff2) diff2 = diffs[i];
166 for (
int i = 0; i < Nshift; ++i) {
177 int Nshift =
p.size();
181 for (
int i = 0; i < Nshift; ++i) {
206 double pa_p =
dot(
s,
p[0]);
207 double beta = -rr_p / pa_p;
213 double alpha = rr / rr_p;
226 for (
int ish = 1; ish <
Nshift2; ++ish) {
227 double zeta = (alpha_h -
csh2[ish] * beta) /
zeta1[ish]
228 + (1.0 - alpha_h) /
zeta2[ish];
230 double zr = zeta /
zeta1[ish];
231 double beta_s = beta * zr;
232 double alpha_s = alpha * zr * zr;
234 axpy(
x[ish], -beta_s,
p[ish]);
235 scal(
p[ish], alpha_s);
238 double ppr =
p[ish].norm2();
253 for (
int ish = Nshift2 - 1; ish >= 0; --ish) {
285 zeta1.resize(Nshift);
286 zeta2.resize(Nshift);
290 for (
int i = 0; i < Nshift; ++i) {
291 p[i].reset(Nin, Nvol, Nex);
292 x[i].reset(Nin, Nvol, Nex);
295 csh2[i] = sigma[i] - sigma[0];
void scal(Field &x, const double a)
scal(x, a): x = a * x
void detailed(const char *format,...)
void Register_string(const string &, const string &)
static const std::string class_name
void reset_field(const Field &b, const std::vector< double > &sigma, const int Nshift)
double dot(const Field &y, const Field &x)
void solve_init(double &)
void general(const char *format,...)
void Register_int(const string &, const int)
Container of Field-type object.
void set_parameters(const Parameters ¶ms)
void copy(Field &y, const Field &x)
copy(y, x): y = x
std::vector< double > csh2
std::vector< double > zeta2
int square_non_zero(const double v)
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Parameters_Shiftsolver_CG()
void aypx(const double a, Field &y, const Field &x)
aypx(y, a, x): y := a * y + x
void paranoiac(const char *format,...)
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
void crucial(const char *format,...)
std::vector< double > zeta1
virtual void mult(Field &, const Field &)=0
multiplies fermion operator to a given field (2nd argument)
int non_negative(const int v)
void Register_double(const string &, const double)
int fetch_double(const string &key, double &val) const
void solve_step(double &)
string get_string(const string &key) const
Bridge::VerboseLevel m_vl
int fetch_int(const string &key, int &val) const
static VerboseLevel set_verbose_level(const std::string &str)
void solve(std::vector< Field > &solution, const std::vector< double > &shift, const Field &source, int &Nconv, double &diff)