pres_psi.f.html | |
Source file: pres_psi.f | |
Directory: /var/www/html/clawpack/links/shockvacuum10/shockvacuum | |
Converted: Mon Aug 16 2010 at 14:13:31 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
subroutine pres_psi(q,pres,cs,psidx,mx,maxmx,mbc,meqn) c c On input: q = cell averages c Return: c pres = pressure in each cell c cs = sound speed in each cell c psidx = dx*averaged source term across interface at left of cell c The psi*dx source term will be subtracted from the pressure difference c in the Riemann solver to incorporate source terms into the f-wave c splitting. c c The formulas used here are designed to make the method well-balanced c for zero-velocity equilibria. c For polytropic and Euler the formulas are from [RJL, 2009, to appear]. implicit double precision (a-h,o-z) dimension q(1-mbc:maxmx+mbc, meqn) dimension pres(1-mbc:maxmx+mbc) dimension cs(1-mbc:maxmx+mbc) dimension psidx(1-mbc:maxmx+mbc) double precision npoly, nstar common /ceos/ grav, gamma, gamma1, sK, npoly, nstar, Crho, ieos common /comxt/ dtcom,dxcom,tcom c # parameters set in setrun.py c # NOTE: ieos=1 is now Euler. For shallow water use ieos=2 with npoly=1. if (ieos.eq.1) then c # ideal gas: psifactor = gamma1*grav*dxcom / (gamma*sK) gratio = gamma/gamma1 do i=1-mbc,mx+mbc if (q(i,1).gt.0.d0) then pres(i) = gamma1 * (q(i,3) - 0.5d0*q(i,2)**2 / q(i,1)) cs(i) = dsqrt(gamma*pres(i)/q(i,1)) else pres(i) = 0.d0 cs(i) = 0.d0 endif if (cs(i).ne.cs(i)) then write(6,*) '*** NaN in computing cs at i = ',i stop endif c # Source term assuming equilibrium has constant entropy, c # so p=sK*rho**gamma as in polytropic case c # Try choosing sK for each i as pres / rho**gamma: sK = pres(i) / q(i,1)**gamma psifactor = gamma1*grav*dxcom / (gamma*sK) if (i.gt.1 .and. i.le.mx) then psidx(i) = -0.5d0*sK*(-q(i,1)**gamma & - (q(i-1,1)**gamma1 - psifactor)**gratio & + (q(i,1)**gamma1 + psifactor)**gratio & + q(i-1,1)**gamma) else psidx(i) = 0.d0 if (psidx(i).ne.psidx(i)) then write(6,*) '*** NaN in computing psidx at i = ',i stop endif endif enddo else if (ieos.eq.2) then c # polytropic: psifactor = gamma1*grav*dxcom / (gamma*sK) gratio = gamma/gamma1 do i=1-mbc,mx+mbc pres(i) = sK*q(i,1)**gamma cs(i) = dsqrt(sK*gamma*q(i,1)**gamma1) if (i.gt.1 .and. i.le.mx) then psidx(i) = -0.5d0*sK*(-q(i,1)**gamma & - (q(i-1,1)**gamma1 - psifactor)**gratio & + (q(i,1)**gamma1 + psifactor)**gratio & + q(i-1,1)**gamma) else psidx(i) = 0.d0 endif enddo c endif return end