update.f.html | ![]() |
Source file: update.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/amrclaw/2d/lib | |
Converted: Tue Jul 26 2011 at 12:59:08 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c c ----------------------------------------------------------- c subroutine update (level, nvar) c implicit double precision (a-h,o-z) include "call.i" iadd(i,j,ivar) = loc + i - 1 + mitot*((ivar-1)*mjtot+j-1) iaddf(i,j,ivar) = locf + i - 1 + mi*((ivar-1)*mj +j-1) iaddfaux(i,j) = locfaux + i - 1 + mi*((mcapa-1)*mj + (j-1)) iaddcaux(i,j) = loccaux + i - 1 + mitot*((mcapa-1)*mjtot+(j-1)) c c :::::::::::::::::::::::::: UPDATE ::::::::::::::::::::::::::::::::: c update - update all grids at level 'level'. c this routine assumes cell centered variables. c the update is done from 1 level finer meshes under it. c input parameter: c level - ptr to the only level to be updated. levels coarser than c this will be at a diffeent time. c ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: c lget = level if (uprint) write(outunit,100) lget 100 format(19h updating level ,i5) c c grid loop for each level c dt = possk(lget) mptr = lstart(lget) 20 if (mptr .eq. 0) go to 85 loc = node(store1,mptr) loccaux = node(storeaux,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 ilo = node(ndilo,mptr) jlo = node(ndjlo,mptr) ihi = node(ndihi,mptr) jhi = node(ndjhi,mptr) c if (node(cfluxptr,mptr) .eq. 0) go to 25 locuse = igetsp(mitot*mjtot) call upbnd(alloc(node(cfluxptr,mptr)),alloc(loc),nvar, 1 mitot,mjtot,listsp(lget),alloc(locuse),mptr) call reclam(locuse,mitot*mjtot) c c loop through all intersecting fine grids as source updaters. c 25 mkid = lstart(lget+1) 30 if (mkid .eq. 0) go to 80 iclo = node(ndilo,mkid)/intratx(lget) jclo = node(ndjlo,mkid)/intraty(lget) ichi = node(ndihi,mkid)/intratx(lget) jchi = node(ndjhi,mkid)/intraty(lget) mi = node(ndihi,mkid)-node(ndilo,mkid) + 1 + 2*nghost mj = node(ndjhi,mkid)-node(ndjlo,mkid) + 1 + 2*nghost locf = node(store1,mkid) locfaux = node(storeaux,mkid) c c calculate starting and ending indices for coarse grid update, if overlap c iplo = max(ilo,iclo) jplo = max(jlo,jclo) iphi = min(ihi,ichi) jphi = min(jhi,jchi) if (iplo .gt. iphi .or. jplo .gt. jphi) go to 75 c c calculate starting index for fine grid source pts. c iff = iplo*intratx(lget) - node(ndilo,mkid) + nghost + 1 jff = jplo*intraty(lget) - node(ndjlo,mkid) + nghost + 1 totrat = intratx(lget) * intraty(lget) do 71 i = iplo-ilo+nghost+1, iphi-ilo+nghost+1 do 70 j = jplo-jlo+nghost+1, jphi-jlo+nghost+1 if (uprint) then write(outunit,101) i,j,mptr,iff,jff,mkid 101 format(' updating pt. ',2i4,' of grid ',i3,' using ',2i4, 1 ' of grid ',i4) write(outunit,102)(alloc(iadd(i,j,ivar)),ivar=1,nvar) 102 format(' old vals: ',4e12.4) endif c c c update using intrat fine points in each direction c do 35 ivar = 1, nvar 35 alloc(iadd(i,j,ivar)) = 0.d0 c if (mcapa .eq. 0) then do 50 jco = 1, intraty(lget) do 50 ico = 1, intratx(lget) do 40 ivar = 1, nvar alloc(iadd(i,j,ivar))= alloc(iadd(i,j,ivar)) + 1 alloc(iaddf(iff+ico-1,jff+jco-1,ivar)) 40 continue 50 continue do 60 ivar = 1, nvar 60 alloc(iadd(i,j,ivar)) = alloc(iadd(i,j,ivar))/totrat else do 51 jco = 1, intraty(lget) do 51 ico = 1, intratx(lget) capa = alloc(iaddfaux(iff+ico-1,jff+jco-1)) do 41 ivar = 1, nvar alloc(iadd(i,j,ivar))= alloc(iadd(i,j,ivar)) + 1 alloc(iaddf(iff+ico-1,jff+jco-1,ivar))*capa 41 continue 51 continue do 61 ivar = 1, nvar 61 alloc(iadd(i,j,ivar)) = alloc(iadd(i,j,ivar))/ 1 (totrat*alloc(iaddcaux(i,j))) endif c if (uprint) write(outunit,103)(alloc(iadd(i,j,ivar)), . ivar=1,nvar) 103 format(' new vals: ',4e12.4) c jff = jff + intraty(lget) 70 continue iff = iff + intratx(lget) jff = jplo*intraty(lget) - node(ndjlo,mkid) + nghost + 1 71 continue c 75 mkid = node(levelptr,mkid) go to 30 c 80 mptr = node(levelptr, mptr) go to 20 c 85 continue c 99 return end