destroy_particles Subroutine

public subroutine destroy_particles(destroy_n_particles_mype, particle_index_to_be_destroyed)

Uses

  • proc~~destroy_particles~~UsesGraph proc~destroy_particles destroy_particles module~mod_global_parameters mod_global_parameters proc~destroy_particles->module~mod_global_parameters module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

clean up destroyed particles on all cores

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: destroy_n_particles_mype
integer, intent(in), dimension(1:destroy_n_particles_mype) :: particle_index_to_be_destroyed

Calls

proc~~destroy_particles~~CallsGraph proc~destroy_particles destroy_particles mpi_allreduce mpi_allreduce proc~destroy_particles->mpi_allreduce proc~output_ensemble output_ensemble proc~destroy_particles->proc~output_ensemble proc~pull_particle_from_particles_on_mype pull_particle_from_particles_on_mype proc~destroy_particles->proc~pull_particle_from_particles_on_mype mpi_allgather mpi_allgather proc~output_ensemble->mpi_allgather proc~mpi_recv_wrapper mpi_recv_wrapper proc~output_ensemble->proc~mpi_recv_wrapper proc~mpi_send_wrapper mpi_send_wrapper proc~output_ensemble->proc~mpi_send_wrapper proc~output_particle output_particle proc~output_ensemble->proc~output_particle mpi_recv mpi_recv proc~mpi_recv_wrapper->mpi_recv mpi_send mpi_send proc~mpi_send_wrapper->mpi_send proc~partcoord_to_cartesian partcoord_to_cartesian proc~output_particle->proc~partcoord_to_cartesian

Called by

proc~~destroy_particles~~CalledByGraph proc~destroy_particles destroy_particles proc~comm_particles comm_particles proc~comm_particles->proc~destroy_particles proc~particles_finish particles_finish proc~particles_finish->proc~destroy_particles proc~advance_particles advance_particles proc~advance_particles->proc~comm_particles proc~handle_particles handle_particles proc~handle_particles->proc~advance_particles proc~advance advance proc~advance->proc~handle_particles proc~main main proc~main->proc~handle_particles proc~timeintegration timeintegration proc~main->proc~timeintegration proc~timeintegration->proc~advance program~agile agile program~agile->proc~main

Source Code

  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