WarpX
Loading...
Searching...
No Matches
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
12#include <AMReX_REAL.H>
13#include <AMReX_Reduce.H>
14#include <AMReX_Tuple.H>
15
16#include <tuple>
17#include <vector>
18
19
20namespace ablastr {
21namespace 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 = {
65 };
66 amrex::ParallelDescriptor::ReduceRealMin(xyz_min.data(), xyz_min.size());
67 std::vector< amrex::ParticleReal > xyz_max = {
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),
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
Definition DepositCharge.H:21
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:22
void ReduceRealMin(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealSum(Vector< std::reference_wrapper< Real > > const &)
void ReduceRealMax(Vector< std::reference_wrapper< Real > > const &)
__host__ __device__ constexpr GpuTuple< detail::tuple_decay_t< Ts >... > makeTuple(Ts &&... args)
__host__ __device__ constexpr GpuTupleElement< I, GpuTuple< Ts... > >::type & get(GpuTuple< Ts... > &tup) noexcept
RD::Type ParticleReduce(PC const &pc, F &&f, ReduceOps &reduce_ops)