vtf-logo

src/1d/operators/restrict1.f

c-----------------------------------------------------------------------
c     One-dimensional restriction operator for AMROC.
c     A coarse cell value is overwritten by the mean value 
c     of all refined cells within this particular coarse cell.
c
c     Interface:
c        mfx := shape of fine grid
c        mcx := shape of coarse grid
c
c        uf() := fine grid
c        uc() := coarse grid
c
c        lbc(1) := lower bound for coarse grid
c        ubc(1) := upper bound for coarse grid
c        lbf(1) := lower bound for fine grid
c        ubf(1) := upper bound for fine grid
c        lbr(1) := lower bound for region restriction desired
c        ufr(1) := upper bound for region restriction desired
c        shaper(1) := shape of region restriction desired
c
c     Copyright (C) 2002 Ralf Deiterding
c     Brandenburgische Universitaet Cottbus
c
c     Copyright (C) 2003-2007 California Institute of Technology
c     Ralf Deiterding, ralf@amroc.net
c-----------------------------------------------------------------------

      subroutine restrict1(uf,mfx,lbf,ubf,
     &     uc,mcx,lbc,ubc,
     &     lbr,ubr,shaper,meqn,mbc)

      implicit none
      integer meqn, mbc, mcx, mfx
      integer shaper(1)      
      double precision uf(meqn,mfx), uc(meqn,mcx)
      
      integer  lbf(1), ubf(1),
     &     lbc(1), ubc(1),
     &     lbr(1), ubr(1)
               
c      Local variables

      integer   i, ii, imin, imax, m, ifine, icoarse, refine, 
     &     stridec, stridef, getindx, mbcf

c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c      See definition of member-function extents() in BBox.h 
c      for calculation of stride
c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         
      stridec = (ubc(1) - lbc(1))/(mcx-1)
      stridef = (ubf(1) - lbf(1))/(mfx-1)
      refine = stridec/stridef
      mbcf = mbc * stridef

c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c     Find coarse domain over which to refine
c     Take three regions and select out intersection
c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      imin = max(lbf(1)+mbcf, lbc(1), lbr(1))
      imax = min(ubf(1)-mbcf, ubc(1), ubr(1))
      
      if (mod(imin-lbc(1),stridec) .ne. 0) then
         imin = imin + stridec - mod(imin-lbc(1),stridec) 
      endif

c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c     Inject points to coarse grid from fine grid
c     Loop from lower bound to upper bound with stride of refine.
c     Convert the integer coordinates to fine and coarse grid absolute
c     coordinates...
c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      do 10 i = imin, imax, stridec
         ifine = getindx(i, lbf(1), stridef)
         icoarse = getindx(i, lbc(1), stridec)
         
!         if (icoarse .gt. mcx ) then
!            write(0,*)'ERROR in restriction: ',icoarse
!         end if

         do 10 m=1, meqn
            uc(m,icoarse) = 0
            do 20 ii = 0, refine-1
               uc(m,icoarse) = uc(m,icoarse) + uf(m,ifine+ii)
 20         continue
            uc(m,icoarse) = uc(m,icoarse) / refine

 10   continue

      return
      end

<