diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Particles/Gather/GetExternalFields.H | 10 | ||||
-rw-r--r-- | Source/Particles/Gather/GetExternalFields.cpp | 19 | ||||
-rw-r--r-- | Source/Particles/MultiParticleContainer.H | 6 | ||||
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 25 |
4 files changed, 48 insertions, 12 deletions
diff --git a/Source/Particles/Gather/GetExternalFields.H b/Source/Particles/Gather/GetExternalFields.H index 468b8d078..c09d13ab3 100644 --- a/Source/Particles/Gather/GetExternalFields.H +++ b/Source/Particles/Gather/GetExternalFields.H @@ -34,6 +34,7 @@ struct GetExternalField const amrex::Real* AMREX_RESTRICT m_repeated_plasma_lens_lengths = nullptr; const amrex::Real* AMREX_RESTRICT m_repeated_plasma_lens_strengths = nullptr; int m_n_lenses; + int m_lens_is_electric; amrex::Real m_dt; const amrex::ParticleReal* AMREX_RESTRICT m_ux = nullptr; const amrex::ParticleReal* AMREX_RESTRICT m_uy = nullptr; @@ -94,8 +95,13 @@ struct GetExternalField if (fl > fr) frac = (lens_end - zl)*dzi; if (fr > fl) frac = (zr - lens_start)*dzi; - field_x += x*frac*m_repeated_plasma_lens_strengths[i_lens]; - field_y += y*frac*m_repeated_plasma_lens_strengths[i_lens]; + if (m_lens_is_electric) { + field_x += x*frac*m_repeated_plasma_lens_strengths[i_lens]; + field_y += y*frac*m_repeated_plasma_lens_strengths[i_lens]; + } else { + field_x += y*frac*m_repeated_plasma_lens_strengths[i_lens]; + field_y -= x*frac*m_repeated_plasma_lens_strengths[i_lens]; + } } else diff --git a/Source/Particles/Gather/GetExternalFields.cpp b/Source/Particles/Gather/GetExternalFields.cpp index 03c4dc2b8..d97a69985 100644 --- a/Source/Particles/Gather/GetExternalFields.cpp +++ b/Source/Particles/Gather/GetExternalFields.cpp @@ -32,6 +32,7 @@ GetExternalEField::GetExternalEField (const WarpXParIter& a_pti, int a_offset) n else if (mypc.m_E_ext_particle_s=="repeated_plasma_lens") { m_type = RepeatedPlasmaLens; + m_lens_is_electric = 1; m_dt = warpx.getdt(a_pti.GetLevel()); m_get_position = GetParticlePosition(a_pti, a_offset); auto& attribs = a_pti.GetAttribs(); @@ -42,7 +43,7 @@ GetExternalEField::GetExternalEField (const WarpXParIter& a_pti, int a_offset) n m_n_lenses = static_cast<int>(mypc.h_repeated_plasma_lens_starts.size()); m_repeated_plasma_lens_starts = mypc.d_repeated_plasma_lens_starts.data(); m_repeated_plasma_lens_lengths = mypc.d_repeated_plasma_lens_lengths.data(); - m_repeated_plasma_lens_strengths = mypc.d_repeated_plasma_lens_strengths.data(); + m_repeated_plasma_lens_strengths = mypc.d_repeated_plasma_lens_strengths_E.data(); } } @@ -66,4 +67,20 @@ GetExternalBField::GetExternalBField (const WarpXParIter& a_pti, int a_offset) n m_yfield_partparser = mypc.m_By_particle_parser->compile<4>(); m_zfield_partparser = mypc.m_Bz_particle_parser->compile<4>(); } + else if (mypc.m_B_ext_particle_s=="repeated_plasma_lens") + { + m_type = RepeatedPlasmaLens; + m_lens_is_electric = 0; + m_dt = warpx.getdt(a_pti.GetLevel()); + m_get_position = GetParticlePosition(a_pti, a_offset); + auto& attribs = a_pti.GetAttribs(); + m_ux = attribs[PIdx::ux].dataPtr() + a_offset; + m_uy = attribs[PIdx::uy].dataPtr() + a_offset; + m_uz = attribs[PIdx::uz].dataPtr() + a_offset; + m_repeated_plasma_lens_period = mypc.m_repeated_plasma_lens_period; + m_n_lenses = static_cast<int>(mypc.h_repeated_plasma_lens_starts.size()); + m_repeated_plasma_lens_starts = mypc.d_repeated_plasma_lens_starts.data(); + m_repeated_plasma_lens_lengths = mypc.d_repeated_plasma_lens_lengths.data(); + m_repeated_plasma_lens_strengths = mypc.d_repeated_plasma_lens_strengths_B.data(); + } } diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H index b59aa4371..afae1d8e0 100644 --- a/Source/Particles/MultiParticleContainer.H +++ b/Source/Particles/MultiParticleContainer.H @@ -299,10 +299,12 @@ public: amrex::Real m_repeated_plasma_lens_period; amrex::Vector<amrex::Real> h_repeated_plasma_lens_starts; amrex::Vector<amrex::Real> h_repeated_plasma_lens_lengths; - amrex::Vector<amrex::Real> h_repeated_plasma_lens_strengths; + amrex::Vector<amrex::Real> h_repeated_plasma_lens_strengths_E; + amrex::Vector<amrex::Real> h_repeated_plasma_lens_strengths_B; amrex::Gpu::DeviceVector<amrex::Real> d_repeated_plasma_lens_starts; amrex::Gpu::DeviceVector<amrex::Real> d_repeated_plasma_lens_lengths; - amrex::Gpu::DeviceVector<amrex::Real> d_repeated_plasma_lens_strengths; + amrex::Gpu::DeviceVector<amrex::Real> d_repeated_plasma_lens_strengths_E; + amrex::Gpu::DeviceVector<amrex::Real> d_repeated_plasma_lens_strengths_B; #ifdef WARPX_QED /** diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index ba8825522..ec4ffe8e1 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -223,28 +223,39 @@ MultiParticleContainer::ReadParameters () } - // if the input string for E_ext_particle_s is + // if the input string for E_ext_particle_s or B_ext_particle_s is // "repeated_plasma_lens" then the plasma lens properties // must be provided in the input file. - if (m_E_ext_particle_s == "repeated_plasma_lens") { + if (m_E_ext_particle_s == "repeated_plasma_lens" || + m_B_ext_particle_s == "repeated_plasma_lens") { queryWithParser(pp_particles, "repeated_plasma_lens_period", m_repeated_plasma_lens_period); getArrWithParser(pp_particles, "repeated_plasma_lens_starts", h_repeated_plasma_lens_starts); getArrWithParser(pp_particles, "repeated_plasma_lens_lengths", h_repeated_plasma_lens_lengths); - getArrWithParser(pp_particles, "repeated_plasma_lens_strengths", h_repeated_plasma_lens_strengths); int n_lenses = static_cast<int>(h_repeated_plasma_lens_starts.size()); d_repeated_plasma_lens_starts.resize(n_lenses); d_repeated_plasma_lens_lengths.resize(n_lenses); - d_repeated_plasma_lens_strengths.resize(n_lenses); amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, h_repeated_plasma_lens_starts.begin(), h_repeated_plasma_lens_starts.end(), d_repeated_plasma_lens_starts.begin()); amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, h_repeated_plasma_lens_lengths.begin(), h_repeated_plasma_lens_lengths.end(), d_repeated_plasma_lens_lengths.begin()); - amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, - h_repeated_plasma_lens_strengths.begin(), h_repeated_plasma_lens_strengths.end(), - d_repeated_plasma_lens_strengths.begin()); + + if (m_E_ext_particle_s == "repeated_plasma_lens") { + getArrWithParser(pp_particles, "repeated_plasma_lens_strengths_E", h_repeated_plasma_lens_strengths_E); + d_repeated_plasma_lens_strengths_E.resize(n_lenses); + amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, + h_repeated_plasma_lens_strengths_E.begin(), h_repeated_plasma_lens_strengths_E.end(), + d_repeated_plasma_lens_strengths_E.begin()); + } + if (m_B_ext_particle_s == "repeated_plasma_lens") { + getArrWithParser(pp_particles, "repeated_plasma_lens_strengths_B", h_repeated_plasma_lens_strengths_B); + d_repeated_plasma_lens_strengths_B.resize(n_lenses); + amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, + h_repeated_plasma_lens_strengths_B.begin(), h_repeated_plasma_lens_strengths_B.end(), + d_repeated_plasma_lens_strengths_B.begin()); + } amrex::Gpu::synchronize(); } |