Bridge++  Ver. 1.3.x
solver_CGNE.cpp
Go to the documentation of this file.
1 
14 #include "solver_CGNE.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_CGNE(fopr);
24  }
25 
26 
27  bool init = Solver::Factory::Register("CGNE", 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.CGNE", append_entry);
44 #endif
45 }
46 //- end
47 
48 //- parameters class
50 //- end
51 
52 const std::string Solver_CGNE::class_name = "Solver_CGNE";
53 
54 //====================================================================
56 {
57  return this->Solver_CG::set_parameters(params);
58 }
59 
60 
61 //====================================================================
62 void Solver_CGNE::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.",
76  class_name.c_str(), mode_prev.c_str());
77  exit(EXIT_FAILURE);
78  }
79 
80 #pragma omp barrier
81 #pragma omp master
82  {
83  if ((m_y.nin() != b.nin()) || (m_y.nvol() != b.nvol()) ||
84  (m_y.nex() != b.nex())) {
85  m_y.reset(b.nin(), b.nvol(), b.nex());
86  }
87 
88  if (mode_prev == "D") {
89  fopr->set_mode("DDdag");
90  } else if (mode_prev == "Ddag") {
91  fopr->set_mode("DdagD");
92  }
93  }
94 #pragma omp barrier
95 
96  this->Solver_CG::solve(m_y, b, Nconv, diff);
97 
98 #pragma omp barrier
99 #pragma omp master
100  {
101  fopr->set_mode(mode_prev);
102  }
103 #pragma omp barrier
104 
105  fopr->mult_dag(xq, m_y); // xq = fopr->mult_dag(y);
106 
107 #pragma omp barrier
108 }
109 
110 
111 //====================================================================
112 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:278
Fopr * get_fopr()
Definition: solver_CG.h:71
static const std::string class_name
Definition: solver_CGNE.h:46
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
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
Class for parameters.
Definition: parameters.h:38
int nin() const
Definition: field.h:115
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CGNE.cpp:62
void set_parameters(const Parameters &params)
Definition: solver_CGNE.cpp:55
void set_parameters(const Parameters &params)
Definition: solver_CG.cpp:53
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 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)
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
CGNE solver.
Definition: solver_CGNE.h:40
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