Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MFParallelForC.H
Go to the documentation of this file.
1#ifndef AMREX_MF_PARALLEL_FOR_C_H_
2#define AMREX_MF_PARALLEL_FOR_C_H_
3#include <AMReX_Config.H>
4
5#ifndef AMREX_USE_GPU
6
7#include <AMReX_Concepts.H>
8#include <AMReX_MFIter.H>
9
11namespace amrex::detail {
12
13template <FabArrayType MF, typename F>
14void ParallelFor_doit (MF const& mf, IntVect const& nghost, IntVect const& ts, bool dynamic, F const& f)
15{
16#ifdef AMREX_USE_OMP
17#pragma omp parallel
18#endif
19 for (MFIter mfi(mf,MFItInfo().EnableTiling(ts).SetDynamic(dynamic)); mfi.isValid(); ++mfi) {
20 Box const& bx = mfi.growntilebox(nghost);
21 int const lidx = mfi.LocalIndex();
22 const auto lo = amrex::lbound(bx);
23 const auto hi = amrex::ubound(bx);
24 for ( int k = lo.z; k <= hi.z; ++k) {
25 for ( int j = lo.y; j <= hi.y; ++j) {
27 for (int i = lo.x; i <= hi.x; ++i) {
28 f(lidx,i,j,k);
29 }
30 }
31 }
32 }
33}
34
35template <FabArrayType MF, typename F>
36void ParallelFor_doit (MF const& mf, IntVect const& nghost, int ncomp, IntVect const& ts, bool dynamic, F const& f)
37{
38#ifdef AMREX_USE_OMP
39#pragma omp parallel
40#endif
41 for (MFIter mfi(mf,MFItInfo().EnableTiling(ts).SetDynamic(dynamic)); mfi.isValid(); ++mfi) {
42 Box const& bx = mfi.growntilebox(nghost);
43 int const lidx = mfi.LocalIndex();
44 const auto lo = amrex::lbound(bx);
45 const auto hi = amrex::ubound(bx);
46 for (int n = 0; n < ncomp; ++n) {
47 for ( int k = lo.z; k <= hi.z; ++k) {
48 for ( int j = lo.y; j <= hi.y; ++j) {
50 for (int i = lo.x; i <= hi.x; ++i) {
51 f(lidx,i,j,k,n);
52 }
53 }
54 }
55 }
56 }
57}
58
59}
61
62#endif
63#endif
#define AMREX_PRAGMA_SIMD
Definition AMReX_Extension.H:80
__host__ __device__ Dim3 ubound(Array4< T > const &a) noexcept
Return the inclusive upper bounds of an Array4 in Dim3 form.
Definition AMReX_Array4.H:1359
__host__ __device__ Dim3 lbound(Array4< T > const &a) noexcept
Return the inclusive lower bounds of an Array4 in Dim3 form.
Definition AMReX_Array4.H:1345
BoxND< 3 > Box
Box is an alias for amrex::BoxND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:30
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33