7 using namespace colorspinor;
15 for (
int x_cb=0; x_cb<
t.VolumeCB(); x_cb++) {
16 for (
int s=0;
s<
t.Nspin();
s++) {
17 for (
int c=0;
c<
t.Ncolor();
c++) {
39 for (
int x_cb=0; x_cb<
t.VolumeCB(); x_cb++) {
41 for (
int s2=0; s2<
t.Nspin(); s2++) {
42 for (
int c2=0; c2<
t.Ncolor(); c2++) {
57 int X[4] = {
p.X(0),
p.X(1),
p.X(2),
p.X(3)};
58 X[0] *= (
p.Nparity() == 1) ? 2 : 1;
61 for (
int x_cb=0; x_cb<
p.VolumeCB(); x_cb++) {
67 for (
int s=0;
s<
p.Nspin();
s++)
68 for (
int c=0;
c<
p.Ncolor();
c++)
75 template <
typename Float,
int nSpin,
int nColor, QudaFieldOrder order>
82 else errorQuda(
"Unsupported source type %d", sourceType);
85 template <
typename Float,
int nSpin, QudaFieldOrder order>
87 if (
a.Ncolor() == 2) {
88 genericSource<Float,nSpin,2,order>(
a,sourceType,
x,
s,
c);
89 }
else if (
a.Ncolor() == 3) {
90 genericSource<Float,nSpin,3,order>(
a,sourceType,
x,
s,
c);
91 }
else if (
a.Ncolor() == 4) {
92 genericSource<Float,nSpin,4,order>(
a,sourceType,
x,
s,
c);
93 }
else if (
a.Ncolor() == 8) {
94 genericSource<Float,nSpin,8,order>(
a,sourceType,
x,
s,
c);
95 }
else if (
a.Ncolor() == 12) {
96 genericSource<Float,nSpin,12,order>(
a,sourceType,
x,
s,
c);
97 }
else if (
a.Ncolor() == 16) {
98 genericSource<Float,nSpin,16,order>(
a,sourceType,
x,
s,
c);
99 }
else if (
a.Ncolor() == 20) {
100 genericSource<Float,nSpin,20,order>(
a,sourceType,
x,
s,
c);
101 }
else if (
a.Ncolor() == 24) {
102 genericSource<Float,nSpin,24,order>(
a,sourceType,
x,
s,
c);
103 }
else if (
a.Ncolor() == 32) {
104 genericSource<Float,nSpin,32,order>(
a,sourceType,
x,
s,
c);
106 errorQuda(
"Unsupported nColor=%d\n",
a.Ncolor());
110 template <
typename Float, QudaFieldOrder order>
112 if (
a.Nspin() == 1) {
113 genericSource<Float,1,order>(
a,sourceType,
x,
s,
c);
114 }
else if (
a.Nspin() == 2) {
115 genericSource<Float,2,order>(
a,sourceType,
x,
s,
c);
116 }
else if (
a.Nspin() == 4) {
117 genericSource<Float,4,order>(
a,sourceType,
x,
s,
c);
119 errorQuda(
"Unsupported nSpin=%d\n",
a.Nspin());
123 template <
typename Float>
126 genericSource<Float,QUDA_SPACE_SPIN_COLOR_FIELD_ORDER>(
a,sourceType,
x,
s,
c);
128 errorQuda(
"Unsupported field order %d\n",
a.FieldOrder());
136 genericSource<double>(
a,sourceType,
x,
s,
c);
138 genericSource<float>(
a,sourceType,
x,
s,
c);
146 template <
class U,
class V>
148 int fail_check = 16*
tol;
149 int *fail =
new int[fail_check];
150 for (
int f=0;
f<fail_check;
f++) fail[
f] = 0;
152 int N = 2*u.Nspin()*u.Ncolor();
153 int *iter =
new int[N];
154 for (
int i=0;
i<N;
i++) iter[
i] = 0;
157 for (
int x_cb=0; x_cb<u.VolumeCB(); x_cb++) {
159 for (
int s=0;
s<u.Nspin();
s++) {
160 for (
int c=0;
c<u.Ncolor();
c++) {
161 for (
int z=0;
z<2;
z++) {
162 int j = (
s*u.Ncolor() +
c)*2+
z;
167 for (
int f=0;
f<fail_check;
f++) {
168 if (diff >
pow(10.0,-(
f+1)/(
double)
tol)) {
173 if (diff > 1
e-3) iter[j]++;
186 int accuracy_level =0;
187 for (
int f=0;
f<fail_check;
f++) {
188 if (fail[
f] == 0) accuracy_level =
f+1;
192 for (
int f=0;
f<fail_check;
f++) {
200 return accuracy_level;
203 template <
typename oFloat,
typename iFloat, QudaFieldOrder order>
206 if (
a.Ncolor() == 3) {
208 if (
a.Nspin() == 4) {
213 }
else if (
a.Nspin() == 1) {
220 errorQuda(
"Number of colors %d not supported",
a.Ncolor());
226 template <
typename oFloat,
typename iFloat>
231 ret = genericCompare<oFloat,iFloat,QUDA_SPACE_SPIN_COLOR_FIELD_ORDER>(
a,
b,
tol);
233 errorQuda(
"Unsupported field order %d\n",
a.FieldOrder());
239 template <
typename oFloat>
243 ret = genericCompare<oFloat,double>(
a,
b,
tol);
245 ret = genericCompare<oFloat,float>(
a,
b,
tol);
256 ret = genericCompare<double>(
a,
b,
tol);
258 ret = genericCompare<float>(
a,
b,
tol);
266 template <
class Order>
269 int x_cb =
x / o.Nparity();
272 for (
int s=0;
s<o.Nspin();
s++) {
273 std::cout <<
"x = " <<
x <<
", s = " <<
s <<
", { ";
274 for (
int c=0;
c<o.Ncolor();
c++) {
275 std::cout << o(
parity, x_cb,
s,
c) ;
276 std::cout << ((
c<o.Ncolor()-1) ?
" , " :
" " ) ;
278 std::cout <<
"}" << std::endl;
284 template <
typename Float, QudaFieldOrder order>
286 if (
a.Ncolor() == 3 &&
a.Nspin() == 4) {
290 else if (
a.Ncolor() == 2 &&
a.Nspin() == 2) {
294 else if (
a.Ncolor() == 24 &&
a.Nspin() == 2) {
298 else if (
a.Ncolor() == 6 &&
a.Nspin() == 4) {
302 else if (
a.Ncolor() == 72 &&
a.Nspin() == 4) {
306 else if (
a.Ncolor() == 576 &&
a.Nspin() == 2) {
311 errorQuda(
"Not supported Ncolor = %d, Nspin = %d",
a.Ncolor(),
a.Nspin());
316 template <
typename Float>
319 genericPrintVector<Float,QUDA_SPACE_SPIN_COLOR_FIELD_ORDER>(
a,
x);
321 errorQuda(
"Unsupported field order %d\n",
a.FieldOrder());
328 genericPrintVector<double>(
a,
x);
330 genericPrintVector<float>(
a,
x);
332 errorQuda(
"Precision %d not implemented",
a.Precision());
int genericCompare(const cpuColorSpinorField &a, const cpuColorSpinorField &b, int tol)
void print_vector(const Order &o, unsigned int x)
static __inline__ enum cudaRoundMode mode
int compareSpinor(const U &u, const V &v, const int tol)
enum QudaSourceType_s QudaSourceType
__host__ __device__ ValueType sin(ValueType x)
static __inline__ size_t p
__host__ __device__ ValueType pow(ValueType x, ExponentType e)
int int int enum cudaChannelFormatKind f
void genericSource(cpuColorSpinorField &a, QudaSourceType sourceType, int x, int s, int c)
void genericPrintVector(cpuColorSpinorField &a, unsigned int x)
void point(T &t, int x, int s, int c)
void comm_allreduce_int(int *data)
static __inline__ size_t size_t d
void constant(T &t, int k, int s, int c)
static __device__ __host__ void getCoords(int x[], int cb_index, const I X[], int parity)