Bridge++  Version 1.4.4
 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 
32 const std::string Solver_CGNR::class_name = "Solver_CGNR";
33 
34 //====================================================================
36 {
37  return this->Solver_CG::set_parameters(params);
38 }
39 
40 
41 //====================================================================
42 void Solver_CGNR::solve(Field& xq, const Field& b, int& Nconv, double& diff)
43 {
44  Fopr *fopr = this->Solver_CG::get_fopr();
45  string mode_prev = fopr->get_mode();
46 
47  vout.detailed(m_vl, "%s: solver starts\n", class_name.c_str());
48 
49  if (mode_prev == "DdagD") {
50  this->Solver_CG::solve(xq, b, Nconv, diff); // fallback to CG solver
51  return;
52  }
53 
54  if (!((mode_prev == "D") || (mode_prev == "Ddag"))) {
55  vout.crucial(m_vl, "Error at %s: unsupported mode for fopr %s.", class_name.c_str(), mode_prev.c_str());
56  exit(EXIT_FAILURE);
57  }
58 
59 #pragma omp barrier
60 #pragma omp master
61  {
62  if ((m_b2.nin() != b.nin()) || (m_b2.nvol() != b.nvol()) ||
63  (m_b2.nex() != b.nex())) {
64  m_b2.reset(b.nin(), b.nvol(), b.nex());
65  }
66  }
67 #pragma omp barrier
68 
69  fopr->mult_dag(m_b2, b); // b2 = fopr->mult_dag(b);
70 
71 #pragma omp barrier
72 #pragma omp master
73  {
74  if (mode_prev == "D") {
75  fopr->set_mode("DdagD");
76  } else if (mode_prev == "Ddag") {
77  fopr->set_mode("DDdag");
78  }
79  }
80 #pragma omp barrier
81 
82  this->Solver_CG::solve(xq, m_b2, Nconv, diff);
83 
84 #pragma omp barrier
85 #pragma omp master
86  {
87  fopr->set_mode(mode_prev);
88  }
89 #pragma omp barrier
90 }
91 
92 
93 //====================================================================
95 {
96  int NPE = CommonParameters::NPE();
98 
99  double flop_fopr = this->Solver_CG::get_fopr()->flop_count();
100 
101  if (flop_fopr < eps) {
102  vout.crucial(m_vl, "Warning at %s: no fopr->flop_count() is available, setting flop = 0.0.\n", class_name.c_str());
103  return 0.0;
104  }
105 
106  double flop_solver = this->Solver_CG::flop_count();
107 
108  double flop = flop_solver + flop_fopr;
109 
110  return flop;
111 }
112 
113 
114 //====================================================================
115 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:495
Fopr * get_fopr()
Definition: solver_CG.h:79
void detailed(const char *format,...)
Definition: bridgeIO.cpp:212
static double epsilon_criterion()
Field m_b2
Definition: solver_CGNR.h:37
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CG.cpp:87
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:35
Class for parameters.
Definition: parameters.h:46
int nin() const
Definition: field.h:115
void set_parameters(const Parameters &params)
Definition: solver_CG.cpp:33
static const std::string class_name
Definition: solver_CGNR.h:40
virtual double flop_count()
returns the flops per site.
Definition: fopr.h:121
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:105
int nex() const
Definition: field.h:117
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CGNR.cpp:42
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
Base class for linear solver class family.
Definition: solver.h:37
CGNR solver.
Definition: solver_CGNR.h:34
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:96
double flop_count()
Definition: solver_CGNR.cpp:94
virtual void mult_dag(Field &, const Field &)
hermitian conjugate of mult(Field&, const Field&).
Definition: fopr.h:75
Base class of fermion operator family.
Definition: fopr.h:47
double flop_count()
Definition: solver_CG.cpp:219
Bridge::VerboseLevel m_vl
Definition: solver.h:63
static int NPE()