WarpX
Loading...
Searching...
No Matches
ScatteringProcess.H
Go to the documentation of this file.
1/* Copyright 2021-2023 The WarpX Community
2 *
3 * This file is part of WarpX.
4 *
5 * Authors: Modern Electron, Roelof Groenewald (TAE Technologies)
6 *
7 * License: BSD-3-Clause-LBNL
8 */
9#ifndef WARPX_PARTICLES_COLLISION_SCATTERING_PROCESS_H_
10#define WARPX_PARTICLES_COLLISION_SCATTERING_PROCESS_H_
11
13
14#include <AMReX_GpuContainers.H>
15#include <AMReX_Math.H>
16#include <AMReX_REAL.H>
17#include <AMReX_RandomEngine.H>
18#include <AMReX_Vector.H>
19
20#include <string>
21
30
32{
33public:
35 const std::string& scattering_process,
36 const std::string& cross_section_file,
38 ScatteringAngleModel scattering_angle_model
39 );
40
41 template <typename InputVector>
43 const std::string& scattering_process,
44 const InputVector&& energies,
45 const InputVector&& sigmas,
47 ScatteringAngleModel scattering_angle_model
48 );
49
50 ~ScatteringProcess() = default;
51
56
65 static
67 const std::string& cross_section_file,
70 );
71
72 static
76 );
77
78 struct Executor {
86 [[nodiscard]]
89 {
90 if (E_coll < m_energy_lo) {
91 return m_sigma_lo;
92 } else if (E_coll > m_energy_hi) {
93 return m_sigma_hi;
94 } else {
95 using amrex::Math::floor;
96 using amrex::Math::ceil;
97 // calculate index of bounding energy pairs
98 amrex::ParticleReal temp = (E_coll - m_energy_lo) / m_dE;
99 const int idx_1 = static_cast<int>(floor(temp));
100 const int idx_2 = static_cast<int>(ceil(temp));
101
102 // linearly interpolate to the given energy value
103 temp -= idx_1;
104 return m_sigmas_data[idx_1] + (m_sigmas_data[idx_2] - m_sigmas_data[idx_1]) * temp;
105 }
106 }
107
116 };
117
118 [[nodiscard]]
119 Executor const& executor () const {
120#ifdef AMREX_USE_GPU
121 return m_exe_d;
122#else
123 return m_exe_h;
124#endif
125 }
126
128 {
129 return m_exe_h.getCrossSection(E_coll);
130 }
131
132 [[nodiscard]] amrex::ParticleReal getEnergyPenalty () const { return m_exe_h.m_energy_penalty; }
133 [[nodiscard]] amrex::ParticleReal getMinEnergyInput () const { return m_exe_h.m_energy_lo; }
134 [[nodiscard]] amrex::ParticleReal getMaxEnergyInput () const { return m_exe_h.m_energy_hi; }
135 [[nodiscard]] amrex::ParticleReal getEnergyInputStep () const { return m_exe_h.m_dE; }
136
137 [[nodiscard]] ScatteringProcessType type () const { return m_exe_h.m_type; }
138
139 static
140 ScatteringProcessType parseProcessType(const std::string& process);
141
142private:
143
144 void init (const std::string& scattering_process, amrex::ParticleReal energy,
145 ScatteringAngleModel scattering_angle_model);
146
148
149#ifdef AMREX_USE_GPU
151 Executor m_exe_d;
152#endif
155
157};
158
159#endif // WARPX_PARTICLES_COLLISION_SCATTERING_PROCESS_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
ScatteringProcessType
Definition ScatteringProcess.H:22
@ CHARGE_EXCHANGE
Definition ScatteringProcess.H:26
@ ELASTIC
Definition ScatteringProcess.H:24
@ EXCITATION
Definition ScatteringProcess.H:27
@ TWOPRODUCT_REACTION
Definition ScatteringProcess.H:25
@ IONIZATION
Definition ScatteringProcess.H:28
@ INVALID
Definition ScatteringProcess.H:23
ScatteringAngleModel
For binary collision algorithms, the strategy to determine the scattering angle in the center of mass...
Definition WarpXAlgorithmSelection.H:198
static void readCrossSectionFile(const std::string &cross_section_file, amrex::Vector< amrex::ParticleReal > &energies, amrex::Gpu::HostVector< amrex::ParticleReal > &sigmas)
Definition ScatteringProcess.cpp:106
amrex::ParticleReal getEnergyInputStep() const
Definition ScatteringProcess.H:135
~ScatteringProcess()=default
ScatteringProcess(ScatteringProcess &&)=default
void init(const std::string &scattering_process, amrex::ParticleReal energy, ScatteringAngleModel scattering_angle_model)
Definition ScatteringProcess.cpp:40
Executor const & executor() const
Definition ScatteringProcess.H:119
int m_grid_size
Definition ScatteringProcess.H:156
static ScatteringProcessType parseProcessType(const std::string &process)
Definition ScatteringProcess.cpp:85
static void sanityCheckEnergyGrid(const amrex::Vector< amrex::ParticleReal > &energies, amrex::ParticleReal dE)
Definition ScatteringProcess.cpp:124
ScatteringProcess & operator=(ScatteringProcess const &)=delete
ScatteringProcessType type() const
Definition ScatteringProcess.H:137
amrex::ParticleReal getMinEnergyInput() const
Definition ScatteringProcess.H:133
amrex::Gpu::HostVector< amrex::ParticleReal > m_sigmas_h
Definition ScatteringProcess.H:153
ScatteringProcess(ScatteringProcess const &)=delete
amrex::ParticleReal getEnergyPenalty() const
Definition ScatteringProcess.H:132
amrex::ParticleReal getMaxEnergyInput() const
Definition ScatteringProcess.H:134
amrex::ParticleReal getCrossSection(amrex::ParticleReal E_coll) const
Definition ScatteringProcess.H:127
ScatteringProcess(const std::string &scattering_process, const std::string &cross_section_file, amrex::ParticleReal energy, ScatteringAngleModel scattering_angle_model)
Definition ScatteringProcess.cpp:13
Executor m_exe_h
Definition ScatteringProcess.H:154
amrex::Vector< amrex::ParticleReal > m_energies
Definition ScatteringProcess.H:147
amrex_particle_real ParticleReal
PinnedVector< T > HostVector
PODVector< T, ArenaAllocator< T > > DeviceVector
Definition ScatteringProcess.H:78
ScatteringProcessType m_type
Definition ScatteringProcess.H:111
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal getCrossSection(amrex::ParticleReal E_coll) const
Definition ScatteringProcess.H:88
amrex::ParticleReal m_energy_penalty
Definition ScatteringProcess.H:110
amrex::ParticleReal m_sigma_lo
Definition ScatteringProcess.H:109
amrex::ParticleReal m_energy_lo
Definition ScatteringProcess.H:109
amrex::ParticleReal m_energy_hi
Definition ScatteringProcess.H:109
ScatteringAngleModel m_scattering_angle_model
Definition ScatteringProcess.H:112
bool m_produces_products
Definition ScatteringProcess.H:115
amrex::ParticleReal * m_sigmas_data
Definition ScatteringProcess.H:108
amrex::ParticleReal m_dE
Definition ScatteringProcess.H:109
amrex::ParticleReal m_sigma_hi
Definition ScatteringProcess.H:109