aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/BoundaryConditions/PML.H18
-rw-r--r--Source/BoundaryConditions/PML.cpp82
-rw-r--r--Source/FieldSolver/WarpXPushFieldsEM.cpp2
-rw-r--r--Source/Initialization/WarpXInitData.cpp6
-rw-r--r--Source/Parallelization/WarpXComm.cpp18
5 files changed, 71 insertions, 55 deletions
diff --git a/Source/BoundaryConditions/PML.H b/Source/BoundaryConditions/PML.H
index 62a378986..c64eb8193 100644
--- a/Source/BoundaryConditions/PML.H
+++ b/Source/BoundaryConditions/PML.H
@@ -81,7 +81,7 @@ struct SigmaBox
SigmaVect sigma_star_cum_fac;
std::string pml_type; // if pml normal to x : if pml Hi : pml_type={1,0,0}; if pml Lo: pml_type={-1,0,0}
- std::array<int,5> pml_type_array;
+ std::array<int,5> pml_type_array;
};
namespace amrex {
@@ -128,7 +128,7 @@ class PML
public:
PML (const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
const amrex::Geometry* geom, const amrex::Geometry* cgeom,
- int ncell, int delta, int ref_ratio, int do_dive_cleaning, int do_moving_window, int pml_has_particles);
+ int ncell, int delta, int ref_ratio, int do_dive_cleaning, int do_moving_window, int pml_has_particles, int do_pml_in_domain);
void ComputePMLFactors (amrex::Real dt);
@@ -149,25 +149,25 @@ public:
{ return *sigba_cp; }
void ExchangeB (const std::array<amrex::MultiFab*,3>& B_fp,
- const std::array<amrex::MultiFab*,3>& B_cp);
+ const std::array<amrex::MultiFab*,3>& B_cp, int do_pml_in_domain);
void ExchangeE (const std::array<amrex::MultiFab*,3>& E_fp,
- const std::array<amrex::MultiFab*,3>& E_cp);
+ const std::array<amrex::MultiFab*,3>& E_cp, int do_pml_in_domain);
void CopyJinPMLs (const std::array<amrex::MultiFab*,3>& j_fp,
const std::array<amrex::MultiFab*,3>& j_cp);
void CopyJinReg (const std::array<amrex::MultiFab*,3>& j_fp,
const std::array<amrex::MultiFab*,3>& j_cp);
void ExchangeB (PatchType patch_type,
- const std::array<amrex::MultiFab*,3>& Bp);
+ const std::array<amrex::MultiFab*,3>& Bp, int do_pml_in_domain);
void ExchangeE (PatchType patch_type,
- const std::array<amrex::MultiFab*,3>& Ep);
+ const std::array<amrex::MultiFab*,3>& Ep, int do_pml_in_domain);
void CopyJinPMLs (PatchType patch_type,
const std::array<amrex::MultiFab*,3>& jp);
void CopyJinReg (PatchType patch_type,
const std::array<amrex::MultiFab*,3>& jp);
- void ExchangeF (amrex::MultiFab* F_fp, amrex::MultiFab* F_cp);
- void ExchangeF (PatchType patch_type, amrex::MultiFab* Fp);
+ void ExchangeF (amrex::MultiFab* F_fp, amrex::MultiFab* F_cp, int do_pml_in_domain);
+ void ExchangeF (PatchType patch_type, amrex::MultiFab* Fp, int do_pml_in_domain);
void FillBoundary ();
void FillBoundaryE ();
@@ -205,7 +205,7 @@ private:
static amrex::BoxArray MakeBoxArray (const amrex::Geometry& geom,
const amrex::BoxArray& grid_ba, int ncell);
- static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
+ static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom, int do_pml_in_domain);
static void CopyRegInPMLs (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
static void CopyPMLsInReg (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
};
diff --git a/Source/BoundaryConditions/PML.cpp b/Source/BoundaryConditions/PML.cpp
index 1f1cc80c3..c8d8585d8 100644
--- a/Source/BoundaryConditions/PML.cpp
+++ b/Source/BoundaryConditions/PML.cpp
@@ -474,10 +474,11 @@ MultiSigmaBox::ComputePMLFactorsE (const Real* dx, Real dt)
PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
const Geometry* geom, const Geometry* cgeom,
- int ncell, int delta, int ref_ratio, int do_dive_cleaning, int do_moving_window, int pml_has_particles)
+ int ncell, int delta, int ref_ratio, int do_dive_cleaning, int do_moving_window, int pml_has_particles, int do_pml_in_domain)
: m_geom(geom),
m_cgeom(cgeom)
{
+
Box domain0 = geom->Domain();
for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
if ( ! geom->isPeriodic(idim) ) {
@@ -486,7 +487,11 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
}
const BoxArray grid_ba_reduced = BoxArray(grid_ba.boxList().intersect(domain0));
- const BoxArray& ba = MakeBoxArray(*geom, grid_ba_reduced, ncell); //MakeBoxArray(*geom, grid_ba, ncell);
+ // const BoxArray& ba = MakeBoxArray(*geom, grid_ba_reduced, ncell);
+ //
+ // const BoxArray& ba = MakeBoxArray(*geom, grid_ba, ncell);
+ const BoxArray& ba = (do_pml_in_domain)? MakeBoxArray(*geom, grid_ba_reduced, ncell) : MakeBoxArray(*geom, grid_ba, ncell);
+
if (ba.size() == 0) {
m_ok = false;
return;
@@ -529,8 +534,13 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
pml_F_fp->setVal(0.0);
}
+ if (do_pml_in_domain){
+ sigba_fp.reset(new MultiSigmaBox(ba, dm, grid_ba_reduced, geom->CellSize(), ncell, delta));
+ }
+ else {
+ sigba_fp.reset(new MultiSigmaBox(ba, dm, grid_ba, geom->CellSize(), ncell, delta));
+ }
- sigba_fp.reset(new MultiSigmaBox(ba, dm, grid_ba_reduced, geom->CellSize(), ncell, delta));
if (cgeom)
{
@@ -541,7 +551,8 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
BoxArray grid_cba = grid_ba;
grid_cba.coarsen(ref_ratio);
const BoxArray grid_cba_reduced = BoxArray(grid_cba.boxList().intersect(domain0));
- const BoxArray& cba = MakeBoxArray(*cgeom, grid_cba_reduced, ncell);
+ // const BoxArray& cba = MakeBoxArray(*cgeom, grid_cba_reduced, ncell);
+ const BoxArray& cba = (do_pml_in_domain) ? MakeBoxArray(*cgeom, grid_cba_reduced, ncell) : MakeBoxArray(*cgeom, grid_cba, ncell);
DistributionMapping cdm{cba};
@@ -572,8 +583,13 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
pml_j_cp[1]->setVal(0.0);
pml_j_cp[2]->setVal(0.0);
- // sigba_cp.reset(new MultiSigmaBox(cba, cdm, grid_cba, cgeom->CellSize(), ncell, delta));
- sigba_cp.reset(new MultiSigmaBox(cba, cdm, grid_cba_reduced, cgeom->CellSize(), ncell, delta));
+ if (do_pml_in_domain){
+ sigba_cp.reset(new MultiSigmaBox(cba, cdm, grid_cba_reduced, cgeom->CellSize(), ncell, delta));
+ }
+ else {
+ sigba_cp.reset(new MultiSigmaBox(cba, cdm, grid_cba, cgeom->CellSize(), ncell, delta));
+ }
+
}
}
@@ -701,53 +717,53 @@ PML::GetF_cp ()
void
PML::ExchangeB (const std::array<amrex::MultiFab*,3>& B_fp,
- const std::array<amrex::MultiFab*,3>& B_cp)
+ const std::array<amrex::MultiFab*,3>& B_cp, int do_pml_in_domain)
{
- ExchangeB(PatchType::fine, B_fp);
- ExchangeB(PatchType::coarse, B_cp);
+ ExchangeB(PatchType::fine, B_fp, do_pml_in_domain);
+ ExchangeB(PatchType::coarse, B_cp, do_pml_in_domain);
}
void
PML::ExchangeB (PatchType patch_type,
- const std::array<amrex::MultiFab*,3>& Bp)
+ const std::array<amrex::MultiFab*,3>& Bp, int do_pml_in_domain)
{
if (patch_type == PatchType::fine && pml_B_fp[0] && Bp[0])
{
- Exchange(*pml_B_fp[0], *Bp[0], *m_geom);
- Exchange(*pml_B_fp[1], *Bp[1], *m_geom);
- Exchange(*pml_B_fp[2], *Bp[2], *m_geom);
+ Exchange(*pml_B_fp[0], *Bp[0], *m_geom, do_pml_in_domain);
+ Exchange(*pml_B_fp[1], *Bp[1], *m_geom, do_pml_in_domain);
+ Exchange(*pml_B_fp[2], *Bp[2], *m_geom, do_pml_in_domain);
}
else if (patch_type == PatchType::coarse && pml_B_cp[0] && Bp[0])
{
- Exchange(*pml_B_cp[0], *Bp[0], *m_cgeom);
- Exchange(*pml_B_cp[1], *Bp[1], *m_cgeom);
- Exchange(*pml_B_cp[2], *Bp[2], *m_cgeom);
+ Exchange(*pml_B_cp[0], *Bp[0], *m_cgeom, do_pml_in_domain);
+ Exchange(*pml_B_cp[1], *Bp[1], *m_cgeom, do_pml_in_domain);
+ Exchange(*pml_B_cp[2], *Bp[2], *m_cgeom, do_pml_in_domain);
}
}
void
PML::ExchangeE (const std::array<amrex::MultiFab*,3>& E_fp,
- const std::array<amrex::MultiFab*,3>& E_cp)
+ const std::array<amrex::MultiFab*,3>& E_cp, int do_pml_in_domain)
{
- ExchangeE(PatchType::fine, E_fp);
- ExchangeE(PatchType::coarse, E_cp);
+ ExchangeE(PatchType::fine, E_fp, do_pml_in_domain);
+ ExchangeE(PatchType::coarse, E_cp, do_pml_in_domain);
}
void
PML::ExchangeE (PatchType patch_type,
- const std::array<amrex::MultiFab*,3>& Ep)
+ const std::array<amrex::MultiFab*,3>& Ep, int do_pml_in_domain)
{
if (patch_type == PatchType::fine && pml_E_fp[0] && Ep[0])
{
- Exchange(*pml_E_fp[0], *Ep[0], *m_geom);
- Exchange(*pml_E_fp[1], *Ep[1], *m_geom);
- Exchange(*pml_E_fp[2], *Ep[2], *m_geom);
+ Exchange(*pml_E_fp[0], *Ep[0], *m_geom, do_pml_in_domain);
+ Exchange(*pml_E_fp[1], *Ep[1], *m_geom, do_pml_in_domain);
+ Exchange(*pml_E_fp[2], *Ep[2], *m_geom, do_pml_in_domain);
}
else if (patch_type == PatchType::coarse && pml_E_cp[0] && Ep[0])
{
- Exchange(*pml_E_cp[0], *Ep[0], *m_cgeom);
- Exchange(*pml_E_cp[1], *Ep[1], *m_cgeom);
- Exchange(*pml_E_cp[2], *Ep[2], *m_cgeom);
+ Exchange(*pml_E_cp[0], *Ep[0], *m_cgeom, do_pml_in_domain);
+ Exchange(*pml_E_cp[1], *Ep[1], *m_cgeom, do_pml_in_domain);
+ Exchange(*pml_E_cp[2], *Ep[2], *m_cgeom, do_pml_in_domain);
}
}
@@ -804,19 +820,19 @@ PML::CopyJinReg (const std::array<amrex::MultiFab*,3>& j_fp,
}
void
-PML::ExchangeF (MultiFab* F_fp, MultiFab* F_cp)
+PML::ExchangeF (MultiFab* F_fp, MultiFab* F_cp, int do_pml_in_domain)
{
- ExchangeF(PatchType::fine, F_fp);
- ExchangeF(PatchType::coarse, F_cp);
+ ExchangeF(PatchType::fine, F_fp, do_pml_in_domain);
+ ExchangeF(PatchType::coarse, F_cp, do_pml_in_domain);
}
void
-PML::ExchangeF (PatchType patch_type, MultiFab* Fp)
+PML::ExchangeF (PatchType patch_type, MultiFab* Fp, int do_pml_in_domain)
{
if (patch_type == PatchType::fine && pml_F_fp && Fp) {
- Exchange(*pml_F_fp, *Fp, *m_geom);
+ Exchange(*pml_F_fp, *Fp, *m_geom, do_pml_in_domain);
} else if (patch_type == PatchType::coarse && pml_F_cp && Fp) {
- Exchange(*pml_F_cp, *Fp, *m_cgeom);
+ Exchange(*pml_F_cp, *Fp, *m_cgeom, do_pml_in_domain);
}
}
@@ -864,7 +880,7 @@ PML::ExchangeF (PatchType patch_type, MultiFab* Fp)
// }
void
-PML::Exchange (MultiFab& pml, MultiFab& reg, const Geometry& geom)
+PML::Exchange (MultiFab& pml, MultiFab& reg, const Geometry& geom, int do_pml_in_domain)
{
const IntVect& ngr = reg.nGrowVect();
diff --git a/Source/FieldSolver/WarpXPushFieldsEM.cpp b/Source/FieldSolver/WarpXPushFieldsEM.cpp
index 298b03dc6..8b749fc54 100644
--- a/Source/FieldSolver/WarpXPushFieldsEM.cpp
+++ b/Source/FieldSolver/WarpXPushFieldsEM.cpp
@@ -315,7 +315,7 @@ WarpX::EvolveE (int lev, PatchType patch_type, amrex::Real a_dt)
if (do_pml && pml[lev]->ok())
{
- if (F) pml[lev]->ExchangeF(patch_type, F);
+ if (F) pml[lev]->ExchangeF(patch_type, F, do_pml_in_domain);
const auto& pml_B = (patch_type == PatchType::fine) ? pml[lev]->GetB_fp() : pml[lev]->GetB_cp();
const auto& pml_E = (patch_type == PatchType::fine) ? pml[lev]->GetE_fp() : pml[lev]->GetE_cp();
diff --git a/Source/Initialization/WarpXInitData.cpp b/Source/Initialization/WarpXInitData.cpp
index 76704bcfe..5598b29fd 100644
--- a/Source/Initialization/WarpXInitData.cpp
+++ b/Source/Initialization/WarpXInitData.cpp
@@ -134,13 +134,13 @@ WarpX::InitPML ()
if (do_pml)
{
pml[0].reset(new PML(boxArray(0), DistributionMap(0), &Geom(0), nullptr,
- pml_ncell, pml_delta, 0, do_dive_cleaning, do_moving_window, pml_has_particles)); //pml_has_particles));
+ pml_ncell, pml_delta, 0, do_dive_cleaning, do_moving_window, pml_has_particles, do_pml_in_domain)); //pml_has_particles));
for (int lev = 1; lev <= finest_level; ++lev)
{
pml[lev].reset(new PML(boxArray(lev), DistributionMap(lev),
&Geom(lev), &Geom(lev-1),
pml_ncell, pml_delta, refRatio(lev-1)[0], do_dive_cleaning,
- do_moving_window, pml_has_particles)); //pml_has_particles));
+ do_moving_window, pml_has_particles, do_pml_in_domain)); //pml_has_particles));
}
}
}
@@ -322,7 +322,7 @@ WarpX::InitLevelData (int lev, Real time)
void
WarpX::InitLevelDataFFT (int lev, Real time)
{
-
+
Efield_fp_fft[lev][0]->setVal(0.0);
Efield_fp_fft[lev][1]->setVal(0.0);
Efield_fp_fft[lev][2]->setVal(0.0);
diff --git a/Source/Parallelization/WarpXComm.cpp b/Source/Parallelization/WarpXComm.cpp
index 9d85783b0..7c00a5297 100644
--- a/Source/Parallelization/WarpXComm.cpp
+++ b/Source/Parallelization/WarpXComm.cpp
@@ -18,7 +18,7 @@ WarpX::ExchangeWithPmlB (int lev)
Bfield_fp[lev][2].get() },
{ Bfield_cp[lev][0].get(),
Bfield_cp[lev][1].get(),
- Bfield_cp[lev][2].get() });
+ Bfield_cp[lev][2].get() }, do_pml_in_domain);
}
}
@@ -31,7 +31,7 @@ WarpX::ExchangeWithPmlE (int lev)
Efield_fp[lev][2].get() },
{ Efield_cp[lev][0].get(),
Efield_cp[lev][1].get(),
- Efield_cp[lev][2].get() });
+ Efield_cp[lev][2].get() }, do_pml_in_domain);
}
}
@@ -40,7 +40,7 @@ WarpX::ExchangeWithPmlF (int lev)
{
if (do_pml && pml[lev]->ok()) {
pml[lev]->ExchangeF(F_fp[lev].get(),
- F_cp[lev].get());
+ F_cp[lev].get(), do_pml_in_domain);
}
}
@@ -252,7 +252,7 @@ WarpX::FillBoundaryE (int lev, PatchType patch_type)
pml[lev]->ExchangeE(patch_type,
{ Efield_fp[lev][0].get(),
Efield_fp[lev][1].get(),
- Efield_fp[lev][2].get() });
+ Efield_fp[lev][2].get() }, do_pml_in_domain);
pml[lev]->FillBoundaryE(patch_type);
}
@@ -267,7 +267,7 @@ WarpX::FillBoundaryE (int lev, PatchType patch_type)
pml[lev]->ExchangeE(patch_type,
{ Efield_cp[lev][0].get(),
Efield_cp[lev][1].get(),
- Efield_cp[lev][2].get() });
+ Efield_cp[lev][2].get() }, do_pml_in_domain);
pml[lev]->FillBoundaryE(patch_type);
}
@@ -294,7 +294,7 @@ WarpX::FillBoundaryB (int lev, PatchType patch_type)
pml[lev]->ExchangeB(patch_type,
{ Bfield_fp[lev][0].get(),
Bfield_fp[lev][1].get(),
- Bfield_fp[lev][2].get() });
+ Bfield_fp[lev][2].get() }, do_pml_in_domain);
pml[lev]->FillBoundaryB(patch_type);
}
const auto& period = Geom(lev).periodicity();
@@ -308,7 +308,7 @@ WarpX::FillBoundaryB (int lev, PatchType patch_type)
pml[lev]->ExchangeB(patch_type,
{ Bfield_cp[lev][0].get(),
Bfield_cp[lev][1].get(),
- Bfield_cp[lev][2].get() });
+ Bfield_cp[lev][2].get() }, do_pml_in_domain);
pml[lev]->FillBoundaryB(patch_type);
}
const auto& cperiod = Geom(lev-1).periodicity();
@@ -331,7 +331,7 @@ WarpX::FillBoundaryF (int lev, PatchType patch_type)
{
if (do_pml && pml[lev]->ok())
{
- pml[lev]->ExchangeF(patch_type, F_fp[lev].get());
+ pml[lev]->ExchangeF(patch_type, F_fp[lev].get(), do_pml_in_domain);
pml[lev]->FillBoundaryF(patch_type);
}
@@ -342,7 +342,7 @@ WarpX::FillBoundaryF (int lev, PatchType patch_type)
{
if (do_pml && pml[lev]->ok())
{
- pml[lev]->ExchangeF(patch_type, F_cp[lev].get());
+ pml[lev]->ExchangeF(patch_type, F_cp[lev].get(), do_pml_in_domain);
pml[lev]->FillBoundaryF(patch_type);
}