aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp208
1 files changed, 207 insertions, 1 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index de2b4583d..02ba4fa87 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -1,14 +1,22 @@
#include <MultiParticleContainer.H>
+
+#include <AMReX_Vector.H>
+
#include <WarpX_f.H>
#include <WarpX.H>
+//This is now needed for writing a binary file on disk.
+#include <WarpXUtil.H>
+
#include <limits>
#include <algorithm>
#include <string>
-#include <memory>
using namespace amrex;
+//literals allow to write "aa"s, which means that "aa" is an std::string (C++14)
+using namespace std::literals;
+
MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core)
{
@@ -622,11 +630,209 @@ void MultiParticleContainer::InitQED ()
if(pc->has_quantum_sync()){
pc->set_quantum_sync_engine_ptr
(shr_p_qs_engine);
+ someone_has_quantum_sync = true;
}
if(pc->has_breit_wheeler()){
pc->set_breit_wheeler_engine_ptr
(shr_p_bw_engine);
+ someone_has_breit_wheeler = true;
}
}
+
+ if(someone_has_quantum_sync)
+ InitQuantumSync();
+
+ if(someone_has_breit_wheeler)
+ InitBreitWheeler();
+
+}
+
+void MultiParticleContainer::InitQuantumSync ()
+{
+ bool generate_table;
+ PicsarQuantumSynchrotronCtrl ctrl;
+ std::string filename;
+ std::tie(generate_table, filename, ctrl) = ParseQuantumSyncParams();
+
+ //Only temporary for test purposes, will be removed
+ ParmParse pp("qed_qs");
+ bool ignore_tables = false;
+ pp.query("ignore_tables_for_test", ignore_tables);
+ if(ignore_tables) return;
+ //_________________________________________________
+
+
+ if(generate_table && ParallelDescriptor::IOProcessor()){
+ shr_p_qs_engine->compute_lookup_tables(ctrl);
+ Vector<char> all_data = shr_p_qs_engine->export_lookup_tables_data();
+ WarpXUtilIO::WriteBinaryDataOnFile(filename, all_data);
+ }
+ ParallelDescriptor::Barrier();
+
+ Vector<char> table_data;
+ ParallelDescriptor::ReadAndBcastFile(filename, table_data);
+ ParallelDescriptor::Barrier();
+
+ //No need to initialize from raw data for the processor that
+ //has just generated the table
+ if(!generate_table || !ParallelDescriptor::IOProcessor()){
+ shr_p_qs_engine->init_lookup_tables_from_raw_data(table_data);
+ }
+
+ if(!shr_p_qs_engine->are_lookup_tables_initialized())
+ amrex::Error("Table initialization has failed!\n");
+}
+
+void MultiParticleContainer::InitBreitWheeler ()
+{
+ bool generate_table;
+ PicsarBreitWheelerCtrl ctrl;
+ std::string filename;
+ std::tie(generate_table, filename, ctrl) = ParseBreitWheelerParams();
+
+ //Only temporary for test purposes, will be removed
+ ParmParse pp("qed_bw");
+ bool ignore_tables = false;
+ pp.query("ignore_tables_for_test", ignore_tables);
+ if(ignore_tables) return;
+ //_________________________________________________
+
+ if(generate_table && ParallelDescriptor::IOProcessor()){
+ shr_p_bw_engine->compute_lookup_tables(ctrl);
+ Vector<char> all_data =shr_p_bw_engine->export_lookup_tables_data();
+ WarpXUtilIO::WriteBinaryDataOnFile(filename, all_data);
+ }
+ ParallelDescriptor::Barrier();
+
+ Vector<char> table_data;
+ ParallelDescriptor::ReadAndBcastFile(filename, table_data);
+ ParallelDescriptor::Barrier();
+
+ //No need to initialize from raw data for the processor that
+ //has just generated the table
+ if(!generate_table || !ParallelDescriptor::IOProcessor()){
+ shr_p_bw_engine->init_lookup_tables_from_raw_data(table_data);
+ }
+
+ if(!shr_p_bw_engine->are_lookup_tables_initialized())
+ amrex::Error("Table initialization has failed!\n");
+}
+
+std::tuple<bool,std::string,PicsarQuantumSynchrotronCtrl>
+MultiParticleContainer::ParseQuantumSyncParams ()
+{
+ PicsarQuantumSynchrotronCtrl ctrl =
+ shr_p_qs_engine->get_default_ctrl();
+ bool generate_table{false};
+ std::string table_name;
+
+ ParmParse pp("qed_qs");
+
+ pp.query("chi_min", ctrl.chi_part_min);
+
+ //Only temporary for test purposes, will be removed
+ bool ignore_tables = false;
+ pp.query("ignore_tables_for_test", ignore_tables);
+ if(ignore_tables)
+ return std::make_tuple(false, "__DUMMY__", ctrl);
+ //_________________________________________________
+
+ pp.query("generate_table", generate_table);
+ if(generate_table){
+ int t_int = 0;
+ pp.query("tab_dndt_chi_min", ctrl.chi_part_tdndt_min);
+ pp.query("tab_dndt_chi_max", ctrl.chi_part_tdndt_max);
+ pp.query("tab_dndt_how_many", t_int);
+ ctrl.chi_part_tdndt_how_many= t_int;
+ pp.query("tab_em_chi_min", ctrl.chi_part_tem_min);
+ pp.query("tab_em_chi_max", ctrl.chi_part_tem_max);
+ pp.query("tab_em_chi_how_many", t_int);
+ ctrl.chi_part_tem_how_many = t_int;
+ pp.query("tab_em_prob_how_many", t_int);
+ ctrl.prob_tem_how_many = t_int;
+ pp.query("save_table_in", table_name);
+ }
+
+ std::string load_table_name;
+ pp.query("load_table_from", load_table_name);
+ if(load_table_name != ""s){
+ if(generate_table && ParallelDescriptor::IOProcessor()){
+ amrex::Print() << "Warning, Quantum Synchrotron table will be loaded, not generated. \n";
+ }
+ table_name = load_table_name;
+ generate_table = false;
+ }
+
+#ifndef WARPX_QED_TABLE_GEN
+ if(generate_table){
+ amrex::Error("Error: use QED_TABLE_GEN=TRUE to enable table generation!\n");
+ }
+#endif
+
+ if(table_name==""s){
+ amrex::Error("Error: Quantum Synchrotron table has either to be generated or to be loaded.\n");
+ }
+
+ return std::make_tuple(generate_table, table_name, ctrl);
+}
+
+std::tuple<bool,std::string,PicsarBreitWheelerCtrl>
+MultiParticleContainer::ParseBreitWheelerParams ()
+{
+ PicsarBreitWheelerCtrl ctrl =
+ shr_p_bw_engine->get_default_ctrl();
+ bool generate_table{false};
+ std::string table_name;
+
+ ParmParse pp("qed_bw");
+
+ pp.query("chi_min", ctrl.chi_phot_min);
+
+ //Only temporary for test purposes, will be removed
+ bool ignore_tables = false;
+ pp.query("ignore_tables_for_test", ignore_tables);
+ if(ignore_tables)
+ return std::make_tuple(false, "__DUMMY__", ctrl);
+ //_________________________________________________
+
+ pp.query("generate_table", generate_table);
+ if(generate_table){
+ int t_int;
+ pp.query("tab_dndt_chi_min", ctrl.chi_phot_tdndt_min);
+ pp.query("tab_dndt_chi_max", ctrl.chi_phot_tdndt_max);
+ pp.query("tab_dndt_how_many", t_int);
+ ctrl.chi_phot_tdndt_how_many = t_int;
+ pp.query("tab_pair_chi_min", ctrl.chi_phot_tpair_min);
+ pp.query("tab_pair_chi_max", ctrl.chi_phot_tpair_max);
+ pp.query("tab_pair_chi_how_many", t_int);
+ ctrl.chi_phot_tpair_how_many = t_int;
+ pp.query("tab_pair_prob_how_many", t_int);
+ ctrl.chi_frac_tpair_how_many = t_int;
+ pp.query("save_table_in", table_name);
+ }
+
+ std::string load_table_name;
+ pp.query("load_table_from", load_table_name);
+ if(load_table_name != ""s){
+ if(generate_table && ParallelDescriptor::IOProcessor()){
+ amrex::Print() << "Warning, Breit Wheeler table will be loaded, not generated. \n";
+ }
+ table_name = load_table_name;
+ generate_table = false;
+ }
+
+#ifndef WARPX_QED_TABLE_GEN
+ if(generate_table){
+ if(ParallelDescriptor::IOProcessor()){
+ amrex::Error("Error: use QED_TABLE_GEN=TRUE to enable table generation!\n");
+ }
+ }
+#endif
+
+ if(table_name==""s){
+ amrex::Error("Error: Breit Wheeler table has either to be generated or to be loaded.\n");
+ }
+
+ return std::make_tuple(generate_table, table_name, ctrl);
}
#endif