aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/BoundaryConditions/PML.H37
-rw-r--r--Source/BoundaryConditions/PML.cpp99
2 files changed, 72 insertions, 64 deletions
diff --git a/Source/BoundaryConditions/PML.H b/Source/BoundaryConditions/PML.H
index e4cc72dac..7624bdba0 100644
--- a/Source/BoundaryConditions/PML.H
+++ b/Source/BoundaryConditions/PML.H
@@ -42,11 +42,13 @@ struct Sigma : amrex::Gpu::DeviceVector<amrex::Real>
struct SigmaBox
{
SigmaBox (const amrex::Box& box, const amrex::BoxArray& grids,
- const amrex::Real* dx, int ncell, int delta, const amrex::Box& regdomain);
+ const amrex::Real* dx, const amrex::IntVect& ncell, const amrex::IntVect& delta,
+ const amrex::Box& regdomain);
- void define_single (const amrex::Box& regdomain, int ncell,
+ void define_single (const amrex::Box& regdomain, const amrex::IntVect& ncell,
const amrex::Array<amrex::Real,AMREX_SPACEDIM>& fac);
- void define_multiple (const amrex::Box& box, const amrex::BoxArray& grids, int ncell,
+ void define_multiple (const amrex::Box& box, const amrex::BoxArray& grids,
+ const amrex::IntVect& ncell,
const amrex::Array<amrex::Real,AMREX_SPACEDIM>& fac);
void ComputePMLFactorsB (const amrex::Real* dx, amrex::Real dt);
@@ -69,7 +71,8 @@ class SigmaBoxFactory
: public amrex::FabFactory<SigmaBox>
{
public:
- SigmaBoxFactory (const amrex::BoxArray& grid_ba, const amrex::Real* dx, int ncell, int delta,
+ SigmaBoxFactory (const amrex::BoxArray& grid_ba, const amrex::Real* dx,
+ const amrex::IntVect& ncell, const amrex::IntVect& delta,
const amrex::Box& regular_domain)
: m_grids(grid_ba), m_dx(dx), m_ncell(ncell), m_delta(delta), m_regdomain(regular_domain) {}
virtual ~SigmaBoxFactory () = default;
@@ -93,8 +96,8 @@ public:
private:
const amrex::BoxArray& m_grids;
const amrex::Real* m_dx;
- int m_ncell;
- int m_delta;
+ amrex::IntVect m_ncell;
+ amrex::IntVect m_delta;
amrex::Box m_regdomain;
};
@@ -103,7 +106,8 @@ class MultiSigmaBox
{
public:
MultiSigmaBox(const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
- const amrex::BoxArray& grid_ba, const amrex::Real* dx, int ncell, int delta,
+ const amrex::BoxArray& grid_ba, const amrex::Real* dx,
+ const amrex::IntVect& ncell, const amrex::IntVect& delta,
const amrex::Box& regular_domain);
void ComputePMLFactorsB (const amrex::Real* dx, amrex::Real dt);
void ComputePMLFactorsE (const amrex::Real* dx, amrex::Real dt);
@@ -250,20 +254,23 @@ private:
const amrex::Box& regular_domain,
const amrex::Geometry& geom,
const amrex::BoxArray& grid_ba,
- int ncell, int do_pml_in_domain,
- const amrex::IntVect do_pml_Lo,
- const amrex::IntVect do_pml_Hi);
+ const amrex::IntVect& ncell,
+ int do_pml_in_domain,
+ const amrex::IntVect& do_pml_Lo,
+ const amrex::IntVect& do_pml_Hi);
static amrex::BoxArray MakeBoxArray_single (const amrex::Box& regular_domain,
const amrex::BoxArray& grid_ba,
- int ncell, const amrex::IntVect do_pml_Lo,
- const amrex::IntVect do_pml_Hi);
+ const amrex::IntVect& ncell,
+ const amrex::IntVect& do_pml_Lo,
+ const amrex::IntVect& do_pml_Hi);
static amrex::BoxArray MakeBoxArray_multiple (const amrex::Geometry& geom,
const amrex::BoxArray& grid_ba,
- int ncell, int do_pml_in_domain,
- const amrex::IntVect do_pml_Lo,
- const amrex::IntVect do_pml_Hi);
+ const amrex::IntVect& ncell,
+ int do_pml_in_domain,
+ const amrex::IntVect& do_pml_Lo,
+ const amrex::IntVect& do_pml_Hi);
static void CopyToPML (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
};
diff --git a/Source/BoundaryConditions/PML.cpp b/Source/BoundaryConditions/PML.cpp
index 352166697..6be5dbc1b 100644
--- a/Source/BoundaryConditions/PML.cpp
+++ b/Source/BoundaryConditions/PML.cpp
@@ -137,8 +137,8 @@ namespace
}
-SigmaBox::SigmaBox (const Box& box, const BoxArray& grids, const Real* dx, int ncell, int delta,
- const amrex::Box& regdomain)
+SigmaBox::SigmaBox (const Box& box, const BoxArray& grids, const Real* dx, const IntVect& ncell,
+ const IntVect& delta, const amrex::Box& regdomain)
{
BL_ASSERT(box.cellCentered());
@@ -177,7 +177,7 @@ SigmaBox::SigmaBox (const Box& box, const BoxArray& grids, const Real* dx, int n
Array<Real,AMREX_SPACEDIM> fac;
for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
- fac[idim] = 4.0_rt*PhysConst::c/(dx[idim]*static_cast<Real>(delta*delta));
+ fac[idim] = 4.0_rt*PhysConst::c/(dx[idim]*static_cast<Real>(delta[idim]*delta[idim]));
}
if (regdomain.ok()) { // The union of the regular grids is a single box
@@ -187,7 +187,7 @@ SigmaBox::SigmaBox (const Box& box, const BoxArray& grids, const Real* dx, int n
}
}
-void SigmaBox::define_single (const Box& regdomain, int ncell,
+void SigmaBox::define_single (const Box& regdomain, const IntVect& ncell,
const Array<Real,AMREX_SPACEDIM>& fac)
{
for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
@@ -197,7 +197,7 @@ void SigmaBox::define_single (const Box& regdomain, int ncell,
const int dhi = regdomain.bigEnd(idim);
// Lo
- int olo = std::max(slo, dlo-ncell);
+ int olo = std::max(slo, dlo-ncell[idim]);
int ohi = std::min(shi, dlo-1);
if (ohi >= olo) {
FillLo(sigma[idim], sigma_cumsum[idim],
@@ -218,7 +218,7 @@ void SigmaBox::define_single (const Box& regdomain, int ncell,
// Hi
olo = std::max(slo, dhi+1);
- ohi = std::min(shi, dhi+ncell);
+ ohi = std::min(shi, dhi+ncell[idim]);
if (ohi >= olo) {
FillHi(sigma[idim], sigma_cumsum[idim],
sigma_star[idim], sigma_star_cumsum[idim],
@@ -229,7 +229,7 @@ void SigmaBox::define_single (const Box& regdomain, int ncell,
amrex::Gpu::streamSynchronize();
}
-void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell,
+void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, const IntVect& ncell,
const Array<Real,AMREX_SPACEDIM>& fac)
{
const std::vector<std::pair<int,Box> >& isects = grids.intersections(box, false, ncell);
@@ -248,32 +248,32 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
{
const Box& grid_box = grids[kv.first];
- if (amrex::grow(grid_box, idim, ncell).intersects(box))
+ if (amrex::grow(grid_box, idim, ncell[idim]).intersects(box))
{
direct_faces.push_back(kv.first);
}
#if (AMREX_SPACEDIM >= 2)
- else if (amrex::grow(grid_box, jdim, ncell).intersects(box))
+ else if (amrex::grow(grid_box, jdim, ncell[jdim]).intersects(box))
{
side_faces.push_back(kv.first);
}
#if defined(WARPX_DIM_3D)
- else if (amrex::grow(grid_box, kdim, ncell).intersects(box))
+ else if (amrex::grow(grid_box, kdim, ncell[kdim]).intersects(box))
{
side_faces.push_back(kv.first);
}
- else if (amrex::grow(amrex::grow(grid_box,idim,ncell),
- jdim,ncell).intersects(box))
+ else if (amrex::grow(amrex::grow(grid_box,idim,ncell[idim]),
+ jdim,ncell[jdim]).intersects(box))
{
direct_side_edges.push_back(kv.first);
}
- else if (amrex::grow(amrex::grow(grid_box,idim,ncell),
- kdim,ncell).intersects(box))
+ else if (amrex::grow(amrex::grow(grid_box,idim,ncell[idim]),
+ kdim,ncell[kdim]).intersects(box))
{
direct_side_edges.push_back(kv.first);
}
- else if (amrex::grow(amrex::grow(grid_box,jdim,ncell),
- kdim,ncell).intersects(box))
+ else if (amrex::grow(amrex::grow(grid_box,jdim,ncell[jdim]),
+ kdim,ncell[kdim]).intersects(box))
{
side_side_edges.push_back(kv.first);
}
@@ -290,10 +290,10 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
{
const Box& grid_box = grids[gid];
- Box lobox = amrex::adjCellLo(grid_box, idim, ncell);
- lobox.grow(jdim,ncell);
+ Box lobox = amrex::adjCellLo(grid_box, idim, ncell[idim]);
+ lobox.grow(jdim,ncell[jdim]);
#if defined(WARPX_DIM_3D)
- lobox.grow(kdim,ncell);
+ lobox.grow(kdim,ncell[kdim]);
#endif
Box looverlap = lobox & box;
if (looverlap.ok()) {
@@ -303,10 +303,10 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
grid_box.smallEnd(idim), fac[idim]);
}
- Box hibox = amrex::adjCellHi(grid_box, idim, ncell);
- hibox.grow(jdim,ncell);
+ Box hibox = amrex::adjCellHi(grid_box, idim, ncell[idim]);
+ hibox.grow(jdim,ncell[jdim]);
#if defined(WARPX_DIM_3D)
- hibox.grow(kdim,ncell);
+ hibox.grow(kdim,ncell[kdim]);
#endif
Box hioverlap = hibox & box;
if (hioverlap.ok()) {
@@ -326,7 +326,7 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
for (auto gid : side_side_edges)
{
const Box& grid_box = grids[gid];
- const Box& overlap = amrex::grow(amrex::grow(grid_box,jdim,ncell),kdim,ncell) & box;
+ const Box& overlap = amrex::grow(amrex::grow(grid_box,jdim,ncell[jdim]),kdim,ncell[kdim]) & box;
if (overlap.ok()) {
FillZero(sigma[idim], sigma_cumsum[idim],
sigma_star[idim], sigma_star_cumsum[idim],
@@ -341,8 +341,8 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
{
const Box& grid_box = grids[gid];
- Box lobox = amrex::adjCellLo(grid_box, idim, ncell);
- Box looverlap = lobox.grow(jdim,ncell).grow(kdim,ncell) & box;
+ Box lobox = amrex::adjCellLo(grid_box, idim, ncell[idim]);
+ Box looverlap = lobox.grow(jdim,ncell[jdim]).grow(kdim,ncell[kdim]) & box;
if (looverlap.ok()) {
FillLo(sigma[idim], sigma_cumsum[idim],
sigma_star[idim], sigma_star_cumsum[idim],
@@ -350,8 +350,8 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
grid_box.smallEnd(idim), fac[idim]);
}
- Box hibox = amrex::adjCellHi(grid_box, idim, ncell);
- Box hioverlap = hibox.grow(jdim,ncell).grow(kdim,ncell) & box;
+ Box hibox = amrex::adjCellHi(grid_box, idim, ncell[idim]);
+ Box hioverlap = hibox.grow(jdim,ncell[jdim]).grow(kdim,ncell[kdim]) & box;
if (hioverlap.ok()) {
FillHi(sigma[idim], sigma_cumsum[idim],
sigma_star[idim], sigma_star_cumsum[idim],
@@ -370,9 +370,9 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
{
const Box& grid_box = grids[gid];
#if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
- const Box& overlap = amrex::grow(grid_box,jdim,ncell) & box;
+ const Box& overlap = amrex::grow(grid_box,jdim,ncell[jdim]) & box;
#else
- const Box& overlap = amrex::grow(amrex::grow(grid_box,jdim,ncell),kdim,ncell) & box;
+ const Box& overlap = amrex::grow(amrex::grow(grid_box,jdim,ncell[jdim]),kdim,ncell[kdim]) & box;
#endif
if (overlap.ok()) {
FillZero(sigma[idim], sigma_cumsum[idim],
@@ -388,7 +388,7 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
{
const Box& grid_box = grids[gid];
- const Box& lobox = amrex::adjCellLo(grid_box, idim, ncell);
+ const Box& lobox = amrex::adjCellLo(grid_box, idim, ncell[idim]);
Box looverlap = lobox & box;
if (looverlap.ok()) {
FillLo(sigma[idim], sigma_cumsum[idim],
@@ -397,7 +397,7 @@ void SigmaBox::define_multiple (const Box& box, const BoxArray& grids, int ncell
grid_box.smallEnd(idim), fac[idim]);
}
- const Box& hibox = amrex::adjCellHi(grid_box, idim, ncell);
+ const Box& hibox = amrex::adjCellHi(grid_box, idim, ncell[idim]);
Box hioverlap = hibox & box;
if (hioverlap.ok()) {
FillHi(sigma[idim], sigma_cumsum[idim],
@@ -489,7 +489,8 @@ SigmaBox::ComputePMLFactorsE (const Real* a_dx, Real dt)
}
MultiSigmaBox::MultiSigmaBox (const BoxArray& ba, const DistributionMapping& dm,
- const BoxArray& grid_ba, const Real* dx, int ncell, int delta,
+ const BoxArray& grid_ba, const Real* dx,
+ const IntVect& ncell, const IntVect& delta,
const amrex::Box& regular_domain)
: FabArray<SigmaBox>(ba,dm,1,0,MFInfo(),
SigmaBoxFactory(grid_ba,dx,ncell,delta, regular_domain))
@@ -564,8 +565,8 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri
BoxArray(grid_ba.boxList().intersect(domain0)) : grid_ba;
bool is_single_box_domain = domain0.numPts() == grid_ba_reduced.numPts();
- const BoxArray& ba = MakeBoxArray(is_single_box_domain, domain0, *geom, grid_ba_reduced, ncell,
- do_pml_in_domain, do_pml_Lo, do_pml_Hi);
+ const BoxArray& ba = MakeBoxArray(is_single_box_domain, domain0, *geom, grid_ba_reduced,
+ IntVect(ncell), do_pml_in_domain, do_pml_Lo, do_pml_Hi);
if (ba.empty()) {
m_ok = false;
@@ -722,7 +723,7 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri
Box single_domain_box = is_single_box_domain ? domain0 : Box();
// Empty box (i.e., Box()) means it's not a single box domain.
sigba_fp = std::make_unique<MultiSigmaBox>(ba, dm, grid_ba_reduced, geom->CellSize(),
- ncell, delta, single_domain_box);
+ IntVect(ncell), IntVect(delta), single_domain_box);
if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) {
#ifndef WARPX_USE_PSATD
@@ -780,9 +781,8 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri
const BoxArray grid_cba_reduced = (do_pml_in_domain) ?
BoxArray(grid_cba.boxList().intersect(cdomain)) : grid_cba;
-// This needs to be fixed. AMREX_ALWAYS_ASSERT(ref_ratio == ref_ratio[0]);
- const int cncells = ncell/ref_ratio[0];
- const int cdelta = delta/ref_ratio[0];
+ const IntVect cncells = IntVect(ncell)/ref_ratio;
+ const IntVect cdelta = IntVect(delta)/ref_ratio;
// Assuming that refinement ratio is equal in all dimensions
const BoxArray& cba = MakeBoxArray(is_single_box_domain, cdomain, *cgeom, grid_cba_reduced,
@@ -876,8 +876,8 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri
BoxArray
PML::MakeBoxArray (bool is_single_box_domain, const amrex::Box& regular_domain,
const amrex::Geometry& geom, const amrex::BoxArray& grid_ba,
- int ncell, int do_pml_in_domain,
- const amrex::IntVect do_pml_Lo, const amrex::IntVect do_pml_Hi)
+ const amrex::IntVect& ncell, int do_pml_in_domain,
+ const amrex::IntVect& do_pml_Lo, const amrex::IntVect& do_pml_Hi)
{
if (is_single_box_domain) {
return MakeBoxArray_single(regular_domain, grid_ba, ncell, do_pml_Lo, do_pml_Hi);
@@ -888,7 +888,8 @@ PML::MakeBoxArray (bool is_single_box_domain, const amrex::Box& regular_domain,
BoxArray
PML::MakeBoxArray_single (const amrex::Box& regular_domain, const amrex::BoxArray& grid_ba,
- int ncell, const amrex::IntVect do_pml_Lo, const amrex::IntVect do_pml_Hi)
+ const amrex::IntVect& ncell, const amrex::IntVect& do_pml_Lo,
+ const amrex::IntVect& do_pml_Hi)
{
BoxList bl;
for (int i = 0, N = grid_ba.size(); i < N; ++i) {
@@ -906,15 +907,15 @@ PML::MakeBoxArray_single (const amrex::Box& regular_domain, const amrex::BoxArra
pml_bndry = b.bigEnd(idim) == regular_domain.bigEnd(idim);
}
if (pml_bndry) {
- Box bbox = amrex::adjCell(b, ori, ncell);
+ Box bbox = amrex::adjCell(b, ori, ncell[idim]);
for (int jdim = 0; jdim < idim; ++jdim) {
if (do_pml_Lo[jdim] &&
bbox.smallEnd(jdim) == regular_domain.smallEnd(jdim)) {
- bbox.growLo(jdim, ncell);
+ bbox.growLo(jdim, ncell[jdim]);
}
if (do_pml_Hi[jdim] &&
bbox.bigEnd(jdim) == regular_domain.bigEnd(jdim)) {
- bbox.growHi(jdim, ncell);
+ bbox.growHi(jdim, ncell[jdim]);
}
}
bl.push_back(bbox);
@@ -927,16 +928,16 @@ PML::MakeBoxArray_single (const amrex::Box& regular_domain, const amrex::BoxArra
BoxArray
PML::MakeBoxArray_multiple (const amrex::Geometry& geom, const amrex::BoxArray& grid_ba,
- int ncell, int do_pml_in_domain,
- const amrex::IntVect do_pml_Lo, const amrex::IntVect do_pml_Hi)
+ const amrex::IntVect& ncell, int do_pml_in_domain,
+ const amrex::IntVect& do_pml_Lo, const amrex::IntVect& do_pml_Hi)
{
Box domain = geom.Domain();
for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
if (do_pml_Lo[idim]){
- domain.growLo(idim, ncell);
+ domain.growLo(idim, ncell[idim]);
}
if (do_pml_Hi[idim]){
- domain.growHi(idim, ncell);
+ domain.growHi(idim, ncell[idim]);
}
}
BoxList bl;
@@ -952,7 +953,7 @@ PML::MakeBoxArray_multiple (const amrex::Geometry& geom, const amrex::BoxArray&
for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) {
if (do_pml_Lo[idim] || do_pml_Hi[idim]) {
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
- grid_bx.length(idim) > ncell,
+ grid_bx.length(idim) > ncell[idim],
"Consider using larger amr.blocking_factor with PMLs");
}
}