• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • src/3d/equations/advection/rp/rpt3ad1.f

    c
    c
    c     ==================================================================
          subroutine rpt3ad1(ixyz,icoor,maxm,meqn,mwaves,mbc,mx,
         &                   ql,qr,maux,aux1,aux2,aux3,imp,asdq,
         &                   bmasdq,bpasdq)
    c     ==================================================================
          implicit double precision(a-h,o-z)
    c
    c     # Riemann solver in the transverse direction for the 
    c     # advection equations.
    c     #
    c     # On input,
    c
    c     #    ql,qr is the data along some one-dimensional slice, as in rpn3
    c     #         This slice is 
    c     #             in the x-direction if ixyz=1,
    c     #             in the y-direction if ixyz=2, or 
    c     #             in the z-direction if ixyz=3.
    c     #    asdq is an array of flux differences (A^* \Delta q).
    c     #         asdq(i,:) is the flux difference propagating away from
    c     #         the interface between cells i-1 and i.
    c     #    imp = 1 if asdq = A^- \Delta q,  the left-going flux difference
    c     #          2 if asdq = A^+ \Delta q, the right-going flux difference
    c
    c     #    aux2 is the auxiliary array (if method(7)=maux>0) along
    c     #         the plane where this slice lies, say at j=J if ixyz=1.
    c     #         aux2(:,:,1) contains data along j=J, k=k-1
    c     #         aux2(:,:,2) contains data along j=J, k=k
    c     #         aux2(:,:,3) contains data along j=J, k=k+1
    c     #    aux1 is the auxiliary array along the plane with j=J-1
    c     #    aux3 is the auxiliary array along the plane with j=J+1
    c     
    c     #      if ixyz=2 then aux2 is in some plane k=K, and
    c     #         aux2(:,:,1)  contains data along i=I-1, k=K, etc.
    c     
    c     #      if ixyz=3 then aux2 is in some plane i=I, and
    c     #         aux2(:,:,1)  contains data along j=j-1, i=I, etc.
    c
    c     # On output,
    
    c     # If data is in x-direction (ixyz=1) then this routine does the
    c     # splitting of  asdq (= A^* \Delta q, where * = + or -) ...
    c
    c     # into down-going flux difference bmasdq (= B^- A^* \Delta q)
    c     #    and up-going flux difference bpasdq (= B^+ A^* \Delta q)
    c     #    when icoor = 2,
    c
    c     # or
    c
    c     # into down-going flux difference bmasdq (= C^- A^* \Delta q)
    c     #    and up-going flux difference bpasdq (= C^+ A^* \Delta q)
    c     #    when icoor = 3.
    c     #
    c
    c     # More generally, ixyz specifies what direction the slice of data is
    c     # in, and icoor tells which transverse direction to do the splitting in:
    c
    c     # If ixyz = 1,  data is in x-direction and then
    c     #       icoor = 2  =>  split in the y-direction  (iuvw=2)
    c     #       icoor = 3  =>  split in the z-direction  (iuvw=3)
    c
    c     # If ixyz = 2,  data is in y-direction and then
    c     #       icoor = 2  =>  split in the z-direction  (iuvw=3)
    c     #       icoor = 3  =>  split in the x-direction  (iuvw=1)
    c
    c     # If ixyz = 3,  data is in z-direction and then
    c     #       icoor = 2  =>  split in the x-direction  (iuvw=1)
    c     #       icoor = 3  =>  split in the y-direction  (iuvw=2)
    c
          dimension     ql(1-mbc:maxm+mbc, meqn)
          dimension     qr(1-mbc:maxm+mbc, meqn)
          dimension   asdq(1-mbc:maxm+mbc, meqn)
          dimension bmasdq(1-mbc:maxm+mbc, meqn)
          dimension bpasdq(1-mbc:maxm+mbc, meqn)
          dimension   aux1(1-mbc:maxm+mbc, maux, 3)
          dimension   aux2(1-mbc:maxm+mbc, maux, 3)
          dimension   aux3(1-mbc:maxm+mbc, maux, 3)
    c
    c
    c     # set iuvw = 1 for u, 2 for v, 3 for w component of velocity
    c     # depending on transverse direction:
          iuvw = ixyz + icoor - 1
          if (iuvw.gt.3) iuvw = iuvw-3
    c
          do 10 i=2-mbc,mx+mbc
             i1 = i-2+imp    !#  =  i-1 for amdq,  i for apdq
             bmasdq(i,1) = dmin1(aux2(i1,iuvw,2), 0.d0) * asdq(i,1)
             if (icoor.eq.2) then
                bpasdq(i,1) = dmax1(aux3(i1,iuvw,2), 0.d0) * asdq(i,1)
             else
                bpasdq(i,1) = dmax1(aux2(i1,iuvw,3), 0.d0) * asdq(i,1)
             endif
       10 continue
    c
          return
          end
    

<