CLAWPACK               b4step1.f.html        
 Source file:   b4step1.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.

 
c     ============================================
      subroutine b4step1(maxmx,mbc,mx,meqn,q,
     &            xlower,dx,t,dt,maux,aux)
c     ============================================
c
c     # called from claw1 before each call to step1.
c     # used to print out shock location, h, u, dh each time step.
c
c     
      implicit double precision (a-h,o-z)
      dimension q(1-mbc:maxmx+mbc, meqn)
      dimension aux(1-mbc:maxmx+mbc, *)

      integer midpoint, local_mthbc(2), step
      double precision x0, x1, t1, midx, frac
      logical regrid
      integer icount, iold, inewleft, inewright
      double precision qiold, qioldm1, qioldp1
      double precision leftslope, rightslope, myslope
      double precision npoly, nstar
      logical treset
      common /ceos/ grav, gamma, gamma1, sK, npoly, nstar, Crho, ieos
      common /comxt/ dtcom,dxcom,tcom
      common /comxt/ treset


c     if (xlower.gt.-7.d0) then
c	 write(6,*) 'Stop in b4step1'
c        stop
c	 endif

c     # check for NANs in solution:
      call check4nans(maxmx,meqn,mbc,mx,q,t,1)


c     # Check for negative depth:
      do i=1-mbc,mx+mbc
         if (q(i,1) .lt. 0.d0) then
            write(6,*) 'Resetting q(i,1) to zero, i = ',i
            write(6,*) '   q(i,1) = ',q(i,1)
            q(i,1) = 0.d0
            stop
            endif
         enddo

      regrid = .true.
      frac = 0.1d0
      x0 = -10.d0
      x1 = -10.d0
      t1 = 4.d0
      step = 30

      startx = x0 + t/t1*(x1-x0)
      startpoint = int((startx-xlower)/dx)
      if (startpoint .gt. mx) startpoint = mx
      if (startpoint .lt. 1+3+step) startpoint = 1+3+step
      write(30,*) t,startx,startpoint

      dhmax = 0.d0
      do i=startpoint,mx
         dh =  dabs(q(i+1,1)- q(i,1))
	 if (dh.gt.dhmax) then
	    dhmax = dh
	    imax = i
         endif
      enddo

c     # Modification by RJL to look at where dv/dx is most negative:
      dvmax = 0.d0
      imax = mx
      do i=mx,1,-1
         dv =  dabs(q(i,2)/q(i,1)- q(i+1,2)/q(i+1,1))
	 if (dv.gt.dvmax) then
	    dvmax = dv
	    imax = i
         endif
      enddo

      xs = xlower + imax*dx
c     write(6,*) '+++ imax = ',imax, '   dvmax = ',dvmax
      hs = q(imax-3,1)
      h1 = (hs - q(imax-3-step,1)) / (step*dx)
      us = q(imax-3,2)/hs
      u1 = (us - q(imax-3-step,2)/q(imax-3-step,1)) / (step*dx)
      dh = q(imax-3,1) - q(imax+3,1)
         
c     # Changed to write t and xs at end only after t is reset.
c     write(29,291) t,xs,hs,us,dh,h1,u1
c     write(39,*) t,imax,xs,dvmax

 291  format(7e25.15)

c     Regridding
      if (regrid .and. xs .gt. frac*xlower) then
         if (xs.gt.1.d-20) then
            write(6,*) '***Aborting at t = ',t,
     &                 ' since xs is too large, xs =',  xs
            stop
            endif

         write(6,*) 'regridding at t, xs =', t, xs
         write(6,*) 'xlower from', xlower, 'to', 0.5d0*xlower
         xlower = 0.5d0*xlower
         dx = 0.5d0*dx
         dt = 0.5d0*dt
         dxcom = dx      !# used in pres_psi
         dtcom = dt

C$$$ccccccccccccccccccccccccccccccccccccc
c        do i=1,mx
c           write(501,*) i, q(i,1)
c           write(502,*) i, q(i,2)/q(i,1)
c        end do
c        write(501,*) imax
c        write(502,*) imax
C$$$cccccccccccccccccccccccccccccccccccccc         

c     Regrid the conserved quantities. 
c     Rewritten by RJL (12/09) to assume mx even, which simplifies things
c     from CG's original version of minmod slopes assuming mx odd.
c     q(i,:) is the cell average in cell i.
c     Say we have cells 1, 2, 3, 4, 5, 6 (mx is always even).
c     New cell 1 is the left half of old cell 4. 
c     New cell 6 is the right half of old cell 6. 

         mx2 = mx/2
         do m=1,3
            do iold=mx2+1, mx
               qiold = q(iold,m)
               
c              # one-sided slopes:
               slopeleft  = qiold - q(iold-1,m)
               sloperight = q(iold+1,m) - qiold

c              # minmod limiter:
               if (dabs(slopeleft).lt.dabs(sloperight)) then
                  slope = slopeleft
                else
                  slope = sloperight
                endif
               if (slopeleft*sloperight .le. 0.d0) then
                  slope = 0.d0
                endif

c              # Or, use zero slopes:
c              slope = 0.d0  

               ileft = 2*(iold - mx2 - 1) + 1
               iright = ileft + 1
               q(ileft,m) = qiold - 0.25d0*slope
               q(iright,m) = qiold + 0.25d0*slope
               enddo
            enddo


c     In front of the shock, nothing should be moving, but when the
c     shock gets very close to the beach, numerical error accumulates.
c     To avoid this, overwrite with the rest solution.

c     Is this still needed with wb method?  
c     Yes, since otherwise averaging densities, etc onto finer grid gives
c     states that are no longer exact equilibrium states.

         do i=imax+3,mx
 	    xc = xlower + (i-0.5d0)*dx
            q(i,1) = Crho*(-xc)**nstar
            q(i,2) = 0.d0
            pressure = grav/(nstar+1.d0)*Crho * (-xc)**(nstar+1.d0)
            q(i,3) = pressure / gamma1 

c           +++ old:
c           q(i,1) = (-grav*xc / (npoly*gamma*sK))**npoly
c           q(i,2) = 0.d0
c           q(i,3) = sK * q(i,1)**gamma / gamma1 +
c    &                   0.5d0*q(i,2)**2/q(i,1)
c           +++ debug:
c           write(51,501) i,xc,q(i,1),q(i,3)
c 501       format( i5,3e20.10)
         end do

c     The parameter mthbc has not been passed to us, but we know what it is:
         local_mthbc(1)=1
         local_mthbc(2)=3
         call bc1(maxmx,meqn,mbc,mx,xlower,dx,q,maux,aux,t,dt,
     $        local_mthbc)

c        +++ debug:
c        do i=mx-2,mx+2
c           write(51,511) i,xc,q(i,1),q(i,2),q(i,3)
c 511       format( i5,4e16.6)
c          end do

C$$$ccccccccccccccccccccccccccccccccccccc
c        do i=1,mx
c           write(501,*) i, q(i,1)
c           write(502,*) i, q(i,2)/q(i,1)
c        end do
c        write(501,*) imax
c        write(502,*) imax
c        stop 'stop for debugging after first regridding'
C$$$cccccccccccccccccccccccccccccccccccccc         

      endif

c     # always reset to equilibrium soln near right boundary
c     # see if this works for n=1.5, nstar=3. case?
      do i=mx-20,mx
 	    xc = xlower + (i-0.5d0)*dx
            write(51,501) i,xc,q(i,1),q(i,3)
            q(i,1) = Crho*(-xc)**nstar
            q(i,2) = 0.d0
            pressure = grav/(nstar+1.d0)*Crho * (-xc)**(nstar+1.d0)
            q(i,3) = pressure / gamma1 
c           +++ debug:
            write(51,501) i,xc,q(i,1),q(i,3)
  501       format( i5,3e20.10)
         end do

c     xreset = -1.d-5  ! used for Euler
      xreset = -1.d-4
      if (xlower.gt.xreset .and. (.not. treset)) then
         write(6,*) '==== Resetting t to 0 at time t = ',t
         write(26,261) t
  261    format(e26.16,'   time tc reset to 0')
         t = 0.d0
         treset = .true.
         endif

      if (treset) then
         write(29,291) t,xs
        else
         write(28,291) t,xs
        endif


      return
      end