aboutsummaryrefslogtreecommitdiff
path: root/Source/Parallelization
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Parallelization')
-rw-r--r--Source/Parallelization/WarpXComm.cpp125
1 files changed, 125 insertions, 0 deletions
diff --git a/Source/Parallelization/WarpXComm.cpp b/Source/Parallelization/WarpXComm.cpp
index 95ed848f1..79bcce2f4 100644
--- a/Source/Parallelization/WarpXComm.cpp
+++ b/Source/Parallelization/WarpXComm.cpp
@@ -353,6 +353,25 @@ WarpX::FillBoundaryF (IntVect ng)
}
void
+WarpX::FillBoundaryB_avg (IntVect ng, IntVect ng_extra_fine)
+{
+ for (int lev = 0; lev <= finest_level; ++lev)
+ {
+ FillBoundaryB_avg(lev, ng, ng_extra_fine);
+ }
+}
+
+void
+WarpX::FillBoundaryE_avg (IntVect ng, IntVect ng_extra_fine)
+{
+ for (int lev = 0; lev <= finest_level; ++lev)
+ {
+ FillBoundaryE_avg(lev, ng, ng_extra_fine);
+ }
+}
+
+
+void
WarpX::FillBoundaryE(int lev, IntVect ng, IntVect ng_extra_fine)
{
FillBoundaryE(lev, PatchType::fine, ng+ng_extra_fine);
@@ -475,6 +494,112 @@ WarpX::FillBoundaryB (int lev, PatchType patch_type, IntVect ng)
}
void
+WarpX::FillBoundaryE_avg(int lev, IntVect ng, IntVect ng_extra_fine)
+{
+ FillBoundaryE_avg(lev, PatchType::fine, ng+ng_extra_fine);
+ if (lev > 0) FillBoundaryE_avg(lev, PatchType::coarse, ng);
+}
+
+void
+WarpX::FillBoundaryE_avg (int lev, PatchType patch_type, IntVect ng)
+{
+ if (patch_type == PatchType::fine)
+ {
+ if (do_pml && pml[lev]->ok())
+ {
+ amrex::Abort("Averaged Galilean PSATD with PML is not yet implemented");
+ }
+
+ const auto& period = Geom(lev).periodicity();
+ if ( safe_guard_cells ){
+ Vector<MultiFab*> mf{Efield_avg_fp[lev][0].get(),Efield_avg_fp[lev][1].get(),Efield_avg_fp[lev][2].get()};
+ amrex::FillBoundary(mf, period);
+ } else {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ ng <= Efield_avg_fp[lev][0]->nGrowVect(),
+ "Error: in FillBoundaryE_avg, requested more guard cells than allocated");
+ Efield_avg_fp[lev][0]->FillBoundary(ng, period);
+ Efield_avg_fp[lev][1]->FillBoundary(ng, period);
+ Efield_avg_fp[lev][2]->FillBoundary(ng, period);
+ }
+ }
+ else if (patch_type == PatchType::coarse)
+ {
+ if (do_pml && pml[lev]->ok())
+ {
+ amrex::Abort("Averaged Galilean PSATD with PML is not yet implemented");
+ }
+
+ const auto& cperiod = Geom(lev-1).periodicity();
+ if ( safe_guard_cells ) {
+ Vector<MultiFab*> mf{Efield_avg_cp[lev][0].get(),Efield_avg_cp[lev][1].get(),Efield_avg_cp[lev][2].get()};
+ amrex::FillBoundary(mf, cperiod);
+
+ } else {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ ng <= Efield_avg_cp[lev][0]->nGrowVect(),
+ "Error: in FillBoundaryE, requested more guard cells than allocated");
+ Efield_avg_cp[lev][0]->FillBoundary(ng, cperiod);
+ Efield_avg_cp[lev][1]->FillBoundary(ng, cperiod);
+ Efield_avg_cp[lev][2]->FillBoundary(ng, cperiod);
+ }
+ }
+}
+
+
+void
+WarpX::FillBoundaryB_avg (int lev, IntVect ng, IntVect ng_extra_fine)
+{
+ FillBoundaryB_avg(lev, PatchType::fine, ng + ng_extra_fine);
+ if (lev > 0) FillBoundaryB_avg(lev, PatchType::coarse, ng);
+}
+
+void
+WarpX::FillBoundaryB_avg (int lev, PatchType patch_type, IntVect ng)
+{
+ if (patch_type == PatchType::fine)
+ {
+ if (do_pml && pml[lev]->ok())
+ {
+ amrex::Abort("Averaged Galilean PSATD with PML is not yet implemented");
+ }
+ const auto& period = Geom(lev).periodicity();
+ if ( safe_guard_cells ) {
+ Vector<MultiFab*> mf{Bfield_avg_fp[lev][0].get(),Bfield_avg_fp[lev][1].get(),Bfield_avg_fp[lev][2].get()};
+ amrex::FillBoundary(mf, period);
+ } else {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ ng <= Bfield_fp[lev][0]->nGrowVect(),
+ "Error: in FillBoundaryB, requested more guard cells than allocated");
+ Bfield_avg_fp[lev][0]->FillBoundary(ng, period);
+ Bfield_avg_fp[lev][1]->FillBoundary(ng, period);
+ Bfield_avg_fp[lev][2]->FillBoundary(ng, period);
+ }
+ }
+ else if (patch_type == PatchType::coarse)
+ {
+ if (do_pml && pml[lev]->ok())
+ {
+ amrex::Abort("Averaged Galilean PSATD with PML is not yet implemented");
+ }
+
+ const auto& cperiod = Geom(lev-1).periodicity();
+ if ( safe_guard_cells ){
+ Vector<MultiFab*> mf{Bfield_avg_cp[lev][0].get(),Bfield_avg_cp[lev][1].get(),Bfield_avg_cp[lev][2].get()};
+ amrex::FillBoundary(mf, cperiod);
+ } else {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
+ ng <= Bfield_avg_cp[lev][0]->nGrowVect(),
+ "Error: in FillBoundaryB_avg, requested more guard cells than allocated");
+ Bfield_avg_cp[lev][0]->FillBoundary(ng, cperiod);
+ Bfield_avg_cp[lev][1]->FillBoundary(ng, cperiod);
+ Bfield_avg_cp[lev][2]->FillBoundary(ng, cperiod);
+ }
+ }
+}
+
+
+void
WarpX::FillBoundaryF (int lev, IntVect ng)
{
FillBoundaryF(lev, PatchType::fine, ng);