17 template <
typename Float,
int fineColor,
int fineSpin,
int coarseColor,
int coarseSpin>
18 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
29 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
30 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
31 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
32 if (
c.Order() != clOrder &&
c.Bytes())
errorQuda(
"Unsupported field order %d\n",
c.Order());
34 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder> F;
35 typedef typename gauge::FieldOrder<Float,fineColor,1,gOrder> gFine;
36 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder> gCoarse;
37 typedef typename clover::FieldOrder<Float,fineColor,fineSpin,clOrder> cFine;
39 const ColorSpinorField &v = T.Vectors(g.Location());
41 F vAccessor(const_cast<ColorSpinorField&>(v));
42 F uvAccessor(const_cast<ColorSpinorField&>(uv));
43 F avAccessor(const_cast<ColorSpinorField&>(av));
44 gFine gAccessor(const_cast<GaugeField&>(g));
45 gCoarse yAccessor(const_cast<GaugeField&>(Y));
46 gCoarse xAccessor(const_cast<GaugeField&>(
X));
47 gCoarse xInvAccessor(const_cast<GaugeField&>(Xinv));
48 cFine cAccessor(const_cast<CloverField&>(
c),
false);
49 cFine cInvAccessor(const_cast<CloverField&>(
c),
true);
51 calculateY<false,Float,fineSpin,fineColor,coarseSpin,coarseColor,gOrder>
52 (yAccessor, xAccessor, xInvAccessor, uvAccessor, avAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor, Y,
X, Xinv, Yhat, av, v,
kappa,
mu,
mu_factor,
dirac,
matpc);
60 if (T.Vectors(Y.Location()).FieldOrder() != csOrder)
61 errorQuda(
"Unsupported field order %d\n", T.Vectors(Y.Location()).FieldOrder());
62 if (g.FieldOrder() != gOrder)
errorQuda(
"Unsupported field order %d\n", g.FieldOrder());
63 if (
c.Order() != clOrder &&
c.Bytes())
errorQuda(
"Unsupported field order %d\n",
c.Order());
65 typedef typename colorspinor::FieldOrderCB<Float,fineSpin,fineColor,coarseColor,csOrder> F;
66 typedef typename gauge::FieldOrder<Float,fineColor,1,gOrder> gFine;
67 typedef typename gauge::FieldOrder<Float,coarseColor*coarseSpin,coarseSpin,gOrder> gCoarse;
68 typedef typename clover::FieldOrder<Float,fineColor,fineSpin,clOrder> cFine;
70 const ColorSpinorField &v = T.Vectors(g.Location());
72 F vAccessor(const_cast<ColorSpinorField&>(v));
73 F uvAccessor(const_cast<ColorSpinorField&>(uv));
74 F avAccessor(const_cast<ColorSpinorField&>(av));
75 gFine gAccessor(const_cast<GaugeField&>(g));
76 gCoarse yAccessor(const_cast<GaugeField&>(Y));
77 gCoarse xAccessor(const_cast<GaugeField&>(
X));
78 gCoarse xInvAccessor(const_cast<GaugeField&>(Xinv));
79 cFine cAccessor(const_cast<CloverField&>(
c),
false);
80 cFine cInvAccessor(const_cast<CloverField&>(
c),
true);
82 calculateY<false,Float,fineSpin,fineColor,coarseSpin,coarseColor,gOrder>
83 (yAccessor, xAccessor, xInvAccessor, uvAccessor, avAccessor, vAccessor, gAccessor, cAccessor, cInvAccessor, Y,
X, Xinv, Yhat, av, v,
kappa,
mu,
mu_factor,
dirac,
matpc);
90 template <
typename Float,
int fineColor,
int fineSpin>
91 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
93 if (T.Vectors().Nspin()/T.Spin_bs() != 2)
94 errorQuda(
"Unsupported number of coarse spins %d\n",T.Vectors().Nspin()/T.Spin_bs());
95 const int coarseSpin = 2;
96 const int coarseColor = Y.Ncolor() / coarseSpin;
98 if (coarseColor == 2) {
99 calculateY<Float,fineColor,fineSpin,2,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
101 }
else if (coarseCoor == 4) {
102 calculateY<Float,fineColor,fineSpin,4,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
103 }
else if (coarseColor == 8) {
104 calculateY<Float,fineColor,fineSpin,8,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
105 }
else if (coarseColor == 12) {
106 calculateY<Float,fineColor,fineSpin,12,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
107 }
else if (coarseColor == 16) {
108 calculateY<Float,fineColor,fineSpin,16,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
109 }
else if (coarseColor == 20) {
110 calculateY<Float,fineColor,fineSpin,20,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
112 }
else if (coarseColor == 24) {
113 calculateY<Float,fineColor,fineSpin,24,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
115 }
else if (coarseColor == 32) {
116 calculateY<Float,fineColor,fineSpin,32,coarseSpin>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
119 errorQuda(
"Unsupported number of coarse dof %d\n", Y.Ncolor());
124 template <
typename Float,
int fineColor>
125 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
127 if (uv.Nspin() == 4) {
128 calculateY<Float,fineColor,4>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
130 errorQuda(
"Unsupported number of spins %d\n", uv.Nspin());
135 template <
typename Float>
136 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
138 if (g.Ncolor() == 3) {
139 calculateY<Float,3>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
141 errorQuda(
"Unsupported number of colors %d\n", g.Ncolor());
146 void calculateY(GaugeField &Y, GaugeField &
X, GaugeField &Xinv, GaugeField &Yhat, ColorSpinorField &uv, ColorSpinorField &av,
const Transfer &T,
153 #ifdef GPU_MULTIGRID_DOUBLE 154 calculateY<double>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
156 errorQuda(
"Double precision multigrid has not been enabled");
159 calculateY<float>(Y,
X, Xinv, Yhat, uv, av, T, g,
c,
kappa,
mu,
mu_factor,
dirac,
matpc);
161 errorQuda(
"Unsupported precision %d\n", Y.Precision());
166 #endif // GPU_MULTIGRID 187 gf_param.link_type = gauge.
LinkType();
190 gf_param.gauge = NULL;
235 if (
clover)
clover->saveCPUField(*static_cast<cpuCloverField*>(C));
241 UVparam.location = location;
250 calculateY(Y,
X, Xinv, Yhat, *uv, *av, T, *U, *C,
kappa,
mu,
mu_factor,
dirac,
matpc);
252 if (&T.
Vectors(location) != av)
delete av;
255 if (C !=
clover)
delete C;
256 if (U != &gauge)
delete U;
258 errorQuda(
"Multigrid has not been built");
259 #endif // GPU_MULTIGRID QudaCloverFieldOrder order
enum QudaPrecision_s QudaPrecision
void saveCPUField(cpuGaugeField &cpu) const
Upload from this field into a CPU field.
#define checkPrecision(...)
void setPrecision(QudaPrecision precision)
Helper function for setting the precision and corresponding field order for QUDA internal fields...
double mu_factor[QUDA_MAX_MG_LEVEL]
enum QudaFieldOrder_s QudaFieldOrder
QudaLinkType LinkType() const
static ColorSpinorField * Create(const ColorSpinorParam ¶m)
QudaFieldGeometry Geometry() const
Main header file for host and device accessors to CloverFields.
QudaSiteSubset siteSubset
void matpc(void *outEven, void **gauge, void *inEven, double kappa, QudaMatPCType matpc_type, int dagger_bit, QudaPrecision sPrecision, QudaPrecision gPrecision, double mferm)
enum QudaCloverFieldOrder_s QudaCloverFieldOrder
const ColorSpinorField & Vectors(QudaFieldLocation location=QUDA_CPU_FIELD_LOCATION) const
VOLATILE spinorFloat kappa
enum QudaMatPCType_s QudaMatPCType
double Anisotropy() const
QudaGaugeFieldOrder order
#define checkLocation(...)
enum QudaGaugeFieldOrder_s QudaGaugeFieldOrder
Main header file for host and device accessors to GaugeFields.
enum QudaFieldLocation_s QudaFieldLocation
QudaReconstructType reconstruct
QudaReconstructType Reconstruct() const
void CoarseOp(GaugeField &Y, GaugeField &X, GaugeField &Xinv, GaugeField &Yhat, 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)
QudaTboundary TBoundary() const
QudaGaugeFixed GaugeFixed() const
QudaPrecision Precision() const
virtual void copy(const GaugeField &src)=0
void calculateY(coarseGauge &Y, coarseGauge &X, coarseGauge &Xinv, Ftmp &UV, F &AV, F &V, fineGauge &G, fineClover &C, fineClover &Cinv, GaugeField &Y_, GaugeField &X_, GaugeField &Xinv_, GaugeField &Yhat_, ColorSpinorField &av, const ColorSpinorField &v, double kappa, double mu, double mu_factor, QudaDiracType dirac, QudaMatPCType matpc)
Calculate the coarse-link field, include the clover field, and its inverse, and finally also compute ...
enum QudaDiracType_s QudaDiracType