aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/QED/BreitWheelerEngineWrapper.cpp86
-rw-r--r--Source/QED/BreitWheelerEngineWrapper.h55
-rw-r--r--Source/QED/QedWrapperCommons.h1
-rw-r--r--Source/QED/QuantumSyncEngineWrapper.cpp86
-rw-r--r--Source/QED/QuantumSyncEngineWrapper.h55
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);
};
//============================================