|
prepc.f.html |
|
|
Source file: prepc.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib
|
|
Converted: Sun May 15 2011 at 19:16:15
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
c
c ----------------------------------------------------------
c
subroutine prepc(level,nvar)
c
implicit double precision (a-h,o-z)
include "call.i"
c
c :::::::::::::::::::: PREPC ::::::::::::::::::::::::::::::::::::::
c
c this routine called because regridding just changed the fine grids.
c modify coarse grid boundary lists to store fluxes in appropriate
c fine grids lists.
c assume new fine grids have node(cfluxptr) initialized to null
c
c first compute max. possible number of list cells. allocate
c initially so that one pass through is enough.
c
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
maxsp = 0
mkid = lstart(level+1)
10 if (mkid .eq. 0) go to 20
ikeep = (node(ndihi,mkid)-node(ndilo,mkid)+1)/intratx(level)
jkeep = (node(ndjhi,mkid)-node(ndjlo,mkid)+1)/intraty(level)
maxsp = maxsp + 2*(ikeep+jkeep)
mkid = node(levelptr,mkid)
go to 10
20 listsp(level) = maxsp
if (maxsp .eq. 0) go to 99
c
hxpar = hxposs(level)
hypar = hyposs(level)
hxkid = hxposs(level+1)
hykid = hyposs(level+1)
imax = iregsz(level) - 1
jmax = jregsz(level) - 1
mpar = lstart(level)
30 if (mpar .eq. 0) go to 99
c
ispot = 0
ilo = node(ndilo,mpar)
jlo = node(ndjlo,mpar)
ihi = node(ndihi,mpar)
jhi = node(ndjhi,mpar)
locbc = igetsp(5*maxsp)
c # initialize list to 0 (0 terminator indicates end of bc list)
do 35 i = 1,5*maxsp
35 alloc(locbc+i-1) = 0.d0
node(cfluxptr,mpar) = locbc
c
mkid = lstart(level+1)
40 if (mkid .eq. 0) go to 60
iclo = node(ndilo,mkid)/intratx(level)
jclo = node(ndjlo,mkid)/intraty(level)
ichi = node(ndihi,mkid)/intratx(level)
jchi = node(ndjhi,mkid)/intraty(level)
iplo = max(ilo,iclo)
jplo = max(jlo,jclo)
iphi = min(ihi,ichi)
jphi = min(jhi,jchi)
c regular intersections (will check in setuse that no duplication)
c this first call is only interior interfaces.
if (iplo .le. iphi+1 .and. jplo .le. jphi+1) then
kflag = 1 ! interior stuff, no mappings
call setuse(alloc(locbc),maxsp,ispot,mkid,
2 ilo,ihi,jlo,jhi,iclo,ichi,jclo,jchi,kflag)
endif
c for fine grids touching periodic boundary on right
if (xperdom .and. ilo .eq. 0 .and. ichi .eq. imax) then
kflag = 1 ! periodic in x
call setuse(alloc(locbc),maxsp,ispot,mkid,
2 ilo,ihi,jlo,jhi,iclo-iregsz(level),ichi-iregsz(level),
3 jclo,jchi,kflag)
endif
c for fine grids touching periodic boundary on left
if (xperdom .and. iclo .eq. 0 .and. ihi .eq. imax) then
kflag = 1
call setuse(alloc(locbc),maxsp,ispot,mkid,
2 ilo,ihi,jlo,jhi,iclo+iregsz(level),ichi+iregsz(level),
3 jclo,jchi,kflag)
endif
c for fine grids touching periodic boundary on top
if (yperdom .and. jlo .eq. 0 .and. jchi .eq. jmax) then
kflag = 1
call setuse(alloc(locbc),maxsp,ispot,mkid,
2 ilo,ihi,jlo,jhi,iclo,ichi,
3 jclo-jregsz(level),jchi-jregsz(level),kflag)
endif
c for fine grids touching periodic boundary on bottom
if (yperdom .and. jclo .eq. 0 .and. jhi .eq. jmax) then
kflag = 1
call setuse(alloc(locbc),maxsp,ispot,mkid,
2 ilo,ihi,jlo,jhi,iclo,ichi,
3 jclo+jregsz(level),jchi+jregsz(level),kflag)
endif
c for fine grids touching boundary on top in spherically mapped case
c and coarse grid touches top too. see if (mapped) x extent overlap.
if (spheredom .and. jhi .eq. jmax .and. jchi .eq. jmax) then
kflag = 2
c write(dbugunit,*)" for coarse grid ",mpar
iwrap2 = iregsz(level) - iclo - 1 !higher mapped index
iwrap1 = iregsz(level) - ichi - 1 !lower mapped index
if (max(ilo,iwrap1) .le. min(ihi,iwrap2)) then
call setuse(alloc(locbc),maxsp,ispot,mkid,
1 ilo,ihi,jlo,jhi,iclo,ichi,
2 jclo,jchi,kflag)
endif
endif
c fine grids touching boundary on bottom for spherically mapped case
c coarse grid touches bottom too. see if (mapped) x extents overlap
if (spheredom .and. jclo .eq. 0 .and. jlo .eq. 0) then
kflag = 3
iwrap2 = iregsz(level) - iclo - 1 !higher mapped index
iwrap1 = iregsz(level) - ichi - 1 !lower mapped index
if (max(ilo,iwrap1) .le. min(ihi,iwrap2)) then
call setuse(alloc(locbc),maxsp,ispot,mkid,
1 ilo,ihi,jlo,jhi,iclo,ichi,
2 jclo,jchi,kflag)
endif
endif
50 mkid = node(levelptr,mkid)
go to 40
c
c done with subgrid cycle. if no cells would need fixing, all done
c else cycle through again to set up list with info. for bc processing
c
60 continue
c
c for now, leave unused space allocated to the grid. alternative is to
c return (maxsp-ispot) amt starting at loc node(cfluxptr,mpar)+ispot.
c
mpar = node(levelptr,mpar)
go to 30
c
99 return
end