diff options
author | 2023-01-04 12:19:53 -0800 | |
---|---|---|
committer | 2023-01-04 12:19:53 -0800 | |
commit | f0ae76ee3b8e6623a34428f1bfabe0c503400a93 (patch) | |
tree | 0a6ad9ee6908c3775fc341ed461e64cb1e67944f /Source/Particles/PhysicalParticleContainer.cpp | |
parent | f055aacbc2074835d881e34707085e63cd0e640f (diff) | |
download | WarpX-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.cpp | 24 |
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); |