Code source de l'adjoint du filtre récursif 1D

!
!----------------------------------------------------------------------
!
! A D J O I N T   R E C U R S I V E    F I L T E R
!
!----------------------------------------------------------------------
!
   SUBROUTINE recursive_filter_adj_1d_r(A, alpha, pass)
!
! 1D adjoint 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))
!
      B(:) = 0.
      C(:) = 0. 
!
! Backward langevin
!
      C(1:N) = C(1:N) + A(1:N)
      A(1:N) = 0.
      DO i = 1, N - 1
        B(i) = B(i) + ( 1 - alpha ) * C(i)
        C(i+1) = C(i+1) + alpha * C(i)
        C(i) = 0.
      ENDDO
      SELECT CASE (pass)
      CASE (1)
         B(N) = B(N) + 1 / ( 1 + alpha ) * C(N)
      CASE (2)
         B(N)   = B(N)   + ( 1 - alpha ) / ( 1 - alpha**2 )**2 * C(N)
         B(N-1) = B(N-1) - alpha**3 * ( 1 - alpha ) / ( 1 - alpha**2 )**2 * C(N)
      CASE (3)
         B(N)   = B(N)   - ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
         B(N-1) = B(N-1) + alpha**3 * ( 3 - alpha**2 ) * ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
         B(N-2) = B(N-2) - alpha**4 * ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
      CASE default
         B(N)   = B(N)   - ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
         B(N-1) = B(N-1) + alpha**3 * ( 3 - alpha**2 ) * ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
         B(N-2) = B(N-2) - alpha**4 * ( 1 - alpha ) / ( 1 - alpha**2 )**3 * C(N)
      END SELECT
!
! Forward Langevin
!
      DO i = N, 2, -1
        A(i) = A(i) + ( 1 - alpha ) * B(i)
        B(i-1) = B(i-1) + alpha * B(i)
        B(i) = 0.
      ENDDO
      SELECT CASE (pass)
      CASE (1)
         A(1) = A(1) + ( 1 - alpha ) * B(1)
      CASE (2)
         A(1) = A(1) + 1 / ( 1 + alpha ) * B(1)
      CASE (3)
         A(1) = A(1) + ( 1 - alpha ) / ( 1 - alpha**2 )**2 * B(1)
         A(2) = A(2) - alpha**3 * ( 1 - alpha ) / ( 1 - alpha**2 )**2 * B(1)
      CASE default
         A(1) = A(1) + ( 1 - alpha ) / ( 1 - alpha**2 )**2 * B(1)
         A(2) = A(2) - alpha**3 * ( 1 - alpha ) / ( 1 - alpha**2 )**2 * B(1)
      END SELECT
!
      DEALLOCATE (B)
      DEALLOCATE (C)
!
   END SUBROUTINE recursive_filter_adj_1d_r


Nicolas Daget 2006-03-21