module icaf1  
! Internal Convolution, Adjoint is Filter. 1-D
  use adj_mod
  implicit none
  integer, private :: lag 
  real ,private,  dimension (:), pointer  :: xx 
  contains
  subroutine icaf1_init ( xx_in,lag_in )
    real ,   dimension (:), pointer :: xx_in 
    integer    :: lag_in 
    xx => xx_in 
    lag = lag_in
  end subroutine
  function icaf1_lop ( adj, add, bb, yy) result(stat)
    integer            :: stat 
    logical,intent(in) :: adj,add 
    real,dimension(:)  :: bb,yy 
    call adjnull (adj,add,bb,yy )
    call icaf1_lop2(adj,add,bb,yy )
    stat=0
  end function 
  subroutine icaf1_lop2(adj,add,bb,yy)
    logical,intent(in) :: adj,add 
    real, dimension (:)  :: bb 
    real, dimension (:)  :: yy 
    integer   x,  b,   y
    do b= 1, size(bb)
      do y= 1+size(bb)-lag, size(yy)-lag+1  
        x= y - b + lag      
        if ( adj) then
          bb(b) =        bb(b) +  yy(y) * xx(x)
        else
          yy(y) =             yy(y) +  bb(b) * xx(x)
        end if
      end do
    end do
  end subroutine 
  subroutine icaf1_close()
  end subroutine 
end module 
