subroutine coarsen_tree_leaf(igrid,ipe,child_igrid,child_ipe,active)
use mod_forest
implicit none
integer, intent(in) :: igrid, ipe
integer, dimension(2,2,2), intent(in) :: child_igrid, child_ipe
logical, intent(out) :: active
integer :: level, ic1,ic2,ic3, child_level, iside, iotherside, vote
type(tree_node_ptr) :: tree, child, child_neighbor
tree%node => igrid_to_node(child_igrid(1,1,1),child_ipe(1,1,&
1))%node%parent%node
level=tree%node%level
call add_to_linked_list(level,tree)
child_level=level+1
vote=0
do ic3=1,2
do ic2=1,2
do ic1=1,2
child%node => tree%node%child(ic1,ic2,ic3)%node
! vote for active:
if(child%node%active) vote=vote+1
call delete_from_linked_list(child_level,child)
! update neighbor pointers
iside=ic1
child_neighbor%node => child%node%neighbor(iside,1)%node
if (associated(child_neighbor%node)) then
if (child%node%ig1==child_neighbor%node%ig1) then ! pole
nullify(child_neighbor%node%neighbor(iside,1)%node)
else
iotherside=3-iside
nullify(child_neighbor%node%neighbor(iotherside,1)%node)
end if
end if
iside=ic2
child_neighbor%node => child%node%neighbor(iside,2)%node
if (associated(child_neighbor%node)) then
if (child%node%ig2==child_neighbor%node%ig2) then ! pole
nullify(child_neighbor%node%neighbor(iside,2)%node)
else
iotherside=3-iside
nullify(child_neighbor%node%neighbor(iotherside,2)%node)
end if
end if
iside=ic3
child_neighbor%node => child%node%neighbor(iside,3)%node
if (associated(child_neighbor%node)) then
if (child%node%ig3==child_neighbor%node%ig3) then ! pole
nullify(child_neighbor%node%neighbor(iside,3)%node)
else
iotherside=3-iside
nullify(child_neighbor%node%neighbor(iotherside,3)%node)
end if
end if
nullify(tree%node%child(ic1,ic2,ic3)%node)
deallocate(igrid_to_node(child_igrid(ic1,ic2,ic3),child_ipe(ic1,ic2,&
ic3))%node)
end do
end do
end do
tree%node%leaf=.true.
tree%node%igrid=igrid
tree%node%ipe=ipe
igrid_to_node(igrid,ipe)%node => tree%node
! Count the vote and set active/passive state:
if (vote /= 2**3) then
!if (vote == 0) then
tree%node%active = .false.
nleafs_active = nleafs_active - vote
else
tree%node%active = .true.
nleafs_active = nleafs_active - vote + 1
end if
active = tree%node%active
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
end subroutine coarsen_tree_leaf