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.cpp207
1 files changed, 114 insertions, 93 deletions
diff --git a/Source/Parallelization/WarpXComm.cpp b/Source/Parallelization/WarpXComm.cpp
index 27c01b6b3..373cb281a 100644
--- a/Source/Parallelization/WarpXComm.cpp
+++ b/Source/Parallelization/WarpXComm.cpp
@@ -953,43 +953,79 @@ void WarpX::RestrictCurrentFromFineToCoarsePatch (
CoarsenMR::Coarsen( *crse[2], *fine[2], refinement_ratio );
}
-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,
+void WarpX::ApplyFilterJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
const int lev,
- PatchType patch_type)
+ const int idim)
{
- const int glev = (patch_type == PatchType::fine) ? lev : lev-1;
- const amrex::Periodicity& period = Geom(glev).periodicity();
- 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();
- if (WarpX::do_current_centering)
- {
+ amrex::MultiFab& J = *current[lev][idim];
+
+ const int ncomp = J.nComp();
+ const amrex::IntVect ngrow = J.nGrowVect();
+ amrex::MultiFab Jf(J.boxArray(), J.DistributionMap(), ncomp, ngrow);
+ bilinear_filter.ApplyStencil(Jf, J, lev);
+
+ const int srccomp = 0;
+ const int dstcomp = 0;
+ amrex::MultiFab::Copy(J, Jf, srccomp, dstcomp, ncomp, ngrow);
+}
+
+void WarpX::ApplyFilterJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
+ const int lev)
+{
+ for (int idim=0; idim<3; ++idim)
+ {
+ ApplyFilterJ(current, lev, idim);
+ }
+}
+
+void WarpX::SumBoundaryJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
+ const int lev,
+ const int idim,
+ const amrex::Periodicity& period)
+{
+ amrex::MultiFab& J = *current[lev][idim];
+
+ amrex::IntVect ng = J.nGrowVect();
+ amrex::IntVect ng_depos_J = get_ng_depos_J();
+
+ if (WarpX::do_current_centering)
+ {
#if defined(WARPX_DIM_1D_Z)
- ng_depos_J[0] += WarpX::current_centering_noz / 2;
+ ng_depos_J[0] += WarpX::current_centering_noz / 2;
#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
- ng_depos_J[0] += WarpX::current_centering_nox / 2;
- ng_depos_J[1] += WarpX::current_centering_noz / 2;
+ ng_depos_J[0] += WarpX::current_centering_nox / 2;
+ ng_depos_J[1] += WarpX::current_centering_noz / 2;
#elif defined(WARPX_DIM_3D)
- ng_depos_J[0] += WarpX::current_centering_nox / 2;
- ng_depos_J[1] += WarpX::current_centering_noy / 2;
- ng_depos_J[2] += WarpX::current_centering_noz / 2;
+ ng_depos_J[0] += WarpX::current_centering_nox / 2;
+ ng_depos_J[1] += WarpX::current_centering_noy / 2;
+ ng_depos_J[2] += WarpX::current_centering_noz / 2;
#endif
- }
- if (use_filter) {
- ng += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J.min(ng);
- MultiFab jf(j[idim]->boxArray(), j[idim]->DistributionMap(), j[idim]->nComp(), ng);
- bilinear_filter.ApplyStencil(jf, *j[idim], lev);
- WarpXSumGuardCells(*(j[idim]), jf, period, ng_depos_J, 0, (j[idim])->nComp());
- } else {
- ng_depos_J.min(ng);
- WarpXSumGuardCells(*(j[idim]), period, ng_depos_J, 0, (j[idim])->nComp());
- }
+ }
+
+ if (use_filter)
+ {
+ ng_depos_J += bilinear_filter.stencil_length_each_dir - amrex::IntVect(1);
+ }
+
+ ng_depos_J.min(ng);
+
+ const amrex::IntVect src_ngrow = ng_depos_J;
+ const int icomp = 0;
+ const int ncomp = J.nComp();
+ WarpXSumGuardCells(J, period, src_ngrow, icomp, ncomp);
+}
+
+void WarpX::SumBoundaryJ (
+ const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& current,
+ const int lev,
+ const amrex::Periodicity& period)
+{
+ for (int idim=0; idim<3; ++idim)
+ {
+ SumBoundaryJ(current, lev, idim, period);
}
}
@@ -1011,88 +1047,73 @@ void WarpX::AddCurrentFromFineLevelandSumBoundary (
const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>,3>>& J_cp,
const int lev)
{
- ApplyFilterandSumBoundaryJ(J_fp, J_cp, lev, PatchType::fine);
+ const amrex::Periodicity& period = Geom(lev).periodicity();
- if (lev < finest_level) {
+ if (use_filter)
+ {
+ ApplyFilterJ(J_fp, lev);
+ }
+ SumBoundaryJ(J_fp, lev, period);
+
+ if (lev < finest_level)
+ {
// When there are current buffers, unlike coarse patch,
// we don't care about the final state of them.
- const amrex::Periodicity& period = Geom(lev).periodicity();
- for (int idim = 0; idim < 3; ++idim) {
+ for (int idim=0; idim<3; ++idim)
+ {
MultiFab mf(J_fp[lev][idim]->boxArray(),
J_fp[lev][idim]->DistributionMap(), J_fp[lev][idim]->nComp(), 0);
mf.setVal(0.0);
+
IntVect ng = J_cp[lev+1][idim]->nGrowVect();
- IntVect ng_depos_J = get_ng_depos_J();
- if (WarpX::do_current_centering)
- {
-#if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
- ng_depos_J[0] += WarpX::current_centering_nox / 2;
- ng_depos_J[1] += WarpX::current_centering_noz / 2;
-#elif defined(WARPX_DIM_3D)
- ng_depos_J[0] += WarpX::current_centering_nox / 2;
- ng_depos_J[1] += WarpX::current_centering_noy / 2;
- ng_depos_J[2] += WarpX::current_centering_noz / 2;
-#endif
- }
+
if (use_filter && current_buf[lev+1][idim])
{
- // coarse patch of fine level
- ng += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J.min(ng);
- MultiFab jfc(J_cp[lev+1][idim]->boxArray(),
- J_cp[lev+1][idim]->DistributionMap(), J_cp[lev+1][idim]->nComp(), ng);
- bilinear_filter.ApplyStencil(jfc, *J_cp[lev+1][idim], lev+1);
-
- // buffer patch of fine level
- MultiFab jfb(current_buf[lev+1][idim]->boxArray(),
- current_buf[lev+1][idim]->DistributionMap(), current_buf[lev+1][idim]->nComp(), ng);
- bilinear_filter.ApplyStencil(jfb, *current_buf[lev+1][idim], lev+1);
-
- MultiFab::Add(jfb, jfc, 0, 0, current_buf[lev+1][idim]->nComp(), ng);
- ablastr::utils::communication::ParallelAdd(mf, jfb, 0, 0, current_buf[lev + 1][idim]->nComp(),
- ng, IntVect::TheZeroVector(), WarpX::do_single_precision_comms, period);
-
- WarpXSumGuardCells(*J_cp[lev+1][idim], jfc, period, ng_depos_J, 0, J_cp[lev+1][idim]->nComp());
+ ApplyFilterJ(J_cp, lev+1, idim);
+ ApplyFilterJ(current_buf, lev+1, idim);
+
+ MultiFab::Add(
+ *current_buf[lev+1][idim], *J_cp[lev+1][idim],
+ 0, 0, current_buf[lev+1][idim]->nComp(), ng);
+
+ ablastr::utils::communication::ParallelAdd(
+ mf, *current_buf[lev+1][idim], 0, 0,
+ current_buf[lev+1][idim]->nComp(),
+ ng, amrex::IntVect(0),
+ do_single_precision_comms, period);
}
else if (use_filter) // but no buffer
{
- // coarse patch of fine level
- ng += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J += bilinear_filter.stencil_length_each_dir-1;
- ng_depos_J.min(ng);
- MultiFab jf(J_cp[lev+1][idim]->boxArray(),
- J_cp[lev+1][idim]->DistributionMap(), J_cp[lev+1][idim]->nComp(), ng);
- bilinear_filter.ApplyStencil(jf, *J_cp[lev+1][idim], lev+1);
-
- ablastr::utils::communication::ParallelAdd(mf, jf, 0, 0, J_cp[lev + 1][idim]->nComp(), ng,
- IntVect::TheZeroVector(), WarpX::do_single_precision_comms, period);
- WarpXSumGuardCells(*J_cp[lev+1][idim], jf, period, ng_depos_J, 0, J_cp[lev+1][idim]->nComp());
+ ApplyFilterJ(J_cp, lev+1, idim);
+
+ ablastr::utils::communication::ParallelAdd(
+ mf, *J_cp[lev+1][idim], 0, 0,
+ J_cp[lev+1][idim]->nComp(),
+ ng, amrex::IntVect(0),
+ do_single_precision_comms, period);
}
else if (current_buf[lev+1][idim]) // but no filter
{
- ng_depos_J.min(ng);
- MultiFab::Add(*current_buf[lev+1][idim],
- *J_cp [lev+1][idim], 0, 0, current_buf[lev+1][idim]->nComp(),
- J_cp[lev+1][idim]->nGrowVect());
- ablastr::utils::communication::ParallelAdd(mf, *current_buf[lev + 1][idim], 0, 0,
- current_buf[lev + 1][idim]->nComp(),
- current_buf[lev + 1][idim]->nGrowVect(),
- IntVect::TheZeroVector(), WarpX::do_single_precision_comms,
- period);
- WarpXSumGuardCells(*(J_cp[lev+1][idim]), period, ng_depos_J, 0, J_cp[lev+1][idim]->nComp());
+ MultiFab::Add(
+ *current_buf[lev+1][idim], *J_cp[lev+1][idim],
+ 0, 0, current_buf[lev+1][idim]->nComp(), ng);
+
+ ablastr::utils::communication::ParallelAdd(
+ mf, *current_buf[lev+1][idim], 0, 0,
+ current_buf[lev+1][idim]->nComp(),
+ ng, amrex::IntVect(0),
+ do_single_precision_comms, period);
}
else // no filter, no buffer
{
- ng_depos_J.min(ng);
- ablastr::utils::communication::ParallelAdd(mf, *J_cp[lev + 1][idim], 0, 0,
- J_cp[lev + 1][idim]->nComp(),
- J_cp[lev + 1][idim]->nGrowVect(),
- IntVect::TheZeroVector(), WarpX::do_single_precision_comms,
- period);
- WarpXSumGuardCells(*(J_cp[lev+1][idim]), period, ng_depos_J, 0, J_cp[lev+1][idim]->nComp());
+ ablastr::utils::communication::ParallelAdd(
+ mf, *J_cp[lev+1][idim], 0, 0,
+ J_cp[lev+1][idim]->nComp(),
+ ng, amrex::IntVect(0),
+ do_single_precision_comms, period);
}
+ SumBoundaryJ(J_cp, lev+1, idim, period);
MultiFab::Add(*J_fp[lev][idim], mf, 0, 0, J_fp[lev+1][idim]->nComp(), 0);
}
}