diff options
-rw-r--r-- | Source/QED/BreitWheelerEngineWrapper.cpp | 86 | ||||
-rw-r--r-- | Source/QED/BreitWheelerEngineWrapper.h | 55 | ||||
-rw-r--r-- | Source/QED/QedWrapperCommons.h | 1 | ||||
-rw-r--r-- | Source/QED/QuantumSyncEngineWrapper.cpp | 86 | ||||
-rw-r--r-- | Source/QED/QuantumSyncEngineWrapper.h | 55 |
5 files changed, 276 insertions, 7 deletions
diff --git a/Source/QED/BreitWheelerEngineWrapper.cpp b/Source/QED/BreitWheelerEngineWrapper.cpp index 5c7187ea9..97934589a 100644 --- a/Source/QED/BreitWheelerEngineWrapper.cpp +++ b/Source/QED/BreitWheelerEngineWrapper.cpp @@ -2,8 +2,6 @@ //This file provides a wrapper aroud the breit_wheeler engine //provided by the PICSAR library -using namespace picsar::multi_physics; - // Functors ================================== // Initialization of the optical depth @@ -16,13 +14,95 @@ BreitWheelerGetOpticalDepth::operator() () const } //____________________________________________ +// Evolution of the optical depth (returns true if +// an event occurs) +AMREX_GPU_DEVICE +bool BreitWheelerEvolveOpticalDepth::operator()( + amrex::Real px, amrex::Real py, amrex::Real pz, + amrex::Real ex, amrex::Real ey, amrex::Real ez, + amrex::Real bx, amrex::Real by, amrex::Real bz, + amrex::Real dt, amrex::Real& opt_depth) const +{ + bool has_event_happend = false; + amrex::Real dummy_lambda = 1.0; + amrex::Real unused_event_time = 0.0; + + const auto table = picsar::multi_physics::lookup_1d<amrex::Real> + (innards->TTfunc_data.size(), + innards->TTfunc_coords.data(), + innards->TTfunc_data.data()); + + WarpXBreitWheelerWrapper::internal_evolve_opt_depth_and_determine_event( + px, py, pz, + ex, ey, ez, + bx, by, bz, + dt, opt_depth, + has_event_happend, unused_event_time, + dummy_lambda, + table, + innards->ctrl); + + return has_event_happend; +} + // Factory class ============================= BreitWheelerEngine::BreitWheelerEngine (){} +//Builds the functor to initialize the optical depth BreitWheelerGetOpticalDepth BreitWheelerEngine::build_optical_depth_functor () { return BreitWheelerGetOpticalDepth(); } -//============================================
\ No newline at end of file +//Builds the functor to evolve the optical depth +BreitWheelerEvolveOpticalDepth BreitWheelerEngine::build_evolve_functor () +{ + AMREX_ALWAYS_ASSERT(lookup_tables_initialized); + + return BreitWheelerEvolveOpticalDepth(&innards); +} + + +//Initializes the Lookup tables using the default settings +//provided by the library +void BreitWheelerEngine::computes_lookup_tables_default () +{ + //A control parameters structure + //with the default values provided by the library + WarpXBreitWheelerWrapperCtrl ctrl_default; + + computes_lookup_tables(ctrl_default); + + lookup_tables_initialized = true; +} + +bool BreitWheelerEngine::are_lookup_tables_initialized () const +{ + return lookup_tables_initialized; +} + +//Private function which actually computes the lookup tables +void BreitWheelerEngine::computes_lookup_tables ( + WarpXBreitWheelerWrapperCtrl ctrl) +{ + //Lambda is not actually used if S.I. units are enabled + WarpXBreitWheelerWrapper bw_engine(std::move(DummyStruct()), 1.0, ctrl); + + bw_engine.compute_dN_dt_lookup_table(); + //bw_engine.compute_cumulative_pair_table(); + + auto bw_innards_picsar = bw_engine.export_innards(); + + //Copy data in a GPU-friendly data-structure + innards.ctrl = bw_innards_picsar.bw_ctrl; + innards.TTfunc_coords.assign(bw_innards_picsar.TTfunc_table_coords_ptr, + bw_innards_picsar.TTfunc_table_coords_ptr + + bw_innards_picsar.TTfunc_table_coords_how_many); + innards.TTfunc_data.assign(bw_innards_picsar.TTfunc_table_data_ptr, + bw_innards_picsar.TTfunc_table_data_ptr + + bw_innards_picsar.TTfunc_table_data_how_many); + //____ +} + +//============================================ diff --git a/Source/QED/BreitWheelerEngineWrapper.h b/Source/QED/BreitWheelerEngineWrapper.h index e9c8f2f72..aaa94c0ec 100644 --- a/Source/QED/BreitWheelerEngineWrapper.h +++ b/Source/QED/BreitWheelerEngineWrapper.h @@ -9,6 +9,22 @@ using WarpXBreitWheelerWrapper = picsar::multi_physics::breit_wheeler_engine<amrex::Real, DummyStruct>; +using WarpXBreitWheelerWrapperCtrl = + picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real>; + +// Struct to hold engine data ================ + +struct BreitWheelerEngineInnards +{ + // Control parameters + WarpXBreitWheelerWrapperCtrl ctrl; + + //Lookup table data + amrex::Gpu::ManagedDeviceVector<amrex::Real> TTfunc_coords; + amrex::Gpu::ManagedDeviceVector<amrex::Real> TTfunc_data; + //______ +}; + // Functors ================================== // These functors provide the core elementary functions of the library @@ -27,6 +43,26 @@ public: }; //____________________________________________ +// Evolution of the optical depth (returns true if +// an event occurs) +class BreitWheelerEvolveOpticalDepth +{ +public: + BreitWheelerEvolveOpticalDepth( + BreitWheelerEngineInnards* _innards): + innards{_innards}{}; + + AMREX_GPU_DEVICE + bool operator()( + amrex::Real px, amrex::Real py, amrex::Real pz, + amrex::Real ex, amrex::Real ey, amrex::Real ez, + amrex::Real bx, amrex::Real by, amrex::Real bz, + amrex::Real dt, amrex::Real& opt_depth) const; + +private: + BreitWheelerEngineInnards* innards; +}; + // Factory class ============================= /* \brief Wrapper for the Breit Wheeler engine of the PICSAR library */ @@ -37,6 +73,25 @@ public: /* \brief Builds the functor to initialize the optical depth */ BreitWheelerGetOpticalDepth build_optical_depth_functor (); + + /* \brief Builds the functor to evolve the optical depth */ + BreitWheelerEvolveOpticalDepth build_evolve_functor (); + + /* \brief Computes the Lookup tables using the default settings + * provided by the PICSAR library */ + void computes_lookup_tables_default (); + + /* \brief Checks if lookup tables are properly initialized */ + bool are_lookup_tables_initialized () const; + +private: + bool lookup_tables_initialized = false; + + BreitWheelerEngineInnards innards; + + //Private function which actually computes the lookup tables + void computes_lookup_tables ( + WarpXBreitWheelerWrapperCtrl ctrl); }; //============================================ diff --git a/Source/QED/QedWrapperCommons.h b/Source/QED/QedWrapperCommons.h index 821034c06..0df6961ac 100644 --- a/Source/QED/QedWrapperCommons.h +++ b/Source/QED/QedWrapperCommons.h @@ -4,6 +4,7 @@ //Common definitions for the QED library wrappers #include <AMReX_AmrCore.H> +#include <AMReX_Gpu.H> //Sets the decorator for GPU #define PXRMP_GPU AMREX_GPU_DEVICE diff --git a/Source/QED/QuantumSyncEngineWrapper.cpp b/Source/QED/QuantumSyncEngineWrapper.cpp index 6e57f8709..90bd9cefc 100644 --- a/Source/QED/QuantumSyncEngineWrapper.cpp +++ b/Source/QED/QuantumSyncEngineWrapper.cpp @@ -2,12 +2,9 @@ //This file provides a wrapper aroud the quantum_sync engine //provided by the PICSAR library -using namespace picsar::multi_physics; - // Functors ================================== // Initialization of the optical depth - AMREX_GPU_DEVICE amrex::Real QuantumSynchrotronGetOpticalDepth::operator() () const @@ -17,14 +14,95 @@ QuantumSynchrotronGetOpticalDepth::operator() () const } //____________________________________________ +// Evolution of the optical depth (returns true if +// an event occurs) +AMREX_GPU_DEVICE +bool QuantumSynchrotronEvolveOpticalDepth::operator()( + amrex::Real px, amrex::Real py, amrex::Real pz, + amrex::Real ex, amrex::Real ey, amrex::Real ez, + amrex::Real bx, amrex::Real by, amrex::Real bz, + amrex::Real dt, amrex::Real& opt_depth) const +{ + bool has_event_happend = false; + amrex::Real dummy_lambda = 1.0; + amrex::Real unused_event_time = 0.0; + + const auto table = picsar::multi_physics::lookup_1d<amrex::Real> + (innards->KKfunc_data.size(), + innards->KKfunc_coords.data(), + innards->KKfunc_data.data()); + + WarpXQuantumSynchrotronWrapper::internal_evolve_opt_depth_and_determine_event( + px, py, pz, + ex, ey, ez, + bx, by, bz, + dt, opt_depth, + has_event_happend, unused_event_time, + dummy_lambda, + table, + innards->ctrl); + + return has_event_happend; +} + // Factory class ============================= QuantumSynchrotronEngine::QuantumSynchrotronEngine (){} +//Builds the functor to evolve the optical depth QuantumSynchrotronGetOpticalDepth QuantumSynchrotronEngine::build_optical_depth_functor () { return QuantumSynchrotronGetOpticalDepth(); } -//============================================
\ No newline at end of file +//Builds the functor to evolve the optical depth +QuantumSynchrotronEvolveOpticalDepth QuantumSynchrotronEngine::build_evolve_functor () +{ + AMREX_ALWAYS_ASSERT(lookup_tables_initialized); + + return QuantumSynchrotronEvolveOpticalDepth(&innards); +} + +//Initializes the Lookup tables using the default settings +//provided by the library +void QuantumSynchrotronEngine::computes_lookup_tables_default () +{ + //A control parameters structure + //with the default values provided by the library + WarpXQuantumSynchrotronWrapperCtrl ctrl_default; + + computes_lookup_tables(ctrl_default); + + lookup_tables_initialized = true; +} + +bool QuantumSynchrotronEngine::are_lookup_tables_initialized () const +{ + return lookup_tables_initialized; +} + +//Private function which actually computes the lookup tables +void QuantumSynchrotronEngine::computes_lookup_tables ( + WarpXQuantumSynchrotronWrapperCtrl ctrl) +{ + //Lambda is not actually used if S.I. units are enabled + WarpXQuantumSynchrotronWrapper qs_engine(std::move(DummyStruct()), 1.0, ctrl); + + qs_engine.compute_dN_dt_lookup_table(); + //qs_engine.compute_cumulative_pair_table(); + + auto qs_innards_picsar = qs_engine.export_innards(); + + //Copy data in a GPU-friendly data-structure + innards.ctrl = qs_innards_picsar.qs_ctrl; + innards.KKfunc_coords.assign(qs_innards_picsar.KKfunc_table_coords_ptr, + qs_innards_picsar.KKfunc_table_coords_ptr + + qs_innards_picsar.KKfunc_table_coords_how_many); + innards.KKfunc_data.assign(qs_innards_picsar.KKfunc_table_data_ptr, + qs_innards_picsar.KKfunc_table_data_ptr + + qs_innards_picsar.KKfunc_table_data_how_many); + //____ +} + +//============================================ diff --git a/Source/QED/QuantumSyncEngineWrapper.h b/Source/QED/QuantumSyncEngineWrapper.h index 59c146915..af3731f6c 100644 --- a/Source/QED/QuantumSyncEngineWrapper.h +++ b/Source/QED/QuantumSyncEngineWrapper.h @@ -9,6 +9,22 @@ using WarpXQuantumSynchrotronWrapper = picsar::multi_physics::quantum_synchrotron_engine<amrex::Real, DummyStruct>; +using WarpXQuantumSynchrotronWrapperCtrl = + picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real>; + +// Struct to hold engine data ================ + +struct QuantumSynchrotronEngineInnards +{ + // Control parameters + WarpXQuantumSynchrotronWrapperCtrl ctrl; + + //Lookup table data + amrex::Gpu::ManagedDeviceVector<amrex::Real> KKfunc_coords; + amrex::Gpu::ManagedDeviceVector<amrex::Real> KKfunc_data; + //______ +}; + // Functors ================================== // These functors provide the core elementary functions of the library @@ -27,6 +43,26 @@ public: }; //____________________________________________ +// Evolution of the optical depth (returns true if +// an event occurs) +class QuantumSynchrotronEvolveOpticalDepth +{ +public: + QuantumSynchrotronEvolveOpticalDepth( + QuantumSynchrotronEngineInnards* _innards): + innards{_innards}{}; + + AMREX_GPU_DEVICE + bool operator()( + amrex::Real px, amrex::Real py, amrex::Real pz, + amrex::Real ex, amrex::Real ey, amrex::Real ez, + amrex::Real bx, amrex::Real by, amrex::Real bz, + amrex::Real dt, amrex::Real& opt_depth) const; + +private: + QuantumSynchrotronEngineInnards* innards; +}; + // Factory class ============================= /* \brief Wrapper for the Quantum Synchrotron engine of the PICSAR library */ @@ -37,6 +73,25 @@ public: /* \brief Builds the functor to initialize the optical depth */ QuantumSynchrotronGetOpticalDepth build_optical_depth_functor (); + + /* \brief Builds the functor to evolve the optical depth */ + QuantumSynchrotronEvolveOpticalDepth build_evolve_functor (); + + /* \brief Computes the Lookup tables using the default settings + * provided by the PICSAR library */ + void computes_lookup_tables_default (); + + /* \brief Checks if lookup tables are properly initialized */ + bool are_lookup_tables_initialized () const; + +private: + bool lookup_tables_initialized = false; + + QuantumSynchrotronEngineInnards innards; + + //Private function which actually computes the lookup tables + void computes_lookup_tables ( + WarpXQuantumSynchrotronWrapperCtrl ctrl); }; //============================================ |