Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
32 const std::string Solver_CGNE::class_name = "Solver_CGNE";
33 
34 //====================================================================
36 {
37  return this->Solver_CG::set_parameters(params);
38 }
39 
40 
41 //====================================================================
42 void Solver_CGNE::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.",
56  class_name.c_str(), mode_prev.c_str());
57  exit(EXIT_FAILURE);
58  }
59 
60 #pragma omp barrier
61 #pragma omp master
62  {
63  if ((m_y.nin() != b.nin()) || (m_y.nvol() != b.nvol()) ||
64  (m_y.nex() != b.nex())) {
65  m_y.reset(b.nin(), b.nvol(), b.nex());
66  }
67 
68  if (mode_prev == "D") {
69  fopr->set_mode("DDdag");
70  } else if (mode_prev == "Ddag") {
71  fopr->set_mode("DdagD");
72  }
73  }
74 #pragma omp barrier
75 
76  this->Solver_CG::solve(m_y, b, Nconv, diff);
77 
78 #pragma omp barrier
79 #pragma omp master
80  {
81  fopr->set_mode(mode_prev);
82  }
83 #pragma omp barrier
84 
85  fopr->mult_dag(xq, m_y); // xq = fopr->mult_dag(y);
86 
87 #pragma omp barrier
88 }
89 
90 
91 //====================================================================
93 {
94  int NPE = CommonParameters::NPE();
96 
97  double flop_fopr = this->Solver_CG::get_fopr()->flop_count();
98 
99  if (flop_fopr < eps) {
100  vout.crucial(m_vl, "Warning at %s: no fopr->flop_count() is available, setting flop = 0.0.\n", class_name.c_str());
101  return 0.0;
102  }
103 
104  double flop_solver = this->Solver_CG::flop_count();
105 
106  double flop = flop_solver + flop_fopr;
107 
108  return flop;
109 }
110 
111 
112 //====================================================================
113 //============================================================END=====
BridgeIO vout
Definition: bridgeIO.cpp:495
Fopr * get_fopr()
Definition: solver_CG.h:79
static const std::string class_name
Definition: solver_CGNE.h:40
void detailed(const char *format,...)
Definition: bridgeIO.cpp:212
static double epsilon_criterion()
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
Class for parameters.
Definition: parameters.h:46
int nin() const
Definition: field.h:115
void solve(Field &solution, const Field &source, int &Nconv, double &diff)
Definition: solver_CGNE.cpp:42
void set_parameters(const Parameters &params)
Definition: solver_CGNE.cpp:35
void set_parameters(const Parameters &params)
Definition: solver_CG.cpp:33
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
double flop_count()
Definition: solver_CGNE.cpp:92
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
Base class for linear solver class family.
Definition: solver.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:96
CGNE solver.
Definition: solver_CGNE.h:34
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()