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
12#include <AMReX_GpuContainers.H>
13#include <AMReX_Math.H>
14#include <AMReX_REAL.H>
15#include <AMReX_RandomEngine.H>
16#include <AMReX_Vector.H>
17
18#include <string>
19
29
31{
32public:
34 const std::string& scattering_process,
35 const std::string& cross_section_file,
36 amrex::ParticleReal energy
37 );
38
39 template <typename InputVector>
41 const std::string& scattering_process,
42 const InputVector&& energies,
43 const InputVector&& sigmas,
44 amrex::ParticleReal energy
45 );
46
47 ~ScatteringProcess() = default;
48
53
62 static
64 const std::string& cross_section_file,
67 );
68
69 static
72 amrex::ParticleReal dE
73 );
74
75 struct Executor {
83 [[nodiscard]]
85 amrex::ParticleReal getCrossSection (amrex::ParticleReal E_coll) const
86 {
87 if (E_coll < m_energy_lo) {
88 return m_sigma_lo;
89 } else if (E_coll > m_energy_hi) {
90 return m_sigma_hi;
91 } else {
92 using amrex::Math::floor;
93 using amrex::Math::ceil;
94 // calculate index of bounding energy pairs
95 amrex::ParticleReal temp = (E_coll - m_energy_lo) / m_dE;
96 const int idx_1 = static_cast<int>(floor(temp));
97 const int idx_2 = static_cast<int>(ceil(temp));
98
99 // linearly interpolate to the given energy value
100 temp -= idx_1;
101 return m_sigmas_data[idx_1] + (m_sigmas_data[idx_2] - m_sigmas_data[idx_1]) * temp;
102 }
103 }
104
105 amrex::ParticleReal* m_sigmas_data = nullptr;
107 amrex::ParticleReal m_energy_penalty;
109 };
110
111 [[nodiscard]]
112 Executor const& executor () const {
113#ifdef AMREX_USE_GPU
114 return m_exe_d;
115#else
116 return m_exe_h;
117#endif
118 }
119
120 [[nodiscard]] amrex::ParticleReal getCrossSection (amrex::ParticleReal E_coll) const
121 {
122 return m_exe_h.getCrossSection(E_coll);
123 }
124
125 [[nodiscard]] amrex::ParticleReal getEnergyPenalty () const { return m_exe_h.m_energy_penalty; }
126 [[nodiscard]] amrex::ParticleReal getMinEnergyInput () const { return m_exe_h.m_energy_lo; }
127 [[nodiscard]] amrex::ParticleReal getMaxEnergyInput () const { return m_exe_h.m_energy_hi; }
128 [[nodiscard]] amrex::ParticleReal getEnergyInputStep () const { return m_exe_h.m_dE; }
129
130 [[nodiscard]] ScatteringProcessType type () const { return m_exe_h.m_type; }
131
132private:
133
134 static
135 ScatteringProcessType parseProcessType(const std::string& process);
136
137 void init (const std::string& scattering_process, amrex::ParticleReal energy);
138
140
141#ifdef AMREX_USE_GPU
143 Executor m_exe_d;
144#endif
147
149};
150
151#endif // WARPX_PARTICLES_COLLISION_SCATTERING_PROCESS_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
@ INVALID
Definition BackgroundStopping.H:18
ScatteringProcessType
Definition ScatteringProcess.H:20
@ BACK
Definition ScatteringProcess.H:23
@ ELASTIC
Definition ScatteringProcess.H:22
@ EXCITATION
Definition ScatteringProcess.H:25
@ TWOPRODUCT_REACTION
Definition ScatteringProcess.H:24
@ IONIZATION
Definition ScatteringProcess.H:26
@ FORWARD
Definition ScatteringProcess.H:27
static void readCrossSectionFile(const std::string &cross_section_file, amrex::Vector< amrex::ParticleReal > &energies, amrex::Gpu::HostVector< amrex::ParticleReal > &sigmas)
Definition ScatteringProcess.cpp:99
amrex::ParticleReal getEnergyInputStep() const
Definition ScatteringProcess.H:128
~ScatteringProcess()=default
ScatteringProcess(ScatteringProcess &&)=default
Executor const & executor() const
Definition ScatteringProcess.H:112
int m_grid_size
Definition ScatteringProcess.H:148
static ScatteringProcessType parseProcessType(const std::string &process)
Definition ScatteringProcess.cpp:77
static void sanityCheckEnergyGrid(const amrex::Vector< amrex::ParticleReal > &energies, amrex::ParticleReal dE)
Definition ScatteringProcess.cpp:117
ScatteringProcess & operator=(ScatteringProcess const &)=delete
ScatteringProcess(const std::string &scattering_process, const std::string &cross_section_file, amrex::ParticleReal energy)
Definition ScatteringProcess.cpp:13
ScatteringProcessType type() const
Definition ScatteringProcess.H:130
amrex::ParticleReal getMinEnergyInput() const
Definition ScatteringProcess.H:126
amrex::Gpu::HostVector< amrex::ParticleReal > m_sigmas_h
Definition ScatteringProcess.H:145
ScatteringProcess(ScatteringProcess const &)=delete
amrex::ParticleReal getEnergyPenalty() const
Definition ScatteringProcess.H:125
amrex::ParticleReal getMaxEnergyInput() const
Definition ScatteringProcess.H:127
amrex::ParticleReal getCrossSection(amrex::ParticleReal E_coll) const
Definition ScatteringProcess.H:120
void init(const std::string &scattering_process, amrex::ParticleReal energy)
Definition ScatteringProcess.cpp:38
Executor m_exe_h
Definition ScatteringProcess.H:146
amrex::Vector< amrex::ParticleReal > m_energies
Definition ScatteringProcess.H:139
PinnedVector< T > HostVector
PODVector< T, ArenaAllocator< T > > DeviceVector
Definition ScatteringProcess.H:75
ScatteringProcessType m_type
Definition ScatteringProcess.H:108
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal getCrossSection(amrex::ParticleReal E_coll) const
Definition ScatteringProcess.H:85
amrex::ParticleReal m_energy_penalty
Definition ScatteringProcess.H:107
amrex::ParticleReal m_sigma_lo
Definition ScatteringProcess.H:106
amrex::ParticleReal m_energy_lo
Definition ScatteringProcess.H:106
amrex::ParticleReal m_energy_hi
Definition ScatteringProcess.H:106
amrex::ParticleReal * m_sigmas_data
Definition ScatteringProcess.H:105
amrex::ParticleReal m_dE
Definition ScatteringProcess.H:106
amrex::ParticleReal m_sigma_hi
Definition ScatteringProcess.H:106