# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
module igrad2
! 2-D gradient with adjoint, r= grad( p)
  use adj_mod
  implicit none
  integer, private :: n1
  integer, private :: n2
  contains
  subroutine igrad2_init ( n1_in,n2_in )
    integer :: n1_in
    integer :: n2_in
    n1 = n1_in
    n2 = n2_in
  end subroutine
  function igrad2_lop ( adj, add, p, r) result(stat)
    integer :: stat
    logical,intent(in) :: adj,add
    real,dimension(:) :: p,r
    call adjnull (adj,add,p,r )
    call igrad2_lop2(adj,add,p,r )
    stat=0
  end function
  subroutine igrad2_lop2(adj,add,p,r)
    logical,intent(in) :: adj,add
    real, dimension (n1, n2) :: p
    real, dimension (n1,n2,2) :: r
    integer i,j
    do i= 1, n1-1
      do j= 1, n2-1
        if ( adj) then
          p(i+1,j ) = p(i+1,j ) + r(i,j,1)
          p(i ,j ) = p(i ,j ) - r(i,j,1)
          p(i ,j+1) = p(i ,j+1) + r(i,j,2)
          p(i ,j ) = p(i ,j ) - r(i,j,2)
        else
          r(i,j,1) = r(i,j,1) + ( p(i+1,j) - p(i,j))
          r(i,j,2) = r(i,j,2) + ( p(i,j+1) - p(i,j))
        end if
      end do
    end do
  end subroutine
  subroutine igrad2_close()
  end subroutine
end module
