refine_tree_leaf Subroutine

public subroutine refine_tree_leaf(child_igrid, child_ipe, igrid, ipe, active)

Uses

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

Arguments

Type IntentOptional Attributes Name
integer, intent(in), dimension(2,2,2) :: child_igrid
integer, intent(in), dimension(2,2,2) :: child_ipe
integer, intent(in) :: igrid
integer, intent(in) :: ipe
logical, intent(out) :: active

Calls

proc~~refine_tree_leaf~~CallsGraph proc~refine_tree_leaf refine_tree_leaf proc~delete_from_linked_list delete_from_linked_list proc~refine_tree_leaf->proc~delete_from_linked_list proc~find_neighbor find_neighbor proc~refine_tree_leaf->proc~find_neighbor proc~init_tree_leaf init_tree_leaf proc~refine_tree_leaf->proc~init_tree_leaf proc~find_root_neighbor find_root_neighbor proc~find_neighbor->proc~find_root_neighbor proc~add_to_linked_list add_to_linked_list proc~init_tree_leaf->proc~add_to_linked_list

Called by

proc~~refine_tree_leaf~~CalledByGraph proc~refine_tree_leaf refine_tree_leaf proc~amr_coarsen_refine amr_coarsen_refine proc~amr_coarsen_refine->proc~refine_tree_leaf proc~resettree resettree proc~resettree->proc~amr_coarsen_refine proc~resettree_convert resettree_convert proc~resettree_convert->proc~amr_coarsen_refine proc~settree settree proc~settree->proc~amr_coarsen_refine proc~main main proc~main->proc~resettree_convert proc~main->proc~settree proc~timeintegration timeintegration proc~main->proc~timeintegration proc~timeintegration->proc~resettree program~agile agile program~agile->proc~main

Source Code

  subroutine refine_tree_leaf(child_igrid,child_ipe,igrid,ipe,active)
    use mod_forest
    use mod_global_parameters
    use mod_amr_neighbors, only: find_neighbor

    integer, dimension(2,2,2), intent(in) :: child_igrid, child_ipe
    integer, intent(in) :: igrid, ipe
    logical, intent(out):: active

    integer :: ig1,ig2,ig3, level, i1,i2,i3, ic1,ic2,ic3, child_ig1,child_ig2,&
       child_ig3, child_level, iside
    integer :: my_neighbor_type
    logical, dimension(ndim) :: pole
    type(tree_node_ptr) :: tree, child, my_neighbor

    tree%node => igrid_to_node(igrid,ipe)%node
    ig1=tree%node%ig1;ig2=tree%node%ig2;ig3=tree%node%ig3;
    level=tree%node%level
    active=tree%node%active

    tree%node%ipe=-1
    tree%node%igrid=0
    tree%node%leaf=.false.
    tree%node%active=.true.

    call delete_from_linked_list(level,tree)

    child_level=level+1

    do ic3=1,2
    do ic2=1,2
    do ic1=1,2
       child_ig1=2*(ig1-1)+ic1;child_ig2=2*(ig2-1)+ic2
       child_ig3=2*(ig3-1)+ic3;
       call init_tree_leaf(child,child_ig1,child_ig2,child_ig3,child_level,&
           child_igrid(ic1,ic2,ic3),child_ipe(ic1,ic2,ic3),active)

       igrid_to_node(child_igrid(ic1,ic2,ic3),child_ipe(ic1,ic2,&
          ic3))%node => child%node

       tree%node%child(ic1,ic2,ic3)%node => child%node
       child%node%parent%node => tree%node
    end do
    end do
    end do

    ! update neighbor pointers
    do ic3=1,2
    do ic2=1,2
    do ic1=1,2
       child%node => tree%node%child(ic1,ic2,ic3)%node
       iside=ic1
       i1=kr(1,1)*(2*iside-3);i2=kr(2,1)*(2*iside-3);i3=kr(3,1)*(2*iside-3);
       call find_neighbor(my_neighbor,my_neighbor_type,child,i1,i2,i3,pole)
       select case (my_neighbor_type)
       case (neighbor_sibling, neighbor_fine)
          child%node%neighbor(iside,1)%node => my_neighbor%node
          if (pole(1)) then
             my_neighbor%node%neighbor(iside,1)%node => child%node
          else
             my_neighbor%node%neighbor(3-iside,1)%node => child%node
          end if
       case default
          nullify(child%node%neighbor(iside,1)%node)
       end select
       child%node%neighbor(3-ic1,1)%node=>tree%node%child(3-ic1,ic2,ic3)%node
       iside=ic2
       i1=kr(1,2)*(2*iside-3);i2=kr(2,2)*(2*iside-3);i3=kr(3,2)*(2*iside-3);
       call find_neighbor(my_neighbor,my_neighbor_type,child,i1,i2,i3,pole)
       select case (my_neighbor_type)
       case (neighbor_sibling, neighbor_fine)
          child%node%neighbor(iside,2)%node => my_neighbor%node
          if (pole(2)) then
             my_neighbor%node%neighbor(iside,2)%node => child%node
          else
             my_neighbor%node%neighbor(3-iside,2)%node => child%node
          end if
       case default
          nullify(child%node%neighbor(iside,2)%node)
       end select
       child%node%neighbor(3-ic2,2)%node=>tree%node%child(ic1,3-ic2,ic3)%node
       iside=ic3
       i1=kr(1,3)*(2*iside-3);i2=kr(2,3)*(2*iside-3);i3=kr(3,3)*(2*iside-3);
       call find_neighbor(my_neighbor,my_neighbor_type,child,i1,i2,i3,pole)
       select case (my_neighbor_type)
       case (neighbor_sibling, neighbor_fine)
          child%node%neighbor(iside,3)%node => my_neighbor%node
          if (pole(3)) then
             my_neighbor%node%neighbor(iside,3)%node => child%node
          else
             my_neighbor%node%neighbor(3-iside,3)%node => child%node
          end if
       case default
          nullify(child%node%neighbor(iside,3)%node)
       end select
       child%node%neighbor(3-ic3,3)%node=>tree%node%child(ic1,ic2,3-ic3)%node
    end do
    end do
    end do

    nleafs=nleafs+2**3-1
    nparents=nparents+1
    nleafs_level(child_level)=nleafs_level(child_level)+2**3
    nleafs_level(level)=nleafs_level(level)-1

    if (active) nleafs_active = nleafs_active + 2**3-1

  end subroutine refine_tree_leaf