find_neighbor Subroutine

public subroutine find_neighbor(my_neighbor, my_neighbor_type, tree, i1, i2, i3, pole)

Uses

  • proc~~find_neighbor~~UsesGraph proc~find_neighbor find_neighbor module~mod_forest mod_forest proc~find_neighbor->module~mod_forest module~mod_global_parameters mod_global_parameters proc~find_neighbor->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

find neighors of all blocks

Arguments

Type IntentOptional Attributes Name
type(tree_node_ptr) :: my_neighbor
integer, intent(out) :: my_neighbor_type
type(tree_node_ptr) :: tree
integer, intent(in) :: i1
integer, intent(in) :: i2
integer, intent(in) :: i3
logical, intent(out), dimension(ndim) :: pole

Calls

proc~~find_neighbor~~CallsGraph proc~find_neighbor find_neighbor proc~find_root_neighbor find_root_neighbor proc~find_neighbor->proc~find_root_neighbor

Called by

proc~~find_neighbor~~CalledByGraph proc~find_neighbor find_neighbor proc~asign_tree_neighbor asign_tree_neighbor proc~asign_tree_neighbor->proc~find_neighbor proc~build_connectivity build_connectivity proc~build_connectivity->proc~find_neighbor proc~proper_nesting proper_nesting proc~proper_nesting->proc~find_neighbor proc~refine_tree_leaf refine_tree_leaf proc~refine_tree_leaf->proc~find_neighbor proc~amr_coarsen_refine amr_coarsen_refine proc~amr_coarsen_refine->proc~build_connectivity proc~amr_coarsen_refine->proc~proper_nesting proc~amr_coarsen_refine->proc~refine_tree_leaf proc~initlevelone initlevelone proc~initlevelone->proc~build_connectivity proc~read_forest read_forest proc~read_forest->proc~asign_tree_neighbor proc~read_forest->proc~build_connectivity proc~main main proc~main->proc~initlevelone proc~read_snapshot read_snapshot proc~main->proc~read_snapshot proc~resettree_convert resettree_convert proc~main->proc~resettree_convert proc~settree settree proc~main->proc~settree proc~timeintegration timeintegration proc~main->proc~timeintegration proc~read_snapshot->proc~read_forest proc~read_snapshot_old read_snapshot_old proc~read_snapshot->proc~read_snapshot_old proc~read_snapshot_old->proc~read_forest proc~resettree resettree proc~resettree->proc~amr_coarsen_refine proc~resettree_convert->proc~amr_coarsen_refine proc~settree->proc~amr_coarsen_refine proc~timeintegration->proc~resettree program~agile agile program~agile->proc~main

Source Code

  subroutine find_neighbor(my_neighbor,my_neighbor_type,tree,i1,i2,i3,pole)
    use mod_forest
    use mod_global_parameters
  
    type(tree_node_ptr) :: tree, my_neighbor
    integer, intent(in) :: i1,i2,i3
    integer, intent(out) :: my_neighbor_type
    logical, dimension(ndim), intent(out) :: pole
  
    integer :: level, ig1,ig2,ig3, ic1,ic2,ic3, n_ic1,n_ic2,n_ic3, inp1,inp2,&
       inp3
  
    pole=.false.
    level=tree%node%level
    if (level==1) then
       call find_root_neighbor(my_neighbor,tree,i1,i2,i3)
       if (associated(my_neighbor%node)) then
         if (phi_ > 0) then
           ig1=tree%node%ig1;ig2=tree%node%ig2;ig3=tree%node%ig3;
           if ((poleB(2,1).and.ig1==ng1(1).and.i1==1) .or. (poleB(1,&
              1).and.ig1==1.and.i1==-1)) pole(1)=.true.
           if ((poleB(2,2).and.ig2==ng2(1).and.i2==1) .or. (poleB(1,&
              2).and.ig2==1.and.i2==-1)) pole(2)=.true.
           if ((poleB(2,3).and.ig3==ng3(1).and.i3==1) .or. (poleB(1,&
              3).and.ig3==1.and.i3==-1)) pole(3)=.true.
         end if
          if (my_neighbor%node%leaf) then
             my_neighbor_type=3
          else
             my_neighbor_type=4
          end if
       else
          my_neighbor_type=1
          return
       end if
    else
       ig1=tree%node%ig1;ig2=tree%node%ig2;ig3=tree%node%ig3;
  
       if (phi_ > 0) then
         if ((poleB(2,1).and.ig1==ng1(level).and.i1==1) .or. (poleB(1,&
            1).and.ig1==1.and.i1==-1)) pole(1)=.true.
         if ((poleB(2,2).and.ig2==ng2(level).and.i2==1) .or. (poleB(1,&
            2).and.ig2==1.and.i2==-1)) pole(2)=.true.
         if ((poleB(2,3).and.ig3==ng3(level).and.i3==1) .or. (poleB(1,&
            3).and.ig3==1.and.i3==-1)) pole(3)=.true.
       end if
  
       ! ic^D is 1 when ig^D is odd, is 2 when ig^D is even
       ic1=1+modulo(ig1-1,2);ic2=1+modulo(ig2-1,2);ic3=1+modulo(ig3-1,2);
       inp1=int((ic1+i1+1)/2)-1;inp2=int((ic2+i2+1)/2)-1
       inp3=int((ic3+i3+1)/2)-1;
       my_neighbor%node => tree%node%parent%node
       if (inp1/=0) then
          my_neighbor%node => my_neighbor%node%neighbor(ic1,1)%node
          if (.not.associated(my_neighbor%node)) then
             my_neighbor_type=1
             return
          end if
       end if
       if (inp2/=0) then
          my_neighbor%node => my_neighbor%node%neighbor(ic2,2)%node
          if (.not.associated(my_neighbor%node)) then
             my_neighbor_type=1
             return
          end if
       end if
       if (inp3/=0) then
          my_neighbor%node => my_neighbor%node%neighbor(ic3,3)%node
          if (.not.associated(my_neighbor%node)) then
             my_neighbor_type=1
             return
          end if
       end if
       if (my_neighbor%node%leaf) then
          my_neighbor_type=2
       else
          if (i1==0 .or. pole(1)) then
             n_ic1=ic1
          else
             n_ic1=3-ic1 ! switch 1 <--> 2
          end if
          if (i2==0 .or. pole(2)) then
             n_ic2=ic2
          else
             n_ic2=3-ic2 ! switch 1 <--> 2
          end if
          if (i3==0 .or. pole(3)) then
             n_ic3=ic3
          else
             n_ic3=3-ic3 ! switch 1 <--> 2
          end if
          my_neighbor%node => my_neighbor%node%child(n_ic1,n_ic2,n_ic3)%node
          if (associated(my_neighbor%node)) then
             if (my_neighbor%node%leaf) then
                my_neighbor_type=3
             else
                my_neighbor_type=4
             end if
          else
             my_neighbor_type=0
          end if
       end if
    end if
  
  end subroutine find_neighbor