aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Particles/Gather/GetExternalFields.H10
-rw-r--r--Source/Particles/Gather/GetExternalFields.cpp19
-rw-r--r--Source/Particles/MultiParticleContainer.H6
-rw-r--r--Source/Particles/MultiParticleContainer.cpp25
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();
}