diff options
author | 2021-04-12 15:03:30 -0700 | |
---|---|---|
committer | 2021-04-12 15:03:30 -0700 | |
commit | 60fd4ddea3f298d7af5882e99d10d6bdd32fd50e (patch) | |
tree | a0ae3ac2c262c338cb5db7875234b12c10d742d4 /Source/Particles/MultiParticleContainer.cpp | |
parent | 3aedaea6ab1fda038073d25b1263f8d8e8104556 (diff) | |
download | WarpX-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.cpp | 25 |
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); |