16 template <
typename Float,
int fineColor,
int fineSpin,
int coarseColor,
int coarseSpin>
17 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat,
18 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &
clover,
26 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
27 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
28 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
30 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder> F;
31 typedef typename colorspinor::FieldOrderCB<Float,2*fineSpin,fineColor,coarseColor,csOrder> F2;
32 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder> gFine;
33 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder> gCoarse;
35 const ColorSpinorField &v = T.Vectors(Y.Location());
37 F vAccessor(const_cast<ColorSpinorField&>(v));
38 F2 uvAccessor(const_cast<ColorSpinorField&>(uv));
39 gFine gAccessor(const_cast<GaugeField&>(g));
40 gFine cAccessor(const_cast<GaugeField&>(
clover));
41 gFine cInvAccessor(const_cast<GaugeField&>(cloverInv));
42 gCoarse yAccessor(const_cast<GaugeField&>(Y));
43 gCoarse xAccessor(const_cast<GaugeField&>(
X));
44 gCoarse xInvAccessor(const_cast<GaugeField&>(Xinv));
46 calculateY<true,Float,fineSpin,fineColor,coarseSpin,coarseColor,gOrder>
47 (yAccessor, xAccessor, xInvAccessor, uvAccessor, vAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor,
48 Y,
X, Xinv, Yhat,
const_cast<ColorSpinorField&
>(v), v,
kappa,
mu,
mu_factor,
dirac,
matpc);
55 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
56 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
57 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
59 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder> F;
60 typedef typename colorspinor::FieldOrderCB<Float,2*fineSpin,fineColor,coarseColor,csOrder> F2;
61 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder> gFine;
62 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder> gCoarse;
64 const ColorSpinorField &v = T.Vectors(Y.Location());
66 F vAccessor(const_cast<ColorSpinorField&>(v));
67 F2 uvAccessor(const_cast<ColorSpinorField&>(uv));
68 gFine gAccessor(const_cast<GaugeField&>(g));
69 gFine cAccessor(const_cast<GaugeField&>(
clover));
70 gFine cInvAccessor(const_cast<GaugeField&>(cloverInv));
71 gCoarse yAccessor(const_cast<GaugeField&>(Y));
72 gCoarse xAccessor(const_cast<GaugeField&>(
X));
73 gCoarse xInvAccessor(const_cast<GaugeField&>(Xinv));
75 calculateY<true,Float,fineSpin,fineColor,coarseSpin,coarseColor,gOrder>
76 (yAccessor, xAccessor, xInvAccessor, uvAccessor, vAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor,
77 Y,
X, Xinv, Yhat,
const_cast<ColorSpinorField&
>(v), v,
kappa,
mu,
mu_factor,
dirac,
matpc);
84 template <
typename Float,
int fineColor,
int fineSpin>
85 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat,
86 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &
clover,
88 if (T.Vectors().Nspin()/T.Spin_bs() != 2)
89 errorQuda(
"Unsupported number of coarse spins %d\n",T.Vectors().Nspin()/T.Spin_bs());
90 const int coarseSpin = 2;
91 const int coarseColor = Y.Ncolor() / coarseSpin;
93 if (coarseColor == 2) {
94 calculateYcoarse<Float,fineColor,fineSpin,2,coarseSpin>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
96 }
else if (coarseColor == 8) {
97 calculateYcoarse<Float,fineColor,fineSpin,8,coarseSpin>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
98 }
else if (coarseColor == 16) {
99 calculateYcoarse<Float,fineColor,fineSpin,16,coarseSpin>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
101 }
else if (coarseColor == 24) {
102 calculateYcoarse<Float,fineColor,fineSpin,24,coarseSpin>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
103 }
else if (coarseColor == 32) {
104 calculateYcoarse<Float,fineColor,fineSpin,32,coarseSpin>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
106 errorQuda(
"Unsupported number of coarse dof %d\n", Y.Ncolor());
111 template <
typename Float,
int fineColor>
112 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat,
113 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &
clover,
115 if (T.Vectors().Nspin() == 2) {
116 calculateYcoarse<Float,fineColor,2>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
118 errorQuda(
"Unsupported number of spins %d\n", T.Vectors().Nspin());
123 template <
typename Float>
124 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat,
125 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &
clover,
127 if (g.Ncolor()/T.Vectors().Nspin() == 2) {
128 calculateYcoarse<Float,2>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
130 }
else if (g.Ncolor()/T.Vectors().Nspin() == 8) {
131 calculateYcoarse<Float,8>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
132 }
else if (g.Ncolor()/T.Vectors().Nspin() == 16) {
133 calculateYcoarse<Float,16>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
135 }
else if (g.Ncolor()/T.Vectors().Nspin() == 24) {
136 calculateYcoarse<Float,24>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
137 }
else if (g.Ncolor()/T.Vectors().Nspin() == 32) {
138 calculateYcoarse<Float,32>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
140 errorQuda(
"Unsupported number of colors %d\n", g.Ncolor());
145 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv,
146 const Transfer &T,
const GaugeField &g,
const GaugeField &
clover,
const GaugeField &cloverInv,
152 #ifdef GPU_MULTIGRID_DOUBLE 153 calculateYcoarse<double>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
155 errorQuda(
"Double precision multigrid has not been enabled");
158 calculateYcoarse<float>(Y,
X, Xinv, Yhat, uv, T, g,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
160 errorQuda(
"Unsupported precision %d\n", Y.Precision());
165 #endif // GPU_MULTIGRID 183 UVparam.location = location;
188 calculateYcoarse(Y,
X, Xinv, Yhat, *uv, T, gauge,
clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc);
192 errorQuda(
"Multigrid has not been built");
193 #endif // GPU_MULTIGRID
enum QudaPrecision_s QudaPrecision
#define checkPrecision(...)
double mu_factor[QUDA_MAX_MG_LEVEL]
enum QudaFieldOrder_s QudaFieldOrder
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
void matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision, double mferm)
const ColorSpinorField & Vectors(QudaFieldLocation location=QUDA_CPU_FIELD_LOCATION) const
VOLATILE spinorFloat kappa
enum QudaMatPCType_s QudaMatPCType
#define checkLocation(...)
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
Main header file for host and device accessors to GaugeFields.
void CoarseCoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, const Transfer &T, const GaugeField &gauge, const GaugeField &clover, const GaugeField &cloverInv, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc)
Coarse operator construction from an intermediate-grid operator (Coarse)
enum QudaFieldLocation_s QudaFieldLocation
QudaPrecision Precision() const
enum QudaDiracType_s QudaDiracType