Blockstructured Adaptive Mesh Refinement in object-oriented C++
c-----------------------------------------------------------------------
c Two-dimensional prolongation operator for AMROC.
c A fine grid value is replaced by the value of a bilinear function
c through the neighbouring coarse grid values at the center
c of the particular fine grid cell.
c
c Interface:
c mfx,mfy := shape of fine grid
c mcx,mcy := shape of coarse grid
c
c uf(,) := fine grid
c uc(,) := coarse grid
c
c lbc(2) := lower bound for coarse grid
c ubc(2) := upper bound for coarse grid
c lbf(2) := lower bound for fine grid
c ubf(2) := upper bound for fine grid
c lbr(2) := lower bound for region prolongation desired
c ufr(2) := upper bound for region prolongation desired
c shaper(2) := shape of region prolongation desired
c
c Author: Ralf Deiterding
c-----------------------------------------------------------------------
subroutine prolong2(uc,mcx,mcy,lbc,ubc,
& uf,mfx,mfy,lbf,ubf,
& lbr,ubr,shaper,args,argc)
implicit none
common /ghosts/ mbc
integer mbc, mcx, mcy, mfx, mfy
integer shaper(2)
integer args, argc
real*8 uf(args,mfx,mfy), uc(args,mcx,mcy)
integer lbf(2), ubf(2),
& lbc(2), ubc(2),
& lbr(2), ubr(2),
& getindx
c Local variables
integer i, j, m, ic, jc, mic, mjc,
& refine, stridec, stridef,
& ifine, ics, jfine, jcs, meqn
double precision eta1, eta2
meqn = args
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
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c Prolongation region is defined on the domain of the fine grid.
c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
do 10 j=lbr(2), ubr(2), stridef
jfine = getindx(j, lbf(2), stridef)
jcs = getindx(j, lbc(2), stridec)
jc = j - lbc(2)
mjc = jc - (jc/stridec)*stridec
if(mjc .lt. stridec*0.5) then
jcs = jcs - 1
end if
jc = jc + stridec*0.5
mjc = jc - (jc/stridec)*stridec
eta2 = (mjc+0.5d0*stridef) / stridec
do 10 i=lbr(1), ubr(1), stridef
ifine = getindx(i, lbf(1), stridef)
ics = getindx(i, lbc(1), stridec)
ic = i - lbc(1)
mic = ic - (ic/stridec)*stridec
if(mic .lt. stridec*0.5) then
ics = ics - 1
end if
ic = ic + stridec*0.5
mic = ic - (ic/stridec)*stridec
eta1 = (mic+0.5d0*stridef) / stridec
! if(ics+1 .gt. mcx .or.
! & jcs+1 .gt. mcy .or.
! & ics .lt. 1 .or. jcs .lt. 1) then
! uf(1,ifine,jfine) = -100000.0
! write(0,*)'ERROR in prolongation: ',ics,jcs
! endif
do 10 m=1, meqn
uf(m,ifine,jfine) = (1.d0-eta2)*
& ((1.d0-eta1)*uc(m,ics, jcs ) +
& eta1 *uc(m,ics+1,jcs ))+ eta2*
& ((1.d0-eta1)*uc(m,ics, jcs+1) +
& eta1 *uc(m,ics+1,jcs+1))
10 continue
return
end
Quickstart Users Guide Programmers Reference Installation Examples Download
AMROC Main Home Contactlast update: 06/01/04