|
rp1swfw.f90.html |
|
|
Source file: rp1swfw.f90
|
|
Directory: /Users/rjl/clawpack_src/clawpack_master/apps/tsunami/shelf1d
|
|
Converted: Sat Apr 18 2020 at 20:30:15
using clawcode2html
|
|
This documentation file will
not reflect any later changes in the source file.
|
! =========================================================
subroutine rp1(maxmx,meqn,mwaves,maux,mbc,mx,ql,qr,auxl,auxr,fwave,s,amdq,apdq)
! =========================================================
! Solve Riemann problems for the 1D shallow water equations
! with topography source terms
! (h)_t + (u h)_x = 0
! (uh)_t + ( uuh + .5*gh^2 )_x = -ghB_x
! using Roe's approximate Riemann solver and the f-wave formulation
! to incorporate source terms
! fwaves: 2
! equations: 2
! Conserved quantities:
! 1 depth
! 2 momentum
! Auxiliary arrays:
! 1 topography/bathymetry B
! This function solves the Riemann problem at all interfaces in one call
! On input, ql contains the state vector at the left edge of each cell
! qr contains the state vector at the right edge of each cell
! On output, fwave contains the fwaves,
! s the speeds,
! amdq the left-going flux difference A^- \Delta q
! apdq the right-going flux difference A^+ \Delta q
! Note that the i'th Riemann problem has left state qr(:,i-1)
! and right state ql(:,i)
! From the basic clawpack routine step1, rp is called with ql = qr = q.
implicit double precision (a-h,o-z)
dimension ql(meqn, 1-mbc:maxmx+mbc)
dimension qr(meqn, 1-mbc:maxmx+mbc)
dimension s(mwaves, 1-mbc:maxmx+mbc)
dimension fwave(meqn, mwaves, 1-mbc:maxmx+mbc)
dimension amdq(meqn, 1-mbc:maxmx+mbc)
dimension apdq(meqn, 1-mbc:maxmx+mbc)
dimension auxl(maux, 1-mbc:maxmx+mbc)
dimension auxr(maux, 1-mbc:maxmx+mbc)
! # Gravity constant set in the setprob.f
common /cparam/ grav
! # Local storage
! ---------------
dimension delta(2)
! # Main loop of the Riemann solver.
do 30 i=2-mbc,mx+mbc
! # compute Roe-averaged quantities:
ubar = (qr(2,i-1)/dsqrt(qr(1,i-1)) + ql(2,i)/dsqrt(ql(1,i)))/ &
( dsqrt(qr(1,i-1)) + dsqrt(ql(1,i)) )
cbar=dsqrt(0.5d0*grav*(qr(1,i-1) + ql(1,i)))
! # jump in topography:
! # delta = flux difference + source
delta(1) = ql(2,i) - qr(2,i-1)
df = (ql(2,i)**2/ql(1,i) + 0.5d0*grav*ql(1,i)**2) - &
(qr(2,i-1)**2/qr(1,i-1) + 0.5d0*grav*qr(1,i-1)**2)
dB = auxl(1,i) - auxr(1,i-1)
delta(2) = df + 0.5d0*grav*(ql(1,i)+qr(1,i-1))*dB
! # Compute coeffs in the evector expansion of delta(1),delta(2)
a1 = 0.5d0*(-delta(2) + (ubar + cbar) * delta(1))/cbar
a2 = 0.5d0*( delta(2) - (ubar - cbar) * delta(1))/cbar
! # Finally, compute the waves.
fwave(1,1,i) = a1
fwave(2,1,i) = a1*(ubar - cbar)
s(1,i) = ubar - cbar
fwave(1,2,i) = a2
fwave(2,2,i) = a2*(ubar + cbar)
s(2,i) = ubar + cbar
30 END DO
! # No entropy fix
! ----------------------------------------------
! # amdq = SUM fwave over left-going waves
! # apdq = SUM fwave over right-going waves
do 100 m=1,2
do 100 i=2-mbc, mx+mbc
amdq(m,i) = 0.d0
apdq(m,i) = 0.d0
do 90 mw=1,mwaves
if (s(mw,i) < 0.d0) then
amdq(m,i) = amdq(m,i) + fwave(m,mw,i)
else
apdq(m,i) = apdq(m,i) + fwave(m,mw,i)
endif
90 END DO
100 END DO
! -----------------------------------------------
return
end subroutine rp1