coarsen_tree_leaf Subroutine

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

Uses

  • proc~~coarsen_tree_leaf~~UsesGraph proc~coarsen_tree_leaf coarsen_tree_leaf module~mod_forest mod_forest proc~coarsen_tree_leaf->module~mod_forest

Arguments

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

Calls

proc~~coarsen_tree_leaf~~CallsGraph proc~coarsen_tree_leaf coarsen_tree_leaf proc~add_to_linked_list add_to_linked_list proc~coarsen_tree_leaf->proc~add_to_linked_list proc~delete_from_linked_list delete_from_linked_list proc~coarsen_tree_leaf->proc~delete_from_linked_list

Called by

proc~~coarsen_tree_leaf~~CalledByGraph proc~coarsen_tree_leaf coarsen_tree_leaf proc~amr_coarsen_refine amr_coarsen_refine proc~amr_coarsen_refine->proc~coarsen_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 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