12 const char funcname[] =
"Gauge_force";
30 for(
int mu=0; mu<
ndim; mu++){
33 for(
int nu=0; nu<
ndim; nu++)
36#pragma omp parallel for simd
37 for(
int i=0;i<
kvol;i++){
38 int uidm = iu[mu*
kvol+i];
39 int uidn = iu[nu*
kvol+i];
53#pragma omp parallel for simd
54 for(
int i=0;i<
kvol;i++){
55 int uidm = iu[mu*
kvol+i];
56 int didn =
id[nu*
kvol+i];
61 ush[1][uidm]*ut[0][didn+
kvolHalo*mu];
66#pragma omp parallel for simd
67 for(
int i=0;i<
kvol;i++){
68 const unsigned int ind = i+
kvolHalo*mu;
69 Complex_f a11 = ut[0][ind]*Sigma[1][i]+ut[1][ind]*
conj(Sigma[0][i]);
70 Complex_f a12 = ut[0][ind]*Sigma[0][i]+
conj(ut[1][ind])*Sigma[1][i];
72 dSdpi[i+
kvol*mu]=(double)(beta*
cimag(a11));
77 free(ush[0]); free(ush[1]); free(Sigma[0]); free(Sigma[1]);
82 unsigned int *iu,
const unsigned short gamin[16],
const float akappa,
const unsigned short mu){
83#pragma omp parallel for simd
84 for(
unsigned int i=0;i<
kvol;i++){
85 const unsigned int ind=i+
kvolHalo*mu;
87 const unsigned int uid = iu[i+
kvol*mu];
89 for(
unsigned short idirac=0;idirac<
nc*
ndirac;idirac+=
nc){
99 dSdpis[0]=dSdpi[i+
kvol*mu];
103 dSdpis[0]+=-akappa*
cimag(
105 +
conj(X1s[1])*(u11s*X2su[0]+u12s*X2su[1])
106 +
conj(X1su[0])*(u12s*X2s[0]-
conj(u11s)*X2s[1])
107 +
conj(X1su[1])*(-u11s*X2s[0]-
conj(u12s)*X2s[1]));
110 dSdpis[1]+=akappa*
creal(
112 +
conj(X1s[1])*(-u11s*X2su[0]-u12s*X2su[1])
113 +
conj(X1su[0])*(-u12s*X2s[0]-
conj(u11s)*X2s[1])
114 +
conj(X1su[1])*(u11s*X2s[0]-
conj(u12s)*X2s[1])));
116 dSdpis[2]=dSdpi[i+
kvol*(2*
ndim+mu)];
117 dSdpis[2]+=-akappa*
cimag(
118 conj(X1s[0])*(u11s *X2su[0]+u12s *X2su[1])
120 +
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
121 +
conj(X1su[1])*(-
conj(u12s)*X2s[0]+u11s *X2s[1]));
123 const unsigned short gindex=mu*
ndirac+(idirac>>1);
126 const unsigned short gind = gamin[gindex]<<1;
132 dSdpis[0]+=-
cimag(gamval_c*
134 +
conj(X1s[1])* (u11s *X2su[0]+u12s *X2su[1])
135 +
conj(X1su[0])* (-u12s *X2s[0] +
conj(u11s)*X2s[1])
136 +
conj(X1su[1])*(u11s *X2s[0] +
conj(u12s)*X2s[1])));
137 dSdpi[i+
kvol*mu]=dSdpis[0];
139 dSdpis[1]+=
creal(gamval_c*
140 (
conj(X1s[0])* (-
conj(u12s)*X2su[0] +
conj(u11s)*X2su[1])
141 +
conj(X1s[1])*(-u11s *X2su[0]-u12s *X2su[1])
142 +
conj(X1su[0])* (u12s *X2s[0]+
conj(u11s)*X2s[1])
143 +
conj(X1su[1])* (-u11s *X2s[0]+
conj(u12s)*X2s[1])));
146 dSdpis[2]+=-
cimag(gamval_c*
147 (
conj(X1s[0])*(u11s *X2su[0]+u12s *X2su[1])
149 +
conj(X1su[0])*(
conj(u11s)*X2s[0]+u12s *X2s[1])
150 +
conj(X1su[1])*(
conj(u12s)*X2s[0]-u11s *X2s[1])));
151 dSdpi[i+
kvol*(2*
ndim+mu)]=dSdpis[2];
157 float *dk[2],
unsigned int *iu,
const unsigned short gamin[16],
float akappa){
159 const unsigned short mu=3;
160#pragma omp parallel for simd
161 for(
unsigned int i=0;i<
kvol;i++){
162 const unsigned int ind=i+
kvolHalo*mu;
167 const float dks[2] = {dk[0][i],dk[1][i]};
169 const unsigned int uid = iu[i+
kvol*mu];
171 for(
unsigned short idirac=0;idirac<
ndirac*
nc;idirac+=
nc){
181 dSdpis[0]=dSdpi[i+
kvol*mu];
186 +
conj(X1s[1])*(u11s *X2su[0]+u12s *X2su[1]))
187 +dks[1]*(
conj(X1su[0])*(+u12s*X2s[0]-
conj(u11s)*X2s[1])
188 +
conj(X1su[1])*(-u11s*X2s[0]-
conj(u12s)*X2s[1])));
192 +
conj(X1s[1])*(-u11s *X2su[0]-u12s *X2su[1]))
193 +dks[1]*(
conj(X1su[0])*(-u12s *X2s[0]-
conj(u11s)*X2s[1])
194 +
conj(X1su[1])*( u11s *X2s[0]-
conj(u12s)*X2s[1])));
196 dSdpis[2]=dSdpi[i+
kvol*(2*
ndim+mu)];
197 dSdpis[2]+=-
cimag(dks[0]* (
conj(X1s[0])* (u11s *X2su[0]+u12s *X2su[1])
199 +dks[1]*(
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
200 +
conj(X1su[1])* (-
conj(u12s)*X2s[0]+u11s *X2s[1])));
202 const unsigned short gindex=mu*
ndirac+(idirac>>1);
204 const unsigned short gind = gamin[gindex]<<1;
209 +
conj(X1s[1])*(u11s *X2su[0]+u12s *X2su[1]))
210 -dks[1]*(
conj(X1su[0])* (u12s *X2s[0]-
conj(u11s)*X2s[1])
211 +
conj(X1su[1])*(-u11s *X2s[0]-
conj(u12s)*X2s[1])));
212 dSdpi[i+
kvol*mu]=dSdpis[0];
215 +
conj(X1s[1])*(-u11s*X2su[0]-u12s *X2su[1]))
216 -dks[1]*(
conj(X1su[0])*(-u12s *X2s[0]-
conj(u11s)*X2s[1])
217 +
conj(X1su[1])*(u11s*X2s[0]-
conj(u12s)*X2s[1])));
220 dSdpis[2]+=-
cimag(dks[0]*(
conj(X1s[0])*(u11s*X2su[0] +u12s *X2su[1])
222 -dks[1]*(
conj(X1su[0])*(-
conj(u11s)*X2s[0]-u12s *X2s[1])
223 +
conj(X1su[1])*(-
conj(u12s)*X2s[0]+u11s *X2s[1])));
224 dSdpi[i+
kvol*(2*
ndim+mu)]=dSdpis[2];
231 double *dk[2],
float *dk_f[2],
const Complex_f jqq,
const float akappa,
const float beta,
const float c_sw,
double *ancg){
232 const char funcname[] =
"Force";
235 cudaGetDevice(&device);
257 Clover(clover,ut_f,iu,
id);
259 for(
int na = 0; na<
nf; na++){
262 for(
unsigned short j=0;j<
nc*idirac;j++)
268 for(
unsigned short j=0;j<
nc*
ndirac;j++)
281 Congradq(na,res1,X1,smallPhi,ut,ut_f,clover,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,\
282 jqq,akappa,c_sw,&itercg);
284 cudaFreeAsync(smallPhi,
streams[0]);
290 alignas(16)
const Complex blasa=2.0;
alignas(16)
const double blasb=-1.0;
293 for(
unsigned short j=0;j<
nc*
ndirac;j++)
298#elif (defined __USE_MKL__||defined OPENBLAS||defined AMD_BLAS)
302 cblas_zaxpby(
kferm2, &blasa, X1, 1, &blasb, X0+na*
kferm2, 1);
304 const Complex blasa=2.0;
const double blasb=-1.0;
306 for(
unsigned short j=0;j<
nc*
ndirac;j++)
309#pragma omp parallel for simd collapse(2) aligned(X0,X1:AVX)
310 for(
int idirac=0;idirac<
ndirac;idirac++){
311 for(
int i=0;i<
kvol;i++)
324 Hdslash_f(X2_f,X1_f,ut_f,iu,
id,gamval_f,gamin,dk_f,akappa);
326 HbyClover_f(X2_f,X1_f,clover,sigval_f,akappa,sigin,
false);
329 alignas(8)
const float blasd=1.0;
333 for(
unsigned short j=0;j<
nc*
ndirac;j++)
338#elif defined USE_BLAS
339 for(
unsigned short j=0;j<
nc*
ndirac;j++)
343#pragma omp parallel for simd collapse(2) aligned(X2_f:AVX)
344 for(
unsigned short j=0;j<
nc*
ndirac;j++)
345 for(
unsigned int i=0;i<
kvol;i++)
374 cuForce(dSdpi,ut_f,X1_f,X2_f,gamval_f,dk_f,iu,gamin,akappa,
dimGrid,
dimBlock);
378 for(
unsigned short mu=0;mu<
ndim-1;mu++)
379 Force_s(dSdpi,ut_f,X1_f,X2_f,gamval_f,iu,gamin,akappa,mu);
380 Force_t(dSdpi,ut_f,X1_f,X2_f,gamval_f,dk_f,iu,gamin,akappa);
384 Clov_Force(dSdpi,ut_f,X1_f,X2_f,sigval_f,sigin,iu,
id,akappa);
391 free(X1_f); free(X2_f);
Routines needed for Clover improved wilson fermions.
void Clov_Force(double *dSdpi, Complex_f *ut[2], Complex_f *X1, Complex_f *X2, const Complex_f *sigval, const unsigned short *sigin, unsigned int *iu, unsigned int *id, const float akappa)
Gets the clover contribution to the force.
void HbyClover_f(Complex_f *phi, Complex_f *r, Complex_f *clover[2], Complex_f *sigval, const float akappa, unsigned short *sigin, bool dag)
Clover analogue of the Dslash operation. This version acts on all flavours similar to Dslash and Dsla...
void Clover_free(Complex_f *clover[nc])
Free's memory used for clover terms and leaves.
void Clover(Complex_f *clover[2], Complex_f *ut[2], unsigned int *iu, unsigned int *id)
Calculates the clovers in all directions at all sites.
int Hdslash_f(Complex_f *phi, Complex_f *r, Complex_f *ut[nc], unsigned int *iu, unsigned int *id, Complex_f gamval[20], const unsigned short gamin[16], float *dk[nc], float akappa)
Evaluates in single precision.
int ComplexConvert(Complex_f *a, Complex *b, const unsigned int len, const bool dtof, const unsigned short stride)
takes an array of complex float and double precision numbers and converts the precision
__device__ __forceinline__ T conj(const T &z)
Complex Conjugation.
int Fill_Small_Phi(int na, Complex *smallPhi, Complex *Phi)
Copies necessary (2*4*kvol) elements of Phi into a vector variable.
int C_gather(Complex_f *x, Complex_f *y, int n, unsigned int *table, unsigned int mu)
Extracts all the single precision gauge links in the direction only.
void Force_t(double *dSdpi, Complex_f *ut[2], Complex_f *X1, Complex_f *X2, Complex_f gamval[20], float *dk[2], unsigned int *iu, const unsigned short gamin[16], float akappa)
Calculates the force at each intermediate time.
void cuForce(double *dSdpi, Complex_f *ut[2], Complex_f *X1, Complex_f *X2, Complex_f gamval[20], float *dk[2], unsigned int *iu, const unsigned short gamin[16], float akappa, dim3 dimGrid, dim3 dimBlock)
Calculates the force at each intermediate time.
void cuGauge_force(Complex_f *ut[2], double *dSdpi, float beta, unsigned int *iu, unsigned int *id, dim3 dimGrid, dim3 dimBlock)
Calculate the gauge contribution to the force.
void Force_s(double *dSdpi, Complex_f *ut[2], Complex_f *X1, Complex_f *X2, Complex_f gamval[20], unsigned int *iu, const unsigned short gamin[16], const float akappa, const unsigned short mu)
Calculates the force at each intermediate time.
int Congradq(int na, double res, Complex *X1, Complex *r, Complex *ud[2], Complex_f *ut[2], Complex_f *clover_f[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], Complex_f gamval_f[20], const unsigned short gamin[16], Complex *sigval, Complex_f *sigval_f, unsigned short *sigin, double *dk[2], float *dk_f[2], Complex_f jqq, float akappa, float c_sw, int *itercg)
Matrix Inversion via Conjugate Gradient (up/down flavour partitioning). Solves Implements up/down pa...
int Gauge_force(double *dSdpi, Complex_f *ut[2], unsigned int *iu, unsigned int *id, float beta)
Calculates the gauge force due to the Wilson Action at each intermediate time.
int Force(double *dSdpi, const bool iflag, double res1, Complex *X0, Complex *X1, Complex *Phi, Complex *ut[2], Complex_f *ut_f[2], unsigned int *iu, unsigned int *id, Complex gamval[20], Complex_f gamval_f[20], const unsigned short gamin[16], Complex *sigval, Complex_f *sigval_f, unsigned short *sigin, double *dk[2], float *dk_f[2], const Complex_f jqq, const float akappa, const float beta, const float c_sw, double *ancg)
Calculates the force at each intermediate time.
int CHalo_swap_dir(Complex_f *c, int ncpt, int idir, int layer)
Swaps the halos along the axis given by idir in the direction given by layer.
Matrix multiplication and related declarations.
#define DOWN
Flag for send down.
#define AVX
Alignment of arrays. 64 for AVX-512, 32 for AVX/AVX2. 16 for SSE. Since AVX is standard on modern x86...
#define kferm2Halo
Dirac lattice and halo.
#define kvol
Sublattice volume.
#define Complex
Double precision complex number.
#define nf
Fermion flavours (double it).
#define ndirac
Dirac indices.
#define cudaDeviceSynchronise()
Get rid of that bastardised yankee English.
cublasHandle_t cublas_handle
Handle for cuBLAS.
#define Complex_f
Single precision complex number.
dim3 dimGrid
Default grid size. First component is normally nt. Second and third depend whatever is needed to get ...
#define kferm2
sublattice size including Dirac indices
#define kvolHalo
Subvolume + halo size.
dim3 dimBlock
Default block size. Usually 128.
cudaStream_t streams[ndirac *ndim *nadj]
An array of concurrent GPU streams to keep it busy.
#define creal(z)
Extract Real Component using C standard notation.
#define cimag(z)
Extract Imaginary Component using C standard notation.