10 #ifndef MULT_DOMAINWALL_5DIN_LUINV_ACC_INCLUDED
11 #define MULT_DOMAINWALL_5DIN_LUINV_ACC_INCLUDED
24 int Nst = Nx * Ny * Nz * Nt;
28 int size = Nin5 * Nst_pad;
30 #pragma acc data present(vp[0:size], wp[0:size]) \
31 copyin(Nst, Nst_pad, Nin5, Ns, e[0:Ns-1], f[0:Ns-1], \
32 dpinv[0:Ns], dm[0:Ns], alpha)
35 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
38 #pragma acc loop gang worker vector
42 int ivc = idx2_wp %
NVC;
43 int idx_out = idx2_wp /
NVC;
44 int site = idx_in +
NWP * idx_out;
50 for(
int id = 0;
id <
ND; ++id){
51 int ivcd = ivc +
NVC * id;
52 vt[id] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
54 for(
int id = 0;
id <
ND; ++id){
55 int ivcd = ivc +
NVC * id;
56 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
59 for(
int id = 0;
id <
ND; ++id){
60 yt[id] = e[0] * vt[id];
63 for (
int is = 1; is < Ns-1; ++is) {
65 for(
int id = 0;
id <
ND; ++id){
69 for(
int id = 0;
id <
ND; ++id){
70 int ivcd = ivc +
NVC * id;
71 vt[id] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
76 vt[0] += a * (xt[0] + xt[2]);
77 vt[1] += a * (xt[1] + xt[3]);
78 vt[2] += a * (xt[2] + xt[0]);
79 vt[3] += a * (xt[3] + xt[1]);
81 for(
int id = 0;
id <
ND; ++id){
82 int ivcd = ivc +
NVC * id;
83 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
86 for(
int id = 0;
id <
ND; ++id){
87 yt[id] += e[is] * vt[id];
94 for(
int id = 0;
id <
ND; ++id){
98 for(
int id = 0;
id <
ND; ++id){
99 int ivcd = ivc +
NVC * id;
100 vt[id] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
105 vt[0] += a * (xt[0] + xt[2]);
106 vt[1] += a * (xt[1] + xt[3]);
107 vt[2] += a * (xt[2] + xt[0]);
108 vt[3] += a * (xt[3] + xt[1]);
110 vt[0] += -0.5 * (yt[0] - yt[2]);
111 vt[1] += -0.5 * (yt[1] - yt[3]);
112 vt[2] += -0.5 * (yt[2] - yt[0]);
113 vt[3] += -0.5 * (yt[3] - yt[1]);
115 for(
int id = 0;
id <
ND; ++id){
116 int ivcd = ivc +
NVC * id;
117 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
124 real_t f1 = 0.5 * (1.0 + alpha);
125 real_t f2 = 0.5 * (-1.0 + alpha);
132 vt[0] = a * (f1 *
vt1 + f2 *
vt3);
133 vt[1] = a * (f1 *
vt2 + f2 *
vt4);
134 vt[2] = a * (f1 *
vt3 + f2 *
vt1);
135 vt[3] = a * (f1 *
vt4 + f2 *
vt2);
137 for(
int id = 0;
id <
ND; ++id){
138 int ivcd = ivc +
NVC * id;
139 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
142 yt[0] = 0.5 * (vt[0] + vt[2]);
143 yt[1] = 0.5 * (vt[1] + vt[3]);
144 yt[2] = 0.5 * (vt[2] + vt[0]);
145 yt[3] = 0.5 * (vt[3] + vt[1]);
147 for (
int is = Ns-2; is >= 0; --is) {
149 for(
int id = 0;
id <
ND; ++id){
153 for(
int id = 0;
id <
ND; ++id){
154 int ivcd = ivc +
NVC * id;
155 vt[id] = vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
160 vt[0] += a * (xt[0] - xt[2]);
161 vt[1] += a * (xt[1] - xt[3]);
162 vt[2] += a * (xt[2] - xt[0]);
163 vt[3] += a * (xt[3] - xt[1]);
165 for(
int id = 0;
id <
ND; ++id){
166 vt[id] += - f[is] * yt[id];
171 for(
int id = 0;
id <
ND; ++id){
176 real_t f1 = 0.5 * (1.0 + alpha);
177 real_t f2 = 0.5 * (1.0 - alpha);
178 vt1 = f1 * vt[0] + f2 * vt[2];
179 vt2 = f1 * vt[1] + f2 * vt[3];
180 vt3 = f1 * vt[2] + f2 * vt[0];
181 vt4 = f1 * vt[3] + f2 * vt[1];
187 for(
int id = 0;
id <
ND; ++id){
188 int ivcd = ivc +
NVC * id;
189 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
214 int Nst = Nx * Ny * Nz * Nt;
217 int Nin5 =
NVCD * Ns;
218 int size = Nin5 * Nst_pad;
220 #pragma acc data present(vp[0:size], wp[0:size]) \
221 copyin(Nst, Nst_pad, Nin5, Ns, e[0:Ns-1], f[0:Ns-1], \
222 dpinv[0:Ns], dm[0:Ns], alpha)
225 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
228 #pragma acc loop gang worker vector
232 int ivc = idx2_wp %
NVC;
233 int idx_out = idx2_wp /
NVC;
234 int site = idx_in +
NWP * idx_out;
242 real_t f1 = 0.5 * (1.0 + alpha);
243 real_t f2 = 0.5 * (1.0 - alpha);
250 vt[0] = a * (f1 *
vt1 + f2 *
vt3);
251 vt[1] = a * (f1 *
vt2 + f2 *
vt4);
252 vt[2] = a * (f1 *
vt3 + f2 *
vt1);
253 vt[3] = a * (f1 *
vt4 + f2 *
vt2);
256 for(
int id = 0;
id <
ND; ++id){
257 int ivcd = ivc +
NVC * id;
258 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
261 for(
int id = 0;
id <
ND; ++id){
262 yt[id] = f[0] * vt[id];
265 for (
int is = 1; is < Ns-1; ++is) {
267 for(
int id = 0;
id <
ND; ++id){
271 for(
int id = 0;
id <
ND; ++id){
272 int ivcd = ivc +
NVC * id;
273 vt[id] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
278 vt[0] += a * (xt[0] - xt[2]);
279 vt[1] += a * (xt[1] - xt[3]);
280 vt[2] += a * (xt[2] - xt[0]);
281 vt[3] += a * (xt[3] - xt[1]);
285 for(
int id = 0;
id <
ND; ++id){
289 for(
int id = 0;
id <
ND; ++id){
290 int ivcd = ivc +
NVC * id;
291 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
294 for(
int id = 0;
id <
ND; ++id){
295 yt[id] += f[is] * vt[id];
302 for(
int id = 0;
id <
ND; ++id){
306 for(
int id = 0;
id <
ND; ++id){
307 int ivcd = ivc +
NVC * id;
308 vt[id] = wp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
311 a =
real_t(0.5) * dm[is - 1];
313 vt[0] += a * (xt[0] - xt[2]);
314 vt[1] += a * (xt[1] - xt[3]);
315 vt[2] += a * (xt[2] - xt[0]);
316 vt[3] += a * (xt[3] - xt[1]);
318 vt[0] += -0.5 * (yt[0] + yt[2]);
319 vt[1] += -0.5 * (yt[1] + yt[3]);
320 vt[2] += -0.5 * (yt[2] + yt[0]);
321 vt[3] += -0.5 * (yt[3] + yt[1]);
325 for(
int id = 0;
id <
ND; ++id){
329 real_t ff1 = 0.5 * ( 1.0 + alpha);
330 real_t ff2 = 0.5 * (-1.0 + alpha);
333 vt1 = ff1 * vt[0] + ff2 * vt[2];
334 vt2 = ff1 * vt[1] + ff2 * vt[3];
335 vt3 = ff1 * vt[2] + ff2 * vt[0];
336 vt4 = ff1 * vt[3] + ff2 * vt[1];
346 for(
int id = 0;
id <
ND; ++id){
347 int ivcd = ivc +
NVC * id;
348 vt[id] = vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
351 for(
int id = 0;
id <
ND; ++id){
352 int ivcd = ivc +
NVC * id;
353 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];
356 yt[0] = 0.5 * (vt[0] - vt[2]);
357 yt[1] = 0.5 * (vt[1] - vt[3]);
358 yt[2] = 0.5 * (vt[2] - vt[0]);
359 yt[3] = 0.5 * (vt[3] - vt[1]);
361 for (
int is = Ns-2; is >= 0; --is) {
363 for(
int id = 0;
id <
ND; ++id){
367 for(
int id = 0;
id <
ND; ++id){
368 int ivcd = ivc +
NVC * id;
369 vt[id] = vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)];
374 vt[0] += a * (xt[0] + xt[2]);
375 vt[1] += a * (xt[1] + xt[3]);
376 vt[2] += a * (xt[2] + xt[0]);
377 vt[3] += a * (xt[3] + xt[1]);
379 for(
int id = 0;
id <
ND; ++id){
380 vt[id] += -e[is] * yt[id];
383 for(
int id = 0;
id <
ND; ++id){
384 int ivcd = ivc +
NVC * id;
385 vp[
IDX2(Nin5, (ivcd +
NVCD * is), site)] = vt[id];