aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorGravatar MaxThevenet <mthevenet@lbl.gov> 2019-08-09 15:20:52 -0700
committerGravatar GitHub <noreply@github.com> 2019-08-09 15:20:52 -0700
commita7c1afcba8dc443806780a85b8bbea3a13cc65e6 (patch)
tree868d6d23a8a36cdcf0bbf2b4b49d09c34564823b /Source
parent01cff400bde64fbfc868da0d21a6c8f860ac6a0f (diff)
parent9aac67c914099d46da73c811f77b898f7dc39e90 (diff)
downloadWarpX-a7c1afcba8dc443806780a85b8bbea3a13cc65e6.tar.gz
WarpX-a7c1afcba8dc443806780a85b8bbea3a13cc65e6.tar.zst
WarpX-a7c1afcba8dc443806780a85b8bbea3a13cc65e6.zip
Merge pull request #259 from ablelly/choose_pml_direction
Choose pml direction
Diffstat (limited to 'Source')
-rw-r--r--Source/BoundaryConditions/PML.H7
-rw-r--r--Source/BoundaryConditions/PML.cpp17
-rw-r--r--Source/Initialization/WarpXInitData.cpp18
-rw-r--r--Source/WarpX.H2
-rw-r--r--Source/WarpX.cpp26
5 files changed, 56 insertions, 14 deletions
diff --git a/Source/BoundaryConditions/PML.H b/Source/BoundaryConditions/PML.H
index b04938cd8..b34cbe88b 100644
--- a/Source/BoundaryConditions/PML.H
+++ b/Source/BoundaryConditions/PML.H
@@ -101,7 +101,8 @@ public:
#ifdef WARPX_USE_PSATD
amrex::Real dt, int nox_fft, int noy_fft, int noz_fft, bool do_nodal,
#endif
- int do_dive_cleaning, int do_moving_window);
+ int do_dive_cleaning, int do_moving_window,
+ const amrex::IntVect do_pml_Lo, const amrex::IntVect do_pml_Hi);
void ComputePMLFactors (amrex::Real dt);
@@ -172,7 +173,9 @@ private:
#endif
static amrex::BoxArray MakeBoxArray (const amrex::Geometry& geom,
- const amrex::BoxArray& grid_ba, int ncell);
+ const amrex::BoxArray& grid_ba, int ncell,
+ const amrex::IntVect do_pml_Lo,
+ const amrex::IntVect do_pml_Hi);
static void Exchange (amrex::MultiFab& pml, amrex::MultiFab& reg, const amrex::Geometry& geom);
};
diff --git a/Source/BoundaryConditions/PML.cpp b/Source/BoundaryConditions/PML.cpp
index 96bc08af9..21d348482 100644
--- a/Source/BoundaryConditions/PML.cpp
+++ b/Source/BoundaryConditions/PML.cpp
@@ -319,11 +319,12 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
#ifdef WARPX_USE_PSATD
Real dt, int nox_fft, int noy_fft, int noz_fft, bool do_nodal,
#endif
- int do_dive_cleaning, int do_moving_window)
+ int do_dive_cleaning, int do_moving_window,
+ const amrex::IntVect do_pml_Lo, const amrex::IntVect do_pml_Hi)
: m_geom(geom),
m_cgeom(cgeom)
{
- const BoxArray& ba = MakeBoxArray(*geom, grid_ba, ncell);
+ const BoxArray& ba = MakeBoxArray(*geom, grid_ba, ncell, do_pml_Lo, do_pml_Hi);
if (ba.size() == 0) {
m_ok = false;
return;
@@ -399,7 +400,7 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
BoxArray grid_cba = grid_ba;
grid_cba.coarsen(ref_ratio);
- const BoxArray& cba = MakeBoxArray(*cgeom, grid_cba, ncell);
+ const BoxArray& cba = MakeBoxArray(*cgeom, grid_cba, ncell, do_pml_Lo, do_pml_Hi);
DistributionMapping cdm{cba};
@@ -438,12 +439,18 @@ PML::PML (const BoxArray& grid_ba, const DistributionMapping& grid_dm,
}
BoxArray
-PML::MakeBoxArray (const amrex::Geometry& geom, const amrex::BoxArray& grid_ba, int ncell)
+PML::MakeBoxArray (const amrex::Geometry& geom, const amrex::BoxArray& grid_ba, int ncell,
+ 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 ( ! geom.isPeriodic(idim) ) {
- domain.grow(idim, ncell);
+ if (do_pml_Lo[idim]){
+ domain.growLo(idim, ncell);
+ }
+ if (do_pml_Hi[idim]){
+ domain.growHi(idim, ncell);
+ }
}
}
diff --git a/Source/Initialization/WarpXInitData.cpp b/Source/Initialization/WarpXInitData.cpp
index 332acb473..590c11b84 100644
--- a/Source/Initialization/WarpXInitData.cpp
+++ b/Source/Initialization/WarpXInitData.cpp
@@ -131,21 +131,35 @@ WarpX::InitPML ()
{
if (do_pml)
{
+ amrex::IntVect do_pml_Lo_corrected = do_pml_Lo;
+
+#ifdef WARPX_DIM_RZ
+ do_pml_Lo_corrected[0] = 0; // no PML at r=0, in cylindrical geometry
+#endif
pml[0].reset(new PML(boxArray(0), DistributionMap(0), &Geom(0), nullptr,
pml_ncell, pml_delta, 0,
#ifdef WARPX_USE_PSATD
dt[0], nox_fft, noy_fft, noz_fft, do_nodal,
#endif
- do_dive_cleaning, do_moving_window));
+ do_dive_cleaning, do_moving_window,
+ do_pml_Lo_corrected, do_pml_Hi));
for (int lev = 1; lev <= finest_level; ++lev)
{
+ amrex::IntVect do_pml_Lo_MR = amrex::IntVect::TheUnitVector();
+#ifdef WARPX_DIM_RZ
+ //In cylindrical geometry, if the edge of the patch is at r=0, do not add PML
+ if ((max_level > 0) && (fine_tag_lo[0]==0.)) {
+ do_pml_Lo_MR[0] = 0;
+ }
+#endif
pml[lev].reset(new PML(boxArray(lev), DistributionMap(lev),
&Geom(lev), &Geom(lev-1),
pml_ncell, pml_delta, refRatio(lev-1)[0],
#ifdef WARPX_USE_PSATD
dt[lev], nox_fft, noy_fft, noz_fft, do_nodal,
#endif
- do_dive_cleaning, do_moving_window));
+ do_dive_cleaning, do_moving_window,
+ do_pml_Lo_MR, amrex::IntVect::TheUnitVector()));
}
}
}
diff --git a/Source/WarpX.H b/Source/WarpX.H
index d8b1b9ce0..361234f45 100644
--- a/Source/WarpX.H
+++ b/Source/WarpX.H
@@ -496,6 +496,8 @@ private:
int do_pml = 1;
int pml_ncell = 10;
int pml_delta = 10;
+ amrex::IntVect do_pml_Lo = amrex::IntVect::TheUnitVector();
+ amrex::IntVect do_pml_Hi = amrex::IntVect::TheUnitVector();
amrex::Vector<std::unique_ptr<PML> > pml;
amrex::Real moving_window_x = std::numeric_limits<amrex::Real>::max();
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp
index d45dd3a71..07f124820 100644
--- a/Source/WarpX.cpp
+++ b/Source/WarpX.cpp
@@ -383,6 +383,22 @@ WarpX::ReadParameters ()
pp.query("pml_ncell", pml_ncell);
pp.query("pml_delta", pml_delta);
+ Vector<int> parse_do_pml_Lo(AMREX_SPACEDIM,1);
+ pp.queryarr("do_pml_Lo", parse_do_pml_Lo);
+ do_pml_Lo[0] = parse_do_pml_Lo[0];
+ do_pml_Lo[1] = parse_do_pml_Lo[1];
+#if (AMREX_SPACEDIM == 3)
+ do_pml_Lo[2] = parse_do_pml_Lo[2];
+#endif
+ Vector<int> parse_do_pml_Hi(AMREX_SPACEDIM,1);
+ pp.queryarr("do_pml_Hi", parse_do_pml_Hi);
+ do_pml_Hi[0] = parse_do_pml_Hi[0];
+ do_pml_Hi[1] = parse_do_pml_Hi[1];
+#if (AMREX_SPACEDIM == 3)
+ do_pml_Hi[2] = parse_do_pml_Hi[2];
+#endif
+
+
pp.query("dump_openpmd", dump_openpmd);
pp.query("dump_plotfiles", dump_plotfiles);
pp.query("plot_raw_fields", plot_raw_fields);
@@ -393,7 +409,7 @@ WarpX::ReadParameters ()
if (not user_fields_to_plot){
// If not specified, set default values
fields_to_plot = {"Ex", "Ey", "Ez", "Bx", "By",
- "Bz", "jx", "jy", "jz",
+ "Bz", "jx", "jy", "jz",
"part_per_cell"};
}
// set plot_rho to true of the users requests it, so that
@@ -411,9 +427,9 @@ WarpX::ReadParameters ()
// If user requests to plot proc_number for a serial run,
// delete proc_number from fields_to_plot
if (ParallelDescriptor::NProcs() == 1){
- fields_to_plot.erase(std::remove(fields_to_plot.begin(),
- fields_to_plot.end(),
- "proc_number"),
+ fields_to_plot.erase(std::remove(fields_to_plot.begin(),
+ fields_to_plot.end(),
+ "proc_number"),
fields_to_plot.end());
}
@@ -497,7 +513,7 @@ WarpX::ReadParameters ()
{
ParmParse pp("algo");
// If not in RZ mode, read use_picsar_deposition
- // In RZ mode, use_picsar_deposition is on, as the C++ version
+ // In RZ mode, use_picsar_deposition is on, as the C++ version
// of the deposition does not support RZ
pp.query("use_picsar_deposition", use_picsar_deposition);
current_deposition_algo = GetAlgorithmInteger(pp, "current_deposition");