3#include <AMReX_Config.H>
12namespace loop_detail {
16 template <
typename F, std::size_t...Ns,
class...Args>
18 auto call_f_intvect_inner (std::index_sequence<Ns...>, F
const& f, IntVectND<1> iv, Args...args)
19 noexcept -> decltype(f(0, 0, 0, args...))
21 f(iv[0], 0, 0, args...);
24 template <
typename F, std::size_t...Ns,
class...Args>
26 auto call_f_intvect_inner (std::index_sequence<Ns...>, F
const& f, IntVectND<2> iv, Args...args)
27 noexcept -> decltype(f(0, 0, 0, args...))
29 f(iv[0], iv[1], 0, args...);
32 template <
typename F,
int dim, std::size_t...Ns,
class...Args>
34 auto call_f_intvect_inner (std::index_sequence<Ns...>, F
const& f, IntVectND<dim> iv, Args...args)
35 noexcept -> decltype(f(iv, args...))
40 template <
typename F,
int dim, std::size_t...Ns,
class...Args>
42 auto call_f_intvect_inner (std::index_sequence<Ns...>, F
const& f, IntVectND<dim> iv, Args...args)
43 noexcept -> decltype(f(iv[Ns]..., args...))
45 f(iv[Ns]..., args...);
50 template <
typename F,
int dim>
52 auto call_f_intvect (F
const& f, IntVectND<dim> iv)
53 noexcept ->
decltype(call_f_intvect_inner(std::make_index_sequence<dim>(), f, iv))
55 call_f_intvect_inner(std::make_index_sequence<dim>(), f, iv);
60 template <
typename F,
int dim>
62 auto call_f_intvect_ncomp (F
const& f, IntVectND<dim> iv,
int n)
63 noexcept ->
decltype(call_f_intvect_inner(std::make_index_sequence<dim>(), f, iv, 0))
65 call_f_intvect_inner(std::make_index_sequence<dim>(), f, iv, n);
70 template <
typename F, std::size_t...Ns,
class...Args>
72 auto call_f_intvect_inner_cpu (std::index_sequence<Ns...>, F
const& f, IntVectND<1> iv, Args...args)
73 noexcept -> decltype(f(0, 0, 0, args...))
75 f(iv[0], 0, 0, args...);
78 template <
typename F, std::size_t...Ns,
class...Args>
80 auto call_f_intvect_inner_cpu (std::index_sequence<Ns...>, F
const& f, IntVectND<2> iv, Args...args)
81 noexcept -> decltype(f(0, 0, 0, args...))
83 f(iv[0], iv[1], 0, args...);
86 template <
typename F,
int dim, std::size_t...Ns,
class...Args>
88 auto call_f_intvect_inner_cpu (std::index_sequence<Ns...>, F
const& f, IntVectND<dim> iv, Args...args)
89 noexcept -> decltype(f(iv, args...))
94 template <
typename F,
int dim, std::size_t...Ns,
class...Args>
96 auto call_f_intvect_inner_cpu (std::index_sequence<Ns...>, F
const& f, IntVectND<dim> iv, Args...args)
97 noexcept -> decltype(f(iv[Ns]..., args...))
99 f(iv[Ns]..., args...);
104 template <
typename F,
int dim>
106 auto call_f_intvect_cpu (F
const& f, IntVectND<dim> iv)
107 noexcept ->
decltype(call_f_intvect_inner_cpu(std::make_index_sequence<dim>(), f, iv))
109 call_f_intvect_inner_cpu(std::make_index_sequence<dim>(), f, iv);
114 template <
typename F,
int dim>
116 auto call_f_intvect_ncomp_cpu (F
const& f, IntVectND<dim> iv,
int n)
117 noexcept ->
decltype(call_f_intvect_inner_cpu(std::make_index_sequence<dim>(), f, iv, 0))
119 call_f_intvect_inner_cpu(std::make_index_sequence<dim>(), f, iv, n);
129 for (
int k = lo.z; k <= hi.z; ++k) {
130 for (
int j = lo.y; j <= hi.y; ++j) {
131 for (
int i = lo.x; i <= hi.x; ++i) {
141 for (
int n = 0; n < ncomp; ++n) {
142 for (
int k = lo.z; k <= hi.z; ++k) {
143 for (
int j = lo.y; j <= hi.y; ++j) {
144 for (
int i = lo.x; i <= hi.x; ++i) {
154 for (
int k = lo.z; k <= hi.z; ++k) {
155 for (
int j = lo.y; j <= hi.y; ++j) {
157 for (
int i = lo.x; i <= hi.x; ++i) {
167 for (
int n = 0; n < ncomp; ++n) {
168 for (
int k = lo.z; k <= hi.z; ++k) {
169 for (
int j = lo.y; j <= hi.y; ++j) {
171 for (
int i = lo.x; i <= hi.x; ++i) {
177namespace loop_detail {
179template <
int idim,
typename L,
int dim>
181void Loop_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv)
noexcept
183 if constexpr (idim == 1) {
184 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
185 call_f_intvect(f,iv);
187 }
else if constexpr (idim == 2) {
188 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
189 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
190 call_f_intvect(f,iv);
192 }
else if constexpr (idim == 3) {
193 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
194 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
195 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
196 call_f_intvect(f,iv);
199 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
200 Loop_impND<idim-1>(f, lo, hi, iv);
208template <
class F,
int dim>
216 loop_detail::Loop_impND<dim>(f, lo, hi, iv);
220namespace loop_detail {
222template <
int idim,
typename L,
int dim>
224void Loop_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv,
int n)
noexcept
226 if constexpr (idim == 1) {
227 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
228 call_f_intvect_ncomp(f,iv,n);
230 }
else if constexpr (idim == 2) {
231 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
232 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
233 call_f_intvect_ncomp(f,iv,n);
235 }
else if constexpr (idim == 3) {
236 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
237 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
238 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
239 call_f_intvect_ncomp(f,iv,n);
242 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
243 Loop_impND<idim-1>(f, lo, hi, iv, n);
251template <
class F,
int dim>
259 for (
int n = 0; n < ncomp; ++n) {
260 loop_detail::Loop_impND<dim>(f, lo, hi, iv, n);
265namespace loop_detail {
267template <
int idim,
typename L,
int dim>
269void LoopConcurrent_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv)
noexcept
271 if constexpr (idim == 1) {
273 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
274 call_f_intvect(f,iv);
276 }
else if constexpr (idim == 2) {
277 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
279 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
280 call_f_intvect(f,iv);
282 }
else if constexpr (idim == 3) {
283 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
284 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
286 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
287 call_f_intvect(f,iv);
290 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
291 LoopConcurrent_impND<idim-1>(f, lo, hi, iv);
299template <
class F,
int dim>
307 loop_detail::LoopConcurrent_impND<dim>(f, lo, hi, iv);
311namespace loop_detail {
313template <
int idim,
typename L,
int dim>
315void LoopConcurrent_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv,
int n)
noexcept
317 if constexpr (idim == 1) {
319 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
320 call_f_intvect_ncomp(f,iv,n);
322 }
else if constexpr (idim == 2) {
323 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
325 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
326 call_f_intvect_ncomp(f,iv,n);
328 }
else if constexpr (idim == 3) {
329 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
330 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
332 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
333 call_f_intvect_ncomp(f,iv,n);
336 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
337 LoopConcurrent_impND<idim-1>(f, lo, hi, iv, n);
345template <
class F,
int dim>
353 for (
int n = 0; n < ncomp; ++n) {
354 loop_detail::LoopConcurrent_impND<dim>(f, lo, hi, iv, n);
367 for (
int k = lo.z; k <= hi.z; ++k) {
368 for (
int j = lo.y; j <= hi.y; ++j) {
369 for (
int i = lo.x; i <= hi.x; ++i) {
378 for (
int n = 0; n < ncomp; ++n) {
379 for (
int k = lo.z; k <= hi.z; ++k) {
380 for (
int j = lo.y; j <= hi.y; ++j) {
381 for (
int i = lo.x; i <= hi.x; ++i) {
390 for (
int k = lo.z; k <= hi.z; ++k) {
391 for (
int j = lo.y; j <= hi.y; ++j) {
393 for (
int i = lo.x; i <= hi.x; ++i) {
402 for (
int n = 0; n < ncomp; ++n) {
403 for (
int k = lo.z; k <= hi.z; ++k) {
404 for (
int j = lo.y; j <= hi.y; ++j) {
406 for (
int i = lo.x; i <= hi.x; ++i) {
412namespace loop_detail {
414template <
int idim,
typename L,
int dim>
416void LoopOnCpu_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv)
noexcept
418 if constexpr (idim == 1) {
419 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
420 call_f_intvect_cpu(f,iv);
422 }
else if constexpr (idim == 2) {
423 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
424 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
425 call_f_intvect_cpu(f,iv);
427 }
else if constexpr (idim == 3) {
428 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
429 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
430 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
431 call_f_intvect_cpu(f,iv);
434 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
435 LoopOnCpu_impND<idim-1>(f, lo, hi, iv);
443template <
class F,
int dim>
450 loop_detail::LoopOnCpu_impND<dim>(f, lo, hi, iv);
454namespace loop_detail {
456template <
int idim,
typename L,
int dim>
458void LoopOnCpu_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv,
int n)
noexcept
460 if constexpr (idim == 1) {
461 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
462 call_f_intvect_ncomp_cpu(f,iv,n);
464 }
else if constexpr (idim == 2) {
465 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
466 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
467 call_f_intvect_ncomp_cpu(f,iv,n);
469 }
else if constexpr (idim == 3) {
470 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
471 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
472 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
473 call_f_intvect_ncomp_cpu(f,iv,n);
476 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
477 LoopOnCpu_impND<idim-1>(f, lo, hi, iv, n);
485template <
class F,
int dim>
492 for (
int n = 0; n < ncomp; ++n) {
493 loop_detail::LoopOnCpu_impND<dim>(f, lo, hi, iv, n);
498namespace loop_detail {
500template <
int idim,
typename L,
int dim>
502void LoopConcurrentOnCpu_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv)
noexcept
504 if constexpr (idim == 1) {
506 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
507 call_f_intvect_cpu(f,iv);
509 }
else if constexpr (idim == 2) {
510 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
512 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
513 call_f_intvect_cpu(f,iv);
515 }
else if constexpr (idim == 3) {
516 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
517 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
519 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
520 call_f_intvect_cpu(f,iv);
523 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
524 LoopConcurrentOnCpu_impND<idim-1>(f, lo, hi, iv);
532template <
class F,
int dim>
539 loop_detail::LoopConcurrentOnCpu_impND<dim>(f, lo, hi, iv);
543namespace loop_detail {
545template <
int idim,
typename L,
int dim>
547void LoopConcurrentOnCpu_impND (L
const& f, IntVectND<dim>
const lo, IntVectND<dim>
const hi, IntVectND<dim> iv,
int n)
noexcept
549 if constexpr (idim == 1) {
551 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
552 call_f_intvect_ncomp_cpu(f,iv,n);
554 }
else if constexpr (idim == 2) {
555 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
557 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
558 call_f_intvect_ncomp_cpu(f,iv,n);
560 }
else if constexpr (idim == 3) {
561 for (
int i2 = lo[2], h2 = hi[2]; i2 <= h2; ++i2) { iv[2] = i2;
562 for (
int i1 = lo[1], h1 = hi[1]; i1 <= h1; ++i1) { iv[1] = i1;
564 for (
int i0 = lo[0], h0 = hi[0]; i0 <= h0; ++i0) { iv[0] = i0;
565 call_f_intvect_ncomp_cpu(f,iv,n);
568 for (
int id = lo[idim-1], hd = hi[idim-1];
id <= hd; ++id) { iv[idim-1] = id;
569 LoopConcurrentOnCpu_impND<idim-1>(f, lo, hi, iv, n);
577template <
class F,
int dim>
584 for (
int n = 0; n < ncomp; ++n) {
585 loop_detail::LoopConcurrentOnCpu_impND<dim>(f, lo, hi, iv, n);
#define AMREX_PRAGMA_SIMD
Definition AMReX_Extension.H:80
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_ATTRIBUTE_FLATTEN_FOR
Definition AMReX_Extension.H:151
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
A Rectangular Domain on an Integer Lattice.
Definition AMReX_Box.H:49
An Integer Vector in dim-Dimensional Space.
Definition AMReX_IntVect.H:57
Definition AMReX_Amr.cpp:49
__host__ __device__ IntVectND< dim > lbound_iv(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:1905
__host__ __device__ IntVectND< dim > ubound_iv(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:1914
void LoopConcurrentOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:388
__host__ __device__ void Loop(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:127
void LoopOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:365
__host__ __device__ void LoopConcurrent(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:152
Definition AMReX_Dim3.H:12