Bridge++  Ver.2.1.3
mult_Domainwall_5din_4d_openacc-inc.h
Go to the documentation of this file.
1 
10 #ifndef MULT_DOMAINWALL_5DIN_4D_ACC_INCLUDED
11 #define MULT_DOMAINWALL_5DIN_4D_ACC_INCLUDED
12 
13 //====================================================================
15  real_t *RESTRICT vp, real_t *RESTRICT up, real_t *RESTRICT wp,
16  int Ns, int *bc, int *Nsize, int *do_comm, int flag)
17 {
18  int Nx = Nsize[0];
19  int Ny = Nsize[1];
20  int Nz = Nsize[2];
21  int Nt = Nsize[3];
22  int Nst = Nx * Ny * Nz * Nt;
23  int Nst_pad = CEIL_NWP(Nst);
24 
25  int Nin5 = NVCD * Ns;
26 
27  int size = Nin5 * Nst_pad;
28  int size_u = NDF * Nst_pad * NDIM;
29 
30 #pragma acc data present(vp[0:size], up[0:size_u], wp[0:size]) \
31  copyin(Nst, Nst_pad, Nx, Ny, Nz, Nt, Nin5, Ns, \
32  bc[0:NDIM], do_comm[0:NDIM])
33  {
34 #pragma acc parallel num_workers(NUM_WORKERS) vector_length(VECTOR_LENGTH)
35  {
36 
37 #pragma acc loop gang worker vector
38  for (int site = 0; site < Nst_pad; ++site) {
39  if(site < Nst){
40 
41  int Nxy = Nx * Ny;
42  int Nxyz = Nxy * Nz;
43 
44  int ix = site % Nx;
45  int iyzt = site / Nx;
46  int ixy = site % Nxy;
47  int iy = iyzt % Ny;
48  int izt = site / Nxy;
49  int iz = izt % Nz;
50  int it = izt / Nz;
51  int ixyz = site % Nxyz;
52 
53  int idir;
54 
55  for(int is = 0; is < Ns; ++is){
56 
57  real_t vL[NVCD];
58 
59  if(flag == 0){
60  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
61  vL[ivcd] = 0.0;
62  }
63  }else{
64  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
65  vL[ivcd] = vp[IDX2(Nin5, (ivcd + NVCD * is), site)];
66  }
67  }
68 
69  idir = 0;
70 
71  if ((ix < Nx-1) || (do_comm[idir] == 0)) {
72  int ix2 = (ix + 1) % Nx;
73  int nei = ix2 + Nx * iyzt;
74  real_t bc2 = 1.0;
75  if(ix == Nx-1) bc2 = bc[0];
76 
77  real_t ut[NDF];
78  load_u(ut, up, site + Nst_pad * idir);
79 
80  real_t wt[NVCD];
81  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
82  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
83  }
84  mult_wilson_xpb(vL, ut, wt);
85  }
86 
87  if ((ix > 0) || (do_comm[idir] == 0)) {
88  int ix2 = (ix - 1 + Nx) % Nx;
89  int nei = ix2 + Nx * iyzt;
90  real_t bc2 = 1.0;
91  if(ix == 0) bc2 = bc[0];
92 
93  real_t ut[NDF];
94  load_u(ut, up, nei + Nst_pad * idir);
95 
96  real_t wt[NVCD];
97  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
98  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
99  }
100  mult_wilson_xmb(vL, ut, wt);
101  }
102 
103  idir = 1;
104 
105  if ((iy < Ny-1) || (do_comm[idir] == 0)) {
106  int iy2 = (iy + 1) % Ny;
107  int nei = ix + Nx * (iy2 + Ny * izt);
108  real_t bc2 = 1.0;
109  if(iy == Ny-1) bc2 = bc[1];
110 
111  real_t ut[NDF];
112  load_u(ut, up, site + Nst_pad * idir);
113 
114  real_t wt[NVCD];
115  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
116  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
117  }
118  mult_wilson_ypb(vL, ut, wt);
119  }
120 
121  if ((iy > 0) || (do_comm[idir] == 0)) {
122  int iy2 = (iy - 1 + Ny) % Ny;
123  int nei = ix + Nx * (iy2 + Ny * izt);
124  real_t bc2 = 1.0;
125  if(iy == 0) bc2 = bc[1];
126 
127  real_t ut[NDF];
128  load_u(ut, up, nei + Nst_pad * idir);
129 
130  real_t wt[NVCD];
131  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
132  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
133  }
134  mult_wilson_ymb(vL, ut, wt);
135  }
136 
137  idir = 2;
138 
139  if ((iz < Nz-1) || (do_comm[idir] == 0)) {
140  int iz2 = (iz + 1) % Nz;
141  int nei = ixy + Nxy * (iz2 + Nz * it);
142  real_t bc2 = 1.0;
143  if(iz == Nz-1) bc2 = bc[2];
144 
145  real_t ut[NDF];
146  load_u(ut, up, site + Nst_pad * idir);
147 
148  real_t wt[NVCD];
149  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
150  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
151  }
152  mult_wilson_zpb(vL, ut, wt);
153  }
154 
155  if ((iz > 0) || (do_comm[idir] == 0)) {
156  int iz2 = (iz - 1 + Nz) % Nz;
157  int nei = ixy + Nxy * (iz2 + Nz * it);
158  real_t bc2 = 1.0;
159  if(iz == 0) bc2 = bc[2];
160 
161  real_t ut[NDF];
162  load_u(ut, up, nei + Nst_pad * idir);
163 
164  real_t wt[NVCD];
165  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
166  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
167  }
168  mult_wilson_zmb(vL, ut, wt);
169  }
170 
171  idir = 3;
172 
173  if ((it < Nt-1) || (do_comm[idir] == 0)) {
174  int it2 = (it + 1) % Nt;
175  int nei = ixyz + Nxyz * it2;
176  real_t bc2 = 1.0;
177  if(it == Nt-1) bc2 = bc[3];
178 
179  real_t ut[NDF];
180  load_u(ut, up, site + Nst_pad * idir);
181 
182  real_t wt[NVCD];
183  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
184  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
185  }
186  mult_wilson_tpb_dirac(vL, ut, wt);
187  }
188 
189  if ((it > 0) || (do_comm[idir] == 0)) {
190  int it2 = (it - 1 + Nt) % Nt;
191  int nei = ixyz + Nxyz * it2;
192  real_t bc2 = 1.0;
193  if(it == 0) bc2 = bc[3];
194 
195  real_t ut[NDF];
196  load_u(ut, up, nei + Nst_pad * idir);
197 
198  real_t wt[NVCD];
199  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
200  wt[ivcd] = bc2 * wp[IDX2(Nin5, (ivcd + NVCD * is), nei)];
201  }
202  mult_wilson_tmb_dirac(vL, ut, wt);
203  }
204 
205  for(int ivcd = 0; ivcd < NVCD; ++ivcd){
206  vp[IDX2(Nin5, (ivcd + NVCD*is), site)] = vL[ivcd];
207  }
208 
209  } // is loop
210  }
211  } // site loop
212 
213  } // acc parallel
214  } // acc data
215 
216 }
217 
218 
219 #endif
220 //============================================================END=====
iy
int iy
Definition: mult_Wilson_xyz_openacc-inc.h:239
ixy
int ixy
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:513
wt
real_t wt[NVCD]
Definition: mult_Clover_csw_chiral_openacc-inc.h:9
BridgeACC::mult_wilson_xpb
void mult_wilson_xpb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:130
izt
int izt
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:262
NVCD
#define NVCD
Definition: define_params_SU3.h:20
NDF
#define NDF
Definition: field_F_imp_SU2-inc.h:17
CEIL_NWP
#define CEIL_NWP(nst)
Definition: define_params.h:47
iyzt
int iyzt
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:14
ix
int ix
Definition: mult_Wilson_xyz_openacc-inc.h:16
BridgeACC::mult_wilson_tmb_dirac
void mult_wilson_tmb_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1569
BridgeACC::mult_wilson_xmb
void mult_wilson_xmb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:334
idir
idir
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:264
bc2
int bc2
Definition: mult_Domainwall_eo_t_dirac_openacc-inc.h:62
BridgeACC::mult_wilson_zpb
void mult_wilson_zpb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:962
BridgeACC::mult_wilson_tpb_dirac
void mult_wilson_tpb_dirac(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1373
it
int it
Definition: mult_Wilson_xyz_openacc-inc.h:461
BridgeACC::mult_wilson_zmb
void mult_wilson_zmb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:1177
ix2
int ix2
Definition: mult_Domainwall_eo_xyz_openacc-inc.h:138
real_t
double real_t
Definition: bridgeACC_AField_double.cpp:14
BridgeACC::mult_wilson_ypb
void mult_wilson_ypb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:537
IDX2
#define IDX2(nin, in, ist)
Definition: define_index.h:28
mult_domainwall_5din_hopb_dirac_4d
void mult_domainwall_5din_hopb_dirac_4d(real_t *RESTRICT vp, real_t *RESTRICT up, real_t *RESTRICT wp, int Ns, int *bc, int *Nsize, int *do_comm, int flag)
Definition: mult_Domainwall_5din_4d_openacc-inc.h:14
BridgeACC::mult_wilson_ymb
void mult_wilson_ymb(double *RESTRICT v2, double *RESTRICT u, double *RESTRICT v1, int *Nsize, int *bc, int Nc)
Definition: mult_Wilson_dir_openacc-inc.h:752
load_u
void load_u(real_t *ut, real_t *up, int site)
Definition: mult_Wilson_inline_openacc-inc.h:26
iz
int iz
Definition: mult_Wilson_xyz_openacc-inc.h:462
NDIM
#define NDIM
Definition: contract_4spinor.cpp:18
ixyz
int ixyz
Definition: mult_Domainwall_eo_t_dirac_openacc-inc.h:13