!

SUBROUTINE recurfilt_3d_scale(nx,ny,nz,pgrd,ipass_filt,hradius,nradius_z) 1,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 :: 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) )
!
!

  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
!
!
    DO k = 1, nz
      DO j = 1, ny
        DO i = 1, nx
          temx(i) = pgrd(i,j,k)
        END DO
!
        CALL recurfilt_1d( temx,nx,alpha,n )
!
        DO i = 1, nx
          pgrd(i,j,k) = temx(i)
        END DO
      END DO
    END DO
!
!
    DO k = 1, nz
      DO i = 1, nx
        DO j = 1, ny
          temy(j) = pgrd(i,j,k)
        END DO
!
        CALL recurfilt_1d( temy,ny,alpha,n )
!
        DO j = 1, ny
          pgrd(i,j,k) = temy(j)
        END DO
!
      END DO
!
    END DO
!
!
    IF( nradius_z /= 0 ) THEN
      DO i = 1, nx
        DO j = 1, ny
          DO k = 1, nz
            temz(k) = pgrd(i,j,k)
          END DO
!
          CALL recurfilt_1d( temz,nz,alpha_z,n )
!
          DO k = 1, nz
            pgrd(i,j,k) = temz(k)
          END DO
        END DO
      END DO
    ENDIF
!
  END DO
!
!
  deallocate (temx)
  deallocate (temy)
  deallocate (temz)
!
!
  RETURN
END SUBROUTINE recurfilt_3d_scale