aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Axel Huebl <axel.huebl@plasma.ninja> 2021-04-12 15:03:30 -0700
committerGravatar GitHub <noreply@github.com> 2021-04-12 15:03:30 -0700
commit60fd4ddea3f298d7af5882e99d10d6bdd32fd50e (patch)
treea0ae3ac2c262c338cb5db7875234b12c10d742d4 /Source/Particles/MultiParticleContainer.cpp
parent3aedaea6ab1fda038073d25b1263f8d8e8104556 (diff)
downloadWarpX-60fd4ddea3f298d7af5882e99d10d6bdd32fd50e.tar.gz
WarpX-60fd4ddea3f298d7af5882e99d10d6bdd32fd50e.tar.zst
WarpX-60fd4ddea3f298d7af5882e99d10d6bdd32fd50e.zip
Fix QED Build (CUDA 10.0) (#1888)
Replace capture of a host-side array with unnamed members for E & B field transport with a nicely named struct that transports the Array4's as members. This is harder to mix up and thus more self-documenting and solves an issue with NVCC 10.0 of the form: ``` nvcc_internal_extended_lambda_implementation: In instantiation of '__nv_dl_wrapper_t<Tag, F1, F2, F3, F4, F5>::__nv_dl_wrapper_t(F1, F2, F3, F4, F5) [with Tag = __nv_dl_tag<int (*)(amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::Box, const amrex::Array4<const double> (&)[6], int, int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&), filterCreateTransformFromFAB<1, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>, amrex::Array4<const double> [6], int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&>, 1>; F1 = amrex::Array4<double>; F2 = const SchwingerFilterFunc; F3 = const amrex::Array4<const double> [6]; F4 = const amrex::Box; F5 = int*]': /home/ubuntu/repos/WarpX/Source/Particles/ParticleCreation/FilterCreateTransformFromFAB.H:174:28: required from 'Index filterCreateTransformFromFAB(DstTile&, DstTile&, amrex::Box, const FABs&, Index, Index, FilterFunc&&, CreateFunc1&&, CreateFunc2&&, TransFunc&&) [with int N = 1; DstTile = amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>; FABs = amrex::Array4<const double> [6]; Index = int; FilterFunc = const SchwingerFilterFunc&; CreateFunc1 = const SmartCreate&; CreateFunc2 = const SmartCreate&; TransFunc = const SchwingerTransformFunc&]' /home/ubuntu/repos/WarpX/Source/Particles/MultiParticleContainer.cpp:1169:167: required from here nvcc_internal_extended_lambda_implementation:70:103: error: invalid initializer for array member 'const amrex::Array4<const double> __nv_dl_wrapper_t<__nv_dl_tag<int (*)(amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::Box, const amrex::Array4<const double> (&)[6], int, int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&), filterCreateTransformFromFAB<1, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>, amrex::Array4<const double> [6], int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&>, 1>, amrex::Array4<double>, const SchwingerFilterFunc, const amrex::Array4<const double> [6], const amrex::Box, int*>::f3 [6]' ```
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index 1b2f920a9..4218e9fdf 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -27,6 +27,15 @@
using namespace amrex;
+namespace
+{
+ /** A little collection to transport six Array4 that point to the EM fields */
+ struct MyFieldList
+ {
+ Array4< amrex::Real const > const Ex, Ey, Ez, Bx, By, Bz;
+ };
+}
+
MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core)
{
@@ -1138,15 +1147,9 @@ MultiParticleContainer::doQEDSchwinger ()
if (!box.intersects(global_schwinger_box)) {continue;}
box &= global_schwinger_box;
- const auto& arrEx = Ex[mfi].array();
- const auto& arrEy = Ey[mfi].array();
- const auto& arrEz = Ez[mfi].array();
- const auto& arrBx = Bx[mfi].array();
- const auto& arrBy = By[mfi].array();
- const auto& arrBz = Bz[mfi].array();
-
- const Array4<const amrex::Real> array_EMFAB [] = {arrEx,arrEy,arrEz,
- arrBx,arrBy,arrBz};
+ const MyFieldList fieldsEB = {
+ Ex[mfi].array(), Ey[mfi].array(), Ez[mfi].array(),
+ Bx[mfi].array(), By[mfi].array(), Bz[mfi].array()};
auto& dst_ele_tile = pc_product_ele->ParticlesAt(level_0, mfi);
auto& dst_pos_tile = pc_product_pos->ParticlesAt(level_0, mfi);
@@ -1167,9 +1170,9 @@ MultiParticleContainer::doQEDSchwinger ()
ParticleStringNames::to_index.find("w")->second};
const auto num_added = filterCreateTransformFromFAB<1>( dst_ele_tile,
- dst_pos_tile, box, array_EMFAB, np_ele_dst,
+ dst_pos_tile, box, fieldsEB, np_ele_dst,
np_pos_dst,Filter, CreateEle, CreatePos,
- Transform);
+ Transform);
setNewParticleIDs(dst_ele_tile, np_ele_dst, num_added);
setNewParticleIDs(dst_pos_tile, np_pos_dst, num_added);