diff options
author | 2021-11-19 00:31:18 -0800 | |
---|---|---|
committer | 2021-11-19 00:31:18 -0800 | |
commit | 45ef533c39a55d05afbb9872659963d19b79f463 (patch) | |
tree | 65d7756277fd82059e8267b92a65e16d7865590f /Source/Filter/Filter.cpp | |
parent | ff8b73f58d71762e8d81be797c8afd1519d79c2a (diff) | |
download | WarpX-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.cpp | 43 |
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 } } |