clean up destroyed particles on all cores
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | destroy_n_particles_mype | |||
| integer, | intent(in), | dimension(1:destroy_n_particles_mype) | :: | particle_index_to_be_destroyed |
subroutine destroy_particles(destroy_n_particles_mype,& particle_index_to_be_destroyed) use mod_global_parameters integer, intent(in) :: & destroy_n_particles_mype integer, dimension(1:destroy_n_particles_mype),& intent(in) :: particle_index_to_be_destroyed type(particle_t), dimension(destroy_n_particles_mype):: & destroy_particles_mype double precision, dimension(npayload,& destroy_n_particles_mype):: destroy_payload_mype integer :: iipart,ipart,& destroy_n_particles destroy_n_particles = 0 ! append the particle to list of destroyed particles do iipart=1,destroy_n_particles_mype ipart=particle_index_to_be_destroyed(iipart); destroy_particles_mype(iipart) = particle(ipart)%self destroy_payload_mype(1:npayload,iipart) = & particle(ipart)%payload(1:npayload) end do call output_ensemble(destroy_n_particles_mype,destroy_particles_mype,& destroy_payload_mype,'destroy') if (npe > 1) then call MPI_ALLREDUCE(destroy_n_particles_mype,destroy_n_particles,1,& MPI_INTEGER,MPI_SUM,icomm,ierrmpi) else destroy_n_particles = destroy_n_particles_mype end if nparticles = nparticles - destroy_n_particles do iipart=1,destroy_n_particles_mype ipart=particle_index_to_be_destroyed(iipart); particle(ipart)%igrid = -1 particle(ipart)%ipe = -1 if(time_advance) then write(*,*) particle(ipart)%self%time, ': particle',ipart,& ' has left at it ',it_particles,' on pe', mype write(*,*) particle(ipart)%self%time, ': particles remaining:',& nparticles, '(total)', nparticles_on_mype-1, 'on pe', mype endif deallocate(particle(ipart)%self) deallocate(particle(ipart)%payload) call pull_particle_from_particles_on_mype(ipart) end do end subroutine destroy_particles