aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp34
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