Bridge++  Ver. 1.3.x
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  vout.detailed(m_vl, "%s: solver starts\n", class_name.c_str());
68 
69  if (mode_prev == "DdagD") {
70  this->Solver_CG::solve(xq, b, Nconv, diff); // fallback to CG solver
71  return;
72  }
73 
74  if (!((mode_prev == "D") || (mode_prev == "Ddag"))) {
75  vout.crucial(m_vl, "%s: unsupported mode for fopr: %s.", class_name.c_str(), mode_prev.c_str());
76  exit(EXIT_FAILURE);
77  }
78 
79 #pragma omp barrier
80 #pragma omp master
81  {
82  if ((m_b2.nin() != b.nin()) || (m_b2.nvol() != b.nvol()) ||
83  (m_b2.nex() != b.nex())) {
84  m_b2.reset(b.nin(), b.nvol(), b.nex());
85  }
86  }
87 #pragma omp barrier
88 
89  fopr->mult_dag(m_b2, b); // b2 = fopr->mult_dag(b);
90 
91 #pragma omp barrier
92 #pragma omp master
93  {
94  if (mode_prev == "D") {
95  fopr->set_mode("DdagD");
96  } else if (mode_prev == "Ddag") {
97  fopr->set_mode("DDdag");
98  }
99  }
100 #pragma omp barrier
101 
102  this->Solver_CG::solve(xq, m_b2, Nconv, diff);
103 
104 #pragma omp barrier
105 #pragma omp master
106  {
107  fopr->set_mode(mode_prev);
108  }
109 #pragma omp barrier
110 }
111 
112 
113 //====================================================================
114 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:278
Fopr * get_fopr()
Definition: solver_CG.h:71
void detailed(const char *format,...)
Definition: bridgeIO.cpp:82
void Register_string(const string &, const string &)
Definition: parameters.cpp:351
void Register_int(const string &, const int)
Definition: parameters.cpp:330
Field m_b2
Definition: solver_CGNR.h:43
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CG.cpp:104
Container of Field-type object.
Definition: field.h:39
int nvol() const
Definition: field.h:116
void set_parameters(const Parameters &params)
Definition: solver_CGNR.cpp:55
Class for parameters.
Definition: parameters.h:38
int nin() const
Definition: field.h:115
void set_parameters(const Parameters &params)
Definition: solver_CG.cpp:53
static const std::string class_name
Definition: solver_CGNR.h:46
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=COMPLEX)
Definition: field.h:84
virtual std::string get_mode() const
only for Fopr_Overlap
Definition: fopr.h:94
int nex() const
Definition: field.h:117
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CGNR.cpp:62
void crucial(const char *format,...)
Definition: bridgeIO.cpp:48
Base class for linear solver class family.
Definition: solver.h:38
static bool Register(const std::string &realm, const creator_callback &cb)
CGNR solver.
Definition: solver_CGNR.h:40
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:85
void Register_double(const string &, const double)
Definition: parameters.cpp:323
virtual void mult_dag(Field &, const Field &)
hermitian conjugate of mult(Field&, const Field&).
Definition: fopr.h:77
Base class of fermion operator family.
Definition: fopr.h:49
Bridge::VerboseLevel m_vl
Definition: solver.h:62