94 const amrex::ParticleReal& m1,
const amrex::ParticleReal& m2,
106 using namespace amrex::literals;
125 num_added_vec[i] =
static_cast<int>(num_added);
126 tile_products[i]->resize(products_np[i] + num_added);
129 const auto soa_1 = ptile1.getParticleTileData();
130 const auto soa_2 = ptile2.getParticleTileData();
136 soa_products.push_back(tile_products[i]->getParticleTileData());
144 device_soa_products.
begin());
147 device_products_np.
begin());
166 int const i1 =
static_cast<int>(p_pair_indices_1[i]);
167 int const i2 =
static_cast<int>(p_pair_indices_2[i]);
171 amrex::ParticleReal & u1x = soa_1.m_rdata[
PIdx::ux][i1];
172 amrex::ParticleReal & u1y = soa_1.m_rdata[
PIdx::uy][i1];
173 amrex::ParticleReal & u1z = soa_1.m_rdata[
PIdx::uz][i1];
174 amrex::ParticleReal
const & w1 = soa_1.m_rdata[
PIdx::w][i1];
175 amrex::ParticleReal & u2x = soa_2.m_rdata[
PIdx::ux][i2];
176 amrex::ParticleReal & u2y = soa_2.m_rdata[
PIdx::uy][i2];
177 amrex::ParticleReal & u2z = soa_2.m_rdata[
PIdx::uz][i2];
178 amrex::ParticleReal
const & w2 = soa_2.m_rdata[
PIdx::w][i2];
180 amrex::ParticleReal u1x_rel = u1x;
181 amrex::ParticleReal u1y_rel = u1y;
182 amrex::ParticleReal u1z_rel = u1z;
185 amrex::ParticleReal
const u1sq_rel = (u1x_rel*u1x_rel + u1y_rel*u1y_rel + u1z_rel*u1z_rel);
186 amrex::ParticleReal
const gamma1_rel = std::sqrt(1.0_prt + u1sq_rel/c2);
188 amrex::ParticleReal
const Ephoton = p_product_data[i];
189 amrex::ParticleReal
const wp = p_pair_reaction_weight[i];
192 amrex::ParticleReal
const u1_rel = std::sqrt(u1sq_rel);
193 amrex::ParticleReal
const A = u1_rel/
PhysConst::c - Ephoton*wp/(w1*m1*c2);
194 amrex::ParticleReal
const B = gamma1_rel + w2*m2/(w1*m1) - Ephoton*wp/(w1*m1*c2);
197 amrex::ParticleReal
const AAmBB = -1.0_prt - 2.0_prt*gamma1_rel*w2*m2/(w1*m1) - w2*m2/(w1*m1)*w2*m2/(w1*m1)
198 +2.0_prt*(gamma1_rel + w2*m2/(w1*m1) - u1_rel/
PhysConst::c)*Ephoton*wp/(w1*m1*c2);
199 amrex::ParticleReal
const D = w2*m2*w2*m2/(w1*m1*w1*m1) + AAmBB - 1.0_prt;
201 amrex::ParticleReal
const a = 4.0_prt*(-AAmBB);
202 amrex::ParticleReal
const b = 4.0_prt*A*D;
203 amrex::ParticleReal
const c = 4.0_prt*B*B - D*D;
216 amrex::ParticleReal
const bac = std::max(b*b - 4.0_prt*a*c, 0._prt);
219 amrex::ParticleReal
const u1_rel_after = (-b + std::sqrt(bac))/(2.0_prt*a)*
PhysConst::c;
224 amrex::ParticleReal
const u2_rel_after = (A*
PhysConst::c - u1_rel_after)*w1*m1/(w2*m2);
226 u1x_rel *= u1_rel_after/u1_rel;
227 u1y_rel *= u1_rel_after/u1_rel;
228 u1z_rel *= u1_rel_after/u1_rel;
229 amrex::ParticleReal u2x_rel = u2_rel_after*u1x_rel/u1_rel_after;
230 amrex::ParticleReal u2y_rel = u2_rel_after*u1y_rel/u1_rel_after;
231 amrex::ParticleReal u2z_rel = u2_rel_after*u1z_rel/u1_rel_after;
232 amrex::ParticleReal p3x_rel = (Ephoton/
PhysConst::c)*u1x_rel/u1_rel_after;
233 amrex::ParticleReal p3y_rel = (Ephoton/
PhysConst::c)*u1y_rel/u1_rel_after;
234 amrex::ParticleReal p3z_rel = (Ephoton/
PhysConst::c)*u1z_rel/u1_rel_after;
247 if (create_photons) {
250 const auto product_index = products_np_data[0] + p_offsets[i];
251 copy_species1[0](soa_products_data[0], soa_1, i1,
252 static_cast<int>(product_index), engine);
255 soa_products_data[0].m_rdata[
PIdx::w][product_index] = wp;
257 amrex::ParticleReal & upx = soa_products_data[0].m_rdata[
PIdx::ux][product_index];
258 amrex::ParticleReal & upy = soa_products_data[0].m_rdata[
PIdx::uy][product_index];
259 amrex::ParticleReal & upz = soa_products_data[0].m_rdata[
PIdx::uz][product_index];
272 const auto start_index = int(products_np[i]);
273 const auto stop_index = int(products_np[i] + num_added_vec[i]);
276 pc_products[i]->getUserRealAttribs(), pc_products[i]->getUserIntAttribs(),
277 pc_products[i]->GetRealSoANames(), pc_products[i]->GetIntSoANames(),
278 pc_products[i]->getUserRealAttribParser(),
279 pc_products[i]->getUserIntAttribParser(),
283 pc_products[i]->get_breit_wheeler_engine_ptr(),
284 pc_products[i]->get_quantum_sync_engine_ptr(),
286 pc_products[i]->getIonizationInitialLevel(),
287 start_index, stop_index);
292 return num_added_vec;