diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Particles/ParticleCreation/DefaultInitialization.H | 114 | ||||
-rw-r--r-- | Source/Particles/ParticleCreation/ElementaryProcess.H | 2 | ||||
-rw-r--r-- | Source/Particles/ParticleCreation/Make.package | 3 | ||||
-rw-r--r-- | Source/Particles/ParticleCreation/SmartCopy.H | 21 | ||||
-rw-r--r-- | Source/Particles/ParticleCreation/SmartCopy.cpp | 34 | ||||
-rw-r--r-- | Source/Particles/WarpXParticleContainer.H | 3 |
6 files changed, 177 insertions, 0 deletions
diff --git a/Source/Particles/ParticleCreation/DefaultInitialization.H b/Source/Particles/ParticleCreation/DefaultInitialization.H new file mode 100644 index 000000000..e2491a483 --- /dev/null +++ b/Source/Particles/ParticleCreation/DefaultInitialization.H @@ -0,0 +1,114 @@ +#ifndef DEFAULTINITIALIZATION_H_ +#define DEFAULTINITIALIZATION_H_ + +#include "AMReX_REAL.H" +#include "AMReX_GpuContainers.H" + +#include <map> +#include <string> + +/** + * \brief This set of initialization policies describes what happens + * when we need to create a new particle due to an elementary process. + * For example, when an ionization event creates an electron, these + * policies control the initial values of the electron's components. + * These can always be over-written later. + * + * The specific meanings are as follows: + * Zero - set the component to zero + * One - set the component to one + * SignalingNan - set the component to a signalling nan. If you run + * with amrex.fpe_trap_invalid=1 AND built the code + * with gcc, this will throw an exception the first time + * it is used. + * RandomTau - a special flag for the "tau" component used by certain + * QED processes, which gets a random initial value. + * + */ +enum struct InitializationPolicy {Zero=0, One, SignalingNan, RandomTau}; + +/** + * \brief This is a functor that implements the above InitializationPolicies + * in a switch statement. It is designed to be used in device code when + * running on GPUs. + */ +struct DefaultInitializer +{ + const InitializationPolicy* m_policies; + + AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE + amrex::Real operator() (int j) const noexcept + { + switch (m_policies[j]) { + case InitializationPolicy::Zero : return 0.0; + case InitializationPolicy::One : return 1.0; + case InitializationPolicy::SignalingNan : { + return 1.0; + } + case InitializationPolicy::RandomTau : { + return 1.0; + } + default : { + amrex::Abort("Initialization Policy not recognized"); + return 1.0; + } + } + } +}; + +/** + * \brief This map sets the initialization policy for each particle component + * used in WarpX. + */ +static std::map<std::string, InitializationPolicy> initialization_policies = { + {"w", InitializationPolicy::Zero }, + {"ux", InitializationPolicy::Zero }, + {"uy", InitializationPolicy::Zero }, + {"uz", InitializationPolicy::Zero }, + {"Ex", InitializationPolicy::Zero }, + {"Ey", InitializationPolicy::Zero }, + {"Ez", InitializationPolicy::Zero }, + {"Bx", InitializationPolicy::Zero }, + {"By", InitializationPolicy::Zero }, + {"Bz", InitializationPolicy::Zero }, + #ifdef WARPX_DIM_RZ + {"theta", InitializationPolicy::Zero}, + #endif + {"tau", InitializationPolicy::RandomTau} +}; + +/** + * \brief This is a factory class that creates instances of "DefaultInitializer". + * Each particle type in WarpX has one of these associated with it. While + * "DefaultInitializer" is a lightweight class intended to be used on the device, + * this class is meant to be used on the host. + */ +class DefaultInitializerFactory +{ + amrex::Gpu::DeviceVector<InitializationPolicy> m_policies; + bool m_defined; + +public: + + DefaultInitializerFactory () noexcept : m_defined(false) {}; + + void define (const std::map<std::string, int>& comps) noexcept + { + m_policies.resize(comps.size()); + for (const auto& kv : comps) + { + m_policies[kv.second] = initialization_policies[kv.first]; + m_defined = true; + } + } + + DefaultInitializer getDefaultInitializer () const noexcept + { + AMREX_ASSERT(m_defined); + return DefaultInitializer{m_policies.dataPtr()}; + } + + bool isDefined () const noexcept { return m_defined; } +}; + +#endif diff --git a/Source/Particles/ParticleCreation/ElementaryProcess.H b/Source/Particles/ParticleCreation/ElementaryProcess.H index 6c9bdc626..bd9342e46 100644 --- a/Source/Particles/ParticleCreation/ElementaryProcess.H +++ b/Source/Particles/ParticleCreation/ElementaryProcess.H @@ -4,6 +4,8 @@ #include "WarpXParticleContainer.H" #include "CopyParticle.H" #include "TransformParticle.H" +#include "DefaultInitialization.H" +#include "SmartCopy.H" /** * \brief Base class for particle creation processes diff --git a/Source/Particles/ParticleCreation/Make.package b/Source/Particles/ParticleCreation/Make.package index 6e32f4a77..53c57c231 100644 --- a/Source/Particles/ParticleCreation/Make.package +++ b/Source/Particles/ParticleCreation/Make.package @@ -1,6 +1,9 @@ CEXE_headers += ElementaryProcess.H CEXE_headers += CopyParticle.H CEXE_headers += TransformParticle.H +CEXE_headers += DefaultInitialization.H +CEXE_headers += SmartCopy.H +CEXE_sources += SmartCopy.cpp INCLUDE_LOCATIONS += $(WARPX_HOME)/Source/Particles/ParticleCreation/ VPATH_LOCATIONS += $(WARPX_HOME)/Source/Particles/ParticleCreation/ diff --git a/Source/Particles/ParticleCreation/SmartCopy.H b/Source/Particles/ParticleCreation/SmartCopy.H new file mode 100644 index 000000000..dffe5a773 --- /dev/null +++ b/Source/Particles/ParticleCreation/SmartCopy.H @@ -0,0 +1,21 @@ +#ifndef SMART_COPY_H_ +#define SMART_COPY_H_ + +#include <map> +#include <string> +#include <vector> + +using NameMap = std::map<std::string, int>; + +struct SmartCopyTag +{ + std::vector<std::string> common_names; + std::vector<int> src_comps; + std::vector<int> dst_comps; + + int size () const noexcept { return common_names.size(); } +}; + +SmartCopyTag getSmartCopyTag (const NameMap& src, const NameMap& dst); + +#endif diff --git a/Source/Particles/ParticleCreation/SmartCopy.cpp b/Source/Particles/ParticleCreation/SmartCopy.cpp new file mode 100644 index 000000000..88e687503 --- /dev/null +++ b/Source/Particles/ParticleCreation/SmartCopy.cpp @@ -0,0 +1,34 @@ +#include "SmartCopy.H" + +SmartCopyTag getSmartCopyTag (const NameMap& src, const NameMap& dst) +{ + SmartCopyTag tag; + + // we use the fact that maps are sorted + auto i_src = src.begin(); + auto i_dst = dst.begin(); + while ( (i_src != src.end()) and (i_dst != dst.end()) ) + { + if (i_src->first < i_dst->first) + { + // names are not the same and src is lower + ++i_src; + } + else if (i_src->first > i_dst->first) + { + // names are not the same and dst is lower + ++i_dst; + } + else + { + // name is in both... + tag.common_names.push_back(i_src->first); + tag.src_comps.push_back(i_src->second); + tag.dst_comps.push_back(i_dst->second); + ++i_src; + ++i_dst; + } + } + + return tag; +} diff --git a/Source/Particles/WarpXParticleContainer.H b/Source/Particles/WarpXParticleContainer.H index fa5c586da..33c10e8de 100644 --- a/Source/Particles/WarpXParticleContainer.H +++ b/Source/Particles/WarpXParticleContainer.H @@ -2,6 +2,7 @@ #define WARPX_WarpXParticleContainer_H_ #include "WarpXDtType.H" +#include "DefaultInitialization.H" #include <AMReX_Particles.H> #include <AMReX_AmrCore.H> @@ -396,6 +397,8 @@ protected: amrex::Vector<std::map<PairIndex, std::array<DataContainer, TmpIdx::nattribs> > > tmp_particle_data; + DefaultInitializerFactory m_default_initializer_factory; + private: virtual void particlePostLocate(ParticleType& p, const amrex::ParticleLocData& pld, const int lev) override; |