diff options
Diffstat (limited to 'Source/Particles')
-rw-r--r-- | Source/Particles/MultiParticleContainer.H | 12 | ||||
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 24 | ||||
-rw-r--r-- | Source/Particles/PhysicalParticleContainer.cpp | 39 |
3 files changed, 33 insertions, 42 deletions
diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H index 8d951263e..5f809f2cc 100644 --- a/Source/Particles/MultiParticleContainer.H +++ b/Source/Particles/MultiParticleContainer.H @@ -223,13 +223,13 @@ public: amrex::Vector<amrex::Real> m_B_external_particle; amrex::Vector<amrex::Real> m_E_external_particle; // ParserWrapper for B_external on the particle - std::unique_ptr<ParserWrapper> m_Bx_particle_parser; - std::unique_ptr<ParserWrapper> m_By_particle_parser; - std::unique_ptr<ParserWrapper> m_Bz_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_Bx_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_By_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_Bz_particle_parser; // ParserWrapper for E_external on the particle - std::unique_ptr<ParserWrapper> m_Ex_particle_parser; - std::unique_ptr<ParserWrapper> m_Ey_particle_parser; - std::unique_ptr<ParserWrapper> m_Ez_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_Ex_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_Ey_particle_parser; + std::unique_ptr<ParserWrapper<4> > m_Ez_particle_parser; protected: diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index ac3bac467..6252d1ac4 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -130,12 +130,12 @@ MultiParticleContainer::ReadParameters () str_Bz_ext_particle_function); // Parser for B_external on the particle - m_Bx_particle_parser.reset(new ParserWrapper( - makeParser(str_Bx_ext_particle_function))); - m_By_particle_parser.reset(new ParserWrapper( - makeParser(str_By_ext_particle_function))); - m_Bz_particle_parser.reset(new ParserWrapper( - makeParser(str_Bz_ext_particle_function))); + m_Bx_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_Bx_ext_particle_function,{"x","y","z","t"}))); + m_By_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_By_ext_particle_function,{"x","y","z","t"}))); + m_Bz_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_Bz_ext_particle_function,{"x","y","z","t"}))); } @@ -155,12 +155,12 @@ MultiParticleContainer::ReadParameters () Store_parserString(pp, "Ez_external_particle_function(x,y,z,t)", str_Ez_ext_particle_function); // Parser for E_external on the particle - m_Ex_particle_parser.reset(new ParserWrapper( - makeParser(str_Ex_ext_particle_function))); - m_Ey_particle_parser.reset(new ParserWrapper( - makeParser(str_Ey_ext_particle_function))); - m_Ez_particle_parser.reset(new ParserWrapper( - makeParser(str_Ez_ext_particle_function))); + m_Ex_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_Ex_ext_particle_function,{"x","y","z","t"}))); + m_Ey_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_Ey_ext_particle_function,{"x","y","z","t"}))); + m_Ez_particle_parser.reset(new ParserWrapper<4>( + makeParser(str_Ez_ext_particle_function,{"x","y","z","t"}))); } diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 6572657ff..0277a9fe6 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -553,7 +553,6 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox) overlap_realbox.lo(1), overlap_realbox.lo(2))}; - std::size_t shared_mem_bytes = plasma_injector->sharedMemoryNeeded(); int lrrfac = rrfac; bool loc_do_field_ionization = do_field_ionization; @@ -738,7 +737,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox) p.pos(0) = xb; p.pos(1) = z; #endif - }, shared_mem_bytes); + }); if (cost) { wt = (amrex::second() - wt) / tile_box.d_numPts(); @@ -992,44 +991,36 @@ PhysicalParticleContainer::AssignExternalFieldOnParticles(WarpXParIter& pti, Real* const AMREX_RESTRICT Exp_data = Exp.dataPtr(); Real* const AMREX_RESTRICT Eyp_data = Eyp.dataPtr(); Real* const AMREX_RESTRICT Ezp_data = Ezp.dataPtr(); - ParserWrapper *xfield_partparser = mypc.m_Ex_particle_parser.get(); - ParserWrapper *yfield_partparser = mypc.m_Ey_particle_parser.get(); - ParserWrapper *zfield_partparser = mypc.m_Ez_particle_parser.get(); + ParserWrapper<4> *xfield_partparser = mypc.m_Ex_particle_parser.get(); + ParserWrapper<4> *yfield_partparser = mypc.m_Ey_particle_parser.get(); + ParserWrapper<4> *zfield_partparser = mypc.m_Ez_particle_parser.get(); Real time = warpx.gett_new(lev); amrex::ParallelFor(pti.numParticles(), [=] AMREX_GPU_DEVICE (long i) { ParticleReal x, y, z; GetPosition(i, x, y, z); - Exp_data[i] = xfield_partparser->getField(x, y, z, time); - Eyp_data[i] = yfield_partparser->getField(x, y, z, time); - Ezp_data[i] = zfield_partparser->getField(x, y, z, time); - }, - /* To allocate shared memory for the GPU threads. */ - /* But, for now only 4 doubles (x,y,z,t) are allocated. */ - amrex::Gpu::numThreadsPerBlockParallelFor() * sizeof(double) * 4 - ); + Exp_data[i] = (*xfield_partparser)(x, y, z, time); + Eyp_data[i] = (*yfield_partparser)(x, y, z, time); + Ezp_data[i] = (*zfield_partparser)(x, y, z, time); + }); } if (mypc.m_B_ext_particle_s=="parse_b_ext_particle_function") { const auto GetPosition = GetParticlePosition(pti); Real* const AMREX_RESTRICT Bxp_data = Bxp.dataPtr(); Real* const AMREX_RESTRICT Byp_data = Byp.dataPtr(); Real* const AMREX_RESTRICT Bzp_data = Bzp.dataPtr(); - ParserWrapper *xfield_partparser = mypc.m_Bx_particle_parser.get(); - ParserWrapper *yfield_partparser = mypc.m_By_particle_parser.get(); - ParserWrapper *zfield_partparser = mypc.m_Bz_particle_parser.get(); + ParserWrapper<4> *xfield_partparser = mypc.m_Bx_particle_parser.get(); + ParserWrapper<4> *yfield_partparser = mypc.m_By_particle_parser.get(); + ParserWrapper<4> *zfield_partparser = mypc.m_Bz_particle_parser.get(); Real time = warpx.gett_new(lev); amrex::ParallelFor(pti.numParticles(), [=] AMREX_GPU_DEVICE (long i) { ParticleReal x, y, z; GetPosition(i, x, y, z); - Bxp_data[i] = xfield_partparser->getField(x, y, z, time); - Byp_data[i] = yfield_partparser->getField(x, y, z, time); - Bzp_data[i] = zfield_partparser->getField(x, y, z, time); - }, - /* To allocate shared memory for the GPU threads. */ - /* But, for now only 4 doubles (x,y,z,t) are allocated. */ - amrex::Gpu::numThreadsPerBlockParallelFor() * sizeof(double) * 4 - ); + Bxp_data[i] = (*xfield_partparser)(x, y, z, time); + Byp_data[i] = (*yfield_partparser)(x, y, z, time); + Bzp_data[i] = (*zfield_partparser)(x, y, z, time); + }); } } |