|
qad.f.html |
|
|
Source file: qad.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 qad(valbig,mitot,mjtot,nvar,
. svdflx,qc1d,lenbc,lratiox,lratioy,hx,hy,
. maux,aux,auxc1d,delt,mptr)
implicit double precision (a-h, o-z)
include "call.i"
logical qprint
dimension valbig(mitot,mjtot,nvar)
dimension qc1d(lenbc,nvar)
dimension svdflx(nvar,lenbc)
dimension aux(mitot,mjtot,maux)
dimension auxc1d(lenbc,maux)
c
c ::::::::::::::::::::::::::: QAD ::::::::::::::::::::::::::::::::::
c solve RP between ghost cell value on fine grid and coarse grid
c value that ghost cell overlaps. The resulting fluctuations
c are added in to coarse grid value, as a conservation fixup.
c Done each fine grid time step. If source terms are present, the
c coarse grid value is advanced by source terms each fine time step too.
c No change needed in this sub. for spherical mapping: correctly
c mapped vals already in bcs on this fine grid and coarse saved
c vals also properly prepared
c
c Side 1 is the left side of the fine grid patch. Then go around clockwise.
c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
c
c # local storage
c # note that dimension here are bigger than dimensions used
c # in rp2, but shouldn't matter since wave is not used in qad
c # and for other arrays it is only the last parameter that is wrong
c # ok as long as meqn, mwaves < maxvar
parameter (max1dp1 = max1d+1)
dimension ql(max1dp1,maxvar), qr(max1dp1,maxvar)
dimension wave(max1dp1,maxvar,maxvar), s(max1dp1,maxvar)
dimension amdq(max1dp1,maxvar), apdq(max1dp1,maxvar)
dimension auxl(max1dp1,maxaux), auxr(max1dp1,maxaux)
data qprint/.false./
c
c aux is auxiliary array with user parameters needed in Riemann solvers
c on fine grid corresponding to valbig
c auxc1d is coarse grid stuff from around boundary, same format as qc1d
c auxl, auxr are work arrays needed to pass stuff to rpn2
c maux is the number of aux variables, which may be zero.
c
if (qprint) write(dbugunit,*)" working on grid ",mptr
tgrid = rnode(timemult, mptr)
nc = mjtot-2*nghost
nr = mitot-2*nghost
level = node(nestlevel, mptr)
index = 0
c
c--------
c side 1
c--------
c
do 10 j = nghost+1, mjtot-nghost
if (maux.gt.0) then
do 5 ma = 1,maux
if (auxtype(ma).eq."xleft") then
c # Assuming velocity at left-face, this fix
c # preserves conservation in incompressible flow:
auxl(j-nghost+1,ma) = aux(nghost+1,j,ma)
else
c # Normal case -- we set the aux arrays
c # from the cell corresponding to q
auxl(j-nghost+1,ma) = aux(nghost,j,ma)
endif
5 continue
endif
do 10 ivar = 1, nvar
ql(j-nghost+1,ivar) = valbig(nghost,j,ivar)
10 continue
lind = 0
ncrse = (mjtot-2*nghost)/lratioy
do 20 jc = 1, ncrse
index = index + 1
do 25 l = 1, lratioy
lind = lind + 1
if (maux.gt.0) then
do 24 ma=1,maux
auxr(lind,ma) = auxc1d(index,ma)
24 continue
endif
do 25 ivar = 1, nvar
25 qr(lind,ivar) = qc1d(index,ivar)
20 continue
if (qprint) then
write(dbugunit,*) 'side 1, ql and qr:'
do i=2,nc
write(dbugunit,4101) i,qr(i-1,1),ql(i,1)
enddo
4101 format(i3,4e16.6)
if (maux .gt. 0) then
write(dbugunit,*) 'side 1, auxr:'
do i=2,nc
write(dbugunit,4101) i,(auxr(i-1,ma),ma=1,maux)
enddo
write(dbugunit,*) 'side 1, auxl:'
do i=2,nc
write(dbugunit,4101) i,(auxl(i,ma),ma=1,maux)
enddo
endif
endif
call rpn2(1,max1dp1-2*nghost,nvar,mwaves,nghost,nc+1-2*nghost,
. ql,qr,auxl,auxr,wave,s,amdq,apdq)
c
c we have the wave. for side 1 add into sdflxm
c
influx = 0
do 30 j = 1, nc/lratioy
influx = influx + 1
jfine = (j-1)*lratioy
do 40 ivar = 1, nvar
do 50 l = 1, lratioy
svdflx(ivar,influx) = svdflx(ivar,influx)
. + amdq(jfine+l+1,ivar) * hy * delt
. + apdq(jfine+l+1,ivar) * hy * delt
50 continue
40 continue
30 continue
c--------
c side 2
c--------
c
if (mjtot .eq. 2*nghost+1) then
c # a single row of interior cells only happens when using the
c # 2d amrclaw code to do a 1d problem with refinement.
c # (feature added in Version 4.3)
c # skip over sides 2 and 4 in this case
go to 299
endif
do 210 i = nghost+1, mitot-nghost
if (maux.gt.0) then
do 205 ma = 1,maux
auxr(i-nghost,ma) = aux(i,mjtot-nghost+1,ma)
205 continue
endif
do 210 ivar = 1, nvar
qr(i-nghost,ivar) = valbig(i,mjtot-nghost+1,ivar)
210 continue
lind = 0
ncrse = (mitot-2*nghost)/lratiox
do 220 ic = 1, ncrse
index = index + 1
do 225 l = 1, lratiox
lind = lind + 1
if (maux.gt.0) then
do 224 ma=1,maux
if (auxtype(ma).eq."yleft") then
c # Assuming velocity at bottom-face, this fix
c # preserves conservation in incompressible flow:
ifine = (ic-1)*lratiox + nghost + l
auxl(lind+1,ma) = aux(ifine,mjtot-nghost+1,ma)
else
auxl(lind+1,ma) = auxc1d(index,ma)
endif
224 continue
endif
do 225 ivar = 1, nvar
225 ql(lind+1,ivar) = qc1d(index,ivar)
220 continue
if (qprint) then
write(dbugunit,*) 'side 2, ql and qr:'
do i=1,nr
write(dbugunit,4101) i,ql(i+1,1),qr(i,1)
enddo
if (maux .gt. 0) then
write(dbugunit,*) 'side 2, auxr:'
do i = 1, nr
write(dbugunit,4101) i, (auxr(i,ma),ma=1,maux)
enddo
write(dbugunit,*) 'side 2, auxl:'
do i = 1, nr
write(dbugunit,4101) i, (auxl(i,ma),ma=1,maux)
enddo
endif
endif
call rpn2(2,max1dp1-2*nghost,nvar,mwaves,nghost,nr+1-2*nghost,
. ql,qr,auxl,auxr,wave,s,amdq,apdq)
c
c we have the wave. for side 2. add into sdflxp
c
do 230 i = 1, nr/lratiox
influx = influx + 1
ifine = (i-1)*lratiox
do 240 ivar = 1, nvar
do 250 l = 1, lratiox
svdflx(ivar,influx) = svdflx(ivar,influx)
. - amdq(ifine+l+1,ivar) * hx * delt
. - apdq(ifine+l+1,ivar) * hx * delt
250 continue
240 continue
230 continue
299 continue
c--------
c side 3
c--------
c
do 310 j = nghost+1, mjtot-nghost
if (maux.gt.0) then
do 305 ma = 1,maux
auxr(j-nghost,ma) = aux(mitot-nghost+1,j,ma)
305 continue
endif
do 310 ivar = 1, nvar
qr(j-nghost,ivar) = valbig(mitot-nghost+1,j,ivar)
310 continue
lind = 0
ncrse = (mjtot-2*nghost)/lratioy
do 320 jc = 1, ncrse
index = index + 1
do 325 l = 1, lratioy
lind = lind + 1
if (maux.gt.0) then
do 324 ma=1,maux
if (auxtype(ma).eq."xleft") then
c # Assuming velocity at left-face, this fix
c # preserves conservation in incompressible flow:
jfine = (jc-1)*lratioy + nghost + l
auxl(lind+1,ma) = aux(mitot-nghost+1,jfine,ma)
else
auxl(lind+1,ma) = auxc1d(index,ma)
endif
324 continue
endif
do 325 ivar = 1, nvar
325 ql(lind+1,ivar) = qc1d(index,ivar)
320 continue
if (qprint) then
write(dbugunit,*) 'side 3, ql and qr:'
do i=1,nc
write(dbugunit,4101) i,ql(i,1),qr(i,1)
enddo
endif
call rpn2(1,max1dp1-2*nghost,nvar,mwaves,nghost,nc+1-2*nghost,
. ql,qr,auxl,auxr,wave,s,amdq,apdq)
c
c we have the wave. for side 3 add into sdflxp
C
do 330 j = 1, nc/lratioy
influx = influx + 1
jfine = (j-1)*lratioy
do 340 ivar = 1, nvar
do 350 l = 1, lratioy
svdflx(ivar,influx) = svdflx(ivar,influx)
. - amdq(jfine+l+1,ivar) * hy * delt
. - apdq(jfine+l+1,ivar) * hy * delt
350 continue
340 continue
330 continue
c--------
c side 4
c--------
c
if (mjtot .eq. 2*nghost+1) then
c # a single row of interior cells only happens when using the
c # 2d amrclaw code to do a 1d problem with refinement.
c # (feature added in Version 4.3)
c # skip over sides 2 and 4 in this case
go to 499
endif
c
do 410 i = nghost+1, mitot-nghost
if (maux.gt.0) then
do 405 ma = 1,maux
if (auxtype(ma).eq."yleft") then
c # Assuming velocity at bottom-face, this fix
c # preserves conservation in incompressible flow:
auxl(i-nghost+1,ma) = aux(i,nghost+1,ma)
else
auxl(i-nghost+1,ma) = aux(i,nghost,ma)
endif
405 continue
endif
do 410 ivar = 1, nvar
ql(i-nghost+1,ivar) = valbig(i,nghost,ivar)
410 continue
lind = 0
ncrse = (mitot-2*nghost)/lratiox
do 420 ic = 1, ncrse
index = index + 1
do 425 l = 1, lratiox
lind = lind + 1
if (maux.gt.0) then
do 424 ma=1,maux
auxr(lind,ma) = auxc1d(index,ma)
424 continue
endif
do 425 ivar = 1, nvar
425 qr(lind,ivar) = qc1d(index,ivar)
420 continue
if (qprint) then
write(dbugunit,*) 'side 4, ql and qr:'
do i=1,nr
write(dbugunit,4101) i, ql(i,1),qr(i,1)
enddo
endif
call rpn2(2,max1dp1-2*nghost,nvar,mwaves,nghost,nr+1-2*nghost,
. ql,qr,auxl,auxr,wave,s,amdq,apdq)
c
c we have the wave. for side 4. add into sdflxm
c
do 430 i = 1, nr/lratiox
influx = influx + 1
ifine = (i-1)*lratiox
do 440 ivar = 1, nvar
do 450 l = 1, lratiox
svdflx(ivar,influx) = svdflx(ivar,influx)
. + amdq(ifine+l+1,ivar) * hx * delt
. + apdq(ifine+l+1,ivar) * hx * delt
450 continue
440 continue
430 continue
499 continue
c # for source terms:
if (method(5) .ne. 0) then ! should I test here if index=0 and all skipped?
call src1d(nvar,nghost,lenbc,qc1d,maux,auxc1d,tgrid,delt)
c # how can this be right - where is the integrated src term used?
endif
return
end