@@ -92,7 +92,7 @@ struct ShellFilter
9292 const Box& domain)
9393 : m_plo(plo), m_phi(phi), m_center(center), m_radius_inner(radius_inner), m_radius_outer(radius_outer), m_z(z), m_t (t), m_dt(dt), m_domain(domain)
9494 {}
95- #ifdef AMREX_USE_GPU
95+ #if 1
9696 // c_light is the constant for speed of light [cm/s]
9797 template <typename SrcData>
9898 AMREX_GPU_HOST_DEVICE
@@ -461,18 +461,21 @@ DarkMatterParticleContainer::moveKickDrift (amrex::MultiFab& acceleration,
461461
462462 int nc=AMREX_SPACEDIM;
463463 int num_output=0 ;
464- amrex::ParallelFor (np,
465- [=] AMREX_GPU_HOST_DEVICE ( long i)
466- {
464+ for (int i=0 ;i<np;i++) {
465+ int index=0 ;
467466 store_dm_particle_single (pstruct[i],pstruct2[i],nc,
468467 accel,plo,phi,dxi,dt,a_old,
469- a_half,do_move, radius_inner, radius_outer);
470- });
471- for (int i=0 ;i<np;i++) {
468+ a_half,do_move, radius_inner, radius_outer,index);
472469 const amrex::ParticleContainer<1 +AMREX_SPACEDIM+6 , 0 >::SuperParticleType p = pstruct2[i];
473- if (shell_filter_test (ptile.getConstParticleTileData (),i)) {
470+ int mask=shell_filter_test (ptile.getConstParticleTileData (),i);
471+ if (mask>0 ) {
472+ for (int j=0 ;j<mask;j++) {
473+ store_dm_particle_single (pstruct[i],pstruct2[i],nc,
474+ accel,plo,phi,dxi,dt,a_old,
475+ a_half,do_move, radius_inner, radius_outer,j);
474476 ptile_tmp.push_back (pstruct2[i]);
475477 num_output++;
478+ }
476479 }
477480 }
478481 // auto num_output = amrex::filterParticles(ptile_tmp, ptile, shell_filter_test);
@@ -706,7 +709,7 @@ void store_dm_particle_single (amrex::ParticleContainer<1+AMREX_SPACEDIM, 0>::Su
706709 amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const & phi,
707710 amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const & dxi,
708711 const amrex::Real& dt, const amrex::Real& a_prev,
709- const amrex::Real& a_cur, const int & do_move, const Real& radius_inner, const Real& radius_outer)
712+ const amrex::Real& a_cur, const int & do_move, const Real& radius_inner, const Real& radius_outer, int index )
710713{
711714 amrex::Real half_dt = 0.5 * dt;
712715 amrex::Real a_cur_inv = 1.0 / a_cur;
@@ -727,7 +730,7 @@ void store_dm_particle_single (amrex::ParticleContainer<1+AMREX_SPACEDIM, 0>::Su
727730
728731 Real xlen, ylen, zlen;
729732 // printf("Value is %d\n", maxind);
730-
733+ int local_index= 0 ;
731734 for (int idir=-maxind[0 ];idir<=maxind[0 ];idir++)
732735 for (int jdir=-maxind[1 ];jdir<=maxind[1 ];jdir++)
733736 for (int kdir=-maxind[2 ];kdir<=maxind[2 ];kdir++)
@@ -737,8 +740,11 @@ void store_dm_particle_single (amrex::ParticleContainer<1+AMREX_SPACEDIM, 0>::Su
737740 zlen = p.pos (2 )+(kdir)*(phi[2 ]-plo[2 ]) - center[2 ];
738741 Real mag = sqrt (xlen*xlen+ylen*ylen+zlen*zlen);
739742 result=result? true : (mag>radius_inner && mag<radius_outer);
740- if ((mag>radius_inner && mag<radius_outer)) {
741- int comp=0 ;
743+ if (int (mag>radius_inner && mag<radius_outer))
744+ local_index++;
745+
746+ if (local_index==index) {
747+ int comp=0 ;
742748 p2.pos (comp) = p.pos (comp)+(idir)*(phi[comp]-plo[comp]);
743749 Real x1 = p2.pos (comp);
744750 Real vx = p.rdata (comp+1 );
@@ -751,9 +757,9 @@ void store_dm_particle_single (amrex::ParticleContainer<1+AMREX_SPACEDIM, 0>::Su
751757 Real z1 = p2.pos (comp);
752758 Real vz = p.rdata (comp+1 );
753759 // printf("%0.15g, %0.15g, %0.15g, %0.15g, %0.15g, %0.15g \n", x1, y1, z1, vx, vy, vz);
754- }
760+
755761 // Print()<<xlen<<"\t"<<ylen<<"\t"<<zlen<<"\t"<<mag<<"\t"<<m_radius_inner<<"\t"<<m_radius_outer<<"\t"<<result<<std::endl;
756- }
762+
757763 for (int comp=0 ; comp < nc; ++comp) {
758764 p2.rdata (comp+1 +3 )=p.pos (comp);
759765 p2.rdata (comp+1 +3 +3 ) = p.pos (comp) + dt_a_cur_inv * p.rdata (comp+1 );
@@ -762,6 +768,9 @@ void store_dm_particle_single (amrex::ParticleContainer<1+AMREX_SPACEDIM, 0>::Su
762768 p2.id ()=p.id ();
763769 p2.cpu ()=p.cpu ();
764770 }
771+ return ;
772+ }
773+ }
765774 }
766775
767776}
0 commit comments