aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Particles/ParticleCreation/DefaultInitialization.H114
-rw-r--r--Source/Particles/ParticleCreation/ElementaryProcess.H2
-rw-r--r--Source/Particles/ParticleCreation/Make.package3
-rw-r--r--Source/Particles/ParticleCreation/SmartCopy.H21
-rw-r--r--Source/Particles/ParticleCreation/SmartCopy.cpp34
-rw-r--r--Source/Particles/WarpXParticleContainer.H3
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;