aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/FieldSolver/ElectrostaticSolver.cpp10
-rw-r--r--Source/Initialization/WarpXInitData.cpp77
-rw-r--r--Source/Parallelization/WarpXRegrid.cpp228
-rw-r--r--Source/Particles/ParticleBoundaryBuffer.H1
-rw-r--r--Source/Particles/ParticleBoundaryBuffer.cpp14
-rw-r--r--Source/WarpX.H10
6 files changed, 137 insertions, 203 deletions
diff --git a/Source/FieldSolver/ElectrostaticSolver.cpp b/Source/FieldSolver/ElectrostaticSolver.cpp
index 242ddb9c2..f604661bd 100644
--- a/Source/FieldSolver/ElectrostaticSolver.cpp
+++ b/Source/FieldSolver/ElectrostaticSolver.cpp
@@ -103,8 +103,8 @@ WarpX::AddSpaceChargeField (WarpXParticleContainer& pc)
for (int lev = 0; lev <= max_level; lev++) {
BoxArray nba = boxArray(lev);
nba.surroundingNodes();
- rho[lev] = std::make_unique<MultiFab>(nba, dmap[lev], 1, ng);
- phi[lev] = std::make_unique<MultiFab>(nba, dmap[lev], 1, 1);
+ rho[lev] = std::make_unique<MultiFab>(nba, DistributionMap(lev), 1, ng);
+ phi[lev] = std::make_unique<MultiFab>(nba, DistributionMap(lev), 1, 1);
phi[lev]->setVal(0.);
}
@@ -269,7 +269,7 @@ WarpX::computePhiRZ (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho
amrex::BoxArray nba = boxArray(lev);
nba.enclosedCells(); // Get cell centered array (correct?)
- sigma[lev] = std::make_unique<MultiFab>(nba, dmap[lev], 1, 0);
+ sigma[lev] = std::make_unique<MultiFab>(nba, DistributionMap(lev), 1, 0);
for ( MFIter mfi(*sigma[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi )
{
const amrex::Box& tbx = mfi.tilebox();
@@ -318,7 +318,7 @@ WarpX::computePhiRZ (const amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho
setPhiBC(phi, phi_bc_values_lo, phi_bc_values_hi);
// Define the linear operator (Poisson operator)
- MLNodeLaplacian linop( geom_scaled, boxArray(), dmap );
+ MLNodeLaplacian linop( geom_scaled, boxArray(), DistributionMap() );
for (int lev = 0; lev <= max_level; ++lev) {
linop.setSigma( lev, *sigma[lev] );
@@ -413,7 +413,7 @@ WarpX::computePhiCartesian (const amrex::Vector<std::unique_ptr<amrex::MultiFab>
for (int lev = 0; lev <= max_level; ++lev) {
eb_factory[lev] = &WarpX::fieldEBFactory(lev);
}
- MLEBNodeFDLaplacian linop( Geom(), boxArray(), dmap, info, eb_factory);
+ MLEBNodeFDLaplacian linop( Geom(), boxArray(), DistributionMap(), info, eb_factory);
// Note: this assumes that the beam is propagating along
// one of the axes of the grid, i.e. that only *one* of the Cartesian
diff --git a/Source/Initialization/WarpXInitData.cpp b/Source/Initialization/WarpXInitData.cpp
index 59b7d1f25..41fda5567 100644
--- a/Source/Initialization/WarpXInitData.cpp
+++ b/Source/Initialization/WarpXInitData.cpp
@@ -485,42 +485,7 @@ WarpX::InitLevelData (int lev, Real /*time*/)
}
#ifdef AMREX_USE_EB
- if(lev==maxLevel()) {
- if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::Yee ||
- WarpX::maxwell_solver_id == MaxwellSolverAlgo::CKC ||
- WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) {
-
- ComputeEdgeLengths();
- ComputeFaceAreas();
- ScaleEdges();
- ScaleAreas();
-
- const auto &period = Geom(lev).periodicity();
- WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][0], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][1], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][2], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_face_areas[lev][0], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_face_areas[lev][1], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_face_areas[lev][2], guard_cells.ng_alloc_EB, period);
-
- if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) {
- WarpXCommUtil::FillBoundary(*m_area_mod[lev][0], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_area_mod[lev][1], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_area_mod[lev][2], guard_cells.ng_alloc_EB, period);
- MarkCells();
- WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][0], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][1], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][2], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][0], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][1], guard_cells.ng_alloc_EB, period);
- WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][2], guard_cells.ng_alloc_EB, period);
- ComputeFaceExtensions();
- }
- }
-
- ComputeDistanceToEB();
-
- }
+ InitializeEBGridData(lev);
#endif
// if the input string for the B-field is "parse_b_ext_grid_function",
@@ -869,3 +834,43 @@ void WarpX::CheckGuardCells(amrex::MultiFab const& mf)
}
}
}
+
+void WarpX::InitializeEBGridData(int lev)
+{
+ if(lev==maxLevel()) {
+ if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::Yee ||
+ WarpX::maxwell_solver_id == MaxwellSolverAlgo::CKC ||
+ WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) {
+
+ ComputeEdgeLengths();
+ ComputeFaceAreas();
+ ScaleEdges();
+ ScaleAreas();
+
+ const auto &period = Geom(lev).periodicity();
+ WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][0], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][1], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_edge_lengths[lev][2], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_face_areas[lev][0], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_face_areas[lev][1], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_face_areas[lev][2], guard_cells.ng_alloc_EB, period);
+
+ if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT) {
+ WarpXCommUtil::FillBoundary(*m_area_mod[lev][0], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_area_mod[lev][1], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_area_mod[lev][2], guard_cells.ng_alloc_EB, period);
+ MarkCells();
+ WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][0], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][1], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_flag_info_face[lev][2], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][0], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][1], guard_cells.ng_alloc_EB, period);
+ WarpXCommUtil::FillBoundary(*m_flag_ext_face[lev][2], guard_cells.ng_alloc_EB, period);
+ ComputeFaceExtensions();
+ }
+ }
+
+ ComputeDistanceToEB();
+
+ }
+}
diff --git a/Source/Parallelization/WarpXRegrid.cpp b/Source/Parallelization/WarpXRegrid.cpp
index 06e8b99ea..c96d5e1c7 100644
--- a/Source/Parallelization/WarpXRegrid.cpp
+++ b/Source/Parallelization/WarpXRegrid.cpp
@@ -11,6 +11,7 @@
#include "Diagnostics/MultiDiagnostics.H"
#include "Diagnostics/ReducedDiags/MultiReducedDiags.H"
#include "Particles/MultiParticleContainer.H"
+#include "Particles/ParticleBoundaryBuffer.H"
#include "Particles/WarpXParticleContainer.H"
#include "Utils/WarpXAlgorithmSelection.H"
#include "Utils/WarpXProfilerWrapper.H"
@@ -131,6 +132,9 @@ WarpX::LoadBalance ()
mypc->Redistribute();
mypc->defineAllParticleTiles();
+ // redistribute particle boundary buffer
+ m_particle_boundary_buffer->redistribute();
+
// diagnostics & reduced diagnostics
// not yet needed:
//multi_diags->LoadBalance();
@@ -140,6 +144,17 @@ WarpX::LoadBalance ()
}
+template <typename MultiFabType> void
+RemakeMultiFab (std::unique_ptr<MultiFabType>& mf, const DistributionMapping& dm,
+ const bool redistribute)
+{
+ if (mf == nullptr) return;
+ const IntVect& ng = mf->nGrowVect();
+ auto pmf = std::make_unique<MultiFabType>(mf->boxArray(), dm, mf->nComp(), ng);
+ if (redistribute) pmf->Redistribute(*mf, 0, 0, mf->nComp(), ng);
+ mf = std::move(pmf);
+}
+
void
WarpX::RemakeLevel (int lev, Real /*time*/, const BoxArray& ba, const DistributionMapping& dm)
{
@@ -147,75 +162,49 @@ WarpX::RemakeLevel (int lev, Real /*time*/, const BoxArray& ba, const Distributi
{
if (ParallelDescriptor::NProcs() == 1) return;
-#ifdef AMREX_USE_EB
- m_field_factory[lev] = amrex::makeEBFabFactory(Geom(lev), ba, dm,
- {1,1,1}, // Not clear how many ghost cells we need yet
- amrex::EBSupport::full);
- ComputeEdgeLengths();
- ComputeFaceAreas();
- ScaleEdges();
- ScaleAreas();
- ComputeDistanceToEB();
-#else
- m_field_factory[lev] = std::make_unique<FArrayBoxFactory>();
-#endif
-
// Fine patch
for (int idim=0; idim < 3; ++idim)
{
- {
- const IntVect& ng = Bfield_fp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Bfield_fp[lev][idim]->boxArray(),
- dm, Bfield_fp[lev][idim]->nComp(), ng);
- pmf->Redistribute(*Bfield_fp[lev][idim], 0, 0, Bfield_fp[lev][idim]->nComp(), ng);
- Bfield_fp[lev][idim] = std::move(pmf);
- }
- {
- const IntVect& ng = Efield_fp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Efield_fp[lev][idim]->boxArray(),
- dm, Efield_fp[lev][idim]->nComp(), ng);
- pmf->Redistribute(*Efield_fp[lev][idim], 0, 0, Efield_fp[lev][idim]->nComp(), ng);
- Efield_fp[lev][idim] = std::move(pmf);
- }
- {
- const IntVect& ng = current_fp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(current_fp[lev][idim]->boxArray(),
- dm, current_fp[lev][idim]->nComp(), ng);
- current_fp[lev][idim] = std::move(pmf);
- }
- if (current_store[lev][idim])
- {
- const IntVect& ng = current_store[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(current_store[lev][idim]->boxArray(),
- dm, current_store[lev][idim]->nComp(), ng);
- // no need to redistribute
- current_store[lev][idim] = std::move(pmf);
+ RemakeMultiFab(Bfield_fp[lev][idim], dm, true);
+ RemakeMultiFab(Efield_fp[lev][idim], dm, true);
+ RemakeMultiFab(current_fp[lev][idim], dm, false);
+ RemakeMultiFab(current_store[lev][idim], dm, false);
+
+#ifdef AMREX_USE_EB
+ if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::Yee ||
+ WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT ||
+ WarpX::maxwell_solver_id == MaxwellSolverAlgo::CKC){
+ RemakeMultiFab(m_edge_lengths[lev][idim], dm, false);
+ RemakeMultiFab(m_face_areas[lev][idim], dm, false);
+ if(WarpX::maxwell_solver_id == MaxwellSolverAlgo::ECT){
+ RemakeMultiFab(Venl[lev][idim], dm, false);
+ RemakeMultiFab(m_flag_info_face[lev][idim], dm, false);
+ RemakeMultiFab(m_flag_ext_face[lev][idim], dm, false);
+ RemakeMultiFab(m_area_mod[lev][idim], dm, false);
+ RemakeMultiFab(ECTRhofield[lev][idim], dm, false);
+ m_borrowing[lev][idim] = std::make_unique<amrex::LayoutData<FaceInfoBox>>(amrex::convert(ba, Bfield_fp[lev][idim]->ixType().toIntVect()), dm);
+ }
}
+#endif
}
- if (F_fp[lev] != nullptr) {
- const IntVect& ng = F_fp[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(F_fp[lev]->boxArray(),
- dm, F_fp[lev]->nComp(), ng);
- pmf->Redistribute(*F_fp[lev], 0, 0, F_fp[lev]->nComp(), ng);
- F_fp[lev] = std::move(pmf);
- }
+ RemakeMultiFab(F_fp[lev], dm, true);
+ RemakeMultiFab(rho_fp[lev], dm, false);
+ // phi_fp should be redistributed since we use the solution from
+ // the last step as the initial guess for the next solve
+ RemakeMultiFab(phi_fp[lev], dm, true);
- if (rho_fp[lev] != nullptr) {
- const int nc = rho_fp[lev]->nComp();
- const IntVect& ng = rho_fp[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(rho_fp[lev]->boxArray(),
- dm, nc, ng);
- rho_fp[lev] = std::move(pmf);
- }
+#ifdef AMREX_USE_EB
+ RemakeMultiFab(m_distance_to_eb[lev], dm, false);
- if (phi_fp[lev] != nullptr) {
- const int nc = phi_fp[lev]->nComp();
- const IntVect& ng = phi_fp[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(phi_fp[lev]->boxArray(),
- dm, nc, ng);
- phi_fp[lev] = std::move(pmf);
- }
+ m_field_factory[lev] = amrex::makeEBFabFactory(Geom(lev), ba, dm,
+ {1,1,1}, // Not clear how many ghost cells we need yet
+ amrex::EBSupport::full);
+
+ InitializeEBGridData(lev);
+#else
+ m_field_factory[lev] = std::make_unique<FArrayBoxFactory>();
+#endif
#ifdef WARPX_USE_PSATD
if (maxwell_solver_id == MaxwellSolverAlgo::PSATD) {
@@ -261,20 +250,8 @@ WarpX::RemakeLevel (int lev, Real /*time*/, const BoxArray& ba, const Distributi
} else {
for (int idim=0; idim < 3; ++idim)
{
- {
- const IntVect& ng = Bfield_aux[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Bfield_aux[lev][idim]->boxArray(),
- dm, Bfield_aux[lev][idim]->nComp(), ng);
- // pmf->Redistribute(*Bfield_aux[lev][idim], 0, 0, Bfield_aux[lev][idim]->nComp(), ng);
- Bfield_aux[lev][idim] = std::move(pmf);
- }
- {
- const IntVect& ng = Efield_aux[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Efield_aux[lev][idim]->boxArray(),
- dm, Efield_aux[lev][idim]->nComp(), ng);
- // pmf->Redistribute(*Efield_aux[lev][idim], 0, 0, Efield_aux[lev][idim]->nComp(), ng);
- Efield_aux[lev][idim] = std::move(pmf);
- }
+ RemakeMultiFab(Bfield_aux[lev][idim], dm, false);
+ RemakeMultiFab(Efield_aux[lev][idim], dm, false);
}
}
@@ -282,43 +259,12 @@ WarpX::RemakeLevel (int lev, Real /*time*/, const BoxArray& ba, const Distributi
if (lev > 0) {
for (int idim=0; idim < 3; ++idim)
{
- {
- const IntVect& ng = Bfield_cp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Bfield_cp[lev][idim]->boxArray(),
- dm, Bfield_cp[lev][idim]->nComp(), ng);
- pmf->Redistribute(*Bfield_cp[lev][idim], 0, 0, Bfield_cp[lev][idim]->nComp(), ng);
- Bfield_cp[lev][idim] = std::move(pmf);
- }
- {
- const IntVect& ng = Efield_cp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Efield_cp[lev][idim]->boxArray(),
- dm, Efield_cp[lev][idim]->nComp(), ng);
- pmf->Redistribute(*Efield_cp[lev][idim], 0, 0, Efield_cp[lev][idim]->nComp(), ng);
- Efield_cp[lev][idim] = std::move(pmf);
- }
- {
- const IntVect& ng = current_cp[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(current_cp[lev][idim]->boxArray(),
- dm, current_cp[lev][idim]->nComp(), ng);
- current_cp[lev][idim] = std::move(pmf);
- }
- }
-
- if (F_cp[lev] != nullptr) {
- const IntVect& ng = F_cp[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(F_cp[lev]->boxArray(),
- dm, F_cp[lev]->nComp(), ng);
- pmf->Redistribute(*F_cp[lev], 0, 0, F_cp[lev]->nComp(), ng);
- F_cp[lev] = std::move(pmf);
- }
-
- if (rho_cp[lev] != nullptr) {
- const int nc = rho_cp[lev]->nComp();
- const IntVect& ng = rho_cp[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(rho_cp[lev]->boxArray(),
- dm, nc, ng);
- rho_cp[lev] = std::move(pmf);
+ RemakeMultiFab(Bfield_cp[lev][idim], dm, true);
+ RemakeMultiFab(Efield_cp[lev][idim], dm, true);
+ RemakeMultiFab(current_cp[lev][idim], dm, false);
}
+ RemakeMultiFab(F_cp[lev], dm, true);
+ RemakeMultiFab(rho_cp[lev], dm, false);
#ifdef WARPX_USE_PSATD
if (maxwell_solver_id == MaxwellSolverAlgo::PSATD) {
@@ -358,57 +304,15 @@ WarpX::RemakeLevel (int lev, Real /*time*/, const BoxArray& ba, const Distributi
if (lev > 0 && (n_field_gather_buffer > 0 || n_current_deposition_buffer > 0)) {
for (int idim=0; idim < 3; ++idim)
{
- if (Bfield_cax[lev][idim])
- {
- const IntVect& ng = Bfield_cax[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Bfield_cax[lev][idim]->boxArray(),
- dm, Bfield_cax[lev][idim]->nComp(), ng);
- // pmf->ParallelCopy(*Bfield_cax[lev][idim], 0, 0, Bfield_cax[lev][idim]->nComp(), ng, ng);
- Bfield_cax[lev][idim] = std::move(pmf);
- }
- if (Efield_cax[lev][idim])
- {
- const IntVect& ng = Efield_cax[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(Efield_cax[lev][idim]->boxArray(),
- dm, Efield_cax[lev][idim]->nComp(), ng);
- // pmf->ParallelCopy(*Efield_cax[lev][idim], 0, 0, Efield_cax[lev][idim]->nComp(), ng, ng);
- Efield_cax[lev][idim] = std::move(pmf);
- }
- if (current_buf[lev][idim])
- {
- const IntVect& ng = current_buf[lev][idim]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(current_buf[lev][idim]->boxArray(),
- dm, current_buf[lev][idim]->nComp(), ng);
- // pmf->ParallelCopy(*current_buf[lev][idim], 0, 0, current_buf[lev][idim]->nComp(), ng, ng);
- current_buf[lev][idim] = std::move(pmf);
- }
- }
- if (charge_buf[lev])
- {
- const IntVect& ng = charge_buf[lev]->nGrowVect();
- auto pmf = std::make_unique<MultiFab>(charge_buf[lev]->boxArray(),
- dm, charge_buf[lev]->nComp(), ng);
- // pmf->ParallelCopy(*charge_buf[lev][idim], 0, 0, charge_buf[lev]->nComp(), ng, ng);
- charge_buf[lev] = std::move(pmf);
- }
- if (current_buffer_masks[lev])
- {
- const IntVect& ng = current_buffer_masks[lev]->nGrowVect();
- auto pmf = std::make_unique<iMultiFab>(current_buffer_masks[lev]->boxArray(),
- dm, current_buffer_masks[lev]->nComp(), ng);
- // we can avoid this since we immediately re-build the values via BuildBufferMasks()
- // pmf->Redistribute(*current_buffer_masks[lev], 0, 0, current_buffer_masks[lev]->nComp(), ng);
- current_buffer_masks[lev] = std::move(pmf);
- }
- if (gather_buffer_masks[lev])
- {
- const IntVect& ng = gather_buffer_masks[lev]->nGrowVect();
- auto pmf = std::make_unique<iMultiFab>(gather_buffer_masks[lev]->boxArray(),
- dm, gather_buffer_masks[lev]->nComp(), ng);
- // we can avoid this since we immediately re-build the values via BuildBufferMasks()
- // pmf->Redistribute(*gather_buffer_masks[lev], 0, 0, gather_buffer_masks[lev]->nComp(), ng);
- gather_buffer_masks[lev] = std::move(pmf);
+ RemakeMultiFab(Bfield_cax[lev][idim], dm, false);
+ RemakeMultiFab(Efield_cax[lev][idim], dm, false);
+ RemakeMultiFab(current_buf[lev][idim], dm, false);
}
+ RemakeMultiFab(charge_buf[lev], dm, false);
+ // we can avoid redistributing these since we immediately re-build the values via BuildBufferMasks()
+ RemakeMultiFab(current_buffer_masks[lev], dm, false);
+ RemakeMultiFab(gather_buffer_masks[lev], dm, false);
+
if (current_buffer_masks[lev] || gather_buffer_masks[lev])
BuildBufferMasks();
}
@@ -458,7 +362,7 @@ WarpX::ComputeCostsHeuristic (amrex::Vector<std::unique_ptr<amrex::LayoutData<am
}
}
- //Cell loop
+ // Cell loop
MultiFab* Ex = Efield_fp[lev][0].get();
for (MFIter mfi(*Ex, false); mfi.isValid(); ++mfi)
{
diff --git a/Source/Particles/ParticleBoundaryBuffer.H b/Source/Particles/ParticleBoundaryBuffer.H
index e2c9264f8..d2ac9f035 100644
--- a/Source/Particles/ParticleBoundaryBuffer.H
+++ b/Source/Particles/ParticleBoundaryBuffer.H
@@ -36,6 +36,7 @@ public:
void gatherParticles (MultiParticleContainer& mypc,
const amrex::Vector<const amrex::MultiFab*>& distance_to_eb);
+ void redistribute ();
void clearParticles ();
void printNumParticles () const;
diff --git a/Source/Particles/ParticleBoundaryBuffer.cpp b/Source/Particles/ParticleBoundaryBuffer.cpp
index 16465ac76..64efcefeb 100644
--- a/Source/Particles/ParticleBoundaryBuffer.cpp
+++ b/Source/Particles/ParticleBoundaryBuffer.cpp
@@ -112,6 +112,20 @@ void ParticleBoundaryBuffer::printNumParticles () const {
#endif
}
+void ParticleBoundaryBuffer::redistribute () {
+ for (int i = 0; i < numBoundaries(); ++i)
+ {
+ auto& buffer = m_particle_containers[i];
+ for (int ispecies = 0; ispecies < numSpecies(); ++ispecies)
+ {
+ auto& species_buffer = buffer[ispecies];
+ if (species_buffer.isDefined()) {
+ species_buffer.Redistribute();
+ }
+ }
+ }
+}
+
void ParticleBoundaryBuffer::clearParticles () {
for (int i = 0; i < numBoundaries(); ++i)
{
diff --git a/Source/WarpX.H b/Source/WarpX.H
index c263b07fd..b62753cbc 100644
--- a/Source/WarpX.H
+++ b/Source/WarpX.H
@@ -746,6 +746,16 @@ public:
amrex::ParserExecutor<3> const& zfield_parser,
std::array< std::unique_ptr<amrex::MultiFab>, 3 > const& geom_data, const int lev);
+ /**
+ * \brief
+ * This function initializes and calculates grid quantities used along with
+ * EBs such as edge lengths, face areas, distance to EB, etc. It also
+ * appropriately communicates EB data to guard cells.
+ *
+ * \param[in] lev, level of the Multifabs that is initialized
+ */
+ void InitializeEBGridData(int lev);
+
/** \brief adds particle and cell contributions in cells to compute heuristic
* cost in each box on each level, and records in `costs`
* @param[in] costs vector of (`unique_ptr` to) vectors; expected to be initialized