Blockstructured Adaptive Mesh Refinement in object-oriented C++
!-----------------------------------------------------------------------
! Physical boundary conditions
! 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
!-----------------------------------------------------------------------
subroutine physbd(u,mx,my,lb,ub,lbbnd,ubbnd,shapebnd,
& xc,dx,dir,bnd,mb,time,args,argc)
implicit double precision (a-h,o-z)
include "cuser.i"
integer argc, args, mx, my, mb, dir
integer lb(2), ub(2), lbbnd(2), ubbnd(2), shapebnd(2)
real*8 u(args, mx, my), xc(2), dx(2), bnd(mb,2,2), time
! Local variables
integer i, j, imin, imax, jmin, jmax, jsym
integer stride, stridebnd, meqn, getindx
integer isx(4), isy(4)
c
data isx /1,-1,1,1/
data isy /1,1,-1,1/
meqn = args
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
! See definition of member-function extents() in BBox.h
! for calculation of stride
stride = (ub(1) - lb(1))/(mx-1)
if (meqn .ne. 4) then
write(0,*)'ERROR in physbd: '
else
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
! 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)
if(imax .gt. mx .or. jmax .gt. my .or.
& imin .lt. 1 .or. jmin .lt. 1) then
write(0,*)'INDEX ERROR in physbd'
end if
! Left Side --- Inflow
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (dir.eq.0) then
do 200 i = imax, imin, -1
do 200 j = jmin, jmax
u(1,i,j) = rhoshk
u(2,i,j) = rhoshk * ushk
u(3,i,j) = rhoshk * vshk
u(4,i,j) = rhoshk *(eshk +.5d0*(ushk*ushk+vshk*vshk))
200 continue
return
end if
! Right Side --- Outflow
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (dir.eq.1) then
do 210 i = imin, imax
do 210 j = jmin, jmax
do 210 m = 1, meqn
u(m,i,j) = u(m,i-1,j)
210 continue
return
end if
! Bottom Side --- reflecting (for ramp part else inflow)
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (dir.eq.2) then
do 220 j = jmax, jmin, -1
jsym = 2*jmax+1-j
do 220 i = imin, imax
xcen = xc(1) + (i-.5d0)*dx(1)
if (xcen .le. disp) then
u(1,i,j) = rhoshk
u(2,i,j) = rhoshk*ushk
u(3,i,j) = rhoshk*vshk
u(4,i,j) = rhoshk*(eshk+.5d0*(ushk*ushk+vshk*vshk))
else
do 221 m=1,meqn
u(m,i,j)=u(m,i,jsym)*isy(m)
221 continue
end if
220 continue
return
end if
! Top Side --- inflow (left of actual shock position)
! outflow (right of actual shock position)
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if (dir.eq.3) then
x0 = disp + 10.d0*time/cos(pi/6.d0)
y0 = bnd(1,1,2)
do 230 j = jmin, jmax
do 230 i = imin, imax
xcen = xc(1) + (i-.5d0)*dx(1)
ycen = xc(2) + (j-.5d0)*dx(2)
call cellave(xcen-dx(1)/2.d0,ycen-dx(2)/2.d0,
$ dx(1),dx(2),wl)
rho = (1.d0-wl)*rhoamb + wl*rhoshk
uu = (1.d0-wl)*uamb + wl*ushk
v = (1.d0-wl)*vamb + wl*vshk
p = (1.d0-wl)*pamb + wl*pshk
u(1,i,j) = rho
u(2,i,j) = rho*uu
u(3,i,j) = rho*v
u(4,i,j) = p/gamma1 + .5d0*rho*(uu*uu+v*v)
230 continue
return
end if
end if
return
end
Quickstart Users Guide Programmers Reference Installation Examples Download
AMROC Main Home Contactlast update: 06/01/04