9 #define MULT_UV_R(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v0-u1*v1 + u2*v2-u3*v3 + u4*v4-u5*v5)
10 #define MULT_UV_I(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v1+u1*v0 + u2*v3+u3*v2 + u4*v5+u5*v4)
12 #define MULT_GXr(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v0-u1*v1 + u2*v2-u3*v3 + u4*v4-u5*v5)
13 #define MULT_GXi(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v1+u1*v0 + u2*v3+u3*v2 + u4*v5+u5*v4)
14 #define MULT_GDXr(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v0+u1*v1 + u2*v2+u3*v3 + u4*v4+u5*v5)
15 #define MULT_GDXi(u0,u1,u2,u3,u4,u5,v0,v1,v2,v3,v4,v5) (u0*v1-u1*v0 + u2*v3-u3*v2 + u4*v5-u5*v4)
17 #define EXT_IMG_R(v1r,v1i,v2r,v2i,w1r,w1i,w2r,w2i) (v1r*w2r - v1i*w2i - v2r*w1r + v2i*w1i)
18 #define EXT_IMG_I(v1r,v1i,v2r,v2i,w1r,w1i,w2r,w2i) (- v1r*w2i - v1i*w2r + v2r*w1i + v2i*w1r)
25 int Nst = Nsize[0] * Nsize[1] * Nsize[2] * Nsize[3];
28 int size =
NVC *
ND * Nst_pad;
30 #pragma acc data present(v2[0:size], v1[0:size]) copyin(Nst)
31 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
34 #pragma acc loop gang worker vector
35 for(
int ist = 0; ist < Nst; ++ist){
36 for(
int ivc = 0; ivc <
NVC; ++ivc){
52 int Nst = Nsize[0] * Nsize[1] * Nsize[2] * Nsize[3];
55 int size =
NVC *
ND * Nst_pad;
57 #pragma acc data present(v2[0:size], v1[0:size]) copyin(Nst)
58 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
61 #pragma acc loop gang worker vector
62 for(
int ist = 0; ist < Nst; ++ist){
63 for(
int ivc = 0; ivc <
NVC; ++ivc){
78 real_t kappa,
int *Nsize,
int *bc,
int flag)
85 int Nst = Nx * Ny * Nz * Nt;
88 int nvst =
NVC *
ND * Nst_pad;
89 int ngst =
NDF * Nst_pad *
NDIM;
94 #pragma acc data present(v1[0:nvst], u_up[0:ngst], u_dn[0:ngst], v2[0:nvst]) \
95 copyin(bc[0:4], kappa, Nx, Ny, Nz, Nt, Nst, Nst_pad)
97 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
100 #pragma acc loop gang worker vector
101 for(
int site = 0; site < Nst; ++site){
103 int Nxyz = Nx * Ny * Nz;
189 real_t kappa,
int *Nsize,
int *bc,
int flag)
196 int Nst = Nx * Ny * Nz * Nt;
199 int nvst =
NVC *
ND * Nst_pad;
200 int ngst =
NDF * Nst_pad *
NDIM;
202 real_t *RESTRICT u_up = u;
203 real_t *RESTRICT u_dn = u;
205 #pragma acc data present(v1[0:nvst], u_up[0:ngst], u_dn[0:ngst], v2[0:nvst]) \
206 copyin(bc[0:4], kappa, Nx, Ny, Nz, Nt,Nst, Nst_pad)
208 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
211 #pragma acc loop gang worker vector
212 for(
int site = 0; site < Nst; ++site){
214 int Nxyz = Nx * Ny * Nz;
305 int *Nsize,
int *bc,
int *do_comm)
311 int Nst = Nx * Ny * Nz * Nt;
314 int size =
NVC *
ND * Nst_pad;
315 int size_u =
NDF * Nst_pad *
NDIM;
321 #pragma acc data present(buf_xp[0:size_bx], buf_xm[0:size_bx], \
322 buf_yp[0:size_by], buf_ym[0:size_by], \
323 buf_zp[0:size_bz], buf_zm[0:size_bz], \
324 buf_tp[0:size_bt], buf_tm[0:size_bt], \
325 u[0:size_u], v1[0:size]) \
326 copyin(bc[0:4], do_comm[0:4], Nx, Ny, Nz, Nt, Nst_pad)
335 #pragma acc parallel async \
336 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
338 int Nxyz = Nx * Ny * Nz;
340 #pragma acc loop gang worker vector
343 int ist =
ixyz + Nxyz *
it;
345 for(
int ic = 0; ic <
NC; ++ic){
355 #pragma acc parallel async \
356 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
358 int Nxyz = Nx * Ny * Nz;
360 #pragma acc loop gang worker vector
363 int ist =
ixyz + Nxyz *
it;
364 int istu = ist + Nst_pad * 3;
367 for(
int ic = 0; ic <
NC; ++ic){
376 for(
int ic = 0; ic <
NC; ++ic){
379 for(
int ic2 = 0; ic2 <
NC; ++ic2){
380 ut[2*ic2 ] = u[
IDX2_G_R(ic, ic2, istu)];
381 ut[2*ic2+1] = - u[
IDX2_G_I(ic, ic2, istu)];
385 wt1[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
387 wt1[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
389 wt2[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
391 wt2[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
410 #pragma acc update async host (buf_xp[0:size_bx])
411 #pragma acc update async host (buf_xm[0:size_bx])
414 #pragma acc update async host (buf_yp[0:size_by])
415 #pragma acc update async host (buf_ym[0:size_by])
418 #pragma acc update async host (buf_zp[0:size_bz])
419 #pragma acc update async host (buf_zm[0:size_bz])
422 #pragma acc update async host (buf_tp[0:size_bt])
423 #pragma acc update async host (buf_tm[0:size_bt])
437 int *Nsize,
int *bc,
int *do_comm)
443 int Nst = Nx * Ny * Nz * Nt;
446 int size =
NVC *
ND * Nst_pad;
447 int size_u =
NDF * Nst_pad *
NDIM;
453 #pragma acc data present(buf_xp[0:size_bx], buf_xm[0:size_bx], \
454 buf_yp[0:size_by], buf_ym[0:size_by], \
455 buf_zp[0:size_bz], buf_zm[0:size_bz], \
456 buf_tp[0:size_bt], buf_tm[0:size_bt], \
457 u[0:size_u], v1[0:size]) \
458 copyin(bc[0:4], do_comm[0:4], Nx, Ny, Nz, Nt, Nst_pad)
467 #pragma acc parallel async\
468 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
470 int Nxyz = Nx * Ny * Nz;
472 #pragma acc loop gang worker vector
475 int ist =
ixyz + Nxyz *
it;
477 for(
int ivc = 0; ivc <
NVC; ++ivc){
487 #pragma acc parallel async \
488 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
490 int Nxyz = Nx * Ny * Nz;
492 #pragma acc loop gang worker vector
495 int ist =
ixyz + Nxyz *
it;
496 int istu = ist + Nst_pad * 3;
499 for(
int ivc = 0; ivc <
NVC; ++ivc){
504 for(
int ic = 0; ic <
NC; ++ic){
507 for(
int ic2 = 0; ic2 <
NC; ++ic2){
508 ut[2*ic2 ] = u[
IDX2_G_R(ic, ic2, istu)];
509 ut[2*ic2+1] = - u[
IDX2_G_I(ic, ic2, istu)];
513 wt1[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
515 wt1[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
517 wt2[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
519 wt2[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
539 #pragma acc update async host (buf_xp[0:size_bx])
540 #pragma acc update async host (buf_xm[0:size_bx])
543 #pragma acc update async host (buf_yp[0:size_by])
544 #pragma acc update async host (buf_ym[0:size_by])
547 #pragma acc update async host (buf_zp[0:size_bz])
548 #pragma acc update async host (buf_zm[0:size_bz])
551 #pragma acc update async host (buf_tp[0:size_bt])
552 #pragma acc update async host (buf_tm[0:size_bt])
566 int *Nsize,
int *bc,
int *do_comm,
int flag)
573 int Nst = Nx * Ny * Nz * Nt;
576 int size =
NVC *
ND * Nst_pad;
577 int size_u =
NDF * Nst_pad *
NDIM;
584 #pragma acc update async device (buf_xp[0:size_bx])
585 #pragma acc update async device (buf_xm[0:size_bx])
588 #pragma acc update async device (buf_yp[0:size_by])
589 #pragma acc update async device (buf_ym[0:size_by])
592 #pragma acc update async device (buf_zp[0:size_bz])
593 #pragma acc update async device (buf_zm[0:size_bz])
596 #pragma acc update async device (buf_tp[0:size_bt])
597 #pragma acc update async device (buf_tm[0:size_bt])
602 #pragma acc data present(buf_xp[0:size_bx], buf_xm[0:size_bx], \
603 buf_yp[0:size_by], buf_ym[0:size_by], \
604 buf_zp[0:size_bz], buf_zm[0:size_bz], \
605 buf_tp[0:size_bt], buf_tm[0:size_bt], \
606 v2[0:size], u[0:size_u]) \
607 copyin(bc[0:4], do_comm[0:4], kappa, Nx, Ny, Nz, Nt, Nst_pad)
610 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
612 int Nst = Nx * Ny * Nz * Nt;
614 #pragma acc loop gang worker vector
615 for(
int ist = 0; ist < Nst; ++ist){
617 int iy = (ist/Nx) % Ny;
618 int iz = (ist/(Nx * Ny)) % Nz;
619 int it = ist/(Nx * Ny * Nz);
622 for(
int id = 0;
id <
ND; ++id){
623 for(
int ivc = 0; ivc <
NVC; ++ivc){
624 v2L[ivc +
NVC * id] = 0.0;
637 int istu = ist + Nst_pad * 3;
641 for(
int ivc = 0; ivc <
NVC; ++ivc){
646 for(
int ic = 0; ic <
NC; ++ic){
649 for(
int ic2 = 0; ic2 <
NC; ++ic2){
650 ut[2*ic2 ] = u[
IDX2_G_R(ic2, ic, istu)];
651 ut[2*ic2+1] = u[
IDX2_G_I(ic2, ic, istu)];
655 wt1[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
657 wt1[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
659 wt2[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
661 wt2[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
663 v2L[ic*2 +
ID3] += wt1[0];
664 v2L[ic*2+1 +
ID3] += wt1[1];
665 v2L[ic*2 +
ID4] += wt2[0];
666 v2L[ic*2+1 +
ID4] += wt2[1];
676 for(
int ic = 0; ic <
NC; ++ic){
681 v2L[ic*2 +
ID1] += wt1[0];
682 v2L[ic*2+1 +
ID1] += wt1[1];
683 v2L[ic*2 +
ID2] += wt2[0];
684 v2L[ic*2+1 +
ID2] += wt2[1];
694 for(
int id = 0;
id <
ND; ++id){
695 for(
int ivc = 0; ivc <
NVC; ++ivc){
696 v2[
IDX2_SP(ivc,
id, ist)] += -kappa * v2L[ivc +
NVC * id];
700 for(
int ic = 0; ic <
NC; ++ic){
702 v2[
IDX2_SP_I(ic, 0, ist)] += -kappa * v2L[ic*2+1 +
ID3];
704 v2[
IDX2_SP_I(ic, 1, ist)] += -kappa * v2L[ic*2+1 +
ID4];
706 v2[
IDX2_SP_I(ic, 2, ist)] += -kappa * v2L[ic*2+1 +
ID1];
708 v2[
IDX2_SP_I(ic, 3, ist)] += -kappa * v2L[ic*2+1 +
ID2];
728 int *Nsize,
int *bc,
int *do_comm,
int flag)
734 int Nst = Nx * Ny * Nz * Nt;
737 int size =
NVC *
ND * Nst_pad;
738 int size_u =
NDF * Nst_pad *
NDIM;
745 #pragma acc update async device (buf_xp[0:size_bx])
746 #pragma acc update async device (buf_xm[0:size_bx])
749 #pragma acc update async device (buf_yp[0:size_by])
750 #pragma acc update async device (buf_ym[0:size_by])
753 #pragma acc update async device (buf_zp[0:size_bz])
754 #pragma acc update async device (buf_zm[0:size_bz])
757 #pragma acc update async device (buf_tp[0:size_bt])
758 #pragma acc update async device (buf_tm[0:size_bt])
763 #pragma acc data present(buf_xp[0:size_bx], buf_xm[0:size_bx], \
764 buf_yp[0:size_by], buf_ym[0:size_by], \
765 buf_zp[0:size_bz], buf_zm[0:size_bz], \
766 buf_tp[0:size_bt], buf_tm[0:size_bt], \
767 v2[0:size], u[0:size_u]) \
768 copyin(bc[0:4], do_comm[0:4], kappa, Nx, Ny, Nz, Nt)
771 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
773 int Nst = Nx * Ny * Nz * Nt;
775 #pragma acc loop gang worker vector
776 for(
int ist = 0; ist < Nst; ++ist){
778 int iy = (ist/Nx) % Ny;
779 int iz = (ist/(Nx * Ny)) % Nz;
780 int it = ist/(Nx * Ny * Nz);
783 for(
int id = 0;
id <
ND; ++id){
784 for(
int ivc = 0; ivc <
NVC; ++ivc){
785 v2L[ivc +
NVC * id] = 0.0;
797 int istu = ist + Nst_pad * 3;
802 for(
int ivc = 0; ivc <
NVC; ++ivc){
807 for(
int ic = 0; ic <
NC; ++ic){
809 for(
int ic2 = 0; ic2 <
NC; ++ic2){
810 ut[2*ic2 ] = u[
IDX2_G_R(ic2, ic, istu)];
811 ut[2*ic2+1] = u[
IDX2_G_I(ic2, ic, istu)];
814 wt1[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
816 wt1[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
818 wt2[0] =
MULT_UV_R(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
820 wt2[1] =
MULT_UV_I(ut[0], ut[1], ut[2], ut[3], ut[4], ut[5],
823 v2L[ic*2 +
ID1] += wt1[0];
824 v2L[ic*2+1 +
ID1] += wt1[1];
825 v2L[ic*2 +
ID2] += wt2[0];
826 v2L[ic*2+1 +
ID2] += wt2[1];
827 v2L[ic*2 +
ID3] += wt1[0];
828 v2L[ic*2+1 +
ID3] += wt1[1];
829 v2L[ic*2 +
ID4] += wt2[0];
830 v2L[ic*2+1 +
ID4] += wt2[1];
840 for(
int ic = 0; ic <
NC; ++ic){
845 v2L[ic*2 +
ID1] += wt1[0];
846 v2L[ic*2+1 +
ID1] += wt1[1];
847 v2L[ic*2 +
ID2] += wt2[0];
848 v2L[ic*2+1 +
ID2] += wt2[1];
849 v2L[ic*2 +
ID3] -= wt1[0];
850 v2L[ic*2+1 +
ID3] -= wt1[1];
851 v2L[ic*2 +
ID4] -= wt2[0];
852 v2L[ic*2+1 +
ID4] -= wt2[1];
861 for(
int id = 0;
id <
ND; ++id){
862 for(
int ivc = 0; ivc <
NVC; ++ivc){
863 v2[
IDX2_SP(ivc,
id, ist)] += -kappa * v2L[ivc +
NVC * id];
867 for(
int ic = 0; ic <
NC; ++ic){
869 v2[
IDX2_SP_I(ic, 0, ist)] += -kappa * v2L[ic*2+1 +
ID1];
871 v2[
IDX2_SP_I(ic, 1, ist)] += -kappa * v2L[ic*2+1 +
ID2];