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