aboutsummaryrefslogtreecommitdiff
path: root/Source/Parallelization/WarpXComm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Parallelization/WarpXComm.cpp')
-rw-r--r--Source/Parallelization/WarpXComm.cpp157
1 files changed, 87 insertions, 70 deletions
diff --git a/Source/Parallelization/WarpXComm.cpp b/Source/Parallelization/WarpXComm.cpp
index 80068e539..df26d4030 100644
--- a/Source/Parallelization/WarpXComm.cpp
+++ b/Source/Parallelization/WarpXComm.cpp
@@ -909,43 +909,45 @@ WarpX::SyncRho ()
// - add the coarse patch/buffer of `lev+1` into the fine patch of `lev`
// - sum guard cells of the coarse patch of `lev+1` and fine patch of `lev`
for (int lev=0; lev <= finest_level; ++lev) {
- AddRhoFromFineLevelandSumBoundary(lev, 0, ncomp);
+ AddRhoFromFineLevelandSumBoundary(rho_fp, rho_cp, lev, 0, ncomp);
}
}
/** \brief Fills the values of the current on the coarse patch by
* averaging the values of the current of the fine patch (on the same level).
*/
-void
-WarpX::RestrictCurrentFromFineToCoarsePatch (int lev)
+void WarpX::RestrictCurrentFromFineToCoarsePatch (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
+ const int lev)
{
- current_cp[lev][0]->setVal(0.0);
- current_cp[lev][1]->setVal(0.0);
- current_cp[lev][2]->setVal(0.0);
+ J_cp[lev][0]->setVal(0.0);
+ J_cp[lev][1]->setVal(0.0);
+ J_cp[lev][2]->setVal(0.0);
const IntVect& refinement_ratio = refRatio(lev-1);
- std::array<const MultiFab*,3> fine { current_fp[lev][0].get(),
- current_fp[lev][1].get(),
- current_fp[lev][2].get() };
- std::array< MultiFab*,3> crse { current_cp[lev][0].get(),
- current_cp[lev][1].get(),
- current_cp[lev][2].get() };
+ std::array<const MultiFab*,3> fine { J_fp[lev][0].get(),
+ J_fp[lev][1].get(),
+ J_fp[lev][2].get() };
+ std::array< MultiFab*,3> crse { J_cp[lev][0].get(),
+ J_cp[lev][1].get(),
+ J_cp[lev][2].get() };
CoarsenMR::Coarsen( *crse[0], *fine[0], refinement_ratio );
CoarsenMR::Coarsen( *crse[1], *fine[1], refinement_ratio );
CoarsenMR::Coarsen( *crse[2], *fine[2], refinement_ratio );
}
-void
-WarpX::ApplyFilterandSumBoundaryJ (
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
- int lev, PatchType patch_type)
+void WarpX::ApplyFilterandSumBoundaryJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
+ const int lev,
+ PatchType patch_type)
{
const int glev = (patch_type == PatchType::fine) ? lev : lev-1;
const amrex::Periodicity& period = Geom(glev).periodicity();
- std::array<std::unique_ptr<amrex::MultiFab>,3>& j = (patch_type == PatchType::fine) ?
- J_fp[lev] : J_cp[lev];
+ const std::array<std::unique_ptr<amrex::MultiFab>,3>& j = (patch_type == PatchType::fine) ?
+ J_fp[lev] : J_cp[lev];
for (int idim = 0; idim < 3; ++idim) {
IntVect ng = j[idim]->nGrowVect();
IntVect ng_depos_J = get_ng_depos_J();
@@ -989,11 +991,10 @@ WarpX::ApplyFilterandSumBoundaryJ (
* Then update the fine patch of `lev` by adding the currents for the coarse
* patch (and buffer region) of `lev+1`
*/
-void
-WarpX::AddCurrentFromFineLevelandSumBoundary (
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
- int lev)
+void WarpX::AddCurrentFromFineLevelandSumBoundary (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
+ const int lev)
{
ApplyFilterandSumBoundaryJ(J_fp, J_cp, lev, PatchType::fine);
@@ -1078,27 +1079,34 @@ WarpX::AddCurrentFromFineLevelandSumBoundary (
NodalSyncJ(J_fp, J_cp, lev, PatchType::fine);
}
-void
-WarpX::RestrictRhoFromFineToCoarsePatch (int lev)
+void WarpX::RestrictRhoFromFineToCoarsePatch (
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
+ const int lev)
{
- if (rho_fp[lev]) {
- rho_cp[lev]->setVal(0.0);
+ if (charge_fp[lev]) {
+ charge_cp[lev]->setVal(0.0);
const IntVect& refinement_ratio = refRatio(lev-1);
- CoarsenMR::Coarsen( *rho_cp[lev], *rho_fp[lev], refinement_ratio );
+ CoarsenMR::Coarsen( *charge_cp[lev], *charge_fp[lev], refinement_ratio );
}
}
-void
-WarpX::ApplyFilterandSumBoundaryRho (int lev, PatchType patch_type, int icomp, int ncomp)
+void WarpX::ApplyFilterandSumBoundaryRho (
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
+ const int lev,
+ PatchType patch_type,
+ const int icomp,
+ const int ncomp)
{
const int glev = (patch_type == PatchType::fine) ? lev : lev-1;
- std::unique_ptr<amrex::MultiFab>& r = (patch_type == PatchType::fine) ? rho_fp[lev] : rho_cp[lev];
- if (r == nullptr) return;
- ApplyFilterandSumBoundaryRho(lev, glev, *r, icomp, ncomp);
+ const std::unique_ptr<amrex::MultiFab>& rho = (patch_type == PatchType::fine) ?
+ charge_fp[lev] : charge_cp[lev];
+ if (rho == nullptr) return;
+ ApplyFilterandSumBoundaryRho(lev, glev, *rho, icomp, ncomp);
}
-void
-WarpX::ApplyFilterandSumBoundaryRho (int /*lev*/, int glev, amrex::MultiFab& rho, int icomp, int ncomp)
+void WarpX::ApplyFilterandSumBoundaryRho (int /*lev*/, int glev, amrex::MultiFab& rho, int icomp, int ncomp)
{
const amrex::Periodicity& period = Geom(glev).periodicity();
IntVect ng = rho.nGrowVect();
@@ -1129,21 +1137,25 @@ WarpX::ApplyFilterandSumBoundaryRho (int /*lev*/, int glev, amrex::MultiFab& rho
* Then update the fine patch of `lev` by adding the charge density for the coarse
* patch (and buffer region) of `lev+1`
*/
-void
-WarpX::AddRhoFromFineLevelandSumBoundary(int lev, int icomp, int ncomp)
+void WarpX::AddRhoFromFineLevelandSumBoundary (
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
+ const int lev,
+ const int icomp,
+ const int ncomp)
{
- if (!rho_fp[lev]) return;
+ if (!charge_fp[lev]) return;
- ApplyFilterandSumBoundaryRho(lev, PatchType::fine, icomp, ncomp);
+ ApplyFilterandSumBoundaryRho(charge_fp, charge_cp, lev, PatchType::fine, icomp, ncomp);
if (lev < finest_level){
const amrex::Periodicity& period = Geom(lev).periodicity();
- MultiFab mf(rho_fp[lev]->boxArray(),
- rho_fp[lev]->DistributionMap(),
+ MultiFab mf(charge_fp[lev]->boxArray(),
+ charge_fp[lev]->DistributionMap(),
ncomp, 0);
mf.setVal(0.0);
- IntVect ng = rho_cp[lev+1]->nGrowVect();
+ IntVect ng = charge_cp[lev+1]->nGrowVect();
IntVect ng_depos_rho = get_ng_depos_rho();
if (use_filter && charge_buf[lev+1])
{
@@ -1151,9 +1163,9 @@ WarpX::AddRhoFromFineLevelandSumBoundary(int lev, int icomp, int ncomp)
ng += bilinear_filter.stencil_length_each_dir-1;
ng_depos_rho += bilinear_filter.stencil_length_each_dir-1;
ng_depos_rho.min(ng);
- MultiFab rhofc(rho_cp[lev+1]->boxArray(),
- rho_cp[lev+1]->DistributionMap(), ncomp, ng);
- bilinear_filter.ApplyStencil(rhofc, *rho_cp[lev+1], lev+1, icomp, 0, ncomp);
+ MultiFab rhofc(charge_cp[lev+1]->boxArray(),
+ charge_cp[lev+1]->DistributionMap(), ncomp, ng);
+ bilinear_filter.ApplyStencil(rhofc, *charge_cp[lev+1], lev+1, icomp, 0, ncomp);
// buffer patch of fine level
MultiFab rhofb(charge_buf[lev+1]->boxArray(),
@@ -1163,52 +1175,52 @@ WarpX::AddRhoFromFineLevelandSumBoundary(int lev, int icomp, int ncomp)
MultiFab::Add(rhofb, rhofc, 0, 0, ncomp, ng);
WarpXCommUtil::ParallelAdd(mf, rhofb, 0, 0, ncomp, ng, IntVect::TheZeroVector(), period);
- WarpXSumGuardCells( *rho_cp[lev+1], rhofc, period, ng_depos_rho, icomp, ncomp );
+ WarpXSumGuardCells( *charge_cp[lev+1], rhofc, period, ng_depos_rho, icomp, ncomp );
}
else if (use_filter) // but no buffer
{
ng += bilinear_filter.stencil_length_each_dir-1;
ng_depos_rho += bilinear_filter.stencil_length_each_dir-1;
ng_depos_rho.min(ng);
- MultiFab rf(rho_cp[lev+1]->boxArray(), rho_cp[lev+1]->DistributionMap(), ncomp, ng);
- bilinear_filter.ApplyStencil(rf, *rho_cp[lev+1], lev+1, icomp, 0, ncomp);
+ MultiFab rf(charge_cp[lev+1]->boxArray(), charge_cp[lev+1]->DistributionMap(), ncomp, ng);
+ bilinear_filter.ApplyStencil(rf, *charge_cp[lev+1], lev+1, icomp, 0, ncomp);
WarpXCommUtil::ParallelAdd(mf, rf, 0, 0, ncomp, ng, IntVect::TheZeroVector(), period);
- WarpXSumGuardCells( *rho_cp[lev+1], rf, period, ng_depos_rho, icomp, ncomp );
+ WarpXSumGuardCells( *charge_cp[lev+1], rf, period, ng_depos_rho, icomp, ncomp );
}
else if (charge_buf[lev+1]) // but no filter
{
ng_depos_rho.min(ng);
MultiFab::Add(*charge_buf[lev+1],
- *rho_cp[lev+1], icomp, icomp, ncomp,
- rho_cp[lev+1]->nGrowVect());
+ *charge_cp[lev+1], icomp, icomp, ncomp,
+ charge_cp[lev+1]->nGrowVect());
WarpXCommUtil::ParallelAdd(mf, *charge_buf[lev+1], icomp, 0,
ncomp,
charge_buf[lev+1]->nGrowVect(), IntVect::TheZeroVector(),
period);
- WarpXSumGuardCells(*(rho_cp[lev+1]), period, ng_depos_rho, icomp, ncomp);
+ WarpXSumGuardCells(*(charge_cp[lev+1]), period, ng_depos_rho, icomp, ncomp);
}
else // no filter, no buffer
{
ng_depos_rho.min(ng);
- WarpXCommUtil::ParallelAdd(mf, *rho_cp[lev+1], icomp, 0, ncomp,
- rho_cp[lev+1]->nGrowVect(), IntVect::TheZeroVector(),
+ WarpXCommUtil::ParallelAdd(mf, *charge_cp[lev+1], icomp, 0, ncomp,
+ charge_cp[lev+1]->nGrowVect(), IntVect::TheZeroVector(),
period);
- WarpXSumGuardCells(*(rho_cp[lev+1]), period, ng_depos_rho, icomp, ncomp);
+ WarpXSumGuardCells(*(charge_cp[lev+1]), period, ng_depos_rho, icomp, ncomp);
}
- MultiFab::Add(*rho_fp[lev], mf, 0, icomp, ncomp, 0);
- NodalSyncRho(lev+1, PatchType::coarse, icomp, ncomp);
+ MultiFab::Add(*charge_fp[lev], mf, 0, icomp, ncomp, 0);
+ NodalSyncRho(charge_fp, charge_cp, lev+1, PatchType::coarse, icomp, ncomp);
}
- NodalSyncRho(lev, PatchType::fine, icomp, ncomp);
+ NodalSyncRho(charge_fp, charge_cp, lev, PatchType::fine, icomp, ncomp);
}
-void
-WarpX::NodalSyncJ (
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
- amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
- int lev, PatchType patch_type)
+void WarpX::NodalSyncJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_fp,
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
+ const int lev,
+ PatchType patch_type)
{
if (!override_sync_intervals.contains(istep[0])) return;
@@ -1228,21 +1240,26 @@ WarpX::NodalSyncJ (
}
}
-void
-WarpX::NodalSyncRho (int lev, PatchType patch_type, int icomp, int ncomp)
+void WarpX::NodalSyncRho (
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_fp,
+ const amrex::Vector<std::unique_ptr<amrex::MultiFab>>& charge_cp,
+ const int lev,
+ PatchType patch_type,
+ const int icomp,
+ const int ncomp)
{
if (!override_sync_intervals.contains(istep[0])) return;
- if (patch_type == PatchType::fine && rho_fp[lev])
+ if (patch_type == PatchType::fine && charge_fp[lev])
{
const amrex::Periodicity& period = Geom(lev).periodicity();
- MultiFab rhof(*rho_fp[lev], amrex::make_alias, icomp, ncomp);
+ MultiFab rhof(*charge_fp[lev], amrex::make_alias, icomp, ncomp);
WarpXCommUtil::OverrideSync(rhof, period);
}
- else if (patch_type == PatchType::coarse && rho_cp[lev])
+ else if (patch_type == PatchType::coarse && charge_cp[lev])
{
const amrex::Periodicity& cperiod = Geom(lev-1).periodicity();
- MultiFab rhoc(*rho_cp[lev], amrex::make_alias, icomp, ncomp);
+ MultiFab rhoc(*charge_cp[lev], amrex::make_alias, icomp, ncomp);
WarpXCommUtil::OverrideSync(rhoc, cperiod);
}
}