program gridmaker,6
c 9 June 2014.  Unaltered version of a program from 1990's previously named gr2.f.  
c The progam is simplified version of a code once used for continuous dynamic grid
c adaptation. Here those CDGA routines are used to make a single static grid, placing
c more grid points where a weight function is large.
c Compile and run to make a text file grid.dat, which is read in by boxn.f. 
c The file specifies the stretched grid, which places higher resolution in
c the central and lower part of the domain, as is useful for tornado simulations.
	include 'gridmaker.size'
	parameter (ih=in/2+1,jh=jn/2+1)
	common/par/rei,hite,wide,alim,diff,pit,rlx,str,chop,filtn,adjn,
     #		abc,dtmax,cin,xtra2,xtra3
     #		,dx,dtn,time
	dimension x(in,jn,kn),y(in,jn,kn),z(in,jn,kn),t(in,jn),
     #		xs(is,js),ys(is,js),wf(is,js),ug(in,jn),vg(in,jn),
     #		w(in,jn,kn)
	dimension xa(ih,kn),za(ih,kn)
	wide=4.
	hite=4.
	chop=1.0
	filtn=0.
	str=16.
	ampc=7.
	dt=0.1   ! bogus time step, any dt works here
	xc=wide/2.
	yc=hite/2.
	stz=.2

c	call makebnds
	call gridprep

	do k=1,kn,kn-1
		write (*,*) ' k=',k
		rad1=1.0  !original
		rad2=1.0  !original
		rad3=.3 !original
		rad3=.5 !not bad 
		rad3=.25
		rad1=.5
		rad2=.5
	   call gridinit(x(1,1,k),y(1,1,k),wide,hite,in,jn)
	   call gridinit(xs,ys,wide,hite,is,js)
		if (k.eq.1) then
		str=64.  !original
		ampc=15.  !original
		str=128. !not bad  
		ampc=15. !not bad
		str=128.
		ampc=30. 
		else
		str=8.
		ampc=4.
		end if

	      do n=1,16
		do j=1,jn
		do i=1,in
		t(i,j)=0.
		r=sqrt((x(i,j,k)-xc)**2+0*(y(i,j,k)-yc)**2)
		if (r.lt.rad1) t(i,j)=amax1(cos(1.571*r/rad1),.5)
		r=sqrt(0*(x(i,j,k)-xc)**2+(y(i,j,k)-yc)**2)
		if (r.lt.rad2) t(i,j)=t(i,j)+
     #		amax1(cos(1.571*r/rad2),.5)
		r=sqrt((x(i,j,k)-xc)**2+(y(i,j,k)-yc)**2)
		if (r.lt.rad3) t(i,j)=t(i,j)+
     #		ampc*amax1(cos(1.571*r/rad3),.5)
		w(i,j,k)=t(i,j)
		end do
		end do

	         call newwf(t,x(1,1,k),y(1,1,k),wf,xs,ys,filtn)

	         call grid(xs,ys,wf,str,chop,4*js)

	         call itrpgr(x(1,1,k),y(1,1,k),xs,ys,ug,vg,dt)
	         do i=1,in
	         do j=1,jn
	            x(i,j,k)=x(i,j,k)+dt*ug(i,j)
	            y(i,j,k)=y(i,j,k)+dt*vg(i,j)
	         enddo
	         enddo	
	         write(*,*) x(im/4+1,jm/4+1,k)
	   end do
	end do
		do k=1,kn
		gz=(k-1.)/(kn-1.)
		zz=(stz*gz+(2.-stz)*gz**3)/(1.+gz**2)
		do i=1,in
		do j=1,jn
		z(i,j,k)=zz
		stq=.4
		zx=(stq*zz+(2.-stq)*zz**3)/(1.+zz**2)
		zx=0.+0.5*(1-cos(3.1415*zz))
		x(i,j,k)=x(i,j,1)+zx*(x(i,j,kn)-x(i,j,1))
		y(i,j,k)=y(i,j,1)+zx*(y(i,j,kn)-y(i,j,1))
		end do
		end do
		end do
		do k=1,kn
		do i=1,in
		do j=1,jn
		x(i,j,k)=x(i,j,k)-.5*wide
		y(i,j,k)=y(i,j,k)-.5*wide
		end do
		end do
		end do
		do k=1,kn
		do i=1,ih
		xa(i,k)=x(ih-1+i,jh,k)
		za(i,k)=z(ih-1+i,jh,k)
		end do
		end do

	open (unit=30,file='grid.dat',
     #		status='unknown')
	write (30,'(f10.6)') x,y,z
	open (unit=31,file='grid2d.dat',
     #		status='unknown')
	write (31,'(i4,i4)')ih,kn 
	write (31,'(f10.6)') xa,za
	end
	
c******************************************************************************
c**** grid adaption subroutines ****
c*

	subroutine filtw(wf,dm,is,js) 1
	dimension wf(is,js),dm(is,js)
	do 7 i=1,is
	il=i-1
	ir=i+1
	qr=1.
	if (i.eq.1) il=ir
	if (i.eq.is) then
	ir=il
	qr=0.00000
	end if
	do 7 j=1,js
	jb=j-1
	jt=j+1
	qt=1.
	qb=1.
	if (j.eq.1)then
	jb=jt
	qb=0.000
	end if
	if (j.eq.js) then
	jt=jb
	qt=0.0000
	end if
7	dm(i,j)=0.5*wf(i,j)+
     #		.125*(wf(il,j)+qr*wf(ir,j)+qt*wf(i,jt)+qb*wf(i,jb))
c	wfmax=0.
	do 5 i=1,is
	il=i-1
	ir=i+1
	qr=1.
	if (i.eq.1) il=ir
	if (i.eq.is) then
	ir=il
	qr=0.
	end if
	do 5 j=1,js
	jb=j-1
	jt=j+1
	qt=1.
	qb=1.
	if (j.eq.1)then
	jb=jt
	qb=0.
	end if
	if (j.eq.js) then
	jt=jb
	qt=0.
	end if
5	wf(i,j)=0.5*dm(i,j)+
     #		.125*(dm(il,j)+qr*dm(ir,j)+qt*dm(i,jt)+qb*dm(i,jb))
	return
	end



	subroutine newwf(v,xg,yg,wf,xs,ys,filtn) 1,1
	include 'gridmaker.size'
	dimension xg(in,jn),yg(in,jn),xs(is,js),ys(is,js)
	dimension wf(is,js),v(in,jn),dum(ng)
	common/trng/ir(is),il(is),tr(is),tl(is),
     #		   jt(js),jb(js),tt(js),tb(js),
     #		   ii(ng),jj(ng),iis(ng),jjs(ng)


	do 5 n=1,ng
5	dum(n)=0.

	do 20 iii=-li,li,2
	do 20 jjj=-lj,lj,2
	do 10 n=1,(is-2)*(js-2)
	ih=(iis(n)-1)*li+1+iii
	jh=(jjs(n)-1)*lj+1+jjj
10	dum(n)=dum(n)+v(ih,jh)
20	continue

	do 25 n=1,(is-2)*(js-2)
	i=iis(n)
	j=jjs(n)
25	wf(i,j)=dum(n)

	do 30 j=2,js-1
	wf(1,j)=wf(2,j)
30	wf(is,j)=wf(is-1,j)
	do 40 i=1,is
	wf(i,1)=wf(i,2)
40	wf(i,js)=wf(i,js-1)

	do 50 a=1.,filtn
50	call filtw(wf,dum,is,js)
	return
	end

c******************



	subroutine itrpgr(xg,yg,xs,ys,dxdt,dydt,dt) 1,2
	include 'gridmaker.size'
	dimension xg(in,jn),yg(in,jn),xs(is,js),ys(is,js)
	dimension dxdt(in,jn),dydt(in,jn)
	call bicub(xs,xg,dxdt,dt,1)
	call bicub(ys,yg,dydt,dt,2)
	return
	end


	subroutine bicub(f,fg,dfdt,dt,it) 2,1
	include 'gridmaker.size'
	dimension fg(in,jn),dfdt(in,jn),f(is,js)
	dimension f1(is,js),f2(is,js),f12(is,js)
	dimension q(4),q1(4),q2(4),q12(4),c(4,4)
	common/cub/igv(lsm),jgv(lsm),xxv(lsm),yyv(lsm)

	rdt=1./dt
	rdx=.5/li
	rdy=.5/lj

	do 2 i=1,is
	do 2 j=1,js
	f1(i,j)=0.
	f2(i,j)=0.
2	f12(i,j)=0.

	if (it.eq.1) then 
	do 21 j=1,js
	f1(1,j)=2.*rdx*(f(2,j)-f(1,j))
21	f1(is,j)=2.*rdx*(f(is,j)-f(is-1,j))
	do 23 i=2,is-1
	il=i-1
	ir=i+1
	f1(i,1)=rdx*(f(ir,1)-f(il,1))
23	f1(i,js)=rdx*(f(ir,js)-f(il,js))
	end if

	if (it.eq.2) then
	do 31 i=1,is
	f2(i,1)=2.*rdy*(f(i,2)-f(i,1))
31	f2(i,js)=2.*rdy*(f(i,js)-f(i,js-1))
	do 33 j=2,js-1
	jb=j-1
	jt=j+1
	f2(1,j)=rdy*(f(1,jt)-f(1,jb))
33	f2(is,j)=rdy*(f(is,jt)-f(is,jb))
	end if

	do 6 i=2,is-1
	il=i-1
	ir=i+1
	do 6 j=2,js-1
	jb=j-1
	jt=j+1
	f1(i,j)=rdx*(f(ir,j)-f(il,j))
	f2(i,j)=rdy*(f(i,jt)-f(i,jb))
6	f12(i,j)=rdx*rdy*(f(ir,jt)+f(il,jb)-f(il,jt)-f(ir,jb))

	do 10 i=1,is-1
	do 10 j=1,js-1
	q(1)=f(i,j)
	q(4)=f(i,j+1)
	q(3)=f(i+1,j+1)
	q(2)=f(i+1,j)
	q1(1)=f1(i,j)
	q1(4)=f1(i,j+1)
	q1(3)=f1(i+1,j+1)
	q1(2)=f1(i+1,j)
	q2(1)=f2(i,j)
	q2(4)=f2(i,j+1)
	q2(3)=f2(i+1,j+1)
	q2(2)=f2(i+1,j)
	q12(1)=f12(i,j)
	q12(4)=f12(i,j+1)
	q12(3)=f12(i+1,j+1)
	q12(2)=f12(i+1,j)

	call bcucof(q,q1,q2,q12,1.*li,1.*lj,c)

	do 55 nv=1,lsm
	ig=(i-1)*li+1+igv(nv)
	jg=(j-1)*lj+1+jgv(nv)
	xx=xxv(nv)
	yy=yyv(nv)
	val=
     #	 (((((c(4,4)*yy+c(3,4))*yy+c(2,4))*yy+c(1,4))*xx
     #	  +(((c(4,3)*yy+c(3,3))*yy+c(2,3))*yy+c(1,3)))*xx
     #	  +(((c(4,2)*yy+c(3,2))*yy+c(2,2))*yy+c(1,2)))*xx
     #	  +(((c(4,1)*yy+c(3,1))*yy+c(2,1))*yy+c(1,1))
c	val=0.
c	do 65 lc=4,1,-1
c65	val=xx*val+
c     #	 ((c(4,lc)*yy+c(3,lc))*yy+c(2,lc))*yy+c(1,lc)

55	dfdt(ig,jg)=(val-fg(ig,jg))*rdt
10	continue

	return
	end


	SUBROUTINE GRIDINIT(X,Y,XMAX,YMAX,In,Jn) 2
	DIMENSION X(In,Jn),Y(In,Jn)
	DO 10 I=1,In
	DO 10 J=1,Jn
	X(I,J)=XMAX*(I-1)/(In-1)
10	Y(I,J)=YMAX*(J-1)/(Jn-1)
	RETURN
	END


	function clip(x,c)
	clip=alog(1+x/c)*c
	return
	end


	subroutine oldgrid(x,y,wfunc,str,chop,ncrunch)
c** uses eq. 12, page 199 of Thompson et al. book
c**  "Numerical Grid Generation".  This was used for all research before
c** November 1995
	include 'gridmaker.size'
	dimension x(is,js),y(is,js),z(is,js),wfunc(is,js),
     #	  w(is,js),dxdt(is,js),dydt(is,js),dzdt(is,js),rate(is,js),
     #    dxdn(ng),dydn(ng),ratn(ng)

	common/trng/ira(is),ila(is),tr(is),tl(is),
     #		   jta(js),jba(js),tt(js),tb(js),
     #		   ii(ng),jj(ng),iis(ng),jjs(ng)

	equivalence (dxdn(1),dxdt(1,1))
	equivalence (dydn(1),dydt(1,1))
	equivalence (ratn(1),rate(1,1))

	dummy=0.
	do 100 i=1,is
	do 100 j=1,js
100	dummy=amax1(wfunc(i,j),dummy)

	dummy=chop*dummy
	factor=0.
	if (dummy.ne.0.) factor=str/dummy	
	do 101 i=1,is
	do 101 j=1,js
101	w(i,j)=1.+factor*amin1(dummy,wfunc(i,j))
	
cx	factor=1/dummy
cx	do 91 i=1,is
cx	do 91 j=1,js
cx91	w(i,j)=factor*wfunc(i,j)
cx	factor=clip(1.,chop)
cx	factor=clip(factor,chop)
cx	factor=str/factor
cx	do 92 i=1,is
cx	do 92 j=1,js
cx92	w(i,j)=clip(w(i,j),chop)
cx	do 93 i=1,is
cx	do 93 j=1,js
cx93	w(i,j)=1.+factor*clip(w(i,j),chop)


	do 1001 nn=1,ncrunch
	do 10 n=1,ng

	i=ii(n)
	j=jj(n)
	ir=ira(i)
	il=ila(i)
	jt=jta(j)
	jb=jba(j)

	x1=0.5*(x(ir,j)-x(i,j))*tr(i)
     #	  +0.5*(x(i,j)-x(il,j))*tl(i)
	y1=0.5*(y(ir,j)-y(il,j))

	x2=0.5*(x(i,jt)-x(i,jb))
	y2=0.5*(y(i,jt)-y(i,j))*tt(j)
     #    +0.5*(y(i,j)-y(i,jb))*tb(j)

	a11=y2
	a12=-x2
	a21=-y1
	a22=x1

	g11=a11*a11+a12*a12
	g22=a21*a21+a22*a22
	g12=a11*a21+a12*a22


	p=0.5*(w(ir,j)-w(il,j))/w(i,j)
	q=0.5*(w(i,jt)-w(i,jb))/w(i,j)

	dxdn(n)=g11*(x(ir,j)-2.*x(i,j)+x(il,j)+
     #			0.5*p*(x(ir,j)-x(il,j)))
     #		+g22*(x(i,jt)-2.*x(i,j)+x(i,jb)+
     #			0.5*q*(x(i,jt)-x(i,jb)))
     #		+.5*g12*(x(ir,jt)-x(ir,jb)-
     #			x(il,jt)+x(il,jb))

	dydn(n)=g11*(y(ir,j)-2.*y(i,j)+y(il,j)+
     #			0.5*p*(y(ir,j)-y(il,j)))
     #		+g22*(y(i,jt)-2.*y(i,j)+y(i,jb)+
     #			0.5*q*(y(i,jt)-y(i,jb)))
     #		+.5*g12*(y(ir,jt)-y(ir,jb)-
     #			y(il,jt)+y(il,jb))

	ratn(n)=0.5/(g22+g11)
10	continue

	do 20 i=1,is
	do 20 j=2,js-1
20	y(i,j)=y(i,j)+dydt(i,j)*rate(i,j)

	do 21 i=2,is-1
	do 21 j=1,js
21	x(i,j)=x(i,j)+dxdt(i,j)*rate(i,j)

1001	continue
	return
	end





	subroutine gridprep 1
	include 'gridmaker.size'
	common/cub/igv(lsm),jgv(lsm),xxv(lsm),yyv(lsm)

	common/trng/ir(is),il(is),tr(is),tl(is),
     #		   jt(js),jb(js),tt(js),tb(js),
     #		   ii(ng),jj(ng),iis(ng),jjs(ng)


	n=0
	do 55 i=0,li
	do 55 j=0,lj
	n=n+1
	igv(n)=i
	xxv(n)=1.*i/li
	jgv(n)=j
55	yyv(n)=1.*j/lj

	n=0
	do 10 j=1,js
	do 10 i=1,is
	n=n+1
	ii(n)=i
10	jj(n)=j

	n=0
	do 15 i=2,is-1
	do 15 j=2,js-1
	n=n+1
	iis(n)=i
	jjs(n)=j
15	continue



	do 20 i=1,is
	ir(i)=i+1
	il(i)=i-1
	tr(i)=1.
	tl(i)=1.
	if (i.eq.is) then
	ir(i)=i-1
	tr(i)=0.
	tl(i)=2.
	end if
	if (i.eq.1) then
	il(i)=i+1
	tr(i)=2.
	tl(i)=0.
	end if
20	continue

	do 30 j=1,js
	jt(j)=j+1
	jb(j)=j-1
	tt(j)=1.
	tb(j)=1.
	if (j.eq.js) then
	jt(j)=j-1
	tt(j)=0.
	tb(j)=2.
	end if
	if (j.eq.1) then
	jb(j)=j+1
	tt(j)=2.
	tb(j)=0.
	end if
30	continue

	return
	end


      SUBROUTINE BCUCOF(Y,Y1,Y2,Y12,D1,D2,CL) 1
      DIMENSION Y(4),Y1(4),Y2(4),Y12(4),CL(16),X(16),WT(16,16)
      DATA WT/1.,0.,-3.,2.,4*0.,-3.,0.,9.,-6.,2.,0.,-6.,
     *  4.,8*0.,3.,0.,-9.,6.,-2.,0.,6.,-4.,10*0.,9.,-6.,
     *  2*0.,-6.,4.,2*0.,3.,-2.,6*0.,-9.,6.,2*0.,6.,-4.,
     *  4*0.,1.,0.,-3.,2.,-2.,0.,6.,-4.,1.,0.,-3.,2.,8*0.,
     *  -1.,0.,3.,-2.,1.,0.,-3.,2.,10*0.,-3.,2.,2*0.,3.,
     *  -2.,6*0.,3.,-2.,2*0.,-6.,4.,2*0.,3.,-2.,0.,1.,-2.,
     *  1.,5*0.,-3.,6.,-3.,0.,2.,-4.,2.,9*0.,3.,-6.,3.,0.,
     *  -2.,4.,-2.,10*0.,-3.,3.,2*0.,2.,-2.,2*0.,-1.,1.,
     *  6*0.,3.,-3.,2*0.,-2.,2.,5*0.,1.,-2.,1.,0.,-2.,4.,
     *  -2.,0.,1.,-2.,1.,9*0.,-1.,2.,-1.,0.,1.,-2.,1.,10*0.,
     *  1.,-1.,2*0.,-1.,1.,6*0.,-1.,1.,2*0.,2.,-2.,2*0.,-1.,1./
      D1D2=D1*D2
      DO 11 I=1,4
        X(I)=Y(I)
        X(I+4)=Y1(I)*D1
        X(I+8)=Y2(I)*D2
        X(I+12)=Y12(I)*D1D2
11    CONTINUE
      DO 13 I=1,16
        CL(I)=
     #     WT(I,1)*X(1)
     #    +WT(I,2)*X(2)
     #    +WT(I,3)*X(3)
     #    +WT(I,4)*X(4)
     #    +WT(I,5)*X(5)
     #    +WT(I,6)*X(6)
     #    +WT(I,7)*X(7)
     #    +WT(I,8)*X(8)
     #    +WT(I,9)*X(9)
     #    +WT(I,10)*X(10)
     #    +WT(I,11)*X(11)
     #    +WT(I,12)*X(12)
     #    +WT(I,13)*X(13)
     #    +WT(I,14)*X(14)
     #    +WT(I,15)*X(15)
     #    +WT(I,16)*X(16)
13    CONTINUE
      RETURN
      END



	subroutine grid(x,y,wfunc,str,chop,ncrunch) 1
c***uses the grid equation derived from Montreal, November 1995
	include 'gridmaker.size'
	dimension x(is,js),y(is,js),z(is,js),wfunc(is,js),
     #	  w(is,js),dxdt(is,js),dydt(is,js),dzdt(is,js),rate(is,js),
     #    dxdn(ng),dydn(ng),ratn(ng)

	common/trng/ira(is),ila(is),tr(is),tl(is),
     #		   jta(js),jba(js),tt(js),tb(js),
     #		   ii(ng),jj(ng),iis(ng),jjs(ng)

	equivalence (dxdn(1),dxdt(1,1))
	equivalence (dydn(1),dydt(1,1))
	equivalence (ratn(1),rate(1,1))

	dummy=0.
	do 100 i=1,is
	do 100 j=1,js
100	dummy=amax1(wfunc(i,j),dummy)

	dummy=chop*dummy
	factor=0.
	if (dummy.ne.0.) factor=str/dummy	
	do 101 i=1,is
	do 101 j=1,js
101	w(i,j)=1.+factor*amin1(dummy,wfunc(i,j))
	

	do 1001 nn=1,ncrunch
	do 10 n=1,ng

	i=ii(n)
	j=jj(n)
	ir=ira(i)
	il=ila(i)
	jt=jta(j)
	jb=jba(j)

	x1=0.5*(x(ir,j)-x(i,j))*tr(i)
     #	  +0.5*(x(i,j)-x(il,j))*tl(i)
	y1=0.5*(y(ir,j)-y(il,j))

	x2=0.5*(x(i,jt)-x(i,jb))
	y2=0.5*(y(i,jt)-y(i,j))*tt(j)
     #    +0.5*(y(i,j)-y(i,jb))*tb(j)
 	rg=1./(x1*y2-x2*y1)
	a11=y2*rg
	a12=-x2*rg
	a21=-y1*rg
	a22=x1*rg

	g11=a11*a11+a12*a12
	g22=a21*a21+a22*a22

	dxdn(n)=a11*(x(ir,j)-2.*x(i,j)+x(il,j))+
     #	       a22*(x(i,jt)-2.*x(i,j)+x(i,jb))+
     #		(a12+a21)*.25*(x(ir,jt)-x(ir,jb)-
     #			x(il,jt)+x(il,jb))
     #	        +0.5*(w(ir,j)-w(il,j))/w(i,j)
	
	dydn(n)=a11*(y(ir,j)-2.*y(i,j)+y(il,j))+
     #	       a22*(y(i,jt)-2.*y(i,j)+y(i,jb))+
     #		(a12+a21)*.25*(y(ir,jt)-y(ir,jb)-
     #			y(il,jt)+y(il,jb))
     #	        +0.5*(w(i,jt)-w(i,jb))/w(i,j)

c	ratn(n)=0.3/sqrt(g22+g11) !original
	ratn(n)=0.22/sqrt(g22+g11)
10	continue

	do 20 i=1,is
	do 20 j=2,js-1
20	y(i,j)=y(i,j)+dydt(i,j)*rate(i,j)

	do 21 i=2,is-1
	do 21 j=1,js
21	x(i,j)=x(i,j)+dxdt(i,j)*rate(i,j)

1001	continue
	return
	end