Bridge++  Version 1.4.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fopr_Wilson_eo_impl.h
Go to the documentation of this file.
1 
15 #ifndef FOPR_WILSON_EO_IMP_BGQ_INCLUDED
16 #define FOPR_WILSON_EO_IMP_BGQ_INCLUDED
17 
18 #include "Fopr/fopr_eo.h"
19 #include "Field/index_eo.h"
21 
22 #include "IO/bridgeIO.h"
23 using Bridge::vout;
24 
26 
36 namespace Imp_BGQ {
37  class Fopr_Wilson_eo : public Fopr_eo
38  {
39  public:
40  static const std::string class_name;
41 
42  private:
43  int m_Nc, m_Nd, m_Nvc, m_Ndf;
45  int m_Nx, m_Ny, m_Nz, m_Nt, m_Nx2;
46 
47  double m_kappa;
48  std::vector<int> m_boundary;
49  std::vector<double> m_boundary2;
50 
51  std::string m_mode;
52  std::string m_repr;
53 
57 
58  std::vector<int> m_Leo;
60 
62  double *vcp1_xp, *vcp2_xp, *vcp1_xm, *vcp2_xm;
63  double *vcp1_yp, *vcp2_yp, *vcp1_ym, *vcp2_ym;
64  double *vcp1_zp, *vcp2_zp, *vcp1_zm, *vcp2_zm;
65  double *vcp1_tp, *vcp2_tp, *vcp1_tm, *vcp2_tm;
66 
67  // use async data transfer
68  std::vector<int> m_npe;
69  std::vector<Channel *> m_fw_send;
70  std::vector<Channel *> m_fw_recv;
71  std::vector<Channel *> m_bw_send;
72  std::vector<Channel *> m_bw_recv;
73 
74  void (Fopr_Wilson_eo::*m_gm5)(Field&, const Field&);
76  void (Fopr_Wilson_eo::*m_mult_tp)(Field&, const Field&, const int ieo);
77  void (Fopr_Wilson_eo::*m_mult_tm)(Field&, const Field&, const int ieo);
78 
79  void (Fopr_Wilson_eo::*m_mult)(Field&, const Field&);
80  void (Fopr_Wilson_eo::*m_mult_dag)(Field&, const Field&);
81  void (Fopr_Wilson_eo::*m_D)(Field&, const Field&);
82  void (Fopr_Wilson_eo::*m_preProp)(Field&, Field&, const Field&);
83  void (Fopr_Wilson_eo::*m_postProp)(Field&, const Field&, const Field&);
84 
85  public:
86 
88  { init("Dirac"); }
89 
90  Fopr_Wilson_eo(std::string repr)
91  { init(repr); }
92 
94  { tidyup(); }
95 
96  void set_parameters(const Parameters& params);
97  void set_parameters(const double kappa, const std::vector<int> bc);
98 
99  void set_config(Field *U);
100 
102  {
103  set_config(U.get());
104  }
105 
106  // method for even odd fermion operator
107  void preProp(Field& Be, Field& bo, const Field& b)
108  { (this->*m_preProp)(Be, bo, b); }
109 
110  void postProp(Field& x, const Field& xe, const Field& bo)
111  { (this->*m_postProp)(x, xe, bo); }
112 
113  void prePropD(Field&, Field&, const Field&);
114  void postPropD(Field&, const Field&, const Field&);
115  void prePropDag(Field&, Field&, const Field&);
116  void postPropDag(Field&, const Field&, const Field&);
117 
118  void mult(Field& v, const Field& f)
119  { (this->*m_mult)(v, f); }
120 
121  void mult_dag(Field& v, const Field& f)
122  { (this->*m_mult_dag)(v, f); }
123 
124  void set_mode(std::string mode)
125  {
126  m_mode = mode;
127 
128  if (m_mode == "D") {
133  } else if (m_mode == "Ddag") {
138  } else if (m_mode == "DdagD") {
141  } else if (m_mode == "DDdag") {
144  } else if (m_mode == "H") {
147  } else {
148  vout.crucial("Error at %s: input mode is undefined.\n", class_name.c_str());
149  exit(EXIT_FAILURE);
150  }
151  }
152 
153  std::string get_mode() const
154  { return m_mode; }
155 
156  void D(Field& v, const Field& f);
157  void Ddag(Field& v, const Field& f);
158  void DdagD(Field& v, const Field& f);
159  void DDdag(Field& v, const Field& f);
160  void H(Field& v, const Field& f);
161 
162  // ieo=0: even <-- odd
163  // ieo=1: odd <-- even
164 
165  void Meo(Field&, const Field&, const int ieo);
166  void Mdageo(Field&, const Field&, const int ieo);
167  void MeoMoe(Field&, const Field&);
168  void Meo_gm5(Field&, const Field&, const int ieo);
169 
170  void mult_gm5(Field&, const Field&);
171  void mult_gm5(Field&);
172  void gm5_dirac(Field&, const Field&);
173  void gm5_chiral(Field&, const Field&);
174  void gm5_self_dirac(Field&);
175  void gm5_self_chiral(Field&);
176 
178  void gm5p(const int mu, Field&, const Field& v);
179 
180  int field_nvol() { return m_Nvol2; }
181  int field_nin() { return m_Nvc * m_Nd; }
182  int field_nex() { return 1; }
183 
185  double flop_count();
186 
187  private:
188  void init(const std::string);
189  void tidyup();
190 
191  void mult_xp(Field&, const Field&, const int ieo);
192  void mult_xm(Field&, const Field&, const int ieo);
193  void mult_yp(Field&, const Field&, const int ieo);
194  void mult_ym(Field&, const Field&, const int ieo);
195  void mult_zp(Field&, const Field&, const int ieo);
196  void mult_zm(Field&, const Field&, const int ieo);
197  void mult_tp_dirac(Field&, const Field&, const int ieo);
198  void mult_tm_dirac(Field&, const Field&, const int ieo);
199  void mult_tp_chiral(Field&, const Field&, const int ieo);
200  void mult_tm_chiral(Field&, const Field&, const int ieo);
201 
202  void clear_impl(Field&);
203  void scal_impl(Field&, double);
204 
205  // member data for threading
206  int m_Mz, m_Mt;
209 
210  struct mult_arg
211  {
212  int isite;
214  int kz0, kz1, kt0, kt1;
215  };
216  std::vector<mult_arg> m_arg;
217 
218  // member functions for threading
219  void setup_thread();
220  void mult_xp1_thread(int, double *, const double *, int);
221  void mult_xp2_thread(int, double *, const double *, int);
222  void mult_xpb_thread(int, double *, const double *, int);
223  void mult_xm1_thread(int, double *, const double *, int);
224  void mult_xm2_thread(int, double *, const double *, int);
225  void mult_xmb_thread(int, double *, const double *, int);
226  void mult_yp1_thread(int, double *, const double *, int);
227  void mult_yp2_thread(int, double *, const double *, int);
228  void mult_ypb_thread(int, double *, const double *, int);
229  void mult_ym1_thread(int, double *, const double *, int);
230  void mult_ym2_thread(int, double *, const double *, int);
231  void mult_ymb_thread(int, double *, const double *, int);
232  void mult_zp1_thread(int, double *, const double *, int);
233  void mult_zp2_thread(int, double *, const double *, int);
234  void mult_zpb_thread(int, double *, const double *, int);
235  void mult_zm1_thread(int, double *, const double *, int);
236  void mult_zm2_thread(int, double *, const double *, int);
237  void mult_zmb_thread(int, double *, const double *, int);
238  void mult_tp1_dirac_thread(int, double *, const double *, int);
239  void mult_tp2_dirac_thread(int, double *, const double *, int);
240  void mult_tpb_dirac_thread(int, double *, const double *, int);
241  void mult_tm1_dirac_thread(int, double *, const double *, int);
242  void mult_tm2_dirac_thread(int, double *, const double *, int);
243  void mult_tmb_dirac_thread(int, double *, const double *, int);
244  void mult_tp1_chiral_thread(int, double *, const double *, int);
245  void mult_tp2_chiral_thread(int, double *, const double *, int);
246  void mult_tpb_chiral_thread(int, double *, const double *, int);
247  void mult_tm1_chiral_thread(int, double *, const double *, int);
248  void mult_tm2_chiral_thread(int, double *, const double *, int);
249  void mult_tmb_chiral_thread(int, double *, const double *, int);
250  void scal_thread(int, double *, double);
251  void clear_thread(int, double *);
252  void gm5_dirac_thread(int, double *, const double *);
253  void gm5_chiral_thread(int, double *, const double *);
254  void gm5_dirac_thread(int, double *);
255  void gm5_chiral_thread(int, double *);
256  };
257 }
258 #endif
std::vector< Channel * > m_fw_send
void prePropD(Field &, Field &, const Field &)
BridgeIO vout
Definition: bridgeIO.cpp:495
int field_nin()
returns the on-site d.o.f. for which the fermion operator is defined.
void mult_tm1_chiral_thread(int, double *, const double *, int)
double * vcp1_xp
arrays for data transfer.
void mult_tm1_dirac_thread(int, double *, const double *, int)
std::vector< double > m_boundary2
b.c. for each node.
Fopr_Wilson_eo(std::string repr)
std::vector< int > m_Leo
void DDdag(Field &v, const Field &f)
std::vector< int > m_boundary
boundary condition.
void mult_yp2_thread(int, double *, const double *, int)
void Meo_gm5(Field &, const Field &, const int ieo)
Container of Field-type object.
Definition: field.h:39
static const std::string class_name
void Mdageo(Field &, const Field &, const int ieo)
std::string get_mode() const
only for Fopr_Overlap
std::vector< int > m_npe
void set_config(Field *U)
setting pointer to the gauge configuration.
void mult_dag(Field &v, const Field &f)
hermitian conjugate of mult(Field&, const Field&).
void Ddag(Field &v, const Field &f)
void(Fopr_Wilson_eo::* m_gm5)(Field &, const Field &)
void mult_xp(Field &, const Field &, const int ieo)
void mult_tp2_dirac_thread(int, double *, const double *, int)
std::vector< mult_arg > m_arg
void(Fopr_Wilson_eo::* m_gm5_self)(Field &)
void init(const std::string)
void mult_ypb_thread(int, double *, const double *, int)
void(Fopr_Wilson_eo::* m_preProp)(Field &, Field &, const Field &)
Class for parameters.
Definition: parameters.h:46
Even-odd site index.
Definition: index_eo.h:39
void mult_tp_chiral(Field &, const Field &, const int ieo)
void mult_zm(Field &, const Field &, const int ieo)
void postPropD(Field &, const Field &, const Field &)
void gm5_chiral_thread(int, double *, const double *)
void mult_yp1_thread(int, double *, const double *, int)
void Meo(Field &, const Field &, const int ieo)
void set_config(unique_ptr< Field_G > &U)
void mult_tm2_chiral_thread(int, double *, const double *, int)
void mult_tm_chiral(Field &, const Field &, const int ieo)
void scal_impl(Field &, double)
void H(Field &v, const Field &f)
void gm5_chiral(Field &, const Field &)
void mult_ym2_thread(int, double *, const double *, int)
double flop_count()
retuns number of floating point operations of Meo.
void gm5_dirac(Field &, const Field &)
void set_mode(std::string mode)
setting the mode of multiplication if necessary. Default implementation here is just to avoid irrelev...
void scal_thread(int, double *, double)
void mult_xm1_thread(int, double *, const double *, int)
void(Fopr_Wilson_eo::* m_D)(Field &, const Field &)
void mult_zp2_thread(int, double *, const double *, int)
void mult_tp1_dirac_thread(int, double *, const double *, int)
void gm5_dirac_thread(int, double *, const double *)
void(Fopr_Wilson_eo::* m_mult)(Field &, const Field &)
SU(N) gauge field.
Definition: field_G.h:38
void(Fopr_Wilson_eo::* m_mult_dag)(Field &, const Field &)
void D(Field &v, const Field &f)
void mult_tm_dirac(Field &, const Field &, const int ieo)
std::string m_mode
mult mode.
void MeoMoe(Field &, const Field &)
void mult_xp2_thread(int, double *, const double *, int)
void mult_zp1_thread(int, double *, const double *, int)
void mult_tpb_dirac_thread(int, double *, const double *, int)
void mult_zp(Field &, const Field &, const int ieo)
void mult_zmb_thread(int, double *, const double *, int)
void mult_tp1_chiral_thread(int, double *, const double *, int)
void mult(Field &v, const Field &f)
multiplies fermion operator to a given field (2nd argument)
std::string m_repr
Dirac matrix representation.
void mult_zpb_thread(int, double *, const double *, int)
pointer get() const
void mult_tm2_dirac_thread(int, double *, const double *, int)
Base class of fermion operator family.
Definition: fopr_eo.h:34
int field_nvol()
returns the volume for which the fermion operator is defined.
void mult_xmb_thread(int, double *, const double *, int)
void postProp(Field &x, const Field &xe, const Field &bo)
void(Fopr_Wilson_eo::* m_postProp)(Field &, const Field &, const Field &)
void(Fopr_Wilson_eo::* m_mult_tm)(Field &, const Field &, const int ieo)
void mult_tpb_chiral_thread(int, double *, const double *, int)
Field_G * m_U
dummy: pointing m_Ueo.
void mult_ym(Field &, const Field &, const int ieo)
void set_parameters(const Parameters &params)
void DdagD(Field &v, const Field &f)
void crucial(const char *format,...)
Definition: bridgeIO.cpp:178
std::vector< Channel * > m_bw_recv
void mult_tp2_chiral_thread(int, double *, const double *, int)
double m_kappa
hopping parameter.
void mult_ymb_thread(int, double *, const double *, int)
void preProp(Field &Be, Field &bo, const Field &b)
void prePropDag(Field &, Field &, const Field &)
void mult_yp(Field &, const Field &, const int ieo)
void gm5p(const int mu, Field &, const Field &v)
gamma_5 (1 - gamma_mu) v(x + mu) used in force calculation.
void mult_tmb_dirac_thread(int, double *, const double *, int)
void mult_gm5(Field &, const Field &)
gamma_5 multiplication. [31 Mar 2017 H.Matsufuru]
void mult_ym1_thread(int, double *, const double *, int)
void mult_xm2_thread(int, double *, const double *, int)
Field m_w2
working field.
void mult_zm2_thread(int, double *, const double *, int)
void mult_tp_dirac(Field &, const Field &, const int ieo)
void mult_xpb_thread(int, double *, const double *, int)
void postPropDag(Field &, const Field &, const Field &)
int field_nex()
returns the external d.o.f. for which the fermion operator is defined.
void mult_zm1_thread(int, double *, const double *, int)
std::vector< Channel * > m_fw_recv
void mult_xm(Field &, const Field &, const int ieo)
void mult_tmb_chiral_thread(int, double *, const double *, int)
void mult_xp1_thread(int, double *, const double *, int)
std::vector< Channel * > m_bw_send
void(Fopr_Wilson_eo::* m_mult_tp)(Field &, const Field &, const int ieo)