fgridinterp_geo.f.html | ![]() |
Source file: fgridinterp_geo.f | |
Directory: /home/rjl/git/rjleveque/clawpack-4.x/geoclaw/2d/lib | |
Converted: Sun May 15 2011 at 19:15:40 using clawcode2html | |
This documentation file will not reflect any later changes in the source file. |
c====================================================================== subroutine fgridinterp(fgrid,xlowfg,ylowfg, & xhifg,yhifg,dxfg,dyfg,mxfg,myfg,t,mvarsfg,q,meqn, & mxc,myc,mbc,dxc,dyc,nvar,xlowc,ylowc,maux,aux, & ioutarrivaltimes,ioutsurfacemax,maxcheck) c====================================================================== use geoclaw_module implicit double precision (a-h,o-z) dimension q(1-mbc:mxc+mbc,1-mbc:myc+mbc, meqn) dimension aux(1-mbc:mxc+mbc,1-mbc:myc+mbc, maux) dimension fgrid(1:mxfg,1:myfg,mvarsfg) c=====================FGRIDINTERP======================================= c # This routine interpolates q and aux on a computational grid c # to a fgrid not necessarily aligned with the computational grid c # using bilinear interpolation defined on computation grid c======================================================================= xhic=xlowc + dxc*mxc yhic=ylowc + dyc*myc tol=drytolerance arrivaltol=1.d-2 indb=meqn+1 indeta=meqn+2 if (maxcheck.gt.0) then indarrive=0 indetamin=0 indetamax=0 indetanow=0 if (ioutarrivaltimes.gt.0) then indarrive = 1 endif if (ioutsurfacemax.gt.0) then indetanow = indarrive+1 indetamin = indarrive+2 indetamax = indarrive+3 endif endif do ifg=1,mxfg xfg=xlowfg + (ifg-1)*dxfg do jfg=1,myfg yfg=ylowfg + (jfg-1)*dyfg if (.not.((xfg.lt.xlowc.or.xfg.gt.xhic).or. & (yfg.lt.ylowc.or.yfg.gt.yhic))) then c # find where xfg,yfg is in the computational grid ic1 = int((xfg-(xlowc+0.5d0*dxc))/(dxc))+1 jc1 = int((yfg-(ylowc+0.5d0*dyc))/(dyc))+1 if (ic1.eq.mxc) ic1=mxc-1 if (jc1.eq.myc) jc1=myc-1 ic2= ic1+1 jc2= jc1+1 xc1= xlowc + dxc*(ic1-0.5d0) yc1= ylowc + dyc*(jc1-0.5d0) xc2= xlowc + dxc*(ic2-0.5d0) yc2= ylowc + dyc*(jc2-0.5d0) c # interpolate bilinear used to interpolate to xfg,yfg c # define constant parts of bilinear xterm=(xfg-xc1)/dxc yterm=(yfg-yc1)/dyc xyterm= xterm*yterm if (maxcheck.eq.0) then do m=1,meqn z11=q(ic1,jc1,m) z21=q(ic2,jc1,m) z12=q(ic1,jc2,m) z22=q(ic2,jc2,m) a=z21-z11 b=z12-z11 d=z11 c=z22-(a+b+d) fgrid(ifg,jfg,m) = a*xterm + b*yterm + c*xyterm + d enddo z11=aux(ic1,jc1,1) z21=aux(ic2,jc1,1) z12=aux(ic1,jc2,1) z22=aux(ic2,jc2,1) a=z21-z11 b=z12-z11 d=z11 c=z22-(a+b+d) fgrid(ifg,jfg,indb) = a*xterm + b*yterm + c*xyterm + d endif c # This next output variable is the surface using bilinear interpolation, c # using a surface that only uses the wet eta points near the shoreline z11=aux(ic1,jc1,1)+q(ic1,jc1,1) z21=aux(ic2,jc1,1)+q(ic2,jc1,1) z12=aux(ic1,jc2,1)+q(ic1,jc2,1) z22=aux(ic2,jc2,1)+q(ic2,jc2,1) h11=q(ic1,jc1,1) h21=q(ic2,jc1,1) h12=q(ic1,jc2,1) h22=q(ic2,jc2,1) depthindicator= min(h11,h12,h21,h22) totaldepth= h11+h22+h21+h12 if (depthindicator.lt.tol.and.totaldepth.gt.4.d0*tol) then !near shoreline if (h11.lt.tol) then z11w= (h12*z12 + h21*z21 + h22*z22)/totaldepth z11=z11w endif if (h12.lt.tol) then z12w= (h11*z11 + h21*z21 + h22*z22)/totaldepth z12=z12w endif if (h21.lt.tol) then z21w= (h11*z11 + h12*z12 + h22*z22)/totaldepth z21=z21w endif if (h22.lt.tol) then z22w= (h12*z12 + h21*z21 + h11*z11)/totaldepth z22=z22w endif endif if (totaldepth.le.4.d0*tol) then z22=d_nan() endif a=z21-z11 b=z12-z11 d=z11 c=z22-(a+b+d) c #If eta max/min are saved on this grid initialized if necessary if (ioutsurfacemax.gt.0.and.maxcheck.eq.2) then if (.not.(fgrid(ifg,jfg,indetamin).eq. & fgrid(ifg,jfg,indetamin))) fgrid(ifg,jfg,indetamin)=0.d0 if (.not.(fgrid(ifg,jfg,indetamax).eq. & fgrid(ifg,jfg,indetamax))) fgrid(ifg,jfg,indetamax)=0.d0 endif c # check wich task to perform if (maxcheck.eq.0) then fgrid(ifg,jfg,indeta) = a*xterm + b*yterm + c*xyterm + d fgrid(ifg,jfg,mvarsfg) = t elseif (maxcheck.eq.1.and.ioutsurfacemax.gt.0) then fgrid(ifg,jfg,indetanow) = a*xterm + b*yterm + c*xyterm + d elseif (maxcheck.eq.2.and.ioutsurfacemax.gt.0) then fgrid(ifg,jfg,indetamin) = & min(fgrid(ifg,jfg,indetamin),fgrid(ifg,jfg,indetanow)) fgrid(ifg,jfg,indetamax) = & max(fgrid(ifg,jfg,indetamax),fgrid(ifg,jfg,indetanow)) endif c #If arrival times are saved on this grid if (maxcheck.eq.1.and.ioutarrivaltimes.gt.0) then check=fgrid(ifg,jfg,indarrive) if (.not.(check.eq.check)) then !# check=NaN: Waves haven't arrived previously if (dabs(fgrid(ifg,jfg,indeta)).gt.arrivaltol) then fgrid(ifg,jfg,indarrive)= t endif endif endif endif enddo enddo return end