55 template <
typename Float,
int length,
int N>
70 this->clover[0] = clover_ ? clover_ : (
Float*)(clover.
V(inverse));
71 this->clover[1] = (
Float*)((
char*)this->clover[0] + clover.
Bytes()/2);
72 this->
norm[0] = norm_ ? norm_ : (
float*)(clover.
Norm(inverse));
82 const int M=length/(N*2);
83 for (
int chirality=0; chirality<2; chirality++) {
84 for (
int i=0; i<M; i++) {
85 for (
int j=0; j<N; j++) {
86 int intIdx = (chirality*M + i)*N + j;
87 int padIdx = intIdx / N;
88 copy(v[(chirality*M+i)*N+j],
clover[parity][(padIdx*
stride + x)*N + intIdx%N]);
89 if (
sizeof(
Float)==
sizeof(
short)) v[(chirality*M+i)*N+j] *=
norm[parity][chirality*
volumeCB + x];
98 if (
sizeof(
Float)==
sizeof(
short)) {
99 const int M = length/2;
100 for (
int chi=0; chi<2; chi++) {
102 for (
int i=0; i<M; i++)
103 scale[chi] = fabs(v[chi*M+i]) > scale[chi] ? fabs(v[chi*M+i]) : scale[chi];
108 const int M=length/(N*2);
109 for (
int chirality=0; chirality<2; chirality++) {
110 for (
int i=0; i<M; i++) {
111 for (
int j=0; j<N; j++) {
112 int intIdx = (chirality*M + i)*N + j;
113 int padIdx = intIdx / N;
114 if (
sizeof(
Float)==
sizeof(short))
115 copy(
clover[parity][(padIdx*
stride + x)*N + intIdx%N], v[(chirality*M+i)*N+j] / scale[chirality]);
117 copy(
clover[parity][(padIdx*
stride + x)*N + intIdx%N], v[(chirality*M+i)*N+j]);
125 if (
sizeof(
Float)==
sizeof(short)) bytes += 2*
sizeof(float);
133 template <
typename Float,
int length>
147 this->clover[0] = clover_ ? clover_ : (
Float*)(clover.
V(inverse));
148 this->clover[1] = (
Float*)((
char*)this->clover[0] + clover.
Bytes()/2);
157 for (
int i=0; i<
length; i++) v[i] = 0.5*
clover[parity][x*length+i];
161 for (
int i=0; i<
length; i++)
clover[parity][x*length+i] = 2.0*v[i];
170 template <
typename Float,
int length>
186 diag = clover_ ? ((
Float**)clover_)[1] : ((
Float**)clover.
V(inverse))[1];
196 for (
int chirality=0; chirality<2; chirality++) {
198 for (
int i=0; i<6; i++) {
199 v[chirality*36 + i] = 0.5*
diag[((i*2 + chirality)*2 + parity)*
volumeCB +
x];
203 for (
int i=0; i<30; i++) {
206 const int idtab[15]={0,1,3,6,10,2,4,7,11,5,8,12,9,13,14};
207 v[chirality*36 + 6 + i] = 0.5*
offdiag[(((z*15 + idtab[off])*2 + chirality)*2 +
parity)*
volumeCB + x];
215 for (
int chirality=0; chirality<2; chirality++) {
217 for (
int i=0; i<6; i++) {
218 diag[((i*2 + chirality)*2 + parity)*
volumeCB +
x] = 2.0*v[chirality*36 + i];
222 for (
int i=0; i<30; i++) {
225 const int idtab[15]={0,1,3,6,10,2,4,7,11,5,8,12,9,13,14};
226 offdiag[(((z*15 + idtab[off])*2 + chirality)*2 +
parity)*
volumeCB + x] = 2.0*v[chirality*36 + 6 + i];
241 template <
typename Float,
int length>
255 this->clover[0] = clover_ ? clover_ : (
Float*)(clover.
V(inverse));
256 this->clover[1] = (
Float*)((
char*)this->clover[0] + clover.
Bytes()/2);
272 int bq[36] = { 21, 32, 33, 0, 1, 20,
273 28, 29, 30, 31, 6, 7, 14, 15, 22, 23,
274 34, 35, 8, 9, 16, 17, 24, 25,
275 10, 11, 18, 19, 26, 27,
281 for (
int i=0; i<6; i++) sign[i] = 1;
282 for (
int i=6; i<36; i+=2) {
283 if ( (i >= 10 && i<= 15) || (i >= 18 && i <= 29) ) { sign[i] = -1; sign[i+1] = -1; }
284 else { sign[i] = 1; sign[i+1] = -1; }
287 const int M=length/2;
288 for (
int chirality=0; chirality<2; chirality++)
289 for (
int i=0; i<M; i++)
290 v[chirality*M+i] = sign[i] *
clover[parity][x*length+chirality*M+bq[i]];
void * V(bool inverse=false)
__device__ __host__ void save(const RegType v[length], int x, int parity)
__device__ __host__ void save(const RegType v[length], int x, int parity)
__host__ __device__ void copy(T1 &a, const T2 &b)
mapper< Float >::type RegType
QDPJITOrder(const CloverField &clover, bool inverse, Float *clover_=0)
FloatingPoint< float > Float
mapper< Float >::type RegType
BQCDOrder(const CloverField &clover, bool inverse, Float *clover_=0)
__device__ __host__ void load(RegType v[length], int x, int parity) const
__device__ __host__ void save(RegType v[length], int x, int parity)
mapper< Float >::type RegType
void * Norm(bool inverse=false)
__device__ __host__ void load(RegType v[length], int x, int parity) const
__device__ __host__ void load(RegType v[length], int x, int parity) const
mapper< Float >::type RegType
QDPOrder(const CloverField &clover, bool inverse, Float *clover_=0)
__device__ __host__ void save(const RegType v[length], int x, int parity)
FloatNOrder(const CloverField &clover, bool inverse, Float *clover_=0, float *norm_=0)
__device__ __host__ void load(RegType v[length], int x, int parity) const