Bridge++  Ver.2.1.3
afopr_Clover-tmpl.h
Go to the documentation of this file.
1 
9 template<typename AFIELD>
10 const std::string AFopr_Clover<AFIELD>::class_name
11  = "AFopr_Clover<AFIELD>";
12 
13 //====================================================================
14 namespace{
15  inline void set_kernel_thread(int& ith, int& nth, int& ith_kernel)
16  {
19  ith_kernel = 0;
20  if(nth > 1) ith_kernel = 1;
21  }
22 }
23 //====================================================================
24 template<typename AFIELD>
26 {
28 
29  m_memory_saved = false; // memory not saved
30  //m_memory_saved = true; // memory saved
31  // Cation: set_config() must be called outside OMP parallel region
32 
33  std::string vlevel;
34  if (!params.fetch_string("verbose_level", vlevel)) {
35  m_vl = vout.set_verbose_level(vlevel);
36  } else {
37  m_vl = CommonParameters::Vlevel();
38  }
39 
40  vout.general(m_vl, "%s: construction\n", class_name.c_str());
42 
43  m_Nc = CommonParameters::Nc();
44  m_Nd = CommonParameters::Nd();
45  m_Ndim = CommonParameters::Ndim();
46  m_Nvc = m_Nc * 2;
47  m_Ndf = 2 * m_Nc * m_Nc;
48  m_Ndm2 = m_Nd * m_Nd / 2,
49 
50  m_Nx = CommonParameters::Nx();
51  m_Ny = CommonParameters::Ny();
52  m_Nz = CommonParameters::Nz();
53  m_Nt = CommonParameters::Nt();
54  m_Nst = CommonParameters::Nvol();
55 
56  m_Nsize[0] = m_Nx;
57  m_Nsize[1] = m_Ny;
58  m_Nsize[2] = m_Nz;
59  m_Nsize[3] = m_Nt;
60 
61  // switches for coomunication
62  int req_comm = 0; // 0: communication only if necessary
63  // 1: communication is enforced any time
64  if (!params.fetch_int("require_communication", req_comm)) {
65  vout.general(m_vl, "req_comm = %d (input)\n", req_comm);
66  } else {
67  vout.general(m_vl, "req_comm = %d (default)\n", req_comm);
68  }
69 
70  do_comm_any = 0;
71  for(int mu = 0; mu < m_Ndim; ++mu){
72  do_comm[mu] = 1;
73  if(req_comm == 0 && Communicator::npe(mu) == 1) do_comm[mu] = 0;
74  do_comm_any += do_comm[mu];
75  vout.general("do_comm[%d] = %d\n", mu, do_comm[mu]);
76  }
77 
78  m_Nbdsize.resize(m_Ndim);
79  int Nd2 = m_Nd/2;
80  m_Nbdsize[0] = m_Nvc * Nd2 * ceil_nwp(m_Ny * m_Nz * m_Nt);
81  m_Nbdsize[1] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Nz * m_Nt);
82  m_Nbdsize[2] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Ny * m_Nt);
83  m_Nbdsize[3] = m_Nvc * Nd2 * ceil_nwp(m_Nx * m_Ny * m_Nz);
84 
85  setup_channels();
86 
87  if(!m_memory_saved){
88  m_fopr_ct = new AFopr_CloverTerm<AFIELD>(params);
89  }
90  m_T.reset(m_Ndf, m_Nst, m_Ndm2);
91 
92  // gauge configuration.
93  m_U.reset(m_Ndf, m_Nst, m_Ndim);
94 
95  // working vectors.
96  int NinF = 2 * m_Nc * m_Nd;
97  if(!m_memory_saved) m_v1.reset(NinF, m_Nst, 1);
98  m_v2.reset(NinF, m_Nst, 1);
99 
100  set_parameters(params);
101 
103  vout.detailed(m_vl, "%s: construction finished.\n",
104  class_name.c_str());
105 
106 }
107 
108 //====================================================================
109 template<typename AFIELD>
111 {
112  chsend_up.resize(m_Ndim);
113  chrecv_up.resize(m_Ndim);
114  chsend_dn.resize(m_Ndim);
115  chrecv_dn.resize(m_Ndim);
116 
117  for(int mu = 0; mu < m_Ndim; ++mu){
118 
119  int Nvsize = m_Nbdsize[mu] * sizeof(real_t);
120 
121  chsend_dn[mu].send_init(Nvsize, mu, -1);
122  chsend_up[mu].send_init(Nvsize, mu, 1);
123 #ifdef USE_MPI
124  chrecv_up[mu].recv_init(Nvsize, mu, 1);
125  chrecv_dn[mu].recv_init(Nvsize, mu, -1);
126 #else
127  void* buf_up = (void*)chsend_dn[mu].ptr();
128  chrecv_up[mu].recv_init(Nvsize, mu, 1, buf_up);
129  void* buf_dn = (void*)chsend_up[mu].ptr();
130  chrecv_dn[mu].recv_init(Nvsize, mu, -1, buf_dn);
131 #endif
132 
133  if(do_comm[mu] == 1){
134  chset_send.append(chsend_up[mu]);
135  chset_send.append(chsend_dn[mu]);
136  chset_recv.append(chrecv_up[mu]);
137  chset_recv.append(chrecv_dn[mu]);
138  }
139 
140  // device memory allocation
141 #ifdef USE_MPI
142  real_t* buf_dn1 = (real_t*)chsend_dn[mu].ptr();
143  real_t* buf_dn2 = (real_t*)chrecv_dn[mu].ptr();
144  real_t* buf_up1 = (real_t*)chsend_up[mu].ptr();
145  real_t* buf_up2 = (real_t*)chrecv_up[mu].ptr();
146  BridgeACC::afield_init(buf_dn1, m_Nbdsize[mu]);
147  BridgeACC::afield_init(buf_dn2, m_Nbdsize[mu]);
148  BridgeACC::afield_init(buf_up1, m_Nbdsize[mu]);
149  BridgeACC::afield_init(buf_up2, m_Nbdsize[mu]);
150 #else
151  BridgeACC::afield_init((real_t*)buf_up, m_Nbdsize[mu]);
152  BridgeACC::afield_init((real_t*)buf_dn, m_Nbdsize[mu]);
153 #endif
154 
155  }
156 
157 }
158 
159 //====================================================================
160 template<typename AFIELD>
162 {
164 
165  for(int mu = 0; mu < m_Ndim; ++mu){
166 
167  // openacc device memory clean up
168 #ifdef USE_MPI
169  real_t* buf_dn1 = (real_t*)chsend_dn[mu].ptr();
170  real_t* buf_dn2 = (real_t*)chrecv_dn[mu].ptr();
171  real_t* buf_up1 = (real_t*)chrecv_up[mu].ptr();
172  real_t* buf_up2 = (real_t*)chsend_up[mu].ptr();
173  BridgeACC::afield_tidyup(buf_dn1, m_Nbdsize[mu]);
174  BridgeACC::afield_tidyup(buf_dn2, m_Nbdsize[mu]);
175  BridgeACC::afield_tidyup(buf_up1, m_Nbdsize[mu]);
176  BridgeACC::afield_tidyup(buf_up2, m_Nbdsize[mu]);
177 #else
178  real_t* buf_up = (real_t*)chsend_up[mu].ptr();
179  real_t* buf_dn = (real_t*)chsend_dn[mu].ptr();
180  BridgeACC::afield_tidyup(buf_up, m_Nbdsize[mu]);
181  BridgeACC::afield_tidyup(buf_dn, m_Nbdsize[mu]);
182 #endif
183 
184  }
185 
186  if(!m_memory_saved) delete m_fopr_ct;
187 
188 }
189 
190 //====================================================================
191 template<typename AFIELD>
193 {
194  std::string vlevel;
195  if (!params.fetch_string("verbose_level", vlevel)) {
196  m_vl = vout.set_verbose_level(vlevel);
197  }
198 
199  //- fetch and check input parameters
200  double kappa, cSW;
201  std::vector<int> bc;
202 
203  int err = 0;
204  err += params.fetch_double("hopping_parameter", kappa);
205  err += params.fetch_double("clover_coefficient", cSW);
206 
207  err += params.fetch_int_vector("boundary_condition", bc);
208  if (err) {
209  vout.crucial(m_vl, "Error at %s: input parameter not found.\n",
210  class_name.c_str());
211  exit(EXIT_FAILURE);
212  }
213 
214  //- setting gamma matrix representation
215  std::string repr;
216  err = params.fetch_string("gamma_matrix_type", repr);
217  if(err){
218  vout.general(m_vl, " gamma_matrix_type is not given - set to Dirac\n");
219  m_repr = DIRAC;
220  }else if(repr == "Dirac"){
221  m_repr = DIRAC;
222  }else if(repr == "Chiral"){
223  m_repr = CHIRAL;
224  }else{
225  vout.crucial(m_vl, "Error in %s: irrelevant gamma_matrix_type: %s\n",
226  class_name.c_str(), repr.c_str());
227  exit(EXIT_FAILURE);
228  }
229 
230  set_parameters(real_t(kappa), real_t(cSW), bc);
231 
232  if(!m_memory_saved) m_fopr_ct->set_parameters(params);
233 
234 }
235 
236 //====================================================================
237 template<typename AFIELD>
239  const real_t cSW,
240  const std::vector<int> bc)
241 {
242  assert(bc.size() == m_Ndim);
243 
244 #pragma omp barrier
245 
246  int ith = ThreadManager::get_thread_id();
247 
248  if (ith == 0) {
249  m_CKs = CKs;
250  m_cSW = cSW;
251  m_boundary.resize(m_Ndim);
252  for (int mu = 0; mu < m_Ndim; ++mu) {
253  m_boundary[mu] = bc[mu];
254  }
255 
256  for (int mu = 0; mu < m_Ndim; ++mu) {
257  m_bc[mu] = 1;
258  if(do_comm[mu] > 0){ // do communication
259  if(Communicator::ipe(mu) == 0) m_bc[mu] = m_boundary[mu];
260  m_bc2[mu] = 0;
261  }else{ // no communication
262  m_bc[mu] = 0; // for boundar part (dummy)
263  m_bc2[mu] = m_boundary[mu]; // for bulk part
264  }
265  }
266  }
267 
268  //- print input parameters
269  vout.general(m_vl, "Parameters of %s:\n", class_name.c_str());
270  if(m_repr == DIRAC){
271  vout.general(m_vl, " gamma-matrix type = Dirac\n");
272  }else{
273  vout.general(m_vl, " gamma-matrix type = Chiral\n");
274  }
275  vout.general(m_vl, " kappa = %8.4f\n", m_CKs);
276  vout.general(m_vl, " cSW = %8.4f\n", m_cSW);
277  for (int mu = 0; mu < m_Ndim; ++mu) {
278  vout.general(m_vl, " boundary[%d] = %2d\n", mu, m_boundary[mu]);
279  }
280 
281 #pragma omp barrier
282 }
283 
284 //====================================================================
285 template<typename AFIELD>
287 {
288  params.set_double("hopping_parameter", double(m_CKs));
289  params.set_double("clover_coefficient", double(m_cSW));
290  params.set_int_vector("boundary_condition", m_boundary);
291 
292  std::string repr;
293  if(m_repr == DIRAC) repr = "Dirac";
294  if(m_repr == CHIRAL) repr = "Chiral";
295  params.set_string("gamma_matrix_type", repr);
296 
297  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
298 }
299 
300 //====================================================================
301 template<typename AFIELD>
303 {
304  if(m_memory_saved){
305  set_config_saved(u);
306  }else{
307  int nth = ThreadManager::get_num_threads();
308  if (nth > 1) {
309  set_config_impl(u);
310  } else {
311  set_config_omp(u);
312  }
313  }
314 
315 }
316 //====================================================================
317 template<typename AFIELD>
319 {
320 #pragma omp parallel
321  {
322  set_config_impl(u);
323  }
324 }
325 
326 //====================================================================
327 template<typename AFIELD>
329 {
330 #pragma omp barrier
331 
332  m_timer.reset();
333  m_timer.start();
334 
335  vout.detailed(m_vl, "%s: set_config start\n", class_name.c_str());
336 
337  m_conf = u;
338 
340 
341  convert_gauge(index_lex, m_U, *u);
342 
343  m_timer.stop();
344  double elapsed_time1 = m_timer.elapsed_sec();
345  vout.detailed(m_vl, " convert_gauge: %10.6f [sec]\n", elapsed_time1);
346 
347  m_timer.reset();
348  m_timer.start();
349 
351  m_fopr_ct->set_config(u);
353 
354  m_timer.stop();
355  double elapsed_time2 = m_timer.elapsed_sec();
356  vout.detailed(m_vl, " ct set_config: %10.6f [sec]\n", elapsed_time2);
357 
358  m_timer.reset();
359  m_timer.start();
360 
361  m_fopr_ct->get_csw(m_T);
362 
363  m_timer.stop();
364  double elapsed_time3 = m_timer.elapsed_sec();
365  vout.detailed(m_vl, " set_csw: %10.6f [sec]\n", elapsed_time3);
366 
367  double elapsed_time = elapsed_time1 + elapsed_time2 + elapsed_time3;
368  vout.detailed(m_vl, "%s: set_config finished in %10.6f [sec]\n",
369  class_name.c_str(), elapsed_time);
370 
371 #pragma omp barrier
372 }
373 
374 //====================================================================
375 template<typename AFIELD>
377 {
379  vout.crucial(m_vl, "%s: set_config_saved start\n", class_name.c_str());
380 
381  m_timer.reset();
382  m_timer.start();
383 
384  vout.general(m_vl, "%s: set_config start\n", class_name.c_str());
385 
386  m_conf = u;
387 
389 
390 #pragma omp parallel
391  {
392  convert_gauge(index_lex, m_U, *u);
393  }
394 
395  m_timer.stop();
396  double elapsed_time1 = m_timer.elapsed_sec();
397  vout.general(m_vl, " convert_gauge: %10.6f [sec]\n", elapsed_time1);
398 
399  m_timer.reset();
400  m_timer.start();
401 
403 
404  Parameters params;
405  get_parameters(params);
406  m_fopr_ct = new AFopr_CloverTerm<AFIELD>(params);
407 
408  m_fopr_ct->set_config(u);
409 
411 
412  m_timer.stop();
413  double elapsed_time2 = m_timer.elapsed_sec();
414  vout.general(m_vl, " ct set_config: %10.6f [sec]\n", elapsed_time2);
415 
416  m_timer.reset();
417  m_timer.start();
418 
419  m_fopr_ct->get_csw(m_T);
420 
421  delete m_fopr_ct;
422 
423  m_timer.stop();
424  double elapsed_time3 = m_timer.elapsed_sec();
425  vout.general(m_vl, " set_csw: %10.6f [sec]\n", elapsed_time3);
426 
427  double elapsed_time = elapsed_time1 + elapsed_time2 + elapsed_time3;
428  vout.general(m_vl, "%s: set_config finished in %10.6f [sec]\n",
429  class_name.c_str(), elapsed_time);
430 
431 }
432 
433 //====================================================================
434 template<typename AFIELD>
435 void AFopr_Clover<AFIELD>::set_mode(std::string mode)
436 {
437 #pragma omp barrier
438 
439  int ith = ThreadManager::get_thread_id();
440  if (ith == 0) m_mode = mode;
441 
442 #pragma omp barrier
443 }
444 
445 //====================================================================
446 template<typename AFIELD>
448 {
449  return m_mode;
450 }
451 
452 //====================================================================
453 template<typename AFIELD>
455 {
456  if(m_mode == "D") {
457  D(v, w);
458  // D_alt(v, w);
459  }else if(m_mode == "DdagD") {
460  DdagD(v, w);
461  }else if(m_mode == "Ddag") {
462  Ddag(v, w);
463  }else if(m_mode == "H") {
464  H(v, w);
465  }else{
466  vout.crucial(m_vl, "%s: mode undefined.\n", class_name.c_str());
467  exit(EXIT_FAILURE);
468  }
469 
470 }
471 
472 //====================================================================
473 template<typename AFIELD>
475  const AFIELD &w)
476 {
477  if(m_mode == "D"){
478  Ddag(v, w);
479  }else if(m_mode == "DdagD"){
480  DdagD(v, w);
481  }else if(m_mode == "Ddag"){
482  D(v, w);
483  }else if(m_mode == "H"){
484  H(v, w);
485  }else{
486  vout.crucial(m_vl, "%s: mode undefined.\n", class_name.c_str());
487  exit(EXIT_FAILURE);
488  }
489 
490 }
491 
492 //====================================================================
493 template<typename AFIELD>
495  const std::string mode)
496 {
497  if(mode == "D"){
498  D(v, w);
499  }else if(mode == "Ddag"){
500  Ddag(v, w);
501  }else if(mode == "DdagD"){
502  DdagD(v, w);
503  }else if(mode == "H"){
504  H(v, w);
505  }else{
506  vout.crucial(m_vl, "%s: illegal mode is given to mult with mode\n",
507  class_name.c_str());
508  exit(EXIT_FAILURE);
509  }
510 
511 }
512 
513 //====================================================================
514 template<typename AFIELD>
516  const std::string mode)
517 {
518  if(mode == "D"){
519  Ddag(v, w);
520  }else if(mode == "Ddag"){
521  D(v, w);
522  }else if(mode == "DdagD"){
523  DdagD(v, w);
524  }else if(mode == "H"){
525  H(v, w);
526  }else{
527  vout.crucial(m_vl, "%s: illegal mode is given to mult with mode\n",
528  class_name.c_str());
529  exit(EXIT_FAILURE);
530  }
531 
532 }
533 
534 //====================================================================
535 template<typename AFIELD>
537 {
538 #pragma omp barrier
539 
540  real_t* vp = v.ptr(0);
541  real_t* wp = const_cast<AFIELD*>(&w)->ptr(0);
542 
543  int ith, nth;
544  set_thread(ith, nth);
545 
546  if(ith == 0){
547  if(m_repr == DIRAC){
548  BridgeACC::mult_wilson_gm5_dirac(vp, wp, m_Nsize, NC);
549  }else{
550  BridgeACC::mult_wilson_gm5_chiral(vp, wp, m_Nsize, NC);
551  }
552  }
553 
554 #pragma omp barrier
555 
556 }
557 
558 //====================================================================
559 template<typename AFIELD>
560 void AFopr_Clover<AFIELD>::mult_up(int mu, AFIELD &v, const AFIELD &w)
561 {
562  real_t *vp = v.ptr(0);
563  real_t *wp = const_cast<AFIELD*>(&w)->ptr(0);
564 
565  if(mu == 0){
566  mult_xp(vp, wp);
567  }else if(mu == 1){
568  mult_yp(vp, wp);
569  }else if(mu == 2){
570  mult_zp(vp, wp);
571  }else if(mu == 3){
572  mult_tp(vp, wp);
573  }else{
574  vout.crucial(m_vl, "%s: mult_up for %d direction is undefined.",
575  class_name.c_str(), mu);
576  exit(EXIT_FAILURE);
577  }
578 
579 }
580 
581 //====================================================================
582 template<typename AFIELD>
583 void AFopr_Clover<AFIELD>::mult_dn(int mu, AFIELD &v, const AFIELD &w)
584 {
585  real_t *vp = v.ptr(0);
586  real_t *wp = const_cast<AFIELD*>(&w)->ptr(0);
587 
588  if(mu == 0){
589  mult_xm(vp, wp);
590  }else if(mu == 1){
591  mult_ym(vp, wp);
592  }else if(mu == 2){
593  mult_zm(vp, wp);
594  }else if(mu == 3){
595  mult_tm(vp, wp);
596  }else{
597  vout.crucial(m_vl, "%s: mult_dn for %d direction is undefined.",
598  class_name.c_str(), mu);
599  exit(EXIT_FAILURE);
600  }
601 
602 }
603 
604 //====================================================================
605 template<typename AFIELD>
607 {
608  mult_DorH(m_v2, w, 1); // H
609  mult_DorH(v, m_v2, 1); // H
610 
611  // D(m_v2, w);
612  // mult_gm5(v, m_v2);
613  // D(m_v2, v);
614  // mult_gm5(v, m_v2);
615 
616 }
617 
618 //====================================================================
619 template<typename AFIELD>
621 {
622  mult_gm5(m_v2, w);
623  mult_DorH(v, m_v2, 1); // H
624 
625  // mult_gm5(v, w);
626  // D(m_v2, v);
627  // mult_gm5(v, m_v2);
628 }
629 
630 //====================================================================
631 template<typename AFIELD>
633 {
634  if(m_memory_saved){
635 
636  vout.detailed("%s: D_alt is not available in memory saved mode\n",
637  class_name.c_str());
638  exit(EXIT_FAILURE);
639 
640  }else{
641 
642 #pragma omp barrier
643  real_t *vp = v.ptr(0);
644  real_t *xp = m_v1.ptr(0);
645  real_t *wp = const_cast<AFIELD*>(&w)->ptr(0);
646 
647  m_v1.set(real_t(0.0));
648  mult_xp(xp, wp);
649  mult_xm(xp, wp);
650  mult_yp(xp, wp);
651  mult_ym(xp, wp);
652  mult_zp(xp, wp);
653  mult_zm(xp, wp);
654  mult_tp(xp, wp);
655  mult_tm(xp, wp);
656 
657  m_fopr_ct->mult_csw(v, w);
658 
659  axpy(v, -m_CKs, m_v1);
660 #pragma omp barrier
661 
662  }
663 
664 }
665 
666 //====================================================================
667 template<typename AFIELD>
669 {
670  mult_DorH(v, w, 0);
671 }
672 
673 //====================================================================
674 template<typename AFIELD>
676 {
677  mult_DorH(v, w, 1);
678  // D(m_v2, w);
679  // mult_gm5(v, m_v2);
680 }
681 
682 //====================================================================
683 template<typename AFIELD>
685 {
686  D_alt(m_v2, w);
687  mult_gm5(v, m_v2);
688 }
689 
690 //====================================================================
691 template<typename AFIELD>
693  const int flag)
694 {
695 #pragma omp barrier
696 
697  int ith, nth, ith_kernel;
698  set_kernel_thread(ith, nth, ith_kernel);
699 
700  real_t *v2 = v.ptr(0);
701  real_t *v1 = const_cast<AFIELD*>(&w)->ptr(0);
702  real_t *u = m_U.ptr(0);
703  real_t *csw = m_T.ptr(0);
704 
705  if (do_comm_any > 0 && ith == ith_kernel){
706 
707  real_t *buf1xp = (real_t*)chsend_dn[0].ptr();
708  real_t *buf1xm = (real_t*)chsend_up[0].ptr();
709  real_t *buf1yp = (real_t*)chsend_dn[1].ptr();
710  real_t *buf1ym = (real_t*)chsend_up[1].ptr();
711  real_t *buf1zp = (real_t*)chsend_dn[2].ptr();
712  real_t *buf1zm = (real_t*)chsend_up[2].ptr();
713  real_t *buf1tp = (real_t*)chsend_dn[3].ptr();
714  real_t *buf1tm = (real_t*)chsend_up[3].ptr();
715 
716  if(m_repr == DIRAC){
718  buf1xp, buf1xm, buf1yp, buf1ym,
719  buf1zp, buf1zm, buf1tp, buf1tm,
720  u, v1, m_Nsize, m_bc, do_comm);
721  }else{
723  buf1xp, buf1xm, buf1yp, buf1ym,
724  buf1zp, buf1zm, buf1tp, buf1tm,
725  u, v1, m_Nsize, m_bc, do_comm);
726  }
727  }
728 #pragma omp barrier
729 
730  if(do_comm_any > 0 && ith == 0){
731  chset_recv.start();
732  chset_send.start();
733  }
734 
735  // bulk part
736  if (ith == ith_kernel){
737  if(m_repr == DIRAC){
738  BridgeACC::mult_clover_D_dirac(v2, u, csw, v1,
739  m_CKs, m_Nsize, m_bc2, flag);
740  // BridgeACC::mult_clover_D_dirac(v2, u, csw, v1, m_Nsize, m_bc2, m_CKs);
741  }else{
742  BridgeACC::mult_clover_D_chiral(v2, u, csw, v1,
743  m_CKs, m_Nsize, m_bc2, flag);
744  // BridgeACC::mult_clover_D_chiral(v2, u, csw, v1, m_Nsize, m_bc2, m_CKs);
745  }
746  }
747 
748  if(do_comm_any > 0 && ith == 0){
749  chset_send.wait();
750  chset_recv.wait();
751  }
752 #pragma omp barrier
753 
754  if(do_comm_any > 0 && ith == ith_kernel){
755 
756  real_t *buf2xp = (real_t*)chrecv_up[0].ptr();
757  real_t *buf2xm = (real_t*)chrecv_dn[0].ptr();
758  real_t *buf2yp = (real_t*)chrecv_up[1].ptr();
759  real_t *buf2ym = (real_t*)chrecv_dn[1].ptr();
760  real_t *buf2zp = (real_t*)chrecv_up[2].ptr();
761  real_t *buf2zm = (real_t*)chrecv_dn[2].ptr();
762  real_t *buf2tp = (real_t*)chrecv_up[3].ptr();
763  real_t *buf2tm = (real_t*)chrecv_dn[3].ptr();
764 
765  if(m_repr == DIRAC){
767  buf2xp, buf2xm, buf2yp, buf2ym,
768  buf2zp, buf2zm, buf2tp, buf2tm,
769  m_CKs, m_Nsize, m_bc, do_comm, flag);
770  }else{
772  buf2xp, buf2xm, buf2yp, buf2ym,
773  buf2zp, buf2zm, buf2tp, buf2tm,
774  m_CKs, m_Nsize, m_bc, do_comm, flag);
775  }
776 
777  }
778 #pragma omp barrier
779 
780 }
781 
782 //====================================================================
783 template<typename AFIELD>
785 {
786 #pragma omp barrier
787 
788  int idir = 0;
789 
791 
792  real_t *buf1 = (real_t*)chsend_dn[idir].ptr();
793  real_t *buf2 = (real_t*)chrecv_up[idir].ptr();
794  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
795 
796  int ith, nth, ith_kernel;
797  set_kernel_thread(ith, nth, ith_kernel);
798 
799  if(do_comm[idir] > 0 && ith == ith_kernel){
800  BridgeACC::mult_wilson_xp1(buf1, v1, m_Nsize, m_bc, NC);
801  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
802  }
803 
804 #pragma omp barrier
805 
806  if(do_comm[idir] > 0 && ith == 0){
807  chrecv_up[idir].start();
808  chsend_dn[idir].start();
809  }
810 
811  // bulk part
812  if(ith == ith_kernel){
813  BridgeACC::mult_wilson_xpb(v2, u, v1, m_Nsize, m_bc2, NC);
814  }
815 
816  if(do_comm[idir] > 0 && ith == 0){
817  chsend_dn[idir].wait();
818  chrecv_up[idir].wait();
819  }
820 
821 #pragma omp barrier
822 
823  if(do_comm[idir] > 0 && ith == ith_kernel){
824  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
825  BridgeACC::mult_wilson_xp2(v2, u, buf2, m_Nsize, m_bc, NC);
826  }
827 
828 #pragma omp barrier
829 
830 }
831 
832 //====================================================================
833 template<typename AFIELD>
835 {
836 #pragma omp barrier
837 
838  int idir = 0;
839 
841 
842  real_t *buf1 = (real_t*)chsend_up[idir].ptr();
843  real_t *buf2 = (real_t*)chrecv_dn[idir].ptr();
844  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
845 
846  int ith, nth, ith_kernel;
847  set_kernel_thread(ith, nth, ith_kernel);
848 
849  if(do_comm[idir] > 0 && ith == ith_kernel){
850  BridgeACC::mult_wilson_xm1(buf1, u, v1, m_Nsize, m_bc, NC);
851  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
852  }
853 
854 #pragma omp barrier
855 
856  if(do_comm[idir] > 0 && ith == 0){
857  chrecv_dn[idir].start();
858  chsend_up[idir].start();
859  }
860 
861  // bulk part
862  if(ith == ith_kernel){
863  BridgeACC::mult_wilson_xmb(v2, u, v1, m_Nsize, m_bc2, NC);
864  }
865 
866  if(do_comm[idir] > 0 && ith == 0){
867  chsend_up[idir].wait();
868  chrecv_dn[idir].wait();
869  }
870 
871 #pragma omp barrier
872 
873  if(do_comm[idir] > 0 && ith == ith_kernel){
874  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
875  BridgeACC::mult_wilson_xm2(v2, buf2, m_Nsize, m_bc, NC);
876  }
877 
878 #pragma omp barrier
879 
880 }
881 
882 //====================================================================
883 template<typename AFIELD>
885 {
886 #pragma omp barrier
887 
888  int idir = 1;
889 
891 
892  real_t *buf1 = (real_t*)chsend_dn[idir].ptr();
893  real_t *buf2 = (real_t*)chrecv_up[idir].ptr();
894  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
895 
896  int ith, nth, ith_kernel;
897  set_kernel_thread(ith, nth, ith_kernel);
898 
899  if(do_comm[idir] > 0 && ith == ith_kernel){
900  BridgeACC::mult_wilson_yp1(buf1, v1, m_Nsize, m_bc, NC);
901  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
902  }
903 
904 #pragma omp barrier
905 
906  if(do_comm[idir] > 0 && ith == 0){
907  chrecv_up[idir].start();
908  chsend_dn[idir].start();
909  }
910 
911  // bulk part
912  if(ith == ith_kernel){
913  BridgeACC::mult_wilson_ypb(v2, u, v1, m_Nsize, m_bc2, NC);
914  }
915 
916  if(do_comm[idir] > 0 && ith == 0){
917  chsend_dn[idir].wait();
918  chrecv_up[idir].wait();
919  }
920 #pragma omp barrier
921 
922  if(do_comm[idir] > 0 && ith == ith_kernel){
923  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
924  BridgeACC::mult_wilson_yp2(v2, u, buf2, m_Nsize, m_bc, NC);
925  }
926 
927 #pragma omp barrier
928 
929 }
930 
931 //====================================================================
932 template<typename AFIELD>
934 {
935 #pragma omp barrier
936 
937  int idir = 1;
938 
940 
941  real_t *buf1 = (real_t*)chsend_up[idir].ptr();
942  real_t *buf2 = (real_t*)chrecv_dn[idir].ptr();
943  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
944 
945  int ith, nth, ith_kernel;
946  set_kernel_thread(ith, nth, ith_kernel);
947 
948  if(do_comm[idir] > 0 && ith == ith_kernel){
949  BridgeACC::mult_wilson_ym1(buf1, u, v1, m_Nsize, m_bc, NC);
950  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
951  }
952 
953 #pragma omp barrier
954 
955  if(do_comm[idir] > 0 && ith == 0){
956  chrecv_dn[idir].start();
957  chsend_up[idir].start();
958  }
959 
960  // bulk part
961  if(ith == ith_kernel){
962  BridgeACC::mult_wilson_ymb(v2, u, v1, m_Nsize, m_bc2, NC);
963  }
964 
965  if(do_comm[idir] > 0 && ith == 0){
966  chsend_up[idir].wait();
967  chrecv_dn[idir].wait();
968  }
969 
970 #pragma omp barrier
971 
972  if(do_comm[idir] > 0 && ith == ith_kernel){
973  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
974  BridgeACC::mult_wilson_ym2(v2, buf2, m_Nsize, m_bc, NC);
975  }
976 
977 #pragma omp barrier
978 
979 }
980 
981 //====================================================================
982 template<typename AFIELD>
984 {
985 #pragma omp barrier
986 
987  int idir = 2;
988 
990 
991  real_t *buf1 = (real_t*)chsend_dn[idir].ptr();
992  real_t *buf2 = (real_t*)chrecv_up[idir].ptr();
993  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
994 
995  int ith, nth, ith_kernel;
996  set_kernel_thread(ith, nth, ith_kernel);
997 
998  if(do_comm[idir] > 0 && ith == ith_kernel){
999  BridgeACC::mult_wilson_zp1(buf1, v1, m_Nsize, m_bc, NC);
1000  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
1001  }
1002 
1003 #pragma omp barrier
1004 
1005  if(do_comm[idir] > 0 && ith == 0){
1006  chrecv_up[idir].start();
1007  chsend_dn[idir].start();
1008  }
1009 
1010  // bulk part
1011  if(ith == ith_kernel){
1012  BridgeACC::mult_wilson_zpb(v2, u, v1, m_Nsize, m_bc2, NC);
1013  }
1014 
1015  if(do_comm[idir] > 0 && ith == 0){
1016  chsend_dn[idir].wait();
1017  chrecv_up[idir].wait();
1018  }
1019 
1020 #pragma omp barrier
1021 
1022  if(do_comm[idir] > 0 && ith == ith_kernel){
1023  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
1024  BridgeACC::mult_wilson_zp2(v2, u, buf2, m_Nsize, m_bc, NC);
1025  }
1026 
1027 #pragma omp barrier
1028 
1029 }
1030 
1031 //====================================================================
1032 template<typename AFIELD>
1034 {
1035 #pragma omp barrier
1036 
1037  int idir = 2;
1038 
1040 
1041  real_t *buf1 = (real_t*)chsend_up[idir].ptr();
1042  real_t *buf2 = (real_t*)chrecv_dn[idir].ptr();
1043  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
1044 
1045  int ith, nth, ith_kernel;
1046  set_kernel_thread(ith, nth, ith_kernel);
1047 
1048  if(do_comm[idir] > 0 && ith == ith_kernel){
1049  BridgeACC::mult_wilson_zm1(buf1, u, v1, m_Nsize, m_bc, NC);
1050  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
1051  }
1052 #pragma omp barrier
1053 
1054  if(do_comm[idir] > 0 && ith == 0){
1055  chrecv_dn[idir].start();
1056  chsend_up[idir].start();
1057  }
1058 
1059  // bulk part
1060  if(ith == ith_kernel){
1061  BridgeACC::mult_wilson_zmb(v2, u, v1, m_Nsize, m_bc2, NC);
1062  }
1063 
1064  if(do_comm[idir] > 0 && ith == 0){
1065  chsend_up[idir].wait();
1066  chrecv_dn[idir].wait();
1067  }
1068 
1069 #pragma omp barrier
1070 
1071  if(do_comm[idir] > 0 && ith == ith_kernel){
1072  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
1073  BridgeACC::mult_wilson_zm2(v2, buf2, m_Nsize, m_bc, NC);
1074  }
1075 
1076 #pragma omp barrier
1077 
1078 }
1079 
1080 //====================================================================
1081 template<typename AFIELD>
1083 {
1084 #pragma omp barrier
1085 
1086  int idir = 3;
1087 
1089 
1090  real_t *buf1 = (real_t*)chsend_dn[idir].ptr();
1091  real_t *buf2 = (real_t*)chrecv_up[idir].ptr();
1092  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
1093 
1094  int ith, nth, ith_kernel;
1095  set_kernel_thread(ith, nth, ith_kernel);
1096 
1097  if(do_comm[idir] > 0 && ith == ith_kernel){
1098  if(m_repr == DIRAC){
1099  BridgeACC::mult_wilson_tp1_dirac(buf1, v1, m_Nsize, m_bc, NC);
1100  }else{
1101  BridgeACC::mult_wilson_tp1_chiral(buf1, v1, m_Nsize, m_bc, NC);
1102  }
1103  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
1104  }
1105 
1106 #pragma omp barrier
1107 
1108  if(do_comm[idir] > 0 && ith == 0){
1109  chrecv_up[idir].start();
1110  chsend_dn[idir].start();
1111  }
1112 
1113  // bulk part
1114  if(ith == ith_kernel){
1115  if(m_repr == DIRAC){
1116  BridgeACC::mult_wilson_tpb_dirac(v2, u, v1, m_Nsize, m_bc2, NC);
1117  }else{
1118  BridgeACC::mult_wilson_tpb_chiral(v2, u, v1, m_Nsize, m_bc2, NC);
1119  }
1120  }
1121 
1122  if(do_comm[idir] > 0 && ith == 0){
1123  chsend_dn[idir].wait();
1124  chrecv_up[idir].wait();
1125  }
1126 
1127 #pragma omp barrier
1128 
1129  if(do_comm[idir] > 0 && ith == ith_kernel){
1130  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
1131  if(m_repr == DIRAC){
1132  BridgeACC::mult_wilson_tp2_dirac(v2, u, buf2, m_Nsize, m_bc, NC);
1133  }else{
1134  BridgeACC::mult_wilson_tp2_chiral(v2, u, buf2, m_Nsize, m_bc, NC);
1135  }
1136  }
1137 
1138 #pragma omp barrier
1139 
1140 }
1141 
1142 //====================================================================
1143 template<typename AFIELD>
1145 {
1146 #pragma omp barrier
1147 
1148  int idir = 3;
1149 
1150  int ith, nth, ith_kernel;
1151  set_kernel_thread(ith, nth, ith_kernel);
1152 
1154 
1155  real_t *buf1 = (real_t*)chsend_up[idir].ptr();
1156  real_t *buf2 = (real_t*)chrecv_dn[idir].ptr();
1157  real_t *u = m_U.ptr(index_lex.idx_G(0, 0, idir));
1158 
1159  if(do_comm[idir] > 0 && ith == ith_kernel){
1160  if(m_repr == DIRAC){
1161  BridgeACC::mult_wilson_tm1_dirac(buf1, u, v1, m_Nsize, m_bc, NC);
1162  }else{
1163  BridgeACC::mult_wilson_tm1_chiral(buf1, u, v1, m_Nsize, m_bc, NC);
1164  }
1165  BridgeACC::copy_from_device(buf1, m_Nbdsize[idir]);
1166  }
1167 
1168 #pragma omp barrier
1169 
1170  if(do_comm[idir] > 0 && ith == 0){
1171  chrecv_dn[idir].start();
1172  chsend_up[idir].start();
1173  }
1174 
1175  // bulk part
1176  if(ith == ith_kernel){
1177  if(m_repr == DIRAC){
1178  BridgeACC::mult_wilson_tmb_dirac(v2, u, v1, m_Nsize, m_bc2, NC);
1179  }else{
1180  BridgeACC::mult_wilson_tmb_chiral(v2, u, v1, m_Nsize, m_bc2, NC);
1181  }
1182  }
1183 
1184  if(do_comm[idir] > 0 && ith == 0){
1185  chsend_up[idir].wait();
1186  chrecv_dn[idir].wait();
1187  }
1188 
1189 #pragma omp barrier
1190 
1191  if(do_comm[idir] > 0 && ith == ith_kernel){
1192  BridgeACC::copy_to_device(buf2, m_Nbdsize[idir]);
1193  if(m_repr == DIRAC){
1194  BridgeACC::mult_wilson_tm2_dirac(v2, buf2, m_Nsize, m_bc, NC);
1195  }else{
1196  BridgeACC::mult_wilson_tm2_chiral(v2, buf2, m_Nsize, m_bc, NC);
1197  }
1198  }
1199 
1200 #pragma omp barrier
1201 
1202 }
1203 
1204 //====================================================================
1205 template<typename AFIELD>
1207 {
1208  // The following counting explicitly depends on the implementation.
1209  // It will be recalculated when the code is modified.
1210  // The present counting is based on rev.1107. [24 Aug 2014 H.Matsufuru]
1211 
1212  int Lvol = CommonParameters::Lvol();
1213  double flop_site, flop;
1214 
1215  if (m_repr == DIRAC) {
1216  flop_site = static_cast<double>(
1217  m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1))
1218  + 8 * m_Nc * m_Nc * m_Nd * m_Nd); // <- clover term
1219  } else if (m_repr == CHIRAL) {
1220  flop_site = static_cast<double>(
1221  m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2))
1222  + 8 * m_Nc * m_Nc * m_Nd * m_Nd); // <- clover term
1223  } else {
1224  vout.crucial(m_vl, "%s: input repr is undefined.\n",
1225  class_name.c_str());
1226  abort();
1227  }
1228 
1229  flop = flop_site * static_cast<double>(Lvol);
1230  if ((m_mode == "DdagD") || (m_mode == "DDdag")) flop *= 2.0;
1231 
1232  return flop;
1233 }
1234 
1235 //============================================================END=====
CommonParameters::Ny
static int Ny()
Definition: commonParameters.h:106
AFopr_Clover::mult_dag
void mult_dag(AFIELD &, const AFIELD &)
hermitian conjugate of mult.
Definition: afopr_Clover-tmpl.h:474
BridgeACC::mult_wilson_tmb_chiral
void mult_wilson_tmb_chiral(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1956
CommonParameters::Nz
static int Nz()
Definition: commonParameters.h:107
CommonParameters::Lvol
static long_t Lvol()
Definition: commonParameters.h:95
convert_gauge
void convert_gauge(INDEX &index, AFIELD &v, const Field &w)
Definition: afield-inc.h:223
BridgeACC::mult_wilson_yp2
void mult_wilson_yp2(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:467
BridgeACC::mult_wilson_gm5_chiral
void mult_wilson_gm5_chiral(double *RESTRICT v2, double *RESTRICT v1, int *Nsize, int Nc)
Definition: mult_Wilson_openacc-inc.h:49
AFopr_Clover::H_alt
void H_alt(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:684
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
AFopr_Clover::flop_count
double flop_count()
returns floating operation counts.
Definition: afopr_Clover-tmpl.h:1206
ThreadManager::get_num_threads
static int get_num_threads()
returns available number of threads.
Definition: threadManager.cpp:246
CommonParameters::Ndim
static int Ndim()
Definition: commonParameters.h:117
BridgeACC::afield_tidyup
void afield_tidyup(double *data, const int size)
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
AIndex_lex
Definition: aindex_lex_base.h:17
BridgeACC::mult_wilson_xpb
void mult_wilson_xpb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:130
Parameters::set_double
void set_double(const string &key, const double value)
Definition: parameters.cpp:33
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.cpp:518
AFopr_Clover::Ddag
void Ddag(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:620
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.cpp:508
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:281
BridgeACC::mult_wilson_xm2
void mult_wilson_xm2(double *RESTRICT v2, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:282
AFopr_CloverTerm
Definition: afopr_CloverTerm.h:31
BridgeACC::mult_wilson_gm5_dirac
void mult_wilson_gm5_dirac(double *RESTRICT v2, double *RESTRICT v1, int *Nsize, int Nc)
Definition: mult_Wilson_openacc-inc.h:22
CommonParameters::Nvol
static int Nvol()
Definition: commonParameters.h:109
AFopr_Clover::setup_channels
void setup_channels()
setup channels for communication.
Definition: afopr_Clover-tmpl.h:110
AFopr_Clover::D
void D(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:668
BridgeACC::mult_wilson_yp1
void mult_wilson_yp1(double *RESTRICT buf, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:414
AFopr_Clover::mult_up
virtual void mult_up(int mu, AFIELD &, const AFIELD &)
upward nearest neighbor hopping term.
Definition: afopr_Clover-tmpl.h:560
AFopr_Clover::mult_xm
void mult_xm(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:834
BridgeACC::mult_wilson_1_dirac
void mult_wilson_1_dirac(double *RESTRICT buf_xp, double *RESTRICT buf_xm, double *RESTRICT buf_yp, double *RESTRICT buf_ym, double *RESTRICT buf_zp, double *RESTRICT buf_zm, double *RESTRICT buf_tp, double *RESTRICT buf_tm, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int *do_comm)
Definition: mult_Wilson_openacc-inc.h:299
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:381
BridgeACC::copy_from_device
void copy_from_device(double *v, int nv)
BridgeACC::mult_wilson_zp1
void mult_wilson_zp1(double *RESTRICT buf, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:836
AFopr_Clover::set_config_omp
void set_config_omp(Field *u)
set_config implementation
Definition: afopr_Clover-tmpl.h:318
AFopr_Clover::D_alt
void D_alt(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:632
BridgeACC::mult_wilson_tp2_dirac
void mult_wilson_tp2_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1311
AFopr_Clover::mult_DorH
void mult_DorH(AFIELD &v, const AFIELD &w, const int flag)
mult implementation
Definition: afopr_Clover-tmpl.h:692
BridgeACC::mult_wilson_tm2_dirac
void mult_wilson_tm2_dirac(double *RESTRICT v2, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1522
BridgeACC::mult_wilson_tm2_chiral
void mult_wilson_tm2_chiral(double *RESTRICT v2, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1905
CommonParameters::Nx
static int Nx()
Definition: commonParameters.h:105
AFopr_Clover::real_t
AFIELD::real_t real_t
Definition: afopr_Clover.h:34
AFopr_Clover::get_mode
std::string get_mode() const
returns mult mode.
Definition: afopr_Clover-tmpl.h:447
BridgeACC::mult_wilson_tmb_dirac
void mult_wilson_tmb_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1569
BridgeACC::mult_wilson_xmb
void mult_wilson_xmb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:334
idir
idir
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:264
AFopr_Clover::mult_zp
void mult_zp(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:983
AFopr_Clover::mult_gm5
void mult_gm5(AFIELD &, const AFIELD &)
multiplies gamma_5 matrix.
Definition: afopr_Clover-tmpl.h:536
AFopr_Clover::set_mode
void set_mode(std::string mode)
setting mult mode.
Definition: afopr_Clover-tmpl.h:435
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
BridgeACC::mult_wilson_tp2_chiral
void mult_wilson_tp2_chiral(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1693
NC
#define NC
Definition: field_F_imp_SU2-inc.h:15
BridgeACC::mult_wilson_xm1
void mult_wilson_xm1(double *RESTRICT buf, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:209
AFopr_Clover::init
void init(const Parameters &params)
initial setup.
Definition: afopr_Clover-tmpl.h:25
BridgeACC::mult_wilson_ym2
void mult_wilson_ym2(double *RESTRICT v2, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:696
BridgeACC::mult_wilson_2_chiral
void mult_wilson_2_chiral(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf_xp, double *RESTRICT buf_xm, double *RESTRICT buf_yp, double *RESTRICT buf_ym, double *RESTRICT buf_zp, double *RESTRICT buf_zm, double *RESTRICT buf_tp, double *RESTRICT buf_tm, double kappa, int *Nsize, int *bc, int *do_comm, int flag)
Definition: mult_Wilson_openacc-inc.h:722
BridgeACC::mult_wilson_zpb
void mult_wilson_zpb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:962
CommonParameters::Nt
static int Nt()
Definition: commonParameters.h:108
BridgeACC::mult_wilson_tpb_dirac
void mult_wilson_tpb_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1373
Parameters::fetch_int_vector
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:429
Communicator::npe
static int npe(const int dir)
logical grid extent
Definition: communicator.cpp:112
AFopr_Clover::mult_xp
void mult_xp(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:784
AFopr_Clover::mult_ym
void mult_ym(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:933
AFopr_Clover::set_parameters
void set_parameters(const Parameters &params)
setting parameters by a Parameter object.
Definition: afopr_Clover-tmpl.h:192
BridgeACC::mult_wilson_tm1_dirac
void mult_wilson_tm1_dirac(double *RESTRICT buf, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1450
BridgeACC::mult_wilson_zmb
void mult_wilson_zmb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1177
BridgeACC::mult_wilson_tp1_dirac
void mult_wilson_tp1_dirac(double *RESTRICT buf, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1261
AFopr_Clover::tidyup
void tidyup()
final tidy-up.
Definition: afopr_Clover-tmpl.h:161
Parameters::set_int_vector
void set_int_vector(const string &key, const vector< int > &value)
Definition: parameters.cpp:45
AFopr_Clover::mult_tp
void mult_tp(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:1082
BridgeACC::mult_wilson_xp2
void mult_wilson_xp2(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:64
real_t
double real_t
Definition: bridgeACC_AField_double.cpp:14
BridgeACC::mult_wilson_ypb
void mult_wilson_ypb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:537
AFopr_Clover::H
void H(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:675
AFopr_Clover::set_config_saved
void set_config_saved(Field *u)
Definition: afopr_Clover-tmpl.h:376
AFopr_Clover::set_config
void set_config(Field *u)
setting gauge configuration.
Definition: afopr_Clover-tmpl.h:302
AFopr_Clover::mult_zm
void mult_zm(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:1033
Field::ptr
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:153
BridgeACC::mult_clover_D_chiral
void mult_clover_D_chiral(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT ct, double *RESTRICT v1, double kappa, int *Nsize, int *bc, int flag)
Definition: mult_Clover_openacc-inc.h:141
BridgeACC::mult_wilson_zm2
void mult_wilson_zm2(double *RESTRICT v2, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1121
CommonParameters::Nd
static int Nd()
Definition: commonParameters.h:116
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
BridgeACC::mult_wilson_ymb
void mult_wilson_ymb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:752
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:195
AFopr_Clover::get_parameters
void get_parameters(Parameters &params) const
gets parameters by a Parameter object: to be implemented in a subclass.
Definition: afopr_Clover-tmpl.h:286
AFopr_Clover::set_config_impl
void set_config_impl(Field *u)
Definition: afopr_Clover-tmpl.h:328
BridgeACC::mult_wilson_zp2
void mult_wilson_zp2(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:891
BridgeACC::mult_clover_D_dirac
void mult_clover_D_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT ct, double *RESTRICT v1, double kappa, int *Nsize, int *bc, int flag)
Definition: mult_Clover_openacc-inc.h:24
Communicator::ipe
static int ipe(const int dir)
logical coordinate of current proc.
Definition: communicator.cpp:105
BridgeACC::mult_wilson_1_chiral
void mult_wilson_1_chiral(double *RESTRICT buf_xp, double *RESTRICT buf_xm, double *RESTRICT buf_yp, double *RESTRICT buf_ym, double *RESTRICT buf_zp, double *RESTRICT buf_zm, double *RESTRICT buf_tp, double *RESTRICT buf_tm, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int *do_comm)
Definition: mult_Wilson_openacc-inc.h:431
BridgeACC::mult_wilson_ym1
void mult_wilson_ym1(double *RESTRICT buf, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:621
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
AFopr_Clover
Definition: afopr_Clover.h:31
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:242
BridgeACC::mult_wilson_zm1
void mult_wilson_zm1(double *RESTRICT buf, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1045
BridgeACC::mult_wilson_xp1
void mult_wilson_xp1(double *RESTRICT buf, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:14
Field
Container of Field-type object.
Definition: field.h:46
BridgeACC::mult_wilson_tp1_chiral
void mult_wilson_tp1_chiral(double *RESTRICT buf, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1647
AFopr_Clover::mult_tm
void mult_tm(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:1144
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
AFopr_Clover::mult_dn
virtual void mult_dn(int mu, AFIELD &, const AFIELD &)
downward nearest neighbor hopping term.
Definition: afopr_Clover-tmpl.h:583
AFopr_Clover::DdagD
void DdagD(AFIELD &, const AFIELD &)
Definition: afopr_Clover-tmpl.h:606
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
BridgeACC::mult_wilson_tpb_chiral
void mult_wilson_tpb_chiral(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1759
AFopr_Clover::mult_yp
void mult_yp(real_t *, real_t *)
Definition: afopr_Clover-tmpl.h:884
BridgeACC::copy_to_device
void copy_to_device(double *v, int nv)
AFopr_Clover::mult
void mult(AFIELD &, const AFIELD &)
multiplies fermion operator to a given field.
Definition: afopr_Clover-tmpl.h:454
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
BridgeACC::mult_wilson_tm1_chiral
void mult_wilson_tm1_chiral(double *RESTRICT buf, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1837
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
BridgeACC::afield_init
void afield_init(double *data, const int size)
BridgeACC::mult_wilson_2_dirac
void mult_wilson_2_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT buf_xp, double *RESTRICT buf_xm, double *RESTRICT buf_yp, double *RESTRICT buf_ym, double *RESTRICT buf_zp, double *RESTRICT buf_zm, double *RESTRICT buf_tp, double *RESTRICT buf_tm, double kappa, int *Nsize, int *bc, int *do_comm, int flag)
Definition: mult_Wilson_openacc-inc.h:560