Bridge++  Ver. 1.1.x
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
solver_CGNR.cpp
Go to the documentation of this file.
1 
15 #include "solver_CGNR.h"
16 using Bridge::vout;
17 
18 #ifdef USE_PARAMETERS_FACTORY
19 #include "parameters_factory.h"
20 #endif
21 
22 #ifdef USE_FACTORY
23 namespace {
24  Solver *create_object(Fopr *fopr)
25  {
26  return new Solver_CGNR(fopr);
27  }
28 
29 
30  bool init = Solver::Factory::Register("CGNR", create_object);
31 }
32 #endif
33 
34 //- parameter entries
35 namespace {
36  void append_entry(Parameters& param)
37  {
38  param.Register_int("maximum_number_of_iteration", 0);
39  param.Register_double("convergence_criterion_squared", 0.0);
40 
41  param.Register_string("verbose_level", "NULL");
42  }
43 
44 
45 #ifdef USE_PARAMETERS_FACTORY
46  bool init_param = ParametersFactory::Register("Solver.CGNR", append_entry);
47 #endif
48 }
49 //- end
50 
51 //- parameters class
53 //- end
54 
55 //====================================================================
57 {
58  return this->Solver_CG::set_parameters(params);
59 }
60 
61 
62 //====================================================================
63 void Solver_CGNR::solve(Field& xq, const Field& b, int& Nconv, double& diff)
64 {
65  vout.detailed(m_vl, " CGNR solver starts\n");
66 
67  Fopr *fopr = this->Solver_CG::get_fopr();
68 
69  string prev_mode = fopr->get_mode();
70 
71  if (prev_mode == "DdagD") {
72  this->Solver_CG::solve(xq, b, Nconv, diff); // fallback to CG solver
73  return;
74  }
75 
76  if (!((prev_mode == "D") || (prev_mode == "Ddag"))) {
77  vout.crucial(m_vl, "Solver_CGNR: unsupported mode for fopr: %s.", prev_mode.c_str());
78  abort();
79  }
80 
81  Field b2(b);
82  fopr->mult_dag(b2, b);
83 
84  if (prev_mode == "D") {
85  fopr->set_mode("DdagD");
86  } else if (prev_mode == "Ddag") {
87  fopr->set_mode("DDdag");
88  }
89 
90  this->Solver_CG::solve(xq, b2, Nconv, diff);
91 
92  fopr->set_mode(prev_mode);
93 }
94 
95 
96 //====================================================================
97 //============================================================END=====