ImpactX
Toggle main menu visibility
Loading...
Searching...
No Matches
src
elements
mixin
pipeaperture.H
Go to the documentation of this file.
1
/* Copyright 2022-2026 The Regents of the University of California, through Lawrence
2
* Berkeley National Laboratory (subject to receipt of any required
3
* approvals from the U.S. Dept. of Energy). All rights reserved.
4
*
5
* This file is part of ImpactX.
6
*
7
* Authors: Axel Huebl, Chad Mitchell, Alexander Sinn
8
* License: BSD-3-Clause-LBNL
9
*/
10
#ifndef IMPACTX_ELEMENTS_MIXIN_PIPE_APERTURE_H
11
#define IMPACTX_ELEMENTS_MIXIN_PIPE_APERTURE_H
12
13
#include <
AMReX_Extension.H
>
14
#include <
AMReX_GpuQualifiers.H
>
15
#include <
AMReX_Math.H
>
16
#include <
AMReX_Particle.H
>
17
#include <
AMReX_REAL.H
>
18
#include <
AMReX_SIMD.H
>
19
20
21
namespace
impactx::elements::mixin
22
{
25
struct
PipeAperture
26
{
27
static
constexpr
amrex::ParticleReal
DEFAULT_aperture_x
= 0;
28
static
constexpr
amrex::ParticleReal
DEFAULT_aperture_y
= 0;
29
35
PipeAperture
(
36
amrex::ParticleReal
aperture_x
,
37
amrex::ParticleReal
aperture_y
38
)
39
{
40
using namespace
amrex::literals
;
// for _prt
41
42
m_inv_aperture_x
=
aperture_x
> 0_prt ? 1_prt /
aperture_x
: 0_prt;
43
m_inv_aperture_y
=
aperture_y
> 0_prt ? 1_prt /
aperture_y
: 0_prt;
44
}
45
46
PipeAperture
() =
default
;
47
PipeAperture
(
PipeAperture
const
&) =
default
;
48
PipeAperture
&
operator=
(
PipeAperture
const
&) =
default
;
49
PipeAperture
(
PipeAperture
&&) =
default
;
50
PipeAperture
&
operator=
(
PipeAperture
&& rhs) =
default
;
51
52
~PipeAperture
() =
default
;
53
60
template
<
typename
T_Real=amrex::ParticleReal,
typename
T_IdCpu=u
int
64_t>
61
AMREX_GPU_HOST_DEVICE
AMREX_FORCE_INLINE
62
void
apply_aperture
(
63
T_Real &
AMREX_RESTRICT
x,
64
T_Real &
AMREX_RESTRICT
y,
65
T_IdCpu &
AMREX_RESTRICT
idcpu
66
)
const
67
{
68
using namespace
amrex::literals
;
// for _rt and _prt
69
using
amrex::Math::powi
;
70
namespace
stdx =
amrex::simd::stdx
;
71
72
// skip aperture application if aperture_x <= 0 or aperture_y <= 0
73
if
(
m_inv_aperture_x
> 0_prt &&
m_inv_aperture_y
> 0_prt) {
74
75
// scale horizontal and vertical coordinates
76
// performance optimization: we intentionally store the inverse of
77
// the aperture, so we can do a quick multiplication (instead of a
78
// costly division) here.
79
T_Real
const
u = x *
m_inv_aperture_x
;
80
T_Real
const
v
= y *
m_inv_aperture_y
;
81
82
// compare against the aperture boundary
83
auto
const
mask
= u*u +
v
*
v
> 1_prt;
84
amrex::ParticleIDWrapper<T_IdCpu>
{idcpu}.
make_invalid
(
mask
);
85
}
86
}
87
92
AMREX_GPU_HOST_DEVICE
AMREX_FORCE_INLINE
93
amrex::ParticleReal
aperture_x
()
const
94
{
95
using namespace
amrex::literals
;
// for _prt
96
return
m_inv_aperture_x
> 0_prt ? 1_prt /
m_inv_aperture_x
: 0_prt;
97
}
98
103
AMREX_GPU_HOST_DEVICE
AMREX_FORCE_INLINE
104
amrex::ParticleReal
aperture_y
()
const
105
{
106
using namespace
amrex::literals
;
// for _prt
107
return
m_inv_aperture_y
> 0_prt ? 1_prt /
m_inv_aperture_y
: 0_prt;
108
}
109
110
// performance optimization: we intentionally store the inverse of
111
// the aperture, so we can do a quick multiplication instead of a costly
112
// division in the comparison operation per particle
113
amrex::ParticleReal
m_inv_aperture_x
= 0;
114
amrex::ParticleReal
m_inv_aperture_y
= 0;
115
};
116
117
}
// namespace impactx::elements::mixin
118
119
#endif
// IMPACTX_ELEMENTS_MIXIN_PIPE_APERTURE_H
AMReX_Extension.H
AMREX_FORCE_INLINE
#define AMREX_FORCE_INLINE
AMREX_RESTRICT
#define AMREX_RESTRICT
AMReX_GpuQualifiers.H
AMREX_GPU_HOST_DEVICE
#define AMREX_GPU_HOST_DEVICE
mask
Array4< int const > mask
AMReX_Math.H
AMReX_Particle.H
AMReX_REAL.H
AMReX_SIMD.H
RigidAdvanceMode::v
@ v
amrex::ParticleReal
amrex_particle_real ParticleReal
amrex::Math::powi
constexpr T powi(T x) noexcept
amrex::literals
amrex::simd::stdx
impactx::elements::mixin
Definition
alignment.H:25
amrex::ParticleIDWrapper
amrex::ParticleIDWrapper::make_invalid
__host__ __device__ void make_invalid() const noexcept
impactx::elements::mixin::PipeAperture::PipeAperture
PipeAperture(PipeAperture &&)=default
impactx::elements::mixin::PipeAperture::apply_aperture
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void apply_aperture(T_Real &AMREX_RESTRICT x, T_Real &AMREX_RESTRICT y, T_IdCpu &AMREX_RESTRICT idcpu) const
Definition
pipeaperture.H:62
impactx::elements::mixin::PipeAperture::PipeAperture
PipeAperture(PipeAperture const &)=default
impactx::elements::mixin::PipeAperture::m_inv_aperture_x
amrex::ParticleReal m_inv_aperture_x
Definition
pipeaperture.H:113
impactx::elements::mixin::PipeAperture::DEFAULT_aperture_x
static constexpr amrex::ParticleReal DEFAULT_aperture_x
Definition
pipeaperture.H:27
impactx::elements::mixin::PipeAperture::~PipeAperture
~PipeAperture()=default
impactx::elements::mixin::PipeAperture::operator=
PipeAperture & operator=(PipeAperture const &)=default
impactx::elements::mixin::PipeAperture::PipeAperture
PipeAperture()=default
impactx::elements::mixin::PipeAperture::aperture_x
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_x() const
Definition
pipeaperture.H:93
impactx::elements::mixin::PipeAperture::aperture_y
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal aperture_y() const
Definition
pipeaperture.H:104
impactx::elements::mixin::PipeAperture::DEFAULT_aperture_y
static constexpr amrex::ParticleReal DEFAULT_aperture_y
Definition
pipeaperture.H:28
impactx::elements::mixin::PipeAperture::PipeAperture
PipeAperture(amrex::ParticleReal aperture_x, amrex::ParticleReal aperture_y)
Definition
pipeaperture.H:35
impactx::elements::mixin::PipeAperture::m_inv_aperture_y
amrex::ParticleReal m_inv_aperture_y
inverse of the horizontal aperture size [1/m]
Definition
pipeaperture.H:114
Generated by
1.17.0