diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Particles/MultiParticleContainer.H | 4 | ||||
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 16 | ||||
-rw-r--r-- | Source/QED/BreitWheelerEngineTableBuilder.H | 5 | ||||
-rw-r--r-- | Source/QED/BreitWheelerEngineWrapper.H | 27 | ||||
-rw-r--r-- | Source/QED/BreitWheelerEngineWrapper.cpp | 185 | ||||
-rw-r--r-- | Source/QED/Make.package | 1 | ||||
-rw-r--r-- | Source/QED/QedTableParserHelperFunctions.H | 44 | ||||
-rw-r--r-- | Source/QED/QedWrapperCommons.H | 23 |
8 files changed, 207 insertions, 98 deletions
diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H index 9e44afdd7..9f52dd0a5 100644 --- a/Source/Particles/MultiParticleContainer.H +++ b/Source/Particles/MultiParticleContainer.H @@ -232,9 +232,9 @@ protected: void InitQuantumSync (); void InitBreitWheeler (); - std::tuple<bool, std::string, WarpXQuantumSynchrotronWrapperCtrl> + std::tuple<bool, std::string, PicsarQuantumSynchrotronCtrl> ParseQuantumSyncParams (); - std::tuple<bool, std::string, WarpXBreitWheelerWrapperCtrl> + std::tuple<bool, std::string, PicsarBreitWheelerCtrl> ParseBreitWheelerParams (); #endif diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index 771943171..afeac1abd 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -759,7 +759,7 @@ void MultiParticleContainer::InitQED () void MultiParticleContainer::InitQuantumSync () { bool is_custom; - WarpXQuantumSynchrotronWrapperCtrl ctrl; + PicsarQuantumSynchrotronCtrl ctrl; std::string filename; std::tie(is_custom, filename, ctrl) = ParseQuantumSyncParams(); @@ -768,13 +768,13 @@ void MultiParticleContainer::InitQuantumSync () // qs_engine.write_lookup_tables("qed_qs_lookup.bin"); // } // amrex::ParallelDescriptor::Barrier(); - qs_engine.read_lookup_tables("qed_qs_lookup.bin"); + // qs_engine.read_lookup_tables("qed_qs_lookup.bin"); } void MultiParticleContainer::InitBreitWheeler () { bool is_custom; - WarpXBreitWheelerWrapperCtrl ctrl; + PicsarBreitWheelerCtrl ctrl; std::string filename; std::tie(is_custom, filename, ctrl) = ParseBreitWheelerParams(); @@ -783,23 +783,23 @@ void MultiParticleContainer::InitBreitWheeler () // bw_engine.write_lookup_tables("qed_bw_lookup.bin"); // } // amrex::ParallelDescriptor::Barrier(); - bw_engine.read_lookup_tables("qed_bw_lookup.bin"); + // bw_engine.read_lookup_tables("qed_bw_lookup.bin"); } -std::tuple<bool,std::string,WarpXQuantumSynchrotronWrapperCtrl> +std::tuple<bool,std::string,PicsarQuantumSynchrotronCtrl> MultiParticleContainer::ParseQuantumSyncParams () { - WarpXQuantumSynchrotronWrapperCtrl ctrl; + PicsarQuantumSynchrotronCtrl ctrl; bool is_custom{false}; return std::make_tuple(is_custom, std::string(""), ctrl); } -std::tuple<bool,std::string,WarpXBreitWheelerWrapperCtrl> +std::tuple<bool,std::string,PicsarBreitWheelerCtrl> MultiParticleContainer::ParseBreitWheelerParams () { - WarpXBreitWheelerWrapperCtrl ctrl; + PicsarBreitWheelerCtrl ctrl; bool is_custom{false}; return std::make_tuple(is_custom, std::string(""), ctrl); diff --git a/Source/QED/BreitWheelerEngineTableBuilder.H b/Source/QED/BreitWheelerEngineTableBuilder.H index bd53ab3cf..0e3e45064 100644 --- a/Source/QED/BreitWheelerEngineTableBuilder.H +++ b/Source/QED/BreitWheelerEngineTableBuilder.H @@ -3,6 +3,9 @@ #include "QedWrapperCommons.H" -class BreitWheelerEngineTableBuilder{}; +class BreitWheelerEngineTableBuilder{ + public: + +}; #endif //WARPX_breit_wheeler_engine_table_builder_h_ diff --git a/Source/QED/BreitWheelerEngineWrapper.H b/Source/QED/BreitWheelerEngineWrapper.H index c6d550732..d42150154 100644 --- a/Source/QED/BreitWheelerEngineWrapper.H +++ b/Source/QED/BreitWheelerEngineWrapper.H @@ -186,37 +186,36 @@ public: /* \brief Builds the functor to generate the pairs */ BreitWheelerGeneratePairs build_pair_functor (); - /* \brief Reads lookup tables from 'file' on disk */ - void read_lookup_tables (std::string file); - /* \brief Checks if lookup tables are properly initialized */ bool are_lookup_tables_initialized () const; -private: - bool lookup_tables_initialized = false; + /* \brief Reads lookup tables from 'file' on disk */ + bool init_lookup_tables_from_raw_data (const std::vector<char>& raw_data); - BreitWheelerEngineInnards innards; + /* \brief Writes lookup tables on disk in 'file' + * return false if it fails. */ + std::vector<char> export_lookup_tables_data () const; -#ifdef WARPX_QED_TABLE_GEN -public: /* \brief Computes the Lookup tables using the default settings * provided by the PICSAR library */ void compute_lookup_tables_default (); /* \brief Computes the Lookup tables using user-defined settings */ - void compute_custom_lookup_tables (WarpXBreitWheelerWrapperCtrl ctrl); + void compute_custom_lookup_tables (PicsarBreitWheelerCtrl ctrl); - /* \brief Writes lookup tables on disk in 'file' - * return false if it fails. */ - bool write_lookup_tables (std::string file) const; +private: + bool lookup_tables_initialized = false; + BreitWheelerEngineInnards innards; + +#ifdef WARPX_QED_TABLE_GEN -private: BreitWheelerEngineTableBuilder table_builder; //Private function which actually computes the lookup tables void computes_lookup_tables ( - WarpXBreitWheelerWrapperCtrl ctrl); + PicsarBreitWheelerCtrl ctrl); + #endif }; diff --git a/Source/QED/BreitWheelerEngineWrapper.cpp b/Source/QED/BreitWheelerEngineWrapper.cpp index c58c652e5..327b76411 100644 --- a/Source/QED/BreitWheelerEngineWrapper.cpp +++ b/Source/QED/BreitWheelerEngineWrapper.cpp @@ -1,4 +1,13 @@ #include "BreitWheelerEngineWrapper.H" + +#include "QedTableParserHelperFunctions.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 @@ -7,13 +16,15 @@ BreitWheelerEngine::BreitWheelerEngine (){} //Builds the functor to initialize the optical depth -BreitWheelerGetOpticalDepth BreitWheelerEngine::build_optical_depth_functor () +BreitWheelerGetOpticalDepth +BreitWheelerEngine::build_optical_depth_functor () { return BreitWheelerGetOpticalDepth(); } //Builds the functor to evolve the optical depth -BreitWheelerEvolveOpticalDepth BreitWheelerEngine::build_evolve_functor () +BreitWheelerEvolveOpticalDepth +BreitWheelerEngine::build_evolve_functor () { AMREX_ALWAYS_ASSERT(lookup_tables_initialized); @@ -21,7 +32,8 @@ BreitWheelerEvolveOpticalDepth BreitWheelerEngine::build_evolve_functor () } //Builds the functor to generate the pairs -BreitWheelerGeneratePairs BreitWheelerEngine::build_pair_functor () +BreitWheelerGeneratePairs +BreitWheelerEngine::build_pair_functor () { AMREX_ALWAYS_ASSERT(lookup_tables_initialized); @@ -34,44 +46,102 @@ bool BreitWheelerEngine::are_lookup_tables_initialized () const } /* \brief Reads lookup tables from 'file' on disk */ -void BreitWheelerEngine::read_lookup_tables (std::string file) +bool +BreitWheelerEngine::init_lookup_tables_from_raw_data ( + const vector<char>& raw_data) { - std::ifstream ifile(file, std::ios::in | std::ios::binary); + const char* p_data = raw_data.data(); + const char* const p_last = &raw_data.back(); + bool is_ok; //Header (control parameters) - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_min), - sizeof(innards.ctrl.chi_phot_min)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tdndt_min), - sizeof(innards.ctrl.chi_phot_tdndt_min)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tdndt_max), - sizeof(innards.ctrl.chi_phot_tdndt_max)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tdndt_how_many), - sizeof(innards.ctrl.chi_phot_tdndt_how_many)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tpair_min), - sizeof(innards.ctrl.chi_phot_tpair_min)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tpair_max), - sizeof(innards.ctrl.chi_phot_tpair_max)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_phot_tpair_how_many), - sizeof(innards.ctrl.chi_phot_tpair_how_many)); - ifile.read(reinterpret_cast<char*>(&innards.ctrl.chi_frac_tpair_how_many), - sizeof(innards.ctrl.chi_frac_tpair_how_many)); - //_______ + tie(is_ok, innards.ctrl.chi_phot_min, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_min)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tdndt_min, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tdndt_min)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tdndt_max, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tdndt_max)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tdndt_how_many, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tdndt_how_many)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tpair_min, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tpair_min)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tpair_max, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tpair_max)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_phot_tpair_how_many, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_phot_tpair_how_many)>( + p_data, p_last); + if(!is_ok) return false; + + tie(is_ok, innards.ctrl.chi_frac_tpair_how_many, p_data) = + parse_raw_data<decltype(innards.ctrl.chi_frac_tpair_how_many)>( + p_data, p_last); + if(!is_ok) return false; + + //___________________________ //Data - size_t size_buf = sizeof(amrex::Real)*innards.ctrl.chi_phot_tdndt_how_many; - char* data_buf = new char(size_buf); - ifile.read(data_buf, size_buf); - innards.TTfunc_coords.assign((amrex::Real*)data_buf, - (amrex::Real*)data_buf + size_buf); - ifile.read(data_buf, size_buf); - innards.TTfunc_data.assign((amrex::Real*)data_buf, - (amrex::Real*)data_buf + size_buf); - delete[] data_buf; - //_______ - - ifile.close(); - + vector<Real> tndt_coords(innards.ctrl.chi_phot_tdndt_how_many); + vector<Real> tndt_data(innards.ctrl.chi_phot_tdndt_how_many); + vector<Real> cum_tab_coords1(innards.ctrl.chi_phot_tpair_how_many); + vector<Real> cum_tab_coords2(innards.ctrl.chi_frac_tpair_how_many); + vector<Real> cum_tab_data(innards.ctrl.chi_phot_tpair_how_many* + 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; + 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; + 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; + 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; + 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; + innards.cum_distrib_data.assign( + cum_tab_data.begin(), cum_tab_data.end()); + + //___________________________ lookup_tables_initialized = true; + + return true; } @@ -101,56 +171,25 @@ void BreitWheelerEngine::compute_custom_lookup_tables ( /* \brief Writes lookup tables on disk in 'file' * return false if it fails. */ -bool BreitWheelerEngine::write_lookup_tables ( - std::string file) const +std::vector<char> export_lookup_tables_data () const { if(!lookup_tables_initialized) - return false; - - std::ofstream of(file, std::ios::out | std::ios::binary); + return std::vector<char>; - //Header (control parameters) - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_min), - sizeof(innards.ctrl.chi_phot_min)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tdndt_min), - sizeof(innards.ctrl.chi_phot_tdndt_min)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tdndt_max), - sizeof(innards.ctrl.chi_phot_tdndt_max)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tdndt_how_many), - sizeof(innards.ctrl.chi_phot_tdndt_how_many)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tpair_min), - sizeof(innards.ctrl.chi_phot_tpair_min)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tpair_max), - sizeof(innards.ctrl.chi_phot_tpair_max)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_phot_tpair_how_many), - sizeof(innards.ctrl.chi_phot_tpair_how_many)); - of.write(reinterpret_cast<const char*>(&innards.ctrl.chi_frac_tpair_how_many), - sizeof(innards.ctrl.chi_frac_tpair_how_many)); - //_______ - - //Data - of.write(reinterpret_cast<const char*>(innards.TTfunc_coords.dataPtr()), - sizeof(amrex::Real)*innards.TTfunc_coords.size()); - of.write(reinterpret_cast<const char*>(innards.TTfunc_data.dataPtr()), - sizeof(amrex::Real)*innards.TTfunc_data.size()); - // TODO: add other table - //_______ - - of.close(); - - return true; + //TODO + return std::vector<char>; } //Private function which actually computes the lookup tables void BreitWheelerEngine::computes_lookup_tables ( - WarpXBreitWheelerWrapperCtrl ctrl) + PicsarBreitWheelerCtrl ctrl) { //Lambda is not actually used if S.I. units are enabled - WarpXBreitWheelerWrapper bw_engine( + PicsarBreitWheelerEngine bw_engine( std::move(QedUtils::DummyStruct()), 1.0, ctrl); bw_engine.compute_dN_dt_lookup_table(); - //bw_engine.compute_cumulative_pair_table(); + bw_engine.compute_cumulative_pair_table(); auto bw_innards_picsar = bw_engine.export_innards(); diff --git a/Source/QED/Make.package b/Source/QED/Make.package index 302e890c8..23e50b9d1 100644 --- a/Source/QED/Make.package +++ b/Source/QED/Make.package @@ -1,5 +1,6 @@ CEXE_headers += QedWrapperCommons.H CEXE_headers += QedChiFunctions.H +CEXE_headers += QedTableParserHelperFunctions.H CEXE_headers += BreitWheelerEngineWrapper.H CEXE_headers += QuantumSyncsEngineWrapper.H CEXE_sources += BreitWheelerEngineWrapper.cpp diff --git a/Source/QED/QedTableParserHelperFunctions.H b/Source/QED/QedTableParserHelperFunctions.H new file mode 100644 index 000000000..a4c73adc4 --- /dev/null +++ b/Source/QED/QedTableParserHelperFunctions.H @@ -0,0 +1,44 @@ +#ifndef WARPX_amrex_qed_table_parser_helper_functions_h_ +#define WARPX_amrex_qed_table_parser_helper_functions_h_ + +//This file contains helper functions to parse a char* array +//into a lookup table + +#include <vector> +#include <tuple> + +namespace QedUtils{ + template <class T> + std::tuple<bool, std::vector<T>, const char*>parse_raw_data_vec( + const char* p_data, size_t how_many, const char* const p_last) + { + std::vector<T> res; + if(p_data + sizeof(T)*how_many > p_last) + return std::make_tuple(false, res, nullptr); + + auto r_data = reinterpret_cast<const T*>(p_data); + + res.assign(r_data, r_data + how_many); + + p_data += sizeof(T)*how_many; + return std::make_tuple(true, res, p_data); + } + + template <class T> + std::tuple<bool, T, const char*> parse_raw_data( + const char* p_data, const char* const p_last) + { + T res; + if(p_data + sizeof(T) > p_last) + return std::make_tuple(false, res, nullptr); + + auto r_data = reinterpret_cast<const T*>(p_data); + + res = *r_data; + + p_data += sizeof(T); + return std::make_tuple(true, res, p_data); + } +}; + +#endif //WARPX_amrex_qed_table_parser_helper_functions_h_ diff --git a/Source/QED/QedWrapperCommons.H b/Source/QED/QedWrapperCommons.H index 2d17d3b83..a972b8869 100644 --- a/Source/QED/QedWrapperCommons.H +++ b/Source/QED/QedWrapperCommons.H @@ -16,4 +16,27 @@ namespace QedUtils{ struct DummyStruct{}; }; +//Control structures used by the engines +struct PicsarBreitWheelerCtrl +{ + _REAL chi_phot_min = + static_cast<_REAL>(__breit_wheeler_min_chi_phot); + + _REAL chi_phot_tdndt_min = + static_cast<_REAL>(__breit_wheeler_min_tdndt_chi_phot); + _REAL chi_phot_tdndt_max = + static_cast<_REAL>(__breit_wheeler_max_tdndt_chi_phot); + size_t chi_phot_tdndt_how_many = + __breit_wheeler_how_many_tdndt_chi_phot; + + _REAL chi_phot_tpair_min = + static_cast<_REAL>(__breit_wheeler_min_tpair_chi_phot); + _REAL chi_phot_tpair_max = + static_cast<_REAL>(__breit_wheeler_max_tpair_chi_phot); + size_t chi_phot_tpair_how_many = + __breit_wheeler_how_many_tpair_chi_phot; + size_t chi_frac_tpair_how_many = + __breit_wheeler_chi_frac_tpair_how_many; +}; + #endif //WARPX_amrex_qed_wrapper_commons_h_ |