24#if defined(ESPRESSO_P3M) or defined(ESPRESSO_DP3M)
34#include <boost/mpi/communicator.hpp>
35#include <boost/mpi/datatype.hpp>
48 boost::mpi::communicator
const &comm,
int tag) {
49 auto const type = boost::mpi::get_mpi_datatype<T>(*
sendbuf);
64template <
typename FloatType>
66 int const start[3],
int const size[3],
75 li_out = start[2] + (dim[2] * (start[1] + (dim[1] * start[0])));
79 for (s = 0; s < size[0]; s++) {
80 for (m = 0; m < size[1]; m++) {
81 for (f = 0; f < size[2]; f++) {
90template <
typename FloatType>
93 int done[3] = {0, 0, 0};
95 for (
int i = 0; i < 3; i++) {
96 for (
int j = 0;
j < 3;
j++) {
100 s_ur[i * 2][
j] = local_mesh.
margin[
j * 2];
106 s_ld[(i * 2) + 1][
j] = local_mesh.
in_ur[
j];
108 s_ld[(i * 2) + 1][
j] = 0 +
done[
j] * local_mesh.
margin[
j * 2];
109 s_ur[(i * 2) + 1][
j] =
115 for (
int i = 0; i < 6; i++) {
117 for (
int j = 0;
j < 3;
j++) {
118 s_dim[i][
j] = s_ur[i][
j] - s_ld[i][
j];
119 s_size[i] *= s_dim[i][
j];
121 max = std::max(max, s_size[i]);
127 for (
int i = 0; i < 6; i++) {
128 auto const j = (i % 2 == 0) ? i + 1 : i - 1;
134 r_margin[
j] = local_mesh.
margin[i];
138 for (
int i = 0; i < 3; i++) {
139 for (
int j = 0;
j < 3;
j++) {
141 r_ld[i * 2][
j] = s_ld[i * 2][
j] + local_mesh.
margin[2 *
j];
142 r_ur[i * 2][
j] = s_ur[i * 2][
j] + r_margin[2 *
j];
143 r_ld[(i * 2) + 1][
j] = s_ld[(i * 2) + 1][
j] - r_margin[(2 *
j) + 1];
144 r_ur[(i * 2) + 1][
j] =
145 s_ur[(i * 2) + 1][
j] - local_mesh.
margin[(2 *
j) + 1];
147 r_ld[i * 2][
j] = s_ld[i * 2][
j];
148 r_ur[i * 2][
j] = s_ur[i * 2][
j];
149 r_ld[(i * 2) + 1][
j] = s_ld[(i * 2) + 1][
j];
150 r_ur[(i * 2) + 1][
j] = s_ur[(i * 2) + 1][
j];
154 for (
int i = 0; i < 6; i++) {
156 for (
int j = 0;
j < 3;
j++) {
157 r_dim[i][
j] = r_ur[i][
j] - r_ld[i][
j];
158 r_size[i] *= r_dim[i][
j];
160 max = std::max(max, r_size[i]);
164template <
typename FloatType>
166 std::span<FloatType *>
meshes,
169 send_grid.resize(max *
meshes.size());
170 recv_grid.resize(max *
meshes.size());
177 if (s_size[
s_dir] > 0) {
178 for (std::size_t i = 0; i <
meshes.size(); i++) {
186 auto const send_size =
static_cast<int>(
meshes.size()) * s_size[
s_dir];
187 auto const recv_size =
static_cast<int>(
meshes.size()) * r_size[
r_dir];
192 std::swap(send_grid, recv_grid);
195 if (r_size[
r_dir] > 0) {
196 for (std::size_t i = 0; i <
meshes.size(); i++) {
204template <
typename FloatType>
206 std::span<FloatType *>
meshes,
209 send_grid.resize(max *
meshes.size());
210 recv_grid.resize(max *
meshes.size());
217 if (r_size[
r_dir] > 0) {
218 for (std::size_t i = 0; i <
meshes.size(); i++) {
225 auto const send_size =
static_cast<int>(
meshes.size()) * r_size[
r_dir];
226 auto const recv_size =
static_cast<int>(
meshes.size()) * s_size[
s_dir];
231 std::swap(send_grid, recv_grid);
234 if (s_size[
s_dir] > 0) {
235 for (std::size_t i = 0; i <
meshes.size(); i++) {
Vector implementation and trait types for boost qvm interoperability.
DEVICE_QUALIFIER constexpr pointer data() noexcept
void gather_grid(boost::mpi::communicator const &comm, std::span< FloatType * > meshes, Utils::Vector3i const &dim)
void spread_grid(boost::mpi::communicator const &comm, std::span< FloatType * > meshes, Utils::Vector3i const &dim)
void resize(boost::mpi::communicator const &comm, P3MLocalMesh const &local_mesh)
cudaStream_t stream[1]
CUDA streams for parallel computing on CPU and GPU.
Routines, row decomposition, data structures and communication for the 3D-FFT.
Common functions for dipolar and charge P3M.
void fft_pack_block(FloatType const *const in, FloatType *const out, int const *start, int const *size, int const *dim, int element)
Pack a 3D-block of size size starting at start of an input 3D-grid in with dimension dim into an outp...
void fft_unpack_block(FloatType const *const in, FloatType *const out, int const *start, int const *size, int const *dim, int element)
Unpack a 3D-block in of size size into an output 3D-grid out of size dim starting at position start.
static void p3m_add_block(FloatType const *in, FloatType *out, int const start[3], int const size[3], int const dim[3])
Add values of a 3d-grid input block (size[3]) to values of 3d-grid output array with dimension dim[3]...
static void mesh_sendrecv(T const *const sendbuf, int scount, int dest, T *const recvbuf, int rcount, int source, boost::mpi::communicator const &comm, int tag)
Properties of the local mesh.
Utils::Vector3i dim
dimension (size) of local mesh including halo layers.
int margin[6]
number of margin mesh points.
Utils::Vector3i in_ur
inner up right grid point + (1,1,1)