Bridge++  Ver. 2.0.2
asolver_MG_double-tmpl.h
Go to the documentation of this file.
1 
17 
20 
21 //====================================================================
22 template<typename AFIELD>
23 const std::string ASolver_MG_double<AFIELD>::class_name = "ASolver_MG_double";
24 
25 /* for book keeping
26  // inner prod: num_vector*(num_vector-1)/2 times
27  // complex axpy: num_vector*(num_vector-1)/2 times
28  // norm: num_vector times
29  // real scal: num_vector times (GS)
30  // convert rep: 2*num_vectors times
31  // real scal: num_vector_times (normalization for covert rep.)
32  // if one counts 0+a as one 1 flop, block inner prod has the same flop
33  // counting as the full inner prod
34  const int flop_gs_site
35  = 8*Nc*Nd*num_vectors*(num_vectors-1)/2 // inner prod
36  + 8*Nc*Nd*num_vectors*(num_vectors-1)/2 // axpy
37  + 4*Nc*Nd*num_vectors // norm
38  + 2*Nc*Nd*num_vectors // scal (GS)
39  + 2*Nc*Nd*2*num_vectors // convert_rep
40  + 2*Nc*Nd*num_vectors; // scal (normalization)
41  size_t Lvol=CommonParameters::Lvol();
42  const double flop_gs=static_cast<double>(flop_gs_site)*static_cast<double>(Lvol);
43 */
44 
45 //====================================================================
46 template<typename AFIELD>
48 {
50  constexpr int size = sizeof(typename AFIELD::real_t);
51  if (size != sizeof(double)) {
52  vout.crucial("ASolver_MG_double must be instanced with double prec. field\n");
53  abort();
54  }
55 }
56 
57 
58 //====================================================================
59 template<typename AFIELD>
61 {
62 }
63 
64 
65 //====================================================================
66 template<typename AFIELD>
68 {
69  // example of the parameter
70  // each of outer solver (in level 0) and coarse solver (in level 1)
71  // may futher has additional parameters like Omega_tolerance.
72  //
73  // # general parameters, passed to the outer solver
74  // maximum_number_of_iteration : 100
75  // maximum_number_of_restart: 10
76  // convergence_criterion_squared: 1e-28
77  // verbose_level : Detailed
78  // # spedfice to MG solver
79  // MultiGrid_Level1:
80  // sap_block : [4,2,2,2]
81  // number_of_vectors: 4
82  // setup_number_of_setp : 4
83  // maximum_number_of_iteration : 1000
84  // maximum_number_of_restart : 1
85  // convergence_criterion_squared: 2.0e-5
86  // smoother_number_of_iteration : 3
87  // smoother_convergence_criterion_squared: 1.0e-3
88  // verbose_level : General
89 
90  // Parameters params_outer_solver=params.lookup("Level0");
91  Parameters params_coarse = params.lookup("MultiGrid_Level1");
92 
93  // level0: outer solver
94  set_parameters_level0(params);
95 
96  // level1: coarse grid solver and smoother
97  set_parameters_level1(params_coarse);
98 }
99 
100 
101 //====================================================================
102 template<typename AFIELD>
104 {
105  m_params_asolver_outer = params;
106 }
107 
108 
109 //====================================================================
110 template<typename AFIELD>
112 {
113  // for setup
114  m_sap_block_size = params.get_int_vector("sap_block");
115  m_nvec = params.get_int("setup_number_of_vectors");
116  m_nsetup = params.get_int("setup_number_of_step");
117 
118  // for smoother
119  m_smoother_niter = params.get_int("smoother_number_of_iteration");
120  m_smoother_stop_cond = params.get_double("smoother_convergence_criterion_squared");
121 
122  // for coarse solver
123  // I assume that the above parameters harmless for the coarse grid solver
124  m_params_asolver_coarse = params;
125 
126  set_lattice(m_sap_block_size);
127 }
128 
129 
130 //====================================================================
131 template<typename AFIELD>
133  const int Niter,
134  const real_t Stop_cond,
135  const std::string& outer_vlevel,
136  const std::vector<int>& sap_block_size,
137  const int nvec,
138  const int nsetup,
139  const int coarse_niter,
140  const real_t coarse_stop_cond,
141  const std::string& coarse_vlevel,
142  const int smoother_niter,
143  const real_t smoother_stop_cond)
144 {
146 
147  // for outer solver
148  Parameters param_level0;
149  param_level0.set_int("maximum_number_of_iteration", Niter);
150  param_level0.set_int("maximum_number_of_restart", 1);
151  param_level0.set_double("convergence_criterion_squared", Stop_cond);
152  param_level0.set_string("verbose_level", outer_vlevel);
153  set_parameters_level0(param_level0);
154 
155  // coarse grid
156  Parameters param_level1;
157 
158  // for building coarse grid
159  param_level1.set_int_vector("sap_block", sap_block_size);
160  param_level1.set_int("number_of_vectors", nvec);
161  // coarse grid solver
162  param_level1.set_int("maximum_number_of_iteration", coarse_niter);
163  param_level1.set_int("maximum_number_of_restart", 1);
164  param_level1.set_double("convergence_criterion_squared",
165  coarse_stop_cond);
166  param_level1.set_string("verbose_level", coarse_vlevel);
167  // smoother
168  param_level1.set_int("smoother_number_of_iteration", smoother_niter);
169  param_level1.set_int("smoother_convergence_criterion_squared",
170  smoother_stop_cond);
171 
172  set_parameters_level1(param_level1);
173 }
174 
175 
176 //====================================================================
177 template<typename AFIELD>
179 {
180  m_afopr_fineD = dynamic_cast<FoprD_t *>(foprD);
181  if (m_afopr_fineD == nullptr) {
182  vout.crucial("%s: bad afopr: only AFopr_Clover is vaild for FoprD]\n",
183  class_name.c_str());
184  exit(EXIT_FAILURE);
185  }
186 }
187 
188 
189 //====================================================================
190 template<typename AFIELD>
192 {
193  m_afopr_fineF = dynamic_cast<FoprF_t *>(foprF);
194  if (m_afopr_fineF == nullptr) {
195  vout.crucial("%s: bad afopr: only AFopr_Clover is vaild for FoprF]\n",
196  class_name.c_str());
197  exit(EXIT_FAILURE);
198  }
199 }
200 
201 
202 //====================================================================
203 template<typename AFIELD>
205 {
207  m_mode = mode;
208 
209  // check fopr is registered
210  if (!m_afopr_fineF) {
211  vout.crucial(m_vl, "%s: init_solver, single prec. afopr is not yet set.\n",
212  class_name.c_str());
213  exit(EXIT_FAILURE);
214  }
215  if (!m_afopr_fineD) {
216  vout.crucial(m_vl, "%s: init_solver, double prec. afopr is not yet set.\n",
217  class_name.c_str());
218  exit(EXIT_FAILURE);
219  }
220 
221  // fine grid operator
222  m_afopr_fineD->set_mode(m_mode);
223  m_afopr_fineF->set_mode(m_mode);
224 
225  // coarse grid solvers/smoothers
226  init_coarse_grid();
227 
228  // outer solver
229  m_outer_solver.reset(new OuterSolver_t(m_afopr_fineD, m_prec_mg.get()));
230  m_outer_solver->set_parameters(m_params_asolver_outer);
231 }
232 
233 
234 //====================================================================
235 #ifndef SKIP_INIT_COARSE
236 template<typename AFIELD>
238 {
239  vout.detailed(m_vl, "%s: init_coarse_grid() [template version] is called\n",
240  class_name.c_str());
241 
242  // multigrid converter
243  std::vector<int> fine_lattice = { CommonParameters::Nx(),
247  const int Nc = CommonParameters::Nc();
248  const int Nd = CommonParameters::Nd();
249 
250  MultiGrid_t *multigrid = new MultiGrid_t();
251  multigrid->init(m_coarse_lattice, fine_lattice, 2 * Nc * Nd, m_nvec);
252  multigrid->set_afopr_fine(m_afopr_fineF);
253  m_multigrid.reset(multigrid);
254 
255  // afopr: downcasted objects
256  // downcast safty is guaranteed in the setter
257  FoprF_t *afopr_fineF = static_cast<FoprF_t *>(m_afopr_fineF);
258  FoprD_t *afopr_fineD = static_cast<FoprD_t *>(m_afopr_fineD);
259 
260  // initialize coase grid operator
261  FoprCoarse_t *afopr_coarse = new FoprCoarse_t();
262  afopr_coarse->set_parameters(m_nvec, m_coarse_lattice);
263  afopr_coarse->set_mode(m_mode);
264  m_afopr_coarse.reset(afopr_coarse);
265 
266  vout.general(m_vl, "afopr_coarse version is created\n");
267 
268  // initialize coarse grid solver
269  CoarseSolver_t *asolver_coarse = new CoarseSolver_t(m_afopr_coarse.get());
270  asolver_coarse->set_parameters(m_params_asolver_coarse);
272  m_asolver_coarse.reset(asolver_coarse);
273 
274  // initialize smoother
275 #ifdef USE_SAP_FOR_SMOOTHER
276  Smoother_t *asolver_smoother =
277  new Smoother_t(m_afopr_fineF, m_multigrid->get_block_index());
278 #else
279  Smoother_t *asolver_smoother = new Smoother_t(m_afopr_fineF);
280 #endif
281  asolver_smoother->set_parameters(m_smoother_niter, m_smoother_stop_cond);
282  m_asolver_smoother.reset(asolver_smoother);
283 
284  // combine everything and initialize multgrid preconditionor
285  m_prec_mg.reset(new APrecond_MG<AFIELD, AFIELD2>());
286  m_prec_mg->set_coarse_solver(m_asolver_coarse.get());
287  m_prec_mg->set_smoother(m_asolver_smoother.get());
288  m_prec_mg->set_multigrid(m_multigrid.get());
289  m_prec_mg->set_fopr(m_afopr_fineD, m_afopr_fineF);
290 }
291 
292 
293 #endif
294 
295 //====================================================================
296 template<typename AFIELD>
297 void ASolver_MG_double<AFIELD>::set_lattice(const vector<int>& sap_block_size)
298 {
300 
301  // set coarse lattice
302  assert(CommonParameters::Ndim() == 4);
303  m_coarse_lattice.resize(4);
304  std::vector<int> fine_lattice = { CommonParameters::Nx(),
308 
309  // sanity checks
310  if (sap_block_size.size() != 4) {
311  vout.crucial(m_vl, "%s: bad sap_block_size: Must be 4-dim, but the given dimension is %.\n",
312  class_name.c_str(), sap_block_size.size());
313  abort();
314  }
315 
316  for (int i = 0; i < 4; ++i) {
317  m_coarse_lattice[i] = fine_lattice[i] / sap_block_size[i];
318  if (m_coarse_lattice[i] * sap_block_size[i] != fine_lattice[i]) {
319  vout.crucial(m_vl, "bad sap_block_size: i=%d, sap_block_size=%d, fine_lattice=%d, coarse_lattice=%d\n",
320  i, sap_block_size[i], fine_lattice[i], m_coarse_lattice[i]);
321  exit(EXIT_FAILURE);
322  }
323  }
324 
325  vout.general(m_vl, " fine_lattice = %s\n",
326  Parameters::to_string(fine_lattice).c_str());
327  vout.general(m_vl, " coarse_lattice = %s\n",
328  Parameters::to_string(m_coarse_lattice).c_str());
329  vout.general(m_vl, " sap_block_size = %s\n",
330  Parameters::to_string(sap_block_size).c_str());
331 }
332 
333 
334 //====================================================================
335 template<typename AFIELD>
337 {
339 
340  Timer timer_setup("setup total");
341  timer_setup.start();
342 
343  const int num_vectors = m_nvec;
344  const int Nin = m_afopr_fineD->field_nin();
345  const int Nvol = m_afopr_fineD->field_nvol();
346  const int Nex = m_afopr_fineD->field_nex();
347 
348  // std::vector<double> flop_setup(m_nsetup+1);
349 
350  std::vector<AFIELD2> testvec_work(num_vectors);
351  for (int i = 0; i < num_vectors; ++i) {
352  testvec_work[i].reset(Nin, Nvol, Nex);
353  }
354 
355  m_timer_gramschmidt.reset(new Timer("Gramschmidt in the setup"));
356  m_timer_generate_coarse_op.reset(new Timer("generate coarse op"));
357 
358  run_setup_initial(testvec_work);
359  run_setup_iterative(m_nsetup, testvec_work);
360 
361  timer_setup.stop();
362 
363  m_timer_gramschmidt->report();
364  m_timer_generate_coarse_op->report();
365  m_prec_mg->report_timer();
366  m_prec_mg->reset_flop_count();
367  timer_setup.report();
368 
369  vout.general("setup is done!\n");
370 }
371 
372 
373 //====================================================================
374 template<typename AFIELD>
376  std::vector<AFIELD2>& testvec_work)
377 {
378  // Todo: add flops count
379 
381  unique_ptr<Timer> timer_initial_setup(new Timer("initial setup"));
382 
383  assert(testvec_work.size() == m_nvec);
384 
385  ASolver<AFIELD2> *asolver_setup = m_asolver_smoother.get();
386 
387  timer_initial_setup->start();
388 
389  vout.detailed("run_setup: using single precision Gramschmidt\n");
390 
391  // random vectors are not thread paraleized....
392  m_multigrid->set_testvectors(); // generate initial random vectors
393 
394 #pragma omp parallel
395  {
396  // initial setup
397  for (int i = 0; i < m_nvec; ++i) {
398  int nconv = -1;
399  double diff = -1.0;
400 #pragma omp barrier
401  asolver_setup->solve(testvec_work[i],
402  (*m_multigrid->get_testvectors())[i],
403  nconv, diff);
404  } // i
405 
406 #pragma omp master
407  {
408  m_timer_gramschmidt->start();
409  }
410  m_multigrid->gramschmidt(testvec_work);
411 #pragma omp master
412  {
413  m_timer_gramschmidt->stop();
414  }
415  vout.general("initial testvectors are ready\n");
416  m_multigrid->set_testvectors(testvec_work);
417  FoprCoarse_t *afopr_coarse =
418  static_cast<FoprCoarse_t *>(m_afopr_coarse.get());
419 #pragma omp master
420  {
421  m_timer_generate_coarse_op->start();
422  }
423  afopr_coarse->generate_coarse_op(m_afopr_fineF,
424  *m_multigrid->get_testvectors());
425 #pragma omp master
426  {
427  m_timer_generate_coarse_op->stop();
428  }
429  vout.general(m_vl, "afopr_coarse version is ready\n");
430 
431 #pragma omp master
432  {
433  timer_initial_setup->stop();
434  timer_initial_setup->report();
435  }
436  }
437 }
438 
439 
440 //====================================================================
441 template<typename AFIELD>
443  std::vector<AFIELD2>& testvec_work)
444 {
445  // Todo: add flops count
446 
448  unique_ptr<Timer> timer_setup(new Timer("each setup"));
449  assert(testvec_work.size() == m_nvec);
450 
451 #pragma omp parallel
452  {
453  for (int n = 0; n < niter; ++n) {
454 #pragma omp master
455  {
456  timer_setup->reset();
457  timer_setup->start();
458  }
459  for (int i = 0; i < m_nvec; ++i) {
460  //#pragma omp barrier
461  m_prec_mg->mult_as_setup(testvec_work[i],
462  (*m_multigrid->get_testvectors())[i]);
463  } // i
464 #pragma omp master
465  {
466  m_timer_gramschmidt->start();
467  }
468  m_multigrid->gramschmidt(testvec_work);
469 #pragma omp master
470  {
471  m_timer_gramschmidt->stop();
472  }
473  m_multigrid->set_testvectors(testvec_work); // update the testvectors
474  FoprCoarse_t *afopr_coarse =
475  static_cast<FoprCoarse_t *>(m_afopr_coarse.get());
476 #pragma omp master
477  {
478  m_timer_generate_coarse_op->start();
479  }
480  afopr_coarse->generate_coarse_op(m_afopr_fineF,
481  *m_multigrid->get_testvectors());
482 #pragma omp master
483  {
484  m_timer_generate_coarse_op->stop();
485  }
486  vout.general(m_vl, "renewed afopr_coarse: n=%d / %d\n", n, niter);
487 #pragma omp master
488  {
489  timer_setup->stop();
490  timer_setup->report();
491  }
492  } //n
493  } // omp parallel
494 }
495 
496 
497 //====================================================================
498 template<typename AFIELD>
500  int& nconv, real_t& diff)
501 {
502  m_outer_solver->solve(x, b, nconv, diff);
503 }
504 
505 
506 //====================================================================
507 template<typename AFIELD>
509 {
510  m_nconv = 0;
511  m_prec_mg->reset_flop_count();
512 }
513 
514 
515 //====================================================================
516 template<typename AFIELD>
518 {
519  double flop_solve = m_outer_solver->flop_count();
520  double flop_outer = flop_solve - m_prec_mg->flop_count();
521  double flop_coarse = m_prec_mg->flop_count_coarse();
522  double flop_smoother = m_prec_mg->flop_count_smoother();
523  double flop_other = m_prec_mg->flop_count_other();
524  double flop_double = m_prec_mg->flop_count_double();
525  m_prec_mg->report_timer();
526 
527  vout.general(m_vl, "flop count (MG solver) [GFlop]:\n");
528  vout.general(m_vl, " solve total (double+float): %e\n", flop_solve * 1.0e-9);
529  vout.general(m_vl, " solve coarse (float): %e\n", flop_coarse * 1.0e-9);
530  vout.general(m_vl, " solve smoother (float): %e\n", flop_smoother * 1.0e-9);
531  vout.general(m_vl, " solve other (float): %e\n", flop_other * 1.0e-9);
532  vout.general(m_vl, " solve other (double): %e\n", flop_double * 1.0e-9);
533 
534  return flop_solve;
535 }
536 
537 
538 //============================================================END=====
CommonParameters::Ny
static int Ny()
Definition: commonParameters.h:106
FoprCoarse_t
AFopr_Clover_coarse< AField_f > FoprCoarse_t
Definition: asolver_MG.cpp:52
CommonParameters::Nz
static int Nz()
Definition: commonParameters.h:107
ASolver_MG_double::set_lattice
void set_lattice(const vector< int > &sap_block_size)
Definition: asolver_MG_double-tmpl.h:297
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
AFopr
Definition: afopr.h:48
ASolver
Definition: asolver.h:23
ASolver_SAP
Definition: asolver_SAP.h:29
ASolver_BiCGStab_Cmplx::set_init_mode
void set_init_mode(const InitialGuess init_guess)
Definition: asolver_BiCGStab_Cmplx.h:117
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
AFopr_Clover_coarse::generate_coarse_op
void generate_coarse_op(AFopr_dd< AFIELD > *fine_afopr, const std::vector< AFIELD > &testvec)
Definition: afopr_Clover_coarse-tmpl.h:1172
Parameters
Class for parameters.
Definition: parameters.h:46
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
ASolver_MG_double::set_parameters_level0
void set_parameters_level0(const Parameters &params)
setting parameters by a Parameter object.
Definition: asolver_MG_double-tmpl.h:103
ASolver_MG_double::run_setup
void run_setup()
setup
Definition: asolver_MG_double-tmpl.h:336
Parameters::get_int
int get_int(const string &key) const
Definition: parameters.cpp:192
asolver_MG_double.h
Multigrid solver.
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:219
AFopr_Clover_coarse::set_mode
void set_mode(std::string mode)
returns the pointer to gauge configuration.
Definition: afopr_Clover_coarse-tmpl.h:1393
ASolver_MG_double::set_parameters
void set_parameters(const Parameters &params)
setting parameters by a Parameter object.
Definition: asolver_MG_double-tmpl.h:67
ASolver_MG_double::set_parameters_level1
void set_parameters_level1(const Parameters &params)
setting parameters by a Parameter object.
Definition: asolver_MG_double-tmpl.h:111
ASolver_MG_double::init_solver
void init_solver()
Definition: asolver_MG_double.h:155
MultiGrid_Clover::init
void init(const std::vector< int > &coarse_lattice, const std::vector< int > &fine_lattice, const int nin, const int nvec)
Definition: MultiGrid_Clover.h:68
ASolver_MG_double::reset_flop_count
void reset_flop_count()
Definition: asolver_MG_double-tmpl.h:508
MultiGrid_Clover::set_afopr_fine
void set_afopr_fine(AFopr_dd< AFIELD2 > *afopr)
Definition: MultiGrid_Clover.h:116
AFopr_dd
Base class of fermion operator family.
Definition: afopr_dd.h:24
CoarseSolver_t
ASolver_BiCGStab_Cmplx< AField_f > CoarseSolver_t
Definition: asolver_MG.cpp:60
Parameters::get_int_vector
vector< int > get_int_vector(const string &key) const
Definition: parameters.cpp:267
Parameters::to_string
static string to_string(const vector< T > &v)
Definition: parameters.h:148
Timer
Definition: timer.h:31
Field::real_t
double real_t
Definition: field.h:51
ASolver_MG_double::run_setup_iterative
void run_setup_iterative(int niter, std::vector< AFIELD2 > &testvec_work)
Definition: asolver_MG_double-tmpl.h:442
CommonParameters::Nx
static int Nx()
Definition: commonParameters.h:105
ASolver_MG_double::set_foprD
void set_foprD(AFopr< AFIELD > *foprD)
Definition: asolver_MG_double-tmpl.h:178
MultiGrid_t
MultiGrid_Clover< AField_f, AField_f > MultiGrid_t
Definition: asolver_MG.cpp:47
ASolver_MG_double::tidyup
void tidyup(void)
Definition: asolver_MG_double-tmpl.h:60
AFopr_Clover_coarse::set_parameters
void set_parameters(const Parameters &params)
setting parameters by a Parameter object.
Definition: afopr_Clover_coarse-tmpl.h:958
ASolver::solve
virtual void solve(AFIELD &x, const AFIELD &b, int &nconv, real_t &diff)
Definition: asolver.h:51
Timer::start
void start()
Definition: timer.cpp:44
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
ASolver_BiCGStab_Cmplx
Definition: asolver_BiCGStab_Cmplx.h:52
ASolver_MG_double::flop_count
double flop_count()
returns the floating point operation count.
Definition: asolver_MG_double-tmpl.h:517
AFopr_Clover_coarse
Definition: afopr_Clover_coarse.h:40
CommonParameters::Nt
static int Nt()
Definition: commonParameters.h:108
ASolver_MG_double::run_setup_initial
void run_setup_initial(std::vector< AFIELD2 > &testvec_work)
Definition: asolver_MG_double-tmpl.h:375
threadManager.h
ASolver_MG_double::set_foprF
void set_foprF(AFopr_dd< AFIELD2 > *foprF)
Definition: asolver_MG_double-tmpl.h:191
Parameters::get_double
double get_double(const string &key) const
Definition: parameters.cpp:175
ASolver_MG_double::solve
void solve(AFIELD &xq, const AFIELD &b, int &nconv, real_t &diff)
solver main.
Definition: asolver_MG_double-tmpl.h:499
OuterSolver_t
ASolver_FBiCGStab< AField_d > OuterSolver_t
Definition: asolver_MG.cpp:59
Parameters::set_int_vector
void set_int_vector(const string &key, const vector< int > &value)
Definition: parameters.cpp:45
ASolver_SAP::set_parameters
void set_parameters(const Parameters &params)
setting parameters by a Parameter object.
Definition: asolver_SAP-tmpl.h:67
CommonParameters::Nd
static int Nd()
Definition: commonParameters.h:116
randomNumberManager.h
AFopr_Clover_dd
Definition: afopr_Clover_dd.h:45
ASolver_MG_double
Definition: asolver_MG_double.h:30
Parameters::set_int
void set_int(const string &key, const int value)
Definition: parameters.cpp:36
APrecond_MG
Definition: aprecond_MG.h:39
AFopr_Clover
Definition: afopr_Clover.h:41
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:180
ASolver_MG_double::init_coarse_grid
void init_coarse_grid()
Definition: asolver_MG_double-tmpl.h:237
Field
Container of Field-type object.
Definition: field.h:46
MultiGrid_Clover
Definition: MultiGrid_Clover.h:25
ASolver_MG_double::init
void init(void)
Definition: asolver_MG_double-tmpl.h:47
ASolver_BiCGStab_Cmplx::set_parameters
void set_parameters(const Parameters &params)
setting parameters by a Parameter object.
Definition: asolver_BiCGStab_Cmplx-tmpl.h:74
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:200
Smoother_t
ASolver_SAP< AField_f > Smoother_t
Definition: asolver_MG.cpp:64
ASolver::real_t
AFIELD::real_t real_t
Definition: asolver.h:29
Timer::stop
void stop()
Definition: timer.cpp:69
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Parameters::lookup
Parameters lookup(const string &key) const
Definition: parameters.h:79
Timer::report
void report(const Bridge::VerboseLevel vl=Bridge::GENERAL)
Definition: timer.cpp:128
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:512