AMROC Main     Blockstructured Adaptive Mesh Refinement in object-oriented C++


Main Page   Class Hierarchy   Compound List   File List  

2d/integrator_ex/unsp2ex.f

c
c
c     ==========================================================
      subroutine unsp2(maxm,maxmx,maxmy,mvar,meqn,maux,mwaves,mbc,
     &		       mx,my,qold,aux,dx,dy,dt,method,mthlim,cflgrid,
     &		       fm,fp,gm,gp,faddm,faddp,gaddm,gaddp,
     &                 q1d,dtdx1d,dtdy1d,aux1,aux2,aux3,
     &                 work,mwork,rpn2,rpt2)
c     ==========================================================
c
c     # Take one time step, updating q with the wave propagation method
c     # of Randall J. LeVeque.
c    
c     # fm, fp are fluxes to left and right of single cell edge,
c     # gm, gp are fluxes at bottom and top.
c     # fadd and gadd are used to return flux increments 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
      i0slope = i0bpadq + (maxm+2*mbc)*meqn
      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 unsp2'
         write(6,*) '*** iused = ', iused, '   mwork =',mwork
	 stop 
      endif
c
      mcapa = method(6)
c
      cflgrid = 0.d0
      dtdx = dt/dx
      dtdy = dt/dy
c
      do 10 j=1-mbc,my+mbc
	 do 10 i=1-mbc,mx+mbc
            do 10 m=1,mvar
	       fm(m,i,j) = 0.d0
	       fp(m,i,j) = 0.d0
	       gm(m,i,j) = 0.d0
	       gp(m,i,j) = 0.d0
 10   continue
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
c
c     # perform x-sweeps
c     ==================
c
      do 50 j = 0,my+1
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 21 i = 1-mbc, mx+mbc
	       dtdx1d(i) = dtdx / aux(mcapa,i,j)
 21         continue
         endif
c
	 if (maux .gt. 0)  then
            do 22 i = 1-mbc, mx+mbc
               do 22 ma=1,maux
 	         aux1(i,ma) = aux(ma,i,j-1)
 	         aux2(i,ma) = aux(ma,i,j)
 	         aux3(i,ma) = aux(ma,i,j+1)
   22            continue
           endif
c
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)
c
	 cflgrid = dmax1(cflgrid,cfl1d)
c

c        # update fluxes for use in AMR:
c
         do 25 i=1,mx+1
            do 25 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)
	       gm(m,i,j) = gm(m,i,j) + gaddm(i,m,1)
	       gp(m,i,j) = gp(m,i,j) + gaddp(i,m,1)
	       gm(m,i,j+1) = gm(m,i,j+1) + gaddm(i,m,2)
	       gp(m,i,j+1) = gp(m,i,j+1) + gaddp(i,m,2)
   25         continue
   50    continue
c
c
c 
c     # perform y sweeps
c     ==================
c
c
      do 100 i = 0, mx+1
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 71 j = 1-mbc, my+mbc
	       dtdy1d(j) = dtdy / aux(mcapa,i,j)
   71          continue
           endif
c
	 if (maux .gt. 0)  then
            do 72 j = 1-mbc, my+mbc
               do 72 ma=1,maux
 	         aux1(j,ma) = aux(ma,i-1,j)
 	         aux2(j,ma) = aux(ma,i,  j)
 	         aux3(j,ma) = aux(ma,i+1,j)
   72            continue
           endif
c
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)
c
	 cflgrid = dmax1(cflgrid,cfl1d)
c
c        # 
c        # update fluxes for use in AMR:
c
         do 75 j=1,my+1
            do 75 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)
	       fm(m,i,j) = fm(m,i,j) + gaddm(j,m,1)
	       fp(m,i,j) = fp(m,i,j) + gaddp(j,m,1)
	       fm(m,i+1,j) = fm(m,i+1,j) + gaddm(j,m,2)
	       fp(m,i+1,j) = fp(m,i+1,j) + gaddp(j,m,2)
   75       continue
 100  continue
c
      do 110 j=1,my               
         do 110 i=1,mx
            do 110 m=1,meqn
               if (mcapa.gt.0) then
c     #              with capa array.
                  qold(m,i,j) = qold(m,i,j) 
     &                 - (dtdx * (fm(m,i+1,j) - fp(m,i,j))
     &                  + dtdy * (gm(m,i,j+1) - gp(m,i,j))) / 
     &                 aux(mcapa,i,j)

c     # no capa array.  Standard flux differencing:
               else
                  qold(m,i,j) = qold(m,i,j) 
     &                 - dtdx * (fm(m,i+1,j) - fp(m,i,j)) 
     &                 - dtdy * (gm(m,i,j+1) - gp(m,i,j)) 
               endif

 110  continue

      return
      end


Quickstart     Users Guide     Programmers Reference     Installation      Examples     Download



AMROC Main      Home      Contact
last update: 06/01/04