From 60fd4ddea3f298d7af5882e99d10d6bdd32fd50e Mon Sep 17 00:00:00 2001 From: Axel Huebl Date: Mon, 12 Apr 2021 15:03:30 -0700 Subject: 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::__nv_dl_wrapper_t(F1, F2, F3, F4, F5) [with Tag = __nv_dl_tag&, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::Box, const amrex::Array4 (&)[6], int, int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&), filterCreateTransformFromFAB<1, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>, amrex::Array4 [6], int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&>, 1>; F1 = amrex::Array4; F2 = const SchwingerFilterFunc; F3 = const amrex::Array4 [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 [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 __nv_dl_wrapper_t<__nv_dl_tag&, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>&, amrex::Box, const amrex::Array4 (&)[6], int, int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&), filterCreateTransformFromFAB<1, amrex::ParticleTile<0, 0, 4, 0, amrex::ArenaAllocator>, amrex::Array4 [6], int, const SchwingerFilterFunc&, const SmartCreate&, const SmartCreate&, const SchwingerTransformFunc&>, 1>, amrex::Array4, const SchwingerFilterFunc, const amrex::Array4 [6], const amrex::Box, int*>::f3 [6]' ``` --- Source/Particles/MultiParticleContainer.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'Source/Particles/MultiParticleContainer.cpp') 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 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); -- cgit v1.2.3