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]);
41 for (
int i = 0; i < N_locs; ++i)
45 loc_copy_tags[tag.
dstIndex].push_back
53 for (
MFIter mfi(*
this); mfi.isValid(); ++mfi)
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();
62 Dim3 offset = tag.offset.dim3();
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();
75 Dim3 offset = tag.offset.dim3();
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,
94 auto const N_locs =
static_cast<int>(thecpc.
m_LocTags->size());
95 if (N_locs == 0) {
return; }
103 loc_copy_tags.reserve(N_locs);
116 masks.reserve(N_locs);
120 for (
int i = 0; i < N_locs; ++i)
125 loc_copy_tags.push_back(
132 if (maskfabs.
size() > 0) {
133 if (!maskfabs[li].isAllocated()) {
135 masks_unique.emplace_back(
Array4Tag<int>{.dfab = maskfabs[li].array()});
142 if (maskfabs.
size() > 0) {
152 if (is_thread_safe) {
153 detail::fab_to_fab<value_type, value_type>(loc_copy_tags, scomp,
154 dcomp, ncomp, detail::CellStore<value_type, value_type>());
156 detail::fab_to_fab_atomic_cpy<value_type, value_type>(
157 loc_copy_tags, scomp, dcomp, ncomp, masks);
162 if (is_thread_safe) {
165 detail::fab_to_fab<value_type, value_type>(loc_copy_tags, scomp,
166 dcomp, ncomp, detail::CellAdd<value_type, value_type>());
167 }
else if (deterministic) {
171 detail::deterministic_fab_to_fab<value_type, value_type>(
172 loc_copy_tags, scomp, dcomp, ncomp, detail::CellAdd<value_type, value_type>());
174 detail::fab_to_fab_atomic_add<value_type, value_type>(
175 loc_copy_tags, scomp, dcomp, ncomp, masks);
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
__host__ __device__ const IntVectND< dim > & smallEnd() const &noexcept
Return the inclusive lower bound of the box.
Definition AMReX_Box.H:124
friend class MFIter
Definition AMReX_FabArrayBase.H:48
int localindex(int K) const noexcept
Return local index in the vector of FABs.
Definition AMReX_FabArrayBase.H:124
int local_size() const noexcept
Return the number of local FABs in the FabArray.
Definition AMReX_FabArrayBase.H:118
CpOp
parallel copy or add
Definition AMReX_FabArrayBase.H:424
@ ADD
Definition AMReX_FabArrayBase.H:424
@ COPY
Definition AMReX_FabArrayBase.H:424
Box box(int K) const noexcept
Return the Kth Box in the BoxArray. That is, the valid region of the Kth grid.
Definition AMReX_FabArrayBase.H:106
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 copy(const FabArray< FAB > &src, const Periodicity &period=Periodicity::NonPeriodic(), CpOp op=FabArrayBase::COPY)
Definition AMReX_FabArray.H:977
const Vector< std::string > & tags() const noexcept
Memory-usage tags recorded for this FabArray's allocations.
Definition AMReX_FabArray.H:488
FabArray() noexcept
Constructs an empty FabArray<FAB>.
Definition AMReX_FabArray.H:2318
void plus(value_type val, int comp, int num_comp, int nghost=0)
Definition AMReX_FabArray.H:3173
Array4< typename FabArray< FAB >::value_type const > array(const MFIter &mfi) const noexcept
Read-only Array4 view for the FAB referenced by iterator mfi.
Definition AMReX_FabArray.H:621
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:2065
FAB & atLocalIdx(int L) noexcept
Return a reference to the FAB associated with local index L.
Definition AMReX_FabArray.H:579
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
Long size() const noexcept
Definition AMReX_Vector.H:54
Definition AMReX_Amr.cpp:50
BoxArray const & boxArray(FabArrayBase const &fa)
Convenience wrapper that forwards to fa.boxArray().
Definition AMReX_FabArrayBase.cpp:2990
DistributionMapping const & DistributionMap(FabArrayBase const &fa)
Convenience wrapper that forwards to fa.DistributionMap().
Definition AMReX_FabArrayBase.cpp:2995
void ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:202
void LoopConcurrentOnCpu(Dim3 lo, Dim3 hi, F const &f) noexcept
Definition AMReX_Loop.H:388
__host__ __device__ constexpr int get(IntVectND< dim > const &iv) noexcept
Get the Idx-th element of IntVectND<dim>.
Definition AMReX_IntVect.H:1360
Definition AMReX_TagParallelFor.H:26
Definition AMReX_TagParallelFor.H:50
Array4< T > dfab
Definition AMReX_TagParallelFor.H:51
A simple struct holding 3 int values for a 3D index.
Definition AMReX_Dim3.H:24
parallel copy or add
Definition AMReX_FabArrayBase.H:643
Used by a bunch of routines when communicating via MPI.
Definition AMReX_FabArrayBase.H:211
Box sbox
Definition AMReX_FabArrayBase.H:213
int srcIndex
Definition AMReX_FabArrayBase.H:215
Box dbox
Definition AMReX_FabArrayBase.H:212
int dstIndex
Definition AMReX_FabArrayBase.H:214
Definition AMReX_TypeTraits.H:277