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.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index 6c6a03231..84cd107f8 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -521,14 +521,16 @@ namespace
std::unique_ptr< WarpXParticleContainer>& pc_product,
const int * const p_is_ionized)
{
-
+ // Print()<<"in createIonizedParticles\n";
const int grid_id = mfi.index();
const int tile_id = mfi.LocalTileIndex();
// Get source particle data
auto& ptile_source = pc_source->GetParticles(lev)[std::make_pair(grid_id,tile_id)];
const int np_source = ptile_source.GetArrayOfStructs().size();
+ if (np_source == 0) return;
// --- source AoS particle data
+ //Print()<<"la 1\n";
WarpXParticleContainer::ParticleType* particles_source = ptile_source.GetArrayOfStructs()().data();
// --- source SoA particle data
auto& soa_source = ptile_source.GetStructOfArrays();
@@ -543,7 +545,9 @@ namespace
&& pc_source->DoBoostedFrameDiags();
GpuArray<Real*,6> runtime_attribs_source;
//
+ //Print()<<"la 2\n";
if (do_boosted_product && do_boosted_source) {
+ //Print()<<"do_boosted_product && do_boosted_source\n";
// If boosted frame diagnostics for source species, store them
std::map<std::string, int> comps_source = pc_source->getParticleComps();
runtime_attribs_source[0] = soa_source.GetRealData(comps_source[ "xold"]).data();
@@ -553,6 +557,7 @@ namespace
runtime_attribs_source[4] = soa_source.GetRealData(comps_source["uyold"]).data();
runtime_attribs_source[5] = soa_source.GetRealData(comps_source["uzold"]).data();
} else if (do_boosted_product && !do_boosted_source){
+ //Print()<<"do_boosted_product && !do_boosted_source\n";
// Otherwise, store current particle momenta.
// Positions are copied from AoS data.
runtime_attribs_source[3] = soa_source.GetRealData(PIdx::ux).data();
@@ -563,20 +568,27 @@ namespace
// Indices of product particle for each ionized source particle.
// i_product[i] is the location in product tile of product particle
// from source particle i.
+ //Print()<<"la 3\n";
amrex::Gpu::ManagedVector<int> i_product;
i_product.resize(np_source);
// 0<i<np_source
// 0<i_product<np_ionized
+ //Print()<<"np_source "<<np_source<<'\n';
int np_ionized = p_is_ionized[0];
+ //Print()<<"la 4\n";
for(int i=1; i<np_source; ++i){
+ //Print()<<i<<'\n';
np_ionized += p_is_ionized[i];
i_product[i] = i_product[i-1]+p_is_ionized[i-1];
}
+ //Print()<<"la 5\n";
if (np_ionized == 0){
return;
}
+ //Print()<<"la 6\n";
int* AMREX_RESTRICT p_i_product = i_product.dataPtr();
+ //Print()<<"la 7\n";
// Get product particle data
auto& ptile_product = pc_product->GetParticles(lev)[std::make_pair(grid_id,tile_id)];
// old and new (i.e., including ionized particles) number of particles
@@ -589,15 +601,18 @@ namespace
// First element is the first newly-created product particle
WarpXParticleContainer::ParticleType* particles_product = ptile_product.GetArrayOfStructs()().data() + np_product_old;
// --- product SoA particle data
+ //Print()<<"la 8\n";
auto& soa_product = ptile_product.GetStructOfArrays();
GpuArray<Real*,PIdx::nattribs> attribs_product;
for (int ia = 0; ia < PIdx::nattribs; ++ia) {
// First element is the first newly-created product particle
attribs_product[ia] = soa_product.GetRealData(ia).data() + np_product_old;
}
+ //Print()<<"la 9\n";
// --- product runtime attribs
GpuArray<Real*,6> runtime_attribs_product;
if (do_boosted_product) {
+ //Print()<<"do_boosted_product 1\n";
std::map<std::string, int> comps_product = pc_product->getParticleComps();
runtime_attribs_product[0] = soa_product.GetRealData(comps_product[ "xold"]).data() + np_product_old;
runtime_attribs_product[1] = soa_product.GetRealData(comps_product[ "yold"]).data() + np_product_old;
@@ -645,18 +660,23 @@ namespace
// handling depending on do_boosted_source. For momentum,
// runtime_attribs_source[3-5] contains appropriate data.
if (do_boosted_product) {
+ //Print()<<"do_boosted_product\n";
if (do_boosted_source) {
+ //Print()<<"do_boosted_product do_boosted_source\n";
runtime_attribs_product[0][ip] = runtime_attribs_source[0][ip];
runtime_attribs_product[1][ip] = runtime_attribs_source[1][ip];
runtime_attribs_product[2][ip] = runtime_attribs_source[2][ip];
} else {
+ //Print()<<"do_boosted_product NO do_boosted_source\n";
runtime_attribs_product[0][ip] = p_source.pos(0);
runtime_attribs_product[1][ip] = p_source.pos(1);
runtime_attribs_product[2][ip] = p_source.pos(2);
}
+ //Print()<<"momenta\n";
runtime_attribs_product[3][ip] = runtime_attribs_source[3][ip];
runtime_attribs_product[4][ip] = runtime_attribs_source[4][ip];
runtime_attribs_product[5][ip] = runtime_attribs_source[5][ip];
+ //Print()<<"done\n";
}
}
}
@@ -668,6 +688,8 @@ void
MultiParticleContainer::doFieldIonization()
{
+ Print()<<"in MultiParticleContainer::doFieldIonization\n";
+
// Loop over all species.
// Ionized particles in pc_source create particles in pc_product
for (auto& pc_source : allcontainers){
@@ -718,11 +740,15 @@ MultiParticleContainer::doFieldIonization()
{
// Ionization mask: one element per source particles.
// 0 if not ionized, 1 if ionized.
+ // Print()<<"here 1\n";
amrex::Gpu::ManagedVector<int> is_ionized;
+ // Print()<<"here 2\n";
pc_source->buildIonizationMask(mfi, lev, is_ionized);
+ // Print()<<"here 3\n";
const int * const AMREX_RESTRICT p_is_ionized = is_ionized.dataPtr();
-
+ // Print()<<"here 4\n";
createIonizedParticles(lev, mfi, pc_source, pc_product, p_is_ionized);
+ // Print()<<"here 5\n";
} // MFIter
} // lev
} // pc_source