10 #ifndef MULT_DOMAINWALL_5DIN_EO_ACC_INCLUDED
11 #define MULT_DOMAINWALL_5DIN_EO_ACC_INCLUDED
23 int Nst = Nx * Ny * Nz * Nt;
27 int size = Nin5 * Nst_pad;
29 #pragma acc data present(vp[0:size], wp[0:size]) \
30 copyin(Nst, Nst_pad, Ns, Nin5, mq, M0, b[0:Ns], c[0:Ns], alpha)
32 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
35 #pragma acc loop gang worker vector
36 for (
int site = 0; site < Nst_pad; ++site) {
39 for (
int is = 0; is < Ns; ++is) {
41 real_t FF1 = b[is] * (4.0 - M0) + 1.0;
42 real_t FF2 = c[is] * (4.0 - M0) - 1.0;
46 int is_up = (is+1) % Ns;
47 real_t Fup = 0.5 * FF2 * alpha;
48 if (is == Ns-1) Fup = -0.5 * mq * FF2;
50 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
51 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is_up), site)];
53 for (
int ivc = 0; ivc <
NVC; ++ivc) {
60 int is_dn = (is-1 + Ns) % Ns;
61 real_t Fdn = 0.5 * FF2 * alpha;
62 if (is == 0) Fdn = -0.5 * mq * FF2;
64 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
65 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is_dn), site)];
67 for (
int ivc = 0; ivc <
NVC; ++ivc) {
75 real_t fac1 = FF1 * 0.5 * ( 1.0 + alpha);
76 real_t fac2 = FF1 * 0.5 * (-1.0 + alpha);
77 for(
int ivc = 0; ivc <
NVC; ++ivc){
79 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
80 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
81 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
82 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
83 wt[
ID1 + ivc] = fac1 * wt1 + fac2 * wt3;
84 wt[
ID2 + ivc] = fac1 * wt2 + fac2 * wt4;
85 wt[
ID3 + ivc] = fac1 * wt3 + fac2 * wt1;
86 wt[
ID4 + ivc] = fac1 * wt4 + fac2 * wt2;
89 real_t fac1 = FF1 * 0.5 * (1.0 + alpha);
90 real_t fac2 = FF1 * 0.5 * (1.0 - alpha);
91 for(
int ivc = 0; ivc <
NVC; ++ivc){
93 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
94 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
95 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
96 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
97 wt[
ID1 + ivc] = fac1 * wt1 + fac2 * wt3;
98 wt[
ID2 + ivc] = fac1 * wt2 + fac2 * wt4;
99 wt[
ID3 + ivc] = fac1 * wt3 + fac2 * wt1;
100 wt[
ID4 + ivc] = fac1 * wt4 + fac2 * wt2;
104 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
105 wt[ivcd] = f1 * wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
109 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
110 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] =
wt[ivcd] + vt[ivcd];
131 int Nst = Nx * Ny * Nz * Nt;
134 int Nin5 =
NVCD * Ns;
135 int size = Nin5 * Nst_pad;
137 #pragma acc data present(yp[0:size], wp[0:size]) \
138 copyin(Nst, Nst_pad, Ns, Nin5, mq, M0, b[0:Ns], c[0:Ns], alpha)
140 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
143 #pragma acc loop gang worker vector
147 int ivc = idx2_wp %
NVC;
148 int idx_out = idx2_wp /
NVC;
149 int site = idx_in +
NWP*idx_out;
152 for (
int is = 0; is < Ns; ++is) {
155 real_t wt1, wt2, wt3, wt4;
157 int is_up = (is+1) % Ns;
158 real_t Fup = 0.5 * c[is] * alpha;
159 if (is == Ns-1) Fup = -0.5 * mq * c[is];
160 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is_up), site)];
161 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is_up), site)];
162 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is_up), site)];
163 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is_up), site)];
165 vt1 = Fup * (wt1 - wt3);
166 vt2 = Fup * (wt2 - wt4);
167 vt3 = Fup * (wt3 - wt1);
168 vt4 = Fup * (wt4 - wt2);
170 int is_dn = (is-1 + Ns) % Ns;
171 real_t Fdn = 0.5 * c[is] * alpha;
172 if (is == 0) Fdn = -0.5 * mq * c[is];
173 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is_dn), site)];
174 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is_dn), site)];
175 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is_dn), site)];
176 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is_dn), site)];
178 vt1 += Fdn * (wt1+ wt3);
179 vt2 += Fdn * (wt2+ wt4);
180 vt3 += Fdn * (wt3+ wt1);
181 vt4 += Fdn * (wt4+ wt2);
184 real_t b1 = b[is] * 0.5 * ( 1.0 + alpha);
185 real_t b2 = b[is] * 0.5 * (-1.0 + alpha);
186 real_t yt1, yt2, yt3, yt4;
187 yt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
188 yt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
189 yt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
190 yt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
191 wt1 = b1 * yt1 + b2 * yt3;
192 wt2 = b1 * yt2 + b2 * yt4;
193 wt3 = b1 * yt3 + b2 * yt1;
194 wt4 = b1 * yt4 + b2 * yt2;
195 }
else if(is == Ns-1){
196 real_t b1 = b[is] * 0.5 * (1.0 + alpha);
197 real_t b2 = b[is] * 0.5 * (1.0 - alpha);
198 real_t yt1, yt2, yt3, yt4;
199 yt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
200 yt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
201 yt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
202 yt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
203 wt1 = b1 * yt1 + b2 * yt3;
204 wt2 = b1 * yt2 + b2 * yt4;
205 wt3 = b1 * yt3 + b2 * yt1;
206 wt4 = b1 * yt4 + b2 * yt2;
208 real_t bb = b[is] * alpha;
209 wt1 = bb * wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
210 wt2 = bb * wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
211 wt3 = bb * wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
212 wt4 = bb * wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
215 yp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)] = -0.5 * (wt1 +
vt1);
216 yp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)] = -0.5 * (wt2 +
vt2);
217 yp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)] = -0.5 * (wt3 +
vt3);
218 yp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)] = -0.5 * (wt4 +
vt4);
239 int Nst = Nx * Ny * Nz * Nt;
242 int Nin5 =
NVCD * Ns;
243 int size = Nin5 * Nst_pad;
245 #pragma acc data present(vp[0:size], wp[0:size]) \
246 copyin(Nst, Nst_pad, Ns, Nin5, mq, M0, b[0:Ns], c[0:Ns], alpha)
248 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
251 #pragma acc loop gang worker vector
252 for (
int site = 0; site < Nst_pad; ++site) {
255 for (
int is = 0; is < Ns; ++is) {
259 real_t B1 = b[is] * (4.0 - M0) + 1.0;
263 real_t fac1 = B1 * 0.5 * ( 1.0 + alpha);
264 real_t fac2 = B1 * 0.5 * (-1.0 + alpha);
265 for(
int ivc = 0; ivc <
NVC; ++ivc){
266 real_t wt1, wt2, wt3, wt4;
267 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
268 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
269 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
270 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
271 vt[
ID1 + ivc] = fac1 * wt1 + fac2 * wt3;
272 vt[
ID2 + ivc] = fac1 * wt2 + fac2 * wt4;
273 vt[
ID3 + ivc] = fac1 * wt3 + fac2 * wt1;
274 vt[
ID4 + ivc] = fac1 * wt4 + fac2 * wt2;
276 }
else if(is == Ns-1){
277 real_t fac1 = B1 * 0.5 * (1.0 + alpha);
278 real_t fac2 = B1 * 0.5 * (1.0 - alpha);
279 for(
int ivc = 0; ivc <
NVC; ++ivc){
280 real_t wt1, wt2, wt3, wt4;
281 wt1 = wp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
282 wt2 = wp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
283 wt3 = wp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
284 wt4 = wp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
285 vt[
ID1 + ivc] = fac1 * wt1 + fac2 * wt3;
286 vt[
ID2 + ivc] = fac1 * wt2 + fac2 * wt4;
287 vt[
ID3 + ivc] = fac1 * wt3 + fac2 * wt1;
288 vt[
ID4 + ivc] = fac1 * wt4 + fac2 * wt2;
292 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
293 vt[ivcd] = bb * wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
297 int is_up = (is+1) % Ns;
298 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
299 xt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is_up), site)];
302 real_t Fup = 0.5 * (c[is_up] * (4.0 - M0) - 1.0);
308 for (
int ivc = 0; ivc <
NVC; ++ivc) {
309 vt[
ID1 + ivc] += Fup * (xt[
ID1 + ivc] + xt[
ID3 + ivc]);
310 vt[
ID2 + ivc] += Fup * (xt[
ID2 + ivc] + xt[
ID4 + ivc]);
311 vt[
ID3 + ivc] += Fup * (xt[
ID3 + ivc] + xt[
ID1 + ivc]);
312 vt[
ID4 + ivc] += Fup * (xt[
ID4 + ivc] + xt[
ID2 + ivc]);
315 int is_dn = (is-1 + Ns) % Ns;
316 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
317 xt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is_dn), site)];
320 real_t Fdn = 0.5 * (c[is_dn] * (4.0 - M0) - 1.0);
326 for (
int ivc = 0; ivc <
NVC; ++ivc) {
327 vt[
ID1 + ivc] += Fdn * (xt[
ID1 + ivc] - xt[
ID3 + ivc]);
328 vt[
ID2 + ivc] += Fdn * (xt[
ID2 + ivc] - xt[
ID4 + ivc]);
329 vt[
ID3 + ivc] += Fdn * (xt[
ID3 + ivc] - xt[
ID1 + ivc]);
330 vt[
ID4 + ivc] += Fdn * (xt[
ID4 + ivc] - xt[
ID2 + ivc]);
333 for (
int ivcd = 0; ivcd <
NVCD; ++ivcd) {
334 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[ivcd];
355 int Nst = Nx * Ny * Nz * Nt;
358 int Nin5 =
NVCD * Ns;
359 int size = Nin5 * Nst_pad;
361 #pragma acc data present(vp[0:size], yp[0:size]) \
362 copyin(Nst, Nst_pad, Ns, Nin5, mq, M0, b[0:Ns], c[0:Ns], alpha)
364 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
367 #pragma acc loop gang worker vector
371 int ivc = idx2_wp %
NVC;
372 int idx_out = idx2_wp /
NVC;
373 int site = idx_in +
NWP*idx_out;
376 for (
int is = 0; is < Ns; ++is) {
379 real_t yt1, yt2, yt3, yt4;
381 yt1 = yp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is), site)];
382 yt2 = yp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is), site)];
383 yt3 = yp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is), site)];
384 yt4 = yp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is), site)];
387 real_t b1 = -0.5 * b[is] * 0.5 * ( 1.0 + alpha);
388 real_t b2 = -0.5 * b[is] * 0.5 * (-1.0 + alpha);
389 vt1 = b1 * yt3 + b2 * yt1;
390 vt2 = b1 * yt4 + b2 * yt2;
391 vt3 = b1 * yt1 + b2 * yt3;
392 vt4 = b1 * yt2 + b2 * yt4;
393 }
else if(is == Ns-1){
394 real_t b1 = -0.5 * b[is] * 0.5 * (1.0 + alpha);
395 real_t b2 = -0.5 * b[is] * 0.5 * (1.0 - alpha);
396 vt1 = b1 * yt3 + b2 * yt1;
397 vt2 = b1 * yt4 + b2 * yt2;
398 vt3 = b1 * yt1 + b2 * yt3;
399 vt4 = b1 * yt2 + b2 * yt4;
401 real_t bb = -0.5 * b[is] * alpha;
408 int is_up = (is+1) % Ns;
409 yt1 = yp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is_up), site)];
410 yt2 = yp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is_up), site)];
411 yt3 = yp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is_up), site)];
412 yt4 = yp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is_up), site)];
414 real_t Fup = -0.5 * c[is_up] * 0.5 * alpha;
415 if (is == Ns-1) Fup = -0.5 * c[is_up] * (-0.5) * mq;
417 vt1 += Fup * (yt3 + yt1);
418 vt2 += Fup * (yt4 + yt2);
419 vt3 += Fup * (yt1 + yt3);
420 vt4 += Fup * (yt2 + yt4);
422 int is_dn = (is-1 + Ns) % Ns;
423 yt1 = yp[
IDX2(Nin5, (
ID1 + ivc +
NVCD * is_dn), site)];
424 yt2 = yp[
IDX2(Nin5, (
ID2 + ivc +
NVCD * is_dn), site)];
425 yt3 = yp[
IDX2(Nin5, (
ID3 + ivc +
NVCD * is_dn), site)];
426 yt4 = yp[
IDX2(Nin5, (
ID4 + ivc +
NVCD * is_dn), site)];
428 real_t Fdn = -0.5 * c[is_dn] * (0.5) * alpha;
429 if (is == 0) Fdn = -0.5 * c[is_dn] * (-0.5) * mq;
431 vt1 += Fdn * (yt3 - yt1);
432 vt2 += Fdn * (yt4 - yt2);
433 vt3 += Fdn * (yt1 - yt3);
434 vt4 += Fdn * (yt2 - yt4);
452 int Ns,
int *bc,
int *Nsize,
int *do_comm,
int ieo,
int jeo,
459 int Nst = Nx * Ny * Nz * Nt;
462 int Nin5 =
NVCD * Ns;
464 int size = Nin5 * Nst_pad;
465 int size_u =
NDF * Nst_pad * 2 *
NDIM;
467 #pragma acc data present(vp[0:size], up[0:size_u], wp[0:size]) \
468 copyin(Nst, Nst_pad, Nx, Ny, Nz, Nt, Nin5, Ns, \
469 bc[0:NDIM], do_comm[0:NDIM], ieo, jeo, jgm5)
472 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
474 real_t *RESTRICT u_up = up;
475 real_t *RESTRICT u_dn = up;
477 #pragma acc loop gang worker vector
478 for (
int idx = 0;
idx < Ns * Nst_pad; ++
idx) {
481 int is = idx2_wp % Ns;
482 int idx_out = idx2_wp / Ns;
484 int site = idx_in +
NWP*idx_out;
489 int iyzt = site / Nx;
491 int izt = site / Nxy;
494 int Nxyz = Nx * Ny * Nz;
496 int keo = (jeo +
iy +
iz +
it) % 2;
559 int Ns,
int *bc,
int *Nsize,
int *do_comm,
int ieo,
int jeo,
566 int Nst = Nx * Ny * Nz * Nt;
569 int Nin5 =
NVCD * Ns;
570 int Nin5bd =
NVC *
ND2 * Ns;
572 int size = Nin5 * Nst_pad;
573 int size_u =
NDF * Nst_pad * 2 *
NDIM;
575 int size_bx = Nin5bd *
CEIL_NWP((Ny * Nz * Nt + 1)/2);
576 int size_by = Nin5bd *
CEIL_NWP(Nst/Ny);
577 int size_bz = Nin5bd *
CEIL_NWP(Nst/Nz);
578 int size_bt = Nin5bd *
CEIL_NWP(Nst/Nt);
580 #pragma acc data present(up[0:size_u], wp[0:size], \
581 buf_xp[0:size_bx], buf_xm[0:size_bx], \
582 buf_yp[0:size_by], buf_ym[0:size_by], \
583 buf_zp[0:size_bz], buf_zm[0:size_bz], \
584 buf_tp[0:size_bt], buf_tm[0:size_bt] ) \
585 copyin(Nst, Nst_pad, Nx, Ny, Nz, Nt, Nin5, Ns, \
586 bc[0:NDIM], do_comm[0:4], ieo, jeo, jgm5)
589 if (do_comm[0] > 0) {
591 int Nyzt = Ny * Nz * Nt;
594 #pragma acc parallel async \
595 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
598 #pragma acc loop gang worker vector
605 int keo = (jeo +
iy +
iz +
it) % 2;
610 int site =
ix + Nx *
iyzt;
612 for (
int is = 0; is < Ns; ++is) {
615 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
616 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
619 for(
int ivc = 0; ivc <
NVC; ++ivc){
627 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
628 buf_xp[
IDX2(Nin5bd, (ivcd + NVCD2 * is), iyzt2)] =
bc2 * vt[ivcd];
636 int site =
ix + Nx *
iyzt;
638 load_u(ut, up, site + Nst_pad * (1-ieo + 2*
idir));
639 for (
int is = 0; is < Ns; ++is) {
642 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
643 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
646 for(
int ivc = 0; ivc <
NVC; ++ivc){
654 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
655 buf_xm[
IDX2(Nin5bd, (ivcd + NVCD2 * is), iyzt2)] = vt[ivcd];
664 if (do_comm[1] > 0) {
666 int Nxzt = Nx * Nz * Nt;
668 #pragma acc parallel async \
669 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
673 #pragma acc loop gang worker vector
674 for (
int ixzt = 0; ixzt < Nxzt_pad; ++ixzt) {
680 int site =
ix + Nx * (
iy + Ny *
izt);
682 for (
int is = 0; is < Ns; ++is) {
685 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
686 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
689 for(
int ivc = 0; ivc <
NVC; ++ivc){
697 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
698 buf_yp[
IDX2(Nin5bd, (ivcd + NVCD2 * is), ixzt)] =
bc2 * vt[ivcd];
703 site =
ix + Nx * (
iy + Ny *
izt);
705 load_u(ut, up, site + Nst_pad * (1-ieo + 2*
idir));
706 for (
int is = 0; is < Ns; ++is) {
709 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
710 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
713 for(
int ivc = 0; ivc <
NVC; ++ivc){
721 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
722 buf_ym[
IDX2(Nin5bd, (ivcd + NVCD2 * is), ixzt)] = vt[ivcd];
730 if (do_comm[2] > 0) {
733 int Nxyt = Nx * Ny * Nt;
735 #pragma acc parallel async \
736 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
740 #pragma acc loop gang worker vector
741 for (
int ixyt = 0; ixyt < Nxyt_pad; ++ixyt) {
745 int ixy = ixyt % Nxy;
747 int site =
ixy + Nxy * (
iz + Nz *
it);
749 for (
int is = 0; is < Ns; ++is) {
752 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
753 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
756 for(
int ivc = 0; ivc <
NVC; ++ivc){
764 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
765 buf_zp[
IDX2(Nin5bd, (ivcd + NVCD2 * is), ixyt)] =
bc2 * vt[ivcd];
770 site =
ixy + Nxy * (
iz + Nz *
it);
772 load_u(ut, up, site + Nst_pad * (1-ieo + 2*
idir));
773 for (
int is = 0; is < Ns; ++is) {
776 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
777 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
780 for(
int ivc = 0; ivc <
NVC; ++ivc){
788 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
789 buf_zm[
IDX2(Nin5bd, (ivcd + NVCD2 * is), ixyt)] = vt[ivcd];
798 if (do_comm[3] > 0) {
800 int Nxyz = Nx * Ny * Nz;
802 #pragma acc parallel async \
803 num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
807 #pragma acc loop gang worker vector
812 int site =
ixyz + Nxyz *
it;
814 for (
int is = 0; is < Ns; ++is) {
817 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
818 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
821 for(
int ivc = 0; ivc <
NVC; ++ivc){
829 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
830 buf_tp[
IDX2(Nin5bd, (ivcd + NVCD2 * is),
ixyz)] =
bc2 * vt[ivcd];
837 load_u(ut, up, site + Nst_pad * (1-ieo + 2*
idir));
838 for (
int is = 0; is < Ns; ++is) {
841 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
842 wt[ivcd] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
845 for(
int ivc = 0; ivc <
NVC; ++ivc){
853 for(
int ivcd = 0; ivcd <
NVC *
ND2; ++ivcd){
854 buf_tm[
IDX2(Nin5bd, (ivcd + NVCD2 * is),
ixyz)] = vt[ivcd];
868 #pragma acc update async host (buf_xp[0:size_bx])
869 #pragma acc update async host (buf_xm[0:size_bx])
872 #pragma acc update async host (buf_yp[0:size_by])
873 #pragma acc update async host (buf_ym[0:size_by])
876 #pragma acc update async host (buf_zp[0:size_bz])
877 #pragma acc update async host (buf_zm[0:size_bz])
880 #pragma acc update async host (buf_tp[0:size_bt])
881 #pragma acc update async host (buf_tm[0:size_bt])
895 int Ns,
int *bc,
int *Nsize,
int *do_comm,
int ieo,
int jeo)
901 int Nst = Nx * Ny * Nz * Nt;
904 int Nin5 =
NVCD * Ns;
905 int Nin5bd = (
NVCD/2) * Ns;
907 int size = Nin5 * Nst_pad;
908 int size_u =
NDF * Nst_pad * 2 *
NDIM;
909 int size_bx = Nin5bd *
CEIL_NWP((Ny * Nz * Nt + 1)/2);
910 int size_by = Nin5bd *
CEIL_NWP(Nx * Nz * Nt);
911 int size_bz = Nin5bd *
CEIL_NWP(Nx * Ny * Nt);
912 int size_bt = Nin5bd *
CEIL_NWP(Nx * Ny * Nz);
915 #pragma acc update async device (buf_xp[0:size_bx])
916 #pragma acc update async device (buf_xm[0:size_bx])
919 #pragma acc update async device (buf_yp[0:size_by])
920 #pragma acc update async device (buf_ym[0:size_by])
923 #pragma acc update async device (buf_zp[0:size_bz])
924 #pragma acc update async device (buf_zm[0:size_bz])
927 #pragma acc update async device (buf_tp[0:size_bt])
928 #pragma acc update async device (buf_tm[0:size_bt])
933 #pragma acc data present(buf_xp[0:size_bx], buf_xm[0:size_bx], \
934 buf_yp[0:size_by], buf_ym[0:size_by], \
935 buf_zp[0:size_bz], buf_zm[0:size_bz], \
936 buf_tp[0:size_bt], buf_tm[0:size_bt], \
937 vp[0:size], up[0:size_u]) \
938 copyin(Nst, Nx, Ny, Nz, Nt, Nin5, Ns, \
939 bc[0:NDIM], do_comm[0:4], ieo, jeo)
942 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
945 int Nxyz = Nx * Ny * Nz;
948 #pragma acc loop gang worker vector
949 for (
int site = 0; site < Nst_pad; ++site) {
953 int iyzt = site / Nx;
954 int ixy = site % Nxy;
956 int izt = site / Nxy;
959 int ixyz = site % Nxyz;
960 int keo = (jeo +
iy +
iz +
it) % 2;
964 for(
int is = 0; is < Ns; ++is){
968 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
975 if (do_comm[
idir] > 0) {
977 if(
ix == Nx-1 && keo == 1){
979 load_u(ut, up, site + Nst_pad * (ieo + 2*
idir));
982 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
983 wt[ivcd] = buf_xp[
IDX2(Nin5bd, ivcd + NVCD2 * is, iyzt2)];
989 if(
ix == 0 && keo == 0){
993 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
994 wt[ivcd] =
bc2 * buf_xm[
IDX2(Nin5bd, ivcd + NVCD2 * is, iyzt2)];
1002 if (do_comm[
idir] > 0) {
1003 int ixzt =
ix + Nx *
izt;
1007 load_u(ut, up, site + Nst_pad * (ieo + 2*
idir));
1009 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1010 wt[ivcd] = buf_yp[
IDX2(Nin5bd, ivcd + NVCD2 * is, ixzt)];
1019 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1020 wt[ivcd] =
bc2 * buf_ym[
IDX2(Nin5bd, ivcd + NVCD2 * is, ixzt)];
1028 if (do_comm[
idir] > 0) {
1029 int ixyt =
ixy + Nxy *
it;
1032 load_u(ut, up, site + Nst_pad * (ieo + 2*
idir));
1034 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1035 wt[ivcd] = buf_zp[
IDX2(Nin5bd, ivcd + NVCD2 * is, ixyt)];
1044 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1045 wt[ivcd] =
bc2 * buf_zm[
IDX2(Nin5bd, ivcd + NVCD2 * is, ixyt)];
1053 if (do_comm[
idir] > 0) {
1056 load_u(ut, up, site + Nst_pad * (ieo + 2*
idir));
1058 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1059 wt[ivcd] = buf_tp[
IDX2(Nin5bd, ivcd + NVCD2 * is,
ixyz)];
1068 for(
int ivcd = 0; ivcd < NVCD2; ++ivcd){
1069 wt[ivcd] =
bc2 * buf_tm[
IDX2(Nin5bd, ivcd + NVCD2 * is,
ixyz)];
1077 for(
int ivcd = 0; ivcd <
NVCD; ++ivcd){
1078 vp[
IDX2(Nin5, ivcd +
NVCD * is, site)] += vL[ivcd];