aboutsummaryrefslogtreecommitdiff
path: root/Source/Filter/Filter.cpp
diff options
context:
space:
mode:
authorGravatar Prabhat Kumar <89051199+prkkumar@users.noreply.github.com> 2021-11-19 00:31:18 -0800
committerGravatar GitHub <noreply@github.com> 2021-11-19 00:31:18 -0800
commit45ef533c39a55d05afbb9872659963d19b79f463 (patch)
tree65d7756277fd82059e8267b92a65e16d7865590f /Source/Filter/Filter.cpp
parentff8b73f58d71762e8d81be797c8afd1519d79c2a (diff)
downloadWarpX-45ef533c39a55d05afbb9872659963d19b79f463.tar.gz
WarpX-45ef533c39a55d05afbb9872659963d19b79f463.tar.zst
WarpX-45ef533c39a55d05afbb9872659963d19b79f463.zip
1D3V Cartesian Support (#2307)
* Build System: Add 1D Geometry * test PR * test PR * 1D cartesian yee algorithm * fixed typo * Fixes for PML * 1D support related multiple changes * Fix compilation * change 1D to 1D_Z * 1D Field Gather and typo fix * 1D Charge Deposition * Particle Pusher * multiple changes related to 1D * 1D diagnostics and initialization * PlasmaInjector and PEC fixes for 1D * clean-up delete diags file * mobility 1D laser particle and bilinear filter * deleted diags files * update laser particle weight formula * delete diags files * Azure: Add 1D Cartesian Runner * 1D fixes for FieldProbe * Update Docs/source/developers/dimensionality.rst Co-authored-by: Remi Lehe <remi.lehe@normalesup.org> * 1d laser injection and langmuir test input files * 1d tests * clean up : delete print statements * analyse simulation result for laser injection and Langmuir tests * EOL * delete input files for which there are no automated tests * delete input files for which there are no automated tests * add ignore_unused to remove warnings * remove space * Fix compilation issues * fix error : macro name must be an identifier * Small bug fix * cleanup Python script for analysis * bug fix * bug fix * Update ParticleProbe: Check 1D in-domain * Update Source/Make.WarpX * Update .azure-pipelines.yml * Add USE_OPENPMD=FALSE to .azure-pipeline.yml * resolve conflict * resolve conflict * fix typo * Correct out-of-bound access * Fix Particle BC in WarpXParticleContainer and correct path to checksumAPI in python analysis scripts * EOL * Fix bug : accessing out of bound index of cell in 1D * remove 1d test for cartesian3d * Fix CI check * Slight style change * Address review comments * Fix GPU compilation Filter.cpp * Fix CI * Fix Indentation * Address review comments * More consistent ifdef for dimension bigger than 1 * Update Examples/Tests/Langmuir/analysis_langmuir_multi_1d.py Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update GNUmakefile Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Regression/prepare_file_ci.py Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CartesianCKCAlgorithm.H Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/FieldSolver/FiniteDifferenceSolver/FiniteDifferenceAlgorithms/CartesianNodalAlgorithm.H Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Filter/Filter.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Filter/Filter.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Filter/Filter.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Filter/Filter.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Initialization/PlasmaInjector.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * Update Source/Initialization/PlasmaInjector.cpp Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * add comment inline to explain twice push_back * Add amrex::Abort for NCIGodfreyFilter Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> Co-authored-by: Prabhat Kumar <prabhatkumar@kraken.dhcp.lbl.gov> Co-authored-by: Remi Lehe <remi.lehe@normalesup.org> Co-authored-by: Remi Lehe <rlehe@lbl.gov>
Diffstat (limited to 'Source/Filter/Filter.cpp')
-rw-r--r--Source/Filter/Filter.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/Source/Filter/Filter.cpp b/Source/Filter/Filter.cpp
index 654a1aa56..b72d6cec6 100644
--- a/Source/Filter/Filter.cpp
+++ b/Source/Filter/Filter.cpp
@@ -92,7 +92,9 @@ void Filter::DoFilter (const Box& tbx,
Array4<Real > const& dst,
int scomp, int dcomp, int ncomp)
{
+#if (AMREX_SPACEDIM >= 2)
amrex::Real const* AMREX_RESTRICT sx = stencil_x.data();
+#endif
#if (AMREX_SPACEDIM == 3)
amrex::Real const* AMREX_RESTRICT sy = stencil_y.data();
#endif
@@ -129,7 +131,7 @@ void Filter::DoFilter (const Box& tbx,
dst(i,j,k,dcomp+n) = d;
});
-#else
+#elif (AMREX_SPACEDIM == 2)
AMREX_PARALLEL_FOR_4D ( tbx, ncomp, i, j, k, n,
{
Real d = 0.0;
@@ -155,6 +157,32 @@ void Filter::DoFilter (const Box& tbx,
dst(i,j,k,dcomp+n) = d;
});
+#elif (AMREX_SPACEDIM == 1)
+ AMREX_PARALLEL_FOR_4D ( tbx, ncomp, i, j, k, n,
+ {
+ Real d = 0.0;
+
+ // Pad source array with zeros beyond ghost cells
+ // for out-of-bound accesses due to large-stencil operations
+ const auto src_zeropad = [src] (const int jj, const int kk, const int ll, const int nn) noexcept
+ {
+ return src.contains(jj,kk,ll) ? src(jj,kk,ll,nn) : 0.0_rt;
+ };
+
+ for (int iz=0; iz < slen_local.z; ++iz){
+ for (int iy=0; iy < slen_local.y; ++iy){
+ for (int ix=0; ix < slen_local.x; ++ix){
+ Real sss = sz[iy];
+ d += sss*( src_zeropad(i-ix,j,k,scomp+n)
+ +src_zeropad(i+ix,j,k,scomp+n));
+ }
+ }
+ }
+
+ dst(i,j,k,dcomp+n) = d;
+ });
+#else
+ amrex::Abort("Filter not implemented for the current geometry!");
#endif
}
@@ -247,7 +275,9 @@ void Filter::DoFilter (const Box& tbx,
const auto lo = amrex::lbound(tbx);
const auto hi = amrex::ubound(tbx);
// tmp and dst are of type Array4 (Fortran ordering)
+#if (AMREX_SPACEDIM >= 2)
amrex::Real const* AMREX_RESTRICT sx = stencil_x.data();
+#endif
#if (AMREX_SPACEDIM == 3)
amrex::Real const* AMREX_RESTRICT sy = stencil_y.data();
#endif
@@ -267,8 +297,10 @@ void Filter::DoFilter (const Box& tbx,
for (int ix=0; ix < slen.x; ++ix){
#if (AMREX_SPACEDIM == 3)
Real sss = sx[ix]*sy[iy]*sz[iz];
-#else
+#elif (AMREX_SPACEDIM == 2)
Real sss = sx[ix]*sz[iy];
+#else
+ Real sss = sz[ix];
#endif
// 3 nested loop on 3D array
for (int k = lo.z; k <= hi.z; ++k) {
@@ -284,11 +316,16 @@ void Filter::DoFilter (const Box& tbx,
+tmp(i+ix,j-iy,k+iz,scomp+n)
+tmp(i-ix,j+iy,k+iz,scomp+n)
+tmp(i+ix,j+iy,k+iz,scomp+n));
-#else
+#elif (AMREX_SPACEDIM == 2)
dst(i,j,k,dcomp+n) += sss*(tmp(i-ix,j-iy,k,scomp+n)
+tmp(i+ix,j-iy,k,scomp+n)
+tmp(i-ix,j+iy,k,scomp+n)
+tmp(i+ix,j+iy,k,scomp+n));
+#elif (AMREX_SPACEDIM == 1)
+ dst(i,j,k,dcomp+n) += sss*(tmp(i-ix,j,k,scomp+n)
+ +tmp(i+ix,j,k,scomp+n));
+#else
+ amrex::Abort("Filter not implemented for the current geometry!");
#endif
}
}