9 int scomp,
int dcomp,
int ncomp,
CpOp op)
11 auto const N_locs =
static_cast<int>(thecpc.
m_LocTags->size());
12 if (N_locs == 0) {
return; }
18#pragma omp parallel for
20 for (
int i = 0; i < N_locs; ++i)
25 const FAB* sfab = &(src[tag.
srcIndex]);
29 dfab->template copy<RunOn::Host>(*sfab, tag.
sbox, scomp, tag.
dbox, dcomp, ncomp);
33 dfab->template plus<RunOn::Host>(*sfab, tag.
sbox, tag.
dbox, scomp, dcomp, ncomp);
41 for (
int i = 0; i < N_locs; ++i)
45 loc_copy_tags[tag.
dstIndex].push_back
55 const auto& tags = loc_copy_tags[mfi];
56 auto dfab = this->array(mfi);
59 for (
auto const & tag : tags)
61 auto const sfab = tag.sfab->array();
64 [=] (
int i,
int j,
int k,
int n)
noexcept
66 dfab(i,j,k,dcomp+n) = sfab(i+offset.x,j+offset.y,k+offset.z,scomp+n);
72 for (
auto const & tag : tags)
74 auto const sfab = tag.sfab->array();
77 [=] (
int i,
int j,
int k,
int n)
noexcept
79 dfab(i,j,k,dcomp+n) += sfab(i+offset.x,j+offset.y,k+offset.z,scomp+n);
91 int scomp,
int dcomp,
int ncomp,
CpOp op,
95 if (N_locs == 0) {
return; }
100 loc_copy_tags.reserve(N_locs);
105 if (!is_thread_safe && !deterministic)
110 maskfabs.resize(this->local_size());
111 masks_unique.reserve(this->local_size());
112 masks.reserve(N_locs);
116 for (
int i = 0; i < N_locs; ++i)
120 int li = this->localindex(tag.
dstIndex);
121 loc_copy_tags.push_back
122 ({this->atLocalIdx(li).array(), tag.
dstIndex,
127 if (maskfabs.
size() > 0) {
128 if (!maskfabs[li].isAllocated()) {
129 maskfabs[li].resize(this->atLocalIdx(li).box());
137 if (maskfabs.
size() > 0) {
147 if (is_thread_safe) {
148 detail::fab_to_fab<value_type, value_type>(loc_copy_tags, scomp,
149 dcomp, ncomp, detail::CellStore<value_type, value_type>());
151 detail::fab_to_fab_atomic_cpy<value_type, value_type>(
152 loc_copy_tags, scomp, dcomp, ncomp, masks);
161 detail::deterministic_fab_to_fab<value_type, value_type>(
162 loc_copy_tags, scomp, dcomp, ncomp, detail::CellAdd<value_type, value_type>());
163 }
else if (is_thread_safe) {
164 detail::fab_to_fab<value_type, value_type>(loc_copy_tags, scomp,
165 dcomp, ncomp, detail::CellAdd<value_type, value_type>());
167 detail::fab_to_fab_atomic_add<value_type, value_type>(
168 loc_copy_tags, scomp, dcomp, ncomp, masks);
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1089
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:111
CpOp
parallel copy or add
Definition AMReX_FabArrayBase.H:394
@ ADD
Definition AMReX_FabArrayBase.H:394
@ COPY
Definition AMReX_FabArrayBase.H:394
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:347
void PC_local_cpu(const CPC &thecpc, FabArray< FAB > const &src, int scomp, int dcomp, int ncomp, CpOp op)
Definition AMReX_PCI.H:8
void PC_local_gpu(const CPC &thecpc, FabArray< FAB > const &src, int scomp, int dcomp, int ncomp, CpOp op, bool deterministic)
Definition AMReX_PCI.H:90
FAB * fabPtr(const MFIter &mfi) noexcept
Return pointer to FAB.
Definition AMReX_FabArray.H:1770
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:85
bool isValid() const noexcept
Is the iterator valid i.e. is it associated with a FAB?
Definition AMReX_MFIter.H:169
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Long size() const noexcept
Definition AMReX_Vector.H:53
Definition AMReX_Amr.cpp:49
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:193
DistributionMapping const & DistributionMap(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2869
void LoopConcurrentOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:388
BoxArray const & boxArray(FabArrayBase const &fa)
Definition AMReX_FabArrayBase.cpp:2864
__host__ __device__ constexpr int get(IntVectND< dim > const &iv) noexcept
Get I'th element of IntVectND<dim>
Definition AMReX_IntVect.H:1230
Definition AMReX_TagParallelFor.H:26
Definition AMReX_TagParallelFor.H:50
Array4< T > dfab
Definition AMReX_TagParallelFor.H:51
Definition AMReX_Dim3.H:12
parallel copy or add
Definition AMReX_FabArrayBase.H:538
Used by a bunch of routines when communicating via MPI.
Definition AMReX_FabArrayBase.H:195
Box sbox
Definition AMReX_FabArrayBase.H:197
int srcIndex
Definition AMReX_FabArrayBase.H:199
Box dbox
Definition AMReX_FabArrayBase.H:196
int dstIndex
Definition AMReX_FabArrayBase.H:198
Definition AMReX_TypeTraits.H:297