14 template <
typename Float,
typename vFloat,
int fineColor,
int fineSpin,
int coarseColor,
int coarseSpin>
15 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Yatomic, GaugeField &Xatomic,
16 ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
21 bool need_bidirectional =
false;
30 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
31 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
32 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
33 if (c.Order() != clOrder && c.Bytes())
errorQuda(
"Unsupported field order %d\n", c.Order());
35 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder,vFloat>
V;
36 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder,vFloat> F;
37 typedef typename gauge::FieldOrder<Float,fineColor,1,gOrder> gFine;
38 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,vFloat> gCoarse;
39 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,storeType> gCoarseAtomic;
40 typedef typename clover::FieldOrder<Float,fineColor,fineSpin,clOrder> cFine;
42 const ColorSpinorField &v = T.Vectors(g.Location());
44 V vAccessor(const_cast<ColorSpinorField&>(v));
45 F uvAccessor(const_cast<ColorSpinorField&>(uv));
46 F avAccessor(const_cast<ColorSpinorField&>(av));
47 gFine gAccessor(const_cast<GaugeField&>(g));
48 gCoarse yAccessor(const_cast<GaugeField&>(Y));
49 gCoarse xAccessor(const_cast<GaugeField&>(X));
50 gCoarseAtomic yAccessorAtomic(const_cast<GaugeField&>(Yatomic));
51 gCoarseAtomic xAccessorAtomic(const_cast<GaugeField&>(Xatomic));
52 cFine cAccessor(const_cast<CloverField&>(c),
false);
53 cFine cInvAccessor(const_cast<CloverField&>(c),
true);
56 calculateY<false,Float,fineSpin,fineColor,coarseSpin,coarseColor>
57 (yAccessor, xAccessor, yAccessorAtomic, xAccessorAtomic, uvAccessor,
58 avAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor, Y,
X, Yatomic, Xatomic, uv, av, v,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional,
59 T.fineToCoarse(location), T.coarseToFine(location));
67 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
68 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
69 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
70 if (c.Order() != clOrder && c.Bytes())
errorQuda(
"Unsupported field order %d\n", c.Order());
72 constexpr
bool use_tex = __COMPUTE_CAPABILITY__ < 520 ? true :
false;
73 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder,vFloat,vFloat,false,false,use_tex> F;
74 typedef typename gauge::FieldOrder<Float,fineColor,1,gOrder,true,Float,use_tex> gFine;
75 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,vFloat> gCoarse;
76 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder,true,storeType> gCoarseAtomic;
77 typedef typename clover::FieldOrder<Float,fineColor,fineSpin,clOrder> cFine;
79 const ColorSpinorField &v = T.Vectors(g.Location());
81 F vAccessor(const_cast<ColorSpinorField&>(v));
82 F uvAccessor(const_cast<ColorSpinorField&>(uv));
83 F avAccessor(const_cast<ColorSpinorField&>(av));
84 gFine gAccessor(const_cast<GaugeField&>(g));
85 gCoarse yAccessor(const_cast<GaugeField&>(Y));
86 gCoarse xAccessor(const_cast<GaugeField&>(X));
87 gCoarseAtomic yAccessorAtomic(const_cast<GaugeField&>(Yatomic));
88 gCoarseAtomic xAccessorAtomic(const_cast<GaugeField&>(Xatomic));
89 cFine cAccessor(const_cast<CloverField&>(c),
false);
90 cFine cInvAccessor(const_cast<CloverField&>(c),
true);
92 calculateY<false,Float,fineSpin,fineColor,coarseSpin,coarseColor>
93 (yAccessor, xAccessor, yAccessorAtomic, xAccessorAtomic, uvAccessor,
94 avAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor, Y,
X, Yatomic, Xatomic, uv, av, v,
kappa,
mu,
mu_factor,
dirac,
matpc, need_bidirectional,
95 T.fineToCoarse(location), T.coarseToFine(location));
102 template <
typename Float,
typename vFloat,
int fineColor,
int fineSpin>
103 void calculateY(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
104 ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
105 const GaugeField &g,
const CloverField &c,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc) {
106 if (T.Vectors().Nspin()/T.Spin_bs() != 2)
107 errorQuda(
"Unsupported number of coarse spins %d\n",T.Vectors().Nspin()/T.Spin_bs());
108 const int coarseSpin = 2;
109 const int coarseColor = Y.Ncolor() / coarseSpin;
112 }
else if (coarseCoor == 4) {
113 calculateY<Float,vFloat,fineColor,fineSpin,4,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
115 if (coarseColor == 6) {
116 calculateY<Float,vFloat,fineColor,fineSpin,6,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
118 }
else if (coarseColor == 8) {
119 calculateY<Float,vFloat,fineColor,fineSpin,8,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
120 }
else if (coarseColor == 12) {
121 calculateY<Float,vFloat,fineColor,fineSpin,12,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
122 }
else if (coarseColor == 16) {
123 calculateY<Float,vFloat,fineColor,fineSpin,16,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
124 }
else if (coarseColor == 20) {
125 calculateY<Float,vFloat,fineColor,fineSpin,20,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
127 }
else if (coarseColor == 24) {
128 calculateY<Float,vFloat,fineColor,fineSpin,24,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
129 }
else if (coarseColor == 32) {
130 calculateY<Float,vFloat,fineColor,fineSpin,32,coarseSpin>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
132 errorQuda(
"Unsupported number of coarse dof %d\n", Y.Ncolor());
137 template <
typename Float,
typename vFloat,
int fineColor>
138 void calculateY(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
139 ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
140 const GaugeField &g,
const CloverField &c,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc) {
141 if (uv.Nspin() == 4) {
142 calculateY<Float,vFloat,fineColor,4>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
144 errorQuda(
"Unsupported number of spins %d\n", uv.Nspin());
149 template <
typename Float,
typename vFloat>
150 void calculateY(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
151 ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
152 const GaugeField &g,
const CloverField &c,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc) {
153 if (g.Ncolor() == 3) {
154 calculateY<Float,vFloat,3>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
156 errorQuda(
"Unsupported number of colors %d\n", g.Ncolor());
161 void calculateY(GaugeField &Y, GaugeField &X, GaugeField &Yatomic, GaugeField &Xatomic,
162 ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
163 const GaugeField &g,
const CloverField &c,
double kappa,
double mu,
double mu_factor,
QudaDiracType dirac,
QudaMatPCType matpc) {
170 #ifdef GPU_MULTIGRID_DOUBLE 172 calculateY<double,double>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
174 errorQuda(
"Unsupported precision %d\n", Y.Precision());
177 errorQuda(
"Double precision multigrid has not been enabled");
181 calculateY<float,float>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
183 errorQuda(
"Unsupported precision %d\n", T.Vectors(X.Location()).Precision());
187 calculateY<float,short>(Y,
X, Yatomic, Xatomic, uv, av, T, g, c,
kappa,
mu,
mu_factor,
dirac,
matpc);
189 errorQuda(
"Unsupported precision %d\n", T.Vectors(X.Location()).Precision());
192 errorQuda(
"Unsupported precision %d\n", Y.Precision());
197 #endif // GPU_MULTIGRID 218 gf_param.link_type = gauge.
LinkType();
221 gf_param.gauge = NULL;
248 for(
int i = 0; i < cf_param.
nDim; i++) cf_param.
x[i] = clover ? clover->
X()[i] : 0;
267 if (clover) clover->
saveCPUField(*static_cast<cpuCloverField*>(C));
273 UVparam.location = location;
275 UVparam.mem_type = Y.
MemType();
297 calculateY(Y, X, *Yatomic, *Xatomic, *uv, *av, T, *U, *C, kappa, mu, mu_factor, dirac, matpc);
299 if (Yatomic != &Y)
delete Yatomic;
300 if (Xatomic != &X)
delete Xatomic;
302 if (&T.
Vectors(location) != av)
delete av;
305 if (C != clover)
delete C;
306 if (U != &gauge)
delete U;
308 errorQuda(
"Multigrid has not been built");
309 #endif // GPU_MULTIGRID QudaCloverFieldOrder order
enum QudaPrecision_s QudaPrecision
void saveCPUField(cpuGaugeField &cpu) const
Upload from this field into a CPU field.
QudaVerbosity getVerbosity()
#define checkPrecision(...)
void saveCPUField(cpuCloverField &cpu) const
enum QudaFieldOrder_s QudaFieldOrder
QudaLinkType LinkType() const
void CoarseOp(GaugeField &Y, GaugeField &X, const Transfer &T, const cudaGaugeField &gauge, const cudaCloverField *clover, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc)
Coarse operator construction from a fine-grid operator (Wilson / Clover)
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
QudaFieldGeometry Geometry() const
QudaSiteSubset siteSubset
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
enum QudaCloverFieldOrder_s QudaCloverFieldOrder
static GaugeField * Create(const GaugeFieldParam ¶m)
Create the gauge field, with meta data specified in the parameter struct.
void setPrecision(QudaPrecision precision)
QudaFieldLocation location
enum QudaMatPCType_s QudaMatPCType
double Anisotropy() const
QudaGaugeFieldOrder order
#define checkLocation(...)
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
void calculateY(coarseGauge &Y, coarseGauge &X, coarseGaugeAtomic &Y_atomic, coarseGaugeAtomic &X_atomic, Ftmp &UV, F &AV, Vt &V, fineGauge &G, fineClover &C, fineClover &Cinv, GaugeField &Y_, GaugeField &X_, GaugeField &Y_atomic_, GaugeField &X_atomic_, ColorSpinorField &uv, ColorSpinorField &av, const ColorSpinorField &v, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc, bool need_bidirectional, const int *fine_to_coarse, const int *coarse_to_fine)
Calculate the coarse-link field, including the coarse clover field.
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...
QudaPrecision Precision() const
double mu_factor[QUDA_MAX_MG_LEVEL]
QudaReconstructType reconstruct
QudaReconstructType Reconstruct() const
QudaTboundary TBoundary() const
QudaGaugeFixed GaugeFixed() const
QudaPrecision Precision() const
const ColorSpinorField & Vectors(QudaFieldLocation location=QUDA_INVALID_FIELD_LOCATION) const
virtual void copy(const GaugeField &src)=0
enum QudaDiracType_s QudaDiracType