WarpX
TwoProductFusionInitializeMomentum.H
Go to the documentation of this file.
1 /* Copyright 2022 Remi Lehe
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 
8 #ifndef WARPX_TWO_PRODUCT_FUSION_INITIALIZE_MOMENTUM_H
9 #define WARPX_TWO_PRODUCT_FUSION_INITIALIZE_MOMENTUM_H
10 
11 #include "TwoProductFusionUtil.H"
13 #include "Utils/ParticleUtils.H"
14 #include "Utils/WarpXConst.H"
15 
16 #include <AMReX_DenseBins.H>
17 #include <AMReX_Random.H>
18 #include <AMReX_REAL.H>
19 
20 #include <cmath>
21 #include <limits>
22 
23 namespace {
24  // Define shortcuts for frequently-used type names
31 
55  void TwoProductFusionInitializeMomentum (
56  const SoaData_type& soa1_in, const SoaData_type& soa2_in,
57  SoaData_type& soa1_out, SoaData_type& soa2_out,
58  const index_type& idx1_in, const index_type& idx2_in,
59  const index_type& idx1_out_start, const index_type& idx2_out_start,
60  const amrex::ParticleReal& m1_in, const amrex::ParticleReal& m2_in,
61  const amrex::ParticleReal& m1_out, const amrex::ParticleReal& m2_out,
62  const amrex::ParticleReal& E_fusion,
63  const amrex::RandomEngine& engine)
64  {
65  using namespace amrex::literals;
66 
67  amrex::ParticleReal ux1_out = 0.0_prt, uy1_out = 0.0_prt, uz1_out = 0.0_prt;
68  amrex::ParticleReal ux2_out = 0.0_prt, uy2_out = 0.0_prt, uz2_out = 0.0_prt;
69 
70  TwoProductFusionComputeProductMomenta(
71  soa1_in.m_rdata[PIdx::ux][idx1_in],
72  soa1_in.m_rdata[PIdx::uy][idx1_in],
73  soa1_in.m_rdata[PIdx::uz][idx1_in], m1_in,
74  soa2_in.m_rdata[PIdx::ux][idx2_in],
75  soa2_in.m_rdata[PIdx::uy][idx2_in],
76  soa2_in.m_rdata[PIdx::uz][idx2_in], m2_in,
77  ux1_out, uy1_out, uz1_out, m1_out,
78  ux2_out, uy2_out, uz2_out, m2_out,
79  E_fusion,
80  engine);
81 
82  // Fill momentum of product species (note that we actually
83  // create 4 products, 2 at the position of each incident particle)
84  soa1_out.m_rdata[PIdx::ux][idx1_out_start] = ux1_out;
85  soa1_out.m_rdata[PIdx::uy][idx1_out_start] = uy1_out;
86  soa1_out.m_rdata[PIdx::uz][idx1_out_start] = uz1_out;
87  soa1_out.m_rdata[PIdx::ux][idx1_out_start + 1] = ux1_out;
88  soa1_out.m_rdata[PIdx::uy][idx1_out_start + 1] = uy1_out;
89  soa1_out.m_rdata[PIdx::uz][idx1_out_start + 1] = uz1_out;
90  soa2_out.m_rdata[PIdx::ux][idx2_out_start] = ux2_out;
91  soa2_out.m_rdata[PIdx::uy][idx2_out_start] = uy2_out;
92  soa2_out.m_rdata[PIdx::uz][idx2_out_start] = uz2_out;
93  soa2_out.m_rdata[PIdx::ux][idx2_out_start + 1] = ux2_out;
94  soa2_out.m_rdata[PIdx::uy][idx2_out_start + 1] = uy2_out;
95  soa2_out.m_rdata[PIdx::uz][idx2_out_start + 1] = uz2_out;
96  }
97 }
98 
99 #endif // WARPX_TWO_PRODUCT_FUSION_INITIALIZE_MOMENTUM_H
#define AMREX_INLINE
#define AMREX_GPU_HOST_DEVICE
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
typename WarpXParticleContainer::ParticleTileType ParticleTileType
Definition: ParticleUtils.cpp:32
typename ParticleTileType::ParticleTileDataType ParticleTileDataType
Definition: ParticleUtils.cpp:33
typename ParticleBins::index_type index_type
Definition: ParticleUtils.cpp:35
DenseBins< ParticleTileDataType > ParticleBins
Definition: ParticleUtils.cpp:34
typename WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleUtils.cpp:31
@ uz
Definition: NamedComponentParticleContainer.H:34
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34
ParticleTileData< StorageParticleType, NArrayReal, NArrayInt > ParticleTileDataType