WarpX
ParticleMoments.H
Go to the documentation of this file.
1 /* Copyright 2021 Axel Huebl, Remi Lehe
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef ABLASTR_PARTICLE_MOMENTS_H
8 #define ABLASTR_PARTICLE_MOMENTS_H
9 
11 #include <AMReX_ParticleReduce.H>
12 #include <AMReX_REAL.H>
13 #include <AMReX_Reduce.H>
14 #include <AMReX_Tuple.H>
15 
16 #include <tuple>
17 #include <vector>
18 
19 
20 namespace ablastr {
21 namespace particles {
22 
30  template< typename T_PC >
31  static
32  std::tuple<
33  amrex::ParticleReal, amrex::ParticleReal,
34  amrex::ParticleReal, amrex::ParticleReal,
35  amrex::ParticleReal, amrex::ParticleReal>
36  MinAndMaxPositions (T_PC const & pc)
37  {
38  using ConstParticleTileDataType = typename T_PC::ParticleTileType::ConstParticleTileDataType;
39 
40  // Get min and max for the local rank
44  auto r = amrex::ParticleReduce<
45  amrex::ReduceData<amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal,
46  amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal>
47  >(
48  pc,
49  [=] AMREX_GPU_DEVICE(const ConstParticleTileDataType& ptd, const int i) noexcept
50  {
51  const amrex::ParticleReal x = ptd.rdata(0)[i];
52  const amrex::ParticleReal y = ptd.rdata(1)[i];
53  const amrex::ParticleReal z = ptd.rdata(2)[i];
54 
55  return amrex::makeTuple(x, y, z, x, y, z);
56  },
57  reduce_ops
58  );
59 
60  // Get min and max across all ranks
61  std::vector< amrex::ParticleReal > xyz_min = {
62  amrex::get<0>(r),
63  amrex::get<1>(r),
64  amrex::get<2>(r)
65  };
66  amrex::ParallelDescriptor::ReduceRealMin(xyz_min.data(), xyz_min.size());
67  std::vector< amrex::ParticleReal > xyz_max = {
68  amrex::get<3>(r),
69  amrex::get<4>(r),
70  amrex::get<5>(r)
71  };
72  amrex::ParallelDescriptor::ReduceRealMax(xyz_max.data(), xyz_max.size());
73 
74  return {xyz_min[0], xyz_min[1], xyz_min[2], xyz_max[0], xyz_max[1], xyz_max[2]};
75  }
76 
85  template< typename T_PC, int T_RealSoAWeight >
86  static
87  std::tuple<
88  amrex::ParticleReal, amrex::ParticleReal,
89  amrex::ParticleReal, amrex::ParticleReal,
90  amrex::ParticleReal, amrex::ParticleReal>
91  MeanAndStdPositions (T_PC const & pc)
92  {
93 
94  using ConstParticleTileDataType = typename T_PC::ParticleTileType::ConstParticleTileDataType;
95 
99  amrex::ReduceOpSum> reduce_ops;
100  auto r = amrex::ParticleReduce<
102  amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal,
103  amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal,
104  amrex::ParticleReal>
105  >(
106  pc,
107  [=] AMREX_GPU_DEVICE(const ConstParticleTileDataType& ptd, const int i) noexcept
108  {
109 
110  const amrex::ParticleReal x = ptd.rdata(0)[i];
111  const amrex::ParticleReal y = ptd.rdata(1)[i];
112  const amrex::ParticleReal z = ptd.rdata(2)[i];
113 
114  const amrex::ParticleReal w = ptd.rdata(T_RealSoAWeight)[i];
115 
116  return amrex::makeTuple(x, x*x, y, y*y, z, z*z, w);
117  },
118  reduce_ops
119  );
120 
121  // Reduce across MPI ranks
122  std::vector<amrex::ParticleReal> data_vector = {
123  amrex::get<0>(r),
124  amrex::get<1>(r),
125  amrex::get<2>(r),
126  amrex::get<3>(r),
127  amrex::get<4>(r),
128  amrex::get<5>(r),
129  amrex::get<6>(r)
130  };
131  amrex::ParallelDescriptor::ReduceRealSum(data_vector.data(), data_vector.size());
132 
133  amrex::ParticleReal w_sum = data_vector[6];
134  amrex::ParticleReal x_mean = data_vector[0] / w_sum;
135  amrex::ParticleReal x_std = data_vector[1] / w_sum- x_mean * x_mean;
136  amrex::ParticleReal y_mean = data_vector[2] / w_sum;
137  amrex::ParticleReal y_std = data_vector[3] / w_sum- x_mean * x_mean;
138  amrex::ParticleReal z_mean = data_vector[4] / w_sum;
139  amrex::ParticleReal z_std = data_vector[5] / w_sum- x_mean * x_mean;
140 
141  return {x_mean, x_std, y_mean, y_std, z_mean, z_std};
142  }
143 
144 } // namespace particles
145 } // namespace ablastr
146 
147 #endif // ABLASTR_PARTICLE_MOMENTS_H
#define AMREX_GPU_DEVICE
static std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MinAndMaxPositions(T_PC const &pc)
Definition: ParticleMoments.H:36
static std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions(T_PC const &pc)
Definition: ParticleMoments.H:91
Definition: average.cpp:24
void ReduceRealMin(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealSum(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealMax(Vector< std::reference_wrapper< Real > > const &)
constexpr AMREX_GPU_HOST_DEVICE GpuTuple< detail::tuple_decay_t< Ts >... > makeTuple(Ts &&... args)
RD::Type ParticleReduce(PC const &pc, F &&f, ReduceOps &reduce_ops)
i
Definition: check_interp_points_and_weights.py:174
tuple w
Definition: yt3d_mpi.py:46