11#ifndef IPPL_FIELD_BUFFER_OPS_HPP
12#define IPPL_FIELD_BUFFER_OPS_HPP
28 template <
int tensorRank,
typename View,
unsigned Dim>
31 template <
typename View,
unsigned Dim>
34 KOKKOS_INLINE_FUNCTION
constexpr static auto&
get(View&& view,
unsigned dim1,
36 const index_array_type& args) {
37 return apply(view, args)[dim1][dim2];
41 template <
typename View,
unsigned Dim>
44 KOKKOS_INLINE_FUNCTION
constexpr static auto&
get(View&& view,
unsigned dim1,
45 [[maybe_unused]]
unsigned dim2,
46 const index_array_type& args) {
47 return apply(view, args)[dim1];
51 template <
typename View,
unsigned Dim>
54 KOKKOS_INLINE_FUNCTION
constexpr static auto&
get(View&& view,
55 [[maybe_unused]]
unsigned dim1,
56 [[maybe_unused]]
unsigned dim2,
57 const index_array_type& args) {
58 return apply(view, args);
65 template <
typename Tb,
typename View,
unsigned Dim>
69 ippl::mpi::Communicator::size_type& nsends) {
72 Kokkos::View<Tb*>& buffer = fd.buffer;
74 size_t size = intersect.
size();
76 if (buffer.size() < size) {
77 const int overalloc = ippl::Comm->getDefaultOverallocation();
78 Kokkos::realloc(buffer, size * overalloc);
81 using index_type =
typename ippl::RangePolicy<Dim>::index_type;
82 Kokkos::Array<index_type, Dim> first, last;
83 for (
unsigned d = 0; d < Dim; ++d) {
84 first[d] = intersect[d].first() - ldom[d].first() + nghost;
85 last[d] = intersect[d].last() - ldom[d].first() + nghost + 1;
89 KOKKOS_LAMBDA(
const index_array_type& args) {
91 for (
unsigned d = 0; d < Dim; ++d) {
96 for (
unsigned d = 1; d < Dim; ++d) {
98 for (
unsigned d1 = 0; d1 < d; ++d1) {
99 factor *= intersect[d1].length();
101 l += igVec[d] * factor;
104 Kokkos::complex<Tb> val =
apply(view, args);
105 buffer(l) = Kokkos::real(val);
113 template <
typename Tb,
typename View,
unsigned Dim>
117 ippl::mpi::Communicator::size_type& nsends) {
120 Kokkos::View<Tb*>& buffer = fd.buffer;
122 size_t size = intersect.
size();
124 if (buffer.size() < size) {
125 const int overalloc = ippl::Comm->getDefaultOverallocation();
126 Kokkos::realloc(buffer, size * overalloc);
129 using index_type =
typename ippl::RangePolicy<Dim>::index_type;
130 Kokkos::Array<index_type, Dim> first, last;
131 for (
unsigned d = 0; d < Dim; ++d) {
132 first[d] = intersect[d].first() - ldom[d].first() + nghost;
133 last[d] = intersect[d].last() - ldom[d].first() + nghost + 1;
137 KOKKOS_LAMBDA(
const index_array_type& args) {
139 for (
unsigned d = 0; d < Dim; ++d) {
140 igVec[d] -= first[d];
144 for (
unsigned d = 1; d < Dim; ++d) {
146 for (
unsigned d1 = 0; d1 < d; ++d1) {
147 factor *= intersect[d1].length();
149 l += igVec[d] * factor;
151 buffer(l) =
apply(view, args);
161 template <
int tensorRank,
typename Tb,
typename View,
unsigned Dim>
167 size_t dim1 = 0,
size_t dim2 = 0) {
170 Kokkos::View<Tb*>& buffer = fd.buffer;
172 using index_type =
typename ippl::RangePolicy<Dim>::index_type;
173 Kokkos::Array<index_type, Dim> first, last;
174 for (
unsigned d = 0; d < Dim; ++d) {
175 first[d] = intersect[d].first() - ldom[d].first() + nghost;
176 last[d] = intersect[d].last() - ldom[d].first() + nghost + 1;
179 ippl::parallel_for(
"ippl::detail::unpack_impl()",
181 KOKKOS_LAMBDA(
const index_array_type& args) {
183 for (
unsigned d = 0; d < Dim; ++d) {
184 igVec[d] -= first[d];
188 for (
unsigned d = 0; d < Dim; ++d) {
189 igVec[d] = coordBool[d]
190 * (intersect[d].length() - 2 * igVec[d] - 1)
195 for (
unsigned d = 1; d < Dim; ++d) {
197 for (
unsigned d1 = 0; d1 < d; ++d1) {
198 factor *= intersect[d1].length();
200 l += igVec[d] * factor;
204 dim1, dim2, args) = buffer(l);
209 template <
typename Tb,
typename View,
unsigned Dim>
214 unpack_impl<0, Tb, View, Dim>(intersect, view, fd, nghost, ldom, coordBool);
217 template <
typename Tb,
typename View,
unsigned Dim>
219 const View& view,
size_t dim1,
223 unpack_impl<1, Tb, View, Dim>(intersect, view, fd, nghost, ldom, coordBool,
227 template <
typename Tb,
typename View,
unsigned Dim>
231 size_t dim1,
size_t dim2,
233 unpack_impl<2, Tb, View, Dim>(intersect, view, fd, nghost, ldom, coordBool,
240 template <
typename Tb,
typename View,
unsigned Dim>
241 inline void solver_send(
int TAG,
int id,
int i,
const ippl::NDIndex<Dim> intersection,
244 std::vector<MPI_Request>& requests) {
245 using memory_space =
typename View::memory_space;
247 requests.resize(requests.size() + 1);
249 ippl::mpi::Communicator::size_type nsends;
250 pack(intersection, view, fd, nghost, ldom, nsends);
252 ippl::mpi::Communicator::buffer_type<memory_space> buf =
253 ippl::Comm->getBuffer<memory_space, Tb>(nsends);
257 ippl::Comm->isend(i, tag, fd, *buf, requests.back(), nsends);
258 buf->resetWritePos();
261 template <
typename Tb,
typename View,
unsigned Dim>
262 inline void solver_recv(
int TAG,
int id,
int i,
const ippl::NDIndex<Dim> intersection,
266 using memory_space =
typename View::memory_space;
268 ippl::mpi::Communicator::size_type nrecvs;
269 nrecvs = intersection.
size();
271 ippl::mpi::Communicator::buffer_type<memory_space> buf =
272 ippl::Comm->getBuffer<memory_space, Tb>(nrecvs);
276 ippl::Comm->recv(i, tag, fd, *buf, nrecvs *
sizeof(Tb), nrecvs);
279 unpack(intersection, view, fd, nghost, ldom, coordBool);
284 template <
typename Tb,
typename View,
unsigned Dim>
285 inline void solver_send_field(
int TAG,
int id,
int i,
290 std::vector<MPI_Request>& requests) {
291 using memory_space =
typename View::memory_space;
293 requests.resize(requests.size() + 1);
295 ippl::mpi::Communicator::size_type nsends;
296 pack_field(intersection, view, fd, nghost, ldom, nsends);
298 ippl::mpi::Communicator::buffer_type<memory_space> buf =
299 ippl::Comm->getBuffer<memory_space, Tb>(nsends);
303 ippl::Comm->isend(i, tag, fd, *buf, requests.back(), nsends);
304 buf->resetWritePos();
KOKKOS_INLINE_FUNCTION unsigned size() const noexcept
Definition NDIndex.hpp:32
KOKKOS_INLINE_FUNCTION constexpr decltype(auto) apply(const View &view, const Coords &coords)
Definition IpplOperations.h:64
RangePolicy< Dim, PolicyArgs... >::policy_type createRangePolicy(const Kokkos::Array< typename RangePolicy< Dim, PolicyArgs... >::index_type, Dim > &begin, const Kokkos::Array< typename RangePolicy< Dim, PolicyArgs... >::index_type, Dim > &end)
Definition ParallelDispatch.h:88
KOKKOS_INLINE_FUNCTION auto & get(Tuple< Ts... > &t)
Accessor function to get an element mutable reference at a specific index from a Tuple.
Definition Tuple.h:314
Definition HaloCells.h:23
Definition FieldBufferOps.hpp:29