WarpX
FilterFunctors.H
Go to the documentation of this file.
1 /* Copyright 2016-2020 Maxence Thevenet, Yinjian Zhao
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_FILTERFUNCTORS_H
8 #define WARPX_FILTERFUNCTORS_H
9 
12 #include "Utils/WarpXConst.H"
13 
14 #include <AMReX_Gpu.H>
15 #include <AMReX_Parser.H>
16 #include <AMReX_Random.H>
17 
19 
25 enum struct InputUnits{WarpX, SI};
26 
31 {
36  RandomFilter(bool a_is_active, amrex::Real a_fraction)
37  : m_is_active(a_is_active), m_fraction(a_fraction) {}
38 
46  bool operator () (const SuperParticleType& p, const amrex::RandomEngine& engine) const noexcept
47  {
49 
50  return ( (!m_is_active) || (amrex::Random(engine) < m_fraction) );
51  }
52 private:
53  const bool m_is_active;
54  const amrex::Real m_fraction = 1.0;
55 };
56 
61 {
66  UniformFilter(bool a_is_active, int a_stride)
67  : m_is_active(a_is_active), m_stride(a_stride) {}
68 
75  bool operator () (const SuperParticleType& p, const amrex::RandomEngine&) const noexcept
76  {
77  return ( (!m_is_active) || ( p.id()%m_stride == 0 ) );
78  }
79 private:
80  const bool m_is_active;
81  const int m_stride = 0;
82 };
83 
88 {
95  ParserFilter(bool a_is_active, amrex::ParserExecutor<7> const& a_filter_parser,
96  const amrex::ParticleReal a_mass, const amrex::Real time):
97  m_is_active{a_is_active},
98  m_function_partparser{a_filter_parser},
99  m_mass{a_mass},
100  m_t{time}
101  {}
102 
109  bool operator () (const SuperParticleType& p, const amrex::RandomEngine&) const noexcept
110  {
111  using namespace amrex::literals;
112 
113  if (!m_is_active){
114  return true;
115  }
116  else{
117  amrex::ParticleReal x, y, z;
118  get_particle_position(p, x, y, z);
119  amrex::Real ux = p.rdata(PIdx::ux)/PhysConst::c;
120  amrex::Real uy = p.rdata(PIdx::uy)/PhysConst::c;
121  amrex::Real uz = p.rdata(PIdx::uz)/PhysConst::c;
122  if (m_units == InputUnits::SI)
123  {
124  ux /= m_mass;
125  uy /= m_mass;
126  uz /= m_mass;
127  }
128  // ux, uy, uz are now in beta*gamma
129 
130  // This is actually a binary true/false (1/0) check,
131  // but the parser returns floating point types
132  return (m_function_partparser(m_t,x,y,z,ux,uy,uz) != 0.0_rt);
133  }
134  }
135 private:
137  const bool m_is_active;
138 public:
142  amrex::ParticleReal m_mass;
144  amrex::Real m_t;
147 };
148 
149 
150 
156 {
157  GeometryFilter(bool a_is_active, amrex::RealBox a_domain)
158  : m_is_active(a_is_active), m_domain(a_domain) {}
165  bool operator () (const SuperParticleType& p, const amrex::RandomEngine&) const noexcept
166  {
167  if ( !m_is_active ) { return true; }
168  return AMREX_D_TERM( (p.pos(0) >= m_domain.lo(0)) && (p.pos(0) <= m_domain.hi(0) ),
169  && (p.pos(1) >= m_domain.lo(1)) && (p.pos(1) <= m_domain.hi(1) ),
170  && (p.pos(2) >= m_domain.lo(2)) && (p.pos(2) <= m_domain.hi(2) ));
171  }
172 private:
174  const bool m_is_active;
177 };
178 
179 #endif // WARPX_FILTERFUNCTORS_H
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
#define AMREX_D_TERM(a, b, c)
InputUnits
Used to keep track of what inputs units a filter function should expect. "WarpX units" means the mome...
Definition: FilterFunctors.H:25
typename WarpXParticleContainer::SuperParticleType SuperParticleType
Definition: FilterFunctors.H:18
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void get_particle_position(const WarpXParticleContainer::SuperParticleType &p, amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &z) noexcept
Extract the cartesian position coordinates of the particle p and store them in the variables x,...
Definition: GetAndSetPosition.H:28
Particle< NStructReal+NArrayReal, NStructInt+NArrayInt > SuperParticleType
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
Real Random()
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
Functor that returns 1 if the particle is inside a given axis-aligned region defined by amrex::RealBo...
Definition: FilterFunctors.H:156
const bool m_is_active
Definition: FilterFunctors.H:174
GeometryFilter(bool a_is_active, amrex::RealBox a_domain)
Definition: FilterFunctors.H:157
const amrex::RealBox m_domain
Definition: FilterFunctors.H:176
@ uz
Definition: NamedComponentParticleContainer.H:34
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34
Functor that returns 0 or 1 depending on a parser selection.
Definition: FilterFunctors.H:88
amrex::ParticleReal m_mass
Definition: FilterFunctors.H:142
amrex::ParserExecutor< 7 > const m_function_partparser
Definition: FilterFunctors.H:140
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const SuperParticleType &p, const amrex::RandomEngine &) const noexcept
return 1 if the particle is selected by the parser
Definition: FilterFunctors.H:109
amrex::Real m_t
Definition: FilterFunctors.H:144
InputUnits m_units
Definition: FilterFunctors.H:146
const bool m_is_active
Definition: FilterFunctors.H:137
ParserFilter(bool a_is_active, amrex::ParserExecutor< 7 > const &a_filter_parser, const amrex::ParticleReal a_mass, const amrex::Real time)
Definition: FilterFunctors.H:95
Functor that returns 0 or 1 depending on a random draw per particle.
Definition: FilterFunctors.H:31
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const SuperParticleType &p, const amrex::RandomEngine &engine) const noexcept
draw random number, return 1 if number < m_fraction, 1 otherwise
Definition: FilterFunctors.H:46
RandomFilter(bool a_is_active, amrex::Real a_fraction)
Definition: FilterFunctors.H:36
const amrex::Real m_fraction
select all particles if false
Definition: FilterFunctors.H:54
const bool m_is_active
Definition: FilterFunctors.H:53
Functor that returns 1 if stride divide particle_id, 0 otherwise.
Definition: FilterFunctors.H:61
const bool m_is_active
Definition: FilterFunctors.H:80
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const SuperParticleType &p, const amrex::RandomEngine &) const noexcept
return 1 if stride divide particle_id, 0 otherwise
Definition: FilterFunctors.H:75
const int m_stride
select all particles if false
Definition: FilterFunctors.H:81
UniformFilter(bool a_is_active, int a_stride)
Definition: FilterFunctors.H:66