find_particle_ipe Subroutine

public subroutine find_particle_ipe(x, igrid_particle, ipe_particle)

Uses

  • proc~~find_particle_ipe~~UsesGraph proc~find_particle_ipe find_particle_ipe module~mod_forest mod_forest proc~find_particle_ipe->module~mod_forest module~mod_global_parameters mod_global_parameters proc~find_particle_ipe->module~mod_global_parameters module~mod_slice mod_slice proc~find_particle_ipe->module~mod_slice 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_slice->module~mod_basic_types module~mod_comm_lib mod_comm_lib module~mod_slice->module~mod_comm_lib module~mod_mpi_wrapper mod_mpi_wrapper module~mod_slice->module~mod_mpi_wrapper module~mod_mpi_wrapper->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
double precision, intent(in) :: x(3)
integer, intent(out) :: igrid_particle
integer, intent(out) :: ipe_particle

Calls

proc~~find_particle_ipe~~CallsGraph proc~find_particle_ipe find_particle_ipe proc~get_igslice get_igslice proc~find_particle_ipe->proc~get_igslice proc~particle_in_domain particle_in_domain proc~find_particle_ipe->proc~particle_in_domain proc~mpistop mpistop proc~get_igslice->proc~mpistop mpi_abort mpi_abort proc~mpistop->mpi_abort

Called by

proc~~find_particle_ipe~~CalledByGraph proc~find_particle_ipe find_particle_ipe proc~advect_create_particles advect_create_particles proc~advect_create_particles->proc~find_particle_ipe proc~apply_periodb apply_periodB proc~apply_periodb->proc~find_particle_ipe proc~comm_particles comm_particles proc~comm_particles->proc~find_particle_ipe proc~comm_particles->proc~apply_periodb proc~comm_particles_global comm_particles_global proc~comm_particles_global->proc~find_particle_ipe proc~gca_create_particles gca_create_particles proc~gca_create_particles->proc~find_particle_ipe proc~get_cell_index get_cell_index proc~get_cell_index->proc~find_particle_ipe proc~get_cell_w get_cell_w proc~get_cell_w->proc~find_particle_ipe proc~get_point_w get_point_w proc~get_point_w->proc~find_particle_ipe proc~lorentz_create_particles Lorentz_create_particles proc~lorentz_create_particles->proc~find_particle_ipe proc~read_from_snapshot read_from_snapshot proc~read_from_snapshot->proc~find_particle_ipe proc~sample_create_particles sample_create_particles proc~sample_create_particles->proc~find_particle_ipe proc~advance_particles advance_particles proc~advance_particles->proc~comm_particles proc~handle_particles handle_particles proc~handle_particles->proc~comm_particles_global proc~handle_particles->proc~advance_particles proc~particles_create particles_create proc~particles_create->proc~advect_create_particles proc~particles_create->proc~gca_create_particles proc~particles_create->proc~lorentz_create_particles proc~particles_create->proc~sample_create_particles proc~read_particles_snapshot read_particles_snapshot proc~read_particles_snapshot->proc~comm_particles_global proc~read_particles_snapshot->proc~read_from_snapshot proc~advance advance proc~advance->proc~handle_particles proc~main main proc~main->proc~handle_particles proc~main->proc~particles_create proc~main->proc~read_particles_snapshot proc~timeintegration timeintegration proc~main->proc~timeintegration proc~timeintegration->proc~advance program~agile agile program~agile->proc~main

Source Code

  subroutine find_particle_ipe(x,igrid_particle,ipe_particle)
    use mod_forest, only: tree_node_ptr, tree_root
    use mod_slice, only: get_igslice
    use mod_global_parameters

    double precision, intent(in) :: x(3)
    integer, intent(out)         :: igrid_particle, ipe_particle
    integer                      :: ig(ndir,nlevelshi), ig_lvl(nlevelshi)
    integer                      :: idim, ic(ndim)
    type(tree_node_ptr)          :: branch

    ! first check if the particle is in the domain
    if (.not. particle_in_domain(x)) then
      igrid_particle = -1
      ipe_particle   = -1
      return
    end if

    ! get the index on each level
    do idim = 1, ndim
      call get_igslice(idim,x(idim), ig_lvl)
      ig(idim,:) = ig_lvl
    end do

    ! traverse the tree until leaf is found
    branch=tree_root(ig(1,1),ig(2,1),ig(3,1))
    do while (.not.branch%node%leaf)
      ic(1)=ig(1,branch%node%level+1) - 2 * branch%node%ig1 +2
      ic(2)=ig(2,branch%node%level+1) - 2 * branch%node%ig2 +2
      ic(3)=ig(3,branch%node%level+1) - 2 * branch%node%ig3 +2
      branch%node => branch%node%child(ic(1),ic(2),ic(3))%node
    end do

    igrid_particle = branch%node%igrid
    ipe_particle   = branch%node%ipe

  end subroutine find_particle_ipe