|
rpt2_ptwise_geo.f.html |
|
|
Source file: rpt2_ptwise_geo.f
|
|
Directory: /home/rjl/git/rjleveque/clawpack-4.x/geoclaw/2d/lib
|
|
Converted: Sun May 15 2011 at 19:15:41
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
c
c
c ===============================================================
subroutine rpt2_ptwise(ixy, ilr, meqn, maux, qLeft, qRight,
& auxLeft, auxRight, asdq, bmasdq, bpasdq)
c ===============================================================
c
c # Riemann solver in the transverse direction using an einfeldt
c # Jacobian.
c
c # Split asdq (= A^* \Delta q, where *=+ if ilr=1 or *=- if ilr=2)
c # into down-going flux difference bmasdq (= B^- A^* \Delta q)
c # and up-going flux difference bpasdq (= B^+ A^* \Delta q)
c
c # This is a new-style Riemann solver that works pointwise, with
c # Left state qLeft and right state qRight. (Note change in notation!!)
c
c # Often only asdq is needed, not q or aux arrays, but these are
c # provided in a more general form than in the previous rpt2 format:
c # qLeft(0, 1:m) is q in left state along this grid row,
c # qLeft(-1,1:m) is q in left state along row below,
c # qLeft(1, 1:m) is q in left state along row above,
c # Simlarly for qRight, auxLeft, and auxRight.
c
c
use geoclaw_module
implicit none
integer ixy, ilr, meqn, maux
double precision qLeft(-1:1,meqn), qRight(-1:1,meqn)
double precision auxLeft(-1:1,maux), auxRight(-1:1,maux)
double precision asdq(meqn), bpasdq(meqn), bmasdq(meqn)
c
c-----------------------last modified 1/10/05----------------------
double precision s(3)
double precision r(3,3)
double precision beta(3)
double precision g,tol,abs_tol
double precision hl,hr,hul,hur,hvl,hvr,vl,vr,ul,ur,bl,br
double precision uhat,vhat,hhat,roe1,roe3,s1,s2,s3,s1l,s3r
double precision delf1,delf2,delf3,dxdcd,dxdcu
integer i,m,mw,mu,mv
g=grav
tol=drytolerance
abs_tol=drytolerance/100.d0
if (ixy.eq.1) then
mu = 2
mv = 3
else
mu = 3
mv = 2
endif
hl=qLeft(0,1)
hr=qRight(0,1)
hul=qLeft(0,mu)
hur=qRight(0,mu)
hvl=qLeft(0,mv)
hvr=qRight(0,mv)
c===========determine velocity from momentum===========================
if (hl.lt.abs_tol) then
hl=0.d0
ul=0.d0
vl=0.d0
else
ul=hul/hl
vl=hvl/hl
endif
if (hr.lt.abs_tol) then
hr=0.d0
ur=0.d0
vr=0.d0
else
ur=hur/hr
vr=hvr/hr
endif
do mw=1,3
s(mw)=0.d0
beta(mw)=0.d0
do m=1,meqn
r(m,mw)=0.d0
enddo
enddo
if (hl.le.0.d0.and.hr.le.0.d0) go to 90
c=====Determine some speeds necessary for the Jacobian=================
vhat=(vr*dsqrt(hr))/(dsqrt(hr)+dsqrt(hl)) +
& (vl*dsqrt(hl))/(dsqrt(hr)+dsqrt(hl))
uhat=(ur*dsqrt(hr))/(dsqrt(hr)+dsqrt(hl)) +
& (ul*dsqrt(hl))/(dsqrt(hr)+dsqrt(hl))
hhat=(hr+hl)/2.d0
roe1=vhat-dsqrt(g*hhat)
roe3=vhat+dsqrt(g*hhat)
s1l=vl-dsqrt(g*hl)
s3r=vr+dsqrt(g*hr)
s1=dmin1(roe1,s1l)
s3=dmax1(roe3,s3r)
s2=0.5d0*(s1+s3)
s(1)=s1
s(2)=s2
s(3)=s3
c=======================Determine asdq decomposition (beta)============
delf1=asdq(1)
delf2=asdq(mu)
delf3=asdq(mv)
beta(1) = (s3*delf1/(s3-s1))-(delf3/(s3-s1))
beta(2) = -s2*delf1 + delf2
beta(3) = (delf3/(s3-s1))-(s1*delf1/(s3-s1))
c======================End =================================================
c=====================Set-up eigenvectors===================================
r(1,1) = 1.d0
r(2,1) = s2
r(3,1) = s1
r(1,2) = 0.d0
r(2,2) = 1.d0
r(3,2) = 0.d0
r(1,3) = 1.d0
r(2,3) = s2
r(3,3) = s3
c============================================================================
90 continue
c============= compute fluctuations==========================================
do m=1,meqn
bmasdq(m)=0.0d0
bpasdq(m)=0.0d0
enddo
do mw=1,3
if (s(mw).lt.0.d0) then
bmasdq(1) =bmasdq(1) + s(mw)*beta(mw)*r(1,mw)
bmasdq(mu)=bmasdq(mu) + s(mw)*beta(mw)*r(2,mw)
bmasdq(mv)=bmasdq(mv) + s(mw)*beta(mw)*r(3,mw)
elseif (s(mw).gt.0.d0) then
bpasdq(1) =bpasdq(1) + s(mw)*beta(mw)*r(1,mw)
bpasdq(mu)=bpasdq(mu) + s(mw)*beta(mw)*r(2,mw)
bpasdq(mv)=bpasdq(mv) + s(mw)*beta(mw)*r(3,mw)
endif
enddo
c
return
end