aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2023-01-04 12:19:53 -0800
committerGravatar GitHub <noreply@github.com> 2023-01-04 12:19:53 -0800
commitf0ae76ee3b8e6623a34428f1bfabe0c503400a93 (patch)
tree0a6ad9ee6908c3775fc341ed461e64cb1e67944f /Source/Particles/PhysicalParticleContainer.cpp
parentf055aacbc2074835d881e34707085e63cd0e640f (diff)
downloadWarpX-f0ae76ee3b8e6623a34428f1bfabe0c503400a93.tar.gz
WarpX-f0ae76ee3b8e6623a34428f1bfabe0c503400a93.tar.zst
WarpX-f0ae76ee3b8e6623a34428f1bfabe0c503400a93.zip
Refined injection with anisotropic mesh refinement ratio (#3464)
* Correct particle positions outside refined injection * Improve test * Update benchmark * Modifications for vector refinement ratio * Update getPosition function * Update code for anisotropic injection * Correct compilation * Correct code for RZ and 1D * Correct indentation * Correct integer overflow, as suggested by Weiqun
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.cpp')
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 017be509b..9dd49017a 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -875,7 +875,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
const int nlevs = numLevels();
static bool refine_injection = false;
static Box fine_injection_box;
- static int rrfac = 1;
+ static amrex::IntVect rrfac(AMREX_D_DECL(1,1,1));
// This does not work if the mesh is dynamic. But in that case, we should
// not use refined injected either. We also assume there is only one fine level.
if (WarpX::moving_window_active(WarpX::GetInstance().getistep(0)+1) and WarpX::refine_plasma
@@ -883,9 +883,9 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
{
refine_injection = true;
fine_injection_box = ParticleBoxArray(1).minimalBox();
- fine_injection_box.setSmall(WarpX::moving_window_dir, std::numeric_limits<int>::lowest());
- fine_injection_box.setBig(WarpX::moving_window_dir, std::numeric_limits<int>::max());
- rrfac = m_gdb->refRatio(0)[0];
+ fine_injection_box.setSmall(WarpX::moving_window_dir, std::numeric_limits<int>::lowest()/2);
+ fine_injection_box.setBig(WarpX::moving_window_dir, std::numeric_limits<int>::max()/2);
+ rrfac = m_gdb->refRatio(0);
fine_injection_box.coarsen(rrfac);
}
@@ -967,7 +967,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
Gpu::DeviceVector<int> counts(overlap_box.numPts(), 0);
Gpu::DeviceVector<int> offset(overlap_box.numPts());
auto pcounts = counts.data();
- int lrrfac = rrfac;
+ amrex::IntVect lrrfac = rrfac;
Box fine_overlap_box; // default Box is NOT ok().
if (refine_injection) {
fine_overlap_box = overlap_box & amrex::shift(fine_injection_box, -shifted);
@@ -986,7 +986,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
auto index = overlap_box.index(iv);
int r;
if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) {
- r = AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac);
+ r = AMREX_D_TERM(lrrfac[0],*lrrfac[1],*lrrfac[2]);
} else {
r = 1;
}
@@ -1173,7 +1173,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
// In the refined injection region: use refinement ratio `lrrfac`
inj_pos->getPositionUnitBox(i_part, lrrfac, engine) :
// Otherwise: use 1 as the refinement ratio
- inj_pos->getPositionUnitBox(i_part, 1, engine);
+ inj_pos->getPositionUnitBox(i_part, amrex::IntVect::TheUnitVector(), engine);
auto pos = getCellCoords(overlap_corner, dx, r, iv);
#if defined(WARPX_DIM_3D)
@@ -1426,14 +1426,14 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt)
const int nlevs = numLevels();
static bool refine_injection = false;
static Box fine_injection_box;
- static int rrfac = 1;
+ static amrex::IntVect rrfac(AMREX_D_DECL(1,1,1));
// This does not work if the mesh is dynamic. But in that case, we should
// not use refined injected either. We also assume there is only one fine level.
if (WarpX::refine_plasma && nlevs == 2)
{
refine_injection = true;
fine_injection_box = ParticleBoxArray(1).minimalBox();
- rrfac = m_gdb->refRatio(0)[0];
+ rrfac = m_gdb->refRatio(0);
fine_injection_box.coarsen(rrfac);
}
@@ -1545,7 +1545,7 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt)
Gpu::DeviceVector<int> counts(overlap_box.numPts(), 0);
Gpu::DeviceVector<int> offset(overlap_box.numPts());
auto pcounts = counts.data();
- int lrrfac = rrfac;
+ amrex::IntVect lrrfac = rrfac;
Box fine_overlap_box; // default Box is NOT ok().
if (refine_injection) {
fine_overlap_box = overlap_box & amrex::shift(fine_injection_box, -shifted);
@@ -1563,7 +1563,7 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt)
auto index = overlap_box.index(iv);
int r;
if (fine_overlap_box.ok() && fine_overlap_box.contains(iv)) {
- r = AMREX_D_TERM(lrrfac,*lrrfac,*lrrfac);
+ r = AMREX_D_TERM(lrrfac[0],*lrrfac[1],*lrrfac[2]);
} else {
r = 1;
}
@@ -1711,7 +1711,7 @@ PhysicalParticleContainer::AddPlasmaFlux (amrex::Real dt)
// In the refined injection region: use refinement ratio `lrrfac`
inj_pos->getPositionUnitBox(i_part, lrrfac, engine) :
// Otherwise: use 1 as the refinement ratio
- inj_pos->getPositionUnitBox(i_part, 1, engine);
+ inj_pos->getPositionUnitBox(i_part, amrex::IntVect::TheUnitVector(), engine);
auto pos = getCellCoords(overlap_corner, dx, r, iv);
auto ppos = PDim3(pos);