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