Skip to content
Snippets Groups Projects
octreev_shrink_xyz.f90 2.33 KiB
Newer Older
  • Learn to ignore specific revisions
  • subroutine octreev_shrink_xyz(os, threadinfo)
    
    ! resize the x,y,z arrays.
    ! Author: Douglas Guptill
    ! Copyright (c) 2009 Douglas Guptill. All rights reserved.
    ! 2009-07-27: new, from a copy of octreesolve_shring_xyz,
    !                  and identical to it, 
    !                  except for the type of the first parameter.
    !             I wish I knew a better way.!
    
    use threads
    use definitions
    
    implicit none
    
    ! parameters, in
    type (thread) threadinfo
    
    ! parameters, in/out
    type (octreev) os
    
    ! local variables
    integer i, new_size
    double precision, dimension(:),pointer::t
    
    new_size = os%nnode
    
    ! make a temporary array
    allocate  (t(new_size),stat=threadinfo%err)
    call heap (threadinfo, 't', 'octreev_shrink_xyz...', size(t), 'dp', +1)
    
    ! shrink x...............................................
    
    ! transfer the x data to it
    do i = 1, new_size
      t(i) = os%x(i)
    enddo
    
    ! delete and re-create the x array
    call heap (threadinfo, 'os%x', 'octreev_shrink_xyz...', size(os%x), 'dp', -1)
    deallocate(os%x)
    allocate  (os%x(new_size),stat=threadinfo%err)               
    call heap (threadinfo, 'os%x', 'octreev_shrink_xyz...', size(os%x), 'dp', +1)
    
    ! transfer the data from the temporary array to the new x aray
    do i = 1, new_size
      os%x(i) = t(i)
    enddo
    
    ! shrink y...............................................
    
    ! transfer the y data to it
    do i = 1, new_size
      t(i) = os%y(i)
    enddo
    
    ! delete and re-create the y array
    call heap (threadinfo, 'os%y', 'octreev_shrink_xyz...', size(os%y), 'dp', -1)
    deallocate(os%y)
    allocate  (os%y(new_size),stat=threadinfo%err)               
    call heap (threadinfo, 'os%y', 'octreev_shrink_xyz...', size(os%y), 'dp', +1)
    
    ! transfer the data from the temporary array to the new y aray
    do i = 1, new_size
      os%y(i) = t(i)
    enddo
    
    ! shrink z...............................................
    
    ! transfer the z data to it
    do i = 1, new_size
      t(i) = os%z(i)
    enddo
    
    ! delete and re-create the z array
    call heap (threadinfo, 'os%z', 'octreev_shrink_xyz...', size(os%z), 'dp', -1)
    deallocate(os%z)
    allocate  (os%z(new_size),stat=threadinfo%err)               
    call heap (threadinfo, 'os%z', 'octreev_shrink_xyz...', size(os%z), 'dp', +1)
    
    ! transfer the data from the temporary array to the new z aray
    do i = 1, new_size
      os%z(i) = t(i)
    enddo
    
    ! delete the temporary array
    call heap (threadinfo, 't', 'octreev_shrink_xyz...', size(t), 'dp', -1)
    deallocate(t)
    
    return
    end