|
grdfit.f.html |
|
|
Source file: grdfit.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib
|
|
Converted: Sun May 15 2011 at 19:16:14
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
c
c ---------------------------------------------------------
c
subroutine grdfit (lbase,lcheck,nvar,naux,cut,time,t0)
c
implicit double precision (a-h,o-z)
include "call.i"
c
dimension corner(nsize,maxcl)
integer numptc(maxcl), prvptr
logical fit, nestck, cout
data cout/.false./
c
c ::::::::::::::::::::: GRDFIT :::::::::::::::::::::::::::::::::;
c grdfit called by setgrd and regrid to actually fit the new grids
c on each level. lcheck is the level being error estimated
c so that lcheck+1 will be the level of the new grids.
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
c
isize = iregsz(lcheck)
jsize = jregsz(lcheck)
ibytesPerDP = 8
ldom2 = igetsp((isize+2)*(jsize+2)/ibytesPerDP+1)
c ### initialize region start and end indices for new level grids
iregst(lcheck+1) = iinfinity
jregst(lcheck+1) = iinfinity
iregend(lcheck+1) = -1
jregend(lcheck+1) = -1
c ## flag all grids at given level based on error ests.
c ## npts is number of points actually colated - some
c ## flagged points turned off due to proper nesting requirement.
c ## (storage based on nptmax calculation however).
call flglvl (nvar,naux,lcheck,nptmax,index,lbase,ldom2,npts,t0)
if (npts .eq. 0) go to 99
c
levnew = lcheck + 1
hxfine = hxposs(levnew)
hyfine = hyposs(levnew)
c
c ## call smart_bisect grid gen. to make the clusters
c till each cluster ok. needs scratch space.
c
idim = iregsz(lcheck)
jdim = jregsz(lcheck)
lociscr = igetsp(idim+jdim)
locjscr = lociscr + idim
call smartbis(alloc(index),npts,cut,numptc,nclust,lbase,
2 corner,alloc(lociscr),alloc(locjscr),idim,jdim)
call reclam(lociscr,idim+jdim)
if (gprint) then
write(outunit,103) nclust
write(outunit,104) (icl, numptc(icl),icl=1,nclust)
103 format(' ',i4,' clusters after bisect')
104 format(' cluster ',i5,' has points: ',i6)
endif
c
c ## for each cluster, fit the actual grid, set up some data structures
c
50 ibase = 0
icl = 1
prvptr = null
c
70 mnew = nodget(dummy)
75 call moment(node(1,mnew),alloc(index+2*ibase),numptc(icl),usage)
if (gprint) write(outunit,100) icl,mnew,usage,numptc(icl)
100 format(' cluster ',i5,' new rect.',i5,
1 ' usage ',e12.5,' with ',i5,' pts.')
node(ndilo,mnew) = node(ndilo,mnew)*intratx(lcheck)
node(ndjlo,mnew) = node(ndjlo,mnew)*intraty(lcheck)
node(ndihi,mnew) = (node(ndihi,mnew)+1)*intratx(lcheck) - 1
node(ndjhi,mnew) = (node(ndjhi,mnew)+1)*intraty(lcheck) - 1
rnode(cornxlo,mnew) = node(ndilo,mnew)*hxfine + xlower
rnode(cornylo,mnew) = node(ndjlo,mnew)*hyfine + ylower
rnode(cornxhi,mnew) = (node(ndihi,mnew)+1)*hxfine + xlower
rnode(cornyhi,mnew) = (node(ndjhi,mnew)+1)*hyfine + ylower
node(nestlevel,mnew) = levnew
rnode(timemult,mnew) = time
c
c ## if new grid doesn't fit in base grid, nestck bisect it
c ## and returns 2 clusters where there used to be 1.
c
c 2/28/02 : Added naux to argument list; needed by call to outtre in nestck
fit = nestck(mnew,lbase,alloc(index+2*ibase),numptc(icl),numptc,
1 icl,nclust,alloc(ldom2),isize,jsize,nvar, naux)
if (.not. fit) go to 75
c
c ## grid accepted. put in list.
if (newstl(levnew) .eq. null) then
newstl(levnew) = mnew
else
node(levelptr,prvptr) = mnew
endif
prvptr = mnew
c # keep track of min and max location of grids at this level
iregst(levnew) = MIN(iregst(levnew), node(ndilo,mnew))
jregst(levnew) = MIN(jregst(levnew), node(ndjlo,mnew))
iregend(levnew) = MAX(iregend(levnew),node(ndihi,mnew))
jregend(levnew) = MAX(jregend(levnew),node(ndjhi,mnew))
c ## on to next cluster
ibase = ibase + numptc(icl)
icl = icl + 1
if (icl .le. nclust) go to 70
c
c ## clean up. for all grids check final size.
call birect(newstl(levnew))
99 continue
c ## may have npts 0 but array was allocated due to initially flagged points
c ## that were not allowed for proper nesting or other reasons. in this case
c ## the array was still allocated, so need to test further to see if colating
c ## array space needs to be reclaimed
if (nptmax .gt. 0) call reclam(index, 2*nptmax)
c
call reclam(ldom2, (isize+2)*(jsize+2)/ibytesPerDP+1)
return
end