vtf-logo

src/2d/integrator_extended/step2dsex.f

c
c
c     ==========================================================
      subroutine step2ds(maxm,maxmx,maxmy,mvar,meqn,maux,mwaves,mbc,
     &                   mx,my,qold,aux,dx,dy,dt,method,mthlim,cfl,
     &                   fm,fp,gm,gp,faddm,faddp,gaddm,gaddp,
     &                   q1d,dtdx1d,dtdy1d,aux1,aux2,aux3,
     &                   work,mwork,rpn2,rpt2,ids)
c     ==========================================================
c
c     # Update fluxes in normal direction for a single direction within
c     # a dimensional splitting method.
c    
c     # fadd is used to return flux increments in normal direction from flux2.
c     # See the flux2 documentation for more information.
c
      implicit double precision (a-h,o-z)
      include "call.i"
c
      dimension  qold(mvar, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension    fm(mvar, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension    fp(mvar, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension    gm(mvar, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension    gp(mvar, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension   q1d(1-mbc:maxm+mbc, meqn)
      dimension faddm(1-mbc:maxm+mbc, meqn)
      dimension faddp(1-mbc:maxm+mbc, meqn)
      dimension gaddm(1-mbc:maxm+mbc, meqn, 2)
      dimension gaddp(1-mbc:maxm+mbc, meqn, 2)
      dimension aux(maux, 1-mbc:maxmx+mbc, 1-mbc:maxmy+mbc)
      dimension aux1(1-mbc:maxm+mbc, maux)
      dimension aux2(1-mbc:maxm+mbc, maux)
      dimension aux3(1-mbc:maxm+mbc, maux)
      dimension dtdx1d(1-mbc:maxm+mbc)
      dimension dtdy1d(1-mbc:maxm+mbc)
      dimension method(7),mthlim(mwaves)
      dimension work(mwork)
      external rpn2,rpt2
c
c     # partition work array into pieces needed for local storage in
c     # flux2 routine.  Find starting index of each piece:
c
      i0wave = 1
      i0s = i0wave + (maxm+2*mbc)*meqn*mwaves
      i0amdq = i0s + (maxm+2*mbc)*mwaves
      i0apdq = i0amdq + (maxm+2*mbc)*meqn
      i0cqxx = i0apdq + (maxm+2*mbc)*meqn
      i0bmadq = i0cqxx + (maxm+2*mbc)*meqn
      i0bpadq = i0bmadq + (maxm+2*mbc)*meqn
      if (method(1).eq.1) then
         i0qls = i0bpadq + (maxm+2*mbc)*meqn
         i0qrs = i0qls + (maxmx+2*mbc)*(maxmy+2*mbc)*mvar
         i0qbs = i0qrs + (maxmx+2*mbc)*(maxmy+2*mbc)*mvar
         i0qts = i0qbs + (maxmx+2*mbc)*(maxmy+2*mbc)*mvar
         i0ql = i0qts + (maxmx+2*mbc)*(maxmy+2*mbc)*mvar
         i0qr = i0ql + (maxm+2*mbc)*meqn
         i0slope = i0ql
      else
         i0slope = i0bpadq + (maxm+2*mbc)*meqn
      endif
      iused = i0slope + (maxm+2*mbc)*meqn*4 - 1
      mslope = iused-i0slope+1
c
      if (iused.gt.mwork) then
         write(6,*) '*** not enough work space in step2dsex'
         write(6,*) '*** iused = ', iused, '   mwork =',mwork
         stop 
      endif
c
c
      mcapa = method(6)
c
      cfl = 0.d0
      dtdx = dt/dx
      dtdy = dt/dy
c
      if (mcapa.eq.0) then
c        # no capa array:
         do 5 i=1-mbc,maxm+mbc
            dtdx1d(i) = dtdx
            dtdy1d(i) = dtdy
    5    continue
      endif
c
      if( ids.eq.1 )then
c
c        # perform x-sweeps
c        ==================
c
c        # note that for dimensional splitting we sweep over the rows of
c        # ghosts cells as well as the interior.  This updates the ghost
c        # cell values to the intermediate state as needed in the following 
c        # sweep in the y-direction.
c
         do 50 j = 1-mbc,my+mbc
c
c           # copy data along a slice into 1d arrays:
            do 20 i = 1-mbc, mx+mbc
               do 20 m=1,meqn
                  q1d(i,m) = qold(m,i,j)
 20         continue
c
            if (mcapa.gt.0)  then
               do 22 i = 1-mbc, mx+mbc
                  dtdx1d(i) = dtdx / aux(mcapa,i,j)
   22          continue
            endif
c
            if (maux .gt. 0)  then
               do 23 ma=1,maux
                  do 23 i = 1-mbc, mx+mbc
                     aux2(i,ma) = aux(ma,i,j)
   23          continue
c
               if(j .ne. 1-mbc)then
                  do 24 ma=1,maux
                     do 24 i = 1-mbc, mx+mbc
                        aux1(i,ma) = aux(ma,i,j-1)
   24             continue
               endif
c
               if(j .ne. my+mbc)then
                  do 25 ma=1,maux
                     do 25 i = 1-mbc, mx+mbc
                        aux3(i,ma) = aux(ma,i,j+1)
   25             continue
               endif
c
            endif
c
c           # Store the value of j along this slice in the common block
c           # comxyt in case it is needed in the Riemann solver (for
c           # variable coefficient problems)
            jcom = j  
c           
c           # compute modifications fadd and gadd to fluxes along this slice:
            call flux2(1,maxm,meqn,maux,mwaves,mbc,mx,
     &                 q1d,dtdx1d,aux1,aux2,aux3,method,mthlim,
     &                 faddm,faddp,gaddm,gaddp,cfl1d,
     &                 work(i0wave),work(i0s),work(i0amdq),work(i0apdq),
     &                 work(i0cqxx),work(i0bmadq),work(i0bpadq),
     &                 work(i0slope),mslope,rpn2,rpt2)
            cfl = dmax1(cfl,cfl1d)
c
c           # update fluxes for use in AMR:
c
            do 26 i=1,mx+1
               do 26 m=1,meqn
                  fm(m,i,j) = fm(m,i,j) + faddm(i,m)
                  fp(m,i,j) = fp(m,i,j) + faddp(i,m)
 26         continue
c
            if (method(1).eq.1.and.method(2).ge.3) 
     &         call saverec2(1,maxm,maxmx,maxmy,mvar,meqn,mbc,mx,my,
     &                       qold,work(i0qls),work(i0qrs),work(i0qbs),
     &                       work(i0qts),work(i0ql),work(i0qr))

c
 50      continue
c
         if (method(1).eq.1) then
            if (method(2).le.2) then
               call fmod2(maxm,maxmx,maxmy,mvar,meqn,maux,mbc,mx,my,
     &                    qold,qold,qold,qold,qold,aux,dx,dy,dt,method,
     &                    cfl,fm,fp,gm,gp,q1d,aux2,faddm,faddp,1)
            else
               call fmod2(maxm,maxmx,maxmy,mvar,meqn,maux,mbc,mx,my,
     &                    qold,work(i0qls),work(i0qrs),work(i0qbs),
     &                    work(i0qts),aux,dx,dy,dt,method,cfl,
     &                    fm,fp,gm,gp,q1d,aux2,faddm,faddp,1)
            endif
         endif
c
      endif
c
      if( ids.eq.2 )then
c
c        # perform y sweeps
c        ==================
c
c
         do 100 i = 1-mbc, mx+mbc
c
c           # copy data along a slice into 1d arrays:
            do 70 j = 1-mbc, my+mbc
               do 70 m=1,meqn
                  q1d(j,m) = qold(m,i,j)
   70       continue
c
            if (mcapa.gt.0)  then
               do 72 j = 1-mbc, my+mbc
                  dtdy1d(j) = dtdy / aux(mcapa,i,j)
   72          continue
            endif
c
            if (maux .gt. 0)  then
c
               do 73 ma=1,maux
                  do 73 j = 1-mbc, my+mbc
                     aux2(j,ma) = aux(ma,i,j)
   73          continue
c
               if(i .ne. 1-mbc)then
                  do 74 ma=1,maux
                     do 74 j = 1-mbc, my+mbc
                        aux1(j,ma) = aux(ma,i-1,j)
   74             continue
               endif
c
               if(i .ne. mx+mbc)then
                  do 75 ma=1,maux
                     do 75 j = 1-mbc, my+mbc
                        aux3(j,ma) = aux(ma,i+1,j)
   75             continue
               endif
c
            endif            
c
c           # Store the value of i along this slice in the common block
c           # comxyt in case it is needed in the Riemann solver (for
c           # variable coefficient problems)
            icom = i  
c           
c           # compute modifications fadd and gadd to fluxes along this slice:
            call flux2(2,maxm,meqn,maux,mwaves,mbc,my,
     &                 q1d,dtdy1d,aux1,aux2,aux3,method,mthlim,
     &                 faddm,faddp,gaddm,gaddp,cfl1d,
     &                 work(i0wave),work(i0s),work(i0amdq),work(i0apdq),
     &                 work(i0cqxx),work(i0bmadq),work(i0bpadq),
     &                 work(i0slope),mslope,rpn2,rpt2)
            cfl = dmax1(cfl,cfl1d)
c
c           # update fluxes for use in AMR:
c
            do 76 j=1,my+1
               do 76 m=1,meqn
                  gm(m,i,j) = gm(m,i,j) + faddm(j,m)
                  gp(m,i,j) = gp(m,i,j) + faddp(j,m)
   76       continue
c     
            if (method(1).eq.1.and.method(2).ge.3) 
     &         call saverec2(2,maxm,maxmx,maxmy,mvar,meqn,mbc,mx,my,
     &                       qold,work(i0qls),work(i0qrs),work(i0qbs),
     &                       work(i0qts),work(i0ql),work(i0qr))

c
 100     continue
c     
         if (method(1).eq.1) then
            if (method(2).le.2) then
               call fmod2(maxm,maxmx,maxmy,mvar,meqn,maux,mbc,mx,my,
     &                    qold,qold,qold,qold,qold,aux,dx,dy,dt,method,
     &                    cfl,fm,fp,gm,gp,q1d,aux2,faddm,faddp,2)
            else
               call fmod2(maxm,maxmx,maxmy,mvar,meqn,maux,mbc,mx,my,
     &                    qold,work(i0qls),work(i0qrs),work(i0qbs),
     &                    work(i0qts),aux,dx,dy,dt,method,cfl,
     &                    fm,fp,gm,gp,q1d,aux2,faddm,faddp,2)
            endif
         endif
c
      endif
c
c
      return
      end

<