diff options
author | 2019-02-04 18:30:26 -0800 | |
---|---|---|
committer | 2019-02-04 18:30:26 -0800 | |
commit | a321b95b2f7fc48d295368e3d8772a3b8135328f (patch) | |
tree | fee1d6055e0d435f0321ecaea696609afda782d2 /Source/PhysicalParticleContainer.cpp | |
parent | 415bcd342181240b3c87e1ea3506c0e8118ef42e (diff) | |
download | WarpX-a321b95b2f7fc48d295368e3d8772a3b8135328f.tar.gz WarpX-a321b95b2f7fc48d295368e3d8772a3b8135328f.tar.zst WarpX-a321b95b2f7fc48d295368e3d8772a3b8135328f.zip |
added temporary PhysicalParticleContainer to the MultiParticleContainer. segfault at init
Diffstat (limited to 'Source/PhysicalParticleContainer.cpp')
-rw-r--r-- | Source/PhysicalParticleContainer.cpp | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/Source/PhysicalParticleContainer.cpp b/Source/PhysicalParticleContainer.cpp index 79f132f4d..3952e48a4 100644 --- a/Source/PhysicalParticleContainer.cpp +++ b/Source/PhysicalParticleContainer.cpp @@ -78,9 +78,14 @@ PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core, int isp ParmParse pp(species_name); pp.query("boost_adjust_transverse_positions", boost_adjust_transverse_positions); - pp.query("do_backward_propagation", do_backward_propagation); + pp.query("do_backward_propagation", do_backward_propagation); + pp.query("do_splitting", do_splitting); } +PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core) + : WarpXParticleContainer(amr_core, 0) +{} + void PhysicalParticleContainer::InitData() { AddParticles(0); // Note - add on level 0 @@ -1396,9 +1401,12 @@ PhysicalParticleContainer::Evolve (int lev, // BL_PROFILE_VAR_START(blp_pxr_pp); PushPX(pti, m_xp[thread_num], m_yp[thread_num], m_zp[thread_num], - m_giv[thread_num], dt); + m_giv[thread_num], dt); BL_PROFILE_VAR_STOP(blp_pxr_pp); + // Split particles + SplitParticles(pti, lev); + // // Current Deposition // @@ -1429,6 +1437,73 @@ PhysicalParticleContainer::Evolve (int lev, } void +PhysicalParticleContainer::SplitParticles(WarpXParIter& pti, int lev) +{ + auto& mypc = WarpX::GetInstance().GetPartContainer(); + auto& pctmp_split = mypc.GetPCtmp(); + // std::unique_ptr<PhysicalParticleContainer> pc_tmp = mypc.pc_tmp; + // WarpXParticleContainer ppc_tmp(amr_core, ispecies); + Cuda::DeviceVector<Real> xp, yp, zp; + pti.GetPosition(xp, yp, zp); + auto& attribs = pti.GetAttribs(); + auto& wp = attribs[PIdx::w ]; + auto& uxp = attribs[PIdx::ux]; + auto& uyp = attribs[PIdx::uy]; + auto& uzp = attribs[PIdx::uz]; + const long np = pti.numParticles(); + const std::array<Real,3>& dx = WarpX::CellSize(lev); + Print()<< "dx "<<dx[0]<<' '<<dx[1]<<' '<<dx[2]<<' '<<std::endl; + const auto& particles = pti.GetArrayOfStructs(); + + RealVector psplit_x, psplit_y, psplit_z, psplit_w; + RealVector psplit_ux, psplit_uy, psplit_uz; + // for (auto& p : particles){ + for(int i=0; i<np; i++){ + auto& p = particles[i]; + if (p.id() == SplitParticleID){ + Print()<<"splitting particles\n"; +#if (AMREX_SPACEDIM==2) + long np_split = 4; + for (int ishift = -1; ishift < 2; ishift +=2 ){ + psplit_x.push_back( xp[i] + ishift*dx[0]/2 ); + psplit_y.push_back( 0. ); + psplit_z.push_back( zp[i] + ishift*dx[1]/2 ); + psplit_ux.push_back( uxp[i] ); + psplit_uy.push_back( 0. ); + psplit_uz.push_back( uzp[i] ); + psplit_w.push_back( wp[i]/4. ); + } + Print()<<"AddNParticles start\n"; + pctmp_split.AddNParticles(lev, + np_split, + psplit_x.dataPtr(), + psplit_y.dataPtr(), + psplit_z.dataPtr(), + psplit_ux.dataPtr(), + psplit_uy.dataPtr(), + psplit_uz.dataPtr(), + 1, + psplit_w.dataPtr(), + 1); + Print()<<"AddNParticles end\n"; +#endif + } + } + /* + for (auto& p : particles){ + if (p.id() == SplitParticleID){ + Print()<<"toto\n"; + + } + } + + auto& uxp = attribs[PIdx::ux]; + + for(int i, i<np, ++i){ + if + }*/ +} +void PhysicalParticleContainer::PushPX(WarpXParIter& pti, Cuda::DeviceVector<Real>& xp, Cuda::DeviceVector<Real>& yp, |