aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Luca Fedeli <luca.fedeli@cea.fr> 2020-03-17 15:25:42 +0100
committerGravatar GitHub <noreply@github.com> 2020-03-17 07:25:42 -0700
commit314acff8ddd7ca7af3af9a65c43908acc266533f (patch)
tree85c5bc45be68d1de3b665e44f50bad2633b9bba2 /Source/Particles/MultiParticleContainer.cpp
parent573489f64d977fff8ea2480858581fc2b72ee451 (diff)
downloadWarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.tar.gz
WarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.tar.zst
WarpX-314acff8ddd7ca7af3af9a65c43908acc266533f.zip
Add QED particle creaction routines (#698)
* Initial work to add back QED particle generation * Work in progress: port old QED routines * Add two distinct CopyFuncs * modified getMFItInfo and CopyFunc (not working) * bugfixing & work to add back QED particle creation routines * bugfixing * added back quantum photon emission * bugfixing * bugfixing * added back pair generation (still some bugs in photon emission) * removed unwanted check * bugfixing * bugfixing * bugfixing * Moved QED folder * added comments + some refactoring * added comments * remove some virtual functions to make lgtm happy * updated tests * added PhysicalParticleType * bugfixing * added copyright * improved comments * improved comments * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * moved inclusion of QEDInternals folder * moved some inclusion directives between Make files * moved some inclusion directives between Make files (forgot to add a file) * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/PhysicalParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * corrected alignment * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: Axel Huebl <axel.huebl@plasma.ninja> * removed some unnecessary amrex:: * add missing comment * Replaced BL_PROFILE with WARPX_PROFILE * bugfixing and making some variables const * removed some moves * removed some moves * started to change tau into optical_depth_BW or optical_depth_QSR * Using initialization policy to initialize optical depth * bugfixing * forgot to add a file * fixed bug * Revert "fixed bug" This reverts commit a3fb98d10cc30327635aeaa71451a05ca2229ff4. * Update Source/Particles/ElementaryProcess/QEDPairGeneration.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Added doQEDEvents to OneStep_sub1 * add a bunch of const * add _rt suffix * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * added path to included files * Introduced a templated AmIA<something> function using physical_species * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * added paths to included headers * updated documentation * updated examples * bugfixing * bugfixing * fixing examples * fixed example * fixed example * correct a misprint in error message * fixed issue related to 1./mass for photons * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/MultiParticleContainer.cpp Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * Update Source/Particles/ElementaryProcess/QEDPhotonEmission.H Co-Authored-By: MaxThevenet <mthevenet@lbl.gov> * make the use of energy_threshold more transparent * remove unnecessary checks * bigfixing * added comment * separate checks for QED processes * added a CheckIonizationProductSpecies for consistency * bugfixing * now using a new variable for photon energy creation threshold * removed unwanted comment * added option to set a user-defined threshold for photon creation * bugfixing * updated documentation * updated example to include new option * updated doc * fixed merge conflict * correct bug in example * reorganized function Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> Co-authored-by: MaxThevenet <mthevenet@lbl.gov>
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp232
1 files changed, 210 insertions, 22 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index 5b6cfedc0..12b0a9d61 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -9,6 +9,7 @@
* License: BSD-3-Clause-LBNL
*/
#include "MultiParticleContainer.H"
+#include "SpeciesPhysicalProperties.H"
#include "Utils/WarpXUtil.H"
#include "WarpX.H"
@@ -267,7 +268,10 @@ MultiParticleContainer::InitData ()
// This is used for ionization and pair creation processes.
mapSpeciesProduct();
+ CheckIonizationProductSpecies();
+
#ifdef WARPX_QED
+ CheckQEDProductSpecies();
InitQED();
#endif
@@ -534,13 +538,30 @@ MultiParticleContainer::mapSpeciesProduct ()
// pc->ionization_product_name and store its ID into
// pc->ionization_product.
if (pc->do_field_ionization){
- int i_product = getSpeciesID(pc->ionization_product_name);
- AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
- i != i_product,
- "ERROR: ionization product cannot be the same species");
+ const int i_product = getSpeciesID(pc->ionization_product_name);
pc->ionization_product = i_product;
}
+
+#ifdef WARPX_QED
+ if (pc->has_breit_wheeler()){
+ const int i_product_ele = getSpeciesID(
+ pc->m_qed_breit_wheeler_ele_product_name);
+ pc->m_qed_breit_wheeler_ele_product = i_product_ele;
+
+ const int i_product_pos = getSpeciesID(
+ pc->m_qed_breit_wheeler_pos_product_name);
+ pc->m_qed_breit_wheeler_pos_product = i_product_pos;
+ }
+
+ if(pc->has_quantum_sync()){
+ const int i_product_phot = getSpeciesID(
+ pc->m_qed_quantum_sync_phot_product_name);
+ pc->m_qed_quantum_sync_phot_product = i_product_phot;
+ }
+#endif
+
}
+
}
/* \brief Given a species name, return its ID.
@@ -594,7 +615,7 @@ MultiParticleContainer::doFieldIonization ()
for (int lev = 0; lev <= pc_source->finestLevel(); ++lev)
{
- auto info = getMFItInfo(*pc_source, *pc_product);
+ const auto info = getMFItInfo(*pc_source, *pc_product);
#ifdef _OPENMP
#pragma omp parallel if (Gpu::notInLaunchRegion())
@@ -604,8 +625,8 @@ MultiParticleContainer::doFieldIonization ()
auto& src_tile = pc_source ->ParticlesAt(lev, mfi);
auto& dst_tile = pc_product->ParticlesAt(lev, mfi);
- auto np_dst = dst_tile.numParticles();
- auto num_added = filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst,
+ const auto np_dst = dst_tile.numParticles();
+ const auto num_added = filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst,
Filter, Copy, Transform);
setNewParticleIDs(dst_tile, np_dst, num_added);
@@ -648,23 +669,15 @@ MultiParticleContainer::doCoulombCollisions ()
}
}
-MFItInfo MultiParticleContainer::getMFItInfo (const WarpXParticleContainer& pc_src,
- const WarpXParticleContainer& pc_dst) const noexcept
+void MultiParticleContainer::CheckIonizationProductSpecies()
{
- MFItInfo info;
-
- if (pc_src.do_tiling && Gpu::notInLaunchRegion()) {
- AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pc_dst.do_tiling,
- "For ionization, either all or none of the "
- "particle species must use tiling.");
- info.EnableTiling(pc_src.tile_size);
+ for (int i=0; i<nspecies; i++){
+ if (allcontainers[i]->do_field_ionization){
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ i != allcontainers[i]->ionization_product,
+ "ERROR: ionization product cannot be the same species");
+ }
}
-
-#ifdef _OPENMP
- info.SetDynamic(true);
-#endif
-
- return info;
}
#ifdef WARPX_QED
@@ -701,6 +714,17 @@ void MultiParticleContainer::InitQuantumSync ()
{
std::string lookup_table_mode;
ParmParse pp("qed_qs");
+
+ //If specified, use a user-defined energy threshold for photon creaction
+ ParticleReal temp;
+ if(pp.query("photon_creation_energy_threshold", temp)){
+ m_quantum_sync_photon_creation_energy_threshold = temp;
+ }
+ else{
+ amrex::Print() << "Using default value (2*me*c^2)" <<
+ " for photon energy creaction threshold \n" ;
+ }
+
pp.query("lookup_table_mode", lookup_table_mode);
if(lookup_table_mode.empty()){
amrex::Abort("Quantum Synchrotron table mode should be provided");
@@ -952,4 +976,168 @@ MultiParticleContainer::BreitWheelerGenerateTable ()
m_shr_p_bw_engine->init_lookup_tables_from_raw_data(table_data);
}
}
+
+void MultiParticleContainer::doQedEvents()
+{
+ WARPX_PROFILE("MPC::doQedEvents");
+
+ doQedBreitWheeler();
+ doQedQuantumSync();
+}
+
+void MultiParticleContainer::doQedBreitWheeler()
+{
+ WARPX_PROFILE("MPC::doQedBreitWheeler");
+
+ // Loop over all species.
+ // Photons undergoing Breit Wheeler process create electrons
+ // in pc_product_ele and positrons in pc_product_pos
+
+ for (auto& pc_source : allcontainers){
+ if(!pc_source->has_breit_wheeler()) continue;
+
+ // Get product species
+ auto& pc_product_ele =
+ allcontainers[pc_source->m_qed_breit_wheeler_ele_product];
+ auto& pc_product_pos =
+ allcontainers[pc_source->m_qed_breit_wheeler_pos_product];
+
+ SmartCopyFactory copy_factory_ele(*pc_source, *pc_product_ele);
+ SmartCopyFactory copy_factory_pos(*pc_source, *pc_product_pos);
+ auto phys_pc_ptr = static_cast<PhysicalParticleContainer*>(pc_source.get());
+
+ const auto Filter = phys_pc_ptr->getPairGenerationFilterFunc();
+ const auto CopyEle = copy_factory_ele.getSmartCopy();
+ const auto CopyPos = copy_factory_pos.getSmartCopy();
+
+ const auto pair_gen_functor = m_shr_p_bw_engine->build_pair_functor();
+ auto Transform = PairGenerationTransformFunc(pair_gen_functor);
+
+ pc_source ->defineAllParticleTiles();
+ pc_product_pos->defineAllParticleTiles();
+ pc_product_ele->defineAllParticleTiles();
+
+ for (int lev = 0; lev <= pc_source->finestLevel(); ++lev)
+ {
+ const auto info = getMFItInfo(*pc_source, *pc_product_ele, *pc_product_pos);
+
+#ifdef _OPENMP
+#pragma omp parallel if (Gpu::notInLaunchRegion())
+#endif
+ for (MFIter mfi = pc_source->MakeMFIter(lev, info); mfi.isValid(); ++mfi)
+ {
+ auto& src_tile = pc_source->ParticlesAt(lev, mfi);
+ auto& dst_ele_tile = pc_product_ele->ParticlesAt(lev, mfi);
+ auto& dst_pos_tile = pc_product_pos->ParticlesAt(lev, mfi);
+
+ const auto np_dst_ele = dst_ele_tile.numParticles();
+ const auto np_dst_pos = dst_pos_tile.numParticles();
+ const auto num_added = filterCopyTransformParticles<1>(
+ dst_ele_tile, dst_pos_tile,
+ src_tile, np_dst_ele, np_dst_pos,
+ Filter, CopyEle, CopyPos, Transform);
+
+ setNewParticleIDs(dst_ele_tile, np_dst_ele, num_added);
+ setNewParticleIDs(dst_pos_tile, np_dst_pos, num_added);
+ }
+ }
+ }
+}
+
+void MultiParticleContainer::doQedQuantumSync()
+{
+ WARPX_PROFILE("MPC::doQedEvents::doQedQuantumSync");
+
+ // Loop over all species.
+ // Electrons or positrons undergoing Quantum photon emission process
+ // create photons in pc_product_phot
+
+ for (auto& pc_source : allcontainers){
+ if(!pc_source->has_quantum_sync()){ continue; }
+
+ // Get product species
+ auto& pc_product_phot =
+ allcontainers[pc_source->m_qed_quantum_sync_phot_product];
+
+ SmartCopyFactory copy_factory_phot(*pc_source, *pc_product_phot);
+ auto phys_pc_ptr =
+ static_cast<PhysicalParticleContainer*>(pc_source.get());
+
+ const auto Filter = phys_pc_ptr->getPhotonEmissionFilterFunc();
+ const auto CopyPhot = copy_factory_phot.getSmartCopy();
+
+ auto Transform = PhotonEmissionTransformFunc(
+ m_shr_p_qs_engine->build_optical_depth_functor(),
+ pc_source->particle_runtime_comps["optical_depth_QSR"],
+ m_shr_p_qs_engine->build_phot_em_functor());
+
+ pc_source ->defineAllParticleTiles();
+ pc_product_phot->defineAllParticleTiles();
+
+ for (int lev = 0; lev <= pc_source->finestLevel(); ++lev)
+ {
+ const auto info = getMFItInfo(*pc_source, *pc_product_phot);
+
+#ifdef _OPENMP
+#pragma omp parallel if (Gpu::notInLaunchRegion())
+#endif
+ for (MFIter mfi = pc_source->MakeMFIter(lev, info); mfi.isValid(); ++mfi)
+ {
+ auto& src_tile = pc_source->ParticlesAt(lev, mfi);
+ auto& dst_tile = pc_product_phot->ParticlesAt(lev, mfi);
+
+ const auto np_dst = dst_tile.numParticles();
+
+ const auto num_added =
+ filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst,
+ Filter, CopyPhot, Transform);
+
+ setNewParticleIDs(dst_tile, np_dst, num_added);
+
+ cleanLowEnergyPhotons(
+ dst_tile, np_dst, num_added,
+ m_quantum_sync_photon_creation_energy_threshold);
+
+ }
+ }
+ }
+
+}
+
+void MultiParticleContainer::CheckQEDProductSpecies()
+{
+ for (int i=0; i<nspecies; i++){
+ const auto& pc = allcontainers[i];
+ if (pc->has_breit_wheeler()){
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ i != pc->m_qed_breit_wheeler_ele_product,
+ "ERROR: Breit Wheeler product cannot be the same species");
+
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ i != pc->m_qed_breit_wheeler_pos_product,
+ "ERROR: Breit Wheeler product cannot be the same species");
+
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ allcontainers[pc->m_qed_breit_wheeler_ele_product]->
+ AmIA<PhysicalSpecies::electron>()
+ &&
+ allcontainers[pc->m_qed_breit_wheeler_pos_product]->
+ AmIA<PhysicalSpecies::positron>(),
+ "ERROR: Breit Wheeler product species are of wrong type");
+ }
+
+ if(pc->has_quantum_sync()){
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ i != pc->m_qed_quantum_sync_phot_product,
+ "ERROR: Quantum Synchrotron product cannot be the same species");
+
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ allcontainers[pc->m_qed_quantum_sync_phot_product]->
+ AmIA<PhysicalSpecies::photon>(),
+ "ERROR: Quantum Synchrotron product species is of wrong type");
+ }
+ }
+}
+
+
#endif
s'>-1/+1 2021-09-13Disclaimer for Github pages / jekyll quirk (#1355)Gravatar Tc001 2-0/+7 * Added GH pages disclaimer * Added changeset * Reworded disclaimer * Correct GH Pages casing * Update deploy.md Co-authored-by: Fred K. Schott <fkschott@gmail.com> 2021-09-13fix outdated lockfile issue (#1357)Gravatar Fred K. Schott 1-3/+1 2021-09-13Add `astro.build/play` link (#1359)Gravatar Nate Moore 1-0/+6 * feat: add rewrite to play.astro.build * fix: subpath redirects 2021-09-13[ci] yarn formatGravatar FredKSchott 2-8/+7 2021-09-13Add a new lockfile (#1356)Gravatar Matthew Phillips 1-19/+19 2021-09-13[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-12[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-11[ci] collect statsGravatar FredKSchott 1-0/+1 2021-09-10Prevent removing CSS preloads during bundling (#1326)Gravatar Bartek Igielski 8-18/+96 * Prevent removing nodes, becasue styles preloading was detected earlier * Add separate deduping for preloads and cover it with tests. * Create quiet-horses-turn.md * Test merging preload tags 2021-09-10Fix typos in Netlify sponsorship announcement blog post (#1346)Gravatar mundry 1-4/+4 Co-authored-by: mundry <mundry@users.noreply.github.com> 2021-09-10[ci] collect statsGravatar FredKSchott 2-1/+2 2021-09-09blog: announce netlify sponsorship (#1345)Gravatar Fred K. Schott 4-5/+64 2021-09-09Version Packages (#1344)Gravatar github-actions[bot] 29-53/+42 Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> 2021-09-09Revert "Version Packages (#1303)"Gravatar Fred K. Schott 29-42/+53 This reverts commit 1a88cfde7d2b3854e279c1bf3e12adf5d2155801. 2021-09-09update lockfileastro@0.20.5@astrojs/markdown-support@0.3.1Gravatar Fred K. Schott 1-9/+9 2021-09-09Version Packages (#1303)Gravatar github-actions[bot] 29-53/+42 Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> 2021-09-09[ci] collect statsGravatar FredKSchott 2-1/+2 2021-09-08Update netlify deploy instructions for `.nvmrc` syntax (#1337)Gravatar Caleb Jasik 1-1/+1 2021-09-08[ci] yarn formatGravatar jasikpark 1-1/+0