aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/ParticleCreation/DefaultInitialization.H
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/ParticleCreation/DefaultInitialization.H')
-rw-r--r--Source/Particles/ParticleCreation/DefaultInitialization.H86
1 files changed, 86 insertions, 0 deletions
diff --git a/Source/Particles/ParticleCreation/DefaultInitialization.H b/Source/Particles/ParticleCreation/DefaultInitialization.H
new file mode 100644
index 000000000..f2f0dd3d8
--- /dev/null
+++ b/Source/Particles/ParticleCreation/DefaultInitialization.H
@@ -0,0 +1,86 @@
+#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 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}
+};
+
+AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
+amrex::ParticleReal initializeRealValue (const InitializationPolicy policy) noexcept
+{
+ switch (policy) {
+ 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;
+ }
+ }
+}
+
+AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
+int initializeIntValue (const InitializationPolicy policy) noexcept
+{
+ switch (policy) {
+ case InitializationPolicy::Zero : return 0;
+ case InitializationPolicy::One : return 1;
+ case InitializationPolicy::SignalingNan : {
+ return 1;
+ }
+ default : {
+ amrex::Abort("Initialization Policy not recognized");
+ return 1;
+ }
+ }
+}
+
+#endif