Bridge++  Ver. 1.2.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
solver_CGNR.cpp
Go to the documentation of this file.
1 
14 #include "solver_CGNR.h"
15 
16 using Bridge::vout;
17 
18 
19 #ifdef USE_FACTORY
20 namespace {
21  Solver *create_object(Fopr *fopr)
22  {
23  return new Solver_CGNR(fopr);
24  }
25 
26 
27  bool init = Solver::Factory::Register("CGNR", create_object);
28 }
29 #endif
30 
31 //- parameter entries
32 namespace {
33  void append_entry(Parameters& param)
34  {
35  param.Register_int("maximum_number_of_iteration", 0);
36  param.Register_double("convergence_criterion_squared", 0.0);
37 
38  param.Register_string("verbose_level", "NULL");
39  }
40 
41 
42 #ifdef USE_PARAMETERS_FACTORY
43  bool init_param = ParametersFactory::Register("Solver.CGNR", append_entry);
44 #endif
45 }
46 //- end
47 
48 //- parameters class
50 //- end
51 
52 const std::string Solver_CGNR::class_name = "Solver_CGNR";
53 
54 //====================================================================
56 {
57  return this->Solver_CG::set_parameters(params);
58 }
59 
60 
61 //====================================================================
62 void Solver_CGNR::solve(Field& xq, const Field& b, int& Nconv, double& diff)
63 {
64  Fopr *fopr = this->Solver_CG::get_fopr();
65  string mode_prev = fopr->get_mode();
66 
67 #pragma omp master
68  {
69  vout.detailed(m_vl, "%s: solver starts\n", class_name.c_str());
70  }
71 #pragma omp barrier
72 
73  if (mode_prev == "DdagD") {
74  this->Solver_CG::solve(xq, b, Nconv, diff); // fallback to CG solver
75  return;
76  }
77 
78  if (!((mode_prev == "D") || (mode_prev == "Ddag"))) {
79  vout.crucial(m_vl, "%s: unsupported mode for fopr: %s.", class_name.c_str(), mode_prev.c_str());
80  abort();
81  }
82 
83  // Field b2(b);
84 #pragma omp master
85  {
86  if ((m_b2.nin() != b.nin()) || (m_b2.nvol() != b.nvol()) ||
87  (m_b2.nex() != b.nex())) {
88  m_b2.reset(b.nin(), b.nvol(), b.nex());
89  }
90  }
91 #pragma omp barrier
92 
93  fopr->mult_dag(m_b2, b); // b2 = fopr->mult_dag(b);
94 
95 #pragma omp master
96  {
97  if (mode_prev == "D") {
98  fopr->set_mode("DdagD");
99  } else if (mode_prev == "Ddag") {
100  fopr->set_mode("DDdag");
101  }
102  }
103 #pragma omp barrier
104 
105  this->Solver_CG::solve(xq, m_b2, Nconv, diff);
106 
107 #pragma omp master
108  {
109  fopr->set_mode(mode_prev);
110  }
111 #pragma omp barrier
112 }
113 
114 
115 //====================================================================
116 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:207
Fopr * get_fopr()
Definition: solver_CG.h:66
void detailed(const char *format,...)
Definition: bridgeIO.cpp:50
void Register_string(const string &, const string &)
Definition: parameters.cpp:352
virtual const Field mult_dag(const Field &)
hermitian conjugate of mult(const Field&).
Definition: fopr.h:60
void Register_int(const string &, const int)
Definition: parameters.cpp:331
Field m_b2
Definition: solver_CGNR.h:40
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Container of Field-type object.
Definition: field.h:37
int nvol() const
Definition: field.h:101
void set_parameters(const Parameters &params)
Definition: solver_CGNR.cpp:55
Class for parameters.
Definition: parameters.h:40
int nin() const
Definition: field.h:100
void set_parameters(const Parameters &params)
Definition: solver_CG.cpp:53
static const std::string class_name
Definition: solver_CGNR.h:43
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:82
virtual std::string get_mode() const
Definition: fopr.h:80
int nex() const
Definition: field.h:102
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CGNR.cpp:62
void crucial(const char *format,...)
Definition: bridgeIO.cpp:26
Base class for linear solver class family.
Definition: solver.h:37
static bool Register(const std::string &realm, const creator_callback &cb)
CGNR solver.
Definition: solver_CGNR.h:37
virtual void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr.h:75
void Register_double(const string &, const double)
Definition: parameters.cpp:324
Base class of fermion operator family.
Definition: fopr.h:39
Bridge::VerboseLevel m_vl
Definition: solver.h:56