13 template <
typename Float,
typename vFloat,
int fineColor,
int fineSpin,
int coarseColor,
int coarseSpin>
14 void calculateYcoarse(GaugeField &Y, GaugeField &
X, GaugeField &Yatomic, GaugeField &Xatomic,
15 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &clover,
17 bool need_bidirectional) {
24 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
25 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
26 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
28 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder,vFloat>
V;
29 typedef typename colorspinor::FieldOrderCB<Float,2*fineSpin,fineColor,coarseColor,csOrder,vFloat> F;
30 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder,true,vFloat> gFine;
31 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder,true,vFloat> cFine;
32 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,vFloat> gCoarse;
33 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,storeType> gCoarseAtomic;
35 const ColorSpinorField &v = T.Vectors(Y.Location());
37 V vAccessor(const_cast<ColorSpinorField&>(v));
38 F uvAccessor(const_cast<ColorSpinorField&>(uv));
39 gFine gAccessor(const_cast<GaugeField&>(g));
40 cFine cAccessor(const_cast<GaugeField&>(clover));
41 cFine cInvAccessor(const_cast<GaugeField&>(cloverInv));
42 gCoarse yAccessor(const_cast<GaugeField&>(Y));
43 gCoarse xAccessor(const_cast<GaugeField&>(X));
44 gCoarseAtomic yAccessorAtomic(const_cast<GaugeField&>(Yatomic));
45 gCoarseAtomic xAccessorAtomic(const_cast<GaugeField&>(Xatomic));
47 calculateY<true,Float,fineSpin,fineColor,coarseSpin,coarseColor>
48 (yAccessor, xAccessor, yAccessorAtomic, xAccessorAtomic,
49 uvAccessor, vAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor,
50 Y,
X, Yatomic, Xatomic, uv,
const_cast<ColorSpinorField&
>(v), v, kappa, mu, mu_factor, dirac, matpc, need_bidirectional,
51 T.fineToCoarse(Y.Location()), T.coarseToFine(Y.Location()));
58 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
59 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
60 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
62 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder,vFloat>
V;
63 typedef typename colorspinor::FieldOrderCB<Float,2*fineSpin,fineColor,coarseColor,csOrder,vFloat> F;
64 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder,true,vFloat> gFine;
65 typedef typename gauge::FieldOrder<Float,fineColor*fineSpin,fineSpin,gOrder,true,vFloat> cFine;
66 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,vFloat> gCoarse;
67 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,storeType> gCoarseAtomic;
69 const ColorSpinorField &v = T.Vectors(Y.Location());
71 V vAccessor(const_cast<ColorSpinorField&>(v));
72 F uvAccessor(const_cast<ColorSpinorField&>(uv));
73 gFine gAccessor(const_cast<GaugeField&>(g));
74 cFine cAccessor(const_cast<GaugeField&>(clover));
75 cFine cInvAccessor(const_cast<GaugeField&>(cloverInv));
76 gCoarse yAccessor(const_cast<GaugeField&>(Y));
77 gCoarse xAccessor(const_cast<GaugeField&>(X));
78 gCoarseAtomic yAccessorAtomic(const_cast<GaugeField&>(Yatomic));
79 gCoarseAtomic xAccessorAtomic(const_cast<GaugeField&>(Xatomic));
81 calculateY<true,Float,fineSpin,fineColor,coarseSpin,coarseColor>
82 (yAccessor, xAccessor, yAccessorAtomic, xAccessorAtomic,
83 uvAccessor, vAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor,
84 Y,
X, Yatomic, Xatomic, uv,
const_cast<ColorSpinorField&
>(v), v, kappa, mu, mu_factor, dirac, matpc, need_bidirectional,
85 T.fineToCoarse(Y.Location()), T.coarseToFine(Y.Location()));
92 template <
typename Float,
typename vFloat,
int fineColor,
int fineSpin>
93 void calculateYcoarse(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
94 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &clover,
95 const GaugeField &cloverInv,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc,
bool need_bidirectional) {
96 if (T.Vectors().Nspin()/T.Spin_bs() != 2)
97 errorQuda(
"Unsupported number of coarse spins %d\n",T.Vectors().Nspin()/T.Spin_bs());
98 const int coarseSpin = 2;
99 const int coarseColor = Y.Ncolor() / coarseSpin;
101 if (coarseColor == 6) {
102 calculateYcoarse<Float,vFloat,fineColor,fineSpin,6,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
104 }
else if (coarseColor == 8) {
105 calculateYcoarse<Float,vFloat,fineColor,fineSpin,8,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
106 }
else if (coarseColor == 16) {
107 calculateYcoarse<Float,vFloat,fineColor,fineSpin,16,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
109 }
else if (coarseColor == 24) {
110 calculateYcoarse<Float,vFloat,fineColor,fineSpin,24,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
111 }
else if (coarseColor == 32) {
112 calculateYcoarse<Float,vFloat,fineColor,fineSpin,32,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
114 errorQuda(
"Unsupported number of coarse dof %d\n", Y.Ncolor());
119 template <
typename Float,
typename vFloat,
int fineColor>
120 void calculateYcoarse(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
121 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &clover,
122 const GaugeField &cloverInv,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc,
bool need_bidirectional) {
123 if (T.Vectors().Nspin() == 2) {
124 calculateYcoarse<Float,vFloat,fineColor,2>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
126 errorQuda(
"Unsupported number of spins %d\n", T.Vectors().Nspin());
131 template <
typename Float,
typename vFloat>
132 void calculateYcoarse(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
133 ColorSpinorField &uv,
const Transfer &T,
const GaugeField &g,
const GaugeField &clover,
134 const GaugeField &cloverInv,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc,
bool need_bidirectional) {
135 if (g.Ncolor()/T.Vectors().Nspin() == 6) {
136 calculateYcoarse<Float,vFloat,6>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
138 }
else if (g.Ncolor()/T.Vectors().Nspin() == 8) {
139 calculateYcoarse<Float,vFloat,8>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
140 }
else if (g.Ncolor()/T.Vectors().Nspin() == 16) {
141 calculateYcoarse<Float,vFloat,16>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
143 }
else if (g.Ncolor()/T.Vectors().Nspin() == 24) {
144 calculateYcoarse<Float,vFloat,24>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
145 }
else if (g.Ncolor()/T.Vectors().Nspin() == 32) {
146 calculateYcoarse<Float,vFloat,32>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
148 errorQuda(
"Unsupported number of colors %d\n", g.Ncolor());
153 void calculateYcoarse(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic, ColorSpinorField &uv,
154 const Transfer &T,
const GaugeField &g,
const GaugeField &clover,
const GaugeField &cloverInv,
156 checkPrecision(X, Y, g, clover, cloverInv, uv, T.Vectors(X.Location()));
161 #ifdef GPU_MULTIGRID_DOUBLE 163 calculateYcoarse<double,double>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
165 errorQuda(
"Unsupported precision %d\n", Y.Precision());
168 errorQuda(
"Double precision multigrid has not been enabled");
172 calculateYcoarse<float,float>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
174 errorQuda(
"Unsupported precision %d\n", T.Vectors(X.Location()).Precision());
178 calculateYcoarse<float,short>(Y,
X, Yatomic, Xatomic, uv, T, g, clover, cloverInv,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional);
180 errorQuda(
"Unsupported precision %d\n", T.Vectors(X.Location()).Precision());
183 errorQuda(
"Unsupported precision %d\n", Y.Precision());
188 #endif // GPU_MULTIGRID 195 bool need_bidirectional) {
207 UVparam.location = location;
210 UVparam.mem_type = Y.
MemType();
227 calculateYcoarse(Y, X, *Yatomic, *Xatomic, *uv, T, gauge, clover, cloverInv, kappa, mu, mu_factor, dirac, matpc, need_bidirectional);
229 if (Yatomic != &Y)
delete Yatomic;
230 if (Xatomic != &X)
delete Xatomic;
234 errorQuda(
"Multigrid has not been built");
235 #endif // GPU_MULTIGRID
enum QudaPrecision_s QudaPrecision
void CoarseCoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T, const GaugeField &gauge, const GaugeField &clover, const GaugeField &cloverInv, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc, bool need_bidirectional)
Coarse operator construction from an intermediate-grid operator (Coarse)
QudaVerbosity getVerbosity()
#define checkPrecision(...)
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)
virtual QudaMemoryType MemType() const
static GaugeField * Create(const GaugeFieldParam ¶m)
Create the gauge field, with meta data specified in the parameter struct.
QudaFieldLocation location
enum QudaMatPCType_s QudaMatPCType
#define checkLocation(...)
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
enum QudaFieldLocation_s QudaFieldLocation
void setPrecision(QudaPrecision precision, bool force_native=false)
Helper function for setting the precision and corresponding field order for QUDA internal fields...
double mu_factor[QUDA_MAX_MG_LEVEL]
QudaPrecision Precision() const
const ColorSpinorField & Vectors(QudaFieldLocation location=QUDA_INVALID_FIELD_LOCATION) const
enum QudaDiracType_s QudaDiracType