diff --git a/src/particles/plasma/PlasmaParticleContainer.H b/src/particles/plasma/PlasmaParticleContainer.H index cfd61aef13..7c43727dfb 100644 --- a/src/particles/plasma/PlasmaParticleContainer.H +++ b/src/particles/plasma/PlasmaParticleContainer.H @@ -147,12 +147,14 @@ public: * \param[in] a_radius plasma radius. Only particles with x**2+y**2a_hollow_core_radius**2 are injected + * \param[in] a_temperature_width Spatial extent of the temperature profile, assuming Gaussian shape. */ void InitParticles ( const amrex::RealVect& a_thermal_momentum_std, const amrex::RealVect& a_thermal_momentum_mean, const amrex::Real a_radius, - const amrex::Real a_hollow_core_radius); + const amrex::Real a_hollow_core_radius, + const amrex::Real a_temperature_width); /** Initialize ADK prefactors of ionizable plasmas * @@ -265,6 +267,7 @@ public: amrex::RealVect m_u_std {0,0,0}; /**< Thermal momentum in each direction normalized by m*c */ amrex::Real m_temperature_in_ev {0.}; /**< Temperature of the plasma in eV */ /** whether to add a neutralizing background of immobile particles of opposite charge */ + amrex::Real m_temperature_width {std::numeric_limits::max()}; bool m_neutralize_background = true; // general: diff --git a/src/particles/plasma/PlasmaParticleContainer.cpp b/src/particles/plasma/PlasmaParticleContainer.cpp index 23f085edb3..e0c812d7d0 100644 --- a/src/particles/plasma/PlasmaParticleContainer.cpp +++ b/src/particles/plasma/PlasmaParticleContainer.cpp @@ -148,6 +148,7 @@ PlasmaParticleContainer::ReadParameters () queryWithParser(pp, "u_mean", m_u_mean); bool thermal_momentum_is_specified = queryWithParser(pp, "u_std", m_u_std); bool temperature_is_specified = queryWithParser(pp, "temperature_in_ev", m_temperature_in_ev); + queryWithParser(pp, "temperature_width", m_temperature_width); AMREX_ALWAYS_ASSERT_WITH_MESSAGE( !(temperature_is_specified && thermal_momentum_is_specified), "Please specify exlusively either a temperature or the thermal momentum"); @@ -280,7 +281,7 @@ PlasmaParticleContainer::InitData (const amrex::Vector& geom3d) "to use the fine plasma patch feature"); } - InitParticles(m_u_std, m_u_mean, m_radius, m_hollow_core_radius); + InitParticles(m_u_std, m_u_mean, m_radius, m_hollow_core_radius, m_temperature_width); if (m_insitu_period.isNonZero()) { #ifdef HIPACE_USE_OPENPMD diff --git a/src/particles/plasma/PlasmaParticleContainerInit.cpp b/src/particles/plasma/PlasmaParticleContainerInit.cpp index 02b6e2ca1d..49bdd2ef93 100644 --- a/src/particles/plasma/PlasmaParticleContainerInit.cpp +++ b/src/particles/plasma/PlasmaParticleContainerInit.cpp @@ -19,7 +19,8 @@ PlasmaParticleContainer:: InitParticles (const amrex::RealVect& a_u_std, const amrex::RealVect& a_u_mean, const amrex::Real a_radius, - const amrex::Real a_hollow_core_radius) + const amrex::Real a_hollow_core_radius, + const amrex::Real a_temperature_width) { HIPACE_PROFILE("PlasmaParticleContainer::InitParticles()"); using namespace amrex::literals; @@ -305,6 +306,9 @@ InitParticles (const amrex::RealVect& a_u_std, amrex::Real u[3] = {0.,0.,0.}; ParticleUtil::get_gaussian_random_momentum(u, a_u_mean, a_u_std, engine); + u[0] *= std::exp(-(x*x+y*y)/a_temperature_width/a_temperature_width); + u[1] *= std::exp(-(x*x+y*y)/a_temperature_width/a_temperature_width); + u[2] *= std::exp(-(x*x+y*y)/a_temperature_width/a_temperature_width); ptd.rdata(PlasmaIdx::ux)[pidx] = u[0]; ptd.rdata(PlasmaIdx::uy)[pidx] = u[1];