|
advanc.f.html |
|
|
Source file: advanc.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
subroutine advanc (level,nvar,dtlevnew,vtime,naux)
c
implicit double precision (a-h,o-z)
include "call.i"
logical vtime
c
c ::::::::::::::; ADVANC :::::::::::::::::::::::::::::::::::::::::::
c integrate all grids at the input 'level' by one step of its delta(t)
c this includes: setting the ghost cells
c advancing the solution on the grid
c adjusting fluxes for flux conservation step later
c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
mptr = lstart(level)
hx = hxposs(level)
hy = hyposs(level)
delt = possk(level)
3 continue
nx = node(ndihi,mptr) - node(ndilo,mptr) + 1
ny = node(ndjhi,mptr) - node(ndjlo,mptr) + 1
mitot = nx + 2*nghost
mjtot = ny + 2*nghost
locnew = node(store1,mptr)
locaux = node(storeaux,mptr)
time = rnode(timemult,mptr)
c
call bound(time,nvar,nghost,alloc(locnew),mitot,mjtot,mptr,
1 alloc(locaux),naux)
mptr = node(levelptr, mptr)
if (mptr .ne. 0) go to 3
c
c save coarse level values if there is a finer level for wave fixup
if (level+1 .le. mxnest) then
if (lstart(level+1) .ne. null) then
call saveqc(level+1,nvar,naux)
endif
endif
c
dtlevnew = rinfinity
cfl_level = 0.d0 !# to keep track of max cfl seen on each level
mptr = lstart(level)
5 continue
locold = node(store2, mptr)
locnew = node(store1, mptr)
nx = node(ndihi,mptr) - node(ndilo,mptr) + 1
ny = node(ndjhi,mptr) - node(ndjlo,mptr) + 1
time = rnode(timemult,mptr)
c
mitot = nx + 2*nghost
mjtot = ny + 2*nghost
c ::: get scratch storage for fluxes and slopes
locfp = igetsp(mitot*mjtot*nvar)
locfm = igetsp(mitot*mjtot*nvar)
locgp = igetsp(mitot*mjtot*nvar)
locgm = igetsp(mitot*mjtot*nvar)
c
c copy old soln. values into next time step's soln. values
c since integrator will overwrite it. only for grids not at
c the finest level. finest level grids do not maintain copies
c of old and new time solution values.
c
if (level .lt. mxnest) then
ntot = mitot * mjtot * nvar
cdir$ ivdep
do 10 i = 1, ntot
10 alloc(locold + i - 1) = alloc(locnew + i - 1)
endif
c
xlow = rnode(cornxlo,mptr) - nghost*hx
ylow = rnode(cornylo,mptr) - nghost*hy
rvol = rvol + nx * ny
rvoll(level) = rvoll(level) + nx * ny
locaux = node(storeaux,mptr)
c
if (node(ffluxptr,mptr) .ne. 0) then
lenbc = 2*(nx/intratx(level-1)+ny/intraty(level-1))
locsvf = node(ffluxptr,mptr)
locsvq = locsvf + nvar*lenbc
locx1d = locsvq + nvar*lenbc
call qad(alloc(locnew),mitot,mjtot,nvar,
1 alloc(locsvf),alloc(locsvq),lenbc,
2 intratx(level-1),intraty(level-1),hx,hy,
3 naux,alloc(locaux),alloc(locx1d),delt,mptr)
endif
c # see if the grid about to advanced has gauge data to output
c # this corresponds to previous time step, but output done
c # now to make linear interpolation easier, since grid
c # now has boundary conditions filled in.
c # no testing here for mgauges>0 so that do not
c # need to use gauges.i. the only time advanc is
c # called that isn't "real" is in the initial setting
c # up of grids (setgrd), but source grids are 0 there so
c # nothing will be output.
call dumpgauge(alloc(locnew),alloc(locaux),xlow,ylow,
. nvar,mitot,mjtot,mptr)
c
call stepgrid(alloc(locnew),alloc(locfm),alloc(locfp),
1 alloc(locgm),alloc(locgp),
2 mitot,mjtot,nghost,
3 delt,dtnew,hx,hy,nvar,
4 xlow,ylow,time,mptr,naux,alloc(locaux))
if (node(cfluxptr,mptr) .ne. 0)
1 call fluxsv(mptr,alloc(locfm),alloc(locfp),
2 alloc(locgm),alloc(locgp),
3 alloc(node(cfluxptr,mptr)),mitot,mjtot,
4 nvar,listsp(level),delt,hx,hy)
if (node(ffluxptr,mptr) .ne. 0) then
lenbc = 2*(nx/intratx(level-1)+ny/intraty(level-1))
locsvf = node(ffluxptr,mptr)
call fluxad(alloc(locfm),alloc(locfp),
1 alloc(locgm),alloc(locgp),
2 alloc(locsvf),mptr,mitot,mjtot,nvar,
4 lenbc,intratx(level-1),intraty(level-1),
5 nghost,delt,hx,hy)
endif
c
call reclam(locfp, mitot*mjtot*nvar)
call reclam(locfm, mitot*mjtot*nvar)
call reclam(locgp, mitot*mjtot*nvar)
call reclam(locgm, mitot*mjtot*nvar)
c
dtlevnew = dmin1(dtlevnew,dtnew)
c
rnode(timemult,mptr) = rnode(timemult,mptr)+delt
mptr = node(levelptr, mptr)
if (mptr .ne. 0) go to 5
c
return
end