subroutine evapot(x,y,th,vf,bl,br,bb,bt, + padd,uadd,vadd,nx,ny,np) * **************************************************** * Add the potential flow to satisfy the no-flux condition * on the boundary. The normal velocity of the front is * modified. * **************************************************** integer nx,ny,np,i,j,k,ii,jj double precision x(0:8192),y(0:8192),th(0:8192), + vf(0:8192) double precision padd(0:nx+1,0:ny+1),uadd(0:nx,ny), + vadd(nx,0:ny) double precision bl(ny),br(ny),bb(nx),bt(nx) double precision hm,hinv,xp,yp,dx,dy,up,vp,coef1,sum common/darcyc/coef1 common/meshsz/hm,hinv * determine the velocity correction: do 10 j=1,ny do 10 i=1,nx-1 uadd(i,j) = (padd(i,j) - padd(i+1,j))*hinv 10 continue do 15 j=1,ny uadd(0,j) = bl(j) uadd(nx,j) = -br(j) 15 continue do 20 j=1,ny-1 do 20 i=1,nx vadd(i,j) = (padd(i,j) - padd(i,j+1))*hinv 20 continue do 25 i=1,nx vadd(i,0) = bb(i) vadd(i,ny) = -bt(i) 25 continue * bilinear interpolation to obtain the velocity at * front positions: do 30 k=1,np xp = x(k) yp = y(k) * for u: ii = int(xp*hinv) jj = int(yp*hinv+0.5D0) dx = xp*hinv - dfloat(ii) if(jj .eq. 0) then up = uadd(ii,1)*(1.D0-dx) + + uadd(ii+1,1)*dx elseif(jj .eq. ny) then up = uadd(ii,ny)*(1.D0-dx) + + uadd(ii+1,ny)*dx else dy = yp*hinv - dfloat(jj) + 0.5D0 up = uadd(ii,jj)*(1.D0-dx)*(1.D0-dy) + + uadd(ii+1,jj)*dx*(1.D0-dy) + + uadd(ii,jj+1)*(1.D0-dx)*dy + + uadd(ii+1,jj+1)*dx*dy endif * for v: ii = int(xp*hinv+0.5D0) ii = int(yp*hinv) dy = yp*hinv - dfloat(jj) if(ii .eq. 0) then vp = vadd(1,jj)*(1.D0-dy) + + vadd(1,jj+1)*dy elseif(ii .eq. nx) then vp = vadd(nx,jj)*(1.D0-dy) + + vadd(nx,jj+1)*dy else dx = xp*hinv - dfloat(ii) + 0.5D0 vp = vadd(ii,jj)*(1.D0-dx)*(1.D0-dy) + + vadd(ii+1,jj)*dx*(1.D0-dy) + + vadd(ii,jj+1)*(1.D0-dx)*dy + + vadd(ii+1,jj+1)*dx*dy endif * add to the single layer source velocity vf(k) = vf(k) - coef1*up*dsin(th(k)) + + coef1*vp*dcos(th(k)) 30 continue vf(0) = vf(np) sum = 0.D0 do 40 k=1,np sum = sum + vf(k) 40 continue do 50 k=0,np vf(k) = vf(k) - sum/dfloat(np) 50 continue end