WarpX
WarpXComm_K.H
Go to the documentation of this file.
1 /* Copyright 2019 Axel Huebl, Weiqun Zhang
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_COMM_K_H_
8 #define WARPX_COMM_K_H_
9 
10 #include <AMReX_FArrayBox.H>
11 #include <AMReX.H>
12 
13 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
14 void warpx_interp_bfield_x (int j, int k, int l,
15  amrex::Array4<amrex::Real > const& Bxa,
16  amrex::Array4<amrex::Real const> const& Bxf,
17  amrex::Array4<amrex::Real const> const& Bxc)
18 {
19  using namespace amrex;
20 
21  int const lg = amrex::coarsen(l,2);
22  int const kg = amrex::coarsen(k,2);
23  int const jg = amrex::coarsen(j,2);
24 
25  Real const wx = (j == jg*2) ? 0.0_rt : 0.5_rt;
26  Real const owx = 1.0_rt - wx;
27  Bxa(j,k,l) = owx * Bxc(jg,kg,lg) + wx * Bxc(jg+1,kg,lg) + Bxf(j,k,l);
28 }
29 
30 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
31 void warpx_interp_bfield_y (int j, int k, int l,
32  amrex::Array4<amrex::Real > const& Bya,
33  amrex::Array4<amrex::Real const> const& Byf,
34  amrex::Array4<amrex::Real const> const& Byc)
35 {
36  using namespace amrex;
37 
38  int const lg = amrex::coarsen(l,2);
39  int const kg = amrex::coarsen(k,2);
40  int const jg = amrex::coarsen(j,2);
41 
42  // Note that for 2d, l=0, because the amrex convention is used here.
43 
44 #if (AMREX_SPACEDIM == 3)
45  Real const wy = (k == kg*2) ? 0.0_rt : 0.5_rt;
46  Real const owy = 1.0_rt - wy;
47  Bya(j,k,l) = owy * Byc(jg,kg,lg) + wy * Byc(jg,kg+1,lg) + Byf(j,k,l);
48 #else
49  Bya(j,k,l) = Byc(jg,kg,lg) + Byf(j,k,l);
50 #endif
51 }
52 
53 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
54 void warpx_interp_bfield_z (int j, int k, int l,
55  amrex::Array4<amrex::Real > const& Bza,
56  amrex::Array4<amrex::Real const> const& Bzf,
57  amrex::Array4<amrex::Real const> const& Bzc)
58 {
59  using namespace amrex;
60 
61  int const lg = amrex::coarsen(l,2);
62  int const kg = amrex::coarsen(k,2);
63  int const jg = amrex::coarsen(j,2);
64 
65  // Note that for 2d, l=0, because the amrex convention is used here.
66 
67 #if (AMREX_SPACEDIM == 3)
68  Real const wz = (l == lg*2) ? 0.0_rt : 0.5_rt;
69  Real const owz = 1.0_rt - wz;
70  Bza(j,k,l) = owz * Bzc(jg,kg,lg) + owz * Bzc(jg,kg,lg+1) + Bzf(j,k,l);
71 #else
72  Real const wy = (k == kg*2) ? 0.0_rt : 0.5_rt;
73  Real const owy = 1.0_rt - wy;
74  Bza(j,k,l) = owy * Bzc(jg,kg,lg) + owy * Bzc(jg,kg+1,lg) + Bzf(j,k,l);
75 #endif
76 }
77 
78 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
79 void warpx_interp_efield_x (int j, int k, int l,
80  amrex::Array4<amrex::Real > const& Exa,
81  amrex::Array4<amrex::Real const> const& Exf,
82  amrex::Array4<amrex::Real const> const& Exc)
83 {
84  using namespace amrex;
85 
86  int const lg = amrex::coarsen(l,2);
87  int const kg = amrex::coarsen(k,2);
88  int const jg = amrex::coarsen(j,2);
89 
90  Real const wy = (k == kg*2) ? 0.0_rt : 0.5_rt;
91  Real const owy = 1.0_rt - wy;
92 
93 #if (AMREX_SPACEDIM == 3)
94  Real const wz = (l == lg*2) ? 0.0_rt : 0.5_rt;
95  Real const owz = 1.0_rt - wz;
96  Exa(j,k,l) = owy * owz * Exc(jg ,kg ,lg )
97  + wy * owz * Exc(jg ,kg+1,lg )
98  + owy * wz * Exc(jg ,kg ,lg+1)
99  + wy * wz * Exc(jg ,kg+1,lg+1)
100  + Exf(j,k,l);
101 #else
102  Exa(j,k,l) = owy * Exc(jg,kg,lg) + wy * Exc(jg,kg+1,lg) + Exf(j,k,l);
103 #endif
104 }
105 
106 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
107 void warpx_interp_efield_y (int j, int k, int l,
108  amrex::Array4<amrex::Real > const& Eya,
109  amrex::Array4<amrex::Real const> const& Eyf,
110  amrex::Array4<amrex::Real const> const& Eyc)
111 {
112  using namespace amrex;
113 
114  int const lg = amrex::coarsen(l,2);
115  int const kg = amrex::coarsen(k,2);
116  int const jg = amrex::coarsen(j,2);
117 
118  Real const wx = (j == jg*2) ? 0.0_rt : 0.5_rt;
119  Real const owx = 1.0_rt - wx;
120 
121 #if (AMREX_SPACEDIM == 3)
122  Real const wz = (l == lg*2) ? 0.0_rt : 0.5_rt;
123  Real const owz = 1.0_rt - wz;
124  Eya(j,k,l) = owx * owz * Eyc(jg ,kg ,lg )
125  + wx * owz * Eyc(jg+1,kg ,lg )
126  + owx * wz * Eyc(jg ,kg ,lg+1)
127  + wx * wz * Eyc(jg+1,kg ,lg+1)
128  + Eyf(j,k,l);
129 #else
130  Real const wy = (k == kg*2) ? 0.0_rt : 0.5_rt;
131  Real const owy = 1.0_rt - wy;
132  Eya(j,k,l) = owx * owy * Eyc(jg ,kg ,lg)
133  + wx * owy * Eyc(jg+1,kg ,lg)
134  + owx * wy * Eyc(jg ,kg+1,lg)
135  + wx * wy * Eyc(jg+1,kg+1,lg)
136  + Eyf(j,k,l);
137 #endif
138 }
139 
140 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
141 void warpx_interp_efield_z (int j, int k, int l,
142  amrex::Array4<amrex::Real > const& Eza,
143  amrex::Array4<amrex::Real const> const& Ezf,
144  amrex::Array4<amrex::Real const> const& Ezc)
145 {
146  using namespace amrex;
147 
148  int const lg = amrex::coarsen(l,2);
149  int const kg = amrex::coarsen(k,2);
150  int const jg = amrex::coarsen(j,2);
151 
152  Real const wx = (j == jg*2) ? 0.0_rt : 0.5_rt;
153  Real const owx = 1.0_rt - wx;
154 
155 #if (AMREX_SPACEDIM == 3)
156  Real wy = (k == kg*2) ? 0.0_rt : 0.5_rt;
157  Real owy = 1.0_rt - wy;
158  Eza(j,k,l) = owx * owy * Ezc(jg ,kg ,lg )
159  + wx * owy * Ezc(jg+1,kg ,lg )
160  + owx * wy * Ezc(jg ,kg+1,lg )
161  + wx * wy * Ezc(jg+1,kg+1,lg )
162  + Ezf(j,k,l);
163 #else
164  Eza(j,k,l) = owx * Ezc(jg,kg,lg) + wx * Ezc(jg+1,kg,lg) + Ezf(j,k,l);
165 #endif
166 }
167 
168 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
169 void warpx_interp_nd_bfield_x (int j, int k, int l,
170  amrex::Array4<amrex::Real> const& Bxa,
171  amrex::Array4<amrex::Real const> const& Bxf,
172  amrex::Array4<amrex::Real const> const& Bxc,
173  amrex::Array4<amrex::Real const> const& Bxg)
174 {
175  using namespace amrex;
176 
177  int jg = amrex::coarsen(j,2);
178  Real wx = (j == jg*2) ? 0.0 : 0.5;
179  Real owx = 1.0-wx;
180 
181  int kg = amrex::coarsen(k,2);
182  Real wy = (k == kg*2) ? 0.0 : 0.5;
183  Real owy = 1.0-wy;
184 
185 #if (AMREX_SPACEDIM == 2)
186 
187  // interp from coarse nodal to fine nodal
188  Real bg = owx * owy * Bxg(jg ,kg ,0)
189  + owx * wy * Bxg(jg ,kg+1,0)
190  + wx * owy * Bxg(jg+1,kg ,0)
191  + wx * wy * Bxg(jg+1,kg+1,0);
192 
193  // interp from coarse staggered to fine nodal
194  wy = 0.5-wy; owy = 1.0-wy;
195  Real bc = owx * owy * Bxc(jg ,kg ,0)
196  + owx * wy * Bxc(jg ,kg-1,0)
197  + wx * owy * Bxc(jg+1,kg ,0)
198  + wx * wy * Bxc(jg+1,kg-1,0);
199 
200  // interp from fine staggered to fine nodal
201  Real bf = 0.5*(Bxf(j,k-1,0) + Bxf(j,k,0));
202 
203 #else
204 
205  int lg = amrex::coarsen(l,2);
206  Real wz = (l == lg*2) ? 0.0 : 0.5;
207  Real owz = 1.0-wz;
208 
209  // interp from coarse nodal to fine nodal
210  Real bg = owx * owy * owz * Bxg(jg ,kg ,lg )
211  + wx * owy * owz * Bxg(jg+1,kg ,lg )
212  + owx * wy * owz * Bxg(jg ,kg+1,lg )
213  + wx * wy * owz * Bxg(jg+1,kg+1,lg )
214  + owx * owy * wz * Bxg(jg ,kg ,lg+1)
215  + wx * owy * wz * Bxg(jg+1,kg ,lg+1)
216  + owx * wy * wz * Bxg(jg ,kg+1,lg+1)
217  + wx * wy * wz * Bxg(jg+1,kg+1,lg+1);
218 
219  // interp from coarse staggered to fine nodal
220  wy = 0.5-wy; owy = 1.0-wy;
221  wz = 0.5-wz; owz = 1.0-wz;
222  Real bc = owx * owy * owz * Bxc(jg ,kg ,lg )
223  + wx * owy * owz * Bxc(jg+1,kg ,lg )
224  + owx * wy * owz * Bxc(jg ,kg-1,lg )
225  + wx * wy * owz * Bxc(jg+1,kg-1,lg )
226  + owx * owy * wz * Bxc(jg ,kg ,lg-1)
227  + wx * owy * wz * Bxc(jg+1,kg ,lg-1)
228  + owx * wy * wz * Bxc(jg ,kg-1,lg-1)
229  + wx * wy * wz * Bxc(jg+1,kg-1,lg-1);
230 
231  // interp from fine stagged to fine nodal
232  Real bf = 0.25*(Bxf(j,k-1,l-1) + Bxf(j,k,l-1) + Bxf(j,k-1,l) + Bxf(j,k,l));
233 #endif
234 
235  Bxa(j,k,l) = bg + (bf-bc);
236 }
237 
238 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
239 void warpx_interp_nd_bfield_y (int j, int k, int l,
240  amrex::Array4<amrex::Real> const& Bya,
241  amrex::Array4<amrex::Real const> const& Byf,
242  amrex::Array4<amrex::Real const> const& Byc,
243  amrex::Array4<amrex::Real const> const& Byg)
244 {
245  using namespace amrex;
246 
247  int jg = amrex::coarsen(j,2);
248  Real wx = (j == jg*2) ? 0.0 : 0.5;
249  Real owx = 1.0-wx;
250 
251  int kg = amrex::coarsen(k,2);
252  Real wy = (k == kg*2) ? 0.0 : 0.5;
253  Real owy = 1.0-wy;
254 
255 #if (AMREX_SPACEDIM == 2)
256 
257  // interp from coarse nodal to fine nodal
258  Real bg = owx * owy * Byg(jg ,kg ,0)
259  + owx * wy * Byg(jg ,kg+1,0)
260  + wx * owy * Byg(jg+1,kg ,0)
261  + wx * wy * Byg(jg+1,kg+1,0);
262 
263  // interp from coarse stagged (cell-centered for By) to fine nodal
264  wx = 0.5-wx; owx = 1.0-wx;
265  wy = 0.5-wy; owy = 1.0-wy;
266  Real bc = owx * owy * Byc(jg ,kg ,0)
267  + owx * wy * Byc(jg ,kg-1,0)
268  + wx * owy * Byc(jg-1,kg ,0)
269  + wx * wy * Byc(jg-1,kg-1,0);
270 
271  // interp form fine stagger (cell-centered for By) to fine nodal
272  Real bf = 0.25*(Byf(j,k,0) + Byf(j-1,k,0) + Byf(j,k-1,0) + Byf(j-1,k-1,0));
273 
274 #else
275 
276  int lg = amrex::coarsen(l,2);
277  Real wz = (l == lg*2) ? 0.0 : 0.5;
278  Real owz = 1.0-wz;
279 
280  // interp from coarse nodal to fine nodal
281  Real bg = owx * owy * owz * Byg(jg ,kg ,lg )
282  + wx * owy * owz * Byg(jg+1,kg ,lg )
283  + owx * wy * owz * Byg(jg ,kg+1,lg )
284  + wx * wy * owz * Byg(jg+1,kg+1,lg )
285  + owx * owy * wz * Byg(jg ,kg ,lg+1)
286  + wx * owy * wz * Byg(jg+1,kg ,lg+1)
287  + owx * wy * wz * Byg(jg ,kg+1,lg+1)
288  + wx * wy * wz * Byg(jg+1,kg+1,lg+1);
289 
290  // interp from coarse staggered to fine nodal
291  wx = 0.5-wx; owx = 1.0-wx;
292  wz = 0.5-wz; owz = 1.0-wz;
293  Real bc = owx * owy * owz * Byc(jg ,kg ,lg )
294  + wx * owy * owz * Byc(jg-1,kg ,lg )
295  + owx * wy * owz * Byc(jg ,kg+1,lg )
296  + wx * wy * owz * Byc(jg-1,kg+1,lg )
297  + owx * owy * wz * Byc(jg ,kg ,lg-1)
298  + wx * owy * wz * Byc(jg-1,kg ,lg-1)
299  + owx * wy * wz * Byc(jg ,kg+1,lg-1)
300  + wx * wy * wz * Byc(jg-1,kg+1,lg-1);
301 
302  // interp from fine stagged to fine nodal
303  Real bf = 0.25*(Byf(j-1,k,l-1) + Byf(j,k,l-1) + Byf(j-1,k,l) + Byf(j,k,l));
304 
305 #endif
306 
307  Bya(j,k,l) = bg + (bf-bc);
308 }
309 
310 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
311 void warpx_interp_nd_bfield_z (int j, int k, int l,
312  amrex::Array4<amrex::Real> const& Bza,
313  amrex::Array4<amrex::Real const> const& Bzf,
314  amrex::Array4<amrex::Real const> const& Bzc,
315  amrex::Array4<amrex::Real const> const& Bzg)
316 {
317  using namespace amrex;
318 
319  int jg = amrex::coarsen(j,2);
320  Real wx = (j == jg*2) ? 0.0 : 0.5;
321  Real owx = 1.0-wx;
322 
323  int kg = amrex::coarsen(k,2);
324  Real wy = (k == kg*2) ? 0.0 : 0.5;
325  Real owy = 1.0-wy;
326 
327 #if (AMREX_SPACEDIM == 2)
328 
329  // interp from coarse nodal to fine nodal
330  Real bg = owx * owy * Bzg(jg ,kg ,0)
331  + owx * wy * Bzg(jg ,kg+1,0)
332  + wx * owy * Bzg(jg+1,kg ,0)
333  + wx * wy * Bzg(jg+1,kg+1,0);
334 
335  // interp from coarse staggered to fine nodal
336  wx = 0.5-wx; owx = 1.0-wx;
337  Real bc = owx * owy * Bzc(jg ,kg ,0)
338  + owx * wy * Bzc(jg ,kg+1,0)
339  + wx * owy * Bzc(jg-1,kg ,0)
340  + wx * wy * Bzc(jg-1,kg+1,0);
341 
342  // interp from fine staggered to fine nodal
343  Real bf = 0.5*(Bzf(j-1,k,0) + Bzf(j,k,0));
344 
345 #else
346 
347  int lg = amrex::coarsen(l,2);
348  Real wz = (l == lg*2) ? 0.0 : 0.5;
349  Real owz = 1.0-wz;
350 
351  // interp from coarse nodal to fine nodal
352  Real bg = owx * owy * owz * Bzg(jg ,kg ,lg )
353  + wx * owy * owz * Bzg(jg+1,kg ,lg )
354  + owx * wy * owz * Bzg(jg ,kg+1,lg )
355  + wx * wy * owz * Bzg(jg+1,kg+1,lg )
356  + owx * owy * wz * Bzg(jg ,kg ,lg+1)
357  + wx * owy * wz * Bzg(jg+1,kg ,lg+1)
358  + owx * wy * wz * Bzg(jg ,kg+1,lg+1)
359  + wx * wy * wz * Bzg(jg+1,kg+1,lg+1);
360 
361  // interp from coarse staggered to fine nodal
362  wx = 0.5-wx; owx = 1.0-wx;
363  wy = 0.5-wy; owy = 1.0-wy;
364  Real bc = owx * owy * owz * Bzc(jg ,kg ,lg )
365  + wx * owy * owz * Bzc(jg-1,kg ,lg )
366  + owx * wy * owz * Bzc(jg ,kg-1,lg )
367  + wx * wy * owz * Bzc(jg-1,kg-1,lg )
368  + owx * owy * wz * Bzc(jg ,kg ,lg+1)
369  + wx * owy * wz * Bzc(jg-1,kg ,lg+1)
370  + owx * wy * wz * Bzc(jg ,kg-1,lg+1)
371  + wx * wy * wz * Bzc(jg-1,kg-1,lg+1);
372 
373  // interp from fine stagged to fine nodal
374  Real bf = 0.25*(Bzf(j-1,k-1,l) + Bzf(j,k-1,l) + Bzf(j-1,k,l) + Bzf(j,k,l));
375 
376 #endif
377 
378  Bza(j,k,l) = bg + (bf-bc);
379 }
380 
381 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
382 void warpx_interp_nd_bfield_x (int j, int k, int l,
383  amrex::Array4<amrex::Real> const& Bxa,
384  amrex::Array4<amrex::Real const> const& Bxf)
385 {
386 #if (AMREX_SPACEDIM == 2)
387  Bxa(j,k,0) = 0.5*(Bxf(j,k-1,0) + Bxf(j,k,0));
388  amrex::ignore_unused(l);
389 #else
390  Bxa(j,k,l) = 0.25*(Bxf(j,k-1,l-1) + Bxf(j,k,l-1) + Bxf(j,k-1,l) + Bxf(j,k,l));
391 #endif
392 }
393 
394 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
395 void warpx_interp_nd_bfield_y (int j, int k, int l,
396  amrex::Array4<amrex::Real> const& Bya,
397  amrex::Array4<amrex::Real const> const& Byf)
398 {
399 #if (AMREX_SPACEDIM == 2)
400  Bya(j,k,0) = 0.25*(Byf(j,k,0) + Byf(j-1,k,0) + Byf(j,k-1,0) + Byf(j-1,k-1,0));
401  amrex::ignore_unused(l);
402 #else
403  Bya(j,k,l) = 0.25*(Byf(j-1,k,l-1) + Byf(j,k,l-1) + Byf(j-1,k,l) + Byf(j,k,l));
404 #endif
405 }
406 
407 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
408 void warpx_interp_nd_bfield_z (int j, int k, int l,
409  amrex::Array4<amrex::Real> const& Bza,
410  amrex::Array4<amrex::Real const> const& Bzf)
411 {
412 #if (AMREX_SPACEDIM == 2)
413  Bza(j,k,0) = 0.5*(Bzf(j-1,k,0) + Bzf(j,k,0));
414  amrex::ignore_unused(l);
415 #else
416  Bza(j,k,l) = 0.25*(Bzf(j-1,k-1,l) + Bzf(j,k-1,l) + Bzf(j-1,k,l) + Bzf(j,k,l));
417 #endif
418 }
419 
420 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
421 void warpx_interp_nd_efield_x (int j, int k, int l,
422  amrex::Array4<amrex::Real> const& Exa,
423  amrex::Array4<amrex::Real const> const& Exf,
424  amrex::Array4<amrex::Real const> const& Exc,
425  amrex::Array4<amrex::Real const> const& Exg)
426 {
427  using namespace amrex;
428 
429  int jg = amrex::coarsen(j,2);
430  Real wx = (j == jg*2) ? 0.0 : 0.5;
431  Real owx = 1.0-wx;
432 
433  int kg = amrex::coarsen(k,2);
434  Real wy = (k == kg*2) ? 0.0 : 0.5;
435  Real owy = 1.0-wy;
436 
437 #if (AMREX_SPACEDIM == 2)
438 
439  // interp from coarse nodal to fine nodal
440  Real eg = owx * owy * Exg(jg ,kg ,0)
441  + owx * wy * Exg(jg ,kg+1,0)
442  + wx * owy * Exg(jg+1,kg ,0)
443  + wx * wy * Exg(jg+1,kg+1,0);
444 
445  // interp from coarse staggered to fine nodal
446  wx = 0.5-wx; owx = 1.0-wx;
447  Real ec = owx * owy * Exc(jg ,kg ,0)
448  + owx * wy * Exc(jg ,kg+1,0)
449  + wx * owy * Exc(jg-1,kg ,0)
450  + wx * wy * Exc(jg-1,kg+1,0);
451 
452  // interp from fine staggered to fine nodal
453  Real ef = 0.5*(Exf(j-1,k,0) + Exf(j,k,0));
454 
455 #else
456 
457  int lg = amrex::coarsen(l,2);
458  Real wz = (l == lg*2) ? 0.0 : 0.5;
459  Real owz = 1.0-wz;
460 
461  // interp from coarse nodal to fine nodal
462  Real eg = owx * owy * owz * Exg(jg ,kg ,lg )
463  + wx * owy * owz * Exg(jg+1,kg ,lg )
464  + owx * wy * owz * Exg(jg ,kg+1,lg )
465  + wx * wy * owz * Exg(jg+1,kg+1,lg )
466  + owx * owy * wz * Exg(jg ,kg ,lg+1)
467  + wx * owy * wz * Exg(jg+1,kg ,lg+1)
468  + owx * wy * wz * Exg(jg ,kg+1,lg+1)
469  + wx * wy * wz * Exg(jg+1,kg+1,lg+1);
470 
471  // interp from coarse staggered to fine nodal
472  wx = 0.5-wx; owx = 1.0-wx;
473  Real ec = owx * owy * owz * Exc(jg ,kg ,lg )
474  + wx * owy * owz * Exc(jg-1,kg ,lg )
475  + owx * wy * owz * Exc(jg ,kg+1,lg )
476  + wx * wy * owz * Exc(jg-1,kg+1,lg )
477  + owx * owy * wz * Exc(jg ,kg ,lg+1)
478  + wx * owy * wz * Exc(jg-1,kg ,lg+1)
479  + owx * wy * wz * Exc(jg ,kg+1,lg+1)
480  + wx * wy * wz * Exc(jg-1,kg+1,lg+1);
481 
482  // interp from fine staggered to fine nodal
483  Real ef = 0.5*(Exf(j-1,k,l) + Exf(j,k,l));
484 
485 #endif
486 
487  Exa(j,k,l) = eg + (ef-ec);
488 }
489 
490 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
491 void warpx_interp_nd_efield_y (int j, int k, int l,
492  amrex::Array4<amrex::Real> const& Eya,
493  amrex::Array4<amrex::Real const> const& Eyf,
494  amrex::Array4<amrex::Real const> const& Eyc,
495  amrex::Array4<amrex::Real const> const& Eyg)
496 {
497  using namespace amrex;
498 
499  int jg = amrex::coarsen(j,2);
500  Real wx = (j == jg*2) ? 0.0 : 0.5;
501  Real owx = 1.0-wx;
502 
503  int kg = amrex::coarsen(k,2);
504  Real wy = (k == kg*2) ? 0.0 : 0.5;
505  Real owy = 1.0-wy;
506 
507 #if (AMREX_SPACEDIM == 2)
508 
509  // interp from coarse nodal and coarse staggered to fine nodal
510  Real eg = owx * owy * (Eyg(jg ,kg ,0) + Eyc(jg ,kg ,0))
511  + owx * wy * (Eyg(jg ,kg+1,0) + Eyc(jg ,kg+1,0))
512  + wx * owy * (Eyg(jg+1,kg ,0) + Eyc(jg+1,kg ,0))
513  + wx * wy * (Eyg(jg+1,kg+1,0) + Eyc(jg+1,kg+1,0));
514  Real ec = 0.0;
515 
516  // interp from fine staggered to fine nodal
517  Real ef = Eyf(j,k,0);
518 
519 #else
520 
521  int lg = amrex::coarsen(l,2);
522  Real wz = (l == lg*2) ? 0.0 : 0.5;
523  Real owz = 1.0-wz;
524 
525  // interp from coarse nodal to fine nodal
526  Real eg = owx * owy * owz * Eyg(jg ,kg ,lg )
527  + wx * owy * owz * Eyg(jg+1,kg ,lg )
528  + owx * wy * owz * Eyg(jg ,kg+1,lg )
529  + wx * wy * owz * Eyg(jg+1,kg+1,lg )
530  + owx * owy * wz * Eyg(jg ,kg ,lg+1)
531  + wx * owy * wz * Eyg(jg+1,kg ,lg+1)
532  + owx * wy * wz * Eyg(jg ,kg+1,lg+1)
533  + wx * wy * wz * Eyg(jg+1,kg+1,lg+1);
534 
535  // interp from coarse staggered to fine nodal
536  wy = 0.5-wy; owy = 1.0-wy;
537  Real ec = owx * owy * owz * Eyc(jg ,kg ,lg )
538  + wx * owy * owz * Eyc(jg+1,kg ,lg )
539  + owx * wy * owz * Eyc(jg ,kg-1,lg )
540  + wx * wy * owz * Eyc(jg+1,kg-1,lg )
541  + owx * owy * wz * Eyc(jg ,kg ,lg+1)
542  + wx * owy * wz * Eyc(jg+1,kg ,lg+1)
543  + owx * wy * wz * Eyc(jg ,kg-1,lg+1)
544  + wx * wy * wz * Eyc(jg+1,kg-1,lg+1);
545 
546  // interp from fine staggered to fine nodal
547  Real ef = 0.5*(Eyf(j,k-1,l) + Eyf(j,k,l));
548 
549 #endif
550 
551  Eya(j,k,l) = eg + (ef-ec);
552 }
553 
554 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
555 void warpx_interp_nd_efield_z (int j, int k, int l,
556  amrex::Array4<amrex::Real> const& Eza,
557  amrex::Array4<amrex::Real const> const& Ezf,
558  amrex::Array4<amrex::Real const> const& Ezc,
559  amrex::Array4<amrex::Real const> const& Ezg)
560 {
561  using namespace amrex;
562 
563  int jg = amrex::coarsen(j,2);
564  Real wx = (j == jg*2) ? 0.0 : 0.5;
565  Real owx = 1.0-wx;
566 
567  int kg = amrex::coarsen(k,2);
568  Real wy = (k == kg*2) ? 0.0 : 0.5;
569  Real owy = 1.0-wy;
570 
571 #if (AMREX_SPACEDIM == 2)
572 
573  // interp from coarse nodal to fine nodal
574  Real eg = owx * owy * Ezg(jg ,kg ,0)
575  + owx * wy * Ezg(jg ,kg+1,0)
576  + wx * owy * Ezg(jg+1,kg ,0)
577  + wx * wy * Ezg(jg+1,kg+1,0);
578 
579  // interp from coarse stagged to fine nodal
580  wy = 0.5-wy; owy = 1.0-wy;
581  Real ec = owx * owy * Ezc(jg ,kg ,0)
582  + owx * wy * Ezc(jg ,kg-1,0)
583  + wx * owy * Ezc(jg+1,kg ,0)
584  + wx * wy * Ezc(jg+1,kg-1,0);
585 
586  // interp from fine staggered to fine nodal
587  Real ef = 0.5*(Ezf(j,k-1,0) + Ezf(j,k,0));
588 
589 #else
590 
591  int lg = amrex::coarsen(l,2);
592  Real wz = (l == lg*2) ? 0.0 : 0.5;
593  Real owz = 1.0-wz;
594 
595  // interp from coarse nodal to fine nodal
596  Real eg = owx * owy * owz * Ezg(jg ,kg ,lg )
597  + wx * owy * owz * Ezg(jg+1,kg ,lg )
598  + owx * wy * owz * Ezg(jg ,kg+1,lg )
599  + wx * wy * owz * Ezg(jg+1,kg+1,lg )
600  + owx * owy * wz * Ezg(jg ,kg ,lg+1)
601  + wx * owy * wz * Ezg(jg+1,kg ,lg+1)
602  + owx * wy * wz * Ezg(jg ,kg+1,lg+1)
603  + wx * wy * wz * Ezg(jg+1,kg+1,lg+1);
604 
605  // interp from coarse staggered to fine nodal
606  wz = 0.5-wz; owz = 1.0-wz;
607  Real ec = owx * owy * owz * Ezc(jg ,kg ,lg )
608  + wx * owy * owz * Ezc(jg+1,kg ,lg )
609  + owx * wy * owz * Ezc(jg ,kg+1,lg )
610  + wx * wy * owz * Ezc(jg+1,kg+1,lg )
611  + owx * owy * wz * Ezc(jg ,kg ,lg-1)
612  + wx * owy * wz * Ezc(jg+1,kg ,lg-1)
613  + owx * wy * wz * Ezc(jg ,kg+1,lg-1)
614  + wx * wy * wz * Ezc(jg+1,kg+1,lg-1);
615 
616  // interp from fine staggered to fine nodal
617  Real ef = 0.5*(Ezf(j,k,l-1) + Ezf(j,k,l));
618 
619 #endif
620 
621  Eza(j,k,l) = eg + (ef-ec);
622 }
623 
624 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
625 void warpx_interp_nd_efield_x (int j, int k, int l,
626  amrex::Array4<amrex::Real> const& Exa,
627  amrex::Array4<amrex::Real const> const& Exf)
628 {
629  Exa(j,k,l) = 0.5*(Exf(j-1,k,l) + Exf(j,k,l));
630 }
631 
632 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
633 void warpx_interp_nd_efield_y (int j, int k, int l,
634  amrex::Array4<amrex::Real> const& Eya,
635  amrex::Array4<amrex::Real const> const& Eyf)
636 {
637 #if (AMREX_SPACEDIM == 2)
638  Eya(j,k,0) = Eyf(j,k,0);
639  amrex::ignore_unused(l);
640 #else
641  Eya(j,k,l) = 0.5*(Eyf(j,k-1,l) + Eyf(j,k,l));
642 #endif
643 }
644 
645 AMREX_GPU_DEVICE AMREX_FORCE_INLINE
646 void warpx_interp_nd_efield_z (int j, int k, int l,
647  amrex::Array4<amrex::Real> const& Eza,
648  amrex::Array4<amrex::Real const> const& Ezf)
649 {
650 #if (AMREX_SPACEDIM == 2)
651  Eza(j,k,0) = 0.5*(Ezf(j,k-1,0) + Ezf(j,k,0));
652  amrex::ignore_unused(l);
653 #else
654  Eza(j,k,l) = 0.5*(Ezf(j,k,l-1) + Ezf(j,k,l));
655 #endif
656 }
657 
658 #endif
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_efield_y(int j, int k, int l, amrex::Array4< amrex::Real > const &Eya, amrex::Array4< amrex::Real const > const &Eyf, amrex::Array4< amrex::Real const > const &Eyc)
Definition: WarpXComm_K.H:107
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_efield_y(int j, int k, int l, amrex::Array4< amrex::Real > const &Eya, amrex::Array4< amrex::Real const > const &Eyf, amrex::Array4< amrex::Real const > const &Eyc, amrex::Array4< amrex::Real const > const &Eyg)
Definition: WarpXComm_K.H:491
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_bfield_z(int j, int k, int l, amrex::Array4< amrex::Real > const &Bza, amrex::Array4< amrex::Real const > const &Bzf, amrex::Array4< amrex::Real const > const &Bzc)
Definition: WarpXComm_K.H:54
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_bfield_y(int j, int k, int l, amrex::Array4< amrex::Real > const &Bya, amrex::Array4< amrex::Real const > const &Byf, amrex::Array4< amrex::Real const > const &Byc)
Definition: WarpXComm_K.H:31
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_efield_x(int j, int k, int l, amrex::Array4< amrex::Real > const &Exa, amrex::Array4< amrex::Real const > const &Exf, amrex::Array4< amrex::Real const > const &Exc)
Definition: WarpXComm_K.H:79
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_bfield_x(int j, int k, int l, amrex::Array4< amrex::Real > const &Bxa, amrex::Array4< amrex::Real const > const &Bxf, amrex::Array4< amrex::Real const > const &Bxc)
Definition: WarpXComm_K.H:14
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_bfield_y(int j, int k, int l, amrex::Array4< amrex::Real > const &Bya, amrex::Array4< amrex::Real const > const &Byf, amrex::Array4< amrex::Real const > const &Byc, amrex::Array4< amrex::Real const > const &Byg)
Definition: WarpXComm_K.H:239
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_bfield_x(int j, int k, int l, amrex::Array4< amrex::Real > const &Bxa, amrex::Array4< amrex::Real const > const &Bxf, amrex::Array4< amrex::Real const > const &Bxc, amrex::Array4< amrex::Real const > const &Bxg)
Definition: WarpXComm_K.H:169
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_efield_x(int j, int k, int l, amrex::Array4< amrex::Real > const &Exa, amrex::Array4< amrex::Real const > const &Exf, amrex::Array4< amrex::Real const > const &Exc, amrex::Array4< amrex::Real const > const &Exg)
Definition: WarpXComm_K.H:421
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_efield_z(int j, int k, int l, amrex::Array4< amrex::Real > const &Eza, amrex::Array4< amrex::Real const > const &Ezf, amrex::Array4< amrex::Real const > const &Ezc)
Definition: WarpXComm_K.H:141
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_efield_z(int j, int k, int l, amrex::Array4< amrex::Real > const &Eza, amrex::Array4< amrex::Real const > const &Ezf, amrex::Array4< amrex::Real const > const &Ezc, amrex::Array4< amrex::Real const > const &Ezg)
Definition: WarpXComm_K.H:555
Definition: PML.H:52
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp_nd_bfield_z(int j, int k, int l, amrex::Array4< amrex::Real > const &Bza, amrex::Array4< amrex::Real const > const &Bzf, amrex::Array4< amrex::Real const > const &Bzc, amrex::Array4< amrex::Real const > const &Bzg)
Definition: WarpXComm_K.H:311