Code source du filtre récursif 1D

!
!----------------------------------------------------------------------
!
! R E C U R S I V E    F I L T E R
!
! from Iterative analysis using covariance functions and filters by
!      Andrew Lorenc (Q. J. R. Meteorol. Soc. (1992), 118, pp. 569-591)
!      Appendix A pp 587-589 
!
!----------------------------------------------------------------------
!
   SUBROUTINE recursive_filter_1d_r(A, alpha, pass)
!
! 1D recursive filter for reals
!
! A is the initial value
! B is the value after filtering for i = 1 to n
! C (in our case A) is the value after one pass of the filter in each 
!   direction
!
! alpha is the filter coefficient
! N is the number of time step
!
      IMPLICIT NONE
!
      REAL, DIMENSION(:), INTENT(inout) :: A
      REAL, INTENT(in)                  :: alpha
      INTEGER, INTENT(in)               :: pass
!
      INTEGER                           :: N, i
      REAL, DIMENSION(:), ALLOCATABLE   :: B, C 
!
! Look for time dimension
!
      N = SIZE(A,1)
!
! Allocate array
!
      ALLOCATE (B(N))
      ALLOCATE (C(N))
!
!
! Forward Langevin
!
      B(:) = 0.0
      SELECT CASE (pass)
      CASE (1)
         B(1) = ( 1 - alpha ) * A(1)
      CASE (2)
         B(1) = 1 / ( 1 + alpha ) * A(1)
         B(1) = ( 1 - alpha ) / ( 1 - alpha**2 ) *  A(1)
      CASE (3)
         B(1) = ( 1 - alpha ) / ( 1 - alpha**2 )**2 * ( A(1) - alpha**3 * A(2) )
      CASE default
         B(1) = ( 1 - alpha ) / ( 1 - alpha**2 )**2 * ( A(1) - alpha**3 * A(2) )
      END SELECT
      DO i = 2, N
         B(i) = alpha * B(i-1) + ( 1 - alpha ) * A(i) 
      ENDDO
!
! Backward langevin
!
      SELECT CASE (pass)
      CASE (1)
         C(N) = 1 / ( 1 + alpha ) * B(N)
      CASE (2)
         C(N) = ( 1 - alpha ) / ( 1 - alpha**2 )**2 * ( B(N) - alpha**3 * B(N-1) )
      CASE (3)
         C(N) = ( 1 - alpha ) / ( 1 - alpha**2 )**3 * &
                ( -1 * B(N) + ( 3 - alpha**2 ) * alpha**3 * B(N-1) - alpha**4 * B(N-2) )
      CASE default
         C(N) = ( 1 - alpha ) / ( 1 - alpha**2 )**3 * &
                ( -1 * B(N) + ( 3 - alpha**2 ) * alpha**3 * B(N-1) - alpha**4 * B(N-2) )
      END SELECT
      DO i = N-1, 1, -1
         C(i) = alpha * C(i+1) + ( 1 - alpha ) * B(i)
      ENDDO
!
      A(1:N) = C(1:N)
!
!
      DEALLOCATE (B)
      DEALLOCATE (C)
!
   END SUBROUTINE recursive_filter_1d_r


Nicolas Daget 2006-03-21