ARTEMIS
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 PType = typename T_PC::SuperParticleType;
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(PType const & p) noexcept
50  {
51  amrex::ParticleReal const x = p.pos(0);
52  amrex::ParticleReal const y = p.pos(1);
53  amrex::ParticleReal const z = p.pos(2);
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  using PType = typename T_PC::SuperParticleType;
94 
98  amrex::ReduceOpSum> reduce_ops;
99  auto r = amrex::ParticleReduce<
101  amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal,
102  amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal,
103  amrex::ParticleReal>
104  >(
105  pc,
106  [=] AMREX_GPU_DEVICE(const PType& p) noexcept
107  {
108  amrex::ParticleReal const x = p.pos(0);
109  amrex::ParticleReal const y = p.pos(1);
110  amrex::ParticleReal const z = p.pos(2);
111  amrex::ParticleReal const w = p.rdata(T_RealSoAWeight);
112 
113  return amrex::makeTuple(x, x*x, y, y*y, z, z*z, w);
114  },
115  reduce_ops
116  );
117 
118  // Reduce across MPI ranks
119  std::vector<amrex::ParticleReal> data_vector = {
120  amrex::get<0>(r),
121  amrex::get<1>(r),
122  amrex::get<2>(r),
123  amrex::get<3>(r),
124  amrex::get<4>(r),
125  amrex::get<5>(r),
126  amrex::get<6>(r)
127  };
128  amrex::ParallelDescriptor::ReduceRealSum(data_vector.data(), data_vector.size());
129 
130  amrex::ParticleReal w_sum = data_vector[6];
131  amrex::ParticleReal x_mean = data_vector[0] / w_sum;
132  amrex::ParticleReal x_std = data_vector[1] / w_sum- x_mean * x_mean;
133  amrex::ParticleReal y_mean = data_vector[2] / w_sum;
134  amrex::ParticleReal y_std = data_vector[3] / w_sum- x_mean * x_mean;
135  amrex::ParticleReal z_mean = data_vector[4] / w_sum;
136  amrex::ParticleReal z_std = data_vector[5] / w_sum- x_mean * x_mean;
137 
138  return {x_mean, x_std, y_mean, y_std, z_mean, z_std};
139  }
140 
141 } // namespace particles
142 } // namespace ablastr
143 
144 #endif // ABLASTR_PARTICLE_MOMENTS_H
#define AMREX_GPU_DEVICE
typename WarpXParticleContainer::SuperParticleType SuperParticleType
Definition: FilterFunctors.H:19
def y
Definition: Excitation_Flag_Generator.py:76
def z
Definition: Excitation_Flag_Generator.py:77
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:23
void ReduceRealMin(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealSum(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealMax(Vector< std::reference_wrapper< Real > > const &)
RD::Type ParticleReduce(PC const &pc, F &&f, ReduceOps &reduce_ops)
AMREX_GPU_HOST_DEVICE constexpr GpuTuple< detail::tuple_decay_t< Ts >... > makeTuple(Ts &&... args)
tuple w
Definition: yt3d_mpi.py:46