• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • src/2d/bc/bcout2.f

    !-----------------------------------------------------------------------
    ! Physical boundary conditions for 2d equations.
    ! Zero order outflow at all sides.
    ! Interface:
    !   mx,my    := shape of grid function
    !
    !   u(,) := grid function
    !
    !   lb(2) := lower bound for grid
    !   ub(2) := upper bound for grid
    !   lbbnd(2) := lower bound for boundary region
    !   ubnd(2) := upper bound for boundary region
    !   shapebnd(2) := shape of boundary region 
    !   xc(2) := lower left corner of grid
    !   dx(2) := grid spacing
    !   dir := at which side of the grid is the boundary?
    !   bnd(,2,2) := lower left and upper right corner of global grid and 
    !      of mb-1 internal boundary regions
    ! 
    ! The implementation is quite general, because
    ! - a boundary region can have a width of 1 or 2 ghost cells. 
    ! - corners of a grid might be part of two boundaries and it is NOT 
    !   guaranteed that ALL cells of a particular corner region are
    !   contained in both boundaries. 
    !
    ! Copyright (C) 2002 Ralf Deiterding
    ! Brandenburgische Universitaet Cottbus
    !
    ! Copyright (C) 2003-2007 California Institute of Technology
    ! Ralf Deiterding, ralf@cacr.caltech.edu
    !
    !-----------------------------------------------------------------------
    
          subroutine physbd(u,mx,my,lb,ub,lbbnd,ubbnd,shapebnd,
         &     xc,dx,dir,bnd,mb,time,meqn)
    
          implicit none
    
          integer   mx, my, meqn, mb, dir
          integer   lb(2), ub(2), lbbnd(2), ubbnd(2), shapebnd(2)
          double precision u(meqn, mx, my), xc(2), dx(2), bnd(mb,2,2), time
    
    !      Local variables
          integer   i, j, imin, imax, jmin, jmax, m
          integer   stride, getindx
    
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !      See definition of member-function extents() in BBox.h 
    !      for calculation of stride
             
          stride = (ub(1) - lb(1))/(mx-1)
                   
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !     Find working domain
             
          imin = getindx(max(lbbnd(1), lb(1)), lb(1), stride)
          imax = getindx(min(ubbnd(1), ub(1)), lb(1), stride)
          
          jmin = getindx(max(lbbnd(2), lb(2)), lb(2), stride)
          jmax = getindx(min(ubbnd(2), ub(2)), lb(2), stride)
             
          go to (100,200,300,400) dir+1
    
    !        Left Side --- Outflow
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     100  continue
          do 110 i = imax, imin, -1
             if (xc(1)+(i-0.5d0)*dx(1).lt.bnd(1,1,1)) then
                do 120 j = jmin, jmax
                   do 120 m = 1, meqn
                      u(m,i,j) = u(m,i+1,j)
     120        continue
             endif
     110  continue
          return
    
    !        Right Side --- Outflow
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     200  continue
          do 210 i = imin, imax
             if (xc(1)+(i-0.5d0)*dx(1).gt.bnd(1,2,1)) then
                do 220 j = jmin, jmax
                   do 220 m = 1, meqn
                      u(m,i,j) = u(m,i-1,j)
     220        continue
             endif
     210  continue
          return
             
    !        Bottom Side --- Outflow
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     300  continue
          do 310 j = jmax, jmin, -1
             if (xc(2)+(j-0.5d0)*dx(2).lt.bnd(1,1,2)) then
                do 320 i = imin, imax
                   do 320 m = 1, meqn
                      u(m,i,j) = u(m,i,j+1)
     320        continue
             endif
     310  continue
          return
    
    !        Top Side --- Outflow
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     400  continue
          do 410 j = jmin, jmax
             if (xc(2)+(j-0.5d0)*dx(2).gt.bnd(1,2,2)) then
                do 420 i = imin, imax
                   do 420 m = 1, meqn
                      u(m,i,j) = u(m,i,j-1)
     420        continue
             endif
     410  continue
          return
    
          end
    

<