CLAWPACK               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