QUDA  v0.7.0
A library for QCD on GPUs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dirac.cpp
Go to the documentation of this file.
1 #include <dirac_quda.h>
2 #include <dslash_quda.h>
3 #include <blas_quda.h>
4 
5 #include <iostream>
6 
7 namespace quda {
8 
9  // FIXME: At the moment, it's unsafe for more than one Dirac operator to be active unless
10  // they all have the same volume, etc. (used to initialize the various CUDA constants).
11 
13  : gauge(*(param.gauge)), kappa(param.kappa), mass(param.mass), matpcType(param.matpcType),
14  dagger(param.dagger), flops(0), tmp1(param.tmp1), tmp2(param.tmp2), tune(QUDA_TUNE_NO),
15  profile("Dirac")
16  {
17  for (int i=0; i<4; i++) commDim[i] = param.commDim[i];
18  }
19 
21  : gauge(dirac.gauge), kappa(dirac.kappa), matpcType(dirac.matpcType),
22  dagger(dirac.dagger), flops(0), tmp1(dirac.tmp1), tmp2(dirac.tmp2), tune(QUDA_TUNE_NO),
23  profile("Dirac")
24  {
25  for (int i=0; i<4; i++) commDim[i] = dirac.commDim[i];
26  }
27 
30  }
31 
33  {
34  if(&dirac != this) {
35  gauge = dirac.gauge;
36  kappa = dirac.kappa;
37  matpcType = dirac.matpcType;
38  dagger = dirac.dagger;
39  flops = 0;
40  tmp1 = dirac.tmp1;
41  tmp2 = dirac.tmp2;
42  tune = dirac.tune;
43 
44  for (int i=0; i<4; i++) commDim[i] = dirac.commDim[i];
45 
46  profile = dirac.profile;
47  }
48  return *this;
49  }
50 
52  if (*tmp) return false;
54  param.create = QUDA_ZERO_FIELD_CREATE; // need to zero elements else padded region will be junk
55  *tmp = new cudaColorSpinorField(a, param);
56  return true;
57  }
58 
59  void Dirac::deleteTmp(cudaColorSpinorField **a, const bool &reset) const {
60  if (reset) {
61  delete *a;
62  *a = NULL;
63  }
64  }
65 
66 #define flip(x) (x) = ((x) == QUDA_DAG_YES ? QUDA_DAG_NO : QUDA_DAG_YES)
67 
69  {
70  flip(dagger);
71  M(out, in);
72  flip(dagger);
73  }
74 
76  {
77  flip(dagger);
78  MdagM(out, in);
79  flip(dagger);
80  }
81 
82 #undef flip
83 
85  {
87  in.Nspin() == 4) {
88  errorQuda("CUDA Dirac operator requires UKQCD basis, out = %d, in = %d",
89  out.GammaBasis(), in.GammaBasis());
90  }
91 
92  if (in.Precision() != out.Precision()) {
93  errorQuda("Input precision %d and output spinor precision %d don't match in dslash_quda",
94  in.Precision(), out.Precision());
95  }
96 
97  if (in.Stride() != out.Stride()) {
98  errorQuda("Input %d and output %d spinor strides don't match in dslash_quda",
99  in.Stride(), out.Stride());
100  }
101 
103  errorQuda("ColorSpinorFields are not single parity: in = %d, out = %d",
104  in.SiteSubset(), out.SiteSubset());
105  }
106 
107  if (out.Ndim() != 5) {
108  if ((out.Volume() != gauge.Volume() && out.SiteSubset() == QUDA_FULL_SITE_SUBSET) ||
109  (out.Volume() != gauge.VolumeCB() && out.SiteSubset() == QUDA_PARITY_SITE_SUBSET) ) {
110  errorQuda("Spinor volume %d doesn't match gauge volume %d", out.Volume(), gauge.VolumeCB());
111  }
112  } else {
113  // Domain wall fermions, compare 4d volumes not 5d
114  if ((out.Volume()/out.X(4) != gauge.Volume() && out.SiteSubset() == QUDA_FULL_SITE_SUBSET) ||
115  (out.Volume()/out.X(4) != gauge.VolumeCB() && out.SiteSubset() == QUDA_PARITY_SITE_SUBSET) ) {
116  errorQuda("Spinor volume %d doesn't match gauge volume %d", out.Volume(), gauge.VolumeCB());
117  }
118  }
119  }
120 
122  {
124  errorQuda("ColorSpinorFields are not full fields: in = %d, out = %d",
125  in.SiteSubset(), out.SiteSubset());
126  }
127  }
128 
130  if (a.V() == b.V()) errorQuda("Aliasing pointers");
131  }
132 
133  // Dirac operator factory
135  {
136  if (param.type == QUDA_WILSON_DIRAC) {
137  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracWilson operator\n");
138  return new DiracWilson(param);
139  } else if (param.type == QUDA_WILSONPC_DIRAC) {
140  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracWilsonPC operator\n");
141  return new DiracWilsonPC(param);
142  } else if (param.type == QUDA_CLOVER_DIRAC) {
143  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracClover operator\n");
144  return new DiracClover(param);
145  } else if (param.type == QUDA_CLOVERPC_DIRAC) {
146  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracCloverPC operator\n");
147  return new DiracCloverPC(param);
148  } else if (param.type == QUDA_DOMAIN_WALL_DIRAC) {
149  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracDomainWall operator\n");
150  return new DiracDomainWall(param);
151  } else if (param.type == QUDA_DOMAIN_WALLPC_DIRAC) {
152  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracDomainWallPC operator\n");
153  return new DiracDomainWallPC(param);
154  } else if (param.type == QUDA_DOMAIN_WALL_4DPC_DIRAC) {
155  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracDomainWall4DPC operator\n");
156  return new DiracDomainWall4DPC(param);
157  } else if (param.type == QUDA_MOBIUS_DOMAIN_WALLPC_DIRAC) {
158  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracMobiusDomainWallPC operator\n");
159  return new DiracMobiusDomainWallPC(param);
160  } else if (param.type == QUDA_STAGGERED_DIRAC) {
161  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracStaggered operator\n");
162  return new DiracStaggered(param);
163  } else if (param.type == QUDA_STAGGEREDPC_DIRAC) {
164  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracStaggeredPC operator\n");
165  return new DiracStaggeredPC(param);
166  } else if (param.type == QUDA_ASQTAD_DIRAC) {
167  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracImprovedStaggered operator\n");
168  return new DiracImprovedStaggered(param);
169  } else if (param.type == QUDA_ASQTADPC_DIRAC) {
170  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracImprovedStaggeredPC operator\n");
171  return new DiracImprovedStaggeredPC(param);
172  } else if (param.type == QUDA_TWISTED_CLOVER_DIRAC) {
173  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracTwistedClover operator (%d flavor(s))\n", param.Ls);
174  if (param.Ls == 1) {
175  return new DiracTwistedClover(param, 4);
176  } else {
177  errorQuda("Cannot create DiracTwistedClover operator for %d flavors\n", param.Ls);
178  }
179  } else if (param.type == QUDA_TWISTED_CLOVERPC_DIRAC) {
180  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracTwistedCloverPC operator (%d flavor(s))\n", param.Ls);
181  if (param.Ls == 1) {
182  return new DiracTwistedCloverPC(param, 4);
183  } else {
184  errorQuda("Cannot create DiracTwistedCloverPC operator for %d flavors\n", param.Ls);
185  }
186  } else if (param.type == QUDA_TWISTED_MASS_DIRAC) {
187  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracTwistedMass operator (%d flavor(s))\n", param.Ls);
188  if (param.Ls == 1) return new DiracTwistedMass(param, 4);
189  else return new DiracTwistedMass(param, 5);
190  } else if (param.type == QUDA_TWISTED_MASSPC_DIRAC) {
191  if (getVerbosity() >= QUDA_VERBOSE) printfQuda("Creating a DiracTwistedMassPC operator (%d flavor(s))\n", param.Ls);
192  if (param.Ls == 1) return new DiracTwistedMassPC(param, 4);
193  else return new DiracTwistedMassPC(param, 5);
194  }
195 
196  return 0;
197  }
198 
199 } // namespace quda
Dirac(const DiracParam &param)
Definition: dirac.cpp:12
cudaGaugeField & gauge
Definition: dirac_quda.h:88
virtual void checkParitySpinor(const cudaColorSpinorField &, const cudaColorSpinorField &) const
Definition: dirac.cpp:84
unsigned long long flops
Definition: dirac_quda.h:93
int VolumeCB() const
QudaVerbosity getVerbosity()
Definition: util_quda.cpp:20
const int * X() const
void Print()
Definition: timer.cpp:6
#define errorQuda(...)
Definition: util_quda.h:73
#define flip(x)
Definition: dirac.cpp:66
bool newTmp(cudaColorSpinorField **, const cudaColorSpinorField &) const
Definition: dirac.cpp:51
cudaColorSpinorField * tmp1
Definition: dslash_test.cpp:41
TimeProfile profile
Definition: dirac_quda.h:104
virtual ~Dirac()
Definition: dirac.cpp:28
QudaDagType dagger
Definition: test_util.cpp:1558
QudaGaugeParam param
Definition: pack_test.cpp:17
void checkSpinorAlias(const cudaColorSpinorField &, const cudaColorSpinorField &) const
Definition: dirac.cpp:129
int commDim[QUDA_MAX_DIM]
Definition: dirac_quda.h:102
cudaColorSpinorField * tmp2
Definition: dslash_test.cpp:41
int Volume() const
cudaColorSpinorField * tmp
VOLATILE spinorFloat kappa
int commDim[QUDA_MAX_DIM]
Definition: dirac_quda.h:42
cpuColorSpinorField * in
QudaTune tune
Definition: dirac_quda.h:100
virtual void MdagM(cudaColorSpinorField &out, const cudaColorSpinorField &in) const =0
void deleteTmp(cudaColorSpinorField **, const bool &reset) const
Definition: dirac.cpp:59
QudaDiracType type
Definition: dirac_quda.h:21
Dirac * dirac
Definition: dslash_test.cpp:45
QudaDagType dagger
Definition: dirac_quda.h:92
double kappa
Definition: dirac_quda.h:89
QudaMatPCType matpcType
Definition: dirac_quda.h:91
cudaColorSpinorField * tmp2
Definition: dirac_quda.h:95
virtual void checkFullSpinor(const cudaColorSpinorField &, const cudaColorSpinorField &) const
Definition: dirac.cpp:121
bool tune
Definition: blas_test.cu:28
Dirac & operator=(const Dirac &dirac)
Definition: dirac.cpp:32
cpuColorSpinorField * out
virtual void M(cudaColorSpinorField &out, const cudaColorSpinorField &in) const =0
cudaColorSpinorField * tmp1
Definition: dirac_quda.h:94
QudaPrecision Precision() const
#define printfQuda(...)
Definition: util_quda.h:67
QudaGammaBasis GammaBasis() const
static Dirac * create(const DiracParam &param)
Definition: dirac.cpp:134
void Mdag(cudaColorSpinorField &out, const cudaColorSpinorField &in) const
Definition: dirac.cpp:68
double mass
Definition: test_util.cpp:1569
QudaSiteSubset SiteSubset() const
void * gauge[4]
Definition: su3_test.cpp:15
void MMdag(cudaColorSpinorField &out, const cudaColorSpinorField &in) const
Definition: dirac.cpp:75