|
rpt2_geo.f.html |
|
|
Source file: rpt2_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(ixy,maxm,meqn,mwaves,mbc,mx,
& ql,qr,aux1,aux2,aux3,
& ilr,asdq,bmasdq,bpasdq)
c =====================================================
use geoclaw_module
implicit none
c
c # Riemann solver in the transverse direction using an einfeldt
c Jacobian.
c-----------------------last modified 1/10/05----------------------
integer ixy,maxm,meqn,mwaves,mbc,mx,ilr
double precision ql(1-mbc:maxm+mbc, meqn)
double precision qr(1-mbc:maxm+mbc, meqn)
double precision asdq(1-mbc:maxm+mbc, meqn)
double precision bmasdq(1-mbc:maxm+mbc, meqn)
double precision bpasdq(1-mbc:maxm+mbc, meqn)
double precision aux1(1-mbc:maxm+mbc,*)
double precision aux2(1-mbc:maxm+mbc,*)
double precision aux3(1-mbc:maxm+mbc,*)
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
double precision dxdcm,dxdcp,topo1,topo3,eta
integer i,m,mw,mu,mv
g=grav
tol=drytolerance
abs_tol=drytolerance
if (ixy.eq.1) then
mu = 2
mv = 3
else
mu = 3
mv = 2
endif
do i=2-mbc,mx+mbc
hl=qr(i-1,1)
hr=ql(i,1)
hul=qr(i-1,mu)
hur=ql(i,mu)
hvl=qr(i-1,mv)
hvr=ql(i,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,mwaves
s(mw)=0.d0
beta(mw)=0.d0
do m=1,meqn
r(m,mw)=0.d0
enddo
enddo
dxdcp = 1.d0
dxdcm = 1.d0
if (hl.le.drytolerance.and.hr.le.drytolerance) go to 90
* !check and see if cell that transverse waves are going in is high and dry
if (ilr.eq.1) then
eta = qr(i-1,1) + aux2(i-1,1)
topo1 = aux1(i-1,1)
topo3 = aux3(i-1,1)
c s1 = vl-sqrt(g*hl)
c s3 = vl+sqrt(g*hl)
c s2 = 0.5d0*(s1+s3)
else
eta = ql(i,1) + aux2(i,1)
topo1 = aux1(i,1)
topo3 = aux3(i,1)
c s1 = vr-sqrt(g*hr)
c s3 = vr+sqrt(g*hr)
c s2 = 0.5d0*(s1+s3)
endif
if (eta.lt.max(topo1,topo3)) go to 90
if (icoordsys.eq.2) then
if (ixy.eq.2) then
dxdcp=(Rearth*pi/180.d0)
dxdcm = dxdcp
else
if (ilr.eq.1) then
dxdcp = Rearth*pi*cos(aux3(i-1,3))/180.d0
dxdcm = Rearth*pi*cos(aux1(i-1,3))/180.d0
else
dxdcp = Rearth*pi*cos(aux3(i,3))/180.d0
dxdcm = Rearth*pi*cos(aux1(i,3))/180.d0
endif
endif
endif
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(i,1)
delf2=asdq(i,mu)
delf3=asdq(i,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(i,m)=0.0d0
bpasdq(i,m)=0.0d0
enddo
do mw=1,3
if (s(mw).lt.0.d0) then
bmasdq(i,1) =bmasdq(i,1) + dxdcm*s(mw)*beta(mw)*r(1,mw)
bmasdq(i,mu)=bmasdq(i,mu)+ dxdcm*s(mw)*beta(mw)*r(2,mw)
bmasdq(i,mv)=bmasdq(i,mv)+ dxdcm*s(mw)*beta(mw)*r(3,mw)
elseif (s(mw).gt.0.d0) then
bpasdq(i,1) =bpasdq(i,1) + dxdcp*s(mw)*beta(mw)*r(1,mw)
bpasdq(i,mu)=bpasdq(i,mu)+ dxdcp*s(mw)*beta(mw)*r(2,mw)
bpasdq(i,mv)=bpasdq(i,mv)+ dxdcp*s(mw)*beta(mw)*r(3,mw)
endif
enddo
c========================================================================
enddo
c
c
return
end