reursively get a list of all pieces below piece i
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=ip), | intent(in) | :: | i | |||
| integer(kind=ip), | intent(in) | :: | iskip |
skip this one and it's children |
recursive function get_all_pieces_below(i, iskip) result(ipieces) !! reursively get a list of all pieces below piece i integer(ip),intent(in) :: i integer(ip),intent(in) :: iskip !! skip this one and it's children integer(ip),dimension(:),allocatable :: ipieces integer :: j !! counter logical :: found integer(ip) :: idx integer(ip),dimension(:),allocatable :: tmp call below_cache%get([i,iskip],idx,ipieces,found) if (.not. found) then allocate(ipieces(0)) if (i==iskip) return tmp = get_pieces_below(i) if (size(tmp)>0) then tmp = pack(tmp, tmp/=iskip) ! remove the skipped one ipieces = [ipieces, tmp] ! ones directly below do j = 1, size(tmp) ! go down the tree ipieces = [ipieces, get_all_pieces_below(tmp(j),iskip=iskip)] end do ipieces = unique(ipieces) end if call below_cache%put(idx,[i,iskip],ipieces) end if end function get_all_pieces_below