!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SCALE_BCKGRD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
!-----------------------------------------------------------------------
!
SUBROUTINE recurfilt_3d(nx,ny,nz,pgrd,ipass_filt,hradius,nradius_z) 2,3
!cc
!cc
IMPLICIT none
INTEGER :: i,j,k,n
INTEGER :: nx,ny,nz,ipass_filt,nradius_z
REAL :: hradius
REAL :: alpha, alpha_z, ee
REAL :: temp,temp2
REAL :: pgrd(nx,ny,nz)
REAL, DIMENSION(:), allocatable :: temx
REAL, DIMENSION(:), allocatable :: temy
REAL, DIMENSION(:), allocatable :: temz
!
REAL, DIMENSION (:), allocatable :: varb
!
allocate ( temx(nx) )
allocate ( temy(ny) )
allocate ( temz(nz) )
!
!
IF( hradius == 0 .and. nradius_z == 0 ) return
!
ee = REAL(ipass_filt) / (hradius*hradius)
alpha = 1+ee-SQRT( ee*(ee+2.) )
!
IF( nradius_z /= 0 ) THEN
ee = REAL (ipass_filt) / REAL (nradius_z*nradius_z)
alpha_z = 1 + ee - SQRT (ee*(ee+2.))
ENDIF
!
!
DO n = 1, ipass_filt/2
!
!
allocate ( varb(nx) )
DO k = 1, nz
DO j = 1, ny
!
if(n==1) varb(1) = (1-alpha) * pgrd(1,j,k)
if(n==2) varb(1) = (1-alpha)/(1-alpha*alpha) * pgrd(1,j,k)
if(n==3) then
temp = (1-alpha)/((1-alpha*alpha)*(1-alpha*alpha))
temp2 =alpha*alpha*alpha
varb(1) = temp * (pgrd(1,j,k)-temp2*pgrd(1,j,k))
ENDIF
if(n>=4) then
temp2 =alpha*alpha*alpha
temp = (1-alpha)/(1-3*alpha*alpha+3*temp2*alpha-temp2*temp2)
varb(1) = temp * (pgrd(1,j,k)-3*temp2*pgrd(2,j,k)+ &
temp2*alpha*alpha*pgrd(2,j,k)+temp2*alpha*pgrd(3,j,k))
ENDIF
!
DO i = 2, nx, 1
varb(i) = alpha*varb(i-1) + (1.-alpha)*pgrd(i,j,k)
END DO
!
if(n==0) pgrd(nx,j,k) = (1-alpha) * varb(nx)
if(n==1) pgrd(nx,j,k) = (1-alpha)/(1-alpha*alpha) * varb(nx)
if(n==2) then
temp = (1-alpha)/((1-alpha*alpha)*(1-alpha*alpha))
temp2 =alpha*alpha*alpha
pgrd(nx,j,k) = temp * (varb(nx)-temp2*varb(nx-1))
ENDIF
if(n>=3) then
temp2 =alpha*alpha*alpha
temp = (1-alpha)/(1-3*alpha*alpha+3*temp2*alpha-temp2*temp2)
pgrd(nx,j,k) = temp * (varb(nx)-3*temp2*varb(nx-1)+ &
temp2*alpha*alpha*varb(nx-1)+temp2*alpha*varb(nx-2))
ENDIF
!
!
DO i = nx-1, 1, -1
pgrd(i,j,k) = alpha*pgrd(i+1,j,k) + (1.-alpha)*varb(i)
END DO
!
END DO
END DO
deallocate (varb)
!
!
allocate ( varb(ny) )
DO k = 1, nz
DO i = 1, nx
!
if(n==1) varb(1) = (1-alpha) * pgrd(i,1,k)
if(n==2) varb(1) = (1-alpha)/(1-alpha*alpha) * pgrd(i,1,k)
if(n==3) then
temp = (1-alpha)/((1-alpha*alpha)*(1-alpha*alpha))
temp2 =alpha*alpha*alpha
varb(1) = temp * (pgrd(i,1,k)-temp2*pgrd(i,1,k))
ENDIF
if(n>=4) then
temp2 =alpha*alpha*alpha
temp = (1-alpha)/(1-3*alpha*alpha+3*temp2*alpha-temp2*temp2)
varb(1) = temp * (pgrd(i,1,k)-3*temp2*pgrd(i,2,k)+ &
temp2*alpha*alpha*pgrd(i,2,k)+temp2*alpha*pgrd(i,3,k))
ENDIF
!
DO j = 2, ny, 1
varb(j) = alpha*varb(j-1) + (1.-alpha)*pgrd(i,j,k)
END DO
!
if(n==0) pgrd(i,ny,k) = (1-alpha) * varb(ny)
if(n==1) pgrd(i,ny,k) = (1-alpha)/(1-alpha*alpha) * varb(ny)
if(n==2) then
temp = (1-alpha)/((1-alpha*alpha)*(1-alpha*alpha))
temp2 =alpha*alpha*alpha
pgrd(i,ny,k) = temp * (varb(ny)-temp2*varb(ny-1))
ENDIF
if(n>=3) then
temp2 =alpha*alpha*alpha
temp = (1-alpha)/(1-3*alpha*alpha+3*temp2*alpha-temp2*temp2)
pgrd(i,ny,k) = temp * (varb(ny)-3*temp2*varb(ny-1)+ &
temp2*alpha*alpha*varb(ny-1)+temp2*alpha*varb(ny-2))
ENDIF
!
DO j = ny-1, 1, -1
pgrd(i,j,k) = alpha*pgrd(i,j+1,k) + (1.-alpha)*varb(j)
END DO
!
END DO
END DO
deallocate (varb)
!
!
IF( nradius_z /= 0 ) THEN
allocate ( varb(nz) )
DO i = 1, nx
DO j = 1, ny
if(n==1) varb(1) = (1-alpha_z) * pgrd(i,j,1)
if(n==2) varb(1) = (1-alpha_z)/(1-alpha_z*alpha_z) * pgrd(i,j,1)
if(n==3) then
temp = (1-alpha_z)/((1-alpha_z*alpha_z)*(1-alpha_z*alpha_z))
temp2 =alpha_z*alpha_z*alpha_z
varb(1) = temp * (pgrd(i,j,1)-temp2*pgrd(i,j,1))
ENDIF
if(n>=4) then
temp2 =alpha_z*alpha_z*alpha_z
temp = (1-alpha_z)/(1-3*alpha_z*alpha_z+3*temp2*alpha_z-temp2*temp2)
varb(1) = temp * (pgrd(i,j,1)-3*temp2*pgrd(i,j,2)+ &
temp2*alpha_z*alpha_z*pgrd(i,j,2)+temp2*alpha_z*pgrd(i,j,3))
ENDIF
!
DO k = 2, nz, 1
varb(k) = alpha_z*varb(k-1) + (1.-alpha_z)*pgrd(i,j,k)
END DO
!
if(n==0) pgrd(i,j,nz) = (1-alpha_z) * varb(nz)
if(n==1) pgrd(i,j,nz) = (1-alpha_z)/(1-alpha_z*alpha_z) * varb(nz)
if(n==2) then
temp = (1-alpha_z)/((1-alpha_z*alpha_z)*(1-alpha_z*alpha_z))
temp2 =alpha_z*alpha_z*alpha_z
pgrd(i,j,nz) = temp * (varb(nz)-temp2*varb(nz-1))
ENDIF
if(n>=3) then
temp2 =alpha_z*alpha_z*alpha_z
temp = (1-alpha_z)/(1-3*alpha_z*alpha_z+3*temp2*alpha_z-temp2*temp2)
pgrd(i,j,nz) = temp * (varb(nz)-3*temp2*varb(nz-1)+ &
temp2*alpha_z*alpha_z*varb(nz-1)+temp2*alpha_z*varb(nz-2))
ENDIF
!
DO k = nz-1, 1, -1
pgrd(i,j,k) = alpha_z*pgrd(i,j,k+1) + (1.-alpha_z)*varb(k)
END DO
END DO
END DO
deallocate (varb)
ENDIF
!
END DO
!
!
deallocate (temx)
deallocate (temy)
deallocate (temz)
!
!
RETURN
END SUBROUTINE recurfilt_3d
!
!
SUBROUTINE arecurfilt_3d(nx,ny,nz,pgrd,ipass_filt,hradius,nradius_z)
!c
!c
IMPLICIT none
INTEGER :: i,j,k,n
INTEGER :: nx,ny,nz,ipass_filt,nradius_z
REAL :: hradius
REAL :: alpha, alpha_z, ee
REAL :: pgrd(nx, ny, nz)
REAL, DIMENSION(:), allocatable :: temx
REAL, DIMENSION(:), allocatable :: temy
REAL, DIMENSION(:), allocatable :: temz
!
IF( hradius == 0 .and. nradius_z == 0 ) return
!
allocate ( temx(nx) )
allocate ( temy(ny) )
allocate ( temz(nz) )
!
!
DO i = 1, nx
temx(i) = 0.
END DO
!
DO j = 1, ny
temy(j) = 0.
END DO
!
DO k = 1, nz
temz(k) = 0.
END DO
!
IF( nradius_z /= 0 ) THEN
ee = REAL(ipass_filt)/REAL(nradius_z*nradius_z)
alpha_z = 1 + ee - SQRT (ee*(ee+2.))
ENDIF
!
ee = REAL(ipass_filt) / (hradius*hradius)
alpha = 1 + ee - SQRT (ee*(ee+2.))
!
!
DO n = ipass_filt/2, 1 , -1
!
!
IF( nradius_z /= 0 ) THEN
DO i = nx, 1, -1
DO j = ny, 1, -1
DO k = nz, 1, -1
temz(k) = temz(k)+pgrd(i,j,k)
pgrd(i,j,k) = 0.
END DO
!
CALL arecurfilt_1d
(temz,nz,alpha_z,n)
!
DO k = nz, 1, -1
pgrd(i,j,k) = pgrd(i,j,k)+temz(k)
temz(k) = 0.
END DO
END DO
END DO
ENDIF
!
!
DO k = nz, 1, -1
DO i = nx, 1, -1
DO j = ny, 1, -1
temy(j) = temy(j)+pgrd(i,j,k)
pgrd(i,j,k) = 0.
END DO
!
CALL arecurfilt_1d
(temy,ny,alpha,n)
!
DO j = ny, 1, -1
pgrd(i,j,k) = pgrd(i,j,k)+temy(j)
temy(j) = 0.
END DO
END DO
END DO
!
!
DO k = nz, 1, -1
DO j = ny, 1, -1
DO i = nx, 1, -1
temx(i) = temx(i)+pgrd(i,j,k)
pgrd(i,j,k) = 0.
END DO
!
CALL arecurfilt_1d
(temx,nx,alpha,n)
!
DO i = nx, 1, -1
pgrd(i,j,k) = pgrd(i,j,k)+temx(i)
temx(i) = 0.
END DO
END DO
END DO
!
END DO
!
!
deallocate (temx)
deallocate (temy)
!
!
RETURN
END SUBROUTINE arecurfilt_3d