!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE GRADT ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculating the gradient of costfunction.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! Jidong Gao, CAPS, July, 2000
!
!-----------------------------------------------------------------------
!
SUBROUTINE gradt(numctr,ctrv,grad, & 2,22
gdu_err,gdv_err,gdp_err,gdt_err,gdq_err,gdw_err, &
u_ctr,v_ctr,p_ctr,t_ctr,q_ctr,w_ctr, psi, phi, &
gdscal, &
nx,ny,nz, &
nvar,nvarradin,nvarrad,nzua,nzrdr,nzret, &
mapfct,j1,j2,j3,aj3x,aj3y,aj3z,j3inv,rhostr, &
rhostru, rhostrv, rhostrw, div3, &
mxsng,mxua,mxrad,mxcolrad,mxret,mxcolret, &
nsrcsng,nsrcua,nsrcrad,nsrcret,ncat, &
mxpass,npass,iwstat,xs,ys,zs,x,y,z,zp,hterain, &
icatg,xcor,nam_var,xsng,ysng,hgtsng,thesng, &
obsng,odifsng,qobsng,qualsng,isrcsng,icatsng,nobsng, &
xua,yua,hgtua,theua, &
obsua,odifua,qobsua,qualua,isrcua,nlevsua,nobsua, &
elvrad,xradc,yradc, &
distrad,uazmrad,vazmrad,hgtradc,theradc,dsdr,dhdr, &
obsrad,odifrad,qobsrad,qualrad, &
irad,isrcrad,nlevrad,ncolrad, &
xretc,yretc,hgtretc,theretc, &
obsret,odifret,qobsret,qualret, &
iret,isrcret,nlevret,ncolret, &
srcsng,srcua,srcrad,srcret, &
ianxtyp,iusesng,iuseua,iuserad,iuseret, &
xyrange,kpvrsq,wlim,zrange,zwlim, &
thrng,rngsqi,knt,wgtsum,zsum, &
corsng,corua,corrad,corret, &
xsng_p,ysng_p,ihgtsng,xua_p,yua_p,ihgtua, &
xradc_p,yradc_p,ihgtradc,zsng_1,zsng_2, &
zua_1,zua_2,zradc_1,zradc_2, &
oanxsng,oanxua,oanxrad,oanxret, &
sngsw,uasw,radsw,retsw, &
ipass_filt,hradius,nradius_z,turn_div,cntl_var, &
wei_div_h,wei_div_v, &
anx,tem1,tem2,tem3,ibegin,iend,istatus)
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
! INCLUDE 'varpara.inc'
!
INCLUDE 'grid.inc'
!-----------------------------------------------------------------------
!
! Input Sizing Arguments
!
!-----------------------------------------------------------------------
!
INTEGER :: nx,ny,nz,sngsw,uasw,radsw,retsw
INTEGER :: nvar,nvarradin,nvarrad
INTEGER :: nzua,nzrdr,nzret
INTEGER :: mxsng,mxua,mxrad,mxcolrad,mxret,mxcolret
INTEGER :: nsrcsng,nsrcua,nsrcrad,nsrcret,ncat
INTEGER :: mxpass,npass
INTEGER :: ipass_filt,hradius,nradius_z,turn_div,cntl_var
REAL :: wei_div_h, wei_div_v
!
!-----------------------------------------------------------------------
!
! input grid arguments
!
!-----------------------------------------------------------------------
!
REAL :: x (nx) ! The x-coord. of the physical and
! computational grid. Defined at u-point.
REAL :: y (ny) ! The y-coord. of the physical and
! computational grid. Defined at v-point.
REAL :: z (nz) ! The z-coord. of the computational grid.
! Defined at w-point on the staggered grid.
REAL :: zp (nx,ny,nz) ! The physical height coordinate defined at
! w-point of the staggered grid.
REAL :: hterain(nx,ny) ! The height of the terrain.
!
REAL :: mapfct(nx,ny,8) ! Map factors at scalar, u and v points
REAL :: j1 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( x ).
REAL :: j2 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as - d( zp )/d( y ).
REAL :: j3 (nx,ny,nz) ! Coordinate transformation Jacobian
! defined as d( zp )/d( z ).
REAL :: aj3x (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE X-DIR.
REAL :: aj3y (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Y-DIR.
REAL :: aj3z (nx,ny,nz) ! Coordinate transformation Jacobian defined
! as d( zp )/d( z ) AVERAGED IN THE Z-DIR.
REAL :: j3inv (nx,ny,nz) ! Inverse of j3
REAL :: rhostr(nx,ny,nz) ! Base state density rhobar times j3
REAL :: rhostru(nx,ny,nz) ! Averaged rhostr at u points (kg/m**3).
REAL :: rhostrv(nx,ny,nz) ! Averaged rhostr at v points (kg/m**3).
REAL :: rhostrw(nx,ny,nz) ! Averaged rhostr at w points (kg/m**3).
!
!
REAL :: xs(nx)
REAL :: ys(ny)
REAL :: zs(nx,ny,nz)
INTEGER :: icatg(nx,ny)
REAL :: xcor(ncat,ncat)
!
!-----------------------------------------------------------------------
!
! Input Observation Arguments
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=6) :: nam_var(nvar)
REAL :: xsng(mxsng)
REAL :: ysng(mxsng)
REAL :: hgtsng(mxsng)
REAL :: thesng(mxsng)
REAL :: obsng(nvar,mxsng)
REAL :: odifsng(nvar,mxsng)
REAL :: qobsng(nvar,mxsng)
INTEGER :: qualsng(nvar,mxsng)
INTEGER :: isrcsng(mxsng)
INTEGER :: icatsng(mxsng)
INTEGER :: nobsng
REAL :: xsng_p(mxsng),ysng_p(mxsng)
REAL :: zsng_1(mxsng),zsng_2(mxsng)
INTEGER :: ihgtsng(mxsng)
!
REAL :: xua(mxua)
REAL :: yua(mxua)
REAL :: hgtua(nzua,mxua)
REAL :: theua(nzua,mxua)
REAL :: obsua(nvar,nzua,mxua)
REAL :: odifua(nvar,nzua,mxua)
REAL :: qobsua(nvar,nzua,mxua)
INTEGER :: qualua(nvar,nzua,mxua)
INTEGER :: nlevsua(mxua)
INTEGER :: isrcua(mxua)
INTEGER :: nobsua
!
REAL :: xua_p(mxua),yua_p(mxua)
REAL :: zua_1(nzua,mxua),zua_2(nzua,mxua)
INTEGER :: ihgtua(nzua,mxua)
!
REAL :: elvrad(mxrad)
REAL :: xradc(mxcolrad)
REAL :: yradc(mxcolrad)
REAL :: distrad(mxcolrad)
REAL :: uazmrad(mxcolrad)
REAL :: vazmrad(mxcolrad)
REAL :: hgtradc(nzrdr,mxcolrad)
REAL :: theradc(nzrdr,mxcolrad)
REAL :: dsdr(nzrdr,mxcolrad)
REAL :: dhdr(nzrdr,mxcolrad)
REAL :: obsrad(nvarradin,nzrdr,mxcolrad)
REAL :: odifrad(nvarrad,nzrdr,mxcolrad)
REAL :: qobsrad(nvarrad,nzrdr,mxcolrad)
INTEGER :: qualrad(nvarrad,nzrdr,mxcolrad)
INTEGER :: nlevrad(mxcolrad)
INTEGER :: irad(mxcolrad)
INTEGER :: isrcrad(0:mxrad)
INTEGER :: ncolrad
!
REAL :: xradc_p(mxcolrad),yradc_p(mxcolrad)
REAL :: zradc_1(nzrdr,mxcolrad),zradc_2(nzrdr,mxcolrad)
INTEGER :: ihgtradc(nzrdr,mxcolrad)
!
REAL :: xretc(mxcolret)
REAL :: yretc(mxcolret)
REAL :: hgtretc(nzret,mxcolret)
REAL :: theretc(nzret,mxcolret)
REAL :: obsret(nvar,nzret,mxcolret)
REAL :: odifret(nvar,nzret,mxcolret)
REAL :: qobsret(nvar,nzret,mxcolret)
INTEGER :: qualret(nvar,nzret,mxcolret)
INTEGER :: nlevret(mxcolret)
INTEGER :: iret(mxcolret)
INTEGER :: isrcret(0:mxret)
INTEGER :: ncolret
!
!-----------------------------------------------------------------------
!
! Input Analysis Control Variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=8) :: srcsng(nsrcsng)
CHARACTER (LEN=8) :: srcua (nsrcua )
CHARACTER (LEN=8) :: srcrad(nsrcrad)
CHARACTER (LEN=8) :: srcret(nsrcret)
INTEGER :: ianxtyp(mxpass)
INTEGER :: iusesng(0:nsrcsng)
INTEGER :: iuseua(0:nsrcua)
INTEGER :: iuserad(0:nsrcrad)
INTEGER :: iuseret(0:nsrcret)
REAL :: xyrange(mxpass)
REAL :: kpvrsq(nvar)
REAL :: wlim
REAL :: zrange(mxpass)
REAL :: zwlim
REAL :: thrng(mxpass)
INTEGER :: iwstat
!
!-----------------------------------------------------------------------
!
! Scratch Space
!
!-----------------------------------------------------------------------
!
REAL :: rngsqi(nvar)
INTEGER :: knt(nvar,nz)
REAL :: wgtsum(nvar,nz)
REAL :: zsum(nvar,nz)
!
!-----------------------------------------------------------------------
!
! Output Variables at Observation Locations
!
!-----------------------------------------------------------------------
!
REAL :: corsng(mxsng,nvar)
REAL :: corua(nzua,mxua,nvar)
REAL :: corrad(nzrdr,mxcolrad,nvarrad)
REAL :: corret(nzret,mxcolret,nvar)
REAL :: oanxsng(nvar,mxsng)
REAL :: oanxua(nvar,nzua,mxua)
REAL :: oanxrad(nvarrad,nzrdr,mxcolrad)
REAL :: oanxret(nvar,nzret,mxcolret)
!
!-----------------------------------------------------------------------
!
! Output Grid
!
!-----------------------------------------------------------------------
!
REAL :: anx(nx,ny,nz,nvar)
!
!-----------------------------------------------------------------------
!
! Work arrays
!
!-----------------------------------------------------------------------
!
REAL :: tem1(nx,ny,nz)
REAL :: tem2(nx,ny,nz)
REAL :: tem3(nx,ny,nz)
INTEGER :: ibegin(ny)
INTEGER :: iend(ny)
!
!-----------------------------------------------------------------------
!
! Return status
!
!-----------------------------------------------------------------------
!
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Misc.local variables
!
!-----------------------------------------------------------------------
!
REAL :: ftabinv,setexp
INTEGER :: i,j,k,isrc
REAL :: rpass,zrngsq,thrngsq
!
!
!
! input:
! -----
! numctr: dimension of control variables
! ctrv: current perturbation (1d arrays)
!
! output:
! ------
! gradient of costfunction
!
!------------------------------------------------------------------------------c
!
!
INTEGER :: numctr,iflag,num
REAL :: ctrv (numctr), grad (numctr)
REAL :: gdu_err(nx,ny,nz)
REAL :: gdv_err(nx,ny,nz)
REAL :: gdp_err(nx,ny,nz)
REAL :: gdt_err(nx,ny,nz)
REAL :: gdq_err(nx,ny,nz)
REAL :: gdw_err(nx,ny,nz)
REAL :: gdscal(nx,ny,nz)
REAL :: ugrid,vgrid,wgrid,vr,zv
REAL :: u_ctr(nx,ny,nz)
REAL :: v_ctr(nx,ny,nz)
REAL :: p_ctr(nx,ny,nz)
REAL :: t_ctr(nx,ny,nz)
REAL :: q_ctr(nx,ny,nz)
REAL :: w_ctr(nx,ny,nz)
REAL :: psi(nx,ny,nz)
REAL :: phi(nx,ny,nz)
!
REAL,DIMENSION (:,:,:), allocatable :: &
u,v,w,wcont
!
REAL,DIMENSION (:,:,:), allocatable :: &
u_grd,v_grd,p_grd,t_grd,q_grd,w_grd
!
REAL :: sum1,sum2
integer:: isum
REAL :: f_div
REAL :: div3(nx,ny,nz)
!
INTEGER :: ivar
REAL :: temp1,temp2
!
!
allocate ( u(nx,ny,nz) )
allocate ( v(nx,ny,nz) )
allocate ( w(nx,ny,nz) )
allocate ( wcont(nx,ny,nz) )
!
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
u_ctr(i,j,k) = 0.
v_ctr(i,j,k) = 0.
psi(i,j,k) = 0.
phi(i,j,k) = 0.
p_ctr(i,j,k) = 0.
t_ctr(i,j,k) = 0.
q_ctr(i,j,k) = 0.
w_ctr(i,j,k) = 0.
END DO
END DO
END DO
!
!
CALL transi
(numctr,nx,ny,nz,u_ctr,v_ctr,p_ctr, &
t_ctr,q_ctr,w_ctr,ctrv)
IF( 2 == 1 ) THEN
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
u_ctr(i,j,k) = 0.
v_ctr(i,j,k) = 0.
psi(i,j,k) = 0.
phi(i,j,k) = 0.
p_ctr(i,j,k) = 0.
t_ctr(i,j,k) = 0.
q_ctr(i,j,k) = 0.
w_ctr(i,j,k) = 0.
END DO
END DO
END DO
ENDIF
!
!
!
!
allocate (u_grd(nx,ny,nz))
allocate (v_grd(nx,ny,nz))
allocate (p_grd(nx,ny,nz))
allocate (t_grd(nx,ny,nz))
allocate (q_grd(nx,ny,nz))
allocate (w_grd(nx,ny,nz))
!
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
u_grd(i,j,k) = 0.
v_grd(i,j,k) = 0.
p_grd(i,j,k) = 0.
t_grd(i,j,k) = 0.
q_grd(i,j,k) = 0.
w_grd(i,j,k) = 0.
END DO
END DO
END DO
!
!
!
! observation for single level data
! --------------------------------------------------------------
!
IF(sngsw > 0) THEN
!
num = 0
DO i = 1, nobsng
!
!
CALL alinearint_3d
(nx,ny,nz,u_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
1, mxsng, icatsng, nobsng, &
1,xsng_p,ysng_p,zsng_1,zsng_2,hgtsng,ihgtsng,corsng(1,1) )
!
CALL alinearint_3d
(nx,ny,nz,v_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
1, mxsng, icatsng, nobsng, &
2,xsng_p,ysng_p,zsng_1,zsng_2,hgtsng,ihgtsng,corsng(1,2) )
!
CALL alinearint_3d
(nx,ny,nz,p_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
1, mxsng, icatsng, nobsng, &
3,xsng_p,ysng_p,zsng_1,zsng_2,hgtsng,ihgtsng,corsng(1,3) )
!
CALL alinearint_3d
(nx,ny,nz,t_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
1, mxsng, icatsng, nobsng, &
4,xsng_p,ysng_p,zsng_1,zsng_2,hgtsng,ihgtsng,corsng(1,4) )
!
CALL alinearint_3d
(nx,ny,nz,q_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
1, mxsng, icatsng, nobsng, &
5,xsng_p,ysng_p,zsng_1,zsng_2,hgtsng,ihgtsng,corsng(1,5) )
!
!
!
! call alinearint_3d(nx,ny,nz,w_grd(1,1,1),xs(1),ys(1),zs(1,1,1),
! : 6,xsng(i),ysng(i),hgtsng(i),obsng(6,i),iflag )
!
!
IF(iflag == 1) num = num+1
END DO
!
! print*, 'num of valid data in grad cal===',num
!
END IF
!
! sum1=0.0
! do i =1, nx
! do j =1, ny
! do k =1, nz
! sum1 = sum1 + u_grd(i,j,k)*u_grd(i,j,k)
! sum1 = sum1 + v_grd(i,j,k)*v_grd(i,j,k)
! sum1 = sum1 + p_grd(i,j,k)*p_grd(i,j,k)
! sum1 = sum1 + t_grd(i,j,k)*t_grd(i,j,k)
! sum1 = sum1 + q_grd(i,j,k)*q_grd(i,j,k)
! end do
! end do
! end do
! print*,'sum1===',sum1
! stop
!
!
!
! observation cost function for upper level data
! --------------------------------------------------------------
!
IF(uasw > 0) THEN
!
!
do i = 1, nobsua
DO j = 1, nlevsua(i)
!
!
CALL alinearint_3d
(nx,ny,nz,u_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzua, mxua, nlevsua, nobsua, &
1,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,1) )
CALL alinearint_3d
(nx,ny,nz,v_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzua, mxua, nlevsua, nobsua, &
2,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,2) )
CALL alinearint_3d
(nx,ny,nz,p_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzua, mxua, nlevsua, nobsua, &
3,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,3) )
CALL alinearint_3d
(nx,ny,nz,t_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzua, mxua, nlevsua, nobsua, &
4,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,4) )
CALL alinearint_3d
(nx,ny,nz,q_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzua, mxua, nlevsua, nobsua, &
5,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,5) )
!
! CALL alinearint_3d(nx,ny,nz,w_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
! nzua, mxua, nlevsua, nobsua, &
! 6,xua_p,yua_p,zua_1,zua_2,hgtua,ihgtua,corua(1,1,6) )
!
!
END DO
END DO
!
END IF
!
!
! sum1=0.0
! do i =1, nx
! do j =1, ny
! do k =1, nz
! sum1 = sum1 + u_grd(i,j,k)*u_grd(i,j,k)
! sum1 = sum1 + v_grd(i,j,k)*v_grd(i,j,k)
! sum1 = sum1 + p_grd(i,j,k)*p_grd(i,j,k)
! sum1 = sum1 + t_grd(i,j,k)*t_grd(i,j,k)
! sum1 = sum1 + q_grd(i,j,k)*q_grd(i,j,k)
! end do
! end do
! end do
! print*,'sum1===',sum1
! stop
!
! loading radar data
! --------------------------------------------------------
!
sum1 = 0.0
sum2 = 0.0
!
IF(radsw > 0) THEN
!
corrad=0.0
sum1= 0.
sum2= 0.
isum = 0
DO i = 1, ncolrad
! if(iuserad(isrcrad(irad(i))).GT.0) THEN
!
DO k=1,nlevrad(i)
!
IF(qualrad(2,k,i) > 0 .and. ihgtradc(k,i)>=0 ) THEN
! corrad(k,i,1) = uazmrad(i)*corrad(k,i,2)*dsdr(k,i)
! corrad(k,i,3) = corrad(k,i,2)*dhdr(k,i)
! corrad(k,i,2) = vazmrad(i)*corrad(k,i,2)*dsdr(k,i)
!
! sum2 = sum2 + obsrad(2,k,i)*obsrad(2,k,i)
corrad(k,i,1) = uazmrad(i)*obsrad(2,k,i)*dsdr(k,i)
corrad(k,i,3) = obsrad(2,k,i)*dhdr(k,i)
corrad(k,i,2) = vazmrad(i)*obsrad(2,k,i)*dsdr(k,i)
isum = isum +1
sum1=sum1+corrad(k,i,1)*corrad(k,i,1)
sum1=sum1+corrad(k,i,2)*corrad(k,i,2)
sum1=sum1+corrad(k,i,3)*corrad(k,i,3)
! ugrid = uazmrad(i)*obsrad(2,k,i)*dsdr(k,i)
! wgrid = obsrad(2,k,i)*dhdr(k,i)
! vgrid = vazmrad(i)*obsrad(2,k,i)*dsdr(k,i)
! sum1=sum1+ugrid*ugrid
! sum1=sum1+wgrid*wgrid
! sum1=sum1+vgrid*vgrid
! sum1=sum1+dsdr(k,i)*dsdr(k,i)+dhdr(k,i)*dhdr(k,i)
! sum2=sum2+uazmrad(i)*uazmrad(i)+vazmrad(i)*vazmrad(i)
ENDIF
!
END DO
! END IF
!
END DO
print*,'sum1=========================',sum1,sum2
!
CALL alinearint_3d
(nx,ny,nz,u_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzrdr, mxcolrad, nlevrad, ncolrad, &
1,xradc_p,yradc_p,zradc_1,zradc_2,hgtradc, &
ihgtradc,corrad(1,1,1) )
!
CALL alinearint_3d
(nx,ny,nz,v_grd(1,1,1),xs(1),ys(1),zs(1,1,1), &
nzrdr, mxcolrad, nlevrad, ncolrad, &
2,xradc_p,yradc_p,zradc_1,zradc_2,hgtradc, &
ihgtradc,corrad(1,1,2) )
!
CALL alinearint_3d
(nx,ny,nz,w_grd(1,1,1),xs(1),ys(1),zp(1,1,1), &
nzrdr, mxcolrad, nlevrad, ncolrad, &
6,xradc_p,yradc_p,zradc_1,zradc_2,hgtradc, &
ihgtradc,corrad(1,1,3) )
!
!
END IF
!
! sum1=0.0
! do i =1, nx
! do j =1, ny
! do k =1, nz
! sum1 = sum1 + u_grd(i,j,k)*u_grd(i,j,k)
! sum1 = sum1 + v_grd(i,j,k)*v_grd(i,j,k)
! sum1 = sum1 + w_grd(i,j,k)*w_grd(i,j,k)
! end do
! end do
! end do
! print*,'sum1===',sum1,isum
! stop
IF( turn_div == 1 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
tem1(i,j,k) = 0.0
tem2(i,j,k) = 0.0
tem3(i,j,k) = 0.0
u(i,j,k) = 0.0
v(i,j,k) = 0.0
w(i,j,k) = 0.0
wcont(i,j,k) = 0.0
END DO
END DO
END DO
IF( (wei_div_h > 0.0) .and. (wei_div_v > 0.0)) THEN
DO k=3,nz-2
DO j=2,ny-2
DO i=2,nx-2
tem1(i+1,j,k)=tem1(i+1,j,k) + 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dxinv
tem1(i ,j,k)=tem1(i ,j,k) - 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dxinv
tem2(i,j+1,k)=tem2(i,j+1,k) + 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dyinv
tem2(i ,j,k)=tem2(i ,j,k) - 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dyinv
tem3(i,j,k+1)=tem3(i,j,k+1) + 1./wei_div_v*j3inv(i,j,k)* &
div3(i,j,k)*dzinv
tem3(i ,j,k)=tem3(i ,j,k) - 1./wei_div_v*j3inv(i,j,k)* &
div3(i,j,k)*dzinv
END DO
END DO
END DO
ELSEIF( (wei_div_h > 0.0) .and. (wei_div_v < 0.0)) THEN
DO k=3,nz-2
DO j=2,ny-2
DO i=2,nx-2
tem1(i+1,j,k)=tem1(i+1,j,k) + 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dxinv
tem1(i ,j,k)=tem1(i ,j,k) - 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dxinv
tem2(i,j+1,k)=tem2(i,j+1,k) + 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dyinv
tem2(i ,j,k)=tem2(i ,j,k) - 1./wei_div_h*j3inv(i,j,k)* &
mapfct(i,j,7)*div3(i,j,k)*dyinv
END DO
END DO
END DO
ENDIF
IF(wei_div_v > 0.0 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
wcont(i,j,k)=tem3(i,j,k)*rhostrw(i,j,k)
tem3(i,j,k)=0.0
END DO
END DO
END DO
ENDIF
IF(wei_div_h > 0.0 ) THEN
DO k=1,nz
DO j=1,ny
DO i=1,nx
v(i,j,k)=tem2(i,j,k)*rhostrv(i,j,k)*mapfct(i,j,6)
tem2(i,j,k)=0.0
END DO
END DO
END DO
DO k=1,nz
DO j=1,ny
DO i=1,nx
u(i,j,k)=tem1(i,j,k)*rhostru(i,j,k)*mapfct(i,j,5)
tem1(i,j,k) = 0.0
END DO
END DO
END DO
ENDIF
!
CALL adwcontra
(nx,ny,nz,u,v,w,mapfct,j1,j2,j3,aj3z, &
rhostr,rhostru,rhostrv,rhostrw,wcont,tem1,tem2)
!
DO k= 1,nz
DO j= 1,ny
DO i= 1,nx
u_grd(i,j,k) = u_grd(i,j,k) + u(i,j,k)
v_grd(i,j,k) = v_grd(i,j,k) + v(i,j,k)
w_grd(i,j,k) = w_grd(i,j,k) + w(i,j,k)
u(i,j,k) = 0.0
v(i,j,k) = 0.0
w(i,j,k) = 0.0
END DO
END DO
END DO
END IF
!
!
!
!--IF cntl_var == 0 u & v are control varibles---------------------
!
!
IF( cntl_var == 0 ) THEN
DO k = 1, nz
DO i = 1, nx
DO j = 1, ny
!
psi(i,j,k)= u_grd(i,j,k)
phi(i,j,k)= v_grd(i,j,k)
!
END DO
END DO
END DO
ELSE
DO k = 1, nz
v_grd(nx-1,ny,k)=v_grd(nx-1,ny,k)+0.5*v_grd(nx,ny,k)
v_grd(nx,ny-1,k)=v_grd(nx,ny-1,k)+0.5*v_grd(nx,ny,k)
v_grd(nx,ny,k)=0.0
u_grd(nx-1,ny,k)=u_grd(nx-1,ny,k)+0.5*u_grd(nx,ny,k)
u_grd(nx,ny-1,k)=u_grd(nx,ny-1,k)+0.5*u_grd(nx,ny,k)
u_grd(nx,ny,k)=0.0
v_grd(nx,2,k)=v_grd(nx,2,k)+0.5*v_grd(nx,1,k)
v_grd(nx-1,1,k)=v_grd(nx-1,1,k)+0.5*v_grd(nx,1,k)
v_grd(nx,1,k)=0.0
u_grd(nx,2,k)=u_grd(nx,2,k)+0.5*u_grd(nx,1,k)
u_grd(nx-1,1,k)=u_grd(nx-1,1,k)+0.5*u_grd(nx,1,k)
u_grd(nx,1,k)=0.0
v_grd(2,ny,k)=v_grd(2,ny,k)+0.5*v_grd(1,ny,k)
v_grd(1,ny-1,k)=v_grd(1,ny-1,k)+0.5*v_grd(1,ny,k)
v_grd(1,ny,k)=0.0
u_grd(2,ny,k)=u_grd(2,ny,k)+0.5*u_grd(1,ny,k)
u_grd(1,ny-1,k)=u_grd(1,ny-1,k)+0.5*u_grd(1,ny,k)
u_grd(1,ny,k)=0.0
v_grd(1,2,k)=v_grd(1,2,k)+0.5*v_grd(1,1,k)
v_grd(2,1,k)=v_grd(2,1,k)+0.5*v_grd(1,1,k)
v_grd(1,1,k)=0.0
u_grd(1,2,k)=u_grd(1,2,k)+0.5*u_grd(1,1,k)
u_grd(2,1,k)=u_grd(2,1,k)+0.5*u_grd(1,1,k)
u_grd(1,1,k)=0.0
DO i=2,nx-1
v_grd(i,ny-2,k)=v_grd(i,ny-2,k)-v_grd(i,ny,k)
v_grd(i,ny-1,k)=v_grd(i,ny-1,k)+v_grd(i,ny,k)
v_grd(i,ny-1,k)=v_grd(i,ny-1,k)+v_grd(i,ny,k)
v_grd(i,ny,k)=0.0
u_grd(i,ny-2,k)=u_grd(i,ny-2,k)-u_grd(i,ny,k)
u_grd(i,ny-1,k)=u_grd(i,ny-1,k)+u_grd(i,ny,k)
u_grd(i,ny-1,k)=u_grd(i,ny-1,k)+u_grd(i,ny,k)
u_grd(i,ny,k)=0.0
v_grd(i, 3,k)=v_grd(i, 3,k)-v_grd(i, 1,k)
v_grd(i, 2,k)=v_grd(i, 2,k)+v_grd(i, 1,k)
v_grd(i, 2,k)=v_grd(i, 2,k)+v_grd(i, 1,k)
v_grd(i, 1,k)=0.0
u_grd(i, 3,k)=u_grd(i, 3,k)-u_grd(i, 1,k)
u_grd(i, 2,k)=u_grd(i, 2,k)+u_grd(i, 1,k)
u_grd(i, 2,k)=u_grd(i, 2,k)+u_grd(i, 1,k)
u_grd(i, 1,k)=0.0
END DO
DO j=2,ny-1
v_grd(nx-2,j,k)=v_grd(nx-2,j,k)-v_grd(nx,j,k)
v_grd(nx-1,j,k)=v_grd(nx-1,j,k)+v_grd(nx,j,k)
v_grd(nx-1,j,k)=v_grd(nx-1,j,k)+v_grd(nx,j,k)
v_grd(nx,j,k)=0.0
u_grd(nx-2,j,k)=u_grd(nx-2,j,k)-u_grd(nx,j,k)
u_grd(nx-1,j,k)=u_grd(nx-1,j,k)+u_grd(nx,j,k)
u_grd(nx-1,j,k)=u_grd(nx-1,j,k)+u_grd(nx,j,k)
u_grd(nx,j,k)=0.0
v_grd( 3,j,k)=v_grd( 3,j,k)-v_grd( 1,j,k)
v_grd( 2,j,k)=v_grd( 2,j,k)+v_grd( 1,j,k)
v_grd( 2,j,k)=v_grd( 2,j,k)+v_grd( 1,j,k)
v_grd( 1,j,k)=0.0
u_grd( 3,j,k)=u_grd( 3,j,k)-u_grd( 1,j,k)
u_grd( 2,j,k)=u_grd( 2,j,k)+u_grd( 1,j,k)
u_grd( 2,j,k)=u_grd( 2,j,k)+u_grd( 1,j,k)
u_grd( 1,j,k)=0.0
END DO
DO i = 2, nx-1
DO j = 2, ny-1
!
u_grd(i,j,k) = u_grd(i,j,k)*mapfct(i,j,2)
psi(i-1,j+1,k)= psi(i-1,j+1,k)+ u_grd(i,j,k)/dy/4.
psi(i,j+1,k) = psi(i,j+1,k) + u_grd(i,j,k)/dy/4.
psi(i-1,j-1,k)= psi(i-1,j-1,k)- u_grd(i,j,k)/dy/4.
psi(i,j-1,k) = psi(i,j-1,k) - u_grd(i,j,k)/dy/4.
phi(i, j, k)= phi(i, j, k)+ u_grd(i,j,k)/dx
phi(i-1,j,k) = phi(i-1,j,k) - u_grd(i,j,k)/dx
u_grd(i,j,k) = 0.0
!
v_grd(i,j,k) = v_grd(i,j,k)*mapfct(i,j,3)
psi(i+1,j-1,k)= psi(i+1,j-1,k)+ v_grd(i,j,k)/dx/4.
psi(i+1,j,k) = psi(i+1,j,k) + v_grd(i,j,k)/dx/4.
psi(i-1,j-1,k)= psi(i-1,j-1,k)- v_grd(i,j,k)/dx/4.
psi(i-1,j,k) = psi(i-1,j,k) - v_grd(i,j,k)/dx/4.
phi(i, j, k)= phi(i, j, k)+ v_grd(i,j,k)/dy
phi(i,j-1,k) = phi(i,j-1,k) - v_grd(i,j,k)/dy
v_grd(i,j,k) = 0.0
END DO
END DO
END DO
!
END IF
!
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdu_err, &
gdscal, psi)
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdv_err, &
gdscal, phi)
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdp_err, &
gdscal,p_grd)
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdt_err, &
gdscal,t_grd)
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdq_err, &
gdscal,q_grd)
!
CALL vbl_to_ctr
(ipass_filt,hradius,nradius_z,nx,ny,nz,gdw_err, &
gdscal,w_grd)
!
!
DO k = 1, nz
DO j = 1, ny
DO i = 1, nx
u_grd(i,j,k) = 0.0
v_grd(i,j,k) = 0.0
u_grd(i,j,k) = psi(i,j,k) + u_ctr(i,j,k)
v_grd(i,j,k) = phi(i,j,k) + v_ctr(i,j,k)
p_grd(i,j,k) = p_grd(i,j,k) + p_ctr(i,j,k)
t_grd(i,j,k) = t_grd(i,j,k) + t_ctr(i,j,k)
q_grd(i,j,k) = q_grd(i,j,k) + q_ctr(i,j,k)
w_grd(i,j,k) = w_grd(i,j,k) + w_ctr(i,j,k)
END DO
END DO
END DO
!
!
CALL trans
(numctr,nx,ny,nz,u_grd,v_grd,p_grd, &
t_grd,q_grd,w_grd,grad)
!
!
deallocate( u )
deallocate( v )
deallocate( w )
deallocate( wcont )
!
deallocate ( u_grd )
deallocate ( v_grd )
deallocate ( p_grd )
deallocate ( t_grd )
deallocate ( q_grd )
deallocate ( w_grd )
!
!
RETURN
END SUBROUTINE gradt