aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/WarpXParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2019-11-06 16:22:41 -0800
committerGravatar Remi Lehe <remi.lehe@normalesup.org> 2019-11-07 09:38:01 -0800
commitbdef308e6c5b4aeed8190b6ecdb25b00a51ca5f9 (patch)
tree6a8cefd9f739813a0378b21e24cebb5b193fe349 /Source/Particles/WarpXParticleContainer.cpp
parent1b4eaecb0dcc77b4f6cc13ab521140aafc1b97c7 (diff)
downloadWarpX-bdef308e6c5b4aeed8190b6ecdb25b00a51ca5f9.tar.gz
WarpX-bdef308e6c5b4aeed8190b6ecdb25b00a51ca5f9.tar.zst
WarpX-bdef308e6c5b4aeed8190b6ecdb25b00a51ca5f9.zip
Implement space-charge initialization (non-relativistic, single-level)
Diffstat (limited to 'Source/Particles/WarpXParticleContainer.cpp')
-rw-r--r--Source/Particles/WarpXParticleContainer.cpp82
1 files changed, 34 insertions, 48 deletions
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp
index 7fb57500d..29a7d95c7 100644
--- a/Source/Particles/WarpXParticleContainer.cpp
+++ b/Source/Particles/WarpXParticleContainer.cpp
@@ -501,68 +501,56 @@ WarpXParticleContainer::DepositCharge (WarpXParIter& pti, RealVector& wp,
}
void
-WarpXParticleContainer::DepositCharge (Vector<std::unique_ptr<MultiFab> >& rho, bool local)
+WarpXParticleContainer::DepositCharge (Vector<std::unique_ptr<MultiFab> >& rho,
+ bool local, bool reset)
{
int num_levels = rho.size();
int finest_level = num_levels - 1;
- // each level deposits it's own particles
+ // each level deposits its own particles
const int ng = rho[0]->nGrow();
for (int lev = 0; lev < num_levels; ++lev) {
- rho[lev]->setVal(0.0, ng);
-
- const auto& gm = m_gdb->Geom(lev);
- const auto& ba = m_gdb->ParticleBoxArray(lev);
-
- const Real* dx = gm.CellSize();
- const Real* plo = gm.ProbLo();
- BoxArray nba = ba;
- nba.surroundingNodes();
-
- for (WarpXParIter pti(*this, lev); pti.isValid(); ++pti) {
- const Box& box = nba[pti];
+ if (reset) rho[lev]->setVal(0.0, ng);
+#ifdef _OPENMP
+#pragma omp parallel
+ {
+#endif
+#ifdef _OPENMP
+ int thread_num = omp_get_thread_num();
+#else
+ int thread_num = 0;
+#endif
+ for (WarpXParIter pti(*this, lev); pti.isValid(); ++pti)
+ {
+ const long np = pti.numParticles();
auto& wp = pti.GetAttribs(PIdx::w);
- const auto& particles = pti.GetArrayOfStructs();
- int nstride = particles.dataShape().first;
- const long np = pti.numParticles();
- FArrayBox& rhofab = (*rho[lev])[pti];
+ pti.GetPosition(m_xp[thread_num], m_yp[thread_num], m_zp[thread_num]);
+
+ int* AMREX_RESTRICT ion_lev;
+ if (do_field_ionization){
+ ion_lev = pti.GetiAttribs(particle_icomps["ionization_level"]).dataPtr();
+ } else {
+ ion_lev = nullptr;
+ }
- WRPX_DEPOSIT_CIC(particles.dataPtr(), nstride, np,
- wp.dataPtr(), &this->charge,
- rhofab.dataPtr(), box.loVect(), box.hiVect(),
- plo, dx, &ng);
+ DepositCharge(pti, wp, ion_lev, rho[lev].get(), 0, 0, np, thread_num, lev, lev);
}
+#ifdef _OPENMP
+ }
+#endif
- if (!local) rho[lev]->SumBoundary(gm.periodicity());
- }
+#ifdef WARPX_DIM_RZ
+ WarpX::GetInstance().ApplyInverseVolumeScalingToChargeDensity(rho[lev].get(), lev);
+#endif
- // now we average down fine to crse
- std::unique_ptr<MultiFab> crse;
- for (int lev = finest_level - 1; lev >= 0; --lev) {
- const BoxArray& fine_BA = rho[lev+1]->boxArray();
- const DistributionMapping& fine_dm = rho[lev+1]->DistributionMap();
- BoxArray coarsened_fine_BA = fine_BA;
- coarsened_fine_BA.coarsen(m_gdb->refRatio(lev));
-
- MultiFab coarsened_fine_data(coarsened_fine_BA, fine_dm, rho[lev+1]->nComp(), 0);
- coarsened_fine_data.setVal(0.0);
-
- IntVect ratio(AMREX_D_DECL(2, 2, 2)); // FIXME
-
- for (MFIter mfi(coarsened_fine_data); mfi.isValid(); ++mfi) {
- const Box& bx = mfi.validbox();
- const Box& crse_box = coarsened_fine_data[mfi].box();
- const Box& fine_box = (*rho[lev+1])[mfi].box();
- WRPX_SUM_FINE_TO_CRSE_NODAL(bx.loVect(), bx.hiVect(), ratio.getVect(),
- coarsened_fine_data[mfi].dataPtr(), crse_box.loVect(), crse_box.hiVect(),
- (*rho[lev+1])[mfi].dataPtr(), fine_box.loVect(), fine_box.hiVect());
+ if (!local) {
+ const auto& gm = m_gdb->Geom(lev);
+ rho[lev]->SumBoundary(gm.periodicity());
}
-
- rho[lev]->copy(coarsened_fine_data, m_gdb->Geom(lev).periodicity(), FabArrayBase::ADD);
}
}
@@ -841,5 +829,3 @@ WarpXParticleContainer::particlePostLocate(ParticleType& p,
if (pld.m_lev == lev-1){
}
}
-
-