|
igetsp.f.html |
|
|
Source file: igetsp.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib
|
|
Converted: Tue Jul 26 2011 at 12:59:08
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
c
c ----------------------------------------------------------
c
function igetsp (nwords)
c
implicit double precision (a-h,o-z)
include "call.i"
c
c ::::::::::::::::::::::::::: IGETSP ::::::::::::::::::::::::::::
c
c allocate contiguous space of length nword in main storage array
c alloc. user code (or pointer to the owner of this storage)
c is mptr. lenf = current length of lfree list.
c
c ::::::::::::::::::::::::::: IGETSP ::::::::::::::::::::::::::::
c
c find first fit from free space list
c
10 continue
itake = 0
do 20 i = 1, lenf
if (lfree(i,2) .lt. nwords) go to 20
itake = i
go to 25
20 continue
go to 900
c
c anything left?
c
25 left = lfree(itake,2) - nwords
igetsp = lfree(itake,1)
iendtake = lfree(itake,1) + nwords
if (lendim .lt. iendtake) lendim = iendtake
c
c the following code which is ignored for now adds the new
if (left .le. 0) go to 30
lfree(itake,2) = left
lfree(itake,1) = iendtake
go to 99
c
c item is totally removed. move next items in list up one.
c
30 lenf = lenf - 1
do 40 i = itake, lenf
lfree(i,1) = lfree(i+1,1)
40 lfree(i,2) = lfree(i+1,2)
go to 99
c
900 write(outunit,901) nwords
write(*,901) nwords
901 format(' require ',i10,' words - either none left or not big',
1 ' enough space')
write(outunit,902) ((lfree(i,j),j=1,2),i=1,lenf)
write(*,902) ((lfree(i,j),j=1,2),i=1,lenf)
902 format(' free list: ',//,2x,50(i10,4x,i10,/,2x))
! Dynamic memory adjustment
print *, lenf
write(*,902) ((lfree(i,j),j=1,2),i=1,lenf)
! Attempt to allocate new memory
factor = 2.0d0
istatus = 1
old_memsize = memsize
do while (istatus > 0)
factor = 0.5d0 * factor
if (factor < 0.1d0) then
print *, 'Allocation failed, not enough memory'
stop
endif
new_size = ceiling((1.d0+factor) * memsize)
iadd_size = ceiling(factor * memsize)
call resize_storage(new_size,istatus)
enddo
if (lfree(lenf-1,1) + lfree(lenf-1,2) - 1 .eq. old_memsize) then
! Merge new block with last free block on list, adjust sentinel to
! reflect new memory size
lfree(lenf-1,2) = iadd_size + lfree(lenf-1,2)
lfree(lenf,1) = new_size + 2
else
! New free block added to end, make new sentinel
lfree(lenf,1) = old_memsize+1
lfree(lenf,2) = iadd_size
lfree(lenf+1,1) = new_size+2
lfree(lenf+1,2) = 0
lenf = lenf + 1
endif
go to 10
99 lentot = lentot + nwords
if (lenmax .lt. lentot) lenmax = lentot
if (sprint) write(outunit,100) nwords, igetsp, lentot, lenmax
100 format(' allocating ',i8,' words in location ',i8,
1 ' lentot, lenmax ', 2i10)
return
end