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