step1fw.f.html | |
Source file: step1fw.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/clawpack/1d/lib | |
Converted: Sun May 15 2011 at 19:15:42 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c c =================================================================== subroutine step1(maxmx,meqn,mwaves,mbc,mx,q,aux,dx,dt, & method,mthlim,cfl,f,fwave,s,amdq,apdq,dtdx,rp1) c =================================================================== c c # Take one time step, updating q. c c ---------------------------------------------------------------------- c # step1fw is a modified version of step1 to use fwave instead of wave. c # A modified Riemann solver rp1 must be used in conjunction with this c # routine, which returns fwave's instead of wave's. c # See http://amath.washington.edu/~claw/fwave.html c c # Limiters are applied to the fwave's, and the only significant c # modification of this code is in the "do 110" loop, for the c # second order corrections. c ---------------------------------------------------------------------- c c method(1) = 1 ==> Godunov method c method(1) = 2 ==> Slope limiter method c mthlim(p) controls what limiter is used in the pth family c c c amdq, apdq, fwave, s, and f are used locally: c c amdq(1-mbc:maxmx+mbc, meqn) = left-going flux-differences c apdq(1-mbc:maxmx+mbc, meqn) = right-going flux-differences c e.g. amdq(i,m) = m'th component of A^- \Delta q from i'th Riemann c problem (between cells i-1 and i). c c fwave(1-mbc:maxmx+mbc, meqn, mwaves) = waves from solution of c Riemann problems, c fwave(i,m,mw) = mth component of jump in f across c wave in family mw in Riemann problem between c states i-1 and i. c c s(1-mbc:maxmx+mbc, mwaves) = wave speeds, c s(i,mw) = speed of wave in family mw in Riemann problem between c states i-1 and i. c c f(1-mbc:maxmx+mbc, meqn) = correction fluxes for second order method c f(i,m) = mth component of flux at left edge of ith cell c -------------------------------------------------------------------- c implicit double precision (a-h,o-z) dimension q(1-mbc:maxmx+mbc, meqn) dimension aux(1-mbc:maxmx+mbc, *) dimension f(1-mbc:maxmx+mbc, meqn) dimension s(1-mbc:maxmx+mbc, mwaves) dimension fwave(1-mbc:maxmx+mbc, meqn, mwaves) dimension amdq(1-mbc:maxmx+mbc, meqn) dimension apdq(1-mbc:maxmx+mbc, meqn) dimension dtdx(1-mbc:maxmx+mbc) dimension method(7),mthlim(mwaves) logical limit c c # check if any limiters are used: limit = .false. do 5 mw=1,mwaves if (mthlim(mw) .gt. 0) limit = .true. 5 continue c mcapa = method(6) do 10 i=1-mbc,mx+mbc if (mcapa.gt.0) then if (aux(i,mcapa) .le. 0.d0) then write(6,*) 'Error -- capa must be positive' stop endif dtdx(i) = dt / (dx*aux(i,mcapa)) else dtdx(i) = dt/dx endif 10 continue c c c c # solve Riemann problem at each interface c ----------------------------------------- c call rp1(maxmx,meqn,mwaves,mbc,mx,q,q,aux,aux,fwave,s,amdq,apdq) c c # Modify q for Godunov update: c # Note this may not correspond to a conservative flux-differencing c # for equations not in conservation form. It is conservative if c # amdq + apdq = f(q(i)) - f(q(i-1)). c do 40 i=1,mx+1 do 39 m=1,meqn q(i,m) = q(i,m) - dtdx(i)*apdq(i,m) q(i-1,m) = q(i-1,m) - dtdx(i-1)*amdq(i,m) 39 continue 40 continue c c # compute maximum wave speed: cfl = 0.d0 do 50 mw=1,mwaves do 45 i=1,mx+1 c # if s>0 use dtdx(i) to compute CFL, c # if s<0 use dtdx(i-1) to compute CFL: cfl = dmax1(cfl, dtdx(i)*s(i,mw), -dtdx(i-1)*s(i,mw)) 45 continue 50 continue c if (method(2) .eq. 1) go to 900 c c # compute correction fluxes for second order q_{xx} terms: c ---------------------------------------------------------- c do 100 m = 1, meqn do 100 i = 1-mbc, mx+mbc f(i,m) = 0.d0 100 continue c c # apply limiter to waves: if (limit) then call limiter(maxmx,meqn,mwaves,mbc,mx,fwave,s,mthlim) endif c do 120 i=1,mx+1 do 120 m=1,meqn do 110 mw=1,mwaves dtdxave = 0.5d0 * (dtdx(i-1) + dtdx(i)) f(i,m) = f(i,m) + 0.5d0 * dsign(1.d0,s(i,mw)) & * (1.d0 - dabs(s(i,mw))*dtdxave) * fwave(i,m,mw) c 110 continue 120 continue c c 140 continue c c # update q by differencing correction fluxes c ============================================ c c # (Note: Godunov update has already been performed above) c do 150 m=1,meqn do 150 i=1,mx q(i,m) = q(i,m) - dtdx(i) * (f(i+1,m) - f(i,m)) 150 continue c 900 continue return end