• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • 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@cacr.caltech.edu
    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
    

<