Bridge++  Ver. 2.0.2
fopr_Staggered.cpp
Go to the documentation of this file.
1 
10 #include "Fopr/fopr_Staggered.h"
11 
12 #include "Field/index_lex.h"
13 
14 #include "Fopr/fopr_thread-inc.h"
15 
16 #if defined USE_GROUP_SU3
18 #elif defined USE_GROUP_SU2
20 #elif defined USE_GROUP_SU_N
22 #endif
23 
24 
25 #ifdef USE_FACTORY_AUTOREGISTER
26 namespace {
27  bool init = Fopr_Staggered::register_factory();
28 }
29 #endif
30 
31 const std::string Fopr_Staggered::class_name = "Fopr_Staggered";
32 
33 //====================================================================
34 void Fopr_Staggered::init(const Parameters& params)
35 {
37 
39  vout.general(m_vl, "%s: construction\n", class_name.c_str());
41 
42  setup();
43 
44  set_parameters(params);
45 
47  vout.general(m_vl, "%s: construction finished.\n",
48  class_name.c_str());
49 }
50 
51 
52 //====================================================================
54 {
56 
58  vout.general(m_vl, "%s: construction (obsolete)\n",
59  class_name.c_str());
60 
61  setup();
62 
63  vout.general(m_vl, "%s: construction finished.\n",
64  class_name.c_str());
65 }
66 
67 
68 //====================================================================
70 {
72  m_Nvc = 2 * m_Nc;
73  m_Ndf = 2 * m_Nc * m_Nc;
76 
81 
82  m_boundary.resize(m_Ndim);
83 
87 
89 
90  m_v1.reset(m_Nvc, m_Nvol, 1);
91  m_v2.reset(m_Nvc, m_Nvol, 1);
92 
93  int Nvx = m_Nvc * m_Ny * m_Nz * m_Nt;
94  vcp1_xp = new double[Nvx];
95  vcp2_xp = new double[Nvx];
96  vcp1_xm = new double[Nvx];
97  vcp2_xm = new double[Nvx];
98 
99  int Nvy = m_Nvc * m_Nx * m_Nz * m_Nt;
100  vcp1_yp = new double[Nvy];
101  vcp2_yp = new double[Nvy];
102  vcp1_ym = new double[Nvy];
103  vcp2_ym = new double[Nvy];
104 
105  int Nvz = m_Nvc * m_Nx * m_Ny * m_Nt;
106  vcp1_zp = new double[Nvz];
107  vcp2_zp = new double[Nvz];
108  vcp1_zm = new double[Nvz];
109  vcp2_zm = new double[Nvz];
110 
111  int Nvt = m_Nvc * m_Nx * m_Ny * m_Nz;
112  vcp1_tp = new double[Nvt];
113  vcp2_tp = new double[Nvt];
114  vcp1_tm = new double[Nvt];
115  vcp2_tm = new double[Nvt];
116 }
117 
118 
119 //====================================================================
121 {
122  delete[] vcp1_xp;
123  delete[] vcp2_xp;
124  delete[] vcp1_xm;
125  delete[] vcp2_xm;
126 
127  delete[] vcp1_yp;
128  delete[] vcp2_yp;
129  delete[] vcp1_ym;
130  delete[] vcp2_ym;
131 
132  delete[] vcp1_zp;
133  delete[] vcp2_zp;
134  delete[] vcp1_zm;
135  delete[] vcp2_zm;
136 
137  delete[] vcp1_tp;
138  delete[] vcp2_tp;
139  delete[] vcp1_tm;
140  delete[] vcp2_tm;
141 }
142 
143 
144 //====================================================================
146 {
147 #pragma omp barrier
148  int ith = ThreadManager::get_thread_id();
149  string vlevel;
150  if (!params.fetch_string("verbose_level", vlevel)) {
151  if (ith == 0) m_vl = vout.set_verbose_level(vlevel);
152  }
153 #pragma omp barrier
154 
155  double mq;
156  std::vector<int> bc;
157 
158  int err = 0;
159  err += params.fetch_double("quark_mass", mq);
160  err += params.fetch_int_vector("boundary_condition", bc);
161 
162  if (err) {
163  vout.crucial(m_vl, "%s: fetch error, input parameter not found.\n",
164  class_name.c_str());
165  abort();
166  }
167 
168  set_parameters(mq, bc);
169 }
170 
171 
172 //====================================================================
173 void Fopr_Staggered::set_parameters(const double mq,
174  const std::vector<int> bc)
175 {
176  assert(bc.size() == m_Ndim);
177 
178  int err = 0;
179  // currently no error check is needed
180  if (err) {
181  vout.crucial(m_vl, "%s: parameter range check failed.\n",
182  class_name.c_str());
183  exit(EXIT_FAILURE);
184  }
185 
186 #pragma omp barrier
187  int ith = ThreadManager::get_thread_id();
188  if (ith == 0) {
189  m_mq = mq;
190  for (int mu = 0; mu < m_Ndim; ++mu) {
191  m_boundary[mu] = bc[mu];
192  }
193  }
194 #pragma omp barrier
195 
196  vout.general(m_vl, "%s: input parameters\n", class_name.c_str());
197  vout.general(m_vl, " mq = %8.4f\n", m_mq);
198  for (int mu = 0; mu < m_Ndim; ++mu) {
199  vout.general(m_vl, " boundary[%d] = %2d\n", mu, m_boundary[mu]);
200  }
201 }
202 
203 
204 //====================================================================
206 {
207  params.set_double("quark_mass", m_mq);
208  params.set_int_vector("boundary_condition", m_boundary);
209  params.set_string("verbose_level", vout.get_verbose_level(m_vl));
210 }
211 
212 
213 //====================================================================
215 {
216  int Nt = CommonParameters::Nt();
217  int Nz = CommonParameters::Nz();
218  int Ny = CommonParameters::Ny();
219  int Nx = CommonParameters::Nx();
220  int Nvol = CommonParameters::Nvol();
221 
222  Index_lex idx_lex;
223 
224  int ipex = Communicator::ipe(0);
225  int ipey = Communicator::ipe(1);
226  int ipez = Communicator::ipe(2);
227  int ipet = Communicator::ipe(3);
228 
229  for (int t = 0; t < Nt; ++t) {
230  int t2 = t + ipet * Nt;
231  for (int z = 0; z < Nz; ++z) {
232  int z2 = z + ipez * Nz;
233  for (int y = 0; y < Ny; ++y) {
234  int y2 = y + ipey * Ny;
235  for (int x = 0; x < Nx; ++x) {
236  int x2 = x + ipex * Nx;
237  int is = idx_lex.site(x, y, z, t);
238 
239  m_stg_phase.set(0, is, 0, 1.0);
240  m_stg_phase.set(0, is, 1, 1.0);
241  m_stg_phase.set(0, is, 2, 1.0);
242  m_stg_phase.set(0, is, 3, 1.0);
243 
244  m_parity.set(0, is, 0, 1.0);
245 
246  if (((x2 + y2 + z2 + t2) % 2) == 1) {
247  m_parity.set(0, is, 0, -1.0);
248  }
249 
250  if ((x2 % 2) == 1) {
251  m_stg_phase.set(0, is, 1, -1.0);
252  }
253  if (((x2 + y2) % 2) == 1) {
254  m_stg_phase.set(0, is, 2, -1.0);
255  }
256  if (((x2 + y2 + z2) % 2) == 1) {
257  m_stg_phase.set(0, is, 3, -1.0);
258  }
259 
260  /*
261  // Fortran style
262  if (( x2 + 1) % 2 == 1){
263  m_stg_phase.set(0, is, 1, -1.0);
264  }
265  if (((x2 + y2 + 2) % 2) == 1){
266  m_stg_phase.set(0, is, 2, -1.0);
267  }
268  if (((x2 + y2 + z2 + 3) % 2) == 1){
269  m_stg_phase.set(0, is, 3, -1.0);
270  }
271  */
272  }
273  }
274  }
275  }
276 }
277 
278 
279 //====================================================================
281 {
282  int Nvol = CommonParameters::Nvol();
283 
284  int Nin = v.nin();
285  int Nex = v.nex();
286 
287  assert(v.nvol() == Nvol);
288 
289  for (int ex = 0; ex < Nex; ++ex) {
290  for (int site = 0; site < Nvol; ++site) {
291  for (int in = 0; in < Nin; ++in) {
292  double vt = m_stg_phase.cmp(0, site, mu) * v.cmp(in, site, ex);
293  v.set(in, site, ex, vt);
294  }
295  }
296  }
297 }
298 
299 
300 //====================================================================
302 {
303  int nth = ThreadManager::get_num_threads();
304 
305  vout.detailed(m_vl, "%s: set_config is called: num_threads = %d\n",
306  class_name.c_str(), nth);
307 
308  if (nth > 1) {
309  set_config_impl(U);
310  } else {
311  set_config_omp(U);
312  }
313 
314  vout.detailed(m_vl, "%s: set_config finished\n", class_name.c_str());
315 }
316 
317 
318 //====================================================================
320 {
321 #pragma omp parallel
322  {
323  set_config_impl(U);
324  }
325 }
326 
327 
328 //====================================================================
330 {
331  int ith, nth, is, ns;
332  set_threadtask(ith, nth, is, ns, m_Nvol);
333 
334 #pragma omp barrier
335 
336  for (int mu = 0; mu < m_Ndim; ++mu) {
337  for (int site = is; site < ns; ++site) {
338  double ph = m_stg_phase.cmp(0, site, mu);
339  for (int cc = 0; cc < m_Ndf; ++cc) {
340  double ut = ph * U->cmp(cc, site, mu);
341  m_U.set(cc, site, mu, ut);
342  }
343  }
344  }
345 #pragma omp barrier
346 }
347 
348 
349 //====================================================================
350 void Fopr_Staggered::set_mode(std::string mode)
351 {
352 #pragma omp barrier
353  int ith = ThreadManager::get_thread_id();
354  if (ith == 0) m_mode = mode;
355 #pragma omp barrier
356 }
357 
358 
359 //====================================================================
360 void Fopr_Staggered::mult(Field& v, const Field& w)
361 {
362  if (m_mode == "D") {
363  D(v, w);
364  } else if (m_mode == "Ddag") {
365  Ddag(v, w);
366  } else if (m_mode == "DdagD") {
367  DdagD(v, w);
368  } else if (m_mode == "H") {
369  H(v, w);
370  } else {
371  vout.crucial(m_vl, "%s: mode undeifined.\n", class_name.c_str());
372  exit(EXIT_FAILURE);
373  }
374 }
375 
376 
377 //====================================================================
379 {
380  if (m_mode == "D") {
381  Ddag(v, w);
382  } else if (m_mode == "Ddag") {
383  D(v, w);
384  } else if (m_mode == "DdagD") {
385  DdagD(v, w);
386  } else if (m_mode == "H") {
387  H(v, w);
388  } else {
389  vout.crucial(m_vl, "%s: mode undeifined.\n", class_name.c_str());
390  exit(EXIT_FAILURE);
391  }
392 }
393 
394 
395 //====================================================================
396 void Fopr_Staggered::H(Field& v, const Field& w)
397 {
398  D(v, w);
399  mult_gm5(v);
400 }
401 
402 
403 //====================================================================
405 {
406  // H(m_v1, w);
407  // H(v, m_v1);
408  D(m_v1, w);
409  Ddag(v, m_v1);
410 }
411 
412 
413 //====================================================================
414 void Fopr_Staggered::D(Field& v, const Field& w)
415 {
416  assert(w.check_size(m_Nvc, m_Nvol, 1));
417  assert(v.check_size(m_Nvc, m_Nvol, 1));
418 
419 #pragma omp barrier
420 
421  m_v2.set(0.0);
422 #pragma omp barrier
423 
424  mult_xp(m_v2, w);
425  mult_xm(m_v2, w);
426 
427  mult_yp(m_v2, w);
428  mult_ym(m_v2, w);
429 
430  mult_zp(m_v2, w);
431  mult_zm(m_v2, w);
432 
433  mult_tp(m_v2, w);
434  mult_tm(m_v2, w);
435 
436  // hopping normalization
437  // copy(v, m_v2);
438  // aypx(0.5/m_mq, v, w);
439 
440  // mass normalization
441  copy(v, m_v2);
442  scal(v, 0.5);
443  axpy(v, m_mq, w);
444 #pragma omp barrier
445 }
446 
447 
448 //====================================================================
449 void Fopr_Staggered::Ddag(Field& v, const Field& w)
450 {
451  assert(w.check_size(m_Nvc, m_Nvol, 1));
452  assert(v.check_size(m_Nvc, m_Nvol, 1));
453 
454 #pragma omp barrier
455 
456  m_v2.set(0.0);
457 #pragma omp barrier
458 
459  mult_xp(m_v2, w);
460  mult_xm(m_v2, w);
461 
462  mult_yp(m_v2, w);
463  mult_ym(m_v2, w);
464 
465  mult_zp(m_v2, w);
466  mult_zm(m_v2, w);
467 
468  mult_tp(m_v2, w);
469  mult_tm(m_v2, w);
470 
471  // hopping normalization
472  // copy(v, m_v2);
473  // aypx(-0.5/m_mq, v, w);
474 
475  // mass normalization
476  copy(v, m_v2);
477  scal(v, -0.5);
478  axpy(v, m_mq, w);
479 #pragma omp barrier
480 }
481 
482 
483 //====================================================================
485 {
486  int Nin = w.nin();
487  int Nvol = w.nvol();
488  int Nex = w.nex();
489  assert(Nvol == m_Nvol);
490  assert(v.check_size(Nin, Nvol, Nex));
491 
492  int ith, nth, is, ns;
493  set_threadtask(ith, nth, is, ns, m_Nvol);
494 
495 #pragma omp barrier
496 
497  for (int ex = 0; ex < Nex; ++ex) {
498  for (int site = is; site < ns; ++site) {
499  double ph = m_parity.cmp(0, site, 0);
500  for (int in = 0; in < Nin; ++in) {
501  double vt = ph * w.cmp(in, site, ex);
502  v.set(in, site, ex, vt);
503  }
504  }
505  }
506 
507 #pragma omp barrier
508 }
509 
510 
511 //====================================================================
513 {
514  int Nin = v.nin();
515  int Nvol = v.nvol();
516  int Nex = v.nex();
517  assert(Nvol == m_Nvol);
518 
519  int ith, nth, is, ns;
520  set_threadtask(ith, nth, is, ns, m_Nvol);
521 
522 #pragma omp barrier
523 
524  for (int ex = 0; ex < Nex; ++ex) {
525  for (int site = is; site < ns; ++site) {
526  double ph = m_parity.cmp(0, site, 0);
527  for (int in = 0; in < Nin; ++in) {
528  double vt = ph * v.cmp(in, site, ex);
529  v.set(in, site, ex, vt);
530  }
531  }
532  }
533 
534 #pragma omp barrier
535 }
536 
537 
538 //====================================================================
540 {
541  int idir = 0;
542 
543  double bc2 = 1.0;
544  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
545 
546  double *vp = v.ptr(0);
547  const double *wp = w.ptr(0);
548  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
549 
550  int ith, nth, is, ns;
551  set_threadtask(ith, nth, is, ns, m_Nvol);
552 
553 #pragma omp barrier
554 
555  for (int site = is; site < ns; ++site) {
556  int ix = site % m_Nx;
557  int iyzt = site / m_Nx;
558  if (ix == 0) {
559  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
560  vcp1_xp[ivc + m_Nvc * iyzt] = bc2 * wp[ivc + m_Nvc * site];
561  }
562  }
563  }
564 
565 #pragma omp barrier
566 #pragma omp master
567  {
568  int Nv = m_Nvc * m_Ny * m_Nz * m_Nt;
569  Communicator::exchange(Nv, vcp2_xp, vcp1_xp, 0, 1, 1);
570  }
571 #pragma omp barrier
572 
573  for (int site = is; site < ns; ++site) {
574  int ix = site % m_Nx;
575  int iyzt = site / m_Nx;
576  int nei = ix + 1 + m_Nx * iyzt;
577 
578  if (ix < m_Nx - 1) {
579  for (int ic = 0; ic < m_Nc; ++ic) {
580  int ic2 = ic * m_Nvc;
581  double wtr, wti;
582  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
583  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
584  vp[2 * ic + m_Nvc * site] += wtr;
585  vp[2 * ic + 1 + m_Nvc * site] += wti;
586  }
587  } else {
588  for (int ic = 0; ic < m_Nc; ++ic) {
589  int ic2 = ic * m_Nvc;
590  double wtr, wti;
591  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &vcp2_xp[m_Nvc * iyzt], m_Nc);
592  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &vcp2_xp[m_Nvc * iyzt], m_Nc);
593  vp[2 * ic + m_Nvc * site] += wtr;
594  vp[2 * ic + 1 + m_Nvc * site] += wti;
595  }
596  }
597  }
598 
599 #pragma omp barrier
600 }
601 
602 
603 //====================================================================
605 {
606  int idir = 0;
607 
608  double bc2 = 1.0;
609  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
610 
611  double *vp = v.ptr(0);
612  const double *wp = w.ptr(0);
613  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
614 
615  int ith, nth, is, ns;
616  set_threadtask(ith, nth, is, ns, m_Nvol);
617 
618 #pragma omp barrier
619 
620  for (int site = is; site < ns; ++site) {
621  int ix = site % m_Nx;
622  int iyzt = site / m_Nx;
623  if (ix == m_Nx - 1) {
624  for (int ic = 0; ic < m_Nc; ++ic) {
625  int ic2 = 2 * ic;
626  double wtr, wti;
627  wtr = mult_udagv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
628  wti = mult_udagv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
629  vcp1_xm[2 * ic + m_Nvc * iyzt] = wtr;
630  vcp1_xm[2 * ic + 1 + m_Nvc * iyzt] = wti;
631  }
632  }
633  }
634 
635 #pragma omp barrier
636 #pragma omp master
637  {
638  int Nv = m_Nvc * m_Ny * m_Nz * m_Nt;
639  Communicator::exchange(Nv, vcp2_xm, vcp1_xm, 0, -1, 2);
640  }
641 #pragma omp barrier
642 
643  for (int site = is; site < ns; ++site) {
644  int ix = site % m_Nx;
645  int iyzt = site / m_Nx;
646  int nei = ix - 1 + m_Nx * iyzt;
647 
648  if (ix > 0) {
649  for (int ic = 0; ic < m_Nc; ++ic) {
650  int ic2 = 2 * ic;
651  double wtr, wti;
652  wtr = mult_udagv_r(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
653  wti = mult_udagv_i(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
654  vp[2 * ic + m_Nvc * site] -= wtr;
655  vp[2 * ic + 1 + m_Nvc * site] -= wti;
656  }
657  } else {
658  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
659  vp[ivc + m_Nvc * site] -= bc2 * vcp2_xm[ivc + m_Nvc * iyzt];
660  }
661  }
662  }
663 
664 #pragma omp barrier
665 }
666 
667 
668 //====================================================================
670 {
671  int idir = 1;
672 
673  double bc2 = 1.0;
674  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
675 
676  double *vp = v.ptr(0);
677  const double *wp = w.ptr(0);
678  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
679 
680  int ith, nth, is, ns;
681  set_threadtask(ith, nth, is, ns, m_Nvol);
682 
683 #pragma omp barrier
684 
685  for (int site = is; site < ns; ++site) {
686  int ix = site % m_Nx;
687  int iyzt = site / m_Nx;
688  int iy = iyzt % m_Ny;
689  int izt = iyzt / m_Ny;
690  int ixzt = ix + m_Nx * izt;
691  if (iy == 0) {
692  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
693  vcp1_yp[ivc + m_Nvc * ixzt] = bc2 * wp[ivc + m_Nvc * site];
694  }
695  }
696  }
697 
698 #pragma omp barrier
699 #pragma omp master
700  {
701  int Nv = m_Nvc * m_Nx * m_Nz * m_Nt;
702  Communicator::exchange(Nv, vcp2_yp, vcp1_yp, 1, 1, 3);
703  }
704 #pragma omp barrier
705 
706  for (int site = is; site < ns; ++site) {
707  int ix = site % m_Nx;
708  int iyzt = site / m_Nx;
709  int iy = iyzt % m_Ny;
710  int izt = iyzt / m_Ny;
711  int ixzt = ix + m_Nx * izt;
712  int nei = ix + m_Nx * (iy + 1 + m_Ny * izt);
713 
714  if (iy < m_Ny - 1) {
715  for (int ic = 0; ic < m_Nc; ++ic) {
716  int ic2 = ic * m_Nvc;
717  double wtr, wti;
718  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
719  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
720  vp[2 * ic + m_Nvc * site] += wtr;
721  vp[2 * ic + 1 + m_Nvc * site] += wti;
722  }
723  } else {
724  for (int ic = 0; ic < m_Nc; ++ic) {
725  int ic2 = ic * m_Nvc;
726  double wtr, wti;
727  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &vcp2_yp[m_Nvc * ixzt], m_Nc);
728  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &vcp2_yp[m_Nvc * ixzt], m_Nc);
729  vp[2 * ic + m_Nvc * site] += wtr;
730  vp[2 * ic + 1 + m_Nvc * site] += wti;
731  }
732  }
733  }
734 
735 #pragma omp barrier
736 }
737 
738 
739 //====================================================================
741 {
742  int idir = 1;
743 
744  double bc2 = 1.0;
745  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
746 
747  double *vp = v.ptr(0);
748  const double *wp = w.ptr(0);
749  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
750 
751  int ith, nth, is, ns;
752  set_threadtask(ith, nth, is, ns, m_Nvol);
753 
754 #pragma omp barrier
755 
756  for (int site = is; site < ns; ++site) {
757  int ix = site % m_Nx;
758  int iyzt = site / m_Nx;
759  int iy = iyzt % m_Ny;
760  int izt = iyzt / m_Ny;
761  int ixzt = ix + m_Nx * izt;
762  if (iy == m_Ny - 1) {
763  for (int ic = 0; ic < m_Nc; ++ic) {
764  int ic2 = 2 * ic;
765  double wtr, wti;
766  wtr = mult_udagv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
767  wti = mult_udagv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
768  vcp1_ym[2 * ic + m_Nvc * ixzt] = wtr;
769  vcp1_ym[2 * ic + 1 + m_Nvc * ixzt] = wti;
770  }
771  }
772  }
773 
774 #pragma omp barrier
775 #pragma omp master
776  {
777  int Nv = m_Nvc * m_Nx * m_Nz * m_Nt;
778  Communicator::exchange(Nv, vcp2_ym, vcp1_ym, 1, -1, 4);
779  }
780 #pragma omp barrier
781 
782  for (int site = is; site < ns; ++site) {
783  int ix = site % m_Nx;
784  int iyzt = site / m_Nx;
785  int iy = iyzt % m_Ny;
786  int izt = iyzt / m_Ny;
787  int ixzt = ix + m_Nx * izt;
788  int nei = ix + m_Nx * (iy - 1 + m_Ny * izt);
789 
790  if (iy > 0) {
791  for (int ic = 0; ic < m_Nc; ++ic) {
792  int ic2 = 2 * ic;
793  double wtr, wti;
794  wtr = mult_udagv_r(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
795  wti = mult_udagv_i(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
796  vp[2 * ic + m_Nvc * site] -= wtr;
797  vp[2 * ic + 1 + m_Nvc * site] -= wti;
798  }
799  } else {
800  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
801  vp[ivc + m_Nvc * site] -= bc2 * vcp2_ym[ivc + m_Nvc * ixzt];
802  }
803  }
804  }
805 
806 #pragma omp barrier
807 }
808 
809 
810 //====================================================================
812 {
813  int idir = 2;
814 
815  double bc2 = 1.0;
816  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
817 
818  double *vp = v.ptr(0);
819  const double *wp = w.ptr(0);
820  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
821 
822  int ith, nth, is, ns;
823  set_threadtask(ith, nth, is, ns, m_Nvol);
824 
825  int Nxy = m_Nx * m_Ny;
826 
827 #pragma omp barrier
828 
829  for (int site = is; site < ns; ++site) {
830  int ixy = site % Nxy;
831  int izt = site / Nxy;
832  int iz = izt % m_Nz;
833  int it = izt / m_Nz;
834  int ixyt = ixy + Nxy * it;
835  if (iz == 0) {
836  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
837  vcp1_zp[ivc + m_Nvc * ixyt] = bc2 * wp[ivc + m_Nvc * site];
838  }
839  }
840  }
841 
842 #pragma omp barrier
843 #pragma omp master
844  {
845  int Nv = m_Nvc * m_Nx * m_Ny * m_Nt;
846  Communicator::exchange(Nv, vcp2_zp, vcp1_zp, 2, 1, 5);
847  }
848 #pragma omp barrier
849 
850  for (int site = is; site < ns; ++site) {
851  int ixy = site % Nxy;
852  int izt = site / Nxy;
853  int iz = izt % m_Nz;
854  int it = izt / m_Nz;
855  int ixyt = ixy + Nxy * it;
856  int nei = ixy + Nxy * (iz + 1 + m_Nz * it);
857 
858  if (iz < m_Nz - 1) {
859  for (int ic = 0; ic < m_Nc; ++ic) {
860  int ic2 = ic * m_Nvc;
861  double wtr, wti;
862  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
863  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
864  vp[2 * ic + m_Nvc * site] += wtr;
865  vp[2 * ic + 1 + m_Nvc * site] += wti;
866  }
867  } else {
868  for (int ic = 0; ic < m_Nc; ++ic) {
869  int ic2 = ic * m_Nvc;
870  double wtr, wti;
871  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &vcp2_zp[m_Nvc * ixyt], m_Nc);
872  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &vcp2_zp[m_Nvc * ixyt], m_Nc);
873  vp[2 * ic + m_Nvc * site] += wtr;
874  vp[2 * ic + 1 + m_Nvc * site] += wti;
875  }
876  }
877  }
878 
879 #pragma omp barrier
880 }
881 
882 
883 //====================================================================
885 {
886  int idir = 2;
887 
888  double bc2 = 1.0;
889  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
890 
891  double *vp = v.ptr(0);
892  const double *wp = w.ptr(0);
893  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
894 
895  int ith, nth, is, ns;
896  set_threadtask(ith, nth, is, ns, m_Nvol);
897 
898  int Nxy = m_Nx * m_Ny;
899 
900 #pragma omp barrier
901 
902  for (int site = is; site < ns; ++site) {
903  int ixy = site % Nxy;
904  int izt = site / Nxy;
905  int iz = izt % m_Nz;
906  int it = izt / m_Nz;
907  int ixyt = ixy + Nxy * it;
908  if (iz == m_Nz - 1) {
909  for (int ic = 0; ic < m_Nc; ++ic) {
910  int ic2 = 2 * ic;
911  double wtr, wti;
912  wtr = mult_udagv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
913  wti = mult_udagv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
914  vcp1_zm[2 * ic + m_Nvc * ixyt] = wtr;
915  vcp1_zm[2 * ic + 1 + m_Nvc * ixyt] = wti;
916  }
917  }
918  }
919 
920 #pragma omp barrier
921 #pragma omp master
922  {
923  int Nv = m_Nvc * m_Nx * m_Ny * m_Nt;
924  Communicator::exchange(Nv, vcp2_zm, vcp1_zm, 2, -1, 6);
925  }
926 #pragma omp barrier
927 
928  for (int site = is; site < ns; ++site) {
929  int ixy = site % Nxy;
930  int izt = site / Nxy;
931  int iz = izt % m_Nz;
932  int it = izt / m_Nz;
933  int ixyt = ixy + Nxy * it;
934  int nei = ixy + Nxy * (iz - 1 + m_Nz * it);
935 
936  if (iz > 0) {
937  for (int ic = 0; ic < m_Nc; ++ic) {
938  int ic2 = 2 * ic;
939  double wtr, wti;
940  wtr = mult_udagv_r(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
941  wti = mult_udagv_i(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
942  vp[2 * ic + m_Nvc * site] -= wtr;
943  vp[2 * ic + 1 + m_Nvc * site] -= wti;
944  }
945  } else {
946  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
947  vp[ivc + m_Nvc * site] -= bc2 * vcp2_zm[ivc + m_Nvc * ixyt];
948  }
949  }
950  }
951 
952 #pragma omp barrier
953 }
954 
955 
956 //====================================================================
958 {
959  int idir = 3;
960 
961  double bc2 = 1.0;
962  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
963 
964  double *vp = v.ptr(0);
965  const double *wp = w.ptr(0);
966  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
967 
968  int ith, nth, is, ns;
969  set_threadtask(ith, nth, is, ns, m_Nvol);
970 
971  int Nxyz = m_Nx * m_Ny * m_Nz;
972 
973 #pragma omp barrier
974 
975  for (int site = is; site < ns; ++site) {
976  int ixyz = site % Nxyz;
977  int it = site / Nxyz;
978  if (it == 0) {
979  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
980  vcp1_tp[ivc + m_Nvc * ixyz] = bc2 * wp[ivc + m_Nvc * site];
981  }
982  }
983  }
984 
985 #pragma omp barrier
986 #pragma omp master
987  {
988  int Nv = m_Nvc * m_Nx * m_Ny * m_Nz;
989  Communicator::exchange(Nv, vcp2_tp, vcp1_tp, 3, 1, 7);
990  }
991 #pragma omp barrier
992 
993  for (int site = is; site < ns; ++site) {
994  int ixyz = site % Nxyz;
995  int it = site / Nxyz;
996  int nei = ixyz + Nxyz * (it + 1);
997 
998  if (it < m_Nt - 1) {
999  for (int ic = 0; ic < m_Nc; ++ic) {
1000  int ic2 = ic * m_Nvc;
1001  double wtr, wti;
1002  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
1003  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * nei], m_Nc);
1004  vp[2 * ic + m_Nvc * site] += wtr;
1005  vp[2 * ic + 1 + m_Nvc * site] += wti;
1006  }
1007  } else {
1008  for (int ic = 0; ic < m_Nc; ++ic) {
1009  int ic2 = ic * m_Nvc;
1010  double wtr, wti;
1011  wtr = mult_uv_r(&up[ic2 + m_Ndf * site], &vcp2_tp[m_Nvc * ixyz], m_Nc);
1012  wti = mult_uv_i(&up[ic2 + m_Ndf * site], &vcp2_tp[m_Nvc * ixyz], m_Nc);
1013  vp[2 * ic + m_Nvc * site] += wtr;
1014  vp[2 * ic + 1 + m_Nvc * site] += wti;
1015  }
1016  }
1017  }
1018 
1019 #pragma omp barrier
1020 }
1021 
1022 
1023 //====================================================================
1025 {
1026  int idir = 3;
1027 
1028  double bc2 = 1.0;
1029  if (Communicator::ipe(idir) == 0) bc2 = double(m_boundary[idir]);
1030 
1031  double *vp = v.ptr(0);
1032  const double *wp = w.ptr(0);
1033  const double *up = m_U.ptr(m_Ndf * m_Nvol * idir);
1034 
1035  int ith, nth, is, ns;
1036  set_threadtask(ith, nth, is, ns, m_Nvol);
1037 
1038  int Nxyz = m_Nx * m_Ny * m_Nz;
1039 
1040 #pragma omp barrier
1041 
1042  for (int site = is; site < ns; ++site) {
1043  int ixyz = site % Nxyz;
1044  int it = site / Nxyz;
1045  if (it == m_Nt - 1) {
1046  for (int ic = 0; ic < m_Nc; ++ic) {
1047  int ic2 = 2 * ic;
1048  double wtr, wti;
1049  wtr = mult_udagv_r(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
1050  wti = mult_udagv_i(&up[ic2 + m_Ndf * site], &wp[m_Nvc * site], m_Nc);
1051  vcp1_tm[2 * ic + m_Nvc * ixyz] = wtr;
1052  vcp1_tm[2 * ic + 1 + m_Nvc * ixyz] = wti;
1053  }
1054  }
1055  }
1056 
1057 #pragma omp barrier
1058 #pragma omp master
1059  {
1060  int Nv = m_Nvc * m_Nx * m_Ny * m_Nz;
1061  Communicator::exchange(Nv, vcp2_tm, vcp1_tm, 3, -1, 8);
1062  }
1063 #pragma omp barrier
1064 
1065  for (int site = is; site < ns; ++site) {
1066  int ixyz = site % Nxyz;
1067  int it = site / Nxyz;
1068  int nei = ixyz + Nxyz * (it - 1);
1069 
1070  if (it > 0) {
1071  for (int ic = 0; ic < m_Nc; ++ic) {
1072  int ic2 = 2 * ic;
1073  double wtr, wti;
1074  wtr = mult_udagv_r(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
1075  wti = mult_udagv_i(&up[ic2 + m_Ndf * nei], &wp[m_Nvc * nei], m_Nc);
1076  vp[2 * ic + m_Nvc * site] -= wtr;
1077  vp[2 * ic + 1 + m_Nvc * site] -= wti;
1078  }
1079  } else {
1080  for (int ivc = 0; ivc < m_Nvc; ++ivc) {
1081  vp[ivc + m_Nvc * site] -= bc2 * vcp2_tm[ivc + m_Nvc * ixyz];
1082  }
1083  }
1084  }
1085 
1086 #pragma omp barrier
1087 }
1088 
1089 
1090 //====================================================================
1091 double Fopr_Staggered::flop_count(const std::string mode)
1092 {
1093  // the following flop counting assumes mass normalization.
1094 
1095  int Nvol = m_Nvol;
1096  int NPE = CommonParameters::NPE();
1097 
1098  int flop_site = m_Nvc * (3 + 2 * m_Ndim * 2 * m_Nvc);
1099 
1100  double flop_vol = double(Nvol) * double(NPE);
1101 
1102  double gflop = double(flop_site) * flop_vol * 1.0e-9;
1103 
1104  if ((mode == "DdagD") || (mode == "DDdag")) {
1105  gflop *= 2.0;
1106  }
1107 
1108  return gflop;
1109 }
1110 
1111 
1112 //============================================================END=====
CommonParameters::Ny
static int Ny()
Definition: commonParameters.h:106
Fopr_Staggered::m_v2
Field m_v2
working field
Definition: fopr_Staggered.h:53
Fopr_Staggered::vcp1_xm
double * vcp1_xm
Definition: fopr_Staggered.h:56
CommonParameters::Nz
static int Nz()
Definition: commonParameters.h:107
Fopr_Staggered::get_parameters
void get_parameters(Parameters &params) const
gets parameters by a Parameter object: to be implemented in a subclass.
Definition: fopr_Staggered.cpp:205
Fopr_Staggered::m_mq
double m_mq
quark mass.
Definition: fopr_Staggered.h:36
Fopr_Staggered::mult_xm
void mult_xm(Field &, const Field &)
Definition: fopr_Staggered.cpp:604
Fopr_Staggered::vcp1_zm
double * vcp1_zm
Definition: fopr_Staggered.h:58
fopr_thread-inc.h
Fopr_Staggered::set_parameters
void set_parameters(const Parameters &params)
sets parameters by a Parameter object: to be implemented in a subclass.
Definition: fopr_Staggered.cpp:145
Parameters::set_string
void set_string(const string &key, const string &value)
Definition: parameters.cpp:39
Fopr_Staggered::init
void init()
initial setup.
Definition: fopr_Staggered.cpp:53
Index_lex
Lexical site index.
Definition: index_lex.h:34
fopr_Wilson_impl_SU_N-inc.h
fopr_Wilson_impl_SU3-inc.h
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
Fopr_Staggered::H
void H(Field &, const Field &)
Definition: fopr_Staggered.cpp:396
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
fopr_Staggered.h
Fopr_Staggered::m_mode
std::string m_mode
mult mode
Definition: fopr_Staggered.h:40
Fopr_Staggered::set_mode
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
Definition: fopr_Staggered.cpp:350
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.h:86
Fopr_Staggered::mult_dag
void mult_dag(Field &, const Field &)
hermitian conjugate of mult.
Definition: fopr_Staggered.cpp:378
Fopr_Staggered::vcp2_zp
double * vcp2_zp
Definition: fopr_Staggered.h:58
Fopr_Staggered::vcp2_ym
double * vcp2_ym
Definition: fopr_Staggered.h:57
Fopr_Staggered::mult_xp
void mult_xp(Field &, const Field &)
Definition: fopr_Staggered.cpp:539
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.h:85
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:219
Field::nex
int nex() const
Definition: field.h:128
Fopr_Staggered::vcp1_xp
double * vcp1_xp
communication buffer
Definition: fopr_Staggered.h:56
Fopr_Staggered::mult_zm
void mult_zm(Field &, const Field &)
Definition: fopr_Staggered.cpp:884
Fopr_Staggered::m_Nvol
int m_Nvol
Definition: fopr_Staggered.h:45
Fopr_Staggered::vcp2_xp
double * vcp2_xp
Definition: fopr_Staggered.h:56
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
Fopr_Staggered::m_Ndim
int m_Ndim
Definition: fopr_Staggered.h:45
Fopr_Staggered::set_config_impl
void set_config_impl(Field *U)
Definition: fopr_Staggered.cpp:329
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:380
Fopr_Staggered::m_Nx
int m_Nx
Definition: fopr_Staggered.h:44
Fopr_Staggered::mult
void mult(Field &, const Field &)
multiplies fermion operator to a given field.
Definition: fopr_Staggered.cpp:360
Fopr_Staggered::vcp1_ym
double * vcp1_ym
Definition: fopr_Staggered.h:57
Field::nin
int nin() const
Definition: field.h:126
Fopr_Staggered::mult_tp
void mult_tp(Field &, const Field &)
Definition: fopr_Staggered.cpp:957
Fopr_Staggered::setup
void setup()
Definition: fopr_Staggered.cpp:69
Fopr_Staggered::m_Nt
int m_Nt
Definition: fopr_Staggered.h:44
Fopr_Staggered::m_stg_phase
Field m_stg_phase
staggered phase
Definition: fopr_Staggered.h:47
copy
void copy(Field &y, const Field &x)
copy(y, x): y = x
Definition: field.cpp:212
Fopr_Staggered::vcp2_zm
double * vcp2_zm
Definition: fopr_Staggered.h:58
Fopr_Staggered::flop_count
double flop_count()
returns the number of floating point operations.
Definition: fopr_Staggered.h:107
Fopr_Staggered::m_Nvc
int m_Nvc
Definition: fopr_Staggered.h:43
Fopr_Staggered::set_config_omp
void set_config_omp(Field *U)
Definition: fopr_Staggered.cpp:319
CommonParameters::Nx
static int Nx()
Definition: commonParameters.h:105
Fopr_Staggered::DdagD
void DdagD(Field &, const Field &)
Definition: fopr_Staggered.cpp:404
Fopr_Staggered::set_config
void set_config(Field *U)
sets the gauge configuration.
Definition: fopr_Staggered.cpp:301
CommonParameters::Nc
static int Nc()
Definition: commonParameters.h:115
Fopr_Staggered::mult_zp
void mult_zp(Field &, const Field &)
Definition: fopr_Staggered.cpp:811
Fopr_Staggered::m_Ny
int m_Ny
Definition: fopr_Staggered.h:44
Fopr_Staggered::vcp1_yp
double * vcp1_yp
Definition: fopr_Staggered.h:57
Fopr_Staggered::set_staggered_phase
void set_staggered_phase()
Definition: fopr_Staggered.cpp:214
CommonParameters::Nt
static int Nt()
Definition: commonParameters.h:108
Parameters::fetch_int_vector
int fetch_int_vector(const string &key, vector< int > &value) const
Definition: parameters.cpp:429
Fopr_Staggered::Ddag
void Ddag(Field &, const Field &)
Definition: fopr_Staggered.cpp:449
Fopr_Staggered::m_Ndf
int m_Ndf
Definition: fopr_Staggered.h:43
Field_G::reset
void reset(const int Nvol, const int Nex)
Definition: field_G.h:79
Fopr_Staggered::mult_gm5
void mult_gm5(Field &, const Field &)
multiplies gamma_5 matrix.
Definition: fopr_Staggered.cpp:484
Element_type::REAL
@ REAL
Definition: bridge_defs.h:43
Field::nvol
int nvol() const
Definition: field.h:127
index_lex.h
Fopr_Staggered::m_U
Field_G m_U
gauge field multiplied by staggered phase.
Definition: fopr_Staggered.h:50
CommonParameters::NPE
static int NPE()
Definition: commonParameters.h:101
Index_lex::site
int site(const int &x, const int &y, const int &z, const int &t) const
Definition: index_lex.h:55
Fopr_Staggered::m_Nc
int m_Nc
Definition: fopr_Staggered.h:43
Fopr_Staggered::vcp2_tp
double * vcp2_tp
Definition: fopr_Staggered.h:59
Field::reset
void reset(const int Nin, const int Nvol, const int Nex, const element_type cmpl=Element_type::COMPLEX)
Definition: field.h:95
Parameters::set_int_vector
void set_int_vector(const string &key, const vector< int > &value)
Definition: parameters.cpp:45
Fopr_Staggered::vcp1_zp
double * vcp1_zp
Definition: fopr_Staggered.h:58
Field::cmp
double cmp(const int jin, const int site, const int jex) const
Definition: field.h:143
Field::ptr
const double * ptr(const int jin, const int site, const int jex) const
Definition: field.h:153
CommonParameters::Vlevel
static Bridge::VerboseLevel Vlevel()
Definition: commonParameters.h:122
Fopr_Staggered::m_parity
Field m_parity
site parity field
Definition: fopr_Staggered.h:48
fopr_Wilson_impl_SU2-inc.h
Bridge::BridgeIO::set_verbose_level
static VerboseLevel set_verbose_level(const std::string &str)
Definition: bridgeIO.cpp:133
Fopr_Staggered::D
void D(Field &, const Field &)
Definition: fopr_Staggered.cpp:414
Fopr_Staggered::m_boundary
std::vector< int > m_boundary
boundary conditions.
Definition: fopr_Staggered.h:37
Fopr_Staggered::vcp2_yp
double * vcp2_yp
Definition: fopr_Staggered.h:57
Fopr_Staggered::vcp2_tm
double * vcp2_tm
Definition: fopr_Staggered.h:59
Fopr_Staggered::tidyup
void tidyup()
final clean-up.
Definition: fopr_Staggered.cpp:120
Fopr_Staggered::vcp1_tm
double * vcp1_tm
Definition: fopr_Staggered.h:59
scal
void scal(Field &x, const double a)
scal(x, a): x = a * x
Definition: field.cpp:261
Communicator::ipe
static int ipe(const int dir)
logical coordinate of current proc.
Definition: communicator.cpp:105
Fopr_Staggered::vcp2_xm
double * vcp2_xm
Definition: fopr_Staggered.h:56
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
Fopr_Staggered::mult_ym
void mult_ym(Field &, const Field &)
Definition: fopr_Staggered.cpp:740
Fopr_Staggered::mult_staggered_phase
void mult_staggered_phase(Field &, int mu)
Definition: fopr_Staggered.cpp:280
Fopr_Staggered::m_vl
Bridge::VerboseLevel m_vl
verbose level
Definition: fopr_Staggered.h:38
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:180
Fopr_Staggered::m_v1
Field m_v1
working field
Definition: fopr_Staggered.h:52
Fopr_Staggered::vcp1_tp
double * vcp1_tp
Definition: fopr_Staggered.h:59
Field
Container of Field-type object.
Definition: field.h:46
Communicator::exchange
static int exchange(int count, dcomplex *recv_buf, dcomplex *send_buf, int idir, int ipm, int tag)
receive array of dcomplex from upstream specified by idir and ipm, and send array to downstream.
Definition: communicator.cpp:207
ThreadManager::get_thread_id
static int get_thread_id()
returns thread id.
Definition: threadManager.cpp:253
Fopr_Staggered::class_name
static const std::string class_name
Definition: fopr_Staggered.h:32
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:200
Fopr_Staggered::mult_tm
void mult_tm(Field &, const Field &)
Definition: fopr_Staggered.cpp:1024
Fopr_Staggered::m_Nz
int m_Nz
Definition: fopr_Staggered.h:44
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:512
Bridge::BridgeIO::get_verbose_level
static std::string get_verbose_level(const VerboseLevel vl)
Definition: bridgeIO.cpp:154
Fopr_Staggered::mult_yp
void mult_yp(Field &, const Field &)
Definition: fopr_Staggered.cpp:669