intfil.f.html | ![]() |
Source file: intfil.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib | |
Converted: Sun May 15 2011 at 19:16:14 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c ------------------------------------------------------ c subroutine intfil(val,mi,mj,time,flaguse,nrowst,ncolst, 2 ilo,ihi,jlo,jhi,level,nvar,naux) c c ::::::::::::::::::::::: INTFIL ::::::::::::::::::::::::::::::::; c INTFIL: interpolates values for a patch at the specified level and c location, using values from grids at LEVEL and coarser, if nec. c c take the intersection of a grid patch with corners at ilo,ihi,jlo,jhi c and all grids mptr at LEVEL. If there is a non-null intersection c copy the solution vaues from mptr (at TIME) into VAL array. c assumes patch at same level so do straight copy, not skipping c every intrat or doing any interpolation here, c assume called in correct order of levels, so that when copying c is ok to overwrite. c c N.B.: there are no dummy points around patch, since c this is not an official "grid" but a "patch". c c used array marks when point filled. filpatch checks if points left over c after intersections at specified level. c :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::; c implicit double precision (a-h,o-z) include "call.i" c dimension val(mi,mj,nvar) logical tinterp c iadd(i,j,ivar) = loc + i - 1 + mitot*((ivar-1)*mjtot+j-1) iadnew(i,j,ivar) = locnew + i - 1 + mitot*((ivar-1)*mjtot+j-1) iadold(i,j,ivar) = locold + i - 1 + mitot*((ivar-1)*mjtot+j-1) dimension flaguse(ilo:ihi, jlo:jhi) c dt = possk(level) c teps = dt / 10.d0 c need non-dimensional epsilon for time. was a problem c in large scaled tsunami tests teps = 1.d-4 do i = ilo, ihi do j = jlo, jhi flaguse(i,j) = 0.0 end do end do mptr = lstart(level) 10 if (mptr .eq. 0) go to 105 c c ::: check if grid mptr and patch intersect c imlo = node(ndilo, mptr) jmlo = node(ndjlo, mptr) imhi = node(ndihi, mptr) jmhi = node(ndjhi, mptr) nx = node(ndihi,mptr) - node(ndilo,mptr) + 1 ny = node(ndjhi,mptr) - node(ndjlo,mptr) + 1 mitot = nx + 2*nghost mjtot = ny + 2*nghost ixlo = max(imlo,ilo) ixhi = min(imhi,ihi) jxlo = max(jmlo,jlo) jxhi = min(jmhi,jhi) c if (.not.(ixlo .le. ixhi .and. jxlo .le. jxhi)) go to 90 c c ::: grids intersect. figure out what time to use. c ::: alphai = 1 for new time; 0 for old time c alphac = (rnode(timemult,mptr) - time)/dt alphai = 1.d0-alphac if ((alphai .lt. -teps) .or. (alphai .gt. 1.d0+teps)) then write(outunit,900) time, mptr, level write(*,900) time, mptr, level 900 format(' time wanted ',e15.7,' not available from grid ',i4, 1 'level',i4) write(outunit,'(A,E24.16)') 'Line 80', dt write(outunit,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps write(*,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps call outtre(mstart,.false.,nvar,naux) stop endif c tinterp = .false. if (dabs(alphai - 1.d0) .lt. teps) then loc = node(store1,mptr) else if (dabs(alphai) .lt. teps) then loc = node(store2,mptr) if (level .eq. mxnest) then write(outunit,'(A,E24.16)') 'Line 95', dt write(outunit,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps write(*,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps stop endif else locold = node(store2,mptr) locnew = node(store1,mptr) tinterp = .true. if (level .eq. mxnest) then write(outunit,'(A,E24.16)') 'Line 107',dt write(outunit,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps write(*,901) ilo,ihi,jlo,jhi,mptr,level,time, . rnode(timemult,mptr),alphai,teps stop endif endif 901 format(' trying to interpolate from previous time values ',/, . ' for a patch with corners ilo,ihi,jlo,jhi:' . ,/,2x,4i10,/, . ' from source grid ',i4,' at level ',i4,/, . ' time wanted ',e24.16,' source time is ',e24.16,/, . ' alphai, teps ',2e24.16) c if (.not. tinterp) then c ::: no time interp. copy the solution values do 45 ivar = 1, nvar do 35 j = jxlo, jxhi do 20 i = ixlo, ixhi val(i-ilo+nrowst,j-jlo+ncolst,ivar) = 1 alloc(iadd(i-imlo+nghost+1,j-jmlo+nghost+1, ivar)) flaguse(i,j) = 1.d0 20 continue 35 continue 45 continue else c ::: linear interpolation in time do 85 ivar = 1, nvar do 75 j = jxlo, jxhi do 65 i = ixlo, ixhi val(i-ilo+nrowst,j-jlo+ncolst,ivar) = 1 alloc(iadnew(i-imlo+nghost+1,j-jmlo+nghost+1,ivar))*alphai + 2 alloc(iadold(i-imlo+nghost+1,j-jmlo+nghost+1,ivar))*alphac flaguse(i,j) = 1.d0 65 continue 75 continue 85 continue endif c 90 mptr = node(levelptr, mptr) go to 10 c 105 continue c set used array points which intersect boundary to be equal to 1; c they will be set elsewhere if (jhi .ge. jregsz(level)) then do 1000 j = max(jregsz(level),jlo), jhi do 1000 i = ilo, ihi flaguse(i,j) = 1.d0 1000 continue endif if (jlo .lt. 0) then ncolend = ncolst + jhi - jlo do 1200 j = jlo, min(-1,ncolend) do 1200 i = ilo, ihi flaguse(i,j) = 1.d0 1200 continue endif if (ilo .lt. 0) then nrowend = nrowst + ihi - ilo do 1400 i = ilo, min(-1,nrowend) do 1400 j = jlo, jhi flaguse(i,j) = 1.d0 1400 continue endif if (ihi .ge. iregsz(level)) then do 1600 i = max(iregsz(level),ilo), ihi do 1600 j = jlo, jhi flaguse(i,j) = 1.d0 1600 continue endif c return end