diff options
-rw-r--r-- | Source/Particles/PhysicalParticleContainer.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 981dce211..97f890f33 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -1392,8 +1392,10 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt) InjectorPosition* inj_pos = plasma_injector->getInjectorPosition(); InjectorDensity* inj_rho = plasma_injector->getInjectorDensity(); InjectorMomentum* inj_mom = plasma_injector->getInjectorMomentum(); - Real density_min = plasma_injector->density_min; - Real density_max = plasma_injector->density_max; + const amrex::Real density_min = plasma_injector->density_min; + const amrex::Real density_max = plasma_injector->density_max; + constexpr int level_zero = 0; + const amrex::Real t = WarpX::GetInstance().gett_new(level_zero); #ifdef WARPX_DIM_RZ const int nmodes = WarpX::n_rz_azimuthal_modes; @@ -1558,6 +1560,26 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt) pa[ia] = soa.GetRealData(ia).data() + old_size; } + // user-defined integer and real attributes + const int n_user_int_attribs = m_user_int_attribs.size(); + const int n_user_real_attribs = m_user_real_attribs.size(); + amrex::Gpu::DeviceVector<int*> pa_user_int(n_user_int_attribs); + amrex::Gpu::DeviceVector<ParticleReal*> pa_user_real(n_user_real_attribs); + amrex::Gpu::DeviceVector< amrex::ParserExecutor<7> > user_int_attrib_parserexec(n_user_int_attribs); + amrex::Gpu::DeviceVector< amrex::ParserExecutor<7> > user_real_attrib_parserexec(n_user_real_attribs); + for (int ia = 0; ia < n_user_int_attribs; ++ia) { + pa_user_int[ia] = soa.GetIntData(particle_icomps[m_user_int_attribs[ia]]).data() + old_size; + user_int_attrib_parserexec[ia] = m_user_int_attrib_parser[ia]->compile<7>(); + } + for (int ia = 0; ia < n_user_real_attribs; ++ia) { + pa_user_real[ia] = soa.GetRealData(particle_comps[m_user_real_attribs[ia]]).data() + old_size; + user_real_attrib_parserexec[ia] = m_user_real_attrib_parser[ia]->compile<7>(); + } + int** pa_user_int_data = pa_user_int.dataPtr(); + ParticleReal** pa_user_real_data = pa_user_real.dataPtr(); + amrex::ParserExecutor<7> const* user_int_parserexec_data = user_int_attrib_parserexec.dataPtr(); + amrex::ParserExecutor<7> const* user_real_parserexec_data = user_real_attrib_parserexec.dataPtr(); + int* p_ion_level = nullptr; if (do_field_ionization) { p_ion_level = soa.GetIntData(particle_icomps["ionizationLevel"]).data() + old_size; @@ -1719,6 +1741,14 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt) p_optical_depth_BW[ip] = breit_wheeler_get_opt(engine); } #endif + // Initialize user-defined integers with user-defined parser + for (int ia = 0; ia < n_user_int_attribs; ++ia) { + pa_user_int_data[ia][ip] = static_cast<int>(user_int_parserexec_data[ia](pos.x, pos.y, pos.z, u.x, u.y, u.z, t)); + } + // Initialize user-defined real attributes with user-defined parser + for (int ia = 0; ia < n_user_real_attribs; ++ia) { + pa_user_real_data[ia][ip] = user_real_parserexec_data[ia](pos.x, pos.y, pos.z, u.x, u.y, u.z, t); + } Real weight = dens * scale_fac * dt; #ifdef WARPX_DIM_RZ |