aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp
diff options
context:
space:
mode:
authorGravatar Luca Fedeli <luca.fedeli@cea.fr> 2020-03-17 15:25:42 +0100
committerGravatar GitHub <noreply@github.com> 2020-03-17 07:25:42 -0700
commit314acff8ddd7ca7af3af9a65c43908acc266533f (patch)
tree85c5bc45be68d1de3b665e44f50bad2633b9bba2 /Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp
parent573489f64d977fff8ea2480858581fc2b72ee451 (diff)
downloadWarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.tar.gz
WarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.tar.zst
WarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.zip
Add QED particle creaction routines (#698)
* Initial work to add back QED particle generation * Work in progress: port old QED routines * Add two distinct CopyFuncs * modified getMFItInfo and CopyFunc (not working) * bugfixing & work to add back QED particle creation routines * bugfixing * added back quantum photon emission * bugfixing * bugfixing * added back pair generation (still some bugs in photon emission) * removed unwanted check * bugfixing * bugfixing * bugfixing * Moved QED folder * added comments + some refactoring * added comments * remove some virtual functions to make lgtm happy * updated tests * added PhysicalParticleType * bugfixing * added copyright * improved comments * improved comments * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * moved inclusion of QEDInternals folder * moved some inclusion directives between Make files * moved some inclusion directives between Make files (forgot to add a file) * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * corrected alignment * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * removed some unnecessary amrex:: * add missing comment * Replaced BL_PROFILE with WARPX_PROFILE * bugfixing and making some variables const * removed some moves * removed some moves * started to change tau into optical_depth_BW or optical_depth_QSR * Using initialization policy to initialize optical depth * bugfixing * forgot to add a file * fixed bug * Revert "fixed bug" This reverts commit a3fb98d10cc30327635aeaa71451a05ca2229ff4. * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Added doQEDEvents to OneStep_sub1 * add a bunch of const * add _rt suffix * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * added path to included files * Introduced a templated AmIA<something> function using physical_species * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * added paths to included headers * updated documentation * updated examples * bugfixing * bugfixing * fixing examples * fixed example * fixed example * correct a misprint in error message * fixed issue related to 1./mass for photons * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * make the use of energy_threshold more transparent * remove unnecessary checks * bigfixing * added comment * separate checks for QED processes * added a CheckIonizationProductSpecies for consistency * bugfixing * now using a new variable for photon energy creation threshold * removed unwanted comment * added option to set a user-defined threshold for photon creation * bugfixing * updated documentation * updated example to include new option * updated doc * fixed merge conflict * correct bug in example * reorganized function Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> Co-authored-by: MaxThevenet <mthevenet@lbl.gov>
Diffstat (limited to 'Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp')
-rw-r--r--Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp223
1 files changed, 223 insertions, 0 deletions
diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp
new file mode 100644
index 000000000..e1eb55714
--- /dev/null
+++ b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp
@@ -0,0 +1,223 @@
+/* Copyright 2019 Luca Fedeli, Maxence Thevenet
+ *
+ * This file is part of WarpX.
+ *
+ * License: BSD-3-Clause-LBNL
+ */
+#include "BreitWheelerEngineWrapper.H"
+
+#include "QedTableParserHelperFunctions.H"
+#include "BreitWheelerDummyTable.H"
+
+#include <utility>
+
+using namespace std;
+using namespace QedUtils;
+using namespace amrex;
+
+//This file provides a wrapper aroud the breit_wheeler engine
+//provided by the PICSAR library
+
+// Factory class =============================
+
+BreitWheelerEngine::BreitWheelerEngine (){}
+
+BreitWheelerGetOpticalDepth
+BreitWheelerEngine::build_optical_depth_functor ()
+{
+ return BreitWheelerGetOpticalDepth();
+}
+
+BreitWheelerEvolveOpticalDepth
+BreitWheelerEngine::build_evolve_functor ()
+{
+ AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized);
+
+ return BreitWheelerEvolveOpticalDepth(m_innards);
+}
+
+BreitWheelerGeneratePairs
+BreitWheelerEngine::build_pair_functor ()
+{
+ AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized);
+
+ return BreitWheelerGeneratePairs(m_innards);
+}
+
+bool BreitWheelerEngine::are_lookup_tables_initialized () const
+{
+ return m_lookup_tables_initialized;
+}
+
+bool
+BreitWheelerEngine::init_lookup_tables_from_raw_data (
+ const Vector<char>& raw_data)
+{
+ const char* p_data = raw_data.data();
+ const char* const p_last = &raw_data.back();
+ bool is_ok;
+
+ //Header (control parameters)
+ tie(is_ok, m_innards.ctrl.chi_phot_min, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_min)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tdndt_min, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_min)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tdndt_max, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_max)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tdndt_how_many, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_how_many)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tpair_min, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_min)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tpair_max, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_max)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_phot_tpair_how_many, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_how_many)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ tie(is_ok, m_innards.ctrl.chi_frac_tpair_how_many, p_data) =
+ parse_raw_data<decltype(m_innards.ctrl.chi_frac_tpair_how_many)>(
+ p_data, p_last);
+ if(!is_ok) return false;
+
+ //___________________________
+
+ //Data
+ Vector<Real> tndt_coords(m_innards.ctrl.chi_phot_tdndt_how_many);
+ Vector<Real> tndt_data(m_innards.ctrl.chi_phot_tdndt_how_many);
+ Vector<Real> cum_tab_coords1(m_innards.ctrl.chi_phot_tpair_how_many);
+ Vector<Real> cum_tab_coords2(m_innards.ctrl.chi_frac_tpair_how_many);
+ Vector<Real> cum_tab_data(m_innards.ctrl.chi_phot_tpair_how_many*
+ m_innards.ctrl.chi_frac_tpair_how_many);
+
+ tie(is_ok, tndt_coords, p_data) =
+ parse_raw_data_vec<Real>(
+ p_data, tndt_coords.size(), p_last);
+ if(!is_ok) return false;
+ m_innards.TTfunc_coords.assign(tndt_coords.begin(), tndt_coords.end());
+
+ tie(is_ok, tndt_data, p_data) =
+ parse_raw_data_vec<Real>(
+ p_data, tndt_data.size(), p_last);
+ if(!is_ok) return false;
+ m_innards.TTfunc_data.assign(tndt_data.begin(), tndt_data.end());
+
+ tie(is_ok, cum_tab_coords1, p_data) =
+ parse_raw_data_vec<Real>(
+ p_data, cum_tab_coords1.size(), p_last);
+ if(!is_ok) return false;
+ m_innards.cum_distrib_coords_1.assign(
+ cum_tab_coords1.begin(), cum_tab_coords1.end());
+
+ tie(is_ok, cum_tab_coords2, p_data) =
+ parse_raw_data_vec<Real>(
+ p_data, cum_tab_coords2.size(), p_last);
+ if(!is_ok) return false;
+ m_innards.cum_distrib_coords_2.assign(
+ cum_tab_coords2.begin(), cum_tab_coords2.end());
+
+ tie(is_ok, cum_tab_data, p_data) =
+ parse_raw_data_vec<Real>(
+ p_data, cum_tab_data.size(), p_last);
+ if(!is_ok) return false;
+ m_innards.cum_distrib_data.assign(
+ cum_tab_data.begin(), cum_tab_data.end());
+
+ //___________________________
+ m_lookup_tables_initialized = true;
+
+ return true;
+}
+
+void BreitWheelerEngine::init_dummy_tables()
+{
+ m_innards.ctrl = QedUtils::BreitWheelerEngineInnardsDummy.ctrl;
+ m_innards.TTfunc_coords.assign(
+ QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_coords.begin(),
+ QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_coords.end());
+ m_innards.TTfunc_data.assign(
+ QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_data.begin(),
+ QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_data.end());
+ m_innards.cum_distrib_coords_1.assign(
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_1.begin(),
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_1.end());
+ m_innards.cum_distrib_coords_2.assign(
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_2.begin(),
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_2.end());
+ m_innards.cum_distrib_data.assign(
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_data.begin(),
+ QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_data.end());
+
+ m_lookup_tables_initialized = true;
+}
+
+Vector<char> BreitWheelerEngine::export_lookup_tables_data () const
+{
+ Vector<char> res{};
+
+ if(!m_lookup_tables_initialized)
+ return res;
+
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_min, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_min, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_max, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_how_many, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_min, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_max, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_how_many, 1, res);
+ add_data_to_vector_char(&m_innards.ctrl.chi_frac_tpair_how_many, 1, res);
+
+ add_data_to_vector_char(m_innards.TTfunc_coords.data(),
+ m_innards.TTfunc_coords.size(), res);
+ add_data_to_vector_char(m_innards.TTfunc_data.data(),
+ m_innards.TTfunc_data.size(), res);
+ add_data_to_vector_char(m_innards.cum_distrib_coords_1.data(),
+ m_innards.cum_distrib_coords_1.size(), res);
+ add_data_to_vector_char(m_innards.cum_distrib_coords_2.data(),
+ m_innards.cum_distrib_coords_2.size(), res);
+ add_data_to_vector_char(m_innards.cum_distrib_data.data(),
+ m_innards.cum_distrib_data.size(), res);
+
+ return res;
+}
+
+PicsarBreitWheelerCtrl
+BreitWheelerEngine::get_default_ctrl() const
+{
+ return PicsarBreitWheelerCtrl();
+}
+
+const PicsarBreitWheelerCtrl&
+BreitWheelerEngine::get_ref_ctrl() const
+{
+ return m_innards.ctrl;
+}
+
+void BreitWheelerEngine::compute_lookup_tables (
+ PicsarBreitWheelerCtrl ctrl)
+{
+#ifdef WARPX_QED_TABLE_GEN
+ m_table_builder.compute_table(ctrl, m_innards);
+ m_lookup_tables_initialized = true;
+#endif
+}
+
+//============================================