From 314acff8ddd7ca7af3af9a65c43908acc266533f Mon Sep 17 00:00:00 2001 From: Luca Fedeli Date: Tue, 17 Mar 2020 15:25:42 +0100 Subject: 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 * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * 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 * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/MultiParticleContainer.H Co-Authored-By: Axel Huebl * corrected alignment * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl * 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 * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Added doQEDEvents to OneStep_sub1 * add a bunch of const * add _rt suffix * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * added path to included files * Introduced a templated AmIA function using physical_species * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet * 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 * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet * 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 Co-authored-by: MaxThevenet --- .../QEDInternals/BreitWheelerEngineWrapper.cpp | 223 +++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp (limited to 'Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp') 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 + +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& 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( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, m_innards.ctrl.chi_phot_tdndt_min, p_data) = + parse_raw_data( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, m_innards.ctrl.chi_phot_tdndt_max, p_data) = + parse_raw_data( + 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( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, m_innards.ctrl.chi_phot_tpair_min, p_data) = + parse_raw_data( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, m_innards.ctrl.chi_phot_tpair_max, p_data) = + parse_raw_data( + 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( + 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( + p_data, p_last); + if(!is_ok) return false; + + //___________________________ + + //Data + Vector tndt_coords(m_innards.ctrl.chi_phot_tdndt_how_many); + Vector tndt_data(m_innards.ctrl.chi_phot_tdndt_how_many); + Vector cum_tab_coords1(m_innards.ctrl.chi_phot_tpair_how_many); + Vector cum_tab_coords2(m_innards.ctrl.chi_frac_tpair_how_many); + Vector 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( + 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( + 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( + 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( + 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( + 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 BreitWheelerEngine::export_lookup_tables_data () const +{ + Vector 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 +} + +//============================================ -- cgit v1.2.3