aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Particles/MultiParticleContainer.H4
-rw-r--r--Source/Particles/MultiParticleContainer.cpp16
-rw-r--r--Source/QED/BreitWheelerEngineTableBuilder.H5
-rw-r--r--Source/QED/BreitWheelerEngineWrapper.H27
-rw-r--r--Source/QED/BreitWheelerEngineWrapper.cpp185
-rw-r--r--Source/QED/Make.package1
-rw-r--r--Source/QED/QedTableParserHelperFunctions.H44
-rw-r--r--Source/QED/QedWrapperCommons.H23
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_