11 unsigned int *iu,
unsigned int *
id,
int *
hu,
int *
hd,
double *dk[2],
float *dk_f[2],\
12 const unsigned short gamin[16],
const Complex gamval[20],
const Complex_f gamval_f[20],\
13 const Complex *sigval,
const Complex_f *sigval_f,
const unsigned short *sigin,
14 Complex_f jqq,
float akappa,
float beta,
float c_sw,
double ancg){
26 const char *funcname =
"Diagnostics";
32 printf(
"FLT_EVAL_METHOD is %i. Check online for what this means\n", FLT_EVAL_METHOD);
34 const unsigned short nclov=6;
35 unsigned int itercg=0;
41 cudaGetDevice(&device);
42 Complex *xi,*R1,*Phi,*X0,*X1, *smallPhi;
43 Complex_f *X0_f, *X1_f, *xi_f, *R1_f, *Phi_f;
47 cudaMallocManaged((
void **)clover+0,6*
kvol*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
48 cudaMallocManaged((
void **)clover+1,6*
kvol*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
49 cudaMallocManaged((
void **)clover_f+0,6*
kvol*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
50 cudaMallocManaged((
void **)clover_f+1,6*
kvol*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
51 cudaMallocManaged((
void **)&R1,
kfermHalo*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
52 cudaMallocManaged((
void **)&xi,
kfermHalo*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
53 cudaMallocManaged((
void **)&R1_f,
kfermHalo*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
54 cudaMallocManaged((
void **)&xi_f,
kfermHalo*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
55 cudaMallocManaged((
void **)&Phi,
nf*
kferm*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
56 cudaMallocManaged((
void **)&smallPhi,
kferm2*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
57 cudaMallocManaged((
void **)&Phi_f,
nf*
kferm*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
58 cudaMallocManaged((
void **)&X0,
kferm2Halo*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
59 cudaMallocManaged((
void **)&X1,
kferm2Halo*
sizeof((
void **)
Complex),cudaMemAttachGlobal);
60 cudaMallocManaged((
void **)&X0_f,
kferm2Halo*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
61 cudaMallocManaged((
void **)&X1_f,
kferm2Halo*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
62 cudaMallocManaged((
void **)&X2_f,
kferm2Halo*
sizeof((
void **)
Complex_f),cudaMemAttachGlobal);
63 cudaMallocManaged((
void **)&pp,
kmom*
sizeof((
void **)
double),cudaMemAttachGlobal);
64 cudaMallocManaged((
void **)&dSdpi,
kmom*
sizeof((
void **)
double),cudaMemAttachGlobal);
67 for(
unsigned short i=0;i<
ndim;i++){
68 cudaMallocManaged((
void **)hLeaves[i]+0,
kvol*
ndim*
sizeof(
Complex_f),cudaMemAttachGlobal);
69 cudaMallocManaged((
void **)hLeaves[i]+1,
kvol*
ndim*
sizeof(
Complex_f),cudaMemAttachGlobal);
71 for(
unsigned short clov=0;clov<nclov;clov++){
72 cudaMallocManaged((
void**)(Xmn[clov.diag]),2*
kvolHalo*
sizeof(
float),cudaMemAttachGlobal);
73 cudaMallocManaged((
void**)(Xmn[clov.offd]),
kvolHalo*
sizeof(
Complex_f),cudaMemAttachGlobal);
78 for(
unsigned short mu=0;mu<
ndim;mu++){
91 double *pp = aligned_alloc(
AVX,
kmom*
sizeof(
double));
95 double *dSdpi = aligned_alloc(
AVX,
kmom*
sizeof(
double));
98 for(
unsigned short clov=0;clov<nclov;clov++){
107#pragma omp parallel sections
111 FILE *trial_out = fopen(
"gauge_t",
"w");
112 for(
unsigned int i=0;i<(
kvol+
halo);i++){
114 fprintf(trial_out,
"Site %d:\n",i);
116 fprintf(trial_out,
"Halo site %d:\n",i);
117 for(
unsigned short mu=0;mu<
ndim;mu++)
118 fprintf(trial_out,
"Dir %d:\t%.3f+%.3fI\t%.3f+%.3fI\n", mu,\
121 fprintf(trial_out,
"\n");
127 FILE *trial_out_f = fopen(
"gauge_t_f",
"w");
128 for(
unsigned int i=0;i<(
kvol+
halo);i++){
130 fprintf(trial_out_f,
"Site %d:\n",i);
132 fprintf(trial_out_f,
"Halo site %d:\n",i);
133 for(
unsigned short mu=0;mu<
ndim;mu++)
134 fprintf(trial_out_f,
"Dir %d:\t%.3f+%.3fI\t%.3f+%.3fI\n", mu,\
137 fprintf(trial_out_f,
"\n");
147 printf(
"Cold Start\n");
148 u[0][0]=1+0*
I; u[1][0]=0+0*
I;
150#pragma omp parallel for
151 for(
unsigned short mu=0;mu<
ndim;mu++){
159 for(
unsigned short mu=0;mu<
ndim;mu++)
160 for(
unsigned int i=0;i<
kvol;i++){
163 fprintf(stderr,
"Error %i in %s: Gauge links not correctly reuniterised for site %i and direction %d. Diff %e"\
164 "\nExiting...\n\n",
REUNIERR,funcname,i,mu,diff);
170 for(
unsigned short mu=0;mu<
ndim;mu++)
171 for(
unsigned int i=0;i<
kvol;i++){
173 if(fabs(
creal(diff))>1e-6||fabs(
cimag(diff))>1e-6){
174 fprintf(stderr,
"Error %i in %s: Gauge links not correctly converted to float for site %i and direction %d. Diff %e+I%e"\
181 for(
unsigned short mu=0;mu<
ndim;mu++)
182 for(
unsigned int i=0;i<
kvol;i++){
184 if(fabs(
creal(diff))>1e-6||fabs(
cimag(diff))>1e-6){
185 fprintf(stderr,
"Error %i in %s: Gauge links not correctly converted to double for site %i and direction %d. Diff %e+I%e"\
194#pragma omp parallel sections
198 FILE *dk4m_File = fopen(
"dk0",
"w");
199 for(
int i=0;i<
kvol;i+=4)
200 fprintf(dk4m_File,
"%f\t%f\t%f\t%f\n",dk[0][i],dk[0][i+1],dk[0][i+2],dk[0][i+3]);
204 FILE *dk4p_File = fopen(
"dk1",
"w");
205 for(
int i=0;i<
kvol;i+=4)
206 fprintf(dk4p_File,
"%f\t%f\t%f\t%f\n",dk[1][i],dk[1][i+1],dk[1][i+2],dk[1][i+3]);
218 FILE *pf_in = fopen(
"hirep_pf.bin",
"rb");
220 printf(
"hirep_pf.bin not found; running with default Phi\n");
224 for (
unsigned int i = 0; i <
kvol; i++) {
226 fprintf(stderr,
"%s: short read from hirep_pf.bin\n", funcname);
229 for (
int j = 0; j <
nc*
ndirac; j++){
230 Phi[i +
kvol*j] = spinor[j];
238 printf(
"HiRep PF loaded into Phi (sq.norm=%.6e)\n", norm2);
248#pragma omp parallel for simd aligned(Phi,xi,R1:AVX)
249 for(
unsigned int i=0;i<
kvol;i++)
250 for(
unsigned short j=0;j<
nc*
ngorkov;j++){
262#pragma omp parallel for simd aligned(X0,X1:AVX)
263 for(
unsigned int i=0;i<
kvol;i++)
264 for(
unsigned short j=0;j<
ndirac;j++)
271#pragma omp parallel for simd aligned(pp:AVX)
272 for(
unsigned int i=0;i<
kmom;i++)
277#pragma omp for simd aligned(dSdpi:AVX) nowait
278 for(
int i=0; i<
kmom; i+=4){
279 double norm = sqrt(dSdpi[i]*dSdpi[i]+dSdpi[i+1]*dSdpi[i+1]+dSdpi[i+2]*dSdpi[i+2]+dSdpi[i+3]*dSdpi[i+3]);
280 dSdpi[i]/=norm; dSdpi[i+1]/=norm; dSdpi[i+2]/=norm;dSdpi[i+3]/=norm;
282 FILE *input, *output;
283 FILE *input_f, *output_f;
284 FILE *input_diff, *output_diff;
285 for(
int test = 0; test<=17; test++){
288 input = fopen(
"PreUpDownPart",
"w");
289 for(
int i=0; i<
kvol; i++){
290 fprintf(input,
"Site %d:\t",i);
291 for(
unsigned short j=0;j<
nc*
ndirac;j++){
298 output = fopen(
"UpDownPart",
"w");
299 for(
unsigned int i=0; i<
kvol; i++){
300 fprintf(output,
"Site %d:\t",i);
301 for(
unsigned short j=0;j<
nc*
ndirac;j++){
304 fprintf(output,
"\n");
307 for(
unsigned short idirac=0;idirac<
ndirac;idirac++)
308 for(
unsigned short ic=0;ic<
nc;ic++)
309 for(
unsigned int i=0;i<
kvol;i++){
311 fprintf(stderr,
"Error %i in %s: Up/down partitioning failed for site %d colour %d and dirac spinor %d."
312 "\nExiting...\n\n",
UDPERR,funcname,i,ic,idirac);
322 input = fopen(
"dslash_in",
"w"); input_f = fopen(
"dslash_f_in",
"w"); input_diff = fopen(
"dslash_diff_in",
"w");
326 for(
unsigned int i = 0; i<
kvol; i++){
327 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
328 for(
unsigned short j=0;j<
nc*
ngorkov;j++){
333 fprintf(input,
"\n\n"); fprintf(input_f,
"\n\n"); fprintf(input_diff,
"\n\n");
335 fclose(input); fclose(input_f); fclose(input_diff);
336 Dslash(xi,R1,ut,iu,
id,gamval,gamin,dk,jqq,akappa);
337 Dslash_f(xi_f,R1_f,ut_f,iu,
id,gamval_f,gamin,dk_f,jqq,akappa);
341 output = fopen(
"dslash",
"w"); output_f = fopen(
"dslash_f",
"w"); output_diff = fopen(
"dslash_diff",
"w");
342 for(
unsigned int i = 0; i<
kvol; i++){
343 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
344 for(
unsigned short j=0;j<
nc*
ngorkov;j++){
348 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
349 fprintf(stderr,
"Error %i in %s: Single and double disagree for Dslash site %i and spinor/color %d. Difference %e+%ei"\
351 fclose(output);fclose(output_f);fclose(output_diff);
355 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
357 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n"); fprintf(output_diff,
"\n\n");
359 fclose(output); fclose(output_f); fclose(output_diff);
366 input = fopen(
"dslashd_in",
"w"); input_f = fopen(
"dslashd_f_in",
"w"); input_diff = fopen(
"dslashd_diff_in",
"w");
370 for(
unsigned int i = 0; i<
kvol; i++){
371 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
372 for(
unsigned short j=0;j<
nc*
ngorkov;j++){
377 fprintf(input,
"\n\n"); fprintf(input_f,
"\n\n"); fprintf(input_diff,
"\n\n");
379 fclose(input); fclose(input_f);fclose(input_diff);
380 Dslashd(xi,R1,ut,iu,
id,gamval,gamin,dk,jqq,akappa);
381 Dslashd_f(xi_f,R1_f,ut_f,iu,
id,gamval_f,gamin,dk_f,jqq,akappa);
385 output = fopen(
"dslashd",
"w"); output_f = fopen(
"dslashd_f",
"w"); output_diff = fopen(
"dslashd_diff",
"w");
386 for(
unsigned int i = 0; i<
kvol; i++){
387 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
390 for(
unsigned short j=0;j<
nc*
ngorkov;j++){
394 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
395 fprintf(stderr,
"Error %i in %s: Single and double disagree for Dslashd site %i and spinor/color %d. Difference %e+%ei"\
397 fclose(output);fclose(output_f);fclose(output_diff);
401 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
403 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n"); fprintf(output_diff,
"\n\n");
405 input = fopen(
"dslashd_in",
"w"); input_f = fopen(
"dslashd_f_in",
"w"); input_diff = fopen(
"dslashd_diff_in",
"w");
412 input = fopen(
"hdslash_in",
"w"); input_f = fopen(
"hdslash_f_in",
"w"); input_diff = fopen(
"hdslash_diff_in",
"w");
413 for(
unsigned int i = 0; i<
kvol; i++){
414 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
415 for(
unsigned short j=0;j<
nc*
ndirac;j++){
420 fprintf(input,
"\n\n"); fprintf(input_f,
"\n\n"); fprintf(input_diff,
"\n\n");
422 fclose(input);fclose(input_f);fclose(input_diff);
423 Hdslash(X1,X0,ut,iu,
id,gamval,gamin,dk,akappa);
424 Hdslash_f(X1_f,X0_f,ut_f,iu,
id,gamval_f,gamin,dk_f,akappa);
428 output = fopen(
"hdslash",
"w"); output_f = fopen(
"hdslash_f",
"w"); output_diff = fopen(
"hdslash_diff",
"w");
429 for(
unsigned int i = 0; i<
kvol; i++){
430 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
433 for(
unsigned short j=0;j<
nc*
ndirac;j++){
437 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
438 fprintf(stderr,
"Error %i in %s: Single and double disagree for Hdslash site %i and spinor/color %d. Difference %e+%ei"\
440 fclose(output);fclose(output_f);fclose(output_diff);
444 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
446 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n"); fprintf(output_diff,
"\n\n");
448 fclose(output);fclose(output_f);fclose(output_diff);
453 input = fopen(
"hdslashd_in",
"w"); input_f = fopen(
"hdslashd_f_in",
"w"); input_diff = fopen(
"hdslashd_diff_in",
"w");
457 for(
unsigned int i = 0; i<
kvol; i++){
458 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
459 for(
unsigned short j=0;j<
nc*
ndirac;j++){
464 fprintf(input,
"\n\n"); fprintf(input_f,
"\n\n"); fprintf(input_diff,
"\n\n");
466 fclose(input);fclose(input_f);fclose(input_diff);
467 Hdslashd(X1,X0,ut,iu,
id,gamval,gamin,dk,akappa);
468 Hdslashd_f(X1_f,X0_f,ut_f,iu,
id,gamval_f,gamin,dk_f,akappa);
472 output = fopen(
"hdslashd",
"w"); output_f = fopen(
"hdslashd_f",
"w"); output_diff = fopen(
"hdslashd_diff",
"w");
473 for(
unsigned int i = 0; i<
kvol; i++){
474 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
477 for(
unsigned short j=0;j<
nc*
ndirac;j++){
481 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
482 fprintf(stderr,
"Error %i in %s: Single and double disagree for Hdslashd site %i and spinor/color %d. Difference %e+%ei"\
484 fclose(output);fclose(output_f);fclose(output_diff);
488 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
490 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n"); fprintf(output_diff,
"\n\n");
492 fclose(output);fclose(output_f);fclose(output_diff);
498 output = fopen(
"Leaves",
"w");
499 for(
unsigned int i=0;i<
kvol;i++){
500 fprintf(output,
"Site %d\n",i);
501 for(
unsigned short mu=0;mu<
ndim-1;mu++)
502 for(
unsigned short nu=mu+1;nu<
ndim;nu++)
504 unsigned short clov = (mu==0) ? nu-1 :mu+nu;
505 fprintf(output,
"Clover %d\n",clov);
507 for(
unsigned short leaf =0;leaf<
ndim;leaf++){
508 Leaf(Leaves,ut_f,iu,
id,i,mu,nu,leaf);
509 fprintf(output,
"Leaf %d: Leaf0 = %e+I%e Leaf1=%e+I%e\n",leaf,\
510 crealf(Leaves[0]),cimagf(Leaves[0]),crealf(Leaves[1]),cimagf(Leaves[1]));
513 fprintf(output,
"\n");
516 Clover(clover_f,ut_f,iu,
id);
517 output=fopen(
"Clover",
"w");
518 for(
unsigned int i=0;i<
kvol;i++){
519 fprintf(output,
"Site %d\n",i);
520 for(
unsigned short mu=0;mu<
ndim-1;mu++)
521 for(
unsigned short nu=mu+1;nu<
ndim;nu++)
523 unsigned short clov = (mu==0) ? nu-1 :mu+nu;
524 fprintf(output,
"mu %d nu %d Clover1 %e+i%e Clover2 %e+i%e\n",mu,nu,\
525 crealf(clover_f[0][i+
kvol*clov]), cimagf(clover_f[0][i+
kvol*clov]), crealf(clover_f[1][i+
kvol*clov]),\
526 cimagf(clover_f[1][i+
kvol*clov]));
528 fprintf(output,
"\n");
542 input = fopen(
"byclover_in",
"w"); input_f = fopen(
"byclover_f_in",
"w"); input_diff = fopen(
"byclover_diff_in",
"w");
546 for(
unsigned int i = 0; i<
kvol; i++){
547 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
548 for(
unsigned short j=0;j<
ngorkov;j++){
549 for(
unsigned short c=0;c<
nc;c++){
554 fprintf(input,
"\n"); fprintf(input_f,
"\n"); fprintf(input_diff,
"\n");
556 fprintf(input,
"\n"); fprintf(input_f,
"\n"); fprintf(input_diff,
"\n");
558 fclose(input); fclose(input_f); fclose(input_diff);
559 ByClover(xi,R1,clover,sigval,akappa,sigin,
false);
560 ByClover_f(xi_f,R1_f,clover_f,sigval_f,akappa,sigin,
false);
564 output = fopen(
"byclover",
"w"); output_f = fopen(
"byclover_f",
"w"); output_diff = fopen(
"byclover_diff",
"w");
565 for(
unsigned int i = 0; i<
kvol; i++){
566 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
567 for(
unsigned short j=0;j<
ngorkov;j++){
568 for(
unsigned short c=0;c<
nc;c++){
572 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
573 fprintf(stderr,
"Error %i in %s: Single and double disagree for ByClover site %i and spinor/color %d. Difference %e+%ei"\
575 fclose(output);fclose(output_f);fclose(output_diff);
579 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
581 fprintf(output,
"\n"); fprintf(output_f,
"\n"); fprintf(output_diff,
"\n");
583 fprintf(output,
"\n"); fprintf(output_f,
"\n"); fprintf(output_diff,
"\n");
585 fclose(output); fclose(output_f); fclose(output_diff);
592 input = fopen(
"hbyclover_in",
"w"); input_f = fopen(
"hbyclover_f_in",
"w"); input_diff = fopen(
"hbyclover_diff_in",
"w");
596 for(
unsigned int i = 0; i<
kvol; i++){
597 fprintf(input,
"Site %d:\n",i); fprintf(input_f,
"Site %d:\n",i); fprintf(input_diff,
"Site %d:\n",i);
598 for(
unsigned short j=0;j<
nc*
ndirac;j++){
603 fprintf(input,
"\n\n"); fprintf(input_f,
"\n\n"); fprintf(input_diff,
"\n\n");
605 fclose(input);fclose(input_f);fclose(input_diff);
606 HbyClover(X1,X0,clover,sigval,akappa,sigin,
false);
607 HbyClover_f(X1_f,X0_f,clover_f,sigval_f,akappa,sigin,
false);
611 output = fopen(
"hbyclover",
"w"); output_f = fopen(
"hbyclover_f",
"w"); output_diff = fopen(
"hbyclover_diff",
"w");
612 for(
unsigned int i = 0; i<
kvol; i++){
613 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i); fprintf(output_diff,
"Site %d:\n",i);
616 for(
unsigned short j=0;j<
nc*
ndirac;j++){
620 if(fabs(
creal(diff))>5e-6 || fabs(
cimag(diff))>5e-6){
621 fprintf(stderr,
"Error %i in %s: Single and double disagree for HbyClover site %i and spinor/color %d. Difference %e+%ei"\
623 fclose(output);fclose(output_f);fclose(output_diff);
627 fprintf(output_diff,
"%.3f+%.3fI\t",
creal(diff),
cimag(diff));
629 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n"); fprintf(output_diff,
"\n\n");
631 fclose(output);fclose(output_f);fclose(output_diff);
636 for(
unsigned int i = 0; i<
kvol;i++)
637 for(
unsigned short idirac = 0; idirac<
ndirac; idirac++)
638 for(
unsigned short ic= 0; ic<
nc; ic++)
641 fprintf(stderr,
"Error %i in %s: Failed to fill small phi correctly.\nExiting\n\n.",
SPHIERR,funcname);
648 if(
Congradq(0,
rescga,X1,smallPhi,ut,ut_f,clover_f,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,jqq,akappa,c_sw,&itercg)){
649 fprintf(stderr,
"Error %i in %s: Congradq failed to converge.\nExiting\n\n",
ITERLIM,funcname);
654 Hdslash_f(X2_f,X1_f,ut_f,iu,
id,gamval_f,gamin,dk_f,akappa);
656 HbyClover_f(X2_f,X1_f,clover_f,sigval_f,akappa,sigin,
false);
657 output=fopen(
"X1_f",
"w"); output_f=fopen(
"X2_f",
"w");
658 for(
unsigned int i = 0; i<
kvol; i++){
659 fprintf(output,
"Site %d:\n",i); fprintf(output_f,
"Site %d:\n",i);
660 for(
unsigned short c=0;c<
nc;c++){
661 fprintf(output,
"c %d",c);
662 fprintf(output_f,
"c %d",c);
663 for(
unsigned short j=0;j<
ndirac;j++){
667 fprintf(output,
"\n"); fprintf(output_f,
"\n");
669 fprintf(output,
"\n\n"); fprintf(output_f,
"\n\n");
671 fclose(output); fclose(output_f);
675 double h,s,ancgh; h=s=ancgh=0;
676 Hamilton(&h,&s,
rescgg,pp,X0,X1,Phi,ut,ut_f,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,\
677 jqq,akappa,beta,c_sw,&ancgh,0);
678 output = fopen(
"Hamiltonian",
"w");
679 fprintf(output,
"h=%e\ts=%e Congrad Iterations %.4e\n\n",h,s,ancgh);
680 for(
unsigned int i = 0; i<
kvol; i++){
681 fprintf(output,
"Site %d:\n",i);
682 for(
unsigned short j=0;j<
nc*
ndirac;j++){
685 fprintf(output,
"\n\n");
690 memset(dSdpi,0,
kmom*
sizeof(
double));
695 memset(dSdpi,0,
kmom*
sizeof(
double));
700 output = fopen(
"Gauge_Force",
"w");
701 for(
unsigned int i = 0; i<
kvol; i++){
702 fprintf(output,
"Site %d:\n",i);
703 for(
unsigned short gen=0;gen<
nadj;gen++){
704 fprintf(output,
"Gen %d:\n",gen);
705 for(
unsigned int mu=0;mu<
ndim;mu++){
706 fprintf(output,
"%.3e\t", dSdpi[i+
kvol*(gen*
ndim+mu)]);
708 fprintf(output,
"\n");
710 fprintf(output,
"\n");
717 fprintf(stderr,
"Error %i in %s: MPI force diagnostic not implemented yet.\n\n"\
718 "Breaking and moving to next test",
NOIMPL,funcname);
722 memset(dSdpi,0,
kmom*
sizeof(
double));
723 for(
unsigned short mu=0;mu<
ndim-1;mu++)
724 Force_s(dSdpi,ut_f,X1_f,X2_f,gamval_f,iu,gamin,akappa,mu);
725 Force_t(dSdpi,ut_f,X1_f,X2_f,gamval_f,dk_f,iu,gamin,akappa);
726 output = fopen(
"Wilson_Force",
"w");
727 for(
unsigned int i = 0; i<
kvol; i++){
728 fprintf(output,
"Site %d:\n",i);
729 for(
unsigned short gen=0;gen<
nadj;gen++){
730 fprintf(output,
"Gen %d:\n",gen);
731 for(
unsigned int short mu=0;mu<
ndim;mu++){
732 fprintf(output,
"%.3e\t", dSdpi[i+
kvol*(gen*
ndim+mu)]);
734 fprintf(output,
"\n");
736 fprintf(output,
"\n");
743 output=fopen(
"Half_leaves",
"w");
744 for(
unsigned short mu=0;mu<
ndim-1;mu++)
745 for(
unsigned short nu=mu+1;nu<
ndim;nu++){
748 fprintf(output,
"mu %d nu %d\n",mu,nu);
749 for(
unsigned int i=0;i<
kvol;i++){
750 fprintf(output,
"Site %d\n",i);
751 for(
unsigned short leaf=0;leaf<
ndim;leaf++)
752 fprintf(output,
"leaf %d: mu-nu: hLeaf1 %e+i%e hLeaf2 %e+i%e\tnu-mu: hLeaf1 %e+i%e hLeaf2 %e+i%e\n",leaf,\
753 crealf(hLeaves[mu][0][i+
kvol*leaf]), cimagf(hLeaves[mu][0][i+
kvol*leaf]),\
754 crealf(hLeaves[mu][1][i+
kvol*leaf]), cimagf(hLeaves[mu][1][i+
kvol*leaf]),\
755 crealf(hLeaves[nu][0][i+
kvol*leaf]), cimagf(hLeaves[nu][0][i+
kvol*leaf]),\
756 crealf(hLeaves[nu][1][i+
kvol*leaf]), cimagf(hLeaves[nu][1][i+
kvol*leaf]));
758 fprintf(output,
"\n");
764 fprintf(stderr,
"Error %i in %s: MPI clover force not implemented yet.\n\n"\
765 "Breaking and moving to next test",
NOIMPL,funcname);
771 for(
unsigned short mu=0;mu<
ndim;mu++)
772 for(
unsigned short nu=0;nu<
ndim;nu++)
774 unsigned short clov = (mu==0) ? nu-1 : mu+nu;
775 CalcXmunu(Xmn[clov],X1_f,X2_f,sigval_f,sigin,mu,nu);
777 output = fopen(
"Xmunu",
"w");
778 for(
unsigned int i=0;i<
kvol;i++) {
779 fprintf(output,
"Site %d\n",i);
780 for(
unsigned short mu=0;mu<
ndim;mu++)
781 for(
unsigned short nu=0;nu<
ndim;nu++){
782 unsigned short clov = (mu==0) ? nu-1 : mu+nu;
784 fprintf(output,
"mu %d nu %d:\n",mu,nu);
785 fprintf(output,
"%.3e\t%.3e+i%.3e\n",Xmn[clov].diag[i],
creal(Xmn[clov].offd[i]),
cimag(Xmn[clov].offd[i]));
786 fprintf(output,
"%.3e+i%.3e\t%.3e\n",
creal(conjf(Xmn[clov].offd[i])),
cimag(conjf(Xmn[clov].offd[i])),Xmn[clov].diag[i+
kvolHalo]);
789 fprintf(output,
"\n");
795 fprintf(stderr,
"Error %i in %s: MPI clover force not implemented yet.\n\n"\
796 "Breaking and moving to next test",
NOIMPL,funcname);
802 memset(dSdpi,0,
kmom*
sizeof(
double));
803 Clov_Force(dSdpi,ut_f,X1_f,X2_f,sigval_f,sigin,iu,
id,akappa);
804 output = fopen(
"Clover_Force",
"w");
805 for(
unsigned int i = 0; i<
kvol; i++){
806 fprintf(output,
"Site %d:\n",i);
807 for(
unsigned short gen=0;gen<
nadj;gen++){
808 fprintf(output,
"Gen %d:\n",gen);
809 for(
unsigned short mu=0;mu<
ndim;mu++){
810 fprintf(output,
"%.3e\t", dSdpi[i+
kvol*(gen*
ndim+mu)]);
812 fprintf(output,
"\n");
814 fprintf(output,
"\n");
820 if(
Congradp(0,
respbp, Phi, R1,ut,ut_f,clover_f,iu,
id,gamval,gamval_f,gamin,sigval,sigval_f,sigin,dk,dk_f,jqq,akappa,c_sw,&itercg)){
821 fprintf(stderr,
"Error %i in %s: Congradp failed to converge.\nExiting\n\n",
ITERLIM,funcname);
828 free(clover_f[0]); free(clover_f[1]);
829 Clover(clover_f, ut_f, iu,
id);
835 Dslashd_f(R1_f, xi_f, ut_f, iu,
id, gamval_f, gamin, dk_f, jqq, akappa);
837 ByClover_f(R1_f, xi_f, clover_f, sigval_f, akappa, sigin,
true);
847 double h0, s0, h1, s1, ancgt=0;
850 memset(pp, 0,
kmom*
sizeof(
double));
852 Hamilton(&h0, &s0,
rescgg, pp, X0, X1, Phi, ut, ut_f, iu,
id,
853 gamval, gamval_f, gamin, sigval, sigval_f, sigin,
854 dk, dk_f, jqq, akappa, beta, c_sw, &ancgt, 0);
858 memset(dSdpi, 0,
kmom*
sizeof(
double));
859 Force(dSdpi, 1,
rescgg, X0, X1, Phi, ut, ut_f, iu,
id,
860 gamval, gamval_f, gamin, sigval, sigval_f, sigin,
861 dk, dk_f, jqq, akappa, beta, c_sw, &ancgt);
865 for(
int i=0; i<
kmom; i++) fnorm2 += dSdpi[i]*dSdpi[i];
869 char output_name[64];
870 sprintf(output_name,
"Force_Action_Check_%1.2f",c_sw);
871 output = fopen(output_name,
"w");
872 fprintf(output,
"|dSdpi|^2 = %.10e\n", fnorm2);
873 fprintf(output,
"eps\tdS_num\tdS_ana\tratio\t(num-ana)\n");
875 for(
int k=0; k<126; k++){
876 double eps = 1e-2 - k*(1.0/12800.0);
877 memcpy(pp, dSdpi,
kmom*
sizeof(
double));
887 Hamilton(&h1, &s1,
rescgg, pp, X0, X1, Phi, ut, ut_f, iu,
id,
888 gamval, gamval_f, gamin, sigval, sigval_f, sigin,
889 dk, dk_f, jqq, akappa, beta, c_sw, &ancgt, 0);
893 double dS_num = s1 - s0;
894 double dS_ana = eps * fnorm2;
895 fprintf(output,
"%.5e\t%.10e\t%.10e\t%.6f\t%.3e\n",
896 eps, dS_num, dS_ana, dS_num/dS_ana,
897 (dS_num - dS_ana)/(eps*eps));
908 cudaFree(dk[0]); cudaFree(dk[1]); cudaFree(R1); cudaFree(dSdpi); cudaFree(pp);
909 cudaFree(Phi); cudaFree(ut[0]); cudaFree(ut[1]);
910 cudaFree(Phi_f); cudaFree(xi_f); cudaFree(R1_f);
911 cudaFree(clover[0]); cudaFree(clover[1]);
912 cudaFree(clover_f[0]); cudaFree(clover_f[1]);
913 cudaFree(X0); cudaFree(X1); cudaFree(u[0]); cudaFree(u[1]);
914 cudaFree(X0_f); cudaFree(X1_f); cudaFree(ut_f[0]); cudaFree(ut_f[1]);
916 for(
unsigned short i=0;i<
ndim;i++){
917 cudaFree(hLeaves[i][0]); cudaFree(hLeaves[i][1]);
919 for(
unsigned short clov=0;clov<nclov;clov++){
920 cudaFree(Xmn[clov].diag); cudaFree(Xmn[clov].offd);
922 cudaFree(
id); cudaFree(iu); cudaFree(
hd); cudaFree(
hu);
923 cudaFree(ut_save[0]); cudaFree(ut_save[1]);
925 free(dk[0]); free(dk[1]); free(R1); free(dSdpi); free(pp);
926 free(Phi); free(ut[0]); free(ut[1]); free(xi);
927 free(Phi_f); free(xi_f); free(R1_f);
928 free(clover[0]); free(clover[1]);
929 free(clover_f[0]); free(clover_f[1]);
930 for(
unsigned short i=0;i<
ndim;i++){
931 free(hLeaves[i][0]); free(hLeaves[i][1]);
933 for(
unsigned short clov=0;clov<nclov;clov++){
934 free(Xmn[clov].diag); free(Xmn[clov].offd);
936 free(X0); free(X1); free(u[0]); free(u[1]);
938 free(
id); free(iu); free(
hd); free(
hu);
939 free(ut_save[0]); free(ut_save[1]);
Routines needed for Clover improved wilson fermions.
unsigned int * hd
Down halo indices.
unsigned int * hu
Up halo indices.
#define SPHIERR
Up/down partitioning failed.
#define REUNIERR
Gauge link reunitarisation failed.
#define ITERLIM
Exceeded max number of iterations.
#define NOIMPL
Not implemented.
#define CONVERR
Failed to convert precision correctly.
#define UDPERR
Up/down partitioning failed.
void CalcXmunu(Bilinear_a Xmunu, Complex_f *X1, Complex_f *X2, const Complex_f *sigval, const unsigned short *sigin, const unsigned short mu, const unsigned short nu)
Gets for the clover force.
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(Complex *phi, Complex *r, Complex *clover[2], Complex *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 ByClover(Complex *phi, Complex *r, Complex *clover[2], Complex *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 ByClover_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 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 Leaf(Complex_f Leaves[nc], Complex_f *ut[nc], unsigned int *iu, unsigned int *id, unsigned int i, const unsigned short mu, const unsigned short nu, const unsigned short leaf)
Calculates a leaf for a clover term.
void Half_Leaves(Complex_f *hLeaves[2], Complex_f *ut[2], unsigned int *iu, unsigned int *id, const unsigned short mu, const unsigned short nu)
Calculates the products of the first two links in a plaquette.
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 Dslash_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], Complex_f jqq, float akappa)
Evaluates in single precision.
int Dslashd_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], Complex_f jqq, float akappa)
Evaluates in single precision.
int Hdslashd_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 Hdslashd(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], float akappa)
Evaluates in double precision.
int Hdslash(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], float akappa)
Evaluates in double precision.
int Dslashd(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], Complex_f jqq, float akappa)
Evaluates in double precision.
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 Dslash(Complex *phi, Complex *r, Complex *ut[nc], unsigned int *iu, unsigned int *id, Complex gamval[20], const unsigned short gamin[16], double *dk[nc], Complex_f jqq, float akappa)
Evaluates in double 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 UpDownPart(const unsigned int na, Complex *X0, Complex *R1)
Up/Down partitioning of the pseudofermion field.
int Reunitarise(Complex *ut[2])
Reunitarises u11t and u12t as in conj(u11t[i])*u11t[i]+conj(u12t[i])*u12t[i]=1.
int Fill_Small_Phi(int na, Complex *smallPhi, Complex *Phi)
Copies necessary (2*4*kvol) elements of Phi into a vector variable.
int Congradp(int na, double res, Complex *Phi, Complex *xi, 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 (no up/down flavour partitioning). Solves The matrix multipl...
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 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 Gauge_Update(const double d, double *pp, Complex *ut[2], Complex_f *ut_f[2])
Gauge update for the integration step of the HMC.
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 Trial_Exchange(Complex *ut[2], Complex_f *ut_f[2])
Exchanges the trial fields.
int Par_dsum(double *dval)
Performs a reduction on a double dval to get a sum which is then distributed to all ranks.
int Hamilton(double *h, double *s, double res2, double *pp, Complex *X0, Complex *X1, Complex *Phi, Complex *ud[2], Complex_f *ut[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], Complex_f jqq, float akappa, float beta, float c_sw, double *ancgh, int traj)
Calculate the Hamiltonian.
int Gauss_c(Complex_f *ps, unsigned int n, const Complex_f mu, const float sigma)
Generates a vector of normally distributed random single precision complex numbers using the Box-Mull...
int Gauss_d(double *ps, unsigned int n, const double mu, const double sigma)
Generates a vector of normally distributed random double precision numbers using the Box-Muller Metho...
Matrix multiplication and related declarations.
#define MPI_Finalise()
Avoid any accidents with US/UK spelling.
int * pcoord
The processor grid.
#define AVX
Alignment of arrays. 64 for AVX-512, 32 for AVX/AVX2. 16 for SSE. Since AVX is standard on modern x86...
#define rescgg
Conjugate gradient residue for update.
#define nproc
Number of processors for MPI.
#define kmom
sublattice momentum sites
#define ngorkov
Gor'kov indices.
#define kferm2Halo
Dirac lattice and halo.
#define nadj
adjacent spatial indices
#define kvol
Sublattice volume.
#define Complex
Double precision complex number.
#define kferm
sublattice size including Gor'kov indices
#define rescga
Conjugate gradient residue for acceptance.
#define nf
Fermion flavours (double it).
#define ndirac
Dirac indices.
#define cudaDeviceSynchronise()
Get rid of that bastardised yankee English.
#define respbp
Conjugate gradient residue for .
#define halo
Total Halo size.
#define Complex_f
Single precision complex number.
#define kferm2
sublattice size including Dirac indices
#define kvolHalo
Subvolume + halo size.
#define kfermHalo
Gor'kov lattice and halo.
Structure of arrays for Hermitian bilinear in memory.
Complex_f * offd
Complex valued off-diagonal terms. We only need to store one of these to get the other in .
float * diag
Real valued diagonal terms.
Function declarations for most of the routines.
#define creal(z)
Extract Real Component using C standard notation.
#define cimag(z)
Extract Imaginary Component using C standard notation.
#define I
Define I in double precision using C standard notation.