Bridge++  Ver.2.1.3
afopr_Domainwall_eo-tmpl.h
Go to the documentation of this file.
1 
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <assert.h>
15 using namespace std;
16 
20 
21 template<typename AFIELD>
23  = "AFopr_Domainwall_eo";
24 
25 //====================================================================
26 template<typename AFIELD>
28 {
29  int Nc = CommonParameters::Nc();
30  int Nd = CommonParameters::Nd();
31  m_NinF = 2 * Nc * Nd;
32 
33  m_Nvol = CommonParameters::Nvol();
34  m_Nvol2 = m_Nvol / 2;
35  m_Ndim = CommonParameters::Ndim();
36 
37  // setup verbose level
38  string vlevel = params.get_string("verbose_level");
39  m_vl = vout.set_verbose_level(vlevel);
40 
41  vout.general(m_vl, "%s: Initialization start\n", class_name.c_str());
42  int err = 0;
43 
44  // setup kernel operator
45  std::string kernel_type;
46  err += params.fetch_string("kernel_type", kernel_type);
47  if (err > 0) {
48  vout.crucial(m_vl, "Error at %s: kernel_type is not specified.\n",
49  class_name.c_str());
50  exit(EXIT_FAILURE);
51  }
52  m_kernel_type = kernel_type;
53  kernel_type += "_eo";
54 
55  Parameters params_kernel = params;
56  double M0;
57  err += params.fetch_double("domain_wall_height", M0);
58  if (err > 0) {
59  vout.crucial(m_vl, "Error at %s: domain_wall_height is not specified.\n",
60  class_name.c_str());
61  exit(EXIT_FAILURE);
62  }
63  m_M0 = real_t(M0);
64 
65  double kappa = 1.0 / (8.0 - 2.0 * M0);
66  params_kernel.set_double("hopping_parameter", kappa);
67 
68  // Factory is assumed to work
69  m_foprw = AFopr<AFIELD>::New(kernel_type, params_kernel);
70  m_foprw->set_mode("D");
71 
72  m_Ns = 0;
73 
74  set_parameters(params);
75 
76  m_w4.reset(m_NinF, m_Nvol2, 1);
77  m_v4.reset(m_NinF, m_Nvol2, 1);
78  m_y4.reset(m_NinF, m_Nvol2, 1);
79  m_t4.reset(m_NinF, m_Nvol2, 1);
80 
81  if (needs_convert()) {
82  m_w4lex.reset(m_NinF, m_Nvol, 1);
83  m_v4lex.reset(m_NinF, m_Nvol, 1);
84  }
85 
86  m_index_eo = new Index_eo_Domainwall<AFIELD>;
87 
88 }
89 
90 
91 //====================================================================
92 template<typename AFIELD>
94 {
95  delete m_foprw;
96  delete m_index_eo;
97 }
98 
99 
100 //====================================================================
101 template<typename AFIELD>
103  const Parameters& params)
104 {
105  const string str_vlevel = params.get_string("verbose_level");
106  m_vl = vout.set_verbose_level(str_vlevel);
107 
108  //- fetch and check input parameters
109  string gmset_type;
110  double mq, M0;
111  int Ns;
112  std::vector<int> bc;
113  double b, c;
114  double alpha;
115 
116  int err_optional = 0;
117  err_optional += params.fetch_string("gamma_matrix_type", gmset_type);
118 
119  int err = 0;
120  err += params.fetch_double("quark_mass", mq);
121  err += params.fetch_double("domain_wall_height", M0);
122  err += params.fetch_int("extent_of_5th_dimension", Ns);
123  err += params.fetch_int_vector("boundary_condition", bc);
124  err += params.fetch_double("coefficient_b", b);
125  err += params.fetch_double("coefficient_c", c);
126 
127  if (err) {
128  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
129  class_name.c_str());
130  exit(EXIT_FAILURE);
131  }
132 
133  std::string repr;
134  if (!params.fetch_string("gamma_matrix_type", repr)) {
135  m_repr = repr;
136  } else {
137  m_repr = "Dirac"; // default
138  vout.general(m_vl, "gamma_matrix_type is not given: defalt = %s\n",
139  m_repr.c_str());
140  }
141 
142  int err2 = 0;
143  err2 += params.fetch_double("coefficient_b", b);
144  err2 += params.fetch_double("coefficient_c", c);
145  if (err2) {
146  vout.general(m_vl, " coefficients b, c are not provided:"
147  " set to Shamir's form.\n");
148  b = 1.0;
149  c = 0.0;
150  }
151 
152  int err3 = params.fetch_double("parameter_alpha", alpha);
153  if (err3) {
154  vout.general(m_vl, " parameter alpha is not provided: set to 1.0.\n");
155  alpha = 1.0;
156  }
157 
158  set_parameters(real_t(mq), real_t(M0), Ns, bc,
159  real_t(b), real_t(c), real_t(alpha));
160 
161  if (real_t(M0) != m_M0) set_kernel_parameters(params);
162 }
163 
164 
165 //====================================================================
166 template<typename AFIELD>
168  Parameters& params) const
169 {
170  params.set_string("kernel_type", m_kernel_type);
171  params.set_string("gamma_matrix_type", m_repr);
172  params.set_double("quark_mass", double(m_mq));
173  params.set_double("domain_wall_height", double(m_M0));
174  params.set_int("extent_of_5th_dimension", m_Ns);
175  params.set_int_vector("boundary_condition", m_boundary);
176  params.set_double("coefficient_b", double(m_b[0]));
177  params.set_double("coefficient_c", double(m_c[0]));
178  params.set_double("parameter_alpha", double(m_alpha));
179  params.set_string("gamma_matrix_type", m_repr);
180 
181  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
182 }
183 
184 
185 //====================================================================
186 template<typename AFIELD>
188  const real_t mq,
189  const real_t M0,
190  const int Ns,
191  const std::vector<int> bc,
192  const real_t b,
193  const real_t c,
194  const real_t alpha)
195 {
196  int ith = ThreadManager::get_thread_id();
197  if (ith == 0) {
198  m_M0 = real_t(M0);
199  m_mq = real_t(mq);
200  m_Ns = Ns;
201  m_alpha = alpha;
202 
203  m_boundary.resize(m_Ndim);
204  assert(bc.size() == m_Ndim);
205  for (int mu = 0; mu < m_Ndim; ++mu) {
206  m_boundary[mu] = bc[mu];
207  }
208 
209  if (m_b.size() != m_Ns) {
210  m_b.resize(m_Ns);
211  m_c.resize(m_Ns);
212  }
213  for (int is = 0; is < m_Ns; ++is) {
214  m_b[is] = real_t(b);
215  m_c[is] = real_t(c);
216  }
217  }
218 #pragma omp barrier
219 
220  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
221  vout.general(m_vl, " mq = %8.4f\n", m_mq);
222  vout.general(m_vl, " M0 = %8.4f\n", m_M0);
223  vout.general(m_vl, " Ns = %4d\n", m_Ns);
224  for (int mu = 0; mu < m_Ndim; ++mu) {
225  vout.general(m_vl, " boundary[%d] = %2d\n", mu, m_boundary[mu]);
226  }
227  //vout.general(m_vl, " coefficients b = %16.10f c = %16.10f\n",
228  // m_b[0], m_c[0]);
229  vout.general(m_vl, " coefficients:\n");
230  for (int is = 0; is < m_Ns; ++is) {
231  vout.general(m_vl, " b[%2d] = %16.10f c[%2d] = %16.10f\n",
232  is, m_b[is], is, m_c[is]);
233  }
234  vout.general(m_vl, " alpha = %8.4f\n", m_alpha);
235 
236 
237  set_precond_parameters();
238 
239  // working 5d vectors.
240  if (m_w1.nex() != Ns) {
241  if(ith == 0){
242  m_w1.reset(m_NinF, m_Nvol2, m_Ns);
243  m_v1.reset(m_NinF, m_Nvol2, m_Ns);
244  m_v2.reset(m_NinF, m_Nvol2, m_Ns);
245  }
246  }
247 }
248 
249 
250 //====================================================================
251 template<typename AFIELD>
253  const Parameters& params)
254 {
255  Parameters params_kernel = params;
256 
257  double M0;
258  params.fetch_double("domain_wall_height", M0);
259 
260  double kappa = 1.0 / (8.0 - 2.0 * M0);
261  params_kernel.set_double("hopping_parameter", kappa);
262 
263  m_foprw->set_parameters(params_kernel);
264 }
265 
266 
267 //====================================================================
268 template<typename AFIELD>
270 {
271 #pragma omp barrier
272 
273  int ith = ThreadManager::get_thread_id();
274  if (ith == 0) {
275 
276  if (m_dp.size() != m_Ns) {
277  m_dp.resize(m_Ns);
278  m_dm.resize(m_Ns);
279  m_e.resize(m_Ns - 1);
280  m_f.resize(m_Ns - 1);
281  }
282 
283  for (int is = 0; is < m_Ns; ++is) {
284  // m_dp[is] = 1.0 + m_b[is] * (4.0 - m_M0);
285  // m_dm[is] = 1.0 - m_c[is] * (4.0 - m_M0);
286  m_dp[is] = m_alpha * (1.0 + m_b[is] * (4.0 - m_M0));
287  m_dm[is] = m_alpha * (1.0 - m_c[is] * (4.0 - m_M0));
288  }
289 
290  m_e[0] = m_mq * m_dm[m_Ns - 1] / m_dp[0];
291  //m_f[0] = m_mq * m_dm[0];
292  m_f[0] = m_mq * m_dm[0]/m_alpha;
293  for (int is = 1; is < m_Ns - 1; ++is) {
294  m_e[is] = m_e[is - 1] * m_dm[is - 1] / m_dp[is];
295  m_f[is] = m_f[is - 1] * m_dm[is] / m_dp[is - 1];
296  }
297 
298  m_g = m_e[m_Ns - 2] * m_dm[m_Ns - 2];
299  }
300 #pragma omp barrier
301 
302 }
303 
304 
305 //====================================================================
306 template<typename AFIELD>
308  const std::vector<real_t> vec_b,
309  const std::vector<real_t> vec_c)
310 {
311  if ((vec_b.size() != m_Ns) || (vec_c.size() != m_Ns)) {
312  vout.crucial(m_vl, "%s: size of coefficient vectors incorrect.\n",
313  class_name.c_str());
314  }
315 
316  vout.general(m_vl, "%s: coefficient vectors are set:\n",
317  class_name.c_str());
318 
319  for (int is = 0; is < m_Ns; ++is) {
320  m_b[is] = vec_b[is];
321  m_c[is] = vec_c[is];
322  vout.general(m_vl, "b[%2d] = %16.10f c[%2d] = %16.10f\n",
323  is, m_b[is], is, m_c[is]);
324  }
325 
326  set_precond_parameters();
327 }
328 
329 
330 //====================================================================
331 template<typename AFIELD>
333 {
334  if (!needs_convert()) {
335  vout.crucial(m_vl, "%s: convert is not necessary.\n",
336  class_name.c_str());
337  exit(EXIT_FAILURE);
338  }
339 
340 #pragma omp barrier
341 
342  int Nex = w.nex();
343  for (int ex = 0; ex < Nex; ++ex) {
344  copy(m_w4lex, 0, w, ex);
345  m_foprw->convert(m_v4lex, m_w4lex);
346  copy(v, ex, m_v4lex, 0);
347  }
348 
349 #pragma omp barrier
350 }
351 
352 
353 //====================================================================
354 template<typename AFIELD>
356 {
357  if (!needs_convert()) {
358  vout.crucial(m_vl, "%s: convert is not necessary.\n",
359  class_name.c_str());
360  exit(EXIT_FAILURE);
361  }
362 
363 #pragma omp barrier
364 
365  int Nex = w.nex();
366  for (int ex = 0; ex < Nex; ++ex) {
367  copy(m_v4lex, 0, w, ex);
368  m_foprw->reverse(m_w4lex, m_v4lex);
369  copy(v, ex, m_w4lex, 0);
370  }
371 
372 #pragma omp barrier
373 }
374 
375 
376 //====================================================================
377 template<typename AFIELD>
379 {
380 #pragma omp barrier
381 
382  int ith = ThreadManager::get_thread_id();
383  if (ith == 0) m_mode = mode;
384  vout.paranoiac(m_vl, " mode is set to %s\n", mode.c_str());
385 
386 #pragma omp barrier
387 }
388 
389 
390 //====================================================================
391 template<typename AFIELD>
393 {
394  if (m_mode == "D") {
395  D(v, w);
396  } else if (m_mode == "Ddag") {
397  Ddag(v, w);
398  } else if (m_mode == "DdagD") {
399  DdagD(v, w);
400  } else if (m_mode == "DDdag") {
401  Ddag(m_w1, w);
402  D(v, m_w1);
403  } else if (m_mode == "H") {
404  H(v, w);
405  } else if (m_mode == "Deo") {
406  D_eo(v, w, 0);
407  } else if (m_mode == "Doe") {
408  D_eo(v, w, 1);
409  } else if (m_mode == "Dee") {
410  D_ee(v, w, 0);
411  } else if (m_mode == "Doo") {
412  D_ee(v, w, 1);
413  } else if (m_mode == "Dee_inv") {
414  L_inv(m_v1, w);
415  U_inv(v, m_v1);
416  } else if (m_mode == "Doo_inv") {
417  L_inv(m_v1, w);
418  U_inv(v, m_v1);
419  } else {
420  vout.crucial(m_vl, "mode undeifined in %s.\n", class_name.c_str());
421  vout.crucial(m_vl, "in mult, mode=%s.\n", m_mode.c_str());
422  abort();
423  }
424 }
425 
426 
427 //====================================================================
428 template<typename AFIELD>
430 {
431  if (m_mode == "D") {
432  Ddag(v, w);
433  } else if (m_mode == "Ddag") {
434  D(v, w);
435  } else if (m_mode == "DdagD") {
436  DdagD(v, w);
437  } else if (m_mode == "DDdag") {
438  Ddag(m_w1, w);
439  D(v, m_w1);
440  } else if (m_mode == "H") {
441  Hdag(v, w);
442  } else if (m_mode == "Deo") {
443  Ddag_eo(v, w, 1);
444  } else if (m_mode == "Doe") {
445  Ddag_eo(v, w, 0);
446  } else if (m_mode == "Dee") {
447  Ddag_ee(v, w, 0);
448  } else if (m_mode == "Doo") {
449  Ddag_ee(v, w, 1);
450  } else if (m_mode == "Dee_inv") {
451  Udag_inv(m_v1, w);
452  Ldag_inv(v, m_v1);
453  } else if (m_mode == "Doo_inv") {
454  Udag_inv(m_v1, w);
455  Ldag_inv(v, m_v1);
456  } else {
457  vout.crucial(m_vl, "mode undeifined in %s.\n", class_name.c_str());
458  vout.crucial(m_vl, "in mult_dag, mode=%s.\n", m_mode.c_str());
459  abort();
460  }
461 }
462 
463 
464 //====================================================================
465 template<typename AFIELD>
467  std::string mode)
468 {
469  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
470  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
471 
472  if (mode == "Deo") {
473  D_eo(v, w, 0);
474  } else if (mode == "Doe") {
475  D_eo(v, w, 1);
476  } else if (mode == "Dee") {
477  D_ee(v, w, 0);
478  } else if (mode == "Doo") {
479  D_ee(v, w, 1);
480  } else if (mode == "Dee_inv") {
481  L_inv(m_v1, w);
482  U_inv(v, m_v1);
483  } else if (mode == "Doo_inv") {
484  L_inv(m_v1, w);
485  U_inv(v, m_v1);
486  } else {
487  std::cout << "mode undeifined in AFopr_Domainwall_eo.\n";
488  abort();
489  }
490 }
491 
492 //====================================================================
493 template<typename AFIELD>
495  std::string mode)
496 {
497  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
498  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
499 
500  if (m_mode == "Deo") {
501  Ddag_eo(v, w, 1);
502  } else if (m_mode == "Doe") {
503  Ddag_eo(v, w, 0);
504  } else if (m_mode == "Dee") {
505  Ddag_ee(v, w, 0);
506  } else if (m_mode == "Doo") {
507  Ddag_ee(v, w, 1);
508  } else if (m_mode == "Dee_inv") {
509  Udag_inv(m_v1, w);
510  Ldag_inv(v, m_v1);
511  } else if (m_mode == "Doo_inv") {
512  Udag_inv(m_v1, w);
513  Ldag_inv(v, m_v1);
514  } else {
515  std::cout << "mode undeifined in AFopr_Domainwall_eo.\n";
516  abort();
517  }
518 }
519 
520 //====================================================================
521 template<typename AFIELD>
523  const AFIELD& b)
524 {
525  // bo = Doo_inv b[odd]
526  // Be = Dee_inv (b[even] - Deo Doo_inv b[odd])
527  // or
528  // bo = Doo_dag_inv b[odd]
529  // Be = b[even] - Doe_dag Doo_dag_inv b[odd]
530  m_index_eo->split(Be, m_w1, b);
531 #pragma omp barrier
532  if(m_mode == "D"){ // D=(1- Dee_inv Deo Doo_inv Doo)
533  L_inv(m_v1, m_w1); // mult(bo, m_w1, "Doo_inv");
534  U_inv(bo, m_v1);
535  D_eo(m_w1, bo, 0); // mult(m_w1, bo, "Deo");
536  axpy(Be, real_t(-1), m_w1);
537  L_inv(m_v1, Be); // mult(Be, Be, "Dee_inv");
538  U_inv(Be, m_v1);
539  } else {
540  Udag_inv(m_v1, m_w1); // Doo_dag_inv
541  Ldag_inv(bo, m_v1);
542  Ddag_eo(m_w1, bo, 0);
543  axpy(Be, real_t(-1), m_w1);
544  }
545 }
546 
547 //====================================================================
548 template<typename AFIELD>
550  const AFIELD& xe, const AFIELD& bo)
551 {
552  // x[even] = xe
553  // x[odd] = Doo_inv b[odd] - Doo_inv Doe x[even]
554  // = bo - Doo_inv Doe xe
555  // or
556  // x[even] =Dee_dag_inv xe
557  // x[odd] = Doo_dag_inv b[odd] - Doo_dag_inv Deo_dag x[even]
558  // = bo - Doo_dag_inv Doe_dag xe
559 
560  if(m_mode == "D"){ // D=(1- Dee_inv Deo Doo_inv Doo)
561  D_eo(m_w1, xe, 1); // mult(m_w1, xe, "Doe");
562  L_inv(m_v1, m_w1); // mult(m_w1, m_w1, "Doo_inv");
563  U_inv(m_w1, m_v1);
564  aypx(real_t(-1.0), m_w1, bo);
565 #pragma omp barrier
566  m_index_eo->merge(x, xe, m_w1);
567  } else {
568  Udag_inv(m_v1, xe); // Dee_dag_inv
569  Ldag_inv(m_v2, m_v1);
570  Ddag_eo(m_w1, m_v2, 1);
571  Udag_inv(m_v1, m_w1); // Doo_dag_inv
572  Ldag_inv(m_w1, m_v1);
573  aypx(real_t(-1.0), m_w1, bo);
574 #pragma omp barrier
575  m_index_eo->merge(x, m_v2, m_w1);
576  }
577 
578 }
579 
580 //====================================================================
581 template<typename AFIELD>
583 {
584  D_eo(m_v1, w, 1);
585  L_inv(m_v2, m_v1);
586  U_inv(m_v1, m_v2);
587  D_eo(m_v2, m_v1, 0);
588  L_inv(m_v1, m_v2);
589  U_inv(m_v2, m_v1);
590 
591  copy(m_v1, w);
592  axpy(m_v1, real_t(-1.0), m_v2);
593 #pragma omp barrier
594 
595  Udag_inv(v, m_v1);
596  Ldag_inv(m_v2, v);
597  Ddag_eo(v, m_v2, 1);
598  Udag_inv(m_v2, v);
599  Ldag_inv(v, m_v2);
600  Ddag_eo(m_v2, v, 0);
601 
602  copy(v, m_v1);
603  axpy(v, real_t(-1.0), m_v2);
604 #pragma omp barrier
605 }
606 
607 
608 //====================================================================
609 template<typename AFIELD>
611 {
612  D_eo(m_v1, w, 1);
613  L_inv(m_v2, m_v1);
614  U_inv(m_v1, m_v2);
615  D_eo(m_v2, m_v1, 0);
616  L_inv(m_v1, m_v2);
617  U_inv(m_v2, m_v1);
618 
619  copy(v, w);
620  axpy(v, real_t(-1.0), m_v2);
621 #pragma omp barrier
622 }
623 
624 
625 //====================================================================
626 template<typename AFIELD>
628 {
629  D_eo(m_v1, w, 1);
630  L_inv(m_v2, m_v1);
631  U_inv(m_v1, m_v2);
632  D_eo(m_v2, m_v1, 0);
633  L_inv(m_v1, m_v2);
634  U_inv(m_v2, m_v1);
635 
636  copy(m_v1, w);
637  axpy(m_v1, real_t(-1.0), m_v2);
638 #pragma omp barrier
639 
640  mult_gm5R(v, m_v1);
641 
642 }
643 
644 
645 //====================================================================
646 template<typename AFIELD>
648 {
649  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
650  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
651 
652  Udag_inv(m_v1, w);
653  Ldag_inv(m_v2, m_v1);
654  Ddag_eo(m_v1, m_v2, 1);
655  Udag_inv(m_v2, m_v1);
656  Ldag_inv(m_v1, m_v2);
657  Ddag_eo(m_v2, m_v1, 0);
658 
659  copy(v, w);
660  axpy(v, real_t(-1.0), m_v2);
661 #pragma omp barrier
662 }
663 
664 
665 //====================================================================
666 template<typename AFIELD>
668 {
669  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
670  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
671 
672  mult_gm5R(v, w);
673 
674  Udag_inv(m_v1, v);
675  Ldag_inv(m_v2, m_v1);
676  Ddag_eo(m_v1, m_v2, 1);
677  Udag_inv(m_v2, m_v1);
678  Ldag_inv(m_v1, m_v2);
679  Ddag_eo(m_v2, m_v1, 0);
680 
681  //copy(v, w);
682  axpy(v, real_t(-1.0), m_v2);
683 #pragma omp barrier
684 }
685 
686 
687 //====================================================================
688 template<typename AFIELD>
690 {
691  int Nex = v.nex();
692  assert(Nex == w.nex());
693 
694  // omp barrier at the beginning and end of m_foprw->mult_gm5 is
695  // assumed.
696  if (Nex == 1) {
697  mult_gm5_4d(v, w);
698  } else {
699 #pragma omp barrier
700  for (int ex = 0; ex < Nex; ++ex) {
701  copy(m_w4, 0, w, ex);
702  m_foprw->mult_gm5(m_v4, m_w4);
703  copy(v, ex, m_v4, 0);
704 #pragma omp barrier
705  }
706  }
707 }
708 
709 
710 //====================================================================
711 template<typename AFIELD>
713  const AFIELD& w)
714 {
715  m_foprw->mult_gm5(v, w);
716 }
717 
718 
719 //====================================================================
720 template<typename AFIELD>
722 {
723  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
724  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
725 
726 #pragma omp barrier
727 
728  for (int is = 0; is < m_Ns; ++is) {
729  copy(v, m_Ns - 1 - is, w, is);
730  }
731 
732 #pragma omp barrier
733 }
734 
735 
736 //====================================================================
737 template<typename AFIELD>
739 {
740  assert(w.check_size(m_NinF, m_Nvol2, m_Ns));
741  assert(v.check_size(m_NinF, m_Nvol2, m_Ns));
742 
743 #pragma omp barrier
744 
745  for (int is = 0; is < m_Ns; ++is) {
746  copy(m_w4, 0, w, is);
747  mult_gm5_4d(m_v4, m_w4);
748  copy(v, m_Ns - 1 - is, m_v4, 0);
749  }
750 
751 #pragma omp barrier
752 }
753 
754 
755 //====================================================================
756 template<typename AFIELD>
758  const int ieo)
759 { // ieo = 0: even < odd, ieo = 1: odd <- even
760 #pragma omp barrier
761 
762  for (int is = 0; is < m_Ns; ++is) {
763  m_v4.set(0.0);
764  int is_up = (is + 1) % m_Ns;
765  real_t Fup = 0.5 * m_alpha;
766  if (is == m_Ns-1) Fup = -0.5 * m_mq;
767  copy(m_y4, 0, w, is_up);
768  mult_gm5_4d(m_t4, m_y4);
769  axpy(m_y4, real_t(-1.0), m_t4);
770  axpy(m_v4, 0, Fup, m_y4, 0); // m_v4 = - P_ w(is+1)
771 
772  int is_dn = (is - 1 + m_Ns) % m_Ns;
773  real_t Fdn = 0.5 * m_alpha;
774  if (is == 0) Fdn = -0.5 * m_mq;
775  copy(m_y4, 0, w, is_dn);
776  mult_gm5_4d(m_t4, m_y4);
777  axpy(m_y4, real_t(1.0), m_t4);
778  axpy(m_v4, 0, Fdn, m_y4, 0); // m_v4 += - P+ w(is-1)
779 
780  copy(m_w4, 0, w, is);
781 
782  if(is == 0){
783  real_t fac1 = 0.5 * ( 1.0 + m_alpha);
784  real_t fac2 = 0.5 * (-1.0 + m_alpha);
785  if(fac2 != 0.0){
786  mult_gm5_4d(m_t4, m_w4);
787  scal(m_w4, fac1);
788  axpy(m_w4, fac2, m_t4);
789  }
790  }else if(is == m_Ns-1){
791  real_t fac1 = 0.5 * (1.0 + m_alpha);
792  real_t fac2 = 0.5 * (1.0 - m_alpha);
793  if(fac2 != 0.0){
794  mult_gm5_4d(m_t4, m_w4);
795  scal(m_w4, fac1);
796  axpy(m_w4, fac2, m_t4);
797  }
798  }else{
799  scal(m_w4, m_alpha);
800  }
801 
802  scal(m_w4, m_b[is]);
803  axpy(m_w4, m_c[is], m_v4);
804 
805  if (ieo == 0) {
806  m_foprw->mult(m_v4, m_w4, "Deo");
807  } else {
808  m_foprw->mult(m_v4, m_w4, "Doe");
809  }
810 
811  scal(m_v4, real_t(4.0 - m_M0));
812 
813  copy(v, is, m_v4, 0);
814 
815 #pragma omp barrier
816  }
817 }
818 
819 
820 //====================================================================
821 template<typename AFIELD>
823  const int ieo)
824 { // ieo = 0: even < odd, ieo = 1: odd <- even
825 #pragma omp barrier
826 
827  v.set(0.0);
828 
829 #pragma omp barrier
830 
831  for (int is = 0; is < m_Ns; ++is) {
832  copy(m_w4, 0, w, is);
833 
834  // m_foprw->Mdageo(m_v4, m_w4, ieo);
835  mult_gm5_4d(m_v4, m_w4);
836  if (ieo == 0) {
837  m_foprw->mult(m_y4, m_v4, "Deo");
838  } else {
839  m_foprw->mult(m_y4, m_v4, "Doe");
840  }
841  mult_gm5_4d(m_v4, m_y4);
842 
843  scal(m_v4, real_t(4.0 - m_M0));
844 
845  copy(m_w4, m_v4);
846 
847  if(is == 0){
848  real_t fac1 = 0.5 * ( 1.0 + m_alpha);
849  real_t fac2 = 0.5 * (-1.0 + m_alpha);
850  if(fac2 != 0.0){
851  mult_gm5_4d(m_t4, m_v4);
852  scal(m_v4, fac1);
853  axpy(m_v4, fac2, m_t4);
854  }
855  }else if(is == m_Ns-1){
856  real_t fac1 = 0.5 * (1.0 + m_alpha);
857  real_t fac2 = 0.5 * (1.0 - m_alpha);
858  if(fac2 != 0.0){
859  mult_gm5_4d(m_t4, m_v4);
860  scal(m_v4, fac1);
861  axpy(m_v4, fac2, m_t4);
862  }
863  }else{
864  scal(m_v4, m_alpha);
865  }
866 
867  axpy(v, is, m_b[is], m_v4, 0);
868 
869  scal(m_w4, m_c[is]);
870 
871  int is_up = (is + 1) % m_Ns;
872  real_t Fup = 0.5 * m_alpha;
873  if (is_up == 0) Fup = -0.5 * m_mq;
874  mult_gm5_4d(m_y4, m_w4);
875  axpy(m_y4, real_t(-1.0), m_w4); // m_y4 = - (1 - gm5) m_v4
876  axpy(v, is_up, -Fup, m_y4, 0); // v += Fup * (1 - gm5) m_y4
877 
878  int is_dn = (is - 1 + m_Ns) % m_Ns;
879  real_t Fdn = 0.5 * m_alpha;
880  if (is_dn == m_Ns - 1) Fdn = -0.5 * m_mq;
881  mult_gm5_4d(m_y4, m_w4);
882  axpy(m_y4, real_t(1.0), m_w4); // m_y4 = (1 + gm5) m_v4
883  axpy(v, is_dn, Fdn, m_y4, 0); // v += Fdn * (1 + gm5) m_y4
884 
885 #pragma omp barrier
886  }
887 }
888 
889 
890 //====================================================================
891 template<typename AFIELD>
893  const int ieo)
894 { // ieo = 0: even, ieo = 1: odd (but they are identical)
895 #pragma omp barrier
896 
897  for (int is = 0; is < m_Ns; ++is) {
898 
899  m_v4.set(0.0);
900 
901  int is_up = (is + 1) % m_Ns;
902  real_t Fup = 0.5 * m_alpha;
903  if (is == m_Ns - 1) Fup = -0.5 * m_mq;
904  copy(m_y4, 0, w, is_up);
905  mult_gm5_4d(m_t4, m_y4);
906  axpy(m_y4, real_t(-1.0), m_t4);
907  axpy(m_v4, 0, Fup, m_y4, 0);
908 
909  int is_dn = (is - 1 + m_Ns) % m_Ns;
910  real_t Fdn = 0.5 * m_alpha;
911  if (is == 0) Fdn = -0.5 * m_mq;
912  copy(m_y4, 0, w, is_dn);
913  mult_gm5_4d(m_t4, m_y4);
914  axpy(m_y4, real_t(1.0), m_t4);
915  axpy(m_v4, 0, Fdn, m_y4, 0);
916 
917  copy(m_w4, 0, w, is);
918 
919  if(is == 0){
920  real_t fac1 = 0.5 * ( 1.0 + m_alpha);
921  real_t fac2 = 0.5 * (-1.0 + m_alpha);
922  if(fac2 != 0.0){
923  mult_gm5_4d(m_t4, m_w4);
924  scal(m_w4, fac1);
925  axpy(m_w4, fac2, m_t4);
926  }
927  }else if(is == m_Ns-1){
928  real_t fac1 = 0.5 * (1.0 + m_alpha);
929  real_t fac2 = 0.5 * (1.0 - m_alpha);
930  if(fac2 != 0.0){
931  mult_gm5_4d(m_t4, m_w4);
932  scal(m_w4, fac1);
933  axpy(m_w4, fac2, m_t4);
934  }
935  }else{
936  scal(m_w4, m_alpha);
937  }
938 
939  real_t F1 = m_b[is] * (4.0 - m_M0) + 1.0;
940  scal(m_w4, F1);
941 
942  real_t F2 = m_c[is] * (4.0 - m_M0) - 1.0;
943  axpy(m_w4, F2, m_v4);
944 
945  copy(v, is, m_w4, 0);
946 
947 #pragma omp barrier
948  }
949 }
950 
951 //====================================================================
952 template<typename AFIELD>
954  const int ieo)
955 { // ieo = 0: even, ieo = 1: odd (but they are identical)
956 #pragma omp barrier
957 
958  v.set(0.0);
959 #pragma omp barrier
960 
961  for (int is = 0; is < m_Ns; ++is) {
962 
963  copy(m_w4, 0, w, is);
964  real_t F1 = m_b[is] * (4.0 - m_M0) + 1.0;
965  scal(m_w4, F1);
966 
967  if(is == 0){
968  real_t fac1 = 0.5 * ( 1.0 + m_alpha);
969  real_t fac2 = 0.5 * (-1.0 + m_alpha);
970  if(fac2 != 0.0){
971  mult_gm5_4d(m_t4, m_w4);
972  scal(m_w4, fac1);
973  axpy(m_w4, fac2, m_t4);
974  }
975  }else if(is == m_Ns-1){
976  real_t fac1 = 0.5 * (1.0 + m_alpha);
977  real_t fac2 = 0.5 * (1.0 - m_alpha);
978  if(fac2 != 0.0){
979  mult_gm5_4d(m_t4, m_w4);
980  scal(m_w4, fac1);
981  axpy(m_w4, fac2, m_t4);
982  }
983  }else{
984  scal(m_w4, m_alpha);
985  }
986 
987  axpy(v, is, real_t(1.0), m_w4, 0);
988 
989  copy(m_y4, 0, w, is);
990  real_t F2 = m_c[is] * (4.0 - m_M0) - 1.0;
991  scal(m_y4, F2);
992 
993  int is_up = (is + 1) % m_Ns;
994  real_t Fup = 0.5 * m_alpha;
995  if (is_up == 0) Fup = -0.5 * m_mq;
996  mult_gm5_4d(m_t4, m_y4);
997  axpy(m_t4, real_t(-1.0), m_y4); // m_t4 = - (1 - gm5) * m_y4
998  axpy(v, is_up, -Fup, m_t4, 0); // v+= Fup * (1 - gm5) * m_t4
999 
1000  int is_dn = (is - 1 + m_Ns) % m_Ns;
1001  real_t Fdn = 0.5 * m_alpha;
1002  if (is_dn == m_Ns-1) Fdn = -0.5 * m_mq;
1003  mult_gm5_4d(m_t4, m_y4);
1004  axpy(m_t4, real_t(1.0), m_y4); // m_t4 = (1 + gm5) * m_y4
1005  axpy(v, is_dn, Fdn, m_t4, 0); // v+= Fdn * (1 + gm5) * m_t4
1006  }
1007 
1008 #pragma omp barrier
1009 }
1010 
1011 
1012 //====================================================================
1013 template<typename AFIELD>
1015 {
1016 #pragma omp barrier
1017 
1018  copy(v, 0, w, 0);
1019  copy(m_y4, 0, w, 0);
1020  scal(m_y4, m_e[0]);
1021 
1022 #pragma omp barrier
1023 
1024  for (int is = 1; is < m_Ns - 1; ++is) {
1025  copy(v, is, w, is);
1026 
1027  copy(m_v4, 0, v, is - 1);
1028  mult_gm5_4d(m_w4, m_v4);
1029  axpy(m_v4, real_t(1.0), m_w4);
1030  scal(m_v4, real_t(0.5) * m_dm[is] / m_dp[is - 1]);
1031 
1032  axpy(v, is, real_t(1.0), m_v4, 0);
1033  copy(m_w4, 0, v, is);
1034  axpy(m_y4, m_e[is], m_w4);
1035 
1036 #pragma omp barrier
1037  }
1038 
1039  int is = m_Ns - 1;
1040  copy(v, is, w, is);
1041  copy(m_v4, 0, v, is - 1);
1042  mult_gm5_4d(m_w4, m_v4);
1043  axpy(m_v4, real_t(1.0), m_w4);
1044  scal(m_v4, real_t(0.5) * m_dm[is] / m_dp[is - 1]);
1045 
1046  axpy(v, is, real_t(1.0), m_v4, 0);
1047 
1048  mult_gm5_4d(m_w4, m_y4);
1049  axpy(m_y4, real_t(-1.0), m_w4);
1050  scal(m_y4, real_t(-0.5));
1051  axpy(v, is, real_t(1.0), m_y4, 0);
1052 
1053 #pragma omp barrier
1054 }
1055 
1056 
1057 //====================================================================
1058 template<typename AFIELD>
1060 {
1061 #pragma omp barrier
1062 
1063  int is = m_Ns - 1;
1064  copy(m_y4, 0, w, is);
1065 
1066  // multiply (alpha * P+ + P-)
1067  real_t fac1 = 0.5 * ( 1.0 + m_alpha);
1068  real_t fac2 = 0.5 * (-1.0 + m_alpha);
1069  if(fac2 != 0.0){
1070  mult_gm5_4d(m_t4, m_y4);
1071  scal(m_y4, fac1);
1072  axpy(m_y4, fac2, m_t4);
1073  }
1074  scal(m_y4, real_t(1.0) / (m_dp[is] + m_g));
1075  copy(v, is, m_y4, 0);
1076 
1077  mult_gm5_4d(m_w4, m_y4);
1078  axpy(m_y4, real_t(1.0), m_w4);
1079  scal(m_y4, real_t(0.5));
1080 
1081 #pragma omp barrier
1082 
1083  for (int is = m_Ns - 2; is >= 0; --is) {
1084  copy(m_v4, 0, w, is);
1085 
1086  copy(m_w4, 0, v, is + 1);
1087  mult_gm5_4d(m_t4, m_w4);
1088  axpy(m_w4, real_t(-1.0), m_t4);
1089 
1090  axpy(m_v4, real_t(0.5) * m_dm[is], m_w4);
1091 
1092  axpy(m_v4, -m_f[is], m_y4);
1093 
1094  scal(m_v4, real_t(1.0) / m_dp[is]);
1095 
1096  if(is == 0){ // multiply (alpha * P- + P+)
1097  real_t fac1 = 0.5 * (1.0 + m_alpha);
1098  real_t fac2 = 0.5 * (1.0 - m_alpha);
1099  if(fac2 != 0.0){
1100  mult_gm5_4d(m_t4, m_v4);
1101  scal(m_v4, fac1);
1102  axpy(m_v4, fac2, m_t4);
1103  }
1104  }
1105 
1106  copy(v, is, m_v4, 0);
1107 
1108 #pragma omp barrier
1109  }
1110 
1111 }
1112 
1113 
1114 //====================================================================
1115 template<typename AFIELD>
1117 {
1118 #pragma omp barrier
1119 
1120  copy(m_v4, 0, w, 0);
1121 
1122  // multiply (alpha * P- + P+)
1123  real_t fac1 = 0.5 * (1.0 + m_alpha);
1124  real_t fac2 = 0.5 * (1.0 - m_alpha);
1125  if(fac2 != 0.0){
1126  mult_gm5_4d(m_t4, m_v4);
1127  scal(m_v4, fac1);
1128  axpy(m_v4, fac2, m_t4);
1129  }
1130  scal(m_v4, real_t(1.0) / m_dp[0]);
1131  copy(v, 0, m_v4, 0);
1132 
1133  copy(m_y4, m_v4);
1134  scal(m_y4, m_f[0]);
1135 
1136 #pragma omp barrier
1137 
1138  for (int is = 1; is < m_Ns - 1; ++is) {
1139  copy(m_t4, 0, w, is);
1140 
1141  copy(m_v4, 0, v, is - 1);
1142  mult_gm5_4d(m_w4, m_v4);
1143  axpy(m_v4, real_t(-1.0), m_w4);
1144  axpy(m_t4, real_t(0.5) * m_dm[is - 1], m_v4);
1145 
1146  scal(m_t4, real_t(1.0) / m_dp[is]);
1147  copy(v, is, m_t4, 0);
1148 
1149  axpy(m_y4, m_f[is], m_t4);
1150 
1151 #pragma omp barrier
1152  }
1153 
1154  int is = m_Ns - 1;
1155 
1156  copy(m_t4, 0, w, is);
1157 
1158  copy(m_v4, 0, v, is - 1);
1159  mult_gm5_4d(m_w4, m_v4);
1160  axpy(m_v4, real_t(-1.0), m_w4);
1161  axpy(m_t4, real_t(0.5) * m_dm[is - 1], m_v4);
1162 
1163  mult_gm5_4d(m_w4, m_y4);
1164  axpy(m_y4, real_t(1.0), m_w4);
1165  scal(m_y4, real_t(0.5));
1166 
1167  axpy(m_t4, real_t(-1.0), m_y4);
1168 
1169  scal(m_t4, real_t(1.0) / (m_dp[is] + m_g));
1170 
1171  // multiply (alpha * P+ + P-)
1172  fac1 = 0.5 * ( 1.0 + m_alpha);
1173  fac2 = 0.5 * (-1.0 + m_alpha);
1174  if(fac2 != 0.0){
1175  mult_gm5_4d(m_y4, m_t4);
1176  scal(m_t4, fac1);
1177  axpy(m_t4, fac2, m_y4);
1178  }
1179  copy(v, is, m_t4, 0);
1180 
1181 #pragma omp barrier
1182 
1183 }
1184 
1185 //====================================================================
1186 template<typename AFIELD>
1188 {
1189 #pragma omp barrier
1190 
1191  int is = m_Ns - 1;
1192  copy(v, is, w, is);
1193 
1194  copy(m_y4, 0, w, is);
1195  mult_gm5_4d(m_t4, m_y4);
1196  axpy(m_y4, real_t(-1.0), m_t4);
1197  scal(m_y4, real_t(0.5));
1198 
1199 #pragma omp barrier
1200 
1201  for (int is = m_Ns - 2; is >= 0; --is) {
1202  copy(v, is, w, is);
1203 
1204  copy(m_v4, 0, v, is + 1);
1205  mult_gm5_4d(m_t4, m_v4);
1206  axpy(m_v4, real_t(1.0), m_t4);
1207  scal(m_v4, real_t(0.5) * m_dm[is + 1] / m_dp[is]);
1208 
1209  axpy(m_v4, -m_e[is], m_y4);
1210 
1211  axpy(v, is, real_t(1.0), m_v4, 0);
1212 
1213 #pragma omp barrier
1214  }
1215 }
1216 
1217 
1218 //====================================================================
1219 template<typename AFIELD>
1221 {
1222  int Lvol2 = CommonParameters::Lvol() / 2;
1223  double vsite = static_cast<double>(Lvol2);
1224  double vNs = static_cast<double>(m_Ns);
1225 
1226  // double flop_Wilson = m_foprw->flop_count("Meo");
1227  double flop_Wilson = m_foprw->flop_count();
1228 
1229  double axpy1 = static_cast<double>(2 * m_NinF) * vsite;
1230  double scal1 = static_cast<double>(1 * m_NinF) * vsite;
1231 
1232  double flop_Deo = (flop_Wilson + 5.0 * axpy1 + 2.0 * scal1) * vNs;
1233 
1234  double flop_Dee = vNs * (7.0 * axpy1 + scal1);
1235 
1236  double flop_LU_inv =
1237  2.0 * ((3.0 * axpy1 + scal1) * (vNs - 1.0) + axpy1 + 2.0 * scal1);
1238 
1239  double flop = 0.0;
1240  if ((mode == "Meo") || (mode == "Moe")) {
1241  flop = flop_Deo + flop_LU_inv;
1242  } else if ((mode == "Dee_inv") || (mode == "Doo_inv")) {
1243  flop = flop_LU_inv;
1244  } else if ((mode == "Deo") || (mode == "Doe")) {
1245  flop = flop_Deo;
1246  } else if ((mode == "Dee") || (mode == "Doo")) {
1247  flop = flop_Dee;
1248  } else if ((mode == "D") || (mode == "Ddag")) {
1249  flop = 2.0 * (flop_LU_inv + flop_Deo) + vNs * axpy1;
1250  } else if (mode == "DdagD") {
1251  flop = 2.0 * (2.0 * (flop_LU_inv + flop_Deo) + vNs * axpy1);
1252  } else {
1253  vout.crucial(m_vl, "Error at %s: input mode %s is undefined.\n",
1254  class_name.c_str(), mode.c_str());
1255  exit(EXIT_FAILURE);
1256  }
1257 
1258  return flop;
1259 }
1260 
1261 
1262 //============================================================END=====
AFopr_Domainwall_eo::preProp
void preProp(AFIELD &Be, AFIELD &bo, const AFIELD &b)
Definition: afopr_Domainwall_eo-tmpl.h:522
AFopr_Domainwall_eo::Udag_inv
void Udag_inv(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:1116
AFopr_Domainwall_eo::init
void init(const Parameters &params)
initial setup.
Definition: afopr_Domainwall_eo-tmpl.h:27
CommonParameters::Lvol
static long_t Lvol()
Definition: commonParameters.h:95
AFopr_Domainwall_eo::flop_count
double flop_count()
this returns the number of floating point number operations.
Definition: afopr_Domainwall_eo.h:182
AFopr_Domainwall_eo::set_parameters
void set_parameters(const Parameters &params)
sets parameters by a Parameter object: to be implemented in a subclass.
Definition: afopr_Domainwall_eo-tmpl.h:102
AFopr_Domainwall_eo::H
void H(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:627
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
AFopr_Domainwall_eo::D
void D(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:610
AFopr
Definition: afopr.h:48
AFopr_Domainwall_eo::Hdag
void Hdag(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:667
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
Parameters
Class for parameters.
Definition: parameters.h:46
AFopr_Domainwall_eo::D_ee
void D_ee(AFIELD &, const AFIELD &, const int ieo)
Definition: afopr_Domainwall_eo-tmpl.h:892
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
AFopr_Domainwall_eo::mult_R
void mult_R(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:721
Field::nex
int nex() const
Definition: field.h:128
Field::check_size
bool check_size(const int nin, const int nvol, const int nex) const
checking size parameters. [23 May 2016 H.Matsufuru]
Definition: field.h:135
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
aypx
void aypx(const double a, Field &y, const Field &x)
aypx(y, a, x): y := a * y + x
Definition: field.cpp:510
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
AFopr_Domainwall_eo::Ddag_eo
void Ddag_eo(AFIELD &, const AFIELD &, const int ieo)
Definition: afopr_Domainwall_eo-tmpl.h:822
AFopr_Domainwall_eo::DdagD
void DdagD(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:582
AFopr_Domainwall_eo::Ddag
void Ddag(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:647
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:213
AFopr_Domainwall_eo::mult
void mult(AFIELD &v, const AFIELD &w)
multiplies fermion operator to a given field (2nd argument)
Definition: afopr_Domainwall_eo-tmpl.h:392
AFopr_Domainwall_eo::get_parameters
void get_parameters(Parameters &params) const
set parameters of kernel operaotr.
Definition: afopr_Domainwall_eo-tmpl.h:167
Bridge::BridgeIO::paranoiac
void paranoiac(const char *format,...)
Definition: bridgeIO.cpp:300
AFopr_Domainwall_eo
Domain-wall fermion operator with even-odd site index.
Definition: afopr_Domainwall_eo.h:41
AFopr_Domainwall_eo::mult_gm5R
void mult_gm5R(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:738
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
AFopr_Domainwall_eo::Ddag_ee
void Ddag_ee(AFIELD &, const AFIELD &, const int ieo)
Definition: afopr_Domainwall_eo-tmpl.h:953
Parameters::fetch_int_vector
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:429
AFopr_Domainwall_eo::set_precond_parameters
void set_precond_parameters()
set parameters for preconditioning.
Definition: afopr_Domainwall_eo-tmpl.h:269
AFopr_Domainwall_eo::set_coefficients
void set_coefficients(const std::vector< real_t > b, const std::vector< real_t > c)
set coefficients if they depend in s.
Definition: afopr_Domainwall_eo-tmpl.h:307
threadManager.h
AFopr_Domainwall_eo::set_mode
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: afopr_Domainwall_eo-tmpl.h:378
AFopr_Domainwall_eo::mult_gm5
void mult_gm5(AFIELD &v, const AFIELD &w)
multiplies gamma_5 matrix.
Definition: afopr_Domainwall_eo-tmpl.h:689
Parameters::set_int_vector
void set_int_vector(const string &key, const vector< int > &value)
Definition: parameters.cpp:45
real_t
double real_t
Definition: bridgeACC_AField_double.cpp:14
AFopr_Domainwall_eo::Ldag_inv
void Ldag_inv(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:1187
CommonParameters::Nd
static int Nd()
Definition: commonParameters.h:116
AFopr_Domainwall_eo::reverse
void reverse(Field &, const AFIELD &)
reverse AField to Field.
Definition: afopr_Domainwall_eo-tmpl.h:355
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
AFopr_Domainwall_eo::L_inv
void L_inv(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:1014
Parameters::set_int
void set_int(const string &key, const int value)
Definition: parameters.cpp:36
scal
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:262
afopr_Domainwall_eo.h
Parameters::fetch_string
int fetch_string(const string &key, string &value) const
Definition: parameters.cpp:378
Parameters::fetch_double
int fetch_double(const string &key, double &value) const
Definition: parameters.cpp:327
commonParameters.h
Parameters::get_string
string get_string(const string &key) const
Definition: parameters.cpp:221
AFopr_Domainwall_eo::set_kernel_parameters
void set_kernel_parameters(const Parameters &params)
set parameters of kernel operaotr.
Definition: afopr_Domainwall_eo-tmpl.h:252
AFopr_Domainwall_eo::D_eo
void D_eo(AFIELD &, const AFIELD &, const int ieo)
Definition: afopr_Domainwall_eo-tmpl.h:757
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
AFopr_Domainwall_eo::U_inv
void U_inv(AFIELD &, const AFIELD &)
Definition: afopr_Domainwall_eo-tmpl.h:1059
Field
Container of Field-type object.
Definition: field.h:46
communicator.h
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
AFopr_Domainwall_eo::postProp
void postProp(AFIELD &x, const AFIELD &xe, const AFIELD &bo)
Definition: afopr_Domainwall_eo-tmpl.h:549
AFopr_Domainwall_eo::convert
void convert(AFIELD &, const Field &)
convert Field to AField for this class.
Definition: afopr_Domainwall_eo-tmpl.h:332
Parameters::fetch_int
int fetch_int(const string &key, int &value) const
Definition: parameters.cpp:346
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:262
AFopr_Domainwall_eo::mult_gm5_4d
void mult_gm5_4d(AFIELD &v, const AFIELD &w)
Definition: afopr_Domainwall_eo-tmpl.h:712
AFopr_Domainwall_eo::tidyup
void tidyup()
final tidyup.
Definition: afopr_Domainwall_eo-tmpl.h:93
AFopr_Domainwall_eo::mult_dag
void mult_dag(AFIELD &v, const AFIELD &w)
hermitian conjugate of mult(Field&, const Field&).
Definition: afopr_Domainwall_eo-tmpl.h:429
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:572
AFopr_Domainwall_eo::real_t
AFIELD::real_t real_t
Definition: afopr_Domainwall_eo.h:44
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:216
Index_eo_Domainwall
Definition: afopr_Domainwall_eo.h:28