• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • Related Pages
    • combl.f
    • cuser.i
    • init3.f
    • lset3.f
    • Makefile.am
    • physbd3.f
    • saux3.f
    • src3cjburn.f
    • Problem.h
    • ip3euzndrfl.f
    • chk3euznd.f
    • rpn3euzndvlg.f
    • rpt3euznd.f
    • flgout3euznd.f
    • rec3euznd.f
    • flx3euznd.f
    • amr_main.C

    fsi/sfc-amroc/TubeCJBurnSlot/src/physbd3.f

    !-----------------------------------------------------------------------
    ! Physical boundary conditions for 3d Euler equations.
    ! Outflow at all sides.
    ! Physical boundary conditions
    ! Interface:
    !   mx,my,mz  := shape of grid 
    !
    !   u(,) := grid function
    !
    !   lb(3) := lower bound for grid
    !   ub(3) := upper bound for grid
    !   lbbnd(3) := lower bound for boundary region
    !   ubnd(3) := upper bound for boundary region
    !   shapebnd(3) := shape of boundary region 
    !   xc(3) := lower left corner of grid
    !   dx(3) := grid spacing
    !   dir := at which side of the grid is the boundary?
    !   bnd(,2,3) := lower left and upper right corner of global grid and 
    !      of mb-1 internal boundary regions 
    !
    ! 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,mz,lb,ub,lbbnd,ubbnd,shapebnd,
         &                  xc,dx,dir,bnd,mb,time,meqn)
    
          implicit double precision (a-h,o-z)
          include  "cuser.i"
    
          integer   meqn, mx, my, mz, mb, dir
          integer   lb(3), ub(3), lbbnd(3), ubbnd(3), shapebnd(3)
          double precision u(meqn,mx,my,mz), xc(3), dx(3), bnd(mb,2,3), time
    
    !     Local variables
          integer   i, j, k, imin, imax, jmin, jmax, kmin, kmax, m 
          integer   stride, getindx, isym, jsym, ksym
          integer   isx(6), isz(6)
    
          data isx /1,1,-1,1,1,1/
          data isz /1,1,1,1,-1,1/
          
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    !     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)
          
          kmin = getindx(max(lbbnd(3), lb(3)), lb(3), stride)
          kmax = getindx(min(ubbnd(3), ub(3)), lb(3), stride)
          
          if (imax .gt. mx .or. jmax .gt. my .or. kmax .gt. mz .or. 
         &    imin .lt. 1 .or. jmin .lt. 1 .or. kmin .lt. 1) then
             write(0,*)'INDEX ERROR in physbd'
          end if
    
          go to (100,200,300,400,500,600) dir+1
     
    !        Left Side --- Reflection
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     100  continue
          do 110 i = imax, imin, -1
             if (xc(1)+(i-0.5d0)*dx(1).lt.bnd(1,1,1)) then
                isym = 2*imax+1-i
                do 120 k = kmin, kmax
                   do 120 j = jmin, jmax
                      do 120 m = 1, meqn
                         u(m,i,j,k) = u(m,isym,j,k)*isx(m)
     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 k = kmin, kmax
                   do 220 j = jmin, jmax
                      do 220 m = 1, meqn
                         u(m,i,j,k) = u(m,i-1,j,k)
     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 k = kmin, kmax
                   do 320 i = imin, imax
                      do 320 m = 1, meqn
                         u(m,i,j,k) = u(m,i,j+1,k)
     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 k = kmin, kmax
                   do 420 i = imin, imax
                      do 420 m = 1, meqn
                         u(m,i,j,k) = u(m,i,j-1,k)
     420        continue
             endif
     410  continue
          return
    
    !        Front Side --- Outflow
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     500  continue
          do 510 k = kmax, kmin, -1
             if (xc(3)+(k-0.5d0)*dx(3).lt.bnd(1,1,3)) then
                do 520 j = jmin, jmax
                   do 520 i = imin, imax
                      do 520 m = 1, meqn
                         u(m,i,j,k) = u(m,i,j,k+1)
     520        continue
             endif
     510  continue
          return
    
    !        Back Side --- Reflection
    !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     600  continue
          if (Nback.eq.1) then
             do 610 k = kmin, kmax
                if (xc(3)+(k-0.5d0)*dx(3).gt.bnd(1,2,3)) then
                   ksym = 2*kmin-1-k
                   do 620 j = jmin, jmax
                      do 620 i = imin, imax
                         xcen = xc(1) + (i-.5d0)*dx(1)
                         ycen = xc(2) + (j-.5d0)*dx(2)
                         r = dsqrt(xcen*xcen+ycen*ycen)
                         if (r.lt.rfback) then
                            do m = 1, meqn
                               u(m,i,j,k) = u(m,i,j,ksym)*isz(m)
                            enddo
                         else 
                            do m = 1, meqn
                               u(m,i,j,k) = u(m,i,j,k-1)
                            enddo
                         endif
     620           continue
                endif
     610     continue
          else
             do 630 k = kmin, kmax
                if (xc(3)+(k-0.5d0)*dx(3).gt.bnd(1,2,3)) then
                   do 640 j = jmin, jmax
                      do 640 i = imin, imax
                         do 640 m = 1, meqn
                            u(m,i,j,k) = u(m,i,j,k-1)
     640           continue
                endif
     630     continue
          endif
          return
    
          end